Заинтересовала следующая ситуация.
Есть 2 пользователя ПользовательА и ПользовательБ.
Есть таблица с полями Поле1, Поле2, Поле3.
Представим такую ситуацию:
Действия пользователя Юз1:
1а. Открыл таблицу в режиме Shared.
2а. Переместился на ячейку №15 таблицы.
3а. Считать в Пер1:=Поле1 (Считать в пер-ю1 значение ячейки №15 поля П1)
4а. Считать в Пер2:=Поле2
5а. Считать в Пер3:=Поле3
6а. Закрыл таблицу
Действия пользователя ЮзБ:
1б. Открыл таблицу в режиме Shared.
2б. Переместился на ячейку №15 таблицы.
3б. Заблокировал содержимое ячейки №15 и если успешно->продолжил
4б. Поле2:=Пер13
5б. Поле3:=Пер18
6б. Закрыл таблицу.
Что произойдет, если действие 3б (или 4б, 5б) произойдет одновременно с действием 4а или 5а?
Смысл делать проверку на заблокированность записи №15 пользователю А нет.
Насколько я понимаю для пользователя А такая ситуация грозит искажением получаемых данных?
nordk пишет:
Вернее ее можно средствами программы заблокировать - но так никто не пишет, это правило дурного тона.
Получается, если никто из сети не заблокировал таблицу, то проблем с созданием сразу нескольких записей в одной спецфункции при пользовании ею (спецфункцией) сразу несколькими пользователеми быть не должно?
Т.е. если никто не пользуется командами блокировки таблицы, все должно идти нормально?
БЭСТ-5 СП 9
Проведем небольшой тест. Для теста создадим Таблицу и пару записей в ней, спец-я UCREATETETABLE:
Код
UCreateAdditionalBase()
#define cAmounts LoadPath()+"REAL\UTest.dbf"
#define cIndex LoadPath()+"REAL\UTest.cdx"
PROCEDURE UCreateAdditionalBase()
Local nExist:=3
Local aAmounts:= {{"ID", "C", 22, 0}, ;
{"Grup", "C", 5,0},;
{"NNUM", "C", 13,0},;
{"BOM", "C", 30,0},;
{"DATE", "D", 8,0}}
nExist:=CheckIfBasesAlreadyExist()
DO CASE
CASE (nExist==1)
SayAndWait("Какая-либо из таблиц (или все) уже существует. Создание невозможно!!!")
CASE (nExist==0)
//Ветка создания баз данных
dbPush()
DbCreate (cAmounts,aAmounts)
Use (cAmounts) NEW
INDEX ON UPPER(AllTrim(Grup)+AllTrim(NNUM)+AllTrim(BOM))+ID TAG BOM TO (cIndex)
INDEX ON UPPER(AllTrim(Grup)+AllTrim(NNUM)+AllTrim(BOM))+Dtos(Date) TAG Date TO (cIndex)
Append Blank
UTEST->ID:=StepPlus()
UTEST->Grup:="00004"
UTEST->NNUM:="0000000000001"
UTEST->BOM:="0000000102"
UTEST->Date:=STod("20080810")
Append Blank
UTEST->ID:=StepPlus()
UTEST->Grup:="00004"
UTEST->NNUM:="0000000000001"
UTEST->BOM:="0000000102"
UTEST->Date:=STod("20080811")
DBCLOSEAREA()
DbPop()
//Проверка ошибок
CASE (nExist==3)
SayAndWait("Неопознанная ошибка")
ENDCASE
return
Function CheckIfBasesAlreadyExist()
Local nAlreadyExist:=3
//Local cFormuls:=LoadPath()+sPathToFormuls
If (File(cAmounts))
nAlreadyExist:=1
else
nAlreadyExist:=0
endif
//f:=2
return nAlreadyExist
Теперь создаем тестовую ситуацию, в которой используется таблица в режиме Shared, по нажатию ОК тестовая ситуация окончиться, спец-я UCreateTestSituation:
Код
CreateTest()
#define cAmounts LoadPath()+"REAL\UTest.dbf"
Procedure CreateTest()
DbPush()
USE (cAmounts) NEW Shared
SayAndWait("Нажмите ОК после теста")
DbCloseArea()
DbPop()
return
Далее собственно тест, где и будем использовать функцию NetErr(), которая описана в Хелпе. Ниже приведенный код будем запускать из другой копии программы, но той же самой БД, сп-я USTARTTEST:
Код
StartNettr()
#define cAmounts LoadPath()+"REAL\UTest.dbf"
Procedure StartNettr()
DBPUSH()
USE (cAmounts) Exclusive NEW
If NetErr()
SayAndWait("Ошибка сети")
else
DbCloseArea()
endif
DbPop()
return
Итак, в одном окне у нас запущена Спец-я №2, там висит сообщение "Нажмите ОК по окнончанию теста" мы естественно пока не нажимаем, а переходим ко 2му окну с БЕСТ-5.
Теперь здесь запускаем последнюю спецфункцию. По описанию, приведенному в хелпе по функции NetErr() при неудачной попытке исполнить
"USE (cAmounts) Exclusive NEW"
Функция должна возвратить .T. и тогда на экране мы увидим сообщение:
"Ошибка сети".
Запускаем. Видим ошибку БЕСТ-5:
"Ошибка открытия", как раз на строке "USE (cAmounts) Exclusive NEW"...
Подскажите, пожалуйста описание и пример, приведенные в справочном руководстве ошибочны??? Или я что-то неверно делаю?
1. Заходим в Производство->Учет производства->Работа с картотекой->Номенклатурный справочник. Создаем новую номенклатурную единицу-ПРОДУКЦИЮ.
2. Заходим в Производство->Учет производства->Работа с картотекой->Спецификация продукции. Создаем стандартную спецификацию, на вновь созданную продукцию (см. п. 1). Присваиваем ей статус Основная.
3. Открываем только что созданную спецификацию. Присваиваем ей статус Черновик, сохраняем (Кстати, тут по нажатию F10 нельзя сохранить, приходиться нажимать Tab, сохранять, закрывать)
4. Открываем Производство->Учет производства->Работа с картотекой->Номенклатурный справочник. УДАЛЯЕМ номенклатурную единицу, созданную в п. 1.
5. Теперь открываем Производство->Учет производства->Работа с картотекой->Спецификация продукции и пытаемся удалить Черновую спецификацую из п.3 (Нажимаем на ней F8, да)
6. ЧИТАЕМ:
"DELPHI: BADI.DLL
.....
....
Приложение: BASE
Код: 1081
Операция:+
Описание: Неверный аргумент"
Очень интересно. Вопрос: как удалить спецификацию???!!
Создать номенклатурную единицу вновь??!!
(Я удалил чз DBF Viewer)
Таких глюков просто полно...
Евгений Плешивцев пишет:
Первое что приходит в голову, написать свой реестр и сделать пункт в меню. Стандартный же вход в номенклатурный справочник для пользователя закрыть.
Обидно, однако...
Сколько я не думал еще и после того как задал тут , а мне в голову пришло тоже самое...
Я так понимаю придется реализовывать "всё", что "происходит" при стандартном входе в номенклатурный справочник?
(Хотя этому сотруднику далеко не все требуется...)
Знаете, если честно устал писать в редакторе XBA. Не хотелось жаловаться, не приводя конкретных глюков, как например один из которых описан выше, но, правда, ощущение такое, что просто наплевательски отнеслись к пользователям.
1. При отладке программы, написанной в редакторе, один и тот же файл открывается по 2-3 раза, т.е. в меню "Окна" один и тот же файл указан в 2х 3х или даже более экземплярах. Когда это происходит я не знаю, но при постоянное работе с отладкой такое происходит.
2. Неужели было сделать трудно сделать такой запрос:
"Файл был измененен, сохранить изменения?" - "Да.Нет. Отмена".
(Из-за 1го постоянно происходит следущее:
Сохраняю одну из копий файла, а в других копиях изменения не сохранились...)
3. CTR-Z (отмена последнего действия) и CTR-Y(повтор действия). ХОТЯ бы на одно последнее ДЕЙСТВИЕ, даже в БЛОКНОТЕ есть такое!!!!
(стоит только перепутать crl+x с Ctrl+v потом сиди ломай голову...)
Ну, правда, знаете сколько нервных клеток уже убил Ваш XBA редактор...
На нашем предприятии один из сотрудников при работе с номенклатурным справочником производства ("Производство"->"Учет производства"->"Работа с картотекой"->"Номенклатурный справочник")
пользуется только одной из групп этого справочника. Другие группы его совершенно не интересуют. Приходиться постоянно ставить фильтр при открытии справочника.
Подскажите, как сделать этот фильтр для этого сотрудника фильтром по умолчанию?
Чтобы ему каждый раз не приходилось его ставить.
(Для сотрудника или роли прав доступа. Спецфункциями или настройками, как угодно, но как?)
Подскажите, пожалуйста, для чего используется поле Status таблицы zapas\mlabel.dbf? Что оно означает?
В технологическом описании этой таблицы об этом поле ничего не сказано (о том, какие значения принимает).
nordk пишет:
Не совсем понятна цель Вашей программы.
Таблица и не может быть в БЭСТе заблокирована,
это изначально исключено - зачем это Вам ?
При чем тут цель написания программы? Речь идет о конкретной функции БЕСТ'а, описанной в справочном руководстве и о том, что либо она не работает, либо я неверно её использую...
БЭСТ-5, 3.4, СП9
1. Запускаем XBA редактор.
2. В редакторе, в инспекторе, в папке PLN создаем файл U111.
3. Набираем код программы:
Код
MakeNZ()
Procedure MakeNZ()
Local bIsLocked:=.F.
select MRP
SayAndWait("We started")
bIsLocked:=DbLocked()
If bIsLocked
SayAndWait("Table is Blocked")
endif
return
4. Компилируем.
5. Заходим в производстве в планирование производства, план-график выпуска, нажимаем TAB, подключаем скомпилированный файл U111.hrb
6. Перезаходим в "План-график выпуска". Нажимаем TAB, запускаем новую спецфункцию.
7. На сообщение "We started" нажимаем ОК.
8. Читаем:
"Неисправная ошибка 253: Нет функции DbLocked() Вызов из функ: MAKENZ стр: 6"
"бла бла балабалал...."
9. Нажимаем ОК. Читаем 2:
"TfrmMainConsole.ApplicationExeprionMessage: Нарушение доступа по адресу 10031608 в модуле 'xwins.dll'. Чтение по адресу 00000004"
Я что-то неправильно сделал? Подскажите, пожалуйста. Из описания функции:
Цитата
Синтаксис
DbLocked() --> lIsFileLocked
Возвращаемое значение функции
Функция DbLocked() возвращает .T. (истина), если установлена блокировка для текущей рабочей области. Иначе возвращается .F. (ложь).
Описание
Функция DbLocked() используется для проверки того, что таблица или хранимая блокировка, установленная функцией FLock(), активна. Это не отражается на состоянии записи, установленной с функциями RLock() или DbRLock().
Критическая ошибка:
1. Запускаем БЕСТ
2. Меню Сервис->Запустить редактор XBA
3. Открываем папку MNF
4. Создать новый файл. Задаем имя, нажимаем СОЗДАТЬ.
( Попутно еще глюк: тут программа выдает запрос: "Файл с таким именем существует.Заменить на новый?" Хотя такого файла и в помине нет!!!!)
5. Нажимаем да. (на запрос)
6. Открывается файл. Наводим курсор на 1ю строку (мышью).
7. Нажимаем клавишу END.....
Все... бест рухнул... и редактор XBA и окно беста с открытой базой. Крит:
"Исключение неизвестное программное исключение (0х0eedfade) в приложении по адресу 0x7c81eb33".
Такое часто выходит, однако этот случай могу описать и такое всегда происходит.
1. Создаем ОКПП на 04й месяц.
2. Делаем "Потребность на склад" 10 шт продукции. Срок изготовления 31.04. Утверждаем.
3. Формируем НЗ, ЛЗК, выдаем по ним материалы.
4. Наступает первое мая. Начинаем делать НЗ. Ставим срок исполнения операции по НЗ 01.05, получаем сообщение: "Дата выполнения операции не соответствует дате наряд-задания."
И что же делать нашему бедному цеху? Довольно странная ситуация. Неужели на производстве не может быть случая задержки исполнения НЗ (выпуска продукции)?
1. Формируем ОКПП на 04 месяц. Создаем "Потребность на склад" 10 единиц
продукции.
2. Полный расчет.
3. Закрыли, "походили, покурили" и т.п.
4. Снова открыли ОКПП за 4й мес.
5. Вкладка "Потребность на склад". Создаем запись - 15 ед. продукции (другой).
6. Закрываем, утверждаем (Забыв при этом сделать повторный расчет ОКПП)....
Те 15ть ед продукции не попали в план.... (Хотя после утверждения можно их увидеть все на той же вкладке "Потребность на склад")
Во время пункта 3 мог еще и сформироваться сводный заказ (или наоборот УДАЛЕН, тогда к выпуску будет больше продукции, чем по дркументам), который так же не попал бы в ОКПП.
Однако, если полного расчета не делать ОКПП нельзя утвердить...
1. Формируем ОКПП на 04 месяц. Создаем "Потребность на склад" 10 единиц
продукции к выпуску на 15 число 4го месяца. Утверждаем.
2. Формируем ЛЗК
3. Формируем НЗ
4. Делаем отпуск материалов по ЛЗК, от 02.04.08.
5.Формируем отчет производства за период 01.04-07.04. Полный расчет.(Там все
пусто)
6. Списываем материалы (иначе его нельзя закрыть).
7. Закрываем отчет.
8. Исполняем НЗ 14м числом. 14м же числом приходуем продукцию на склад ГП.
9. Делаем отчет производства 08.04-15.04
10. Полный расчет. Получаем предупреждение о том, что
"Есть документы, не вошедшие в пр. отчет"
Все сотрудники совершили верные действия. Материалы выдали 02 числа, а продукцию выпустили 14го. Верно ее оприходовали, все действия совершили верно (Все остатки после списаний сходятся). Однако, теперь данное предупреждение будет выдаваться по всем последующим производственным отчетам!!!!
И получается, если будет допущена ошибка (например, моя тема на форуме с оприходованием НЗ задним числом) или все будет сделано верно пользователь будет получать данное предупреждение!
1. Формируем ОКПП на 04 месяц. Создаем "Потребность на склад" 10 единиц
продукции к выпуску на 14 число 4го месяца. Утверждаем.
2. Формируем ЛЗК
3. Формируем НЗ
4. Делаем отпуск материалов по ЛЗК, от 02.04.08.
5.Формируем отчет производства за период 01.04-15.04. Полный расчет.(Там все
пусто)
6. Списываем материалы (иначе его нельзя закрыть).
7. Закрываем отчет.
8. Исполняем НЗ 14м числом. 14м же числом приходуем продукцию на склад ГП.
9. Делаем отчет производства 16.04-20.04
10. Полный расчет. Получаем предупреждение о том, что
"Есть документы, не вошедшие в пр. отчет" (Об этом будет отдельная тема!!!!).
11. 10 единиц выпустили, а в отчете их нет:(
Конечно сотрудник, который оприходовал ГП задним числом поступил неверно, но
хотелось быобезопаситься от такого.
Здравствуйте!
Изменяю отчет планирования производства "Сводный объемно-календарный план"(пытаюсь добавить туда номера наряд-заданий).
В исходном отчете есть источник bdf.pln.pln_summary_okpp, из которого формируются строки отчета. Строки источника выбираются отсортированные либо по "Группам и Н\Н", либо по "Группам и артикулам" (для этого в params источника параметру nSort присваиватся толи числовое значение 1 или 2, толи соотв симв строка). В данном источнике есть поле - "Дата". Мне требуется вывести строки отсортированные по этому полю "Дата".
Как это сделать (задать нужную сортировку)?
Большое спасибо за ответ, пример получился, остается только написать нужный мне отчет. Как я понял в отчете нужно после написания своего срипта сделать активацию формы (Насколько я понял это присвоение свойству MODALRESULT формы значения mrOk в конце скрипта)?
(Исполняемый скрипт запускается по событию нажатия по кнопке, например, ОК, а в конце скрипта поставить "MODALRESULT:=mrOk;", что и является событием активации формы)
Всем добрый день!
Начал разбираться с дизайнером отчетов. Начал с примера, описанного в
документации по дизайнеру отчетов (документ 5_1_Дизайнер_отчетов из
раздела документации к БЕСТ'у (Бест-5 3.4 SP 9)).
В примере идет разбор создания шаблона расходной накладной.
Неясен кусок описания:
Цитата
Поместим на форму еще один компонент «Источник данных БЭСТ». В
Инспекторе, в свойстве «DSName» выбираем из справочника источников
данных БЭСТ источник Накладная на реализацию form_sclad_nakl_real...
Далее в свойстве «Params» Инспектора открываем окно параметров.
В окне несколько параметров. Для всех параметров в поле Значение, с
помощью справочника указываем соответсвуюшее поле из источника
Task. Для параметра «Шапка» устанавливаем флаг в параметре
«Значение» и присваиваем ему значение единица, что означает истина,
т.е. по данному источнику будут отображаться поля для шапки документа,
для параметра «Список» ничего не указываем. Нажимаем ОК.
Источник Task - это "Характеристика режима и подсистема bda.task".
После того как у источника form_sclad_nakl_real установил значения параметров в соответствие с полями БД TASK остались непонятные для меня параметры (Группа А):
Строки
Сортировка
Тип базы
Фильтр
Сортировка атрибут
вн_код_заказа
При этом у источника Task Остались следующие поля, с которыми не смог установить соответствие (Группа Б):
Сортировка реестра
Фильтр реестра
Scope реестра
Фильтр индекса реестра
Имя индекса реестра
Сортировка строк
Уник. код документа.
Хотелось бы знать как для оставшихся параметров группы А установить "соответствующее поле" в соответствие с полями из группы Б (Вернее как определить, например, что именно соответствует параметрам "Строки" или "Тип базы" из группы А).
Последний вопрос решается просто. ОКПП формируется с опред периодичностью, не месячной. Но возник другой вопрос. Нужна помощь.
Нашему производству нужна "такая штучка":
При поступлении заказа(например сводного, мы только ими фактически и будем пользоваться) там есть строки заказа:
Заказ 1.
Изделие 1 -10 шт
Изделие 2 - 3 шт
Заказ 2.
Изделие 5 -5 шт
Изделие 1 - 4 шт.
Так вот при поступлении в производство необходимо, чтобы Изделие 1.Заказ2 (4 шт) Можно было отличить от
Изделие 1.Заказ1 (10 шт). Не каждую штуку, а именно партию. Чтобы это можно было увидеть при формировании именно отчетов производства.
Дело в том, что когда производство отчитывается там видно наименование изделия, его Н\Н, группа... Но вот чего-нибудь "эдакого" нет, к чему можно было бы привязаться.
У нас производство при выпуске партии какого-либо изделия ставит на эту партию уникальный в течение года код. Что важно этим же кодом пользуется и склад при отгрузке товаров. Как быть?
Была идея привязать номер наряд-задания, которое формируется, однако, хотелось бы чего-нибудь получше.
К стати, появился вопросик небольшой... Опять же из планирования...
Вот у БЕСТ'а предусмотрено месячное планирование, так? В такой ситуации я вижу работу производства следующим образом:
Начинается месяц, производство внимательно изучает сколько и какой продукции ему в этом месяце сделать. Планирует свое время (когда чего и сколько ...). И далее работает целый месяц, выпуская какую-либо продукцию.
Таким образом "сигналом" о начале работы производству служит начало месяца. Или сигналом о том, что пора планировать работу. Или и тем и тем...
Правильно я себе картину представил?
Но ведь в БЕСТ'е предусмотрены доп ОКПП, которые могут создаваться в течение текущего месяца. Вот как с ними-то быть!?? Я не совсем представляю себе это. Не понимаю что же в этом случае будет сигналом к началу работы\планирования работы\начала выпуска продукции, указанной в ОКПП.
Объясните, пожалуйста как с "этим" быть.
Надеюсь, более-менее доходчиво объяснил.
P.S. Да и как я понимаю доп ОКПП все же должно повлечь какое-либо перепланирование в работе производства.
nordk пишет:
Саак извините за молчание - был в отпуске.
Да я сам какое-то время тоже там был :). Поэтому и перерыв был в постах. В обще-то по поводу тех самых строк(последнее мое сообщение) очень странная картина. Эти строки ДОЛЖЫ отображаться, а их нет. Хотя, уже мало волнует, занялся написанием плагинов. Так что, думаю, в другом разделе пора писать.
Проверил на работающей версии. Вы, наверное, не прочли строки о том, что нужно поменять поменять подневный план. Еще раз повторю.
1. Делаем сводный заказ на выпуск 15ти единиц продукции к 15му числу следующего месяца.
2. Создаем ОКПП. Там к производству 15ть единиц продукции.
3. Заходим в расшифровку сводной строки.
4. ПРАВИМ план подневного выпуска продукции таким образом, чтобы до 15го числа стояло к выпуску по 0 единиц продукции на каждый день. Ставим в строке на 20е число 15ть единиц. Утверждаем план выпуска.
5. Заходим в формирование отчетов->Подневный ОКПП и п\фабрикатов и там ... пусто.
Интересно, где же тогда используется строка подневного ОКПП 20го числа?
Видео Тут Или Здесь Архив zip, 579 кб, длит 1:19, формат как обычно...