Нужен диалог:
"Вы уверены, что хотите удалить. Да.нет". 2 кнопки, все как обычно.
Alert() не работает. Про него сразу забыть или он должен работать?
Я использовал вместо него MessageBox('Удалить запись?', 'БЭСТ-5', 33) - как ни странно работает!!! (В исх коде у разработчиков отковырял)
Но очень бы хотелось еще и диалог с n колич выбора... Подскажите, пожалуйста такой диалог!!!
nordk пишет:
И еще Вы в Eval пытаетесь передавать список аргументов - а они уже определены...а то Вы показываете опять только кусок кода....
Код
FUNCTION CheckAndMakeString(UString)
Local bBlock, bCorrect:=.T.,x,y,z,q,s
Local temp:=1
LOCAL oErr
x:=1
y:=1
z:=1
q:=1
S:=1
UString:= "{|x,y,z,q,s|"+UString+"}"
TRY
bBlock:=&UString
temp:=Eval(bBlock,x,y,z,q,s)
Catch oErr
bCorrect:=.F.
end
return bCorrect
Это функция проверки на правильность введенной формулы. При её вводе пользователем. У него (пользователя) ограничение - 5ть переменых, которые я и определяю, только, чтобы проверить.
(Недостаток - не учтено деление на ноль. К стати сейчас, думаю, можно убрать строки с Eval и инициализацией переменных. Ф-я должна только проверку на синтаксис делать)
С формулой, которую можно записать в одну строку всё отлично работает, а вот 2 строки. Если, например нужно не просто формулу вставить, а что-нибудь эдакое:
Николай Иванов пишет:
Цитата Саак Шахламджян пишет:
Я, конечно, "не доктор"
Пока. Будете докторскую защищать, присылайте автореферат на отзыв...
Я просто подчеркнул, что это мое мнение - человека не претендующего на звание "А я знаю как правильно".
Просто, когда люди на производстве удивляются как им работать с программой, выражая совершенно обоснованные претензии, не стесняясь в выражениях, волей не волей будешь спрашивать все досканально...
А ы у меня возникли только по одной причине.
Заказ1 1. Стол 01/01 - 2 шт
2. Стул 02/01 - 3 шт
3 Тумба 03/01 - 4 шт
Заказ2 1. Стол 01/01 - 1 шт
2. Стул 02/01 - 2 шт
3 Тумба 03/01 - 3 шт
И получается я должен сначала, получив такие заказы сделать заказ1, а затем заказ2!???
Или я должен сначала на листочек из каждого заказа выписать все позиции, а потом сидеть и думать, что и когда буду выпускать?
Eval() позволяет исполнить пользовательский код, записанный в одну строку, лежащий в блоке кода.
FileEval позволяет запустить пользовательский код, хранящийся в файле.
HFileEval также как и FileEval+ запуск откомпилированных .hrb.
А нет ли возможности запускать пользовательский код, записанный в несколько строк(строка+символ-конец строки+строка....), которая могла бы к примеру храниться в DBF файле в виде memo, или просто в виде строки?
Пытался в блок кода "впихнуть" несколько строк:
nordk пишет:
В данной задаче на сегодня не стоит планирование цеха.
Задача рассчитана на тех, кому функционал производства велик и им надо по заказу списать материалы и выпустить изделие.
Если нужны наряд задания и план-график - это все есть и тогда Ваш вариант не позаказное производство.
Ясно. А предполагаются ли хотя бы какие-либо отчеты, сводящие воедино информацию из заказов производства? Чтобы посмотреть общую картину.
Вчера вышла новость о выходе СП10 с описанием новых возможностей.
( Производственные заказы были и до этого, вроде...)
Очень интересно, что выстроена такая схема:
Покупатель->Заказ->Произ-й заказ->....
Когда заказ один и большой, то это, конечно неплохо. А если их много?
Производство ведь по взмаху волшебной палочки не может "каждые 5ть минут станки перенастраивать". Упускается как бы момент планирования работы самого цеха...
(Наряд-задания и план-график выпуска что-то подобное в себе и несли).
Я, конечно, "не доктор", но, кажется, что этот момент немаловажен для позаказного производства.
А что если:
Заказчики->Заказы->Формирование производственного заказа (Есть реестр потребности продукции - все строки заказов, что-то, вроде потребности на заказ в ОКПП. Там помечаем, то, что запускается в производство в цеха непосредственно, а затем могут формироваться Н-З или каким-либо еще способом передается информация о запуске изделий в цеха)
Дмитрий Рогачев пишет:
Здравствуйте уважаемые разработчки - каким образом можно организовать ограничение доступа пользователей к определенным складам?
Как я понимаю менеджером пользователей на данном этапе этого не решить. Возможно ли сделать это другим способом?
Стоит задача групе пользователей разрешить доступ только к определенным складам.
В Менеджере пользователей, например, для Сырье.Материалы кликом правой кнопкой мыши выбрав меню "определение правил доступа" можно определить правила для конкретного склада. И если убрать галочку со склада для конкретной роли, то доступа к нему не будет. У нас работает.
Вообще вчера пытался поставить фильтр\скоб, хоть что-нибудь сделать с табличкой. Безрезультатно. У компонента TBestDataset есть свойство Filter, Filtered, ScopeBegin, ScopeEnd,Scoped. Теоритически можно предположить, что они как-то связаны с установкой фильтра или скоба на базу, но все безрезультатно.
В отладчике видно активный индексный тег, который задается свойством IndexName, таблица получается отсортированной согласно ему. Но вот фильтр или скоб не ставиться...
Кто-нибудь может подсказать как это сделать?
Еще, к стати, на удивление работает RecNo(), которая показывает номер текущей записи, на которой установлен курсор в элементе xbGrid.
Саак Шахламджян пишет:
НАКОНЕЦ-ТО ширину колонок можно менять!!!!
А это изменение сохраняется на следующий сеанс?
Цитата
Саак Шахламджян пишет:
Нет, dll, все же должна лежать в папке bin...
dll или bdll?
bdll сама должна попадать в client\bin после компиляции
bdll, конечно. Я же написал, должна в bin лежать.
Нет, не сохраняются, а что должны?
Как и при выходе из Б-5 так и при перезапуске вновь появившегося меню.
Нет, dll, все же должна лежать в папке bin...
Сейчас, прочтя Ваши уроки 3 и 4, скрестив их с примером их хелпа пример у меня получился (по ур. 4 так и не увидел табл.). Думается, без Вашего описания, вообще неясно как работать с дизайнером. Очень жаль. Поля таблицы прекрасно вижу, кнопочки нажимаются (открыть\закрыть базу работает, а вот закрыть форму пока нет). Правда есть одна проблема... Путь к открываемой таблице я прописал абсолютный, в свойстве компонента TBestDataset. Как определить "текущий путь" (как в XBA редакторе LoadPath()) не понимаю.
nordk пишет:
Когда сделаете все до конца то на экране увидите интерфейс таблицы. На этом пока все...
Хех, очень, очень жаль, что вы в 4м уроке не сказали, что скомпилированный файл нужно подложить в БД. Только с утра догадался...
Еще смущало, что при запуске нового меню, выходной файл по сообщению компилятора был занят. Сегодня такого не было.
Однако, записей содержащихся в таблице увидеть не получилось.
nordk пишет:
БЭСТ построен на ядре Visual FoxPro и особенностями этого является наличие контейнера в который собраны
все таблицы. Пройдите урок от начала до конца и Вы увидите что и куда мы добавляем.
Это файл BEST5.DBC - контенер? По-моему это файл базы данных. Хотя, какая разница.
Ну, что же с интересом буду ждать описания создания индексов. Мне очень интересно. В этой утилите есть много-много интересного, о чем очень хотелось бы знать.
nordk пишет:
Еще раз прошу не бежать вперели паровоза. Вы не знаете
задумок и не надо навязывать свое.
Что касается создания статических таблиц - создавайте их чем хотите. Хотите пишите программы для их создания я лично предпочитаю пользоваться инструментом и объясняю другим как это делается. Как ее включить в контейнер БЭСТа, где ее хранить и т.д. и т.п.
Это действие разовое.
ДЕМАГОГИЮ продолжать не буду
Хорошо, давайте, ворос по существу.
Что значит включить таблицу в контейнер БЕСТа?
nordk пишет:
Вы делайте как хотите а мне оставьте изложение так как я вижу более правильным. Оно далеко еще не звершено и по этому пути пока спешить делать решения не рекомендую
Вот поэтому я и спросил, в чем же причина создания таблиц именно таким образом? Было интересно в чем разница.
Цитата
nordk пишет:
Мой путь решения будет строиться исключительно на бизнес-объектах БЭСТа и средствах поддержки решения БЭСТом в дальнейшем при апгрейдах и установках пакетов.
Кроме того действительно Вы опустили описание создание индексов для таблицы средством БЕСТ'а - "Утилита работы с базами данных БЭСТ-5". Там есть отдельная вкладка для них.
nordk пишет:
По этим урокам люди делали пример и у них все ПОЛУЧИЛОСЬ. Читайте внимательно - там все есть.
Я не говорил, что у меня не получилось то, что описано в уроках 1-3. Вы просто саказали, что перед тем как читать урок 4 надо пройти курс уроков 1-3. Вот я и спросил вся ли эта информация по урокам 1-3? (Просто УРОК 4, кажется в нескольких темах)
nordk пишет:
В нашем примере индексы и таблица должны быть постоянными а не временными и мы их предполагаем делать
средствами БЭСТа. Временные таблицы и индексы годятся для построения отчетов и прочих временных интерфейсов.
А я что предлагаю Вам постоянно их менять??? Код, приведенный выше, как раз и есть средствами БЕСТ!!!
И у Вас я создания индексов не видел. А в коде создается один индекс.
На примере темы расположенной здесь
рассмотрим создание таблицы.
1)Запускаем client\bin\foxbro
2)Файл - создать таблицу
3)Находим нужную базу данных
4)Открываем папку user
5)Поскольку нам надо для задачи доверенностей создадим папку dover
6)Откроем папку,напишем имя таблицы dover.dbf и жмем сохранить
7)Вводим поля следующего формата:
ID_DOV Сharacter 10 0 – уникальный идентификатор в нашем примере сделаем
его символьным
CODEDOC Character 3 0
NUMDOC Character 6 0
DATE_IN Date 8 0 - дата выписки довереннсти
DATE_OUT Date 8 0 - дата какую довереннсть дествительна
TNUM Character 6 0 - табельный номер из БЭСТ
FIO Character 80 0 – ФИО, должность
PASPORT Character 80 0 – паспортные данные
AGENTNAME Character 60 0
AGENTCODE Character 6 0 Код партнера из БЭСТ
DOC Character 1 0 – ТМЦ получены по (варианты – накладной, счету, договору ) Применим массив и одного символа нам хватит
YEAR Integer 4 0 – год к которому относится доверенность (использовал отдельно для более быстрого отбора записей) Нужно ли
год иметь поле символьным ? Вероятно нет.
STATUS Character 1 0 – статус доверенности (0-выдана, 1 – возвращена, 2- закрыта т.е. ТМЦ получены)
TTN - Character 60 0 – № накладной, дата и т.д. по которой получены ТМЦ
PRIM Character 37 0
8)После ввода всех полей жмем ОК
9) На запрос INPUT DATA RECORDS отвечаем No
Таблица создана
У меня 2 а. А индексов у таблицы не будет?
И чем Вам не нравиться такой код:
Код
CreateBasesForSpecificationConstruct()
#define cDov LoadPath()+"dover\dover.dbf"
#define cIDov LoadPath()+"dover\dover.CDX"
Procedure CreateBasesForSpecificationConstruct()
Local nExist:=3
Local aDOV:= { {"ID_DOV", "C", 22, 0}, ;
{"CODEDOC", "C", 3, 0}, ;
{"NUMDOC", "C", 6,0},;
{"DATE_IN", "D", 8,0},;
{"DATE_OUT", "D", 8,0},;
{"TNUM", "C", 6,0},;
{"FIO", "C", 80,0},;
{"PASPORT", "C", 80,0},;
{"AGENTNAME", "C", 60,0},;
{"AGENTCODE", "C", 6,0},;
{"DOC", "C", 1,0},;
{"YEAR", "N", 4,0},;
{"STATUS", "C", 1,0},;
{"TTN", "C", 60,0},;
{"STATUS", "C", 1,0},;
{"PRIM", "C", 37,0}}
dBpUSH()
nExist:=CheckIfBasesAlreadyExist()
DO CASE
CASE (nExist==1)
SayAndWait("Какая-либо из таблиц (или все) уже существует. Создание невозможно!!!")
CASE (nExist==0)
//Ветка создания баз данных
DbCreate (cDov,aDOV)
Use (cDov) NEW
INDEX ON UPPER(NUMDOC) TAG NUMDOC TO (cIDov)
REINDEX
DbCloseArea()
//Проверка ошибок
CASE (nExist==3)
SayAndWait("Неопознанная ошибка")
ENDCASE
DbPop()
return
Function CheckIfBasesAlreadyExist()
Local nAlreadyExist:=3
If (File(cDov))
nAlreadyExist:=1
else
nAlreadyExist:=0
endif
return nAlreadyExist
nordk пишет:
Ниже есть уроки - попробуйте по ним пройти.
Заниматься ненужными изысканиями по открытию таблиц у меня нет возможности на сегодня.
Я как раз перед этим и начал с Урока 4. Он не получился. Новое меню в Б-5 появляется, однако формы новой нет:(.
Решил, что стоит покопаться самому. И что пример, описанный в хелпе проще (по идее там проще), вот и начал с него.
В справочнике есть описанный пример создания простейшего приложния. Он почему-то не получается. Зато я нашел где же указывается таблица. Свойство tableName и указывает на таблицу. Однако, неясно почему при попытке включить свойство active (прямо в дизайнере) получаю ошибку. (Обычно в других дизайнерах так делать можно). Возможно так делать нельзя, но скомпилировать проект вообще не получается.
Исходный код из примера:
nordk пишет:
Если Вам нравится делать так - делайте так.
Понятие "правильно" весьма субъективно.
Свою точку зрения навязывать не буду.
Моя задача консультировать о возможностях...
Второй вариант - неправильно!!! Во втором варианте должно быть Входвсемафор()
Выход(). Этого там нет. То, что я привел вместо этого - даже не знаю как назвать...
На крайний случай (я в WinApi не так уж и силен), создать объ-ект событие, общий по сети для всех (это м\б файл), и сделать у него метод, вроде WaitForSingleObject, который и будет пытаться открыть такой файл, а если он занят, то замораживать процесс, ожидая освобождения (насколько я знаю в Windows такие объекты заранее определены, не знаю, возможно ли такой построить самому). Если бы так можно было сделать, останется о синхронизации данного действия.
nordk пишет:
А здесь Вы наворотили столько проверок вместо простого кода... (ИМХО)
Интересно о какой проверке идет речь? (Или имелось ввиду разделение куска кода во времени?) Я такой ерунды, разумеется, не писал в программе и писать не собираюсь. "Ежу" понятно почему так делать нельзя.
Было желание сделать правильно, и самое главное научиться это делать, только и всего.
nordk пишет:
А теперь первый вариант предложите сделать
одновременно 10 операторам и получить ошибку
Первый вариант "делали" 2 оператора.
Если Вы имели ввиду создание одной единицы, то да-добиться такого результата весьма сложно, т.к. это программа исполняется быстро. Но суть не в этом, меня даже не это интересует. Интересует правильное написание программы.
Конечно, я мог бы спорить дальше и для Вас рассчитать вероятность такого "плохого" исхода для 10ти операторов, взяв реальное время исполнение+создание трех единиц (у нас именно так), но смысла в этом, думается нет.