powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Модификация InsertSQL или нет?
11 сообщений из 11, страница 1 из 1
Модификация InsertSQL или нет?
    #32163055
_designer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Трям, All!

Есть таблица (fex):
MainTable ( id integer, Value varchar(20));

Юзеру показывается результат: select Value from MainTable;
Используется IBDataSet.
Необходимо при добавлении записи юзером заполнить поле MainTable.id значением известным только at RunTime (это значение выбирается из другой таблицы).

Как используя InsertSQL вставить запись? Или есть другие варианты.
Изменять InsertSQL at RunTime имхо геморно... :(

Подскажите, как сделать проще...
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163062
Voha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А Append, а потом Присвоить значение полю MainTable, так не работает?
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163066
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, земляк. Как то странно ты накрутить хочешь. Сделай проще.

1. Выбирай оба поля, но показывай пользователю только одно.
2. В обработчике OnNewRecord прописывай значение для поля id.
3. InsertSQL должен как и положено быть вида INSERT MainTable (id, Value) VALUES (:id, :Value)
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163250
_designer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если id заполняется триггером на основе генератора....
Вот здесь Дельфя выкидывает, что значение id = NULL. Т.е. триггер OnInsert как бы не срабатывает - это что за хрень?
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163260
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если id заполняется триггером на основе генератора....

Теперь не понятно, то ты в рантайм хочешь писать значение id, то у тебя триггер генерит значение. С IBDataSet не работал, но если он работает по принципу кешированых изменений, то пока не сохранишь и не перезапросишь, то значения, которые сгенерировал триггер не получишь.
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163600
_designer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то пока не сохранишь и не перезапросишь

В том-то и дело, что ошибка возникает при выполнении DataSet.Post, а надо еще DataSet.ApplyChanges сделать, чтобы cache сбросить и только тогда (я так понял) сработает триггер. Так что же делать, если Post отработал, возникло исключение, а до триггера вообще дело не дошло...?
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163613
Voha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так помоему когда ты делаешь ПОСТ, UpdateSQL вызывает изменение таблицы автоматически. Во всяком случае я всегда так делаю, сперва пост, потом если все нормально коммит.
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163619
Voha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>Вот здесь Дельфя выкидывает, что значение id = NULL. Т.е. триггер OnInsert как бы не срабатывает - это что за хрень?

чтобы этого не было поставь в свойстве Required поля которое обновляется тригером False.
Помоему так.
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163640
_designer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С id все ОК, вроде бы....

Привожу, как есть:
на форме: IBDatabase, IBTransaction, IBDataset, Datasource, DBGrid
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Select SQL on IBDataSet: 
select * from  "RoadLanesL" ;

Insert SQL:
insert into  "RoadLanesL" 
  ( "RoadLanesL" . "mBegin" ,  "RoadLanesL" . "mEnd" ,  "RoadLanesL" . "LaneCount" , 
    "RoadLanesL" . "LaneWidth" )
values
  (: "mBegin" , : "mEnd" , : "LaneCount" , : "LaneWidth" )

Refresh SQL:
Select 
   "RoadLanesL" . "idRoad" ,
   "RoadLanesL" . "id" ,
   "RoadLanesL" . "mBegin" ,
   "RoadLanesL" . "mEnd" ,
   "RoadLanesL" . "LaneCount" ,
   "RoadLanesL" . "LaneWidth" 
from  "RoadLanesL"  
where
   "RoadLanesL" . "id"  = : "id" 

Source:
IBDatasetId.Required := False;
IBDataset.CachedUpdates := False;

procedure TForm1.IBDataSet1BeforePost(DataSet: TDataSet);
begin
  DataSet.FieldByName('idRoad').AsInteger :=  1 ;
end;

Trigger metadata:
CREATE TRIGGER  "RoadLanesL_BI"  FOR  "RoadLanesL" 
ACTIVE BEFORE INSERT POSITION  0 
AS
BEGIN
  IF (NEW. "id"  IS NULL) THEN
    NEW. "id"  = GEN_ID(GENRLL, 1 );
END

Generator metadata:
CREATE GENERATOR GENRLL;
SET GENERATOR GENRLL TO  0 ;



После запуска проги:
Код: plaintext
1.
2.
3.
IBDatabase.Active := True;
IBTransaction.Active := True;
IBDataset.Active := True;

DBGrid отображает содержимое таблицы.
После вставки новой записи пишу в поле mBegin: 555 (например)
При сохранении изменений:
Exception EIBInterbaseError "Validation error for column idRoad, value "***null***""
Где грабли? :(
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163768
_designer_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался.... Всем спасибо, все свободны
...
Рейтинг: 0 / 0
Модификация InsertSQL или нет?
    #32163776
Voha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СПАСИБО ЧТО ОТПУСТИЛ
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Модификация InsertSQL или нет?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]