![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по генераторам [D7, IB7.x]
Alpine © (2006-05-25 13:55:00)Доброго времени суток. Как программно установить текущее значение в генераторе ? Вобщем мне нужно, чтоб когда значение в генераторе доходило до 200, оно скидывалось опять на 0.
Заранее благодарен.
Alpine (2006-05-25 16:02:00) [1]2 Sergey13
Да вроде я им всё показал и всё нравится )) .. Ну живы будем не помрём ... Посмотрим )) ... ВСЕМ ОГРОМНОЕ СПАСИБО !
Sergey13 (2006-05-25 15:51:00) [2]2 [14] Alpine (25.05.06 15:46)
Удовлеворяя клиента - помни, как бы он потом тебя не удовлетворил извращенным способом, когда выяснится, что вы друг друга не поняли. 8-)
Alpine (2006-05-25 15:46:00) [3]2 Sergey13
Я с тобой полностью согласен. Но наше дело малое, удовлитворить клиента )) Им так надо .. Им понравилось )) ...
Sergey13 (2006-05-25 15:38:00) [4]2[12] Alpine (25.05.06 15:33)
Я не уверен все ли ты правильно понял в бухгалтерии. Что за счета такие? Балансовые? На оплату?
Номера документовлучше заполнять не генератором, а max()+1 или чем то таким. Генераторы - они в основном для кодов.
Alpine (2006-05-25 15:33:00) [5]Вобщем в бухгалтерии есть такая фишка: бывают такие счета, у которых макс номер =200, а потом опять с 1 начинаются.
Desdechado (2006-05-25 15:27:00) [6]автор, природу таких махинаций не разъяснишь?
а то что-то веет душком от них нехорошим...
может, посоветуем более правильное решение
unknown (2006-05-25 15:03:00) [7]
CREATE TRIGGER xxx FOR xxx
ACTIVE AFTER INSERT POSITION 0
AS
declare variable i integer;
begin
if (gen_id(gen_ord_schet,0)>=200) then
i=gen_id( gen_ord_schet, -gen_id( gen_ord_schet, 0 ) );
end
Alpine (2006-05-25 14:58:00) [8]2 unknown
Сделал триггер после вставки
if (gen_id(gen_ord_schet,0)>=200) then
gen_id( gen_ord_schet, -gen_id( gen_ord_schet, 0 ) );
Выдаёт ошибку
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 6, char -1.
gen_id.
Что делать ? (
unknown (2006-05-25 14:40:00) [9]
> Alpine (25.05.06 14:26) [5]
В [4] более правильный вариант :)
> Alpine (25.05.06 14:28) [6]
Gen_id - это не триггер, это встроенная функция, с помощью которой
производятся манипуляции со значениями генераторов.
genName - тоже не триггер а имя генератора.
т.е д.б. :
if (gen_id(gen_ord_schet,0)>=200) then
gen_id( gen_ord_schet, -gen_id( gen_ord_schet, 0 ) );
Sergey13 (2006-05-25 14:39:00) [10]Gen_id - это функция.
ЗЫ: Я укрепляюсь в подозрении из [3]. 8-)
Alpine (2006-05-25 14:28:00) [11]2 Desdechado
gen_id( genNAME, -gen_id( genNAME, 0 ) ) - Это триггер ?
Gen_id - это я как понимаю нужен ещё один триггер, а genName - это мой триггер. Правильно ?
Alpine (2006-05-25 14:26:00) [12]2 unknown
Вы не могли бы поподробнее, как сделать такой тригер ? Я вашим примером пользуюсь выдаёт ошибку.
Делаю так
if (gen_ord_schet(gen_ord_schet,0)>=200) then
execute statement 'SET GENERATOR gen_ord_schet TO 0';
Этот тригер перед вставкой.
Desdechado (2006-05-25 14:02:00) [13]unknown © (25.05.06 13:59) [2]
коряво и не во всех версиях работает
сбрасывать прощеgen_id( genNAME, -gen_id( genNAME, 0 ) )
но что-то я склоняюсь к [3]
Sergey13 (2006-05-25 14:00:00) [14]2 Alpine (25.05.06 13:55)
Сдается мне - ты как то неправильно используешь генератор. 8-)
unknown (2006-05-25 13:59:00) [15]IBSQL1.SQl.Text:='SET GENERATOR GEN_MY_ID TO 0';
IBSQL1.ExecQuery;
Это программно.
А автоматом можно и в хп/триггере :
if (Gen_id(gen_my_id,0)>=200) then
execute statement 'SET GENERATOR GEN_MY_ID TO 0';
Desdechado (2006-05-25 13:58:00) [16]SET GENERATOR gen TO 0