|
20.11.2006, 14:07 | #1 |
Участник
|
Надо вызвать Lookup форму для таблицы по Id таблицы.
Объявить переменную типа Record на данную таблицу нельзя, так как на этапе компиляции неизвестен id таблицы. Я попытался создать переменную Ref типа RecordRef, связать её с нужной таблицей (Open) и вызвать Form.RunModal(0, Ref). Но вот тут вот и вся проблема, 2 входной параметр для RunModal должен быть типа Record, а не RecordRef. Есть ли способ из RecordRef вытянуть Record с учётом того, что нельзя объявить переменную типа Record. По логике вещей что может быть проще, чем из ссылки на объект получить сам объект. Пробовал использовать тип Variant, опять же, как инициализировать variant как тип Record? Или может поставленную задачу можно решить как-нибудь подругому? |
|
20.11.2006, 18:18 | #2 |
Участник
|
|
|
20.11.2006, 18:19 | #3 |
Участник
|
да, на этапе компиляции не известен id таблицы. Этот id мы получаем во время выполнения из одной специальной таблицы.
Использовать Case - это конечно solution, но трудно расширяемый, так как если понадобится добавить ещё пару таблиц в список, то придётся редактировать этот самый Case, что не есть хорошо. А всё это нужно для того, чтобы реализовать возможность использовать и создавать query. В Navision почему такой возможности поумолчанию нету, и очень зря. |
|
20.11.2006, 19:31 | #4 |
Участник
|
Ну, можно извратиться и сделать форму-список, основанную на Integer. Передавать RecordRef. И выводить на форме, например только ключевые поля.
Изврат, конечно, но зато можно, нажав LookUp видет список... и даже нажать Ok |
|
20.11.2006, 20:12 | #5 |
Участник
|
Ну хотелось бы вызвать полноценную форму, на которой бы отображались не только ключевые/Integer поля.
Кстати, походу возник ещё один вопрос, как скопировать фильтр из переменной типа RecordRef в переменную типа Record (способ скопировать поотдельности фильтр для каждого поля не подходит) ?? |
|
20.11.2006, 20:33 | #6 |
Участник
|
Цитата:
Цитата:
Код: Customer.SETFILTER("Salesperson Code",'*SER*'); Customer.SETFILTER(City,'*олг*'); RecRef.GETTABLE(Customer); Customer2.RESET; Customer2.SETVIEW(RecRef.GETVIEW); |
|
21.11.2006, 11:25 | #7 |
Участник
|
Если использовать GETVIEW и SETVIEW, то мы скопируем только "VIEW"(я не силён в терминах в Navision, поэтому может называю вещи не своими именами). Фильтры при этом скопируются, но только для FILTERGROUP(0), а если у нас в RecRef были созданы фильтры в FILTERGROUP(2), то они "пропадут"(в help написано, что FILTERGROUP может использоваться только с SETRANGE и SETFILTER). Так что вопрос осаётся открытым. Привожу код, в котором надо:
- (в идеале)вызвать default Lookup форму для RecRef; - (хотя бы)скопировать фильтр из RecRef в переменную типа Record подтипа "Table No."(назовём её TableRec) Filter - переменная, в которой хранится фильтры для полей таблицы "Table No.". RecRef.OPEN(Rec."Table No.", FALSE); RecRef.RESET; RecRef.FILTERGROUP(2); WHILE Filter.NEXT <> 0 DO BEGIN IF Filter.Filter <> '' THEN BEGIN FieldRef := RecRef.FIELD(Filter."Field No."); FieldRef.SETFILTER(Filter.Filter); END; END; RecRef.FILTERGROUP(0); //1 вызвать default Lookup форму для RecRef; //2 ИЛИ скопировать фильтр из RecRef в TableRec(соответствующего типа) Хотелось бы знать, можно ли это вообще это сделать и если да, то как?? Заранее всем спасибо за все идеи. |
|
21.11.2006, 13:04 | #8 |
Участник
|
Цитата:
Сообщение от yauhen
Если использовать GETVIEW и SETVIEW, то мы скопируем только "VIEW"(я не силён в терминах в Navision, поэтому может называю вещи не своими именами). Фильтры при этом скопируются, но только для FILTERGROUP(0), а если у нас в RecRef были созданы фильтры в FILTERGROUP(2), то они "пропадут"(в help написано, что FILTERGROUP может использоваться только с SETRANGE и SETFILTER). Так что вопрос осаётся открытым. Привожу код, в котором надо:
- (в идеале)вызвать default Lookup форму для RecRef; - (хотя бы)скопировать фильтр из RecRef в переменную типа Record подтипа "Table No."(назовём её TableRec) Filter - переменная, в которой хранится фильтры для полей таблицы "Table No.". RecRef.OPEN(Rec."Table No.", FALSE); RecRef.RESET; RecRef.FILTERGROUP(2); WHILE Filter.NEXT <> 0 DO BEGIN IF Filter.Filter <> '' THEN BEGIN FieldRef := RecRef.FIELD(Filter."Field No."); FieldRef.SETFILTER(Filter.Filter); END; END; RecRef.FILTERGROUP(0); //1 вызвать default Lookup форму для RecRef; //2 ИЛИ скопировать фильтр из RecRef в TableRec(соответствующего типа) Хотелось бы знать, можно ли это вообще это сделать и если да, то как?? Заранее всем спасибо за все идеи. А с фильтрами попробуйте так (правда два раза пробегаться по фильтрам придется). Код: RecRef.OPEN(Rec."Table No.", FALSE); RecRef.RESET; WHILE Filter.NEXT <> 0 DO BEGIN IF Filter.Filter <> '' THEN BEGIN FieldRef := RecRef.FIELD(Filter."Field No."); FieldRef.SETFILTER(Filter.Filter); END; END; TableRec.RESET; TableRec.SETVIEW(RecRef.GETVIEW); RecRef.RESET; RecRef.FILTERGROUP(2); WHILE Filter.NEXT <> 0 DO BEGIN IF Filter.Filter <> '' THEN BEGIN FieldRef := RecRef.FIELD(Filter."Field No."); FieldRef.SETFILTER(Filter.Filter); END; END; RecRef.FILTERGROUP(0); |
|
28.11.2006, 14:06 | #9 |
Участник
|
Ура!!!
Нашёл способ скопировать фильтр из RecRef в TableRec, чтобы при этом выставить нужный FilterGroup. Оказывается, это надо делать так: TableRec.SetView(RecRef.GetView()); TableRec.FilterGroup(2); Непонятно только, почему FilterGroup нужно вызывать уже после того, как поставили View на Record, но всё работает, фильтр нельзя снять Помогла ссылка: http://dynamicsuser.net/forums/thread/5945.aspx |
|