BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Вопрос по блокировке записей.

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: Пред. 1 2 3 След.
RSS
Вопрос по блокировке записей.
 
Цитата
Александр Титов пишет:
Конечно, в простых случаях применяются простые блокировки.Нужно только иметь ввиду, что блокировка не должна выставляться на длительное время, чтобы не ограничивать в работе других клиентов. Это время определяется количеством попыток блокировки с других станций. А серверные семафоры используются для длительных процессов, когда, например, документ вызван на редактирование, и надо сообщить об этом другим пользователям, чтобы они его не могли в это время редактировать. На остальные Вопросы готов ответить, если Вы практически подойдете к необходимости их решения.

Вот это было ключевым словом, просто как я себе голову ни ломал так и не мог придумать, как же без серверного приложения вставить тут семафор(бз сервера никак). Пока для меня такое, думается, немного сложновато:)
Возможно, будет такая задача. А пока как я понял, источником информации по класам, определенных разработчиками это только исходный код одного из модулей.
Изменено: Саак Шахламджян - 08.08.2008 10:12:29
 
Причем тут классы ?
Функции какие созданы разработчиками есть в help.
Если потребуется какая-то дополнительная информация задавайте Вопрос но не из теории а предметно.
Что ксается операции чтения я еще раз вам говорю прочитать запись и разделить ее у вас не получится на практике. Про семафоры речь идет не о перации считывания непосредственно а о необходимости в течении какого-то времени хранить данные неизменными, которые вы прочитали. А именно: если Вы даже прочитаете, а на другом компе эту запись поменяют то у Вас на экране будут не те данные, а чтобы в середине чтения записи кто-то успел поменять - это не серъезный разговор, тут ни блоикровка ни семафоры и прочее никакого практического смысла не несут. Вы на эту ситуацию никогда не выйдете.
 
Есть спецфункция, создающая автоматически по запросу пользователя:
Номенклатурную единицу в отделе продаж, Номенклатурную единицу в производстве, спецификацию на неё и задаёт связь между двумя Н\Н. Н\Нра и код спецификации присваивается следующий по списку. В такой ситуации если 2 пользователя будут работать с этой спец-ей может получиться один и тот же номер (у чего-либо).
Здесь как раз было бы неплохо использовать семафор, сигнализирующий 2му пользователю о работе со спецфункцией.
(Вариант проверить перед записью существование номера мне кажется неподходящим)
 
Тогда бы весь БЭСТ был покрыт семафорами.
InitList четко отслеживает уникальность по индексному ключу и перед записью не дает вам делать 2 одинаковые записи даже при работе 100 пользователей а не то что двух :))
 
Но если Вам уж так хочется - сделайте свою таблицу со счетчиком например - блокируйте там запись с номером, пока свой номер туда не запишете запись не создаете...
Тут уж никак одновременно не получится
Но судя по всему у вас такая низкая интенсивность работы в сети чтобы заморачиваться...
 
Цитата
nordk пишет:
Тогда бы весь БЭСТ был покрыт семафорами.
InitList четко отслеживает уникальность по индексному ключу и перед записью не дает вам делать 2 одинаковые записи даже при работе 100 пользователей а не то что двух :))

С огромным удовльствием готов от них отказаться. Тогда подскажите как быть?
Действия:
1. Создаем Н\Н в sclad\Mlabel
2. Создаем Н\Н в zapas\Mlabel
3. Создаем Спецификацию на 2.
( Таблицы BOM, BOM_INV, BOP_OP)
4. Создаем сзвязь между 2 и 1( или тоже самое, что и Изменяем2).
Условие1:
Либо все 4ре действия выполняются, либо не выполняется ни одно из них.
Условие2:
Исключение одновременного выполнения действий 1-4 на разных машинах.
Изменено: Саак Шахламджян - 22.08.2008 18:07:44
 
Создали запись - в товарах, запомнили,
создали запись в материалах запомнили.
В записи материалов заполняем поле по заполненному коду в товарах.
Причем тут одновременно на некольских машинах ??
Ну будут разные номера в материалах и товарах и что ?
Нет смысла писать везде в один момент времени.
Для этого в справочнике поле есть для связки..
Разрывайте как хотите по времени работу операции 1 от операции 2 и от операции 3. И причем тут в этот же момент пытаться делать спецификацию. И причем тут разные компьютеры ???

И главное зачем это делать программно - я вот например очень не уверен что такой объект как спецификацию Вы грамотно повторите по правилам БЭСТа и считаю такие объекты надо делать инструментом БЭСТа и если его нет объяснять и просить чтобы были... А Вы еще вероятно потом эту базу будете в сервис-центр подсовывать в случае непонятных ошибок - найдите их...

Вы начните с описания задачи..а то судя по всему к ее реализации Вы подходите вообще не с той стороны...
Давайте рассмотрим задачу и как Вы хотите построить принцип ее реализации....
Изменено: nordk - 22.08.2008 18:25:53
 
Цитата
nordk пишет:
Создали запись - в товарах, запомнили,
создали запись в материалах запомнили.
В записи материалов заполняем поле по заполненному коду в товарах.
Причем тут одновременно на некольских машинах ??
Ну будут разные номера в материалах и товарах и что ?
Нет смысла писать везде в один момент времени.
Для этого в справочнике поле есть для связки..
Разрывайте как хотите по времени работу операции 1 от операции 2 и от операции 3. И причем тут в этот же момент пытаться делать спецификацию. И причем тут разные компьютеры ???

И главное зачем это делать программно - я вот например очень не уверен что такой объект как спецификацию Вы грамотно повторите по правилам БЭСТа и считаю такие объекты надо делать инструментом БЭСТа и если его нет объяснять и просить чтобы были... А Вы еще вероятно потом эту базу будете в сервис-центр подсовывать в случае непонятных ошибок - найдите их...

Вы начните с описания задачи..а то судя по всему к ее реализации Вы подходите вообще не с той стороны...
Давайте рассмотрим задачу и как Вы хотите построить принцип ее реализации....


Без проблем!!! Просто то, о чем я говорю уже реализовано. Возник Вопрос только об одновременном использовании и я удивляюсь почему только сейчас(сам виноват).

Задача такая:
Есть типовое изделие. Это такое изделие, которое описанно формулами. Формулами описан расход материалов на это изделие. Подставив конкретные значения в формулы - получаем расход материалов в числах на конкретное изделие. Грубо говоря, расчетная спецификация (к стати этот тип зарезервирован разработчиками, это к делу не относиться).
Для того, чтобы описать такое изделие пользователь должен задать формулы. Действия пользователя в Б-5:
1. Создает Н\Н в производстве.
2. Создает обычную спецификацию на него с "нулевым" расходом материалов. Указывает маршрут изделия (операции).
3. Создает Н\Н в продажах, связывает ном номера.
4. После этого Пользователь задает математические формулы для расчеты материалов (в текстовом файле с именем, который является кодом спецификации) и из реестра спецификаций вызывает спецфункцию "Задать формулы расчета". После этого формулы берутся из .txt файла, проверяются на синтаксис Б-5.

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


Затем, если ему необходимо изделие данного типа, опеределенных размеров, которого еще нет, он нажимает на кнопочку "создать". Вот она-то как раз и выполняет те 4ре дейтсвия, которые я описал.
Для этого Спецфункция открывает таблицу с формулами, считает расход материалов, копирует номенклатурные номера, спецификацию, задавая лишь новые значения, названия и параметры.
Перед созданием идет еще и проверка на то, а не создано ли изделие таких размеров до этого.

Вот, наверное, вся задача. Хотя мог чего-то и забыть. Это сейчас есть, работает не самым лучшим образом (код можно оптимизировать и оптимизировать, да еще вдобавок он без классов), но уже работает.

З.Ы. Разумеется есть и действия как удалить формулы, проверить формулы, сделав тестовый расчет изделия в .txt файл, все сразу с ходу не опишу.
Изменено: Саак Шахламджян - 22.08.2008 19:09:26
 
ну и нет тут ничего сложного.
Заблокировали номенклатуру - сделали.
Разблокировали

и так далее по каждой табличке раздельно.
Ну что тут такого ?
 
Цитата
nordk пишет:
ну и нет тут ничего сложного.
Заблокировали номенклатуру - сделали.
Разблокировали

и так далее по каждой табличке раздельно.
Ну что тут такого ?


А у меня перед созданием чего либо берется н\номер и код последней записи (по индесу), вот я и опасаюсь, как бы не вышло так, что этот номер последней записи не получили бы одновременно 2 пользователя один и тот же. И получиться 2 записи с одним номером.
 
Не видя исходного кода Ваши опасения понять не могу...
Для меня очень простая и обычная задача (в плане записи в таблицы)
 
Цитата
nordk пишет:
Не видя исходного кода Ваши опасения понять не могу...
Для меня очень простая и обычная задача (в плане записи в таблицы)

В идеале должно быть так:
Код
1. Select MLABEL
2. SET ORDER TO TAG TAG_NNum
3. DbGoBottom()
4. sLastNNum:=Alltrim(mlabel->nnum)
5.DBPUSH("mlabel","MLABEL","",{sRealProductGrup,sRealProductGrup})
6.if(mlabel->nnum==AllTrim(mlabel->nnum))
7.if(.NOT.(IfAllChar(AllTrim(mlabel->nnum))))
8.sNewNNumReal:=IncreaseOne(sLastNNum)
9. Создание Новой номенклатуры Append BLANK'ом со значениями из переменных памяти.
закрытие IF'ов, dbpop()


if(mlabel->nnum==AllTrim(mlabel->nnum)) стоит т.к. у нас договоренность, что поле Н\Н заполнено полностью, все 13ть символов. IfAllChar() - возвращает .T. если нет ни одной цифры в символьном Н\Н. (Раньше была DoesCharExist(), т.к была договоренность использовать в Н\Н только цифры, но пользователи нарушают)
IncreaseOne() - Увеличивает на 1 число, записанное в виде символьной строки, символы-неЦифры заменяются нулями, и игнорируются как разряд.
В принципе, можно было бы выложить код, правда если Вам не страшно читать кучу мусора. Это первое, что я написал. Да и на самом деле у меня сейчас идет создание новоё Н\Н путем COPY TO И APPEND From - надо переделать.

Точно таким же образом идет создание в MLABEL2 ZAPAS\MLABAL и со спецификациями. (Сам принцип присвоения следующего номера)
Изменено: Саак Шахламджян - 25.08.2008 15:07:08
 
Во-первых применяйте ADDREC() Вы все-таки не в свои таблицы писать собрались...
Во-вторых DBPUSH() делайте либо в начале, либо откройте свой алиас и он Вам вообще не нужен.
И я бы применил для проверки где-нить перед непосредственной записью в поле DBSEEK() по номенклатурному номеру если так переживаю за уникальность и если бы нашел то сделал бы еще +1 и все и ADDREC() и все запись создана и никаких семафоров и даром не надо.
 
Цитата
nordk пишет:
Во-первых применяйте ADDREC() Вы все-таки не в свои таблицы писать собрались...
Во-вторых DBPUSH() делайте либо в начале, либо откройте свой алиас и он Вам вообще не нужен.
И я бы применил для проверки где-нить перед непосредственной записью в поле DBSEEK() по номенклатурному номеру если так переживаю за уникальность и если бы нашел то сделал бы еще +1 и все и ADDREC() и все запись создана и никаких семафоров и даром не надо.

Этот DbPush вообще лишний, я его убрал, этот код просто не раз дописывал и часто не было времени убрать лишнее, оставлял, так сказать и соображений "совместимости". Об AddRec() вообще впервые слышу (в описании его нет :( ). То что не всвои - испоьзую StepPlus(), если Вы об этом. По поводу повторной проверки также думал. Проблема не в том, что там такой номер может быть. При сортировке Н\Н по порядку при условии, что истинно для всех записей Len(AllTrim(Malbel->NNUM)==13) и нет символов в номерах (я позже сделаю контроль за этим)
Последний номер+1 просто не может существовать - это лишняя проверка. Проблема только в том, что 2 пользователя могут одновременно получить этот самый последний номер. Но это опять как я вижу.
Изменено: Саак Шахламджян - 25.08.2008 15:32:59
 
ADDREC() в описании ЕСТЬ
и про эту функцию я обращаю Ваше Внимание уже не в первый раз !!!
Вы смотрите не только описание языка но и описание встроенных функций БЭСТА !!!
 
Насчет одновременности сделайте проверку по индексному ключу перед записью и запись и посадите 5 человек и жмите на счет 3 одновременно и попробуйте получить 2 одинаковых записи... :funny:
 
Цитата
nordk пишет:
Насчет одновременности сделайте проверку по индексному ключу перед записью и запись и посадите 5 человек и жмите на счет 3 одновременно и попробуйте получить 2 одинаковых записи...

А проверку по-Вашему делать так:
Код
SET ORDER TO TAG TAG_NNum 
Do while (.NOT.(lUnique))
 DbGoBottom()
 sNextNNUM:=InCreaseOne(MLABEL->NNUM)
 SEEK (sNextNNUM)
 if .NOT.(Found())
   lUnique:=.T.
 endif
enddo
 
Саак простите - я в БЭСТ-5 у себя тоже что-то не нашел привычный раздел...
У Вас есть БЭСТ-4 или возможность скачать его ? - там есть help по программированию с описаниями внутренних функций БЭСТа....
 
Тут есть программисты сильнее меня, но я вероятно бы сделал так:
Цитата
WHILE xMlabel->( DBSEEK(UPPER(" "+cNnum)) )
cNnum+=1
ENDDO
xMlabel->( ADDREC() )
xMlabel->NNUM:=cNnum

x x x

xMlabel->( F_DBUNLOCK() )
Изменено: nordk - 25.08.2008 17:03:26
 
Цитата
nordk пишет:
Саак простите - я в БЭСТ-5 у себя тоже что-то не нашел привычный раздел...
У Вас есть БЭСТ-4 или возможность скачать его ? - там есть help по программированию с описаниями внутренних функций БЭСТа....

У меня по Б-4 есть следующие файлы:
help4plus.chm
help4plus.chw
spb4+.chm
spb406.chm
spb407.chm
spb4010.chm
spb4048.chm
spb40366.chm
программирование_в_БЭСТ-4.chm
Какой именно файл описывает ф-ии БЭСТ'а?

Обычно, если чего-то "явно не хватало" (чисто интуитивно) читал help4plus.chm, но 99% по Б-5 хелп изучал. Что именно я должен Хорошо знать?
Возможность скачать есть.
 
программирование_в_БЭСТ-4.chm
 
Цитата
nordk пишет:
программирование_в_БЭСТ-4.chm

Честно говоря описания ф-ий не так подробны как хотелось бы. Попутно Вопросы конкретно по AddRec().
1. Чем она существенно отличается от Append BLANK, кроме того, что делает блокировку, чем она лучше?
2. Что возвращает эта функция?
3. StepPlus() для уник поля надо делать или нет?
 
StepPlus() использовать нужно, уже посмотрел.
Таким образом, используя AddRec() и проверку на неповторяемость номера, получаем:
Код
 SET ORDER TO TAG TAG_NNum
 DbGoBottom()
 if(mlabel->nnum==AllTrim(mlabel->nnum))
 if(.NOT.(IfAllChar(AllTrim(mlabel->nnum))))
 sNewNNumReal:=InCreaseOne(MLABEL->NNUM)
 WHILE Mlabel->(DBSEEK(UPPER(" "+sNewNNumReal)))
sNewNNumReal:=InCreaseOne(MLABEL->NNUM)
 ENDDO 
 Mlabel->(ADDREC())
 Mlabel->NNUM:=sNewNNumReal
 Mlabel->GRUP:="00001"
 Mlabel->NAME:="Новая"
 Mlabel->FULLNAME:="Новая полная"
 Mlabel->ORD_POLICY:=1
 Mlabel->ID_LABEL:=StepPlus()
 Mlabel->mdim:="0000000000000000001040"
 Mlabel->( F_DBUNLOCK() )
 bIsCreated:=.T.
 else
bIsCreated:=.F.
 endif 
 else
 bIsCreated:=.F.
 endif

cNnum+=1 к строкам неприменимо, не хочет работать.
В коде создается "пустая" Н\ед, понятно, что нужно заполнить больше полей (таких как ед измерения, даты), чтобы не загромождать я их опустил.
Верно?
Изменено: Саак Шахламджян - 25.08.2008 18:53:03
 
В плане самой записи вроде как верно, в плане логики - это Ваше решение...тут не сужу...
Что касается cNnum+=1 посмотрю - я это написал как вариант необычности харбора :)
В БЭСТ-4 ?1+"1" в отладчике показывает "2"
Дальше не экспериментировал, но обратил Внимание что работает...
 
Цитата
nordk пишет:
В плане самой записи вроде как верно, в плане логики - это Ваше решение...тут не сужу...
Что касается cNnum+=1 посмотрю - я это написал как вариант необычности харбора :)
В БЭСТ-4 ?1+"1" в отладчике показывает "2"
Дальше не экспериментировал, но обратил Внимание что работает...

Значит ли это, что такая "конструкция" исключает возможность возникновения 2х записей с одним и тем же Н\Н (При использовании по сети такой спецфункции, разумеется)?

Вы, кажется так предлагали:
Код
SET ORDER TO TAG TAG_NNum 
DbGoBottom() 
sNewNNumReal:=mlabel->nnum
if(sNewNNumReal==AllTrim(mlabel->nnum)) 
if(.NOT.(IfAllChar(AllTrim(sNewNNumReal))))
WHILE Mlabel->(DBSEEK(UPPER(" "+sNewNNumReal))) 
sNewNNumReal:=InCreaseOne(MLABEL->NNUM) 
ENDDO 
Mlabel->(ADDREC()) 
Mlabel->NNUM:=sNewNNumReal 
Mlabel->GRUP:="00001" 
Mlabel->NAME:="Новая" 
Mlabel->FULLNAME:="Новая полная" 
Mlabel->ORD_POLICY:=1 
Mlabel->ID_LABEL:=StepPlus() 
Mlabel->mdim:="0000000000000000001040" 
Mlabel->( F_DBUNLOCK() ) 
bIsCreated:=.T. 
else 
bIsCreated:=.F. 
endif 
else 
bIsCreated:=.F. 
endif 
Изменено: Саак Шахламджян - 26.08.2008 08:32:02
Страницы: Пред. 1 2 3 След.
Читают тему (гостей: 2)