13.11.2012, 12:49 | #1 |
Участник
|
Добрый день!
Ситуация. Вставляем в заказ продажи строчку. Заполняем разными умными данными. При вставке одного из параметров нам необходимо сравнить его значение со строчками, находящимися выше текущей строки. Т.е. по сути дела нужно отобрать строки заказа продажи, у которых "Line No." < "Line No."(текущей строки). Все бы хорошо, да вот только пока не произошла вставка записи, этот самый "Line No." у текущей строки равен 0 и в итоге проверка не проходит. Подскажите, пожалуйста, как можно обмануть этот самый Nav, чтобы узнать номер текущей строки тогда, когда надо мне, а не тогда, когда пойдет уже вставка записи. Да, я в курсе, что весь этот механизм заложен этим самым AutoSplit'ом. Но как это это можно достать? Спасибо. |
|
13.11.2012, 13:05 | #2 |
Участник
|
а почему бы не сейвить запись в которой нажимаем F3 и от нее плясать? Обычно же вставляется запись после выбранной и то каким будет значение ключа новой записи и не нужно. Или я чего не понимаю?
|
|
13.11.2012, 13:39 | #3 |
Участник
|
Цитата:
Вставить строку пользователь может любым удобным ему способом - и f3 нажать, и просто стрелкой вниз перейти от последней записи. Но пока он находится в этой ново-введенной строке, порядкового номера у нее (у строки) нет. Номер может появится если, допустим, нажать на F8 для просмотра содержимого полей, ну или если будет переход на другую запись. Но пока пользователь ничего лишнего не жмет и сидит в этой записи - номер строки равен 0. Если перенести код с проверкой на форму и сделать SAVERECORD перед всеми проверками, то умный Автосплит запихивает текущую запись в начало, т.е пытается разместить между никакой строкой (т.е. нулевой) и 10000. Т.е. тут уже вобще порядок ни в какие ворота не лезет. ЗЫ, если бы все пользователи были логичны, то у меня бы и вопросов не возникало по поводу номера строки) всунула бы сама, какой надо и делов. Но где гарантия, что они не вставят одну строчку между двумя? На то автосплит как раз и срабытывает. |
|
13.11.2012, 13:57 | #4 |
Участник
|
При вводе кода товара отрабатывается триггер формы No - OnValidate и выполняется CurrForm.SaveRecord, т.е. запись вставляется. А значит "Line No." у нее уже заполнен.
|
|
13.11.2012, 14:16 | #5 |
Участник
|
Lapunder, а вам нужно посчитать параметры именно по строкам выше или по всем введенным ранее? Если по всем введенным ранее, то можно не привязываться к номеру строки, а написать функцию в кодеюните, которая подсчитает нужные вам параметры по номеру документа. Если вызвать эту функцию на OnInsert, то она как раз подсчитает параметры по всем строкам, кроме вставляемой.
|
|
13.11.2012, 14:24 | #6 |
Участник
|
Цитата:
Код: 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 |
Участник
|
Цитата:
Сообщение от Constantine
Lapunder, а вам нужно посчитать параметры именно по строкам выше или по всем введенным ранее? Если по всем введенным ранее, то можно не привязываться к номеру строки, а написать функцию в кодеюните, которая подсчитает нужные вам параметры по номеру документа. Если вызвать эту функцию на OnInsert, то она как раз подсчитает параметры по всем строкам, кроме вставляемой.
Т.е. если пример нарисовать то 10000 Товар1 23 20000 Товар2 23 30000 Товар3 23 (NEW) Товар4 22 - вот так нельзя. В принципе, вопрос снимается, ибо заказчик решил, что сразу при вставке записей в строки заказа ему эта проверка не нужна. Параметр будет вводится после того, как заказ сформирован. А там уже проверка срабатывает, т.к. номера строк в заказе уже все заполнены и пятьсот раз сохранены :| Но все равно спасибо за идеи. Кто их, заказчиков, знает. Вдруг все же придется вставлять проверку при вводе новой строки. |
|
13.11.2012, 16:22 | #8 |
Участник
|
Извините, не совсем правильно выразился. Под сейвить имелось ввиду получить указатель на ту запись из которой проводилась вставка. В тригере ОнАвтоГетКурРекорд записывать данные об текущей записи, например, тупо в переменную записи, глабальную естественно.
Код: Buffer2 := Buffer1; Buffer1 := Rec; как новая запись оказывается наверху, после перехода из послейдней на новую я не понял. или вы чего-то не говорите или я чего по жизни не понимаю и странно как тогда работает создание строк в обычных заказах |
|
13.11.2012, 18:29 | #9 |
Участник
|
поставьте свойство формы строк продажи в DelayedInsert = No.
|
|
14.11.2012, 15:42 | #10 |
Участник
|
Еще один вариант - попробовать поиграться с триггером OnNewRecord формы.
В триггере обрабатывать значения xRec (текущая запись, перед вводом новой строки, по которой можно вычислить Line No.) и параметра BelowxRec (см. справку по OnNewRecord). |
|
22.11.2012, 16:56 | #11 |
Участник
|
Зачем заморачиваться с номером строки?
Действительно имеет значение искать дубликаты в ранее созданных строках, если сортировка по номеру строки? А если пользователь изменит сортировку в субформе критерии поменяются или так и останутся прежними? Может быть достаточно будет искать во всех строках этого документа продажи? |
|
23.11.2012, 12:25 | #12 |
Administrator
|
ключевая фраза.
обычно такие ТЗ есть результат кривых процессов или непонимания процессов. например, в печатной форме надо чтобы товары шли по порядочку, а клиент думает, что и в заказе они должны идти по порядочку и пишет подобные "ТЗ". давайте копать до истинных желаний заказчика, а не верить сочиненным им "ТЗ" |
|
23.11.2012, 13:21 | #13 |
NavAx
|
__________________
"Моей лошадке ядрышком полмордочки снесло..." А.В.Суворов, письма к дочери |
|