Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Модификация InsertSQL или нет? / 11 сообщений из 11, страница 1 из 1
19.05.2003, 14:28
    #32163055
_designer_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модификация InsertSQL или нет?
Трям, All!

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

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

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

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

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

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

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

чтобы этого не было поставь в свойстве Required поля которое обновляется тригером False.
Помоему так.
...
Рейтинг: 0 / 0
20.05.2003, 09:55
    #32163640
_designer_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модификация InsertSQL или нет?
С 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
20.05.2003, 11:25
    #32163768
_designer_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модификация InsertSQL или нет?
Разобрался.... Всем спасибо, все свободны
...
Рейтинг: 0 / 0
20.05.2003, 11:29
    #32163776
Voha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модификация InsertSQL или нет?
СПАСИБО ЧТО ОТПУСТИЛ
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Модификация InsertSQL или нет? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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