|
|
|
Что я не так делаю в процедуре
|
|||
|---|---|---|---|
|
#18+
Наступив на грабли при работе с триггерами (см.ранее в этом форуме) решил сделать обновление и пересчет полей с помощью хранимых процедур (ХР). Есть таблица: CREATE TABLE PEOPLE ( ID_P INTEGER NOT NULL, ID_EXTP INTEGER NOT NULL, - общая очередь SURNAME VARCHAR(60), P_STREET VARCHAR(40), P_HOME VARCHAR(4), P_APART VARCHAR(3), N_MVK VARCHAR(6), D_MVK DATE, CATEGORY VARCHAR(30), - поле ЛЬГОТА N_PRIV INTEGER, - льготная очередь P_NOTE VARCHAR(60), P_AREA VARCHAR(40), PN_AREA VARCHAR(3) ); ALTER TABLE PEOPLE ADD CONSTRAINT PK_PEOPLE PRIMARY KEY (ID_P); ALTER TABLE PEOPLE ADD CONSTRAINT UNQ_AREA UNIQUE (P_AREA, PN_AREA); ALTER TABLE PEOPLE ADD CONSTRAINT UNQ_NPRIV UNIQUE (N_PRIV); ALTER TABLE PEOPLE ADD CONSTRAINT UNQ_PEOPLE UNIQUE (SURNAME, P_STREET, P_HOME); Необходимо при наличии, изменении, удалении записи в поле CATEGORY вычислять поле N_PRIV по следующему алгоритму: Если в поле CATEGORY записываем новое значение(заносим новую запись) - вычисляем в поле N_PRIV максимальное значение, прибавляем 1 и записываем; Если в поле CATEGORY записываем новое значение, а старое уже было - ничего не меняем. Если в поле CATEGORY удаляем запись - поле N_PRIV пересчитываем, обновляем чтобы нумерация была по порядку(по возрастанию). Решил эти действия сделать в 3 процедурах. Вот первая из них: CREATE PROCEDURE PR_UPDATE ( NEWPRIV VARCHAR(30), OLDPRIV VARCHAR(30), IDG INTEGER) AS DECLARE VARIABLE TEM INTEGER; begin if ((NEWPRIV is null) and (OLDPRIV is not NULL)) then begin tem=NULL; update people set N_PRIV=:tem where ID_P=:IDG; /*поле N_PRIV=NULL пересчет поля будем делать в другой проц-ре*/ end else begin if ((NEWPRIV is not null) and (OLDPRIV is null)) then begin /*новая запись, находим макс.знач и прибавляем 1*/ select max(N_PRIV)+1 from PEOPLE into :tem; update people set N_PRIV = :tem where ID_P=:IDG; end end end Таблица People связана, как обычно FibDatabase->FibTransSelect->FibDataSet FibTransWrite как и рекомендовано разработчиками Fib компонентов. Процедура вызывается через FibDatabase->pFIBStPUpdate->FibStoredProc. SQL FibStoredProc таков EXECUTE PROCEDURE PR_UPDATE(:NEWPRIV, :OLDPRIV, :IDG) в компоненте свойства doStartTransaction и doAutoCommit установлены в TRUE В обработчике события кнопки "сохранить" пишу следующее DM->pFIBStPUpdate->ParamByName("NEWPRIV")->AsString=DBLkComCat->Text; DM->pFIBStPUpdate->ParamByName("OLDPRIV")->AsString=Strim; DM->pFIBStPUpdate->ParamByName("IDG")->AsInteger=DM->pFIBDSetPeopleID_P->Value; DM->pFIBStPUpdate->Prepare(); DM->pFIBStPUpdate->ExecProc(); Прохожу по F8 по этим строкам без ошибок но ничего не записывается в поле N_PRIV при разных значениях указанных полей. В IBExperte эта процедура выполняется, пробовал в нем отладчиком, поле N_PRIV записывает(во входных переменных подставлял реальные значения). Вот меня гложат смутные сомнения, что я неправильно передаю параметры в обработчике кнопки "сохранить"? Или еще кривая процедура? Прошу только не пинать сильно, с SQL не так давно работаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2004, 00:07:55 |
|
||
|
|

start [/forum/topic.php?fid=40&fpage=463&tid=1578282]: |
0ms |
get settings: |
10ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
86ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
27ms |
get tp. blocked users: |
1ms |
| others: | 255ms |
| total: | 414ms |

| 0 / 0 |
