![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Update Failed [D6, XP]
Drowsy © (2009-03-17 06:50:00)(IBASE)
Есть таблица с данными :
CREATE TABLE LAYOUT (
TYPERAZ D_TYPERAZ /* D_TYPERAZ = CHAR(20) */,
CNT_PRO SMALLINT,
WID_PRO_1 SMALLINT,
WID_PRO_2 SMALLINT,
WID_PRO_3 SMALLINT,
....
....
.....
);
TYPERAZ CNT_PRO WID_PRO_1 WID_PRO_2 WID_PRO_3
2х12 2 12 18 18
2,2х14 2 12 24 24
2,2х16 2 12 24 24
2,5х14 2 12 24 24
2,5х20 3 15 30 30
2,8х14 3 15 30 30
и новая:
CREATE TABLE DRYBAR (
CODE INTEGER NOT NULL, // ключ с автоинкрементом.
CNT_PRO SMALLINT
WID_PRO_1 SMALLINT
);
Вопрос: Можно ли одним запросом заполнить её значениями соответствующих полей из LAYOUT?
Делал разные попытки с
//===== INSERT
uoDryBar.SQL[ukINSERT] =
insert into DRYBAR_S
(CNT_PRO, WID_PRO_1)
SELECT
CNT_PRO, WID_PRO_1
From LAYOUT ;
//======== UPDATE
uoDryBar.SQL[ukMODIFY] =
update DRYBAR_S
set
CODE = :CODE,
CNT_PRO = :CNT_PRO,
WID_PRO_1 = :WID_PRO_1
where
CODE = :OLD_CODE
.....
При выполнении:
uoDryBar.ExecSQL(ukInsert);
всё время возникает ошибка Update Failed.
Drowsy (2009-03-18 12:37:00) [21]"Хоть бы кричал - аж зло берёт..." :)
Drowsy (2009-03-18 11:59:00) [22]procedure FirstLoadSections;
begin
dmMain.qrExecProc.Transaction.StartTransaction;
with dmMain.qrExecProc, SQL do begin
Add(' insert into DRYBAR_S');
Add(' (PR_ID, LAY_CODE, TYPERAZ, CNT_PRO, WID_PRO_1, WID_PRO_2, WID_PRO_3,');
Add(' DRY_STEP, CNT_REM_PRO, CNT_FREE_PRO, VOL_PRICE, SLOPE_1, SLOPE_2, SLOPE_3,');
Add(' STEP_COL)');
Add('SELECT');
Add(INTToStr(PRID) +', CODE, TYPERAZ, CNT_PRO, WID_PRO_1, WID_PRO_2,');
Add(' WID_PRO_3, DRY_STEP, CNT_REM_PRO, CNT_FREE_PRO, VOL_PRICE, SLOPE_1,');
Add(' SLOPE_2, SLOPE_3, STEP_COL');
Add(' FROM LAYOUT4 ');
end;
dmMain.qrExecProc.ExecSQL;
dmMain.qrExecProc.Transaction.Commit;
with dmMain.QueryWork do begin
with SQL do begin
Clear;
Add('SELECT * FROM DRYBAR_S ');
end;
dmMain.QueryWork.Open;
end;
dmMain.dsQueryWork.DataSet := dmMain.QueryWork;
fmFDBTest.DBGridEh.DataSource := dmMain.dsQueryWork;
fmFDBTest.ShowModal;
dmMain.QueryWork.Close;
end;
Drowsy (2009-03-18 11:46:00) [23]Недавно вообще 0-понимал. :)
Sergey13 (2009-03-18 11:44:00) [24]> [16] Drowsy (18.03.09 11:39)
> т.е. труднее понять что происходит с даннымии и причину ошибок
То-то ты сейчас все понимаешь, что с данными происходит. 8-)
Что-то мне говорит за то, что ты комитишь другую транзакцию. Давай конкретный код.
Drowsy (2009-03-18 11:39:00) [25]TIBDataSet, как я читал, более "глухой", по сравнению со связкой TIBQuery + TIBUpdateSQL ( т.е. труднее понять что происходит с даннымии и причину ошибок).
А запрос первый на инсерт данных в таблицу (он выполняется после коммита). После этого формирую набор Select * From Table, открываю его и бросаю на грид - пусто. Перезапускаю прогу, открываю грид - данные есть.
Sergey13 (2009-03-18 11:29:00) [26]> [14] Drowsy (18.03.09 11:19)
> TIBQuery1
Почему не IBDataSet используешь?
Что за запросы конкретно?
Drowsy (2009-03-18 11:19:00) [27]Закрываю TIBQuery1. Делаю инсерт в таблицу на другом TIBQuery2 с другой транзакцией. Коммит этой транзакции. И отрываю селект-набор заданный в TIBQuery1. Смотрю его на гриде - пусто. Появлются данные после перезапуска проги.
Sergey13 (2009-03-18 10:44:00) [28]> [11] Sergey13 © (18.03.09 08:45)
Че то я поторопился похоже.
> [10] Drowsy (18.03.09 06:06)
> а потом пытаюсь посмотреть селект набор по всем полям этой
> таблицы на гриде.
Ты его переоткрываешь или просто смотришь в ранее открытый?
ЮЮ (2009-03-18 09:41:00) [29]
> Без цикла с параметром не обойтись??
Для выполнения твоего запроса - это я тоже говорил - не нужен TIBQuery , а нужен TIBSQL
Sergey13 (2009-03-18 08:45:00) [30]> [10] Drowsy (18.03.09 06:06)
Коммит в одной транзакции делаешь, селект в другой.
Drowsy (2009-03-18 06:06:00) [31]И ещё вопрос: делаю инсерт и коммит в таблицу,
а потом пытаюсь посмотреть селект набор по всем полям этой таблицы на гриде.
И он пуст. Внесённые изменения появляются только после нового звпуска программы.
Drowsy (2009-03-18 05:58:00) [32]Без цикла с параметром не обойтись??
ЮЮ (2009-03-18 04:00:00) [33]
> Неужели никто не сталкивался с подобной ошибкой??
> примечательно, что хотя ошибка Update Failed вываливается,
> но ВСЕ записи при uoDryBar.ExecSQL(ukInsert) заносятся
> в таблицу.
Я же сказал. Записи-то заносятся, но так как одним запросом занесено более одной записи, то с точки зрения кэшированного датасета это ошибка. Аналогичная ошибка будет и в случае, если запрос не добавит ни одной записи. Запросы датасета должны модифицировать РОВНО ОДНУ запись
Drowsy (2009-03-17 21:09:00) [34]Неужели никто не сталкивался с подобной ошибкой??
Drowsy (2009-03-17 10:58:00) [35]
> Зачем для выполнения запроса, тем более вставляющего несколько
> записей, использовать связку TIBQuery + TIBUpdateSQL.
>
> Почему просто не выполнить запрос в TIBSQL?
Можно. И работает. Только нужно иметь "агрегирующий" компонент работы с набором (select,insert,delete,modify)
, которым и является, как понял, TIBQuery + TIBUpdateSQL.
> А запросы в TIBUpdateSQL должны затрагивать толко 1 запись,
> ИМХО, не больше и не меньше
примечательно, что хотя ошибка Update Failed вываливается, но ВСЕ записи при uoDryBar.ExecSQL(ukInsert) заносятся в таблицу.
ЮЮ (2009-03-17 10:41:00) [36]
Вопрос: Можно ли одним запросом заполнить её значениями
соответствующих полей из LAYOUT?
uoDryBar + qrDryBar - аналог (по-функциональности) TIBDataset.
.....
При выполнении:
uoDryBar.ExecSQL(ukInsert);
всё время возникает ошибка Update Failed.
Зачем для выполнения запроса, тем более вставляющего несколько записей, использовать связку TIBQuery + TIBUpdateSQL.
Почему просто не выполнить запрос в TIBSQL?
А запросы в TIBUpdateSQL должны затрагивать толко 1 запись, ИМХО, не больше и не меньше
Drowsy (2009-03-17 10:15:00) [37]uoDryBar: TIBUpdateSQL;
qrDryBar: TIBQuery;
qrDryBar.UpdateObject := uoDryBar;
uoDryBar + qrDryBar - аналог (по-функциональности) TIBDataset.
Sergey13 (2009-03-17 08:51:00) [38]> [2] Drowsy (17.03.09 08:32)
Твоя ошибка, по моему, не связана собственно с запросами. Ты где то напутал в коде.
Что есть uoDryBar?
Drowsy (2009-03-17 08:32:00) [39]Если честно, то мне нужна вообще 1 запись и её можно выделись ограничением Where, но
я только начинаю работать с IBASE и понял, что без чёткого понимания, как
работает связка TIBQuery - TIBUpdateSQL не обойтись, а с подобной ошибкой уже пару раз встречался и "обходил кривым боком"....
Sergey13 (2009-03-17 08:20:00) [40]А тебе это надо непременно из своей программы сделать? Это постоянная операция?