Topic: Как сделать инкремент числового поля в записи?

Есть следующая задача: в записи таблицы БД есть поле type (тип записи, их бывает 4 разных типа) и есть поле number типа INTEGER При добавлении новой записи значение в поле number должно увеличиваться на единицу по отношению к предыдущей записи, причем нумерация по каждому типу (поле type) своя.

Re: Как сделать инкремент числового поля в записи?

Это можно сделать скриптом, пожалуйста, приложите пожалуйста тестовый проект к сообщению, я его доработаю.

Dmitry.

Re: Как сделать инкремент числового поля в записи?

Сделал сам по такой схеме - может это кому-то пригодится. Создал дополнительную таблицу system В ней одна запись, четыре поля, в которых храниться последний номер для каждого из четырех типов. Также сделал поле для номера версии базы. У меня работают с базой четыре пользователя через локальную сеть. Идея такая - при выпуске новой версии моей программы, если изменилась структура базы, а клиентские части остались не обновленные, то возможно будут глюки работы программы. Поэтому в скрипте определяю константу номера версии и при запуске программы читаю версию базы и сравниваю ее с этой константой - если не совпадают, то выдаю сообщение, что программу нужно обновить и завершаю ее. Кстати, делаю это через MainForm.Close. Прочитал, что завершать программу можно через Application.Terminate но у нас в скрипте это не работает.
   Работаю со значениями номеров в таблице system так: перехватываю событие показа формы onShow с редактированием записи БД. Определяю, через параметр Action, что это newRecord. В этом случае читаю из таблицы system текущий номер из поля для нужного типа, прибавляю к нему 1 и заношу в поле номера в форме. Также на форме размещен невидимый чекбокс, который устанавливается из скрипта в обработке onShow (он будет нужен при сохранении) При сохранении делаю так: Перехватываю onClick кнопки сохранения и если это новая запись (установлен чекбокс) то записываю в таблицу system новое значение номера в соответствующее поле. Все!

Re: Как сделать инкремент числового поля в записи?

atempbox
Думаю можно было сделать без таблицы system, а следующий номер для счетчика узнавать запросом примерно таким

SELECT MAX (fieldcount)+1 FROM tablename WHERE type='ТипСчетчика'


Чтобы не было проблем с разными версиями программы в локальной сети, можно программу запускать непосредственно из расшаренной папки, таким образом все будут работать с одной и той же копией программы.

Dmitry.

Re: Как сделать инкремент числового поля в записи?

Добрый вечер!
DriveSoft пишет :


Чтобы не было проблем с разными версиями программы в локальной сети, можно программу запускать непосредственно из расшаренной папки, таким образом все будут работать с одной и той же копией программы.


Подтверждаю . Именно так работает мой проект уже 5 мес.
На компе каждого пользователя  завел ярлыки на  ЕХЕ  в расшаренной  папке . У каждого пользователя свой парольный доступ
к своему разделу ( кнопке на form1 ) . Если сеть по скорости выше 50 мбит , то вы даже не заметите разницы в загрузке . А вот для себя
( для администрирования ) настроил openVPN , заменил прот.tcp на udp ( он меньше гоняет заголовки )  и получил свою VPN сеть.
Новую версию просто копирую на сервер (С ЗАМЕНОЙ СТАРОЙ ) , и даже не прошу пользователей закрыть программу. Сам свою прогу запускаю у себя на компе , тк  все таки это не локалка и долго будет запускаться .
Недостаток пожалуй один : проект получается большой , разделять на 2 или 3 уже и не хочется . Но программа Дмитрия пока надежно терпит
мои  62 формы .

Re: Как сделать инкремент числового поля в записи?

Да, запуск из одного места по сети - это хороший выход. Но есть нюансы: при раздельном локальном запуске у каждого пользователя свой файл settings.ini в котором в частности находится настройка ширины колонок в гридах. Каждый настраивает, ку ему удобнее. Также у меня сейчас используется еще отдельный ini файл с некоторыми локальными настройками, которые читаются из скрипта при запуске программы. Например переход в определенную вкладку на главной форме сразу после запуска программы. Особенность работы в том, что у меня каждый пользователь работает со своим разделом программы. Можно конечно настройки и в базу перенести, но у меня пока нет логина для пользователей, так как это пока не нужно.

Re: Как сделать инкремент числового поля в записи?

atempbox wrote:

событие показа формы onShow с редактированием записи БД. Определяю, через параметр Action, что это newRecord.

можешь привести пример, как ты это определяешь?

Re: Как сделать инкремент числового поля в записи?

Вот примерно так:

procedure frmRequest_OnShow (Sender: string; Action: string);
var
  sNumber: string;
begin
   if (Action = 'NewRecord') then
     begin
       sNumber:= VarToStr(SQLExecute('SELECT s_number FROM system WHERE id=1'));
       frmRequest.eNumber.Text := IntToStr(StrToInt(sNumber) + 1);
       frmRequest.cbStatus.ItemIndex := 1;
       frmRequest.cNewRecord.State := cbChecked;
     end
   else
     begin
       frmRequest.cNewRecord.State := cbUnchecked;
     end;
end;