:: Архив конференции по VFP до 2005 года
Как сделать автоинкремент поля
SlyFox
Автор

Сообщений: 3
Дата регистрации: 21.12.2004
Многоуважаемый ALL!

Есть проблема следующего плана.

В таблице 1 есть некоторое поле id. Нужно сделать его автоинкрементное заполнение. Написал хранимую процедурку типа auto_fill() и поцепил ее как "значение по умолчанию". Если при этом добавляется пустая строка - процедура отрабатывает и заполняет поле (как и должно быть ).

Но! В коде нужно выполнить следующую последовательность действий:

select <талица 1>
append from <таблица 2> (созданной по шаблону таблицы 1)

Само собой разумеется, что при этом значение поля id таблицы 1 заполняется значением из таблицы 2 и "значение по умолчанию" не отрабатывает.
Значение поля id остается нулевым, что, собственно, совсем не то, что нужно!

Так вот, как сделать, чтобы инкремент производился средствами базы данных, а не приложения в любом случае!
Ratings: 0 negative/0 positive
Re: Как сделать автоинкремент поля
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Так не добавляй ID из второй таблицы и все сработает.
Ratings: 0 negative/0 positive
Re: Как сделать автоинкремент поля
krosh

Сообщений: 478
Откуда: Нижний Новгород
Дата регистрации: 24.01.2002
SlyFox писал(а):
Цитата:
Если при этом добавляется пустая строка - процедура отрабатывает и заполняет поле (как и должно быть ).

наверное триггер должен срабатывать всегда
Ratings: 0 negative/0 positive
Re: Как сделать автоинкремент поля
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Перечисли поля, которые надо добавлять в команде

APPEND FROM FIELDS Field1, Field2, Field3, ... FROM table2

Смысл в том, чтобы в этом списке не было ключевого поля

Ну, и вариант, предложенный krosh. В дополнении к DEFAULT прописать RULE для поля (оно выполняется после DEFAULT). Если значение ключевого поля пустое - принудительный вызов функции генерации ключа и REPLACE. Что-то вроде:

IF EMPTY(ID)
LOCAL lnNewID
lnNewID = auto_fill()
REPLACE ID WITH m.lnNewID
ENDIF

Правда, RULE выполняются вообще при любой модификации записи. Если контроль нужен только при вставке, то вместо RULE - сделай вызов этой функции в триггере на INSERT




------------------
Ratings: 0 negative/0 positive
Re: Как сделать автоинкремент поля
SlyFox
Автор

Сообщений: 3
Дата регистрации: 21.12.2004
А как должен выглядеть тригер?

Например:

Select max(id) from table1 into array temparray
repla id with temparray(1)+1
--- не работает
Ratings: 0 negative/0 positive
Re: Как сделать автоинкремент поля
SlyFox
Автор

Сообщений: 3
Дата регистрации: 21.12.2004
Это понятно. Если копаться в коде - то можно и инкремент, собственно, туда всунуть. Задача состоит именно в том, чтобы не нарушая существующей модели (слишком большой кусок проекта придется перелопачивать) создать дополнительную возможность инкрементации ключевого поля...
Ratings: 0 negative/0 positive
Re: Как сделать автоинкремент поля
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Если у тебя VFP8, то вместо твоей функции автоинкремента используй поля типа Integer-AutoIncrement. Они как раз и делают то, что ты хочешь. Их в принципе нельзя редактировать. А с собственной функцией просто нет другого пути кроме анализа введенного значения в момент вставки.




------------------
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 15 (Гостей: 15)

© 2000-2024 Fox Club 
Яндекс.Метрика