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


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

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



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

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

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

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

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

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

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

N_NUM - Номер накладной Primary KEy
N_Type - Тип документа Primary KEy
...
Рейтинг: 0 / 0
18.02.2003, 09:57
    #32107687
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Позволю себе вмешаться, можно значение генератора прочитать на клиенте и вставить в обе таблицы его, или я что-то не так понял?
...
Рейтинг: 0 / 0
18.02.2003, 10:10
    #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
18.02.2003, 10:14
    #32107706
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
2 генератора не пойдет?
с максом моут быть проблемы... когда два пользователя прочли максимум и получили скажим число 5, а потом каждый основываясь на этом значении делает вывод...
...
Рейтинг: 0 / 0
18.02.2003, 10:18
    #32107710
lgcpiton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Да я столкнулся с этим. Два генератора можно, но как в генераторе определить зависимость с полем N_TYPE?
...
Рейтинг: 0 / 0
18.02.2003, 10:19
    #32107711
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
по условию выбирать тот или иной генератор, можно например в тригере
...
Рейтинг: 0 / 0
18.02.2003, 11:36
    #32107773
lgcpiton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Спасибо, попробую так. А как быть в такой ситуации: Если значение генератора получено, но юзер отказался производить инсерт. В следующий раз при вызове генератора значение будет другим. Как избежать этого? или единственное решение, как предлагает Алексей, выводить список пропущеных номеров?
...
Рейтинг: 0 / 0
18.02.2003, 11:52
    #32107792
1024
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Всё-таки это непонимание предметной области. Единственно верное решение - создать таблицу со счётчиками документов разных типов и повесить тригер на инсерт который будет увеличивать счётчик и присваивать номер.
...
Рейтинг: 0 / 0
18.02.2003, 12:15
    #32107813
lgcpiton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Да, єто правильно, но весь попс в том как заставить генератор работать не делая "пустых" номеров
...
Рейтинг: 0 / 0
19.02.2003, 03:14
    #32108392
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
А почему номера должны быть без пропусков?
...
Рейтинг: 0 / 0
19.02.2003, 08:24
    #32108433
lgcpiton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Приветик. Ну как почему, чтобы небыло бардака в базе
...
Рейтинг: 0 / 0
19.02.2003, 09:08
    #32108456
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Забей на это, это лишь предрассудки ))
какой бы ты не придумал алгоритм, а если юзер удалит строку, ты будешь каскадно вести апдэйт всех номеров? Это глупости, у тебя есть требование, ключ уникален и образуется по правилу. Эти требования выполнены )) и все. А остальное мелочи :) я не думаю что в проге что-то случится если id будут идти не в той последовательности :) и с пропусками :)
...
Рейтинг: 0 / 0
19.02.2003, 10:24
    #32108519
lgcpiton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Да, конечно ничего страшного нет, но как-то нехорошо будет если номера накладных будут "скокать". Можно конечно извратиться и сделать что-то на основе генераторов.
Спасибо за подсказки.
...
Рейтинг: 0 / 0
23.02.2003, 11:01
    #32110287
Bol
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
24.02.2003, 09:48
    #32110340
lgcpiton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Приветик! Огромное спасибо за подсказку!!!
Попробую сделать как у вас. ДУмаю все будет нормально.
Еще раз огромное спасибо!
...
Рейтинг: 0 / 0
27.02.2003, 04:06
    #32111807
altavista
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Почемуже просто не пользовать max, а на клиенте при записи (перед печатью документ сохранять в базе) обрабатывать exception на нарушение примари кеу и в цикле опять max ? Чем не вариант ?
...
Рейтинг: 0 / 0
27.02.2003, 11:35
    #32111962
lgcpiton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
Это вариант, но не самый удачный. Я бы сказал горбыльный и не профессиональный. Bol предложил очень хорошее решение. Я сделал (дэцел переделав) и все работает. Рекомендую...
...
Рейтинг: 0 / 0
02.03.2003, 14:09
    #32113278
Bol
Bol
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сетевой режим
А вот документ пошел на печать, утвердился, т.е. в базе отметка после QuickReport->AfterPrint появилась, но в сетке потерялся... или глюкнул принтер. Как это дело учесть?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сетевой режим / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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