Еще об удалении субсчетов на ходу. И заодно о нумерации



Posted by Анатолий Анимица (194.177.32.67) on February 27, 2001 at 08:52:48:

In Reply to: Ах, Анатолий. Не может не радовать..... posted by Александр, Киев on February 27, 2001 at 04:52:49:

Александр из Киева комментирует мои заметки по поводу вопросов наших пользователей из Винницкой сельхозакадемии:
1) народ желает инструмента для удаления счетов на ходу сервера.

Ну есть причины, по которым Аркадий не делает возможным, редактировать acnt.a3p сервером. Это следует признать ..... либо уходить на другую платформу.

Вы знаете, Александр, а я с Вами соглашусь. Отчасти. Потом. Если захотите.
Нужно только расписать, что делать серверу, когда он, очнувшись после удаления субсчета, обнаружит, что объекты в операциях, к которым надо проводки делать, больше не существуют. Ну черт с ними, можно создать fact 03 'warning','не существует субсчет 6200015, и из какого он был счета, уже никто не скажет',[strip [stamp 3]]. Но! Существование субсчета в каком-то ограниченном интервале может родить кучу данных дальнего умысла - там всякие факты, экстрапараметры, записи невероятной структуры в extrd.dat, перекрестные трансфер-проводки (вида "этот покупатель - это не этот покупатель, а вон тот продавец, которому вот это впарили по взаимозачету требований") и так далее - фантазии не хватает. И все это повиснет без базового индекса, которым являлось обозначение только что удаленного счета. Возможное решение - отследить все, что с этим индексом творили, и сыграть откат по полной программе, с чем мы и придем к одной из принципиально непреодолимых трудностей в SQL системах - необходимости переиндексировать все подряд, то есть несколько часов работы машине, а с ней и аврал сисадминов (они же не могут заткнуть все дырки спецификацией алгоритмов управления в СУБД) обеспечено.
В ФБП системах трассировка следствий может замедлить систему, линейно, скажем, вдвое, при удвоенной дополнительной потребности в памяти. За что боролись, называется.


Заменять удаление на маскирование это самообман для разработчика. Физические субсчета продолжают потреблять память, затраты на их индексацию растут, я думаю, не в арифметической прогрессии и плюс затраты разработчика и ресурсы на само маскирование.


А это легко посчитать. Допустим, мы в течение года (а год - это всего-навсего 365+1 дней, на Луне вообще только 12 с небольшим), удалим маскированием половину субсчетов. Из 17000 винницких. То есть спишем к чертовой матери тысячу авторучек и отчислим 5000 студентов. Оне будут продолжать потреблять память - 6000*1.5кб=9000кб=9 МБ, или, говоря по-русски, доллара на три-четыре (ну ладно, пять). Затраты на их индексацию вырасти не могут - что индексировано, то индексировано. А если под затратами на индексацию понимать запись hidden в extrd.dat - то это 6000*0.25кб=1.5 МБ на диске, это примерно 1.5E6*(2E2/5E10)=0.6E-2, где 2E2 - цена диска 50ГБ, 5E10 - емкость этого диска, а 1.5E6 мы только что описали. ШЕСТЬ ЦЕНТОВ. Цена вопроса. Эти три строки, написанные в онлайне, мне обойдутся дороже в счете от провайдера.
Затраты разработчика сводятся к "наливай да пей" - в 2001R в том или ином виде все эти фенечки и примочки реализованы.

Причем у этих механизмов одна единственная задача - не дать оператору выбрать из списка то, что ему не положено. А все остальное ерунда.

Задача сквозной последовательной нумерации, с изъятием использованого ранее номера, вообще невозможна, т.к. пронумерованные ордера могут оказаться уже выданными.

Вот тут Александр прав на 200% - и не просто выданными, а и деньги по ним плачены, и подписи обоих,и CEO и CFO, присутствуют, и перекрестная проверка последует прямо завтра с утра, но мы же не об этом. Этот случай контрактный и решаться он должен вне рамок ФБП системы. А с точки зрания аль-джебр и ал-мукабала проблем нет. Все решаемо.

И на аншлаг. ААА - Для этого существует "время жизни блокировки" - если две или три минуты номер не нашел своего места в строю - он уничтожается и поступает в оборот обратно.
Продайте таймер, которым Вы отмеряете 2-3 минуты. Готов купить, при условии если это реализовано средствами ФБП.

-"Или у вас есть хороших бомб?"
-"Та боже ж мой!"

С удовольствием, Саша! Вам нарезать или кусочком? Только цену не знаю какую запросить, 1 VD подойдет? Итак, продается товар - спецификация блокировки на две минуты. Такая же спецификация, но на три минуты, продается за 3 VD. Отдельно, за 4 VD, продается предостережение не применять блокировку на 4 и более минут, мотивировка предостережения - цены обсуждаются отдельно.


СПЕЦИФИКАЦИЯ БЛОКИРОВКИ (РЕЗЕРВИРОВАНИЯ) НОМЕРА ДОКУМЕНТА

1. Номер документа::=<номер очередного документа>|<строка символов вне очереди>
2. Номер очередного документа::=<строка цифр без пробелов, такая, что [type [vl<>]]=0>
3. Факт нумерации документа::=fact <имя факта>,<номер очередного документа>,...,<штамп 3>

Спецификация программы - отчетной формы нумератора документа

array %
maxnum=-10000000
rewind facts (от упора до упора или от забора до обеда - в зависимости от окружения)
:loopnu (это не глагол, это метка)
search <факт нумерации документа ?<номер очередного документа>,..??,??>
if [success]
if <строка символов вне очереди> goto loopnu;endif
vl=[vl <номер очередного документа>]
tm=[tm] (для особо продвинутых можно рекомендовать [sf 0,98])
ge=[ged <тип документа>+<номер документа> ]
if ge<>0 [sed <тип документа>+<номер документа>,0] в списке - нечего место в extrd занимать
[set %,[intsn <номер документа>,<полезная информация из факта>]
if vl>maxnum maxnum=vl;endif
goto loopnu
********************
candnum=maxnum+1
ge=[ged <тип документа>+[intsn candnum]]
while ge<>0 candnum=candnum+1 if candnum>maxnum+maxoperatorsnumber> goto slishkommnogo;else [set %,[intsn candnum,'заблокирован';endif;endwhile
[sed <тип документа>+[intsn candnum],[intsn dr]+'.'+[intsn mr]+'.'+tm]
********************
for candnum downto 1
^^^candnum горячо рекомендуем взять этот номер
ge=[get %,[intsn candnum]
if ge=0
^^^candnum пропущен, свободен
elseif ge='заблокирован'
^^^candnum ^^^^^^^^ge другим оператором
else
^^^candnum ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ge
endif
endfor


Вот и все, собственно.
Есть еще масса украшений - сколько номеров показать в списке (верхние 10..20, последнего дня, последнего месяца, взять контекст и понять, что идет редактирование операции, тогда сверху всего поставить именно редактируемый номер и т.д.

Не привожу полный текст - потому что не помню, где у меня лежит самая приличная версия, в 2001R я ее не включал, скорее в одной из финансовых или медицинских систем 1998-2000 года (раньше не было таких элементов языка F). Но если будет проявлен общественный интерес - в следующую редакцию 2001R включу. Например, в ветви "Финансы рубли расход". Или "ТМЦ выписать счет".

AAA


Пpишедшие ответы: