sibprogsistem wrote:мне нужен был счетчик для того, что бы номер договора ни когда не повторялся, обычный счетчик (который есть по умолчанию) не подходит так как он может начаться заново если удалить записи.. будет странно если на руках будут разные договора с одинаковыми номерами..
Повторюсь, что если система многопользовательская, то велика вероятность одновременного создания документов с одинаковым номером.
В этом случае нужна хранимая процедура, которая определяет нужный номер и прописывает его в базу в рамках одной транзакции.
Одним запросом это сделать не получится, так как MySQL не разрешает делать в одной команде обновление таблицы, из которой идет чтение данных.
Вот пример процедуры, которая создает уникальные номера (DocNum) в рамках одного календарного года (RegDate - дата документа) для каждого типа документа (id_folder)
CREATE PROCEDURE `updnum`( IN AIDdoc int )
BEGIN
DECLARE tmpNextNumber INT;
DECLARE tmpIDFolder;
DECLARE tmpDate DATE;
SELECT RegDate INTO tmpDate FROM doc WHERE id = AIDdoc;
SELECT id_folder INTO tmpIDFolder FROM doc WHERE id = AIDdoc;
SELECT coalesce( res.NNum, 1 ) INTO tmpNextNumber
FROM ( SELECT max(rd.DocNum)+1 as NNum FROM doc rd WHERE rd.id_Folder = tmpIDFolder AND YEAR( rd.RegDate ) = YEAR( tmpDate ) ) res;
UPDATE doc SET DocNum = tmpNextNumber WHERE id = AIDdoc;
END
Вызывать её нужно после сохранения записи в базу:
procedure frmDocEdit_rbtOK_OnAfterClick(Sender: TObject);
var
tmpID: string;
begin
tmpID := IntToStr(frmDocEdit.rbtOK.dbGeneralTableId);
SQLExecute( 'call updnum('+tmpID+') ' );
end;
Визуальное программирование:
блог и
телеграм-канал.