vit007 wrote:

у меня в проекте разность реализована так

if ((Trunc(frmAddNote.DateTimePicker1.DateTime) - Trunc(Now)) <0) then ShowHint(frmAddNote.DateTimePicker1, 'Неверное значение даты') else

В какой цели Вы это используете? Какой результат?
В этой функции я не уверен что будет правильный результат, мне необходимо посчитать разницу в n-лет n-месяцев n-дней, необходимо учитывать количество дней в месяце

Добрый вечер
Появилась необходимость посчитать разницу между двумя датами (стаж работы) по типу сколько лет, месяцев, дней
Есть таблица: dates
Колонки: data1 data2
в колонку data1 - записывается начальная дата (к примеру 01.04.2020)
в колонку data2 - записывается конечная дата (к примеру 16.04.2020)
Результат = 0 лет 0 месяцев 16 дней

сами функции подсчета правописания дней, месяцев, лет

// Вывод строки дней
function StrDays(iDay: integer): string;
begin
  Result:= ' дней ';
  case iDay of
    1, 21, 31: Result:= ' день ';
    2, 3, 4, 22, 23, 24: Result:= ' дня ';
  end;
end;

// Вывод строки месяцев
function StrMonths(iMonth: integer): string;
begin
  Result:= ' месяцев ';
  case iMonth of
    1: Result:= ' месяц ';
    2, 3, 4: Result:= ' месяца ';
  end;
end;

// Вывод строки лет
function StrYears(iYear: integer): string;
var
  s: string;
  sYear: string;
  i: integer;
begin
  result := ' лет ';
  if (iYear > 4) and (iYear < 21) then exit;
  sYear := IntToStr(iYear);
  s := Copy(sYear, Length(sYear), 1);
  i := StrToInt(s);
  case i of
    1: result := ' год ';
    2, 3, 4: result := ' года ';
  end;
end;

// Сама функция
function StrBetweenDate(Date1, Date2: TDate): string;
var
  id, im, iy: Integer;
  d: TDate;
begin
  Result:= '';
  if Date1 < Date2 then
  begin
    d:= Date1;
    Date1:= Date2;
    Date2:= d;
    Date1:= Date1 + 1;
  end;
  d:= DaysBetween(Date1 + 1, Date2);
  id:= DayOf(d);
  im:= MonthOf(d)-1;
  iy:= YearOf(d);
  iy:= iy - 1900;
  if im = 12 then
    begin
      im:= 0;
      inc(iy);
    end;
  if id = 31 then
  begin
    id:= 0;
    inc(im);
    if im = 12 then
    begin
      im:= 0;
      inc(iy);
    end;
  end;
  Result:= (IntToStr(iy)+ StrYears(iy) + IntToStr(im) +
            StrMonths(im) + IntToStr(id)+ StrDays(id));
end;

Использование

procedure Form1_Button3_OnClick(Sender: string);
var
  dt1, dt2: TDateTime;
begin
  dt1:=SQLExecute('SELECT StrToDate(data1) FROM dates  WHERE id='+Form1.TableGrid1.sqlValue);
  dt2:=SQLExecute('SELECT StrToDate(data2) FROM dates  WHERE id='+Form1.TableGrid1.sqlValue);
  ShowMessage(StrBetweenDate(dt1, dt2));
end;

по разному уже пробовал использовать данные с таблицы (и уже просто даты вписывал в dt1 и dt2, все время ошибка
List index out of bounds (1)
Что делаю не так, можете подсказать или направить?

DriveSoft wrote:

Скачайте снова бета версию
https://www.dropbox.com/s/vyne4lvinpjzl … a.zip?dl=0


Добавил параметры Width и Height

function FindAndInsertPicture(const FindText, PictureFilename: string; ReplaceAll: boolean = true, Width: integer = -1; Height: integer = -1): boolean

пример

Word.FindAndInsertPicture('{photo}',  'd:\picture.jpg', True, 100, 50);

Всё прекрасно работает, спасибо

DriveSoft wrote:

Добавил для класса TWord метод FindAndInsertPicture
Скачайте пожалуйста последнюю бета версию 6.4
https://www.dropbox.com/s/vyne4lvinpjzl … a.zip?dl=0


пример

Word.FindAndInsertPicture('{photo}',  'c:\picture.jpg');

Но необходимо указывать имя файла на диске.


В вашем примере вы пытаетесь вставить изображение из ResultsPhotoClient.FieldByName('Photo').AsString
что неправильно. Если вы сохраняете изображение непосредственно в базе данных, то сперва необходимо данное изображение сохранить в файл на диск.

Приветствую DriveSoft
изображение вставляется полным размером, необходима функция изменения пропорций или хотя бы задавать размеры в пикселях

Спасибо огромное sibprogsistem, то что надо

Thank you, derek, I looked at your example, there is no problem

Всем доброй

Возникли затруднения с созданием тройного ComboBox’a где id каждого зависят друг от друга

Имеется ComboBox1, ComboBox2, ComboBox3

ComboBox1 имеет три id (text1,text2,text3)
ComboBox2 зависит от ComboBox1 ,
если Выбрать в ComboBox1 text1, то ComboBox2 имеет три id (box1,box2,box3),
если выбрать в ComboBox1 text2, то ComboBox2 имеет три id (combo1,combo2,combo3)
ComboBox3 зависит от ComboBox2 по тому же принципу

То есть Каждый ComboBox зависит от выбранного значения в другом

Подайте мысли в правильном направлении или если есть пример...
Спасибо

Thank you, I'll see an example tomorrow
I just got confused, but now I figured it out and understand ...
at the moment the problem is
1. Getting the path to the program with the project

SQLQuery('SELECT Photo, ''C:\MyProject'' || Photo_filename FROM Client WHERE Client.id='+IntToStr(idClient), ResultsClientPhoto);

How can I replace with function ''C:\MyProject'' || Photo_filename  on ExtractFilePath(Application.ExeName)

 Word.FindAndInsertPicture('{Photo}', ResultsClientPhoto.FieldByName('''C:\MyProject'' || Photo_filename').AsString);

so as not to prescribe the path to the program itself
2. The image is inserted in full size, I would like to change / reduce the size while maintaining the aspect ratio

P.S. Sorry for my English

Я запутался, поэтому все это привело к ошибкам
На самом деле в первом посте я правильный запрос указал

SQLQuery('SELECT Photo, [b]Photo_filename[/b] FROM Client WHERE Client.id='+IntToStr(idClient), ResultsPhotoClient);

Необходимо было лишь добавить свойства в DBImage ---> Что я и сделал в третьем посте после поста DriveSoft'a

В Данный момент DBImage1 (свойства CopyTo =  \Фото ; Type = LinkFile ) 

Далее я начал работать с примером derek'a четвертый пост, но немного не то... запрос в SQLite скриптом я уже правильно сделал
Далее

var
ResultsClientPhoto: TDataSet;
begin
SQLQuery('SELECT Photo, [b]''C:\MyProject'' ||[/b] Photo_filename FROM Client WHERE Client.id='+IntToStr(idClient), ResultsClientPhoto);

Word.FindAndInsertPicture('{Photo}', ResultsClientPhoto.FieldByName('[b]''C:\MyProject'' ||[/b] Photo_filename').AsString);
end;

  все получается, изображение ставится в шаблон word, но как мне изменить то что жирным выделено (это путь до самого проекта)
  как можно заменить чтобы не прописывать путь до программы? Чтобы было ExtractFilePath(Application.ExeName)
  каким способом можно прикрутить?

изображение вставляется полным размером, возможно ли изменить пропорции?

35

(5 replies, posted in Russian)

procedure Form1_Button3_OnClick (Sender: TObject; Action: string);
begin
Form1.Button1.Click;
Form1.Button2.Click;
end;

Не забываем в Событие OnClick указать Form1_Button3_OnClick

Form1 - форма в которой находится кнопка
Button1, Button2 - названия кнопок
Click - это действие для кнопки

derek wrote:

Здравствуй Eugene,
Я не уверен, правильно ли я понимаю ваш вопрос (с помощью переводчика Google), но помогает ли это вам?
С уважением,
Derek.

Thank You, Derek, but I can’t understand how use in SQLite script
I create column 'PhotoFile (Calculated:photo_filename \r\n)' in Table 'Client'
Script:

 
var
PhotoFile: string;
begin
    PhotoFile:=SQLExecute('SELECT PhotoFile FROM Client WHERE id='+IntToStr(Form1.gridClient.dbItemID));
    Word.FindAndInsertPicture('{Photo}', '+IntToStr(PhotoFile)');

Don't work (error - no such column: PhotoFile)

Script:

procedure PrintClientCard(idClient: integer); 
var
ResultsClientPhoto: TDataSet;
begin
    SQLQuery('SELECT PhotoFile FROM Client WHERE Client.id='+IntToStr(idClient), ResultsClientPhoto);
    Word.FindAndInsertPicture('{Photo}', ResultsClientPhoto.FieldByName('PhotoFile').AsString);
    ResultsClientPhoto.Free;

Don't work (error - no such column: PhotoFile)
Whats Wrong?

P.S. Sorry for my english...

DriveSoft wrote:

Добавил для класса TWord метод FindAndInsertPicture
Скачайте пожалуйста последнюю бета версию 6.4
https://www.dropbox.com/s/vyne4lvinpjzl … a.zip?dl=0


пример

Word.FindAndInsertPicture('{photo}',  'c:\picture.jpg');

Но необходимо указывать имя файла на диске.


В вашем примере вы пытаетесь вставить изображение из ResultsPhotoClient.FieldByName('Photo').AsString
что неправильно. Если вы сохраняете изображение непосредственно в базе данных, то сперва необходимо данное изображение сохранить в файл на диск.

Спасибо большое за все возможности вашей программа, очень нравится
Завтра уже опробую новый метод..

Скажите пожалуйста как мне правильно получить имя файла на диске?
В Данный момент DBImage1 (свойства CopyTo =  \Фото ; Type = LinkFile )
Загрузка изображения в базу может происходить с любого места на диске (с помощью свойства 'CopyTo =  \Фото' изображение копируется в папку с программой), так вот как получать имя файла на диске именно которое скопировалось в папку с программой? При условии что изображение загружалось с другого места

Или же лучше вообще загружать изображения только с папки с программой?

Можно попробовать через CASE

Всем Добрый
Кто нибудь уже задавался вопросом вставки изображение с таблицы в word документ?
На данный момент имеется таблица Client, в таблице колонка Photo
Я использую SQLQuery для заготовленного уже шаблона word, для последующей замены текста шаблона на данные с таблицы
Само собой функция Word.FindAndReplace ругается на слишком длинный строковый параметр в замене {Photo}
может кто знает и может подсказать какую функцию правильно будет использовать или пример?

procedure PrintClient(idClient: integer);
var
    Word: TWord;
    sName, sAddress, sPhone, sEmail: string;
    sWordTemp: string;
    sWordFinal: string;

    ResultsPhotoClient: TDataSet;
    ResultsClient: TDataSet;
begin
    SQLQuery('SELECT Photo, Photo_filename FROM Client WHERE Client.id='+IntToStr(idClient), ResultsPhotoClient);
    SQLQuery('SELECT ClientName FROM Client WHERE Client.id='+IntToStr(idClient), ResultsClient);
    sWordTemp  := ExtractFilePath(Application.ExeName)+'\WordTemplate\template2.doc';
    sWordFinal := GetEnvironmentVariable('TEMP') + '\'+ResultsClient.FieldByName('ClientName').AsString+' - '+FormatDateTime('dd.mm.yyy', now)+'.doc';
    CopyFile(sWordTemp, sWordFinal);

    Word := TWord.Create;
    Word.Visible := True;
    Word.Open(sWordFinal);

    Word.FindAndReplace('{Photo}',  ResultsPhotoClient.FieldByName('Photo').AsString );
    Word.FindAndReplace('{ClientName}',  ResultsClient.FieldByName('ClientName').AsString );

на просторах интернета нашел вот такой образец, но пока не удается прикрутить в MVD

uses
  ComObj;
 
procedure TForm1.Button1Click(Sender: TObject);
const
  //Имя файла шаблона и изображения.
  FnDoc = 'Шаблон.doc';
  FnPic = 'Изображение.bmp';
 
  //Продолжить поиск.
  wdFindContinue = 1;
 
  //Виды расположения текста относительно изображения.
  wdWrapInline = 7;
  wdWrapNone = 3;
  wdWrapSquare = 0;
  wdWrapThrough = 2;
  wdWrapTight = 1;
  wdWrapTopBottom = 4;
var
  wdApp, wdDoc, wdRng, wdSh : Variant;
  FNameDoc, FNamePic : String;
  Cnt : Integer;
begin
  //Путь к файлу шаблона. Предполагаем, что файл шаблона лежит в папке с программой.
  FNameDoc := ExtractFilePath(ParamStr(0)) + FnDoc;
  if not FileExists(FNameDoc) then begin
    MessageBox(0, 'Файл шаблона не найден. Действие отменено.',
      'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
  //Путь к файлу изображения. Предполагаем, что файл изображения лежит в папке с программой.
  FNamePic := ExtractFilePath(ParamStr(0)) + FnPic;
  if not FileExists(FNamePic) then begin
    MessageBox(0, 'Файл изображения не найден. Действие отменено.',
      'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
 
  //Запуск MS Word и подключение к его корневому объекту.
  try
    wdApp := CreateOleObject('Word.Application');
  except
    MessageBox(0, 'Не удалось запустить MS Word. Действие отменено.',
      'Ошибка', MB_OK + MB_ICONERROR + MB_APPLMODAL);
    Exit;
  end;
 
  wdApp.Visible := True;
  wdApp.DisplayAlerts := False; //Отключить режим показа предупреждений.
  try
    wdDoc := wdApp.Documents.Open(FNameDoc);
    wdRng := wdDoc.Content; //Диапазон, охватывающий всё содержимое документа.
 
    //Настройка поиска.
    wdRng.Find.ClearFormatting;
    wdRng.Find.Text := '<PICTURE>';
    //True - начать поиск сначала документа.
    wdRng.Find.Forward := True;
    //wdFindContinue - продолжать поиск "по кругу" с текущего места.
    wdRng.Find.Wrap := wdFindContinue;
    //False - не учитывать регистр букв.
    wdRng.Find.MatchCase := False;
    //False - шаблон может не являться отдельным словом.
    wdRng.Find.MatchWholeWord := False;
 
    //Поиск шаблона и замена его на изображение.
    Cnt := 0;
    while wdRng.Find.Execute do begin
      Inc(Cnt);
      //Стираем найденный текст.
      wdRng.Text := '';
      //Поиск следующего совпадения начинать с текущего места.
      if Cnt = 1 then wdRng.Find.Forward := False;
      //Создаём фигуру с изображением. Изображение грузим из файла и привязываем
      //его к началу найденного диапазона.
      wdSh := wdDoc.Shapes.AddPicture(FileName:=FNamePic,
        LinkToFile:=False, SaveWithDocument:=True, Anchor:=wdRng);
      //На всякий случай добавляем вверху диапазона (перед картинкой) знаки
      //перевода строки.
      wdRng.InsertBefore(#13#10);
      //Расположение текста вокруг изображения: wdWrapTopBottom - только сверху и снизу.
      wdSh.WrapFormat.Type := wdWrapTopBottom
    end;
  finally
    wdApp.DisplayAlerts := True; //Включение режима показа предупреждений.
  end;
end;

40

(7 replies, posted in Russian)

DriveSoft wrote:

Для этого можно использовать SQLite функцию Char

SQLQuery('SELECT Id, char(13) || char(10) || Name FROM Client WHERE Client.id=1', ResultsDoljnost1);

другие SQLite функции можно  найти здесь
https://www.sqlite.org/lang_corefunc.html

Спасибо огромное

41

(7 replies, posted in Russian)

DriveSoft wrote:

Попробуйте так

SQLQuery('SELECT Id, ''-'' || Name FROM Client WHERE Client.id=1', ResultsDoljnost1);

Я извиняюсь, по такому случаю ещё один вопрос появился
А возможно по средствам типо такого же способа совершить  к примеру перенос на новую строку \n \t \r ???

42

(7 replies, posted in Russian)

DriveSoft wrote:

Попробуйте так

SQLQuery('SELECT Id, ''-'' || Name FROM Client WHERE Client.id=1', ResultsDoljnost1);

Спасибо огромное, помогло. Хорошее решение если необходимо спереди или позади добавить

43

(7 replies, posted in Russian)

sibprogsistem wrote:
SQLQuery(SELECT Id FROM Client WHERE Client.id=1) + ' - '  + SQLQuery(SELECT  Name FROM Client WHERE Client.id=1);
SQLQuery('SELECT Poslu.Id, strftime("%m.%Y  -  ",Poslu.PosluDate), strftime("%m.%Y   -",Poslu.PosluDateEnd), Poslu.PosluDol FROM Poslu WHERE Poslu.id_Client='+IntToStr(idClient)+' ORDER BY Poslu.PosluDate LIMIT 0, 34', ResultsDoljnost1);

а вот если у меня такой запрос и мне необходимо вставить символ или текст перед столбцом Poslu.PosluDol

SQLQuery('SELECT Poslu.Id, strftime("%m.%Y  -  ",Poslu.PosluDate), strftime("%m.%Y   -",Poslu.PosluDateEnd) FROM Poslu WHERE Poslu.id_Client='+IntToStr(idClient)+' ORDER BY Poslu.PosluDate LIMIT 0, 34', ResultsDoljnost1) + ' - '  + SQLQuery('SELECTPoslu.PosluDol FROM Poslu WHERE Poslu.id_Client='+IntToStr(idClient)+' ORDER BY Poslu.PosluDate LIMIT 0, 34', ResultsDoljnost1);

ругается на код... как правильней будет сделать?

44

(7 replies, posted in Russian)

SQLQuery(SELECT Id, Name FROM Client WHERE Client.id=1);
Результат к примеру будет Вася
Необходимо добавить перед результатом какой-то определённый текст или символ чтобы получить к примеру «- Вася»
Столбец Name имеет стринговое значение

SQLQuery(SELECT Id, функция(‘- ‘,Client.Name) FROM Client WHERE Client.id=1);

Главное это результат столбца Name не должен обновить значение в саму таблицу Client, то есть только подстановка вначале строки
Так вот что эта за функция можете подсказать?
Скриптом

45

(3 replies, posted in Russian)

нашел один вариант решения, не совсем то что нужно, но результат удовлетворяет.
что я сделал: убрал вход по логину и паролю. теперь на форме логина и пароля  имеется combobox, textbox, button
при появлении формы логина идет подгрузка в combobox всех User'ов  (ForeignKey=User; FieldName=UserName;)
textbox (бывший ввод пароль) он остался для муляжа
при нажатии на button ---> закрываем форму логина ---> передаем текст.значения combobox'а в основную форму -> показываем основную форму
С помощью такого варианта решения можно работать в одной базе данных sqlite нескольким пользователям, при этом визуально якобы разные пользователи (выбираем с combobox'a).
Решение пока конечно так себе, но для моей задачи это меня устраивает. Буду пока работать над таким вариантом, есть мысли по улучшению...

procedure frmLogin_bLogin_OnClick (Sender: TObject; Action: string);
     begin
          frmLogin.Hide; // close login form
          Form1.Caption := 'Учет (пользователь: ' + frmLogin.cbLogin.Text+')';
          Form1.Show;
end;
procedure frmLogin_OnShow (Sender: TObject; Action: string);
begin
     frmLogin.mniFile.Visible := False;
     frmLogin.mniOptions.Visible := False;
     frmLogin.mniAbout.Visible := False;

     if SQLExecute('SELECT count(id) FROM User') = '0' then
     begin
         SQLExecute('INSERT INTO User (UserName, password, privAdmin) VALUES ("admin", NULL, 1);');
         UpdateDatabase('User');
     end;
end;

46

(3 replies, posted in Russian)

на почту отправил проект

47

(3 replies, posted in Russian)

Приветствую
Помогите пожалуйста с решением проблемы
Проблема заключается в работе с программой несколькими пользователями программы
база sqlite находится в локальной сети. сама программа у каждого отдельно в настройках указывают только путь до самой базы (база у всех одна)
[img]i.ibb.co/rv4TjN4/1.jpg[/img]

Error massage database is locked
Component frmClient.bClientSave

[img]i.ibb.co/gV29QKz/2.jpg[/img]


Дайте мысль как это возможно исправить, бьюсь третий день никак решить не могу

48

(15 replies, posted in Russian)

Разобрался самостоятельно с помощью темы на форум
id=1942

49

(15 replies, posted in Russian)

DriveSoft wrote:

Нет необходимости использовать SQL запрос, чтобы выбрать записи в указанном диапазоне дат, в настройках кнопки с действием Поиск или Отчет просто добавьте компоненты DateTimePicker1 и DateTimePicker2, в свойстве данных компонентов Filter установите значение >= для DateTimePicker1 и <= для DateTimePicker2

Приветствую, подскажите пожалуйста как правильно реализовать
Есть таблица Clients в ней ClientsDate (Дата Рождения)
Необходимо чтобы выбрать записи в указанном диапазоне  по месяцам без заданого изначально значения.
Причина: у меня сейчас в DateTimePicker1 к примеру стоит 01.01.2020 г в DateTimePicker2 31.02.2020 г запрос соответственно выводит с одного по другой период, а как сделать так что бы достаточно было месяц указать или несколько месяц и выводил всех у кого в указанных месяцах день рождения?



Спасибо