AXForum  
Вернуться   AXForum > Microsoft Dynamics NAV > NAV: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 04.11.2010, 13:59   #1  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Дня доброго коллегам и профессионалам этого форума.
Очень рассчитываю на Вашу помощь. Я в Навижн новичок (пока). Но надеюсь (в т.ч. и помощью форума) овладеть сиим мощным "орудием".
Проблема у меня в следующем:
Есть документ (н-р, счет-фактура). В нем в табл.части есть колонка "Print", в которой юзер ставит галочки в тех строках, которые должны быть выведены на печать. Но тут возникает опасность: распечатаны будут не все строки, которые будут реально проведены, т.е. в рез-те клиент получит счет на одну сумму, а по бухгалтерии будет проведена совсем другая.
Чтобы предотвратить эту коллизию предлагается следующее: при нажатии на кнопку "Печать", осуществлять проверку строк документа, и если есть строки без крыжика "Print", но с "Кол-во к отгрузке" или "Кол-во к фактурированию" не равными 0, то выдавать соответствующее предупреждение.

Вопрос: в какое место впихнуть эту проверку? и какими средствами ее осуществлять?
Я сделала пока так:
1)В форме Fxxxxx (счета-фактуры) добавила переменные OK(boolean), QtySum(decimal), VerkZeilen(Record.Sales Line), Text001(Text).
2) В модуле для MenuButton "Печать" в триггер OnPush() вставлен след.код:

VerkZeilen.SETRANGE("Document Type","Document Type");
VerkZeilen.SETFILTER("Document No.", "No.");
VerkZeilen.SETRANGE(drucken,FALSE);
OK := TRUE;
IF VerkZeilen.FIND('-') THEN
BEGIN
CLEAR(QtySum);
REPEAT
QtySum := QtySum + ABS(VerkZeilen."Qty. to Invoice") + ABS(VerkZeilen."Qty. to Ship");
UNTIL VerkZeilen.NEXT = 0;
IF QtySum <> 0 THEN OK := CONFIRM(Text001);
END;
IF OK THEN
REPORT.RUN(lrc_Belegsteuerung."ID Auftragsbestätigung",TRUE,FALSE,lrc_SalesHeader);

Не судите строго, это моя т.с. первая проба пера Подскажите, плиз, более корректное и изящное решение описанной проблемы? (что я сделала неправильно, что лишнее и т.д.?)
Вроде работает, но я не уверена, что это "высокий стиль"
Старый 04.11.2010, 14:09   #2  
Romul is offline
Romul
Участник
 
186 / 11 (1) +
Регистрация: 26.12.2007
Сильно не вглядывался, но на вскидку примерно так...

Во-первых, объем кода на формах надо "максимально минимизировать".
Во-вторых, если и пишете логику на кнопке, выносите эту логику в отдельную функцию и вызывайте ее с OnPush'a
В-третьих, не трогайте стандартную кнопку Печать на форме. Вынесите в отдельный MenuItem какой-нибудь.
В-четвертых, если решили работать с кнопкой Печать, то вместо вот этого:
VerkZeilen.SETRANGE("Document Type","Document Type");
VerkZeilen.SETFILTER("Document No.", "No.");
VerkZeilen.SETRANGE(drucken,FALSE);
OK := TRUE;
IF VerkZeilen.FIND('-') THEN
BEGIN
CLEAR(QtySum);
REPEAT
QtySum := QtySum + ABS(VerkZeilen."Qty. to Invoice") + ABS(VerkZeilen."Qty. to Ship");
UNTIL VerkZeilen.NEXT = 0;
IF QtySum <> 0 THEN OK := CONFIRM(Text001);
END;
IF OK THEN
REPORT.RUN(lrc_Belegsteuerung."ID Auftragsbestätigung",TRUE,FALSE,lrc_SalesHeader);

напишите что-нибудь вроде

IF МояФункцияГдеТоНаПросторахТаблицы36 THEN
REPORT.RUN(lrc_Belegsteuerung."ID Auftragsbestätigung",TRUE,FALSE,lrc_SalesHeader);

Пишите логику на таблицах и кодэюнитах.

Ну и про операторы не забывайте: ISEMPTY, FINDFIRST, FINDSET, COUNTAPPROX и все такое прочее... Почитайте по ним мануалы, либо поищите на этом форуме отличия перечисленных от обычных FIND('-') и прочих допотопных.
Старый 10.11.2010, 11:06   #3  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Благодарю за ценные рекомендации. Взяла себе на заметку.

Мы в итоге поступили след.образом:
В Т37(Sales Line)в триггер OnValidate для полей Print и "Qty. to Invoice" вставлен код:

IF ("Qty. to Invoice" <> 0) AND (Type <> Type::" ") AND NOT(Print) THEN
ERROR(Text50045);
Старый 11.11.2010, 14:33   #4  
.Quattro. is offline
.Quattro.
Участник
Лучший по профессии 2009
 
194 / 22 (1) +++
Регистрация: 22.05.2006
А когда в строке не стоит ни кол-во, ни Print - система не ругается при попытке изменить любое из этих полей?

Может просто отчет формировать не по галке Print, а по Кол-во для выст. Счета?
Старый 11.11.2010, 17:57   #5  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от .Quattro. Посмотреть сообщение
А когда в строке не стоит ни кол-во, ни Print - система не ругается при попытке изменить любое из этих полей?

Может просто отчет формировать не по галке Print, а по Кол-во для выст. Счета?
Если оба поля пустые, то при попытке поставить галочку в Print, система не ругается. Но если попытаться ввести количество при незаполненном Print, то появится сообщение об ошибке.

Дело в том, что в документе помимо "значимых" строк (с товаром и количеством) могут содержаться и строки комментария (как для клиента, так и для бухгалтера). Назначение колонки Print в том и состоит, чтобы управлять какие строки печатать, а какие нет.
Старый 16.11.2010, 10:35   #6  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Назрел еще один вопрос.
(заранее прошу прощения за возможно глупые и элементарные вопросы)
Есть документ (Fnn). При нажатии на F5 открывается список таких документов (Fxxx). Где прописывается какая именно форма должна открыться при нажатии на F5?
И ещк один вопрос:
Когда смотришь в дизайнере форму списка, то в ней есть кнопки "ОК" и Отмена", а когда нажимаешь на Run, то этих кнопок нет (есть только кн."Помощь")
В Properties этих кнопок Visible and Enabled = Yes. В модуле нигде не нашла чтобы как-то видимостью управлялось. :-/ Где тут собака могла порыться?
Старый 16.11.2010, 10:46   #7  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Назрел еще один вопрос.
(заранее прошу прощения за возможно глупые и элементарные вопросы)
Есть документ (Fnn). При нажатии на F5 открывается список таких документов (Fxxx). Где прописывается какая именно форма должна открыться при нажатии на F5?
И ещк один вопрос:
Когда смотришь в дизайнере форму списка, то в ней есть кнопки "ОК" и Отмена", а когда нажимаешь на Run, то этих кнопок нет (есть только кн."Помощь")
В Properties этих кнопок Visible and Enabled = Yes. В модуле нигде не нашла чтобы как-то видимостью управлялось. :-/ Где тут собака могла порыться?
1. Свойство LookupFormID таблицы
2. Свойство элемента PushAction. OK обычно видно, когда форма вызывается по Lookup из другой формы
Старый 19.11.2010, 12:00   #8  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Fordewind Посмотреть сообщение
. Свойство LookupFormID таблицы
2. Свойство элемента PushAction. OK обычно видно, когда форма вызывается по Lookup из другой формы
Благодарю за подсказку.
Касательно второго вопроса: методом тыка выяснила, что (оказывается! если форма списка вызывается просто через FORM.RUNMODAL, то в ней нет кнопок "ОК" и "Отмена". А если вызывается так:
имя_переменной := FORM.RUNMODAL
тогда эти кнопки есть. (об этом свойстве RUNMODAL я нигде не читала, потому это было для меня открытием


Теперь след.вопрос.
Разбираясь в коде, наткнулась на след.фрагмент:

VerkZeile.TESTFIELD(Quantity);
IF VerkZeile.Quantity <> 1 THEN VerkZeile.FIELDERROR(Quantity,'muss 1 sein');


Разве это не тоже самое что и VerkZeile.TESTFIELD(Quantity,1) ?
Если да, то почему бы не написать одну строчку вместо двух-трех?
Старый 19.11.2010, 12:38   #9  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Цитата:
Сообщение от Kadawrik Посмотреть сообщение
Цитата:
Сообщение от Fordewind Посмотреть сообщение
. Свойство LookupFormID таблицы
2. Свойство элемента PushAction. OK обычно видно, когда форма вызывается по Lookup из другой формы
Благодарю за подсказку.
Касательно второго вопроса: методом тыка выяснила, что (оказывается! если форма списка вызывается просто через FORM.RUNMODAL, то в ней нет кнопок "ОК" и "Отмена". А если вызывается так:
имя_переменной := FORM.RUNMODAL
тогда эти кнопки есть. (об этом свойстве RUNMODAL я нигде не читала, потому это было для меня открытием


Теперь след.вопрос.
Разбираясь в коде, наткнулась на след.фрагмент:

VerkZeile.TESTFIELD(Quantity);
IF VerkZeile.Quantity <> 1 THEN VerkZeile.FIELDERROR(Quantity,'muss 1 sein');


Разве это не тоже самое что и VerkZeile.TESTFIELD(Quantity,1) ?
Если да, то почему бы не написать одну строчку вместо двух-трех?
+ За "имя_переменной := FORM.RUNMODAL"

Про VerkZeile.TESTFIELD(Quantity,1), Вы абсолютно правы
Старый 19.11.2010, 13:03   #10  
Fordewind is offline
Fordewind
Участник
 
1,134 / 10 (3) +
Регистрация: 01.12.2005
Сорри, за оффтом

Не смог сдеражиться, что б не спросить:
Kadawrik - это Кадаврик? Это что-то типа: Маленькая мертвая девочка?
Старый 19.11.2010, 14:41   #11  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Fordewind Посмотреть сообщение
Сорри, за оффтом

Не смог сдеражиться, что б не спросить:
Kadawrik - это Кадаврик? Это что-то типа: Маленькая мертвая девочка?
Мама дорогая! я и не знала, что кадавр - это мертвец! Ж8-О
Когда-то давно наш сисадмин дал мне такой пароль для регистрации в нашей сети. Я и внимания не обратила тогда на это слово (звучало довольно ласково и безобидно). Подумала: что-то из мифологии (видать, моя мысль пошла в сторону кадавр-кентавр)
Наш сисадмин - тот еще "шутник" был! Помнится, пользователей в локальной сети он назвал: Lamer1, Lamer2 и т.д.

А тут можно как-то поменять ник, не регистрируясь по новой?
Старый 19.11.2010, 14:49   #12  
prefreitor is offline
prefreitor
Участник
 
214 / 11 (1) +
Регистрация: 03.10.2006
У Стругацких тоже кадавр был:
– Вылупился, – спокойно сказал Роман, глядя в потолок.

– Кто? – Мне было не по себе: крик был женский.

– Выбегаллов упырь, – сказал Роман. – Точнее, кадавр.

– А почему женщина кричала?

– А вот увидишь, – сказал Роман.
(Понедельник начинается в субботу)
А мне кажется не стоит менять ник, оригинально...
Старый 01.12.2010, 23:07   #13  
jopagames2 is offline
jopagames2
Участник
 
151 / 11 (1) +
Регистрация: 11.02.2010
Цитата:
Сообщение от prefreitor Посмотреть сообщение
У Стругацких тоже кадавр был:
А я так и, вообще, как попью пива -- так сразу собираюсь жениться! (вот и сейчас )
Перед глазами только кусочек кода, увиденный где-то в начале поста... не ручаюсь за свой безупречный немецкий... но, кажется, там было что-то типа:

> Kadawrik.SETRANGE(drucken, NEIN);
> FIELDERROR('es muss sein');

Не знаю уж почему, но этот фрагмент вашего кода меня как-то особенно смутил
Старый 01.02.2011, 17:46   #14  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Опять торможу
Народ, подскажите где я снова накосячила?
В одном из отчетов есть строка:
ArtikelPrice.SETFILTER("Ending Date",'=1%',0D);

Где ArtikelPrice - переменная типа record."Sales Price". В этой таблице есть соответствующее поле с датой. Мне нужно по этому полю установить фильтр (какой - см.выше)
Однако, при запуске отчета система выдает мявк: '1%' ist kein gültiges Datum (т.е. параметр - недействительная дата)
И что тут не так?
Старый 01.02.2011, 19:30   #15  
Thrice is offline
Thrice
Участник
Аватар для Thrice
 
46 / 10 (1) +
Регистрация: 09.07.2008
Боюсь ошибиться но может быть должно быть так:
ArtikelPrice.SETFILTER("Ending Date",'=%1',0D);
или вообще:
ArtikelPrice.SETFILTER("Ending Date",'%1',0D);
а с учетом что всего одна переменная, может стоит попробовать:
ArtikelPrice.SETFILTER("Ending Date",0D);
Старый 01.02.2011, 19:38   #16  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от Thrice Посмотреть сообщение
Боюсь ошибиться но может быть должно быть так:
ArtikelPrice.SETFILTER("Ending Date",'=%1',0D);
или вообще:
ArtikelPrice.SETFILTER("Ending Date",'%1',0D);
а с учетом что всего одна переменная, может стоит попробовать:
ArtikelPrice.SETFILTER("Ending Date",0D);
Я не тормоз, я - медленный газ!
Vielen Dank. Все поехало
Старый 04.02.2011, 22:29   #17  
alexb_imported is offline
alexb_imported
Участник
 
256 / 12 (1) ++
Регистрация: 25.08.2006
Если вы фильтруете на одно значение, то, во-первых, можно
Код:
ArtikelPrice.SETRANGE("Ending Date",0D);
a во-вторых, по идее и нужно в таких случаях использовать SETRANGE, т.к. SETRANGE работает оптимальнее/быстрее чем SETFILTER
Да и код читабельнее.
П.С.: по-поводу читабельности кода - ваши коллеги-арийцы за голову не хватаются, когда читают ваш код,комментарии в коде?

"es muss 1 sein"
"Machen das nur für Tabelle 18 - Customer"

И привыкайте давать переменным имена на английском, чисто для самодисциплины.
Попадёте позже в серьёзную контору по навижену, в которой есть CodingGuide, надо будет перестраиваться.
И если уж называете переменные по-немецки, тогда уж полностью:
см. ArtikelPrice ==> ArtikelPreis или ItemPrice
Старый 09.02.2011, 11:42   #18  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Цитата:
Сообщение от AlexB Посмотреть сообщение
П.С.: по-поводу читабельности кода - ваши коллеги-арийцы за голову не хватаются, когда читают ваш код,комментарии в коде?
...
И привыкайте давать переменным имена на английском, чисто для самодисциплины.
Попадёте позже в серьёзную контору по навижену, в которой есть CodingGuide, надо будет перестраиваться.
И если уж называете переменные по-немецки, тогда уж полностью:
см. ArtikelPrice ==> ArtikelPreis или ItemPrice
В целом замечание принимается. Благодарю. Постараюсь по-ответственней следить за самодисциплиной.
А по поводу читабельности кода .... мои коллеги-арийцы как раз-таки и создавали его. Я сейчас лишь кое-какую косметику навожу или правлю старые баги.
Комменты стараюсь писать на англ. А вот многие переменны - не мною обозваны, посему переименовывать их - дело неблагодарное. ...хотя ...каюсь.... проскальзывают у меня иногда эдакие англо-арийские гибриды
Старый 10.02.2011, 11:14   #19  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
Опять я со своими дилетантскими вопросами.
Имеем некую форму, которая отображает одну вспомогательную таблицу. В шапке этой формы имеем два контрола (соответственно две переменные), которые управляют фильтрацией нижевыводимой таблицы. В таблице есть поле Entfernung (Расстояние). Один из контролов - MaxWert - накладывает фильтр по этому полю.
Если я в триггере OnValidate() этого контрола пришу просто SETFILTER(Entfernung,'<=%1',MaxWert), то таблица фильтруется... но! если при этом до наложения фильтра мы стояли на какой-то записи, то после фильтрации курсор все равно стоит на той же записи, даже если она уже не удовлетворяет условию фильтра. Пролистав таблицу туда-сюда, запись исчезает.
Я пробовала после SETFILTER ставить FINDFIRST. В результате: курсор действительно переходит на первую запись, но при попытке перейти на следующую (н-р, нажимаю стрелку вниз или кликаю мышой на др.запись) получаю следующее сообщение об ошибке: "Имя таблицы" kann in diesem Formular nicht verändert werden. (т.е. таблицу нельзя менять в этом формуляре). Дальше движение по списку осуществляется уже без проблем. Но хотелось бы вообще без мявков и с правилльным позиционированием курсора после смены условия фильра.
Старый 10.02.2011, 11:22   #20  
Kadawrik is offline
Kadawrik
Участник
 
279 / 11 (1) +
Регистрация: 04.11.2010
И еще один попутный вопрос: если установлено несколько фильтров, и нужно отменить только один из них, то как лучше это сделать?
(В приведенном выше примере если MaxWért = 0, то нужно показать все записи.)
 


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:17.