powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Что я не так делаю в процедуре
2 сообщений из 2, страница 1 из 1
Что я не так делаю в процедуре
    #32598359
BigallS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наступив на грабли при работе с триггерами (см.ранее в этом форуме)
решил сделать обновление и пересчет полей с помощью хранимых
процедур (ХР).
Есть таблица:
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 не так давно работаю.
...
Рейтинг: 0 / 0
Что я не так делаю в процедуре
    #32598447
BigallS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь неправильно написал
FibDatabase->pFIBStPUpdate->FibStoredProc.
правильно так
FibDatabase->FibTransUpdate->pFIBStPUpdate
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Что я не так делаю в процедуре
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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