1 (edited by savage 2014-10-12 20:05:05)

Topic: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

Есть такая проблема:
не отрабатывает как положено сохранение в таблицу Tasks данных с формы (AddSubTask), т.е. код не ругается, но сохранения не происходит. Собственно код:

 //проверка на соответствие юзера юзеру Задачи и в случае несовпадения сохранение в базе данной подзадачи, как задачи для юзера этой формы
       if    AddSubTask.ComboBoxEmpl.dbItemID <> NewTask.ComboBox_Empl.dbItemID then
         begin
               SQLExecute('INSERT INTO Tasks (Task_name, id_TaskType, id_users, start_PF, finishPL, finishFc, active_task, comments) VALUES ("'+AddSubTask.Edit1.Text+'", 2 , ' + IntToStr(AddSubTask.ComboBoxEmpl.dbItemID)+', '+ FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker3.Date)+', '+ FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker1.Date)+', '+ FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker2.Date)+',' + IntToStr(AddSubTask.CheckBox1.State)+',"'+AddSubTask.Memo1.Text+'" );');
         end;

PS на этой же кнопке висит еще 1 штатное (форма + кнопка "сохранить") сохранение в другую таблицу...

Архив, с рабочим решением прикреплен к последнему посту

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

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

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

DriveSoft, просветите насчет after click, плиз. Когда он, вообще, нужен?
имхо, связка онклик и оншоу должна полностью закрывать все проблемы...

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

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

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

Короче, не помогло.. Зараза и не ругается на ошибку...

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

дату в SQL запросе также необходимо обрамлять кавычками

SQLExecute('INSERT INTO Tasks (Task_name, id_TaskType, id_users, start_PF, finishPL, finishFc, active_task, comments) VALUES ("'+AddSubTask.Edit1.Text+'", 2 , ' + IntToStr(AddSubTask.ComboBoxEmpl.dbItemID)+', "'+ FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker3.Date)+'", "'+ FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker1.Date)+'", "'+ FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker2.Date)+'",' + IntToStr(AddSubTask.CheckBox1.State)+',"'+AddSubTask.Memo1.Text+'" );');

OnAfterClick
Срабатывает при нажатии кнопки, но после выполнения действия, которое было назначено для кнопки, такие как: Новая запись, Сохранить запись и т.д.
Если у кнопки нет действия (свойство Action не задано), то данное событие не вызывается.

Dmitry.

7 (edited by savage 2014-10-11 19:45:15)

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

DriveSoft, Вы правы. Спасибо за помощь

Только есть небольшое но...
1. Когда у меня на форме AddSubTask одна из дат стоит неотчеканная (т.е. не стоит ничего в одном из полей), по умолчанию в таблице пишет текущую. Это весьма странное поведение, честно говоря ...

2. при корректировке данных в форме происходит сохранение записи в Task,? как ни в чем не бывало, повторно. При след редактировании - еще раз и так до бесконечности. Придется забивать проверку на существование старой, но это уже нехорошо..

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

savage


1. Это необходимо проверять, в примере ниже проверяется DateTimePicker3

var
  sDate1: string;
begin
if AddSubTask.DateTimePicker3.Checked then  sDate1 := '"' +FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker3.Date) + '"'
else sDate1 := 'NULL';

SQLExecute('INSERT INTO Tasks (Task_name, id_TaskType, id_users, start_PF, finishPL, finishFc, active_task, comments) VALUES ("'+AddSubTask.Edit1.Text+'", 2 , ' + IntToStr(AddSubTask.ComboBoxEmpl.dbItemID)+', '+ sDate1 +', "'+ FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker1.Date)+'", "'+ FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker2.Date)+'",' + IntToStr(AddSubTask.CheckBox1.State)+',"'+AddSubTask.Memo1.Text+'" );');

2. Эта форма при сохранении вызывает SQL скрипт INSERT INTO?
если да, то необходимо в случае редактирования записи, использовать UPDATE


Form1.dbAction - позволяет узнать, для чего была открыта форма (для создания новой записи или редактирования)
Может иметь следующие значения:
'NewRecord' - при вызове окна с помощью кнопки с действием Новая запись.
'ShowRecord' - при вызове окна с помощью кнопки с действием Показать запись
'ShowForm' - при вызове окна с помощью кнопки с действием Показать форму
'' - пустая строка, если окно было вызвано с помощью скрипта.

пример:

 procedure Form1_bSave_OnClick (Sender: string; var Cancel: boolean);
 begin
    if Form1.dbAction = 'NewRecord' then ShowMessage('Форма была вызвана для создания новой записи');
 end;

помимо этого, вам необходимо знать идентификатор текущей записи, его можно получить у кнопки сохранения записи
Form1.Button1.dbGeneralTableId

Dmitry.

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

1. Это необходимо проверять, в примере ниже проверяется DateTimePicker3

Это я понял, но я имел вв иду сделать эту функцию штатной (проверкой по умолчанию), т.к. пользователем предполагается, что если не заполнено, то пусто

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

Form1.dbAction - позволяет узнать, для чего была открыта форма (для создания новой записи или редактирования)
Может иметь следующие значения:
'NewRecord' - при вызове окна с помощью кнопки с действием Новая запись.
'ShowRecord' - при вызове окна с помощью кнопки с действием Показать запись
'ShowForm' - при вызове окна с помощью кнопки с действием Показать форму
'' - пустая строка, если окно было вызвано с помощью скрипта.

Умно придумано. Сейчас попробую...

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

savage wrote:

1. Это необходимо проверять, в примере ниже проверяется DateTimePicker3

Это я понял, но я имел вв иду сделать эту функцию штатной (проверкой по умолчанию), т.к. пользователем предполагается, что если не заполнено, то пусто

это предполагается в случае сохранения записи без использования скриптов, в случае скриптов, все чуть сложней )
но согласен, нужно будет сделать для компонента DateTimePicker метод, возвращающий значение для SQL запроса, где уже будет встроена проверка.

Dmitry.

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

DriveSoft, это было бы прекрасно.

13 (edited by savage 2014-10-11 23:04:43)

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

2. Эта форма при сохранении вызывает SQL скрипт INSERT INTO?
если да, то необходимо в случае редактирования записи, использовать UPDATE

Form1.dbAction - позволяет узнать, для чего была открыта форма (для создания новой записи или редактирования)
Может иметь следующие значения:
'NewRecord' - при вызове окна с помощью кнопки с действием Новая запись.
'ShowRecord' - при вызове окна с помощью кнопки с действием Показать запись
'ShowForm' - при вызове окна с помощью кнопки с действием Показать форму
'' - пустая строка, если окно было вызвано с помощью скрипта.
пример:
procedure Form1_bSave_OnClick (Sender: string; var Cancel: boolean);
begin
    if Form1.dbAction = 'NewRecord' then ShowMessage('Форма была вызвана для создания новой записи');
end;

помимо этого, вам необходимо знать идентификатор текущей записи, его можно получить у кнопки сохранения записи
Form1.Button1.dbGeneralTableId

DriveSoft, проблема в том, что у меня немного сложный случай:
1. я имею 2 таблицы: 1- с задачами и 2- подзадачами
2. Задача создается конкретным юзером - ответственным за ее исполнениие. По его задаче могут проходить несколько подзадач для разных юзеров, которые находятся у него в подчинении.
3. при создании подзадач при сохранении идет отработка скрипта - в случае, если юзер, который ставил Задачу не совпадает с тем, кто проходит по подзадаче, то такая подзадача пишется:  в таблицу Задач -  как задача на подчиненного (он может ее просматривать), в таблицу Подзадач - как подзадача для его начальника
4. получается, что при корректировке Задач начальника, он может поменять любое поле у любой подзадачи и необходимо, чтобы автоматически откорректировалась задача у его подчиненного.
Проблема в том, что прямой связи между Задачей подчиненного и подзадачей начальника нет. Надеюсь, понятно объяснил..
Встает вопрос - как мне проверить та ли это задача подчиненного, что проходит у его начальника, как подзадача?  Практически все поля не уникальны, даже название задач может уже встречаться (есть ряд однотипных задач)... Между 2 таблицами уже есть связь "Задача -> подзадачи", организовать еще и обратную, имхо, невозможно. Что приходит на ум - создать поле в таблице Задачи, в котором бы содержались id подзадач, им соответствующим...
теперь становится понятна Ваша сентенция насчет:

помимо этого, вам необходимо знать идентификатор текущей записи, его можно получить у кнопки сохранения записи
Form1.Button1.dbGeneralTableId

14 (edited by savage 2014-10-12 01:50:33)

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

DriveSoft, 2 вопроса:

1. попробовал написать код по предотвращению дубляжа и почему-то в первое редактирование скрипт записывает в таблицу задачу  как новую, и только при повторной операции начинает делать update.

мой код:

procedure AddSubTask_BtSubTaskOK_OnAfterClick (Sender: string);
var
  sDate1, sDate2, sDate3: string;
  sST, idSubT : string;

begin

  idSubT:= VarToStr(AddSubTask.BtSubTaskOK.dbGeneralTableId);
  sST:= SQLExecute('SELECT id FROM Tasks WHERE (idSubTask =' + idSubT+');');

    //проверка на соответствие юзера юзеру Задачи и в случае несовпадения сохранение в базе данной подзадачи, как задачи для юзера этой формы
         if    AddSubTask.ComboBoxEmpl.dbItemID <> NewTask.ComboBox_Empl.dbItemID then
           begin
             if AddSubTask.DateTimePicker3.Checked then  sDate1 := '"' +FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker3.Date) + '"'
             else sDate1 := 'NULL';

             if AddSubTask.DateTimePicker1.Checked then  sDate2 := '"' +FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker1.Date) + '"'
             else sDate2 := 'NULL';

             if AddSubTask.DateTimePicker2.Checked then  sDate3 := '"' +FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker2.Date) + '"'
             else sDate3 := 'NULL';

             if sST = '' then SQLExecute('INSERT INTO Tasks (Task_name, id_TaskType, id_users, start_PF, finishPL, finishFc, active_task, comments, idSubTask) VALUES ("'+AddSubTask.Edit1.Text+'", 2 , ' + IntToStr(AddSubTask.ComboBoxEmpl.dbItemID)+', '+ sDate1 +','+ sDate2 +','+ sDate3 +',' + IntToStr(AddSubTask.CheckBox1.State)+',"'+AddSubTask.Memo1.Text+'","' +idSubT+'");');
             if sST <> '' then SQLExecute ('UPDATE Tasks SET Task_name ="'+AddSubTask.Edit1.Text+'", id_users=' + IntToStr(AddSubTask.ComboBoxEmpl.dbItemID)+', start_PF ='+ sDate1 +', finishPL ='+ sDate2 +', finishFc ='+ sDate3 +', active_task =' + IntToStr(AddSubTask.CheckBox1.State)+', comments ="'+AddSubTask.Memo1.Text+'" WHERE (id = ' + sST+');');
           end;

end;

2. как этот код модернизировать под вкладку?

 Form1.dbAction

с уважением,

savage

15 (edited by savage 2014-10-12 16:39:02)

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

По поводу проблемы при первом редактировании - имхо, это происходит из-за того, что при создании новой задачи в поле хранения idSubTask ничего не записывается, т.к. Id получить можно только при редактировании. Таким образом, проблема в том, как получить его при сохранении записи в первый раз

немного сумбурно, но, думаю, верно

Попробую порыть в сторону функции получения  id последней записи в таблице...

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

Честно говоря я уже запутался,
мне слишком много придется разбираться в проекте чтобы ответить на все вопросы )

Dmitry.

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

Уфф, разобрался. Рабочий код:

procedure AddSubTask_BtSubTaskOK_OnAfterClick (Sender: string);
var
  sDate1, sDate2, sDate3: string;
  sST, idSubT1, idSubT2 : string;

begin

    //проверка на соответствие юзера юзеру Задачи и в случае несовпадения сохранение в базе данной подзадачи, как задачи для юзера этой формы
         if    AddSubTask.ComboBoxEmpl.dbItemID <> NewTask.ComboBox_Empl.dbItemID then
           begin
             if AddSubTask.DateTimePicker3.Checked then  sDate1 := '"' +FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker3.Date) + '"'
             else sDate1 := 'NULL';

             if AddSubTask.DateTimePicker1.Checked then  sDate2 := '"' +FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker1.Date) + '"'
             else sDate2 := 'NULL';

             if AddSubTask.DateTimePicker2.Checked then  sDate3 := '"' +FormatDateTime('yyyy-MM-DD',AddSubTask.DateTimePicker2.Date) + '"'
             else sDate3 := 'NULL';

             idSubT1:= VarToStr(AddSubTask.BtSubTaskOK.dbGeneralTableId);
         
             If  (idSubT1 = '-1') OR (idSubT1 = '') then
               begin
                idSubT2:= VarToStr(Last_Insert_id('SubTasks'));
                SQLExecute('INSERT INTO Tasks (Task_name, id_TaskType, id_users, start_PF, finishPL, finishFc, active_task, comments, idSubTask) VALUES ("'+AddSubTask.Edit1.Text+'", 2 , ' + IntToStr(AddSubTask.ComboBoxEmpl.dbItemID)+', '+ sDate1 +','+ sDate2 +','+ sDate3 +',' + IntToStr(AddSubTask.CheckBox1.State)+',"'+AddSubTask.Memo1.Text+'","'+idSubT2+'");');
               end else
                  begin
                    sST:= SQLExecute('SELECT id FROM Tasks WHERE idSubTask =' + idSubT1+';');
                    if sST <> '' then SQLExecute ('UPDATE Tasks SET Task_name ="'+AddSubTask.Edit1.Text+'", id_users=' + IntToStr(AddSubTask.ComboBoxEmpl.dbItemID)+', start_PF ='+ sDate1 +', finishPL ='+ sDate2 +', finishFc ='+ sDate3 +', active_task =' + IntToStr(AddSubTask.CheckBox1.State)+', comments ="'+AddSubTask.Memo1.Text+'" WHERE (id = ' + sST+');')
                    else SQLExecute('INSERT INTO Tasks (Task_name, id_TaskType, id_users, start_PF, finishPL, finishFc, active_task, comments, idSubTask) VALUES ("'+AddSubTask.Edit1.Text+'", 2 , ' + IntToStr(AddSubTask.ComboBoxEmpl.dbItemID)+', '+ sDate1 +','+ sDate2 +','+ sDate3 +',' + IntToStr(AddSubTask.CheckBox1.State)+',"'+AddSubTask.Memo1.Text+'","'+idSubT2+'");');
                  end;
         end;
end;

18 (edited by savage 2014-10-12 19:27:12)

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

DriveSoft,  а что насчет этого вопроса(на будущее):

как этот код модернизировать под вкладку?
Form1.dbAction

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

savage
а что значит под вкладку? )

Dmitry.

20 (edited by savage 2014-10-12 20:03:49)

Re: [Решено] INSERT - сохранение/редактирование с учетом связанной таблицы

просто, у меня на форме есть несколько вкладок, на которых есть свои кнопки "Edit", "Delete", "New"...
я подумал, что уместно будет учитывать еще и вкладку, но, поразмыслив, уже уверен, что нет.
Короче, извиняюсь за глупость.

Спасибо огромное за помощь! Благодаря Вам, продвинулся уже к бета-версии потихоньку

Для иллюстрации решения, прикладываю проект (так будет проще разобраться остальным, о чем шла речь)

Post's attachments

Attachment icon PlanWork.zip 358.37 kb, 584 downloads since 2014-10-12