powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сетевой режим
20 сообщений из 20, страница 1 из 1
Сетевой режим
    #32107215
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветик! Если можно, подскажите пожайлуста как решить проблему. Задача следующая...
Есть три рабочие станции которые лезут к таблицам. К примеру на одной производится добавление новой записи при этом МАХом назначается номер накладной. Минутой позже на второй станции производится тоже самое но номер накладной должен быть следующим (соответственно) но этого не происходит пока на первой станции не закроешь транзакцию.
Пытался использовать Генератор но номера формируются с пропусками, т.е. если запросил номер у генератора а потом отказался, то в следующий раз он формирует новый номер, а в таблице получается пропуск номера.
Как можно такую проблему решить?
Заранее Благодарен!
...
Рейтинг: 0 / 0
Сетевой режим
    #32107520
Код: plaintext
1.
2.
3.
Есть три рабочие станции которые лезут к таблицам. К примеру на одной производится добавление
 новой записи при этом МАХом назначается номер накладной. Минутой позже 
на второй станции производится тоже самое но номер накладной должен быть следующим (соответственно) но этого 
не происходит пока на первой станции не закроешь транзакцию. 


MAX - ни в коем случае - читать статью про генераторы на ibase.ru!

Код: plaintext
1.
2.
Пытался использовать Генератор но номера формируются с пропусками, т.е. если запросил номер у генератора 
а потом отказался, то в следующий раз он формирует новый номер, а в таблице получается пропуск номера. 
Как можно такую проблему решить? 



Проблема пропуска номеров является в 90% организационно-интерфейсной.

Основные рецепты:

1) Получать номер для документа как можно позже - идеально в момент окончательного сохранения.

2) Позволять пользователю вручную редактировать поле номера. В конце дня (часа, обеда, т.д.) формировать список пропусков и давать пользователю для разбора полетов.

3) Если система сервер-ориентированная (типа servlet'ов), то можно создать пул номеров, который будет выдавать номера документов - а в случае отказа принимать номер обратно и выдавать следующему документу.

Ну а лучше всего - избавиться от требования непрерывности :)

WBR,
Alexey
...
Рейтинг: 0 / 0
Сетевой режим
    #32107664
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за подсказку Алексей.
Но вся проблема в том, что в основной таблице, где хранятся номера накладных, существует два вида документа номера которых могут быть одинаковы разница лишь в ключевом поле. Генератор будет выдавать следующее число постоянно. Как в этом случае быть? Юзер будет тратить время на поиски номера.
Ну грубо говоря все выглядит так....

N_NUM - Номер накладной Primary KEy
N_Type - Тип документа Primary KEy
...
Рейтинг: 0 / 0
Сетевой режим
    #32107687
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Позволю себе вмешаться, можно значение генератора прочитать на клиенте и вставить в обе таблицы его, или я что-то не так понял?
...
Рейтинг: 0 / 0
Сетевой режим
    #32107699
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет понял не правильно.
Есть таблица. в ней ключевые поля N_NUM и N_TYPE.
Присвоение номеров в поле N_NUM идет в зависимости N_TYPE.(1,2,3,4... при N_TYPE =0 и 1,2,3,4... при N_TYPE =1). Так вот как сделать генератор чтобы он выдавал следующее значение в зависимости от N_TYPE;
...
Рейтинг: 0 / 0
Сетевой режим
    #32107706
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 генератора не пойдет?
с максом моут быть проблемы... когда два пользователя прочли максимум и получили скажим число 5, а потом каждый основываясь на этом значении делает вывод...
...
Рейтинг: 0 / 0
Сетевой режим
    #32107710
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я столкнулся с этим. Два генератора можно, но как в генераторе определить зависимость с полем N_TYPE?
...
Рейтинг: 0 / 0
Сетевой режим
    #32107711
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по условию выбирать тот или иной генератор, можно например в тригере
...
Рейтинг: 0 / 0
Сетевой режим
    #32107773
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, попробую так. А как быть в такой ситуации: Если значение генератора получено, но юзер отказался производить инсерт. В следующий раз при вызове генератора значение будет другим. Как избежать этого? или единственное решение, как предлагает Алексей, выводить список пропущеных номеров?
...
Рейтинг: 0 / 0
Сетевой режим
    #32107792
Фотография 1024
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё-таки это непонимание предметной области. Единственно верное решение - создать таблицу со счётчиками документов разных типов и повесить тригер на инсерт который будет увеличивать счётчик и присваивать номер.
...
Рейтинг: 0 / 0
Сетевой режим
    #32107813
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, єто правильно, но весь попс в том как заставить генератор работать не делая "пустых" номеров
...
Рейтинг: 0 / 0
Сетевой режим
    #32108392
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему номера должны быть без пропусков?
...
Рейтинг: 0 / 0
Сетевой режим
    #32108433
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветик. Ну как почему, чтобы небыло бардака в базе
...
Рейтинг: 0 / 0
Сетевой режим
    #32108456
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забей на это, это лишь предрассудки ))
какой бы ты не придумал алгоритм, а если юзер удалит строку, ты будешь каскадно вести апдэйт всех номеров? Это глупости, у тебя есть требование, ключ уникален и образуется по правилу. Эти требования выполнены )) и все. А остальное мелочи :) я не думаю что в проге что-то случится если id будут идти не в той последовательности :) и с пропусками :)
...
Рейтинг: 0 / 0
Сетевой режим
    #32108519
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, конечно ничего страшного нет, но как-то нехорошо будет если номера накладных будут "скокать". Можно конечно извратиться и сделать что-то на основе генераторов.
Спасибо за подсказки.
...
Рейтинг: 0 / 0
Сетевой режим
    #32110287
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача была следующая...
Есть N рабочих станций, которые лезут к таблице например T_CHEK. (Уникальное поле таблицы никогда не делай информационным!)
состав TABLE T_CHEK (
N_CHEK FIRST, - это integer not null - дается генератором в триггере
N_POKUP INTEGER, - это "покупатель" - выбирается юзером
DATA DATE NOT NULL, - это дата заказа - берется с сервера
NAZENKA DBLFLT, - это наценка / скидка выбирается юзером
CHEK INTEGER NOT NULL, - определяется нижеописанной процедурой
KOL_PRINT INTEGER, - заполняется после посылки на принтер
N_POLZOVATEL INTEGER, - определяет менеджера, принявшего заказ
DATA_IZGOT DATE, - дата изготовл. - выбирается юзером
IZGOTOVLEN CHAR(1), - это служебки
POLUCHEN CHAR(1), - это служебки
MEBEL CHAR(1) - это служебки не важно для понимания
)

В ней производится добавление новой записи и должен последовательно назначается номер "Заказа".

Для исключения повторов номеров, ибо порой пользователи одновременно
нажимали кнопки - используется индексация
CREATE UNIQUE ASCENDING INDEX CHEK_DATA ON T_CHEK (CHEK, DATA)
(каждый день нумерация заказов
начинается сначала! Поэтому присутствует Дата! Если дату убрать, то будет идти все подряд, но дата нужна как правило - через год наверняка нумерация начнется снова )

Далее для вставки используется процедура приблизительно такого типа
которая вызывается из приложения

CREATE PROCEDURE T_CHEK_INS (
IN_POLZOVATEL INTEGER, - это пользователь (его уникальный ID)
WORK_DATA DATE - Дата рабочая, кот. берется с сервера!
(а то поменяет на своем компе дату)
) AS
DECLARE VARIABLE MAX_N INTEGER;
DECLARE VARIABLE TMP1 DATE;
DECLARE VARIABLE TMP2 INTEGER;
BEGIN
TMP1=WORK_DATA;
TMP2=IN_POLZOVATEL;
select MAX(CHEK) from T_CHEK where DATA=:TMP1 INTO MAX_N;
if (:MAX_N is NULL) then MAX_N = 0;
INSERT INTO T_CHEK (DATA, CHEK, N_POLZOVATEL, DATA_IZGOT,MEBEL)
VALUES (:TMP1,(:MAX_N+1),:TMP2,:TMP1,'0');
END

with StoredProc_InsChek do //процедура добавления в приложении (без
покупателя)
begin
UnPrepare;
Prepare;
ParamByName('IN_POLZOVATEL').AsInteger:=F_Main.Query_PolzovatelN_POLZOVATEL.AsInteger;
ParamByName('WORK_DATA').AsDate:=F_Main.DateTimePicker3.Date;
ExecProc;
end;

Нет проблем с нумерацией даже когда одновременно работает 7 клиентов. (правда работаю через БДЕ пока, т.к. проекту под 5 лет и переделывать лом)
Поставлено условие, что новый заказ нельзя добавить, пока юзер не распечатал последний заказ, т.е. пока не утвердился документ, пошедший в работу. Но конечно если будет удален заказ из середины, то естественно будет пропуск номера, что тоже важно для контроля.
...
Рейтинг: 0 / 0
Сетевой режим
    #32110340
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветик! Огромное спасибо за подсказку!!!
Попробую сделать как у вас. ДУмаю все будет нормально.
Еще раз огромное спасибо!
...
Рейтинг: 0 / 0
Сетевой режим
    #32111807
altavista
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почемуже просто не пользовать max, а на клиенте при записи (перед печатью документ сохранять в базе) обрабатывать exception на нарушение примари кеу и в цикле опять max ? Чем не вариант ?
...
Рейтинг: 0 / 0
Сетевой режим
    #32111962
lgcpiton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это вариант, но не самый удачный. Я бы сказал горбыльный и не профессиональный. Bol предложил очень хорошее решение. Я сделал (дэцел переделав) и все работает. Рекомендую...
...
Рейтинг: 0 / 0
Сетевой режим
    #32113278
Фотография Bol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот документ пошел на печать, утвердился, т.е. в базе отметка после QuickReport->AfterPrint появилась, но в сетке потерялся... или глюкнул принтер. Как это дело учесть?
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сетевой режим
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]