Topic: Подскажите, как еще можно получить текущий id для обновления...

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

Использовал тогда такую конструкцию

SQLExecute('UPDATE client SET name = "'+frmNote.Edit1.Text+'" WHERE id='+frmNote.ComboBox7.sqlValue);

Все хорошо, но приходится создавать и прятать элемент ComboBox7

Подскажите, еще способы, сп.

2 (edited by sibprogsistem 2019-08-17 16:12:36)

Re: Подскажите, как еще можно получить текущий id для обновления...

vit007 wrote:

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

Использовал тогда такую конструкцию

SQLExecute('UPDATE client SET name = "'+frmNote.Edit1.Text+'" WHERE id='+frmNote.ComboBox7.sqlValue);

Все хорошо, но приходится создавать и прятать элемент ComboBox7

Подскажите, еще способы, сп.

+Form1.TableGrid1.sqlValue

обновить таблицу

Form1.TableGrid1.dbUpdate;

id можно получать от куда угодно с любой формы
можно еще создать глобальную переменную и помещать в нее  id записи при клике на таблице

var
sId:string;

procedure Form1_TableGrid1_OnCellClick (Sender: TObject; ACol, ARow: Integer);
begin
  sId:=SQLEXecute('SELECT id FROM a WHERE id='+ Form1.TableGrid1.sqlValue );
  showmessage(sId);
end;

Re: Подскажите, как еще можно получить текущий id для обновления...

+Form1.TableGrid1.sqlValue

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

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

4 (edited by sibprogsistem 2019-08-19 06:28:08)

Re: Подскажите, как еще можно получить текущий id для обновления...

vit007 wrote:
+Form1.TableGrid1.sqlValue

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

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

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


var
переменная:тип переменной;
 
глобальная переменная может вызываться и использоваться в любой процедуре..

процедера (*********);
begin
переменная:=значение;
end;

 
 
Локальная переменнная вызывается в процедуре и может использоваться только в пределах этой процедуры

процедера (*********);
var
переменная:тип переменной;
begin
переменная:=значение;
end;

Post's attachments

Attachment icon test.7z 3.38 kb, 256 downloads since 2019-08-19 

Re: Подскажите, как еще можно получить текущий id для обновления...

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

procedure frmMain_TableGrid1_OnCellClick (Sender: TObject; ACol, ARow: Integer);
var
    rId:string;
begin
    rId:=SQLEXecute('SELECT id FROM request WHERE id='+ frmMain.TableGrid1.sqlValue);
    //showmessage(rId);
end;
procedure frmNote_Button8_OnClick (Sender: TObject; var Cancel: boolean);
begin
    showmessage(rId);
end;

6 (edited by vit007 2019-08-19 10:41:51)

Re: Подскажите, как еще можно получить текущий id для обновления...

странно... но в примере выше работает, но в пределах одной формы

//глобальная переменная
var
name:string;

procedure Form1_Edit1_OnChange (Sender: TObject);
begin
  // присваеваем переменной текст
  name:=Form1.Edit1.Text;
end;
procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
begin
  //выводим значение переменной
  showmessage(name);
end;

7 (edited by sibprogsistem 2019-08-19 11:27:42)

Re: Подскажите, как еще можно получить текущий id для обновления...

это глобальная - пишется в самом верху вашей страницы
ее не нужно помещать в процедуру просто напишите как в примере в самом начале страницы

 //глобальная переменная
var
name:string;

 
это локольная переменная - обьявляется в самой процедуре

procedure Form1_Edit1_OnChange (Sender: TObject);
var
name:string;
begin
end;

Весь ваш лист СКРИПТ - это и есть  программа а процедуры в листе - это подпрограммы...
глобальная переменная объявляется в начале листа и действует во всей программе и подпрограммах..

Post's attachments

Attachment icon test.7z 3.68 kb, 249 downloads since 2019-08-19 

Re: Подскажите, как еще можно получить текущий id для обновления...

Вроде, наконец-то...
А дочерней записи, можно узнать?

SQLExecute('SELECT setStatus FROM status LEFT OUTER JOIN client ON status.id=client.id_status WHERE client.id='+frmNew.ComboBox2.sqlValue);

Что-то наподобие этого?

Re: Подскажите, как еще можно получить текущий id для обновления...

ну, да, а что именно вы хотите получить?

Re: Подскажите, как еще можно получить текущий id для обновления...

мне нужно обновить запись... это перекликается с темой в соседней ветке
http://myvisualdatabase.com/forum/viewtopic.php?id=5133

Re: Подскажите, как еще можно получить текущий id для обновления...

попробуйте этот пример

Post's attachments

Attachment icon test.7z 4.82 kb, 247 downloads since 2019-08-20 

12 (edited by vit007 2019-08-21 08:09:03)

Re: Подскажите, как еще можно получить текущий id для обновления...

Наверно, я что-то нахимичил со связью в таблице... не выдает id дочерней записи.

var
sId:string;
begin
  sId:= SQLEXecute('SELECT request.id FROM request LEFT OUTER JOIN notice ON request.id_notice=notice.id WHERE notice.id=' +frmMain.TableGrid1.sqlValue );
  SQLEXecute('UPDATE notice SET setNotice="'+frmAddNote.Edit1.Text+'" WHERE id=' +sId);
  frmMain.TableGrid1.dbUpdate;
end;

У меня есть предположение, надо было сделать поле в таблице где будет сливаться значение comboBox "notice", как в вашем примере

Post's attachments

Attachment icon 000.png 136.5 kb, 131 downloads since 2019-08-21 

13 (edited by vit007 2019-08-21 08:10:05)

Re: Подскажите, как еще можно получить текущий id для обновления...

Вот настройки таблицы frmMain.TableGrid1

Post's attachments

Attachment icon 001.png 151.68 kb, 187 downloads since 2019-08-21 

14 (edited by sibprogsistem 2019-08-21 10:23:36)

Re: Подскажите, как еще можно получить текущий id для обновления...

vit007 wrote:

Вот настройки таблицы frmMain.TableGrid1

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


var
sId:string;
begin
  sId:= SQLEXecute('SELECT id_notice FROM request  WHERE  id=' +frmMain.TableGrid1.sqlValue );
  SQLEXecute('UPDATE notice SET setNotice="'+frmAddNote.Edit1.Text+'" WHERE id=' +sId);
  frmMain.TableGrid1.dbUpdate;
end;

request.id_notice где поле id_notice уже содержит id записи из таблицы notice

Re: Подскажите, как еще можно получить текущий id для обновления...

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

16 (edited by vit007 2019-08-21 13:10:46)

Re: Подскажите, как еще можно получить текущий id для обновления...

добавил текстовое поле в таблицу и все заработало, сп.

17 (edited by vit007 2019-08-22 09:23:18)

Re: Подскажите, как еще можно получить текущий id для обновления...

sibprogsistem, я правильно понимаю, что у каждой новой записи все дочерние должны начинать id c начала, т.е.:

1:1,2,3,4
2:1,2,3,4

?

Если да, то у меня есть еще проблемная таблица... В принципе, она работает, т.е., но id...

1:1,3,4,6
2:2,5,7,8

Мне надо решить задачку по сравнению id, чтоб повторно, не открывалась одна и та же форма при увеличении id.

таблица statictic представляет собой таблицу в главной таблице, где ведется история действий по главному id

Post's attachments

Attachment icon 000.png 29.37 kb, 158 downloads since 2019-08-22 

18 (edited by vit007 2019-08-22 12:36:21)

Re: Подскажите, как еще можно получить текущий id для обновления...

Смог выделить последнюю строку таблицы, так:

procedure frmNote_OnShow (Sender: TObject; Action: string);
var
    i, cR : integer;
begin
    cR := frmNote.TableGrid1.RowCount;
    begin
        //выделение первой строки таблицы
        //frmNote.TableGrid1.SelectedRow := 0;

        frmNote.TableGrid1.BeginUpdate;
        for i := 0 to cR do frmNote.TableGrid1.SelectedRow := i;
        frmNote.TableGrid1.EndUpdate;
    end;
end;

А как скрыть, закрасить полутон не получается

Re: Подскажите, как еще можно получить текущий id для обновления...

vit007 wrote:

sibprogsistem, я правильно понимаю, что у каждой новой записи все дочерние должны начинать id c начала, т.е.:

1:1,2,3,4
2:1,2,3,4

каждая таблица начинается с 1-2-3 и. ТД

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

20 (edited by sibprogsistem 2019-08-22 14:24:18)

Re: Подскажите, как еще можно получить текущий id для обновления...

мне надо решить задачку по сравнению id
и
А как скрыть, закрасить полутон не получается

не могу понять вопросы

21 (edited by vit007 2019-08-23 07:54:55)

Re: Подскажите, как еще можно получить текущий id для обновления...

Выкрутился так по сравнению id

var
    a : string;
    b : string;

procedure frmAddNote_Button2_OnClick (Sender: TObject; var Cancel: boolean);
begin
    frmNote.Close
end;

procedure frmNote_OnClose (Sender: TObject; Action: string);
var
    aId : string;
begin
    aId := SQLEXecute('SELECT id FROM statistic WHERE id='+frmNote.TableGrid1.sqlValue);
    if (aId > a) then frmNote.Close else
    if (aId = a) and (b = '1') then frmNote.Close else
    if (aId = a) then frmNote.Button1.Click;
    b := '1';
    frmMain.TableGrid1.dbUpdate;
end;

procedure frmNote_OnShow (Sender: TObject; Action: string);
var
    i, cR : integer;
begin
    cR := frmNote.TableGrid1.RowCount;
    begin
        //выделение первой строки таблицы
        //frmNote.TableGrid1.SelectedRow := 0;

        frmNote.TableGrid1.BeginUpdate;
        for i := 0 to cR do frmNote.TableGrid1.SelectedRow := i;
        frmNote.TableGrid1.EndUpdate;
    end;
    a := SQLEXecute('SELECT id FROM statistic WHERE id='+frmNote.TableGrid1.sqlValue);
    b := '0';
end;

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

Post's attachments

Attachment icon 000.png 1.31 kb, 142 downloads since 2019-08-23 

22 (edited by sibprogsistem 2019-08-23 15:59:29)

Re: Подскажите, как еще можно получить текущий id для обновления...

vit007 wrote:

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


если я правельно понял вопрос , то в свойстах таблицы InactiveSelectionColor

23 (edited by vit007 2019-08-24 09:16:01)

Re: Подскажите, как еще можно получить текущий id для обновления...

Ок, раскраска помогла, но, блин, как выключить выделение строки вообще... функция enabled хороша, но тогда выключается прокрутка. А так при нажатии на таблицу меняется id, и моя задумка не работает...

это не работает:

frmNote.TableGrid1.SelectedRow := -1;

24 (edited by vit007 2019-08-24 11:27:34)

Re: Подскажите, как еще можно получить текущий id для обновления...

В процедуре OnCellClick есть сдвиг, т.е. при нажатие появляется выделение при отжатие пропадает, и все же id меняется...

наверно надо как-то чтоб при включенном enabled работала прокрутка или растягивать таблицу...

Не знаю, но после OnCellClick в теле скрипта, frmNote.TableGrid1.SelectedRow := -1; заработало, как будто,прога вспомнила, что, она так может smile

Re: Подскажите, как еще можно получить текущий id для обновления...

Решил еще и на OnCellClick повесить цикл.