Добрый день!

Помогите, пожалуйста. Есть много записей в таблице. В записях есть действующие договоры, заканчивающие действие (перейдут в расторженные по достижении определенной даты) и расторженные договоры. Необходимо показывать записи в таблице каждого типа по нажатию на кнопки на форме, например кнопка "Действующие", кнопка "Заканчивающие действие" и кнопка "Расторженные". Если на кнопку "Заканчивающие действие" привязываю действие OnClick и прописываю скрипт SQLExecute('SELECT * FROM Main WHERE data_deactive > now()') ничего не происходит. Если на кнопке выбрать Action и SQL запрос, то работает, но слетает все оформление (не по центру текст в строках) и колонки не соответствуют,

27

(12 replies, posted in Russian)

sparrow wrote:

а если так

        SQLExecute ('INSERT INTO Main (record_count, FIO_parent, FIO_child, N_reference, Date_reference, Year_reference, '+
          'Contract_reference, Summa_reference) SELECT (SELECT MAX(record_count)+1 FROM Main), FIO_parent, FIO_child, '+
          'PRINTF("%02d",(SELECT MAX(record_count)+1 FROM Main))||"/"||SUBSTR(Data_reference,3,2), Date_reference, Year_reference, '+
          'Contract_reference, Summa_reference FROM Main WHERE id=' + Main.Table_main.sqlValue);

БЛАГОДАРЮ! ВСЕ ОТЛИЧНО!

28

(12 replies, posted in Russian)

sparrow wrote:

в компактном виде

procedure Main_btn_copy_OnClick (Sender: TObject; var Cancel: boolean);
begin
    if Main.Table_main.dbItemID <> -1 then
    begin
        SQLExecute ('INSERT INTO Main (record_count, FIO_parent, FIO_child, N_reference, Date_reference, Year_reference, Contract_reference, Summa_reference) '+
          'SELECT (SELECT MAX(record_count)+1 FROM Main), FIO_parent, FIO_child, (SELECT CASE WHEN LENGTH(MAX(record_count)+1) < 2 THEN "0"||MAX(record_count)+1 '+
          'ELSE MAX(record_count)+1 END FROM Main)||"/"||SUBSTR(Data_reference,3,2), Date_reference, Year_reference, Contract_reference, Summa_reference '+
          'FROM Main WHERE id=' + Main.Table_main.sqlValue);
        Main.Table_main.dbUpdate; // Update TableGrid
        Main.Table_main.dbItemID := last_insert_id; // select new record in TableGrid
    end;
end;

БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!
Только в номере с номером менее 2 цифр не добавляется нолик

29

(12 replies, posted in Russian)

sparrow wrote:

Date_reference,  Year_reference - в каком формате эти поля? 2025, 2025-01-01 00:00:00.000 или другой.

Data_reference - дата в формате 2025-01-23 00:00:00.000
Year_reference - год в текстовом формате "2025"

sparrow wrote:

В какое из них сохраняется текущая дата при формировании записи?

Data_reference - дата выдачи справки (выбирается в комбо боксе календаре)

sparrow wrote:

или вам нужна в скопированом номере текущая дата и дата в номере?

Номер справки должен формироваться из 2-х частей (2 цифры попорядку из счетчика, знак "/" и 2 цифры года выдачи справки).
Все так и формируется, но необходимо по нажатию на кнопку "Копия справки" сделать копию, но со следующим номером

30

(12 replies, posted in Russian)

sparrow wrote:

Номер справки (NN/Текущий год из двух цифр) сохраняется в базе данных?
Если да то под каким полем?

Да, сохраняется в поле N_reference

sparrow wrote:

Frm_add_reference.invisible_counter - это компонет Counter?

Верно, это поле на форме со скрытым счётчиком

31

(12 replies, posted in Russian)

Добрый день!
Помогите, пожалуйста. Есть таблица с данными, в которой автоматически создается номер справки в формате (NN/Текущий год из двух цифр), который формируется скриптом

procedure Frm_add_reference_OnShow (Sender: TObject; Action: string);
var
    id : integer;
begin
    if Action='NewRecord' then
    begin
        id := StrToInt(Frm_add_reference.invisible_counter.Text);
        Frm_add_reference.add_N.Text := Format('%.2d', [id]) + '/' + Copy(Inttostr(YearOf(Date)),3,2);
    end;
end;

Есть кнопка "Копирование", которая делает копию строки, но необходимо, чтобы при создании копии справки к номеру прибавлялось +1, т.е. следующая. Помогите реализовать данное действие.

procedure Main_btn_copy_OnClick (Sender: TObject; var Cancel: boolean);
begin
    if Main.Table_main.dbItemID <> -1 then
    begin
        SQLExecute ('INSERT INTO Main (record_count, FIO_parent, FIO_child, N_reference, Date_reference, Year_reference, Contract_reference, Summa_reference) SELECT record_count, FIO_parent, FIO_child, N_reference, Date_reference, Year_reference, Contract_reference, Summa_reference FROM Main WHERE id=' + Main.Table_main.sqlValue);
        Main.Table_main.dbUpdate; // Update TableGrid
        Main.Table_main.dbItemID := last_insert_id; // select new record in TableGrid
    end;
end;

И еще вопрос. Как можно сбросить счетчик автоинкремента нажатием кнопки?
Спасибо!

32

(4 replies, posted in Russian)

Огромное Вам спасибо!
Все отлично работает!

33

(4 replies, posted in Russian)

Спасибо!
Я не специалист. Просто пытаюсь разобраться и что-то внедрять. Можете подсказать как объединить вашу функцию и часть кода?

k245 wrote:

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

function DateConv(AValue:string):string;
begin
  try
    Result := FormatDateTime('YYYY-MM-DD',StrToDate(AValue));
  except
    Result := AValue;
  end;
end;

используйте её здесь:

...
        For  columns := 1 To Maxcol Do
        Begin
            result_string := result_string + '"'+DateConv(Excel.ActiveSheet.Cells[rows,columns].Value)+'",'
        End;
...

Добрый день!
Помогите, пожалуйста. Использую скрипт для импорта данных из Excel. В файле Excel каждый раз приходится даты из формата (24.12.2024) переводить в формат (2024-24-12). Возможно ли, чтобы в этом скрипте даты конвертировались автоматически?
Приложил скриншот формы и ссылку на файл Excel (https://disk.yandex.ru/i/4vTvT8ztAsJ1qQ)
Спасибо.

//********************//

procedure Frm_Import_Button1_OnClick (Sender: TObject; var Cancel: boolean);
var
opendialog : Topendialog ;
begin
    opendialog := Topendialog.Create(Frm_Import) ;
    IF opendialog.execute Then
    Frm_Import.Edit1.Text := opendialog.filename ;
    opendialog.free;
end;

//********************//

procedure Frm_Import_Button2_OnClick (Sender: TObject; var Cancel: boolean);
var
Excel : Variant ;
Sheet : Variant ;
rows, columns : Integer;
MaxRow : Integer;
MaxCol : Integer;
result_string : string;
sql_string : string ;
irows : integer ;
begin
    Excel:=CreateOleObject('Excel.Application');
    //Excel.Visible:= True;
    Excel.Workbooks.Open(Frm_Import.Edit1.Text) ;
    Sheet := Excel.WorkSheets[1] ;
    MaxRow := Sheet.Usedrange.EntireRow.count ;
    MaxCol := sheet.Usedrange.EntireColumn.count;
    //special excel[row,column]
    irows := 0 ;
    For  rows := 2 To  MaxRow Do
    Begin
        For  columns := 1 To Maxcol Do
        Begin
            result_string := result_string + '"'+Excel.ActiveSheet.Cells[rows,columns].Value+'",'
        End;
        sql_string := 'INSERT IGNORE INTO Main(id,surname,firstname,patronymic,contract,doplata_cb,doplata,cert_num,ngroup,id_Program,active,data_deactive) values ('+
        copy(result_string,1, Length(result_string)-1)+');';
        Frm_Import.Memo1.Lines.Add(sql_string) ;
        irows := irows +1 ;
        result_string := '' ;
        sql_string := '' ;
        Frm_Import.Label1.Caption := IntToStr(irows);
    End;
// deleted past about kill excel
        Application.ProcessMessages;
        Excel.Workbooks.Close;
        KillTask('EXCEL.EXE');
end;

//********************//


procedure Frm_Import_Button3_OnClick (Sender: TObject; var Cancel: boolean);
var
i_sql : integer ;
begin
    For i_sql := 0 To Strtoint(Frm_Import.Label1.Caption) -1 Do
    Begin
        SQLExecute(Frm_Import.Memo1.Lines[i_sql]) ;
        Frm_Import.Label2.Caption := IntToStr(i_sql+1) ;
        Frm_Import.Label3.Caption := FormatFloat('0.00',(i_sql+1)/StrTOInt((Frm_Import.Label1.Caption))*100)+' %' ;
        Application.ProcessMessages;
    End;
    Application.ProcessMessages;
    FrmMain.Table_Main.dbUpdate;
    Frm_Import.Edit1.Clear;
    Frm_Import.Memo1.Clear;
    Frm_Import.Label1.Caption :='0';
    Frm_Import.Label2.Caption :='0';
    Frm_Import.Label3.Caption :='0.0%';
    Frm_Import.Close;
end;

//********************//

Подскажите, как сделать, чтобы при наборе текста в поле ввода, все начиналось с заглавной буквы? Спасибо

derek wrote:

Привет Vickus, Sparrow,
Вы также можете использовать «год» даты заказа вместо «текущего года», чтобы обеспечить немного большую гибкость (особенно в декабре/январе, когда вам может потребоваться перенести дату вперед или назад).
Derek.

Дерек, и Вам большое спасибо за столь скорую помощь и вариативность!

sparrow wrote:

Пример

Большое спасибо за столь скорую помощь!

Добрый день!
Подскажите, подалуйста, как сделать, чтобы при вводе документа в поле номер приказа происходило автоматическое присвоение номера приказа, состоящее из следующего по порядку числа, любого знака разделения (лучше "/") и текущего года (две последние цифры "24")

39

(12 replies, posted in Russian)

sparrow wrote:

как то так

Большое спасибо за помощь! Все получилось

40

(12 replies, posted in Russian)

sparrow wrote:

Привет Дерек.
Да, это хорошее решение. Только нумерация странная ... . Я такую не встречал. Я внес небольшое изменение.
И мой и твой пример имеют некоторые недостатки.
В целом еще одно хорошее решение для рейтинга.


Hi Derek.
Yes, this is a good solution. Only the numbering is strange ... . I have not seen such. I made a small change.
Both my example and yours have some flaws.
Overall, another good solution for the ranking.

  for vi := 0 to form1.tablegrid1.RowCount-1 do
  begin
    if vi = 0 then form1.tablegrid1.cell[2,vi].asinteger := vi + 1 else
    if form1.tablegrid1.cells[1,vi] <> form1.tablegrid1.cells[1,vi-1] then
      form1.tablegrid1.cell[2,vi].asinteger := form1.tablegrid1.cell[2,vi - 1].asinteger + 1 else
        form1.tablegrid1.cell[2,vi].asinteger := form1.tablegrid1.cell[2,vi - 1].asinteger;
  end;

-------------------

Огромное спасибо за помощь и разъяснения!!!
Взял способ от Дерека.
Еще вопрос: подскажите, как вывести в отчет на бумаге все поля (Студент, его оценки и итоговое место)?
Еще раз огромное спасибо!!!

41

(12 replies, posted in Russian)

sparrow wrote:

The query can be simplified by using new versions of SQLite.

Спасибо большое! А можете пояснить что такое t1.t, t2.t, rno

42

(12 replies, posted in Russian)

Добрый день! Помогите, пожалуйста.
Есть таблица с ФИО и столбцами (оценки за вопросы и итоговые балы = сумма всех баллов).
Например:
| № | ФИО               | 1 | 2 | 3 | 4 | 5 | 6 | Итого | Место | 
| 1  | Иванов Иван | 2 | 2 | 3 | 2 | 3 | 2 | 13       |            |
| 2  | Ильин Илья   | 2 | 3 | 3 | 3 | 3 | 2 | 15       |            |
| 3  | Петров Петр | 2 | 2 | 3 | 2 | 3 | 1 | 12       |            |
Как сделать, чтобы в столбце "Место" проставлялось место, в соотсветствии с набранной суммой баллов, с группировкой (в случае одинаковых сумм (несколько человек первое место или другое)?
Спасибо заранее!

43

(1 replies, posted in Russian)

Добрый день!
Возможно ли установить ограничения по вводу в ячейку (TextBox) числа? Например: на форме 10 полей для ввода цифр. Необходимо сделать отдельную форму (для ввода максимальных значений для тех 10 полей), ввести эти значения. А когда тестируемый будет вводить цифры и цифра будет не из диапозона (от 0 до введенной в исходных данных), то будет выходить сообщение об ошибке.
Заранее всех благодарю!

44

(6 replies, posted in Russian)

Добрый день!
Подскажите, а возможно ли изменить имя выпадающего окна? Сейчас окно имеет название проекта, а хотелось бы что-то типа "Внимание!"

Добрый день!
Помогите, пожалуйста. Возможно кто-нибудь может поделиться проектом или разработкой схожей с мои запросом. Необходимо сделать график учета посещения занятий по примеру вложенного файла (Excel).
Очень надеюсь на помощь!

Спасибо за помощь! Все понял.

Добрый день! Никак не могу понять что не так. В одном проекте при двойном клике на записи в таблице открывается данная запись для редактирования, а во втором не открывается. Какие свойства отвечают за данный момент? Возможно скрипт есть? Спасибо!

48

(1 replies, posted in Russian)

Добрый день!
Возможно ли на форме установить выпадающий список с данными не из другой таблицы (без внешнего ключа)?
Спасибо

49

(6 replies, posted in Script)

Добрый день!
Подскажите, как сделать так, чтобы при наборе текста в поле все начиналось с заглавной буквы?
Пробовал использовать маску ввода >L<, но как я понял, здесь жестко указывается количество символов. А мне необходимо вводить текст неограниченного по символам.
Спасибо!

50

(15 replies, posted in Russian)

dazzleqq wrote:

Можно и так (обновленный вариант Derek) big_smile:D:D
P.S. Возможно неправльно, но за то работает) (лучше конечно DateTimerPicker использовать и обновлять не кнопкой, а скриптом, дабы лишними кнопками не засорять форму)

Большое человеческое вам спасибо!