Topic: Копирование строки

Добрый день!
Помогите, пожалуйста. Есть таблица с данными, в которой автоматически создается номер справки в формате (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;

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

2 (edited by sparrow 2025-01-23 12:38:10)

Re: Копирование строки

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

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

Re: Копирование строки

sparrow wrote:

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

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

sparrow wrote:

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

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

4 (edited by sparrow 2025-01-23 13:06:20)

Re: Копирование строки

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

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

Re: Копирование строки

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 цифры года выдачи справки).
Все так и формируется, но необходимо по нажатию на кнопку "Копия справки" сделать копию, но со следующим номером

Post's attachments

Attachment icon 2025-01-23_17-23-58.png 24.91 kb, 51 downloads since 2025-01-23 

6 (edited by sparrow 2025-01-23 13:55:53)

Re: Копирование строки

!!! ответ обновлен Нашел ошибки


1.

Frm_add_reference.add_N.Text := Format('%.2d', [id]) + '/' + Copy(Inttostr(YearOf(Date)),3,2);

можно заменить на это

Frm_add_reference.add_N.Text := Format('%.2d', [id]) + '/' + FormatDateTime('yy', Date);

2.

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),     // Увеличиваем счетчик Counter
        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;

Вроде не ошибся нигде


3.
Если у вас счетчик нигде больше не используется вы можете все поля счетчика заполнить нулем (0). После этого нумерация начнется с той цифры что в свойствах поля "record_count" - Начальное значение. НО СНАЧАЛА ПРОБОВАТЬ НА ТЕСТОВОЙ БАЗЕ !!!

!!! ответ обновлен Нашел ошибки

Re: Копирование строки

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

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;

Re: Копирование строки

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 цифр не добавляется нолик

Re: Копирование строки

а если так

        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);

Re: Копирование строки

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);

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

11 (edited by Vickus 2025-01-28 07:25:52)

Re: Копирование строки

Vickus wrote:
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);

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

Назрел вопрос. Помогите, пожалуйста, в очередной раз.
Копирование работает отлично. А как можно сделать так, чтобы после удаления любой строки (не важно какой), при копировании проставлялся номер незанятой строки?
К примеру:
1. | Иванов | Иван | Иванович | Договор №45 | 5300 руб. |
2. | Смирнов | Павел | Васильевич | Договор № 52 | 4300 руб. |
4. | Матвеева | Анна | Сергеевна | Договор № 39 | 5400 руб. |

Строку с номером 3 удалили. При копировании любой строки (1, 4, 23...) скопированная запись должна принять свободный номер 3.

Re: Копирование строки

я не вижу в этом смысла.

Но, отвечая на вопрос, только вручную. Добавив в INSERT колонку id и присвоив ей значение вручную.
Вручную - вы должны знать номер (минимальный свобоный, освободившийся, максимальный свободный  ...)

13 (edited by k245 2025-01-28 11:26:31)

Re: Копирование строки

Рекомендую не трогать значения в поле ID ни при каких обстоятельствах. Хотите иметь автонумерацию - добавьте целочисленное (или какое-вам-надо) поле. Но соглашусь со sparrow - нет смысла вставлять пропущенные номера. А если этот номер вам нужен исключительно для печати и не несет никакой смысловой нагрузки, то добавьте поле автонумерации  (#Auto-Number, в старых версиях - #Auto-Increment) - оно всегда будет показывать значения по возрастанию и без пропусков.
https://k245.ru/wp-content/uploads/2023/08/t5.png

https://k245.ru/mvdb/otobrazhenie-tabli … annyh.html

Визуальное программирование: блог и телеграм-канал.