Главная
Новый форум
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Урок 202 Пример написания плагина для начинающих
Goto page 1, 2, 3, 4, 5  Next
 
Post new topic   Reply to topic   printer-friendly view     Forum Index -> Программирование в БЭСТ-4
View previous topic :: View next topic  
Author Message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 14 May 2007 20:46    Post subject: Урок 202 Пример написания плагина для начинающих Reply with quote

По просьбе в предыдущей теме попробуем сделать совместными усилиями задачу по созданию собственного прайс-листа.
Цель темы:
- помочь научиться пользоваться отладчиком
- выработать пример написания решения средствами харбора

Основные задачи:
- отражать позиции включенные в прайс-лист
- иметь свою цену и ее групповое заполнение

Уточнения:
Заказчик хочет решение аналогично стандартному усложнив поиском/сортировкой по своей цене и для каких-то своих целей
на экране видеть отражение реестр картотеки и номенклатуры

Вопросы,попытки сбить с мысли:
А теперь вопрос - а что если делать сразу по номенклатурному справочнику и делать по нему обновление меток включения в прайс номенклатурного номера или ставить свои метки ?
Это упрощает задачу в плане создания реестра но осложняет автоматическое включение/исключение из прайс-листа.
Но может тут опять таки выручит кнопочка обновления неавтоматическая или этот пункт критичен ?
Вам нравится прайс-лист с повтором номенклатуры по количеству складов ? Если все-таки остаетесь на своем - давайте приступать.


Last edited by nordk on 16 May 2007 21:18; edited 1 time in total
Back to top
View user's profile Send private message Send e-mail
Notwar



Joined: 21 Sep 2005
Posts: 101
Location: Notwar Dan
Occupation: mlst(it)
Interests: Moscow

PostPosted: 15 May 2007 16:07    Post subject: Reply with quote

=) Да, нам нужен прайс с дублирующейся номенклатурой по количеству складов. ДАВАЙТЕ!!! ПРИСТУПАЕМ!!!

Итак, создаём пункт меню.

Таблица real\r_menu.dbf
Добавляем запись:
MenuNomer = 022
PromptNome = 04
MenuPrompt = Прайс с ценовыми группаим (например)
MenuBlock = {|| HFileEval('MyPrice.hrb',{}) }

У нас появился новый пункт меню в
Управление продажами->Ведение прайс-листов->Прайс с ценовыми группаим.

Далее создаём файл MyPrice.prg, Function Main() ...
Back to top
View user's profile Send private message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 15 May 2007 16:22    Post subject: Reply with quote

Ну да для начала давайте сделаем InitList по mkart/
Установим индекс MKART_P1
Иприменим к таблице фильтр
Code:
dbSetFilter({||!EMPTYTY(MKART->NNUM).AND.EMPTY(MKART->PARTIA)},"!EMPTY(MKART->NNUM).AND.EMPTY(MKART->PARTIA)")

Запускаем теперь инитлист по mkart и смотрим что по этому экрану еще нужно. Текст и соображения пишем сюда
Back to top
View user's profile Send private message Send e-mail
Notwar



Joined: 21 Sep 2005
Posts: 101
Location: Notwar Dan
Occupation: mlst(it)
Interests: Moscow

PostPosted: 15 May 2007 17:11    Post subject: Reply with quote

Ок, вот. пока всё замечательно

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
View user's profile Send private message
Notwar



Joined: 21 Sep 2005
Posts: 101
Location: Notwar Dan
Occupation: mlst(it)
Interests: Moscow

PostPosted: 15 May 2007 17:16    Post subject: Reply with quote

Quote:
С Mkart , вроде, пока всё... Продолжаем?
тока разве что... хотелось бы что бы в Mkart -овском aHead показывались бы цены из Mlabel, но на скока я понимаю - это позже...
Back to top
View user's profile Send private message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 15 May 2007 18:14    Post subject: Reply with quote

Для начала разбор полетов:
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
View user's profile Send private message Send e-mail
Notwar



Joined: 21 Sep 2005
Posts: 101
Location: Notwar Dan
Occupation: mlst(it)
Interests: Moscow

PostPosted: 16 May 2007 12:40    Post subject: Reply with quote

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
View user's profile Send private message
Notwar



Joined: 21 Sep 2005
Posts: 101
Location: Notwar Dan
Occupation: mlst(it)
Interests: Moscow

PostPosted: 16 May 2007 12:48    Post subject: Reply with quote

по ходу... не хватает FOR !DELETE() ,но как его впихнуть???
Back to top
View user's profile Send private message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 16 May 2007 13:14    Post subject: Reply with quote

Да не

Я же СПЕЦИАЛЬНО пишу так, чтобы Вы не просто копировали а задумывались. Моя то задача не НАПИСАТЬ а НАУЧИТЬ...

Дак вот по пункту 1
Вы не указали к какому алиасу применять DBSETFILTER()
И он применяется к алиасу по умолчанию.
Вот с этого места давайте и научимся смотреть алиас по умолчанию.

Вставьте перед DBSETFILTER() строчку
Code:
ALTD()

и перекопилируйте задачу с отладчиком и должите что на этой строке открывается окно отладчика.

По пункту 2 - я не просто так написал. Это не с копированием проблемы. Это Инитлист таки должен работать и если даже у Вас
по какой-то причине все ок - Вы потом этот "привет" получите, а
потому устраните замечания плз

По пункту 3 ответ аналогичен будет пункту 1.
Давайте потратим чуток времени на обучение работы с отладчико
Back to top
View user's profile Send private message Send e-mail
Notwar



Joined: 21 Sep 2005
Posts: 101
Location: Notwar Dan
Occupation: mlst(it)
Interests: Moscow

PostPosted: 16 May 2007 13:51    Post subject: Reply with quote

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
View user's profile Send private message
Notwar



Joined: 21 Sep 2005
Posts: 101
Location: Notwar Dan
Occupation: mlst(it)
Interests: Moscow

PostPosted: 16 May 2007 13:58    Post subject: Reply with quote

КРУТО!!! вот это круто!!! заработало ОК!!! Можно переходить ко второму экрану... В принципе, на скока я понимаю, можно в этом же инитлисте вытащить 21-ой строчкой (после прямой линии
Quote:
@ 20,1 SAY REPLICATE("─",78 ) COLOR "w/b"
нужную инфу из Mlabel???
Back to top
View user's profile Send private message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 16 May 2007 17:16    Post subject: Reply with quote

Ну вобщем-то Вы правильно понимаете.

Теперь по поводу функций и их применения.

Да Вы можете менять текущую рабочую область.
А может не меняя ее использовать функцию к конкретной рабочий области (алиасу).
Т.е. еще можно было написать
mkart->( dbSetFilter() )
mkart->( F_SETRELATION() )
Именно это я и пропустил сознательно в своих советах

Теперь о длине поля - вы наверно хотите сказать о размере
столбца NAME а не о заголловке - заголовок то - это простая
текстовая строка. Но вроде Вы и так в Вашем примере поле форматируете. Посяните Ваш вопрос пожалуйста.

Ну а про mlabel совершенно верно - через SAY или SAYSCREEN()
Вы можете все реализовать и в данном случае более сложный
механизм просто без надобности на мой взгляд
Back to top
View user's profile Send private message Send e-mail
Notwar



Joined: 21 Sep 2005
Posts: 101
Location: Notwar Dan
Occupation: mlst(it)
Interests: Moscow

PostPosted: 16 May 2007 17:44    Post subject: Reply with quote

Quote:
вы наверно хотите сказать о размере
столбца NAME
Да, именно это я и имею ввиду...
Quote:
Ну а про mlabel совершенно верно - через SAY или SAYSCREEN()
А как мне сделать так, чтобы у меня, перемещая курсор с одной позиции на другую, менялось значение SayScreen(mlabel->profil)
Back to top
View user's profile Send private message
nordk



Joined: 27 Jun 2005
Posts: 1000
Location: Горбунов Константин
Occupation: БЭСТ-Партнер
Interests: СПб

PostPosted: 16 May 2007 17:54    Post subject: Reply with quote

У Вас в aBlockCols
Code:
{{||LEFT(FIELD->Name,32)},15}

поменяйте 32 скажем на 25 и посмотрите что будет

А для прорисовок
измените строку
Code:
cCurProc:={||2}


на
Code:
cCurProc:={||myfun()}


Дальше создайте
Code:
FUNCTION myfun()
......
RETURN 2
А внутри и пропишите все свои SAY которые построчно должны меняться
Back to top
View user's profile Send private message Send e-mail
Notwar



Joined: 21 Sep 2005
Posts: 101
Location: Notwar Dan
Occupation: mlst(it)
Interests: Moscow

PostPosted: 16 May 2007 18:42    Post subject: Reply with quote

ОК, СПАСИБО ОГРОМНОЕ!!! Ещё вопросик... почему, когда я нажимаю Enter (корректеровака) у меня появляется окошко aHead (что вполне нормально), но оно почему-то перекрывает собой кусок инитлиста... Блин, как бы объяснить-то... Короче оно должно быть посередине. оно и есть посередине, но справа и слева него, пока оно горит пусто, а не перекрытый инитлист. То есть оно горит в середине экрана, а перекрывает собой несколько строчек (в данном случае 7) Не понянто?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic   printer-friendly view     Forum Index -> Программирование в БЭСТ-4 All times are GMT + 4 Hours
Goto page 1, 2, 3, 4, 5  Next
Page 1 of 5

 
Jump to:  
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

Rambler
Rambler's Top100 Рейтинг@Mail.ru