Topic: Заполнение грида копированием данных

Добрый вечер!
Повторно прошу помочь с решением проблемы по заполнению грида по SQL запросу и последующей привязки к открытой форме.
Вот такой запрос по кнопке:
procedure frmScore_Button6_OnAfterClick (Sender: TObject; var Cancel: boolean);
begin
    SQLExecute ('INSERT INTO SpeScore (id_Nomenklature, number, price, NDS, priceNDS, sumNDS) SELECT id_Nomenklature, number, price, NDS, priceNDS, sumNDS FROM SpecDog WHERE id_Dogovor=' + frmScore.ComboBox2.sqlValue;
  SQLExecute ('UPDATE SpeScore SET id_Score=IF NULL (id_Score,' + frmScore.indent.text+ ')");
  frmScore.TableGrid1.dbUpdate;
end;

После выполнения данного запроса выскакивает ошибка, что отсутствует id (открытой формы Score).
Проект прилагаю, форма счета открывается по кнопке словарь - вкладка счет.

Post's attachments

Attachment icon База 2023.zip 517.52 kb, 123 downloads since 2023-01-17 

Re: Заполнение грида копированием данных

glkonst79 wrote:

форма счета открывается по кнопке словарь - вкладка счет.

поправьте проект, компилятор выдает ошибки

Re: Заполнение грида копированием данных

Добрый вечер!
Этот архив должен работать

Post's attachments

Attachment icon УМТО-2023.zip 517.91 kb, 115 downloads since 2023-01-18 

Re: Заполнение грида копированием данных

Тут Вы создаете новую запись ( не хватало закрывающей скобки)

SQLExecute ('INSERT INTO SpeScore (id_Nomenklature, number, price, NDS, priceNDS, sumNDS) SELECT id_Nomenklature, number, price, NDS, priceNDS, sumNDS FROM SpecDog WHERE id_Dogovor=' + frmScore.ComboBox2.sqlValue);

 
Тут Вы обновляете запись

SQLExecute ('UPDATE SpeScore SET id_Score=IF NULL (id_Score,' + frmScore.indent.text+ ')"'); 

Запись обновляется ( поле="значение" ) также у Вас отсутствует (значение WHERE id=), то есть программа не знает по какому id обновлять.
 
Если Вы обновляете последнюю созданную запись, то нужно использовать

IntToStr(Last_Insert_id)

 
Так же не понятно, что это за компонент ( frmScore.indent.text) его просто нет.

Re: Заполнение грида копированием данных

При запросе на обновление, я хотел указать, что все записи со значением id_score = NULL  должны замениться на значение поля indent, которое равно id таблицы Score

Re: Заполнение грида копированием данных

glkonst79 wrote:

При запросе на обновление, я хотел указать, что все записи со значением id_score = NULL  должны замениться на значение поля indent, которое равно id таблицы Score

тогда условие добавьте:

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

Re: Заполнение грида копированием данных

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

Post's attachments

Attachment icon УМТО-2023.zip 520.08 kb, 111 downloads since 2023-01-20 

Re: Заполнение грида копированием данных

glkonst79 wrote:

Проект с запросами по советам прикладываю.

SpeScore - записи вообще не создаются
Score - то 1-а то 2-е записи разом добавляются
опять же не понятно зачем Вы создаете заранее идентификатор и с его помощью создаете связь с записью у которой есть  Last_Insert_id
при этом Вы делаете это до того как будет созданная запись в score..

Re: Заполнение грида копированием данных

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

Re: Заполнение грида копированием данных

glkonst79 wrote:

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

посмотрел  Ваш запрос

SQLExecute ('INSERT INTO SpeScore (id_Nomenklature, number, price, NDS, priceNDS, sumNDS) SELECT id_Nomenklature, number, price, NDS, priceNDS, sumNDS FROM SpecDog WHERE id_Dogovor=' + frmScore.ComboBox2.sqlValue)

У вас тут данные вообще с разных таблиц, тут вообще все неверно
 
Дайте четкое описание, что и от куда Вы берете!

Re: Заполнение грида копированием данных

pavlenko.vladimir.v wrote:
glkonst79 wrote:

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

посмотрел  Ваш запрос

SQLExecute ('INSERT INTO SpeScore (id_Nomenklature, number, price, NDS, priceNDS, sumNDS) SELECT id_Nomenklature, number, price, NDS, priceNDS, sumNDS FROM SpecDog WHERE id_Dogovor=' + frmScore.ComboBox2.sqlValue)

У вас тут данные вообще с разных таблиц, тут вообще все неверно
 
Дайте четкое описание, что и от куда Вы берете!

Я хочу скопировать данные из таблицы SpecDog (номенклатура договора) в таблицу SpecScore (номенклатура счета) выборкой по номеру договора. Все это хочу осуществить на форме создания счета. Надеюсь картинка разъяснит мысль.

Post's attachments

Attachment icon счет.jpg 466.02 kb, 39 downloads since 2023-01-21 

12 (edited by pavlenko.vladimir.v 2023-01-22 05:55:09)

Re: Заполнение грида копированием данных

glkonst79 wrote:

Я хочу скопировать данные из таблицы SpecDog (номенклатура договора) в таблицу SpecScore (номенклатура счета) выборкой по номеру договора. Все это хочу осуществить на форме создания счета. Надеюсь картинка разъяснит мысль.

Если я Вас правильно понял, это не возможно. Все потому что Вы используете внешний ключ, но по то му же самому ключу может ссылаться множество записей, программа опять не поймет из каких записей брать значения.

Re: Заполнение грида копированием данных

Ну а разве нельзя, чтобы перед началом выполнения запроса сохранить запись счета и после выполнения запроса на копирование и последующее обновление созданных записей ссылаться на данный счет. Только тогда возникает потребность при сохранении формы счета исключить дублирование счетов.

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

Post's attachments

Attachment icon закупка.jpg 259.46 kb, 37 downloads since 2023-01-22 

14 (edited by pavlenko.vladimir.v 2023-01-22 16:08:08)

Re: Заполнение грида копированием данных

glkonst79 wrote:

Ну а разве нельзя, чтобы перед началом выполнения запроса сохранить запись счета и после выполнения запроса на копирование и последующее обновление созданных записей ссылаться на данный счет. Только тогда возникает потребность при сохранении формы счета исключить дублирование счетов..

счета вообще не причем, у Вас нет явного указания на запись  в таблице (SpecDog)..

Re: Заполнение грида копированием данных

А вот на вопрос о корректном отражении счетов на форме закупки, можно дать разъяснение как выправить?

Re: Заполнение грида копированием данных

glkonst79 wrote:

А вот на вопрос о корректном отражении счетов на форме закупки, можно дать разъяснение как выправить?

для этого нужно играть с фильтром,