04.11.2010, 13:59 | #1 |
Участник
|
Дня доброго коллегам и профессионалам этого форума.
Очень рассчитываю на Вашу помощь. Я в Навижн новичок (пока). Но надеюсь (в т.ч. и помощью форума) овладеть сиим мощным "орудием". Проблема у меня в следующем: Есть документ (н-р, счет-фактура). В нем в табл.части есть колонка "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 |
Участник
|
Сильно не вглядывался, но на вскидку примерно так...
Во-первых, объем кода на формах надо "максимально минимизировать". Во-вторых, если и пишете логику на кнопке, выносите эту логику в отдельную функцию и вызывайте ее с 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 |
Участник
|
Благодарю за ценные рекомендации. Взяла себе на заметку.
Мы в итоге поступили след.образом: В Т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 |
Участник
|
А когда в строке не стоит ни кол-во, ни Print - система не ругается при попытке изменить любое из этих полей?
Может просто отчет формировать не по галке Print, а по Кол-во для выст. Счета? |
|
11.11.2010, 17:57 | #5 |
Участник
|
Цитата:
Дело в том, что в документе помимо "значимых" строк (с товаром и количеством) могут содержаться и строки комментария (как для клиента, так и для бухгалтера). Назначение колонки Print в том и состоит, чтобы управлять какие строки печатать, а какие нет. |
|
16.11.2010, 10:35 | #6 |
Участник
|
Назрел еще один вопрос.
(заранее прошу прощения за возможно глупые и элементарные вопросы) Есть документ (Fnn). При нажатии на F5 открывается список таких документов (Fxxx). Где прописывается какая именно форма должна открыться при нажатии на F5? И ещк один вопрос: Когда смотришь в дизайнере форму списка, то в ней есть кнопки "ОК" и Отмена", а когда нажимаешь на Run, то этих кнопок нет (есть только кн."Помощь") В Properties этих кнопок Visible and Enabled = Yes. В модуле нигде не нашла чтобы как-то видимостью управлялось. :-/ Где тут собака могла порыться? |
|
16.11.2010, 10:46 | #7 |
Участник
|
Цитата:
Сообщение от Kadawrik
Назрел еще один вопрос.
(заранее прошу прощения за возможно глупые и элементарные вопросы) Есть документ (Fnn). При нажатии на F5 открывается список таких документов (Fxxx). Где прописывается какая именно форма должна открыться при нажатии на F5? И ещк один вопрос: Когда смотришь в дизайнере форму списка, то в ней есть кнопки "ОК" и Отмена", а когда нажимаешь на Run, то этих кнопок нет (есть только кн."Помощь") В Properties этих кнопок Visible and Enabled = Yes. В модуле нигде не нашла чтобы как-то видимостью управлялось. :-/ Где тут собака могла порыться? 2. Свойство элемента PushAction. OK обычно видно, когда форма вызывается по Lookup из другой формы |
|
19.11.2010, 12:00 | #8 |
Участник
|
Цитата:
Касательно второго вопроса: методом тыка выяснила, что (оказывается! если форма списка вызывается просто через 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 |
Участник
|
Цитата:
Сообщение от Kadawrik
Цитата:
Касательно второго вопроса: методом тыка выяснила, что (оказывается! если форма списка вызывается просто через FORM.RUNMODAL, то в ней нет кнопок "ОК" и "Отмена". А если вызывается так: имя_переменной := FORM.RUNMODAL тогда эти кнопки есть. (об этом свойстве RUNMODAL я нигде не читала, потому это было для меня открытием Теперь след.вопрос. Разбираясь в коде, наткнулась на след.фрагмент: VerkZeile.TESTFIELD(Quantity); IF VerkZeile.Quantity <> 1 THEN VerkZeile.FIELDERROR(Quantity,'muss 1 sein'); Разве это не тоже самое что и VerkZeile.TESTFIELD(Quantity,1) ? Если да, то почему бы не написать одну строчку вместо двух-трех? Про VerkZeile.TESTFIELD(Quantity,1), Вы абсолютно правы |
|
19.11.2010, 13:03 | #10 |
Участник
|
Сорри, за оффтом
Не смог сдеражиться, что б не спросить: Kadawrik - это Кадаврик? Это что-то типа: Маленькая мертвая девочка? |
|
19.11.2010, 14:41 | #11 |
Участник
|
Цитата:
Когда-то давно наш сисадмин дал мне такой пароль для регистрации в нашей сети. Я и внимания не обратила тогда на это слово (звучало довольно ласково и безобидно). Подумала: что-то из мифологии (видать, моя мысль пошла в сторону кадавр-кентавр) Наш сисадмин - тот еще "шутник" был! Помнится, пользователей в локальной сети он назвал: Lamer1, Lamer2 и т.д. А тут можно как-то поменять ник, не регистрируясь по новой? |
|
19.11.2010, 14:49 | #12 |
Участник
|
У Стругацких тоже кадавр был:
– Вылупился, – спокойно сказал Роман, глядя в потолок. – Кто? – Мне было не по себе: крик был женский. – Выбегаллов упырь, – сказал Роман. – Точнее, кадавр. – А почему женщина кричала? – А вот увидишь, – сказал Роман. (Понедельник начинается в субботу) А мне кажется не стоит менять ник, оригинально... |
|
01.12.2010, 23:07 | #13 |
Участник
|
А я так и, вообще, как попью пива -- так сразу собираюсь жениться! (вот и сейчас )
Перед глазами только кусочек кода, увиденный где-то в начале поста... не ручаюсь за свой безупречный немецкий... но, кажется, там было что-то типа: > Kadawrik.SETRANGE(drucken, NEIN); > FIELDERROR('es muss sein'); Не знаю уж почему, но этот фрагмент вашего кода меня как-то особенно смутил |
|
01.02.2011, 17:46 | #14 |
Участник
|
Опять торможу
Народ, подскажите где я снова накосячила? В одном из отчетов есть строка: ArtikelPrice.SETFILTER("Ending Date",'=1%',0D); Где ArtikelPrice - переменная типа record."Sales Price". В этой таблице есть соответствующее поле с датой. Мне нужно по этому полю установить фильтр (какой - см.выше) Однако, при запуске отчета система выдает мявк: '1%' ist kein gültiges Datum (т.е. параметр - недействительная дата) И что тут не так? |
|
01.02.2011, 19:30 | #15 |
Участник
|
Боюсь ошибиться но может быть должно быть так:
ArtikelPrice.SETFILTER("Ending Date",'=%1',0D); или вообще: ArtikelPrice.SETFILTER("Ending Date",'%1',0D); а с учетом что всего одна переменная, может стоит попробовать: ArtikelPrice.SETFILTER("Ending Date",0D); |
|
01.02.2011, 19:38 | #16 |
Участник
|
Цитата:
Vielen Dank. Все поехало |
|
04.02.2011, 22:29 | #17 |
Участник
|
Если вы фильтруете на одно значение, то, во-первых, можно
Код: ArtikelPrice.SETRANGE("Ending Date",0D); Да и код читабельнее. П.С.: по-поводу читабельности кода - ваши коллеги-арийцы за голову не хватаются, когда читают ваш код,комментарии в коде? "es muss 1 sein" "Machen das nur für Tabelle 18 - Customer" И привыкайте давать переменным имена на английском, чисто для самодисциплины. Попадёте позже в серьёзную контору по навижену, в которой есть CodingGuide, надо будет перестраиваться. И если уж называете переменные по-немецки, тогда уж полностью: см. ArtikelPrice ==> ArtikelPreis или ItemPrice |
|
09.02.2011, 11:42 | #18 |
Участник
|
Цитата:
Сообщение от AlexB
П.С.: по-поводу читабельности кода - ваши коллеги-арийцы за голову не хватаются, когда читают ваш код,комментарии в коде?
... И привыкайте давать переменным имена на английском, чисто для самодисциплины. Попадёте позже в серьёзную контору по навижену, в которой есть CodingGuide, надо будет перестраиваться. И если уж называете переменные по-немецки, тогда уж полностью: см. ArtikelPrice ==> ArtikelPreis или ItemPrice А по поводу читабельности кода .... мои коллеги-арийцы как раз-таки и создавали его. Я сейчас лишь кое-какую косметику навожу или правлю старые баги. Комменты стараюсь писать на англ. А вот многие переменны - не мною обозваны, посему переименовывать их - дело неблагодарное. ...хотя ...каюсь.... проскальзывают у меня иногда эдакие англо-арийские гибриды |
|
10.02.2011, 11:14 | #19 |
Участник
|
Опять я со своими дилетантскими вопросами.
Имеем некую форму, которая отображает одну вспомогательную таблицу. В шапке этой формы имеем два контрола (соответственно две переменные), которые управляют фильтрацией нижевыводимой таблицы. В таблице есть поле Entfernung (Расстояние). Один из контролов - MaxWert - накладывает фильтр по этому полю. Если я в триггере OnValidate() этого контрола пришу просто SETFILTER(Entfernung,'<=%1',MaxWert), то таблица фильтруется... но! если при этом до наложения фильтра мы стояли на какой-то записи, то после фильтрации курсор все равно стоит на той же записи, даже если она уже не удовлетворяет условию фильтра. Пролистав таблицу туда-сюда, запись исчезает. Я пробовала после SETFILTER ставить FINDFIRST. В результате: курсор действительно переходит на первую запись, но при попытке перейти на следующую (н-р, нажимаю стрелку вниз или кликаю мышой на др.запись) получаю следующее сообщение об ошибке: "Имя таблицы" kann in diesem Formular nicht verändert werden. (т.е. таблицу нельзя менять в этом формуляре). Дальше движение по списку осуществляется уже без проблем. Но хотелось бы вообще без мявков и с правилльным позиционированием курсора после смены условия фильра. |
|
10.02.2011, 11:22 | #20 |
Участник
|
И еще один попутный вопрос: если установлено несколько фильтров, и нужно отменить только один из них, то как лучше это сделать?
(В приведенном выше примере если MaxWért = 0, то нужно показать все записи.) |
|