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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 20.11.2006, 14:07   #1  
yauhen is offline
yauhen
Участник
 
28 / 10 (1) +
Регистрация: 20.11.2006
Надо вызвать 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  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
Цитата:
Сообщение от yauhen Посмотреть сообщение
на этапе компиляции неизвестен id таблицы
На этапе компиляции ???


Можно поподробнее?
Если вы используете RecordRef, то я так понимаю - таблиц не очень много.
можно Case использовать и насильно формы прилагать.


Или задача в чем-то другом?
Старый 20.11.2006, 18:19   #3  
yauhen is offline
yauhen
Участник
 
28 / 10 (1) +
Регистрация: 20.11.2006
да, на этапе компиляции не известен id таблицы. Этот id мы получаем во время выполнения из одной специальной таблицы.
Использовать Case - это конечно solution, но трудно расширяемый, так как если понадобится добавить ещё пару таблиц в список, то придётся редактировать этот самый Case, что не есть хорошо.
А всё это нужно для того, чтобы реализовать возможность использовать и создавать query. В Navision почему такой возможности поумолчанию нету, и очень зря.
Старый 20.11.2006, 19:31   #4  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
Ну, можно извратиться и сделать форму-список, основанную на Integer. Передавать RecordRef. И выводить на форме, например только ключевые поля.

Изврат, конечно, но зато можно, нажав LookUp видет список... и даже нажать Ok
Старый 20.11.2006, 20:12   #5  
yauhen is offline
yauhen
Участник
 
28 / 10 (1) +
Регистрация: 20.11.2006
Ну хотелось бы вызвать полноценную форму, на которой бы отображались не только ключевые/Integer поля.
Кстати, походу возник ещё один вопрос, как скопировать фильтр из переменной типа RecordRef в переменную типа Record (способ скопировать поотдельности фильтр для каждого поля не подходит) ??
Старый 20.11.2006, 20:33   #6  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
Цитата:
Сообщение от yauhen Посмотреть сообщение
Ну хотелось бы вызвать полноценную форму, на которой бы отображались не только ключевые/Integer поля.
Ну почему же Integer - можно и значения полей....

Цитата:
Сообщение от yauhen Посмотреть сообщение
Кстати, походу возник ещё один вопрос, как скопировать фильтр из переменной типа RecordRef в переменную типа Record (способ скопировать поотдельности фильтр для каждого поля не подходит) ??
Пример
Код:
Customer.SETFILTER("Salesperson Code",'*SER*');
Customer.SETFILTER(City,'*олг*');
RecRef.GETTABLE(Customer);
Customer2.RESET;
Customer2.SETVIEW(RecRef.GETVIEW);
Старый 21.11.2006, 11:25   #7  
yauhen is offline
yauhen
Участник
 
28 / 10 (1) +
Регистрация: 20.11.2006
Если использовать 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  
randrews is offline
randrews
Участник
Аватар для randrews
 
312 / 10 (1) +
Регистрация: 06.12.2004
Цитата:
Сообщение от 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(соответствующего типа)

Хотелось бы знать, можно ли это вообще это сделать и если да, то как??
Заранее всем спасибо за все идеи.
default Lookup не получится вызвать.

А с фильтрами попробуйте так (правда два раза пробегаться по фильтрам придется).

Код:
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);
Да, и не забудьте, что SETVIEW и ключ передает
Старый 28.11.2006, 14:06   #9  
yauhen is offline
yauhen
Участник
 
28 / 10 (1) +
Регистрация: 20.11.2006
Ура!!!
Нашёл способ скопировать фильтр из RecRef в TableRec, чтобы при этом выставить нужный FilterGroup. Оказывается, это надо делать так:

TableRec.SetView(RecRef.GetView());
TableRec.FilterGroup(2);

Непонятно только, почему FilterGroup нужно вызывать уже после того, как поставили View на Record, но всё работает, фильтр нельзя снять
Помогла ссылка: http://dynamicsuser.net/forums/thread/5945.aspx
 


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

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

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