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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.07.2013, 09:49   #1  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Вывод дисплей методов в lookup форме
Доброе утро, уважаемые разработчики АХ.

Собственно, вопрос указан в заголовке темы. Имеется лукап поле на форме, в котором должны быть 2 значения. Эти значения я беру display-методами. Однако лукап не работает лишь с 2 методами, ему необходимо хотя бы одно поле, то есть addLookupField. Если я добавлю хотя бы одно поле - лукап отлично отрабатывает.
Подскажите, в чём загвоздка. Буду рад любым советам. Заранее спасибо!

X++:
public void lookup()
{
    Query query = new Query();
    QueryBuildDataSource qbds_vendsp,qbds_vendsplist,qbds_purchl;
    PurchLine      purchl = PurchLine_ds.cursor();
    SysTableLookup sysTableLookup = SysTableLookup::newParameters(tablenum(PurchLine),this);

    ;
  
    // 3776 23.07.2013 ->
    sysTableLookup.addLookupMethod(tablemethodstr(PurchLine, SpQtyFree));
    sysTableLookup.addLookupMethod(tablemethodstr(PurchLine, idsp));
   //Если закомментировать addLookupField, выдаёт ошибку "Ошибка времени выполнения: FormRun(Объект), метод selectMode вызван с недопустимыми параметрами"
    sysTableLookup.addLookupfield(fieldnum(PurchLine, ItemId));
    // 3776 23.07.2013 <-

    // 3776 23.07.2013 ->
    qbds_purchl = query.addDataSource(tablenum(PurchLine));
    qbds_vendsp = qbds_purchl.addDataSource(tablenum(VendSpListJour));
    qbds_vendsp.addLink(fieldnum(PurchLine,InternalSp),fieldnum(VendSpListJour,InternalSp));
    if (purchTable.RContractAccount)
    {
        qbds_vendsp.addRange(fieldnum(VendSpListJour,RcontractAccount)).value(SysQuery::value(purchTable.RContractAccount));
        qbds_vendsp.addRange(fieldnum(VendSpListJour,SpClosed)).value('0');
        qbds_purchl.addRange(fieldnum(PurchLine,ItemId)).value(SysQuery::value((purchl.ItemId)));
    }
    else
    {
        qbds_vendsp.addRange(fieldnum(VendSpListJour, idSp)).value(SysQuery::valueEmptyString());
    }
    // 3776 23.07.2013 <-


    sysTableLookup.parmQuery(query);

    sysTableLookup.performFormLookup();

Последний раз редактировалось user_ax; 24.07.2013 в 09:52.
За это сообщение автора поблагодарили: wojzeh (1).
Старый 24.07.2013, 10:09   #2  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,440 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Значение какого поля лукап должен вернуть в вызывающую форму? дисплейного?

В качестве workaround можно заменить дисплейные методы временной таблицей.

Последний раз редактировалось S.Kuskov; 24.07.2013 в 10:13.
За это сообщение автора поблагодарили: user_ax (1).
Старый 24.07.2013, 10:12   #3  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Создайте лукап на основе временной таблицы... эффективнее дисплеев и уберет проблему автоматом
За это сообщение автора поблагодарили: S.Kuskov (1).
Старый 24.07.2013, 10:15   #4  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
А так просмотрите код:
// this method should not be called before the actually lookup column has been added
void addLookupMethod(str _method)
{
;
this.addLookupControl(0, false, _method);
}
void addLookupfield(fieldId _fieldId, boolean _returnItem = false, str _method = '')
{
this.addLookupControl(_fieldId, _returnItem, _method);
}
ДИСПЛЕЙ МЕТОДЫ НЕ ВОЗВРАЩАЮТ ЗНАЧЕНИЕ В ПОЛЕ ЛУКАПА...
За это сообщение автора поблагодарили: user_ax (1).
Старый 24.07.2013, 10:18   #5  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Значение какого поля лукап должен вернуть в вызывающую форму? дисплейного?

В качестве workaround можно заменить дисплейные методы временной таблицей.

Да, дисплейного.

2ansoft, как это не возвращают? Если я добавлю хотя бы один lookpufield - дисплей методы возвращают мне значения

Клас TableLookup_ru посмотрю, спасибо.

Не создавал временные таблицы в аксапте ранее, подскажите, куда копать, пожалуйста.
Старый 24.07.2013, 10:40   #6  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Буду делать временную таблицу, спасибо всем большое за советы! +добавил
Старый 24.07.2013, 11:01   #7  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
Сообщение от user_ax Посмотреть сообщение
Да, дисплейного.

2ansoft, как это не возвращают? Если я добавлю хотя бы один lookpufield - дисплей методы возвращают мне значения

Клас TableLookup_ru посмотрю, спасибо.

Не создавал временные таблицы в аксапте ранее, подскажите, куда копать, пожалуйста.
Смотреть сюда я полагаю:
boolean _returnItem = false
Если _returnItem = true то это то, что вернется в поле лукапа или первое поле!!!
Смотреть сюда:
X++:
protected FormBuildGridControl buildGrid(FormBuildGridControl _formBuildGridControl,
                                         FormBuildDataSource  _formBuildDataSource)
{
    FormBuildControl                formBuildControl;
    Object                          obj;
    boolean                         returnItem;
    str                             method;
    int                             fieldId;
    int                             i;
    boolean                         lookupFieldSet = false;
    ;

    for (i = 1; i <= conlen(lookupItems); i++)
    {
        [fieldId, returnItem, method] = conpeek(lookupItems, i);

        if (!method)
        {
            formBuildControl = _formBuildGridControl.addDataField(_formBuildDataSource.id(), fieldId);

            if (!lookupFieldSet || returnItem
           {
                controlIdx = formBuildControl.id();
                lookupField = fieldId;
                lookupFieldSet = true;
            }

            if (labels[i])
            {
                obj = formBuildControl;
                obj.label(labels[i]);
            }
        }
        else
        {
            this.addMethodControl(_formBuildGridControl, _formBuildDataSource, method, i);
        }
    }

    return _formBuildGridControl;
}
Интересные строки:
if (!method)
{
formBuildControl = _formBuildGridControl.addDataField(_formBuildDataSource.id(), fieldId);

if (!lookupFieldSet || returnItem) {
controlIdx = formBuildControl.id(); lookupField = fieldId;
lookupFieldSet = true;
}
Старый 24.07.2013, 11:10   #8  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
сontrolIdx в последствии используется в formRun методе в вызове:
formRun.selectMode(formRun.control(controlIdx)); - с какого контрола лукапа брать значение в наше поле я так понимаю...
Старый 24.07.2013, 11:35   #9  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
Не создавал временные таблицы в аксапте ранее, подскажите, куда копать, пожалуйста.
TmpRecId - пример простейшей временной таблицы со свойством temporary = Да
Пример лукапа на временной таблице переопределением lookup() контрола:
X++:
public void lookup()
{
    TmpRecId tempTableExample;
    SysTablelookup lookup = SysTablelookup::newParameters(tableNum(TmpRecId), this);
    ;
    //super();

    tempTableExample.Idx = 1;
    tempTableExample.insert();

    tempTableExample.Idx = 2;
    tempTableExample.insert();

    lookup.parmTmpBuffer(tempTableExample);
    lookup.addLookupField(fieldNum(TmpRecId, Idx) /*, true - не обязательно, т.к. первое поле*/);
                                                  /*  по умолчанию возвращает значение в контрол*/
    lookup.performFormLookup();
}

Последний раз редактировалось ansoft; 24.07.2013 в 11:39.
За это сообщение автора поблагодарили: DiZa (0).
Старый 24.07.2013, 12:14   #10  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
2ansoft, так и сделал, на performLookup выводит ошибку

Цитата:
Ошибка времени выполнения: FormRealControl Объект не имеет метода "text".
Получается в лукапе можно только стринг вываливать?

Последний раз редактировалось user_ax; 24.07.2013 в 12:25.
Старый 24.07.2013, 12:39   #11  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
Сообщение от user_ax Посмотреть сообщение
Получается в лукапе можно только стринг вываливать?
Да нет. Вы на RealEdit лукап прилепляете я так понял...
Во временной таблице тип поля который из лукапа возвращается какой? Real?
Или String?
Старый 24.07.2013, 12:43   #12  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от ansoft Посмотреть сообщение
Да нет. Вы на RealEdit лукап прилепляете я так понял...
Во временной таблице тип поля который из лукапа возвращается какой? Real?
Или String?
Нет, лукап я прикрепляю на StringEdit.
Во временной таблице 2 поля: одно Real , второе String.

Сейчас заменил оба поля во временной таблице на String - вываливается лукап...интересно
Старый 24.07.2013, 12:46   #13  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Не задумывался как то... а контролы ограничены по типам
X++:
void performFormLookup()
{
    FormStringControl   callingStringControl;
    FormIntControl      callingIntControl;
    FormInt64Control    callingInt64Control;
    FormDateControl     callingDateControl;
    ;
    if (!callingControl)
        throw(error(Error::wrongUseOfFunction(funcname())));

    switch (callingControl.handle())
    {
        case classnum(FormStringControl):
            callingStringControl = callingControl;
            callingStringControl.performFormLookup(this.formRun());
            break;
        case classnum(FormIntControl):
            callingIntControl = callingControl;
            callingIntControl.performFormLookup(this.formRun());
            break;
        case classnum(FormInt64Control):
            callingInt64Control = callingControl;
            callingInt64Control.performFormLookup(this.formRun());
            break;
        case classnum(FormDateControl):
            callingDateControl = callingControl;
            callingDateControl.performFormLookup(this.formRun());
            break;
    }
}
Старый 24.07.2013, 12:51   #14  
ansoft is offline
ansoft
Участник
Аватар для ansoft
 
123 / 37 (2) +++
Регистрация: 20.10.2005
Цитата:
Сообщение от user_ax Посмотреть сообщение
Нет, лукап я прикрепляю на StringEdit.
Во временной таблице 2 поля: одно Real , второе String.

Сейчас заменил оба поля во временной таблице на String - вываливается лукап...интересно
У меня для StringEdit работает для возвращаемого real без проблем, а для RealEdit lookup вообще не открывается...
Хотя при желании заставить можно вызовом this.PerformFormLookup(lookup.formRun()); вместо lookup.performFormLookup();

Однако у меня ядро 5.0.1500.3761

Последний раз редактировалось ansoft; 24.07.2013 в 12:56.
Старый 24.07.2013, 13:43   #15  
user_ax is offline
user_ax
Участник
Аватар для user_ax
 
599 / 39 (3) +++
Регистрация: 07.10.2012
Адрес: ZP
Цитата:
Сообщение от ansoft Посмотреть сообщение
У меня для StringEdit работает для возвращаемого real без проблем, а для RealEdit lookup вообще не открывается...
Хотя при желании заставить можно вызовом this.PerformFormLookup(lookup.formRun()); вместо lookup.performFormLookup();

Однако у меня ядро 5.0.1500.3761
Я уже через stringedit сделал, спасибо за помощь вам

Может в вашей версии это пофиксили.
Теги
display, lookup, method, метод

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Итератор с поддержкой методов обратного вызова для обработки контролов на форме gl00mie DAX: Программирование 18 06.08.2013 22:16
Поля из разных таблиц в динамической Lookup-форме samolalex DAX: Программирование 8 06.06.2011 20:20
lookup фильтр в произвольной lookup форме 111andrei DAX: Программирование 4 05.10.2005 11:28
Сортировка и/или фильтры в lookup форме - howto. Maximin DAX: Программирование 5 07.06.2005 11:06
О Lookup-форме и FormFrame::Border NIMERE DAX: Программирование 3 22.03.2004 13:04

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

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

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