![]() |
| ||
|
|
Новости |
Поиск |
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 17:13:00) [1]Я Хелен Борри "Firebird..." штудирую. :)
Drowsy (2009-03-18 17:10:00) [2]Обязательно!
Теория это основа.
Но, я уверен, что такие нюансы, которые я с твоей помощью, узнал,
в книгах если и встречаются, то без актуально-решаемой-в-данный-момент-проблемы, не запишутся в моск.
Теория+практика+добрый совет(ещё раз огромное спасибо) - это оптимально.
Sergey13 (2009-03-18 16:49:00) [3]> [37] Drowsy (18.03.09 16:26)
Методом тыка долго будешь узнавать. И не факт, что узнаешь правильно.
Советую прочитать "Мир Интербейс" Ковязина.
Ну и ibase.ru сделать стартовой страницей. 8-)
Drowsy (2009-03-18 16:26:00) [4]Да, если поставить Read Commited, то транзакция отрабатывает по Open, Close набора.
Спасибо, Сергей, бузнать! :)
Sergey13 (2009-03-18 16:10:00) [5]> [35] Drowsy (18.03.09 16:01)
> Наверно, в ран-тайме по-умолчанию Read Commited устанавливается?
> ??
Ну так поставь ручками. И проверь без своих "наворотов".
Drowsy (2009-03-18 16:01:00) [6]А там все радио-баттоны девственно-пусты.
Наверно, в ран-тайме по-умолчанию Read Commited устанавливается???
...
ХМ, хотя Transaction.Params, в рантайме, как я проверил, тоже пусты....
Sergey13 (2009-03-18 15:54:00) [7]> [31] Drowsy (18.03.09 15:45)
Правой кнопкой на них жмякни и выбери редактор транзакций - посмотри что написано.
Drowsy (2009-03-18 15:52:00) [8]dmMain.trDryBar_S.Active := True;
И
dmMain.qrDryBar_S.Open;
но:
dmMain.trDryBar_S.Active := False;
И
dmMain.qrDryBar_S.Close;
получается, что разные.
В этом, как я понял, и была ошибка в коде.
Drowsy (2009-03-18 15:47:00) [9]
> Что то не очень похоже на код из
Я ж не ровно на попе сижу, а еложу... :)
Drowsy (2009-03-18 15:45:00) [10]Я параметры транзакций не устанавливал.
В дизайн тайме они так выглядят:
object trDryBar_S: TIBTransaction
Active = False
DefaultDatabase = dbProjects
AutoStopAction = saNone
Left = 416
Top = 400
end
Sergey13 (2009-03-18 15:18:00) [11]> [28] Drowsy (18.03.09 14:22)
> Параметры всех транзакций по-умолчанию.
какие конкретно?
Sergey13 (2009-03-18 15:11:00) [12]> [28] Drowsy (18.03.09 14:22)
> Что скажешь,Сергей?
Шаманизм какой то. С бубном. 8-)
> Было :
> /=========
Что то не очень похоже на код из
> [19] Drowsy (18.03.09 11:59)
> if dmMain.qrDryBar_S.RecordCount
Не надо пользоваться RecordCount на серверных СУБД. На пустоту датасет проверяется isEmpty.
> (!!!) dmMain.trDryBar_S.Active := True;
> dmMain.qrDryBar_S.Open;
Это по сути одно и то же.
Drowsy (2009-03-18 14:22:00) [13]Параметры всех транзакций по-умолчанию.
Было :
/=========================
dmMain.qrDryBar_S.Close;
(!!!) dmMain.trDryBar_S.Active := False;
with dmMain.IBSQL, SQL do begin
Transaction.StartTransaction;
Clear;
Add(' insert into DRYBAR_S');
//..........
//..........
ExecQuery;
Transaction.Commit;
end;
(!!!) dmMain.trDryBar_S.Active := True;
dmMain.qrDryBar_S.Open;
if dmMain.qrDryBar_S.RecordCount <> 0 then begin
fmFDBTest.DBGridEh.DataSource := dmMain.dsDryBar_S;
fmFDBTest.ShowModal;
end;
dmMain.qrDryBar_S.Close;
(!!!) dmMain.trDryBar_S.Active := False;
/=========================
(!!!) - добавленные-заработало.
Что скажешь,Сергей?
Sergey13 (2009-03-18 14:11:00) [14]> [25] Drowsy (18.03.09 13:57)
> Всё, разобрался!
Сомнительно. 8-)
> Как понял, перед инсертом надо закрывать транзакцию на наборе.
А попонятнее можешь объяснить эту фразу. Какая транзакция, какой набор?
И все таки ответь на
> [24] Sergey13 © (18.03.09 13:52)
Drowsy (2009-03-18 13:59:00) [15]Я думал, по-наивности, что Close закрывает транзакцию на селект наборе.
Drowsy (2009-03-18 13:57:00) [16]Всё, разобрался!
Как понял, перед инсертом надо закрывать транзакцию на наборе.
После инсерта StartTransaction. И потом Ореn.
Сергей, Юрий, спасибо за участие!!!
Sergey13 (2009-03-18 13:52:00) [17]> [23] Drowsy (18.03.09 13:34)
Какие параметры у твоих транзакций?
Drowsy (2009-03-18 13:34:00) [18]Я, не выходя из проги, после инсерта смотрю в IBExpert-е и вижу, что все данные внесены. Но сколько форму с гридом не вызываю - пусто. Выхожу из проги, захожу снова, и только тогда появлются.
Drowsy (2009-03-18 13:28:00) [19]У меня они изначально в дизайне были. Я их от отчаяния вытащил в реал-тайм. :(
Sergey13 (2009-03-18 13:26:00) [20]> [19] Drowsy (18.03.09 11:59)
Попробуй прописать все запросы и прочее свойства в дизайне.