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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 13.11.2012, 12:49   #1  
Lapunder is offline
Lapunder
Участник
 
40 / 10 (1) +
Регистрация: 24.04.2008
Добрый день!

Ситуация. Вставляем в заказ продажи строчку. Заполняем разными умными данными. При вставке одного из параметров нам необходимо сравнить его значение со строчками, находящимися выше текущей строки. Т.е. по сути дела нужно отобрать строки заказа продажи, у которых "Line No." < "Line No."(текущей строки).
Все бы хорошо, да вот только пока не произошла вставка записи, этот самый "Line No." у текущей строки равен 0 и в итоге проверка не проходит.

Подскажите, пожалуйста, как можно обмануть этот самый Nav, чтобы узнать номер текущей строки тогда, когда надо мне, а не тогда, когда пойдет уже вставка записи.
Да, я в курсе, что весь этот механизм заложен этим самым AutoSplit'ом. Но как это это можно достать?

Спасибо.
Старый 13.11.2012, 13:05   #2  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
а почему бы не сейвить запись в которой нажимаем F3 и от нее плясать? Обычно же вставляется запись после выбранной и то каким будет значение ключа новой записи и не нужно. Или я чего не понимаю?
Старый 13.11.2012, 13:39   #3  
Lapunder is offline
Lapunder
Участник
 
40 / 10 (1) +
Регистрация: 24.04.2008
Цитата:
Сообщение от InTacto Посмотреть сообщение
а почему бы не сейвить запись в которой нажимаем F3 и от нее плясать? Обычно же вставляется запись после выбранной и то каким будет значение ключа новой записи и не нужно. Или я чего не понимаю?
Не совсем поняла смысл сейва записи, в которой нажимаем f3.
Вставить строку пользователь может любым удобным ему способом - и f3 нажать, и просто стрелкой вниз перейти от последней записи. Но пока он находится в этой ново-введенной строке, порядкового номера у нее (у строки) нет. Номер может появится если, допустим, нажать на F8 для просмотра содержимого полей, ну или если будет переход на другую запись. Но пока пользователь ничего лишнего не жмет и сидит в этой записи - номер строки равен 0.
Если перенести код с проверкой на форму и сделать SAVERECORD перед всеми проверками, то умный Автосплит запихивает текущую запись в начало, т.е пытается разместить между никакой строкой (т.е. нулевой) и 10000. Т.е. тут уже вобще порядок ни в какие ворота не лезет.

ЗЫ, если бы все пользователи были логичны, то у меня бы и вопросов не возникало по поводу номера строки) всунула бы сама, какой надо и делов. Но где гарантия, что они не вставят одну строчку между двумя? На то автосплит как раз и срабытывает.
Старый 13.11.2012, 13:57   #4  
Fly is offline
Fly
Участник
Аватар для Fly
 
102 / 10 (1) +
Регистрация: 05.10.2007
При вводе кода товара отрабатывается триггер формы No - OnValidate и выполняется CurrForm.SaveRecord, т.е. запись вставляется. А значит "Line No." у нее уже заполнен.
Старый 13.11.2012, 14:16   #5  
Constantine_imported is offline
Constantine_imported
Участник
 
126 / 10 (1) +
Регистрация: 28.04.2011
Lapunder, а вам нужно посчитать параметры именно по строкам выше или по всем введенным ранее? Если по всем введенным ранее, то можно не привязываться к номеру строки, а написать функцию в кодеюните, которая подсчитает нужные вам параметры по номеру документа. Если вызвать эту функцию на OnInsert, то она как раз подсчитает параметры по всем строкам, кроме вставляемой.
Старый 13.11.2012, 14:24   #6  
Lapunder is offline
Lapunder
Участник
 
40 / 10 (1) +
Регистрация: 24.04.2008
Цитата:
Сообщение от Fly Посмотреть сообщение
При вводе кода товара отрабатывается триггер формы No - OnValidate и выполняется CurrForm.SaveRecord, т.е. запись вставляется. А значит "Line No." у нее уже заполнен.
вот представьте себе, не вставляется

Код:
InsertExtendedText(FALSE);
IF (Type = Type::"Charge (Item)") AND ("No." <> xRec."No.") AND
   (xRec."No." <> '')
THEN
  CurrForm.SAVERECORD;

IF (Reserve = Reserve::Always) AND
   ("Outstanding Qty. (Base)" <> 0) AND
   ("No." <> xRec."No.")
THEN BEGIN
  CurrForm.SAVERECORD;
  AutoReserve;
  CurrForm.UPDATE(FALSE);
END;
Это не товарные издержки. И Обязательного резервирования тоже нет.
Старый 13.11.2012, 14:28   #7  
Lapunder is offline
Lapunder
Участник
 
40 / 10 (1) +
Регистрация: 24.04.2008
Цитата:
Сообщение от Constantine Посмотреть сообщение
Lapunder, а вам нужно посчитать параметры именно по строкам выше или по всем введенным ранее? Если по всем введенным ранее, то можно не привязываться к номеру строки, а написать функцию в кодеюните, которая подсчитает нужные вам параметры по номеру документа. Если вызвать эту функцию на OnInsert, то она как раз подсчитает параметры по всем строкам, кроме вставляемой.
Смысл ТЗ объяснять долго, но проверка нужна на момент заполнения поля в строке (новое поле) и сравнение его значения с полями из строк выше.
Т.е. если пример нарисовать то

10000 Товар1 23
20000 Товар2 23
30000 Товар3 23
(NEW) Товар4 22 - вот так нельзя.

В принципе, вопрос снимается, ибо заказчик решил, что сразу при вставке записей в строки заказа ему эта проверка не нужна. Параметр будет вводится после того, как заказ сформирован. А там уже проверка срабатывает, т.к. номера строк в заказе уже все заполнены и пятьсот раз сохранены :|

Но все равно спасибо за идеи. Кто их, заказчиков, знает. Вдруг все же придется вставлять проверку при вводе новой строки.
Старый 13.11.2012, 16:22   #8  
InTacto is offline
InTacto
Участник
Аватар для InTacto
 
323 / 11 (1) +
Регистрация: 09.08.2005
Извините, не совсем правильно выразился. Под сейвить имелось ввиду получить указатель на ту запись из которой проводилась вставка. В тригере ОнАвтоГетКурРекорд записывать данные об текущей записи, например, тупо в переменную записи, глабальную естественно.
Код:
Buffer2 := Buffer1;
Buffer1 := Rec;
При срабатывании тригера oninsertRecord в переменной buffer2 будут запись из которой нажали f3. И с помощью этой записи можно получить ту которая выше. Есть узкие места, но их можно обойти доп проверками.

как новая запись оказывается наверху, после перехода из послейдней на новую я не понял. или вы чего-то не говорите или я чего по жизни не понимаю и странно как тогда работает создание строк в обычных заказах
Старый 13.11.2012, 18:29   #9  
artkashin is offline
artkashin
Участник
MCBMSS
 
519 / 18 (2) ++
Регистрация: 06.12.2006
поставьте свойство формы строк продажи в DelayedInsert = No.
Старый 14.11.2012, 15:42   #10  
Kalex63 is offline
Kalex63
Участник
 
18 / 10 (1) +
Регистрация: 20.10.2007
Еще один вариант - попробовать поиграться с триггером OnNewRecord формы.
В триггере обрабатывать значения xRec (текущая запись, перед вводом новой строки, по которой можно вычислить Line No.) и параметра BelowxRec (см. справку по OnNewRecord).
Старый 22.11.2012, 16:56   #11  
romeo is offline
romeo
Участник
Аватар для romeo
 
564 / 10 (2) +
Регистрация: 31.03.2004
Зачем заморачиваться с номером строки?
Действительно имеет значение искать дубликаты в ранее созданных строках, если сортировка по номеру строки? А если пользователь изменит сортировку в субформе критерии поменяются или так и останутся прежними?
Может быть достаточно будет искать во всех строках этого документа продажи?
Старый 23.11.2012, 12:25   #12  
Sancho is offline
Sancho
Administrator
Аватар для Sancho
Лучший по профессии 2017
Лучший по профессии 2009
 
1,294 / 221 (10) ++++++
Регистрация: 11.01.2006
Цитата:
Сообщение от Lapunder Посмотреть сообщение
Смысл ТЗ объяснять долго...
ключевая фраза.
обычно такие ТЗ есть результат кривых процессов или непонимания процессов.
например, в печатной форме надо чтобы товары шли по порядочку, а клиент думает, что и в заказе они должны идти по порядочку и пишет подобные "ТЗ".

давайте копать до истинных желаний заказчика, а не верить сочиненным им "ТЗ"
Старый 23.11.2012, 13:21   #13  
Yoil is offline
Yoil
NavAx
NavAx Club
Лучший по профессии 2017
Лучший по профессии 2009
 
1,574 / 70 (6) ++++
Регистрация: 20.11.2002
Адрес: Msk
__________________
"Моей лошадке ядрышком полмордочки снесло..."
А.В.Суворов, письма к дочери
 


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

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

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