|
Сетевой режим
|
|||
---|---|---|---|
#18+
Приветик! Если можно, подскажите пожайлуста как решить проблему. Задача следующая... Есть три рабочие станции которые лезут к таблицам. К примеру на одной производится добавление новой записи при этом МАХом назначается номер накладной. Минутой позже на второй станции производится тоже самое но номер накладной должен быть следующим (соответственно) но этого не происходит пока на первой станции не закроешь транзакцию. Пытался использовать Генератор но номера формируются с пропусками, т.е. если запросил номер у генератора а потом отказался, то в следующий раз он формирует новый номер, а в таблице получается пропуск номера. Как можно такую проблему решить? Заранее Благодарен! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2003, 12:04 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3.
MAX - ни в коем случае - читать статью про генераторы на ibase.ru! Код: plaintext 1. 2.
Проблема пропуска номеров является в 90% организационно-интерфейсной. Основные рецепты: 1) Получать номер для документа как можно позже - идеально в момент окончательного сохранения. 2) Позволять пользователю вручную редактировать поле номера. В конце дня (часа, обеда, т.д.) формировать список пропусков и давать пользователю для разбора полетов. 3) Если система сервер-ориентированная (типа servlet'ов), то можно создать пул номеров, который будет выдавать номера документов - а в случае отказа принимать номер обратно и выдавать следующему документу. Ну а лучше всего - избавиться от требования непрерывности :) WBR, Alexey ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2003, 17:34 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Спасибо за подсказку Алексей. Но вся проблема в том, что в основной таблице, где хранятся номера накладных, существует два вида документа номера которых могут быть одинаковы разница лишь в ключевом поле. Генератор будет выдавать следующее число постоянно. Как в этом случае быть? Юзер будет тратить время на поиски номера. Ну грубо говоря все выглядит так.... N_NUM - Номер накладной Primary KEy N_Type - Тип документа Primary KEy ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2003, 08:52 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Позволю себе вмешаться, можно значение генератора прочитать на клиенте и вставить в обе таблицы его, или я что-то не так понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2003, 09:57 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Нет понял не правильно. Есть таблица. в ней ключевые поля N_NUM и N_TYPE. Присвоение номеров в поле N_NUM идет в зависимости N_TYPE.(1,2,3,4... при N_TYPE =0 и 1,2,3,4... при N_TYPE =1). Так вот как сделать генератор чтобы он выдавал следующее значение в зависимости от N_TYPE; ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2003, 10:10 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
2 генератора не пойдет? с максом моут быть проблемы... когда два пользователя прочли максимум и получили скажим число 5, а потом каждый основываясь на этом значении делает вывод... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2003, 10:14 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Да я столкнулся с этим. Два генератора можно, но как в генераторе определить зависимость с полем N_TYPE? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2003, 10:18 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
по условию выбирать тот или иной генератор, можно например в тригере ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2003, 10:19 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Спасибо, попробую так. А как быть в такой ситуации: Если значение генератора получено, но юзер отказался производить инсерт. В следующий раз при вызове генератора значение будет другим. Как избежать этого? или единственное решение, как предлагает Алексей, выводить список пропущеных номеров? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2003, 11:36 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Всё-таки это непонимание предметной области. Единственно верное решение - создать таблицу со счётчиками документов разных типов и повесить тригер на инсерт который будет увеличивать счётчик и присваивать номер. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2003, 11:52 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Да, єто правильно, но весь попс в том как заставить генератор работать не делая "пустых" номеров ... |
|||
:
Нравится:
Не нравится:
|
|||
18.02.2003, 12:15 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
А почему номера должны быть без пропусков? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2003, 03:14 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Приветик. Ну как почему, чтобы небыло бардака в базе ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2003, 08:24 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Забей на это, это лишь предрассудки )) какой бы ты не придумал алгоритм, а если юзер удалит строку, ты будешь каскадно вести апдэйт всех номеров? Это глупости, у тебя есть требование, ключ уникален и образуется по правилу. Эти требования выполнены )) и все. А остальное мелочи :) я не думаю что в проге что-то случится если id будут идти не в той последовательности :) и с пропусками :) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2003, 09:08 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Да, конечно ничего страшного нет, но как-то нехорошо будет если номера накладных будут "скокать". Можно конечно извратиться и сделать что-то на основе генераторов. Спасибо за подсказки. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2003, 10:24 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Задача была следующая... Есть 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 лет и переделывать лом) Поставлено условие, что новый заказ нельзя добавить, пока юзер не распечатал последний заказ, т.е. пока не утвердился документ, пошедший в работу. Но конечно если будет удален заказ из середины, то естественно будет пропуск номера, что тоже важно для контроля. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.02.2003, 11:01 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Приветик! Огромное спасибо за подсказку!!! Попробую сделать как у вас. ДУмаю все будет нормально. Еще раз огромное спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.02.2003, 09:48 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Почемуже просто не пользовать max, а на клиенте при записи (перед печатью документ сохранять в базе) обрабатывать exception на нарушение примари кеу и в цикле опять max ? Чем не вариант ? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2003, 04:06 |
|
Сетевой режим
|
|||
---|---|---|---|
#18+
Это вариант, но не самый удачный. Я бы сказал горбыльный и не профессиональный. Bol предложил очень хорошее решение. Я сделал (дэцел переделав) и все работает. Рекомендую... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2003, 11:35 |
|
|
start [/forum/topic.php?fid=40&gotonew=1&tid=1580806]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
157ms |
get topic data: |
11ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 285ms |
0 / 0 |