|
24.07.2013, 09:49 | #1 |
Участник
|
Вывод дисплей методов в 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 |
Участник
|
Значение какого поля лукап должен вернуть в вызывающую форму? дисплейного?
В качестве workaround можно заменить дисплейные методы временной таблицей. Последний раз редактировалось S.Kuskov; 24.07.2013 в 10:13. |
|
|
За это сообщение автора поблагодарили: user_ax (1). |
24.07.2013, 10:18 | #3 |
Участник
|
Цитата:
Да, дисплейного. 2ansoft, как это не возвращают? Если я добавлю хотя бы один lookpufield - дисплей методы возвращают мне значения Клас TableLookup_ru посмотрю, спасибо. Не создавал временные таблицы в аксапте ранее, подскажите, куда копать, пожалуйста. |
|
24.07.2013, 11:01 | #4 |
Участник
|
Цитата:
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 | #5 |
Участник
|
сontrolIdx в последствии используется в formRun методе в вызове:
formRun.selectMode(formRun.control(controlIdx)); - с какого контрола лукапа брать значение в наше поле я так понимаю... |
|
24.07.2013, 10:12 | #6 |
Участник
|
Создайте лукап на основе временной таблицы... эффективнее дисплеев и уберет проблему автоматом
|
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
24.07.2013, 10:15 | #7 |
Участник
|
А так просмотрите код:
// 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:40 | #8 |
Участник
|
Буду делать временную таблицу, спасибо всем большое за советы! +добавил
|
|
24.07.2013, 11:35 | #9 |
Участник
|
Цитата:
Не создавал временные таблицы в аксапте ранее, подскажите, куда копать, пожалуйста.
Пример лукапа на временной таблице переопределением 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 |
Участник
|
2ansoft, так и сделал, на performLookup выводит ошибку
Цитата:
Ошибка времени выполнения: FormRealControl Объект не имеет метода "text".
Последний раз редактировалось user_ax; 24.07.2013 в 12:25. |
|
24.07.2013, 12:39 | #11 |
Участник
|
|
|
24.07.2013, 12:43 | #12 |
Участник
|
Цитата:
Во временной таблице 2 поля: одно Real , второе String. Сейчас заменил оба поля во временной таблице на String - вываливается лукап...интересно |
|
24.07.2013, 12:51 | #13 |
Участник
|
Цитата:
Хотя при желании заставить можно вызовом this.PerformFormLookup(lookup.formRun()); вместо lookup.performFormLookup(); Однако у меня ядро 5.0.1500.3761 Последний раз редактировалось ansoft; 24.07.2013 в 12:56. |
|
24.07.2013, 13:43 | #14 |
Участник
|
Цитата:
Может в вашей версии это пофиксили. |
|
24.07.2013, 12:46 | #15 |
Участник
|
Не задумывался как то... а контролы ограничены по типам
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; } } |
|
Теги |
display, lookup, method, метод |
|
|