View previous topic :: View next topic |
Author |
Message |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 14 May 2007 20:46 Post subject: Урок 202 Пример написания плагина для начинающих |
|
|
По просьбе в предыдущей теме попробуем сделать совместными усилиями задачу по созданию собственного прайс-листа.
Цель темы:
- помочь научиться пользоваться отладчиком
- выработать пример написания решения средствами харбора
Основные задачи:
- отражать позиции включенные в прайс-лист
- иметь свою цену и ее групповое заполнение
Уточнения:
Заказчик хочет решение аналогично стандартному усложнив поиском/сортировкой по своей цене и для каких-то своих целей
на экране видеть отражение реестр картотеки и номенклатуры
Вопросы,попытки сбить с мысли:
А теперь вопрос - а что если делать сразу по номенклатурному справочнику и делать по нему обновление меток включения в прайс номенклатурного номера или ставить свои метки ?
Это упрощает задачу в плане создания реестра но осложняет автоматическое включение/исключение из прайс-листа.
Но может тут опять таки выручит кнопочка обновления неавтоматическая или этот пункт критичен ?
Вам нравится прайс-лист с повтором номенклатуры по количеству складов ? Если все-таки остаетесь на своем - давайте приступать.
Last edited by nordk on 16 May 2007 21:18; edited 1 time in total |
|
Back to top |
|
 |
Notwar
Joined: 21 Sep 2005 Posts: 101 Location: Notwar Dan Occupation: mlst(it) Interests: Moscow
|
Posted: 15 May 2007 16:07 Post subject: |
|
|
=) Да, нам нужен прайс с дублирующейся номенклатурой по количеству складов. ДАВАЙТЕ!!! ПРИСТУПАЕМ!!!
Итак, создаём пункт меню.
Таблица real\r_menu.dbf
Добавляем запись:
MenuNomer = 022
PromptNome = 04
MenuPrompt = Прайс с ценовыми группаим (например)
MenuBlock = {|| HFileEval('MyPrice.hrb',{}) }
У нас появился новый пункт меню в
Управление продажами->Ведение прайс-листов->Прайс с ценовыми группаим.
Далее создаём файл MyPrice.prg, Function Main() ... |
|
Back to top |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 15 May 2007 16:22 Post subject: |
|
|
Ну да для начала давайте сделаем InitList по mkart/
Установим индекс MKART_P1
Иприменим к таблице фильтр
Code: | dbSetFilter({||!EMPTYTY(MKART->NNUM).AND.EMPTY(MKART->PARTIA)},"!EMPTY(MKART->NNUM).AND.EMPTY(MKART->PARTIA)") |
Запускаем теперь инитлист по mkart и смотрим что по этому экрану еще нужно. Текст и соображения пишем сюда |
|
Back to top |
|
 |
Notwar
Joined: 21 Sep 2005 Posts: 101 Location: Notwar Dan Occupation: mlst(it) Interests: Moscow
|
Posted: 15 May 2007 17:11 Post subject: |
|
|
Ок, вот. пока всё замечательно
Quote: | FUNCTION Main()
aSet:=SAVESET()
aSetKey:=SAVESETKEY()
NetUse("_Mgrup",loadpath()+"\sclad\mgrup.dbf",,.F.)
_Mgrup->(OrdSetFocus("MGrup"))
_Mgrup->(MakeRefer("grupss","Справочник групп",3,{"Группа","Наименование"},{3,23,7},"n/w,w+/n",{"CODE"},{"aIn[1]"},,{{||FIELD->Code},{||FIELD->Name}}))
NetUse("Mkart",LoadPath()+"\sclad\mkart.dbf",,.F.)
NetUse("Mlabel",loadpath()+"\sclad\mlabel.dbf",,.F.)
//WHILE INIT1(.T.).AND.INIT2(.T.)
//ENDDO
INIT1()
RESTSETKEY(aSetKey)
RESTSET(aSet)
_Mgrup->(DBCLOSEAREA())
RETURN NIL
//-------------------------------------------------------------------------------------------------------------------------------------------------------------
FUNCTION INIT1(lFlag)
LOCAL aSet,aSetKey,nTop,nBot,cColHead,aBlockCols,cCurproc,aHeads,aRef,bDel,aSortSeek
Private hnRowAct
//altd()
MKart->(OrdSetFocus("MKart_P10"))
dbSetFilter({||!EMPTY(MKART->NNUM).AND.EMPTY(MKART->PARTIA).AND.EMPTY(MKART->PRICE)},"!EMPTY(MKART->NNUM).AND.EMPTY(MKART->PARTIA).AND.EMPTY(MKART->PRICE)")
DispBox(2,0,23,79,(CHR(201)+CHR(205)+CHR(187)+CHR(186)+CHR(188)+CHR(205)+CHR(200)+CHR(186)+' ' ),"W+/B")
nTop:=3
nBot:=19
//nLeft:=1
cColHead:={"Группа ном.№ Наименование На складе Резерв Склад№"}
aBlockCols:={{{||FIELD->grup},1},;
{{||RIGHT(FIELD->nnum,5)},8},;
{{||LEFT(FIELD->Name,32)},15},;
{{||RIGHT(STR(FIELD->koltek),10)},48},;
{{||RIGHT(STR(FIELD->kolres),10)},59},;
{{||FIELD->sclad},71} }
cCurProc:={||2}
aHeads:={;
{"Группа......:","grup"},;
{"Номенкл. №..:","nnum"},;
{"Наименование:","name"},;
{"На складе...:","koltek"},;
{"Резерв......:","kolres"},;
{"Склад №.....:","sclad"}}
aRef:={"grupss"}
bDel:={||.T.}
aSortSeek:={{'- номерам ТМЦ внутри групп ',{'Код группы?:','Ном. номер?: '},{'Grup','NNum'},'UPPER(aIn[1]+aIn[2])',,,{"grupss"},"Mkart_P10"},;
{'- наименованиям внутри групп',{'Код группы: ','Наименование:'},{'grup','Space(10)'},'UPPER(" "+aIn[1]+aIn[2])',,,{"grupss"},"MKart_P2"}}
@ 20,1 SAY REPLICATE( "─",78 ) COLOR "w/b" //нарисуем разделительную черту перед подвалом
SHADOWBOX("ENTER:Правка F4:Ввод F3:Сортировка F6/Alt-F6:Фильтр F7/Alt-F7:поиск",23,3,23,75,"W/B")
MKart->(InitList(nTop,nBot,cColHead,aBlockCols,cCurProc,aHeads,aRef,,,,,bDel,,aSortSeek,,,,,,,,,,,,,,,hnRowAct))
RETURN LASTKEY()!=27
|
С Mkart , вроде, пока всё... Продолжаем???  |
|
Back to top |
|
 |
Notwar
Joined: 21 Sep 2005 Posts: 101 Location: Notwar Dan Occupation: mlst(it) Interests: Moscow
|
Posted: 15 May 2007 17:16 Post subject: |
|
|
Quote: | С Mkart , вроде, пока всё... Продолжаем? | тока разве что... хотелось бы что бы в Mkart -овском aHead показывались бы цены из Mlabel, но на скока я понимаю - это позже... |
|
Back to top |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 15 May 2007 18:14 Post subject: |
|
|
Для начала разбор полетов:
1. Почему Вы уверене что у Вас работает dbSetFilter() ?
Подумайте чего не хватает в этой строке ?
2. Экран у Вас получился кривой и косой Давайте чуть улучшим.
Дело в том что у вас длина cColhead меньше 80 символов, а содержимое планируется на всю ширину экрана, поэтому у Вас заголовок отцентровался и левая граница далеко уползла.
Приведите сColhead путем добавления пробелов до длины в 80
символов....
Теперь продолжим.
Установим mlabel в индекс mlabel все в этой же функции и пропишем
реляцию mkart-mlabel посредством
Code: | F_SETRELATION("MLABEL","UPPER(GRUP+NNUM)") | а в aHeads добавим элемент массива
Code: | {"Цена из mlabel..............","mlabel->OCENA1"} |
Исправляем исходник и смотрим.
Дальше пишем: а что нам еще собственно тут надо из mlabel |
|
Back to top |
|
 |
Notwar
Joined: 21 Sep 2005 Posts: 101 Location: Notwar Dan Occupation: mlst(it) Interests: Moscow
|
Posted: 16 May 2007 12:40 Post subject: |
|
|
Quote: | 1. Почему Вы уверене что у Вас работает dbSetFilter() ?
Подумайте чего не хватает в этой строке ? | да, странно... фигня какая-то... Первые девять строчек в инитлисте - пустые, потом всё нормально, но всё равно, пустые строчки попадаются а чего не хватает??? Quote: | 2. Экран у Вас получился кривой и косой Давайте чуть улучшим. | Во всём виноват дядя Бил! это глюк Ctrl+C/Ctrl+V У меня всё ОК. Только... я бы хотел узнать, как в aHead уменьшить размер поля NAME, например до 34 символов... Quote: | Теперь продолжим.
Установим mlabel в индекс mlabel все в этой же функции и пропишем
реляцию mkart-mlabel посредством Код:
F_SETRELATION("MLABEL","UPPER(GRUP+NNUM)")
а в aHeads добавим элемент массива Код:
{"Цена из mlabel..............","mlabel->OCENA1"} |
Есть, только... после выполнения строчеи "F_SETRELATION" - программа вылетает в Главное меню  |
|
Back to top |
|
 |
Notwar
Joined: 21 Sep 2005 Posts: 101 Location: Notwar Dan Occupation: mlst(it) Interests: Moscow
|
Posted: 16 May 2007 12:48 Post subject: |
|
|
по ходу... не хватает FOR !DELETE() ,но как его впихнуть??? |
|
Back to top |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 16 May 2007 13:14 Post subject: |
|
|
Да не
Я же СПЕЦИАЛЬНО пишу так, чтобы Вы не просто копировали а задумывались. Моя то задача не НАПИСАТЬ а НАУЧИТЬ...
Дак вот по пункту 1
Вы не указали к какому алиасу применять DBSETFILTER()
И он применяется к алиасу по умолчанию.
Вот с этого места давайте и научимся смотреть алиас по умолчанию.
Вставьте перед DBSETFILTER() строчку
и перекопилируйте задачу с отладчиком и должите что на этой строке открывается окно отладчика.
По пункту 2 - я не просто так написал. Это не с копированием проблемы. Это Инитлист таки должен работать и если даже у Вас
по какой-то причине все ок - Вы потом этот "привет" получите, а
потому устраните замечания плз
По пункту 3 ответ аналогичен будет пункту 1.
Давайте потратим чуток времени на обучение работы с отладчико |
|
Back to top |
|
 |
Notwar
Joined: 21 Sep 2005 Posts: 101 Location: Notwar Dan Occupation: mlst(it) Interests: Moscow
|
Posted: 16 May 2007 13:51 Post subject: |
|
|
Quote: | Вы не указали к какому алиасу применять DBSETFILTER() | - точно... у меня активным был Mlabel... Quote: | DBSelectArea("Mkart")
dbSetFilter({||!EMPTY(MKART->NNUM).AND.EMPTY(MKART->PARTIA)},"!EMPTY(MKART->NNUM).AND.EMPTY(MKART->PARTIA)") | ТАК?
cColHead у меня выглядет так: Quote: | cColHead:={"Группа(2 пробела)ном.№(2 пробела)Наименование(22 пробела)На складе(4 пробела)Резерв(3 пробела)Склад№"} | и всё-таки, как в aHead уменьшить размер поля Name??? |
|
Back to top |
|
 |
Notwar
Joined: 21 Sep 2005 Posts: 101 Location: Notwar Dan Occupation: mlst(it) Interests: Moscow
|
Posted: 16 May 2007 13:58 Post subject: |
|
|
КРУТО!!! вот это круто!!! заработало ОК!!! Можно переходить ко второму экрану... В принципе, на скока я понимаю, можно в этом же инитлисте вытащить 21-ой строчкой (после прямой линии Quote: | @ 20,1 SAY REPLICATE("─",78 ) COLOR "w/b" | нужную инфу из Mlabel??? |
|
Back to top |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 16 May 2007 17:16 Post subject: |
|
|
Ну вобщем-то Вы правильно понимаете.
Теперь по поводу функций и их применения.
Да Вы можете менять текущую рабочую область.
А может не меняя ее использовать функцию к конкретной рабочий области (алиасу).
Т.е. еще можно было написать
mkart->( dbSetFilter() )
mkart->( F_SETRELATION() )
Именно это я и пропустил сознательно в своих советах
Теперь о длине поля - вы наверно хотите сказать о размере
столбца NAME а не о заголловке - заголовок то - это простая
текстовая строка. Но вроде Вы и так в Вашем примере поле форматируете. Посяните Ваш вопрос пожалуйста.
Ну а про mlabel совершенно верно - через SAY или SAYSCREEN()
Вы можете все реализовать и в данном случае более сложный
механизм просто без надобности на мой взгляд |
|
Back to top |
|
 |
Notwar
Joined: 21 Sep 2005 Posts: 101 Location: Notwar Dan Occupation: mlst(it) Interests: Moscow
|
Posted: 16 May 2007 17:44 Post subject: |
|
|
Quote: | вы наверно хотите сказать о размере
столбца NAME | Да, именно это я и имею ввиду...
Quote: | Ну а про mlabel совершенно верно - через SAY или SAYSCREEN() | А как мне сделать так, чтобы у меня, перемещая курсор с одной позиции на другую, менялось значение SayScreen(mlabel->profil) |
|
Back to top |
|
 |
nordk
Joined: 27 Jun 2005 Posts: 1000 Location: Горбунов Константин Occupation: БЭСТ-Партнер Interests: СПб
|
Posted: 16 May 2007 17:54 Post subject: |
|
|
У Вас в aBlockCols
Code: | {{||LEFT(FIELD->Name,32)},15} |
поменяйте 32 скажем на 25 и посмотрите что будет
А для прорисовок
измените строку
на
Code: | cCurProc:={||myfun()} |
Дальше создайте
Code: | FUNCTION myfun()
......
RETURN 2 | А внутри и пропишите все свои SAY которые построчно должны меняться |
|
Back to top |
|
 |
Notwar
Joined: 21 Sep 2005 Posts: 101 Location: Notwar Dan Occupation: mlst(it) Interests: Moscow
|
Posted: 16 May 2007 18:42 Post subject: |
|
|
ОК, СПАСИБО ОГРОМНОЕ!!! Ещё вопросик... почему, когда я нажимаю Enter (корректеровака) у меня появляется окошко aHead (что вполне нормально), но оно почему-то перекрывает собой кусок инитлиста... Блин, как бы объяснить-то... Короче оно должно быть посередине. оно и есть посередине, но справа и слева него, пока оно горит пусто, а не перекрытый инитлист. То есть оно горит в середине экрана, а перекрывает собой несколько строчек (в данном случае 7) Не понянто?  |
|
Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © phpBB Group
|