Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по генераторам [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо