Вернуться   Андрей Панько. Заметки про Dynamics NAV > Dynamics NAV (Navision)
Справка Пользователи Календарь Поиск Сообщения за день Все разделы прочитаны

Dynamics NAV (Navision) Заметки про Dynamics NAV (ранее Navision) и аддон LS Retail

Ответ
 
Опции темы Поиск в этой теме
  #1  
Старый 10.05.2007, 10:07
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
Отложенные (suspended) чеки [LS Retail]

Начну издалека.
В далекую юность, был отправлен родителями в магазин за кой-какой едой. Для этих целей получил подотчет сумку, типа авоська, список требуемой еды и немножко денег.
Согласно списку набрал продуктов и отправился к кассе, где с меня затребовали сумму, несколько превышающую имеющуюся у меня наличность.
По причине малолетства и отсутствия опыта впал в растерянность. В качестве выхода мне было предложено сгонять домой за дополнительным финансированием, а авоська с продуктами была принята кассиром на ответственное хранение и помещена под кассу.
Деньги я получил, авоську выкупил, но тех пор даже за молоком без чемодана денег не хожу, а для надежности укрепляюсь еще безналом.
На этом с лирикой закончим и перейдем к LSRetail.
Как должен поступать кассир при работе с такими клиентами.
Рассмотрим вариант, когда чек сформирован, клиенту оглашается итог, и по выражению лица последнего видно, что печатать чек пока не стоит.
Если клиент выражает твердое намерение вернуться с деньгами, то можно не отменять транзакцию. Временно отложив данный чек, кассир сохранит проделанную работу и сможет вернуться к ней позже.
Для этого в меню продаж или меню оплат стоит предусмотреть кнопку с командой = SUSPEND.
При нажатии на данную кнопку чек будет отложен, можно продолжать работу с другими клиентами.
Однако, на этом работа с отложенными чеками не заканчивается. Т.к. клиент все же может действительно принести деньги. Теперь нужно вернутся к отложенному ранее чеку. Чтобы это было возможно, в стартовом меню также должна присутствовать кнопка с командой = SUSPEND. Но это не все, в Визуальном профиле должно существовать меню с Меню ИД = SUSP и содержащее кнопку с командой = ОК (так же не помешает кнопка CANCEL, но это уже на любителя).
Т.к. это один из вариантов лукап меню, то лично я придерживаюсь единообразия, используя следующий набор кнопок.
1 / OK / OK
2 / Page Up / PAGE_UP
3 / Page Down / PAGE_DN
4 / Назад / CANCEL
Ответить с цитированием
  #2  
Старый 14.05.2007, 00:06
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
продолжим тему.

Как быть, если перед тем как поместить товар на ответственное хранение требуется внести предоплату.


Следует выполнить следующие настройки.


1. Создать для магазина Income/Expense Account с Account type = Suspense (карточка магазина, кнопка Store пункт Income/ExpenseAccounts). На закладке Posting указываем фин. счет, на котором будет учитываться полученная предоплата.
2. Создать Sales Types (меню LS Retail POS, Setup / General / Sales Types) с Suspend Type= POS Transaction, на закладке Requests указать размер предоплаты в процентах (поле Request Deposit (%)) или в абсолютном выражении (поле Minimum Deposit). В поле Prepayment Account No. указать Income/Expense Account созданныйвпункте 1.
Как известно Income/Expense Accountсоздаются для каждого магазина отдельно, при этом в Sales Types код магазина не указывается. Таким образом для всех магазинов Income/Expense Account для предоплаты следует создавать с одним и тем же кодом.
3. Добавить в меню Продаж или Оплат визуального профиля кнопку с командой = Suspend и параметром = код Sales Type созданном в пункте 2.

Вот и все.
Кассир формирует счет, нажимает на кнопку, созданную в пункте 3. Система потребует, чтобы была внесена предоплата согласно настройкам полей Request Deposit(%) или Minimum Deposit. После того как предоплата будет внесена (стандартная оплата), нажать на кнопку еще раз. Чек будет отложен.
Дальше работа как с обычным отложенным чеком.

Исключения.
Клиент передумал.
Наши действия.
1. Открываем отложенную транзакцию.
2. Нажимаем кнопку с командой VOID.
3. Выплачиваем клиенту деньги (нажимаем кнопку с командой Total, далее соответствующий вид оплаты).

Клиент передумал, но возвращать деньги не в наших правилах, поэтому забираем залог себе в доход.
Предварительно нужно создать для магазина Income/Expense Account с Account type = Income. На закладке Posting указываем фин. счет, на котором будет учитываться полученный доход.
Далее в Sales Types(меню LS Retail – POS, Setup / General / Sales Types) с Suspend Type = POS Transaction, назакладке Requests вполе Voided Prepayment Account No. указываем Income/Expense Account созданный ранее.

Теперь при нажатии на кнопку с командой с командой VOID, система спросит – требуется ли возвращать деньги клиенту, и если ответ – нет, то предоплата будет зачтена в доход.



Последний раз редактировалось apanko, 03.06.2008 в 12:21.
Ответить с цитированием
  #3  
Старый 23.11.2007, 19:26
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
Распечатать отложенный чек.

Сформированный, но еще не оплаченный чек, в случае необходимости можно сохранить.

Сохраненный (далее отложенный) чек можно восстановить и продолжить работу с ним.

Можно восстановить, а затем снова отложить.

Можно восстановить и аннулировать.

Можно делать всякое, но мне захотелось странного: напечатать содержимое отложенного чека, не открывая его.
Напечатать на принтер, обычный принтер (не чековый).

Задача ясно, надо решать.

Печать, понятно, надо отчетом.

Отчет надо вызывать из POS-клиента. Причем из режима LookUp.

Отчет создал.
Кнопкув POS меню добавил. Даже с командой определился: RUNOBJ, с моим отчетом в качестве параметра.
Цитата:
Примечание:
На самом деле в качестве параметра указывается идентификатор из специальной таблицы 99008926 POS Run Objects, где указан тип запускаемого объекта Navision, ID объекта и режим запуска (модальный).

Вопрос: как в мой отчет передать параметр, т.е. как сообщить системе какой чек нужно печатать.

Решил, что такой вопрос уже должен был возникнуть, а значит и решен. Заглянул в код.

Форма 99008953 POS Lookup.
Код:
RunObjPressed(ObjCode) IF NOT ObjSetup.GET(ObjCode) THEN BEGIN MESSAGE(Text001); EXIT; END; IF NOT Object.GET(ObjSetup."Object Type",ObjSetup."Object ID") THEN BEGIN MESSAGE(Text002); EXIT; END; COMMIT; PosFunction.RunObject(ObjSetup,'LOOKUP',FormID,KeyValue); IF PosInterfaceProfile."Hide Menu" THEN Screen.HideMenu;


Понятно, вызывается функция, в которую передается ряд параметров. Если с первыми тремя все ясно, то что же такое KeyValue.?


(продолжение следует)
Ответить с цитированием
  #4  
Старый 23.11.2007, 19:28
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
(окончание)


KeyValue оказался функцией:

Код:
KeyVal := KeyValue() //KeyValue KeyVal := ''; CASE FormID OF 'ITEM': KeyVal := CurrForm.Item.FORM.GetKeyValue; 'SUSPEND': KeyVal := CurrForm.SuspReg.FORM.GetKeyValue; END;

Т.е. главная форма (POS Lookup) запускает функцию GetKeyValue соответствующей субформы (их на самом деле несколько, какая отображается зависит от режима, в нашем случае это SUSPEND и форма 99008975 POS Suspended Trans.)

А вот и функция
Код:
GetKeyValue() : Code[20] EXIT("Receipt No.");


Выглядит многообещающе (т.к. "Receipt No." - это ключевое поле, и раз его значение куда-то передается, то есть шанс это значение оттуда извлечь).


Теперь посмотрим, что делает с этим и другими параметрами функция RunObject.
Кстати это функция кодеюнита 99008900 POS Functions

Код:
RunObject(ObjSetup : Record "POS Run Objects";Source : Code[10];Data1 : Text[30];Data2 : Text[30]) //RunObject Globals.SetValue('RUNOBJ_SRC',Source); Globals.SetValue('RUNOBJ_DATA1',Data1); Globals.SetValue('RUNOBJ_DATA2',Data2); IF ObjSetup.Modal THEN CASE ObjSetup."Object Type" OF ObjSetup."Object Type"::Form : FORM.RUNMODAL(ObjSetup."Object ID"); ObjSetup."Object Type"::Report : REPORT.RUNMODAL(ObjSetup."Object ID"); ObjSetup."Object Type"::Dataport : DATAPORT.RUNMODAL(ObjSetup."Object ID"); ObjSetup."Object Type"::Codeunit : CODEUNIT.RUN(ObjSetup."Object ID"); END ELSE CASE ObjSetup."Object Type" OF ObjSetup."Object Type"::Form : FORM.RUN(ObjSetup."Object ID"); ObjSetup."Object Type"::Report : REPORT.RUN(ObjSetup."Object ID"); ObjSetup."Object Type"::Dataport : DATAPORT.RUN(ObjSetup."Object ID"); ObjSetup."Object Type"::Codeunit : CODEUNIT.RUN(ObjSetup."Object ID"); END;

Итак, данные передаются в какой-то объект. Что это? Кодеюнит со свойством SingleInstance=Yes?

Очень похоже, но это не так.


Globals - это OCX LS Retail Globals Control (Landsteinar Strengur), еще одна библиотечка которая досталась пользователям LS Retail.

Кроме функции SetValue в данном объекте есть еще и GetValue. Вот ее то и нужно использовать в моем отчете:

Код:
"POS Transaction".SETRANGE("Receipt No.",Globals.GetValue('RUNOBJ_DATA2'));
Ответить с цитированием
  #5  
Старый 05.03.2008, 16:05
apanko apanko вне форума
Администратор
 
Регистрация: 15.08.2006
Сообщения: 1,629
Нашел ошибку.

Проявляется когда открыто окно со списком отложенных чеков.
В поле ввода можно указать номер транзакции и нажать Enter, курсор будет установлен на нужной строке.
Достаточно указать только значимые числа, т.е. если номер 0000000123, то ввести нужно 123.

Так вот этот функционал не работает если значимых чисел больше 3-х, (0000001234 - не работает).

Причина в форме 99008975 POS Suspended Trans. функция FindByNumber.

Чтобы исправить нужно в коде:
Код:
IF EVALUATE(Int,SearchStr) AND (Int >= 0) THEN BEGIN SearchStr := FORMAT(Int); SearchStr := COPYSTR('0000000000',1,10-STRLEN(SearchStr)) + SearchStr; END;
выделенную жирным строку заменить на:
SearchStr := FORMAT(Int,0,1);

Причина:
Переменная Int, на самом деле типа Decimal, а не Integer как можно подумать глядя на ее название.
А при преобразовании переменной типа Decimal в строку используется разделитель тысячных разрядов.

В результате приведенный выше участок кода установит SearchStr значение '0000001 234', а должен '0000001234'.

Поэтому при преобразовании переменной Int в строку следует указать предопределенный формат 1 (<Sign><Integer><Decimals>), вместо используемого по умолчанию формата 0 (<Sign><Integer Thousand><Decimals>).


PS второй вариант - изменить тип локальной переменной Int на Integer.
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 06:22.

Контакты: e-mail, телефон: +7(926)1805967 - Архив - Вверх

Microsoft Most Valuable Professional
vBulletin v3.5.4, Copyright ©2000-2018, Jelsoft Enterprises Ltd.
Русский перевод: zCarot, Vovan & Co
Права на все материалы, опубликованные на блогофоруме принадлежат Андрею Панько, если в самом материале не указано иное.
Рейтинг@Mail.ru Rambler's Top100