|  25.03.2016, 12:43 | #1 | 
| Участник |  lookup в полях диалоговой формы в ssrs отчетах. 
			
			Добрый день, уважаемые форумчане. Объясните пожалуйста, как правильно делать lookup в полях диалоговой формы в ssrs отчетах.  есть поле DialogField dlgResponsibility; при выборе нужно отобразить 2 поля из таблицы OfficialsTable. Это поля Name(тип - str, extDT - Name) и Position(тип - enum, enumType - OffPosition); и при выборе поля передать в отчет значение поля Position. Сейчас отображается только значение поля Position. С АХ работаю недавно, никак не получается это реализовать. Вот код метода main RC класса. X++: public static void main(Args _args) { CorporateIncomeTaxRC controller = new CorporateIncomeTaxRC(); Dialog dlg; DialogField dlgResponsibility; OffPosition responsibility; ; dlg = new Dialog(); dlgResponsibility = dlg.addField(enumStr(OffPosition)); controller.parmArgs(_args); if(dlg.run()) { responsibility = dlgResponsibility.value(); controller.parmResponsibility(responsibility); Controller.parmReportName(ssrsReportStr(CorporateIncomeTax, Design)); controller.parmShowDialog(false); controller.startOperation(); | 
|  | 
|  25.03.2016, 12:52 | #2 | 
| Участник | 
			
			DialogField dlgField; ; dlgField= dlg.addField(Field); 
				__________________ Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу) | 
|  | 
|  25.03.2016, 13:02 | #3 | 
| Участник | 
			
			Посмотрите на UIBuilder классы, они для подобных целей и были сделаны. В стандарте много готовых примеров. Ну или вот ссылочка https://community.dynamics.com/ax/b/...namics-ax-2012 | 
|  | 
|  25.03.2016, 13:11 | #4 | 
| Участник | 
			
			DialogField dlgField; ; dlgField= dlg.addField(Field); Или я не правильно понял, или это добавление еще одного поля. А мне нужно на одном выпадающем поле отображать значение двух полей из таблицы. | 
|  | 
|  25.03.2016, 13:17 | #5 | 
| Участник | 
			
			Извиняюсь, это я не так понял.
		 
				__________________ Бывает, что человек молчит, когда ничего не знает о данном предмете, но чаще – когда знает о нем все. (Джордж Бернард Шоу) | 
|  | 
|  25.03.2016, 13:21 | #6 | 
| Участник | Цитата: 
		
			А мне нужно на одном выпадающем поле отображать значение двух полей из таблицы
		
	 Посмотрите ссылку, которую я привел выше. Вам нужно сделать по аналогии. | 
|  | 
|  25.03.2016, 13:44 | #7 | 
| Участник | |
|  | 
|  28.03.2016, 13:30 | #8 | 
| Участник | 
			
			В lookuap методах через UIBuilder классы я разобрался. Спасибо.  Возник еще один вопрос. Можно формировать диалоговые окна с лукапамы благодаря RunBase классу. А как из него запустить ssrs отчет? Что то никак не получается. | 
|  | 
|  29.03.2016, 12:12 | #9 | 
| Участник | Цитата: В диалоговом окне есть 4 поля, из них для 2 делается лукап. одно из них работает правильно. А вот в другом лукап не отрабатывает. Подскажите пожалуйста что я сделал не так. весь день сижу, не могу понять  Вот сам код класса UIbilder CodePublicLookup отрабатывает ResponsibilityLookup нет. Ставил в нем брекпоинт, даже не заходит X++: class CustTransOpenRptUIBuilder extends SrsReportDataContractUIBuilder { DialogField dialogReportDate; DialogField dialogOrderNumber; DialogField dialogResponsibility; DialogField dialogCodePublic; } public void build() { CustTransOpenRptContract rdpContract = this.dataContractObject() as CustTransOpenRptContract; dialogReportDate = this.addDialogField(methodStr(CustTransOpenRptContract, parmReportDate), rdpContract); dialogOrderNumber = this.addDialogField(methodStr(CustTransOpenRptContract, parmOrderNumber), rdpContract); dialogResponsibility = this.addDialogField(methodStr(CustTransOpenRptContract, parmResponsibility), rdpContract); dialogCodePublic = this.addDialogField(methodStr(CustTransOpenRptContract, parmCodePublic), rdpContract); } public void CodePublicLookup(FormStringControl _ctrl) { Query query = new Query(); QueryBuildDataSource queryBuildDataSource; QueryBuildRange queryBuildRange; SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(TaxAuthorityAddress), _ctrl); sysTableLookup.addLookupField(fieldNum(TaxAuthorityAddress, GniCode_RU)); //sysTableLookup.addLookupField(fieldNum(TaxAuthorityAddress, Name)); queryBuildDataSource = query.addDataSource(tableNum(TaxAuthorityAddress)); //queryBuildRange = queryBuildDataSource.addRange(fieldNum(TaxAuthorityAddress, AccountNum)); //queryBuildRange.value("Zhed-000006"); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); } public void ResponsibilityLookup(FormStringControl _ctrl) { Query query = new Query(); QueryBuildDataSource queryBuildDataSource; QueryBuildRange queryBuildRange; SysTableLookup sysTableLookup = SysTableLookup::newParameters(tableNum(OfficialsTable_RU), _ctrl); sysTableLookup.addLookupField(fieldNum(OfficialsTable_RU, ReportType)); //sysTableLookup.addLookupField(fieldNum(TaxAuthorityAddress, Name)); queryBuildDataSource = query.addDataSource(tableNum(OfficialsTable_RU)); queryBuildRange = queryBuildDataSource.addRange(fieldNum(OfficialsTable_RU, Position)); queryBuildRange.value(enum2str(OffPosition_RU::Responsible)); sysTableLookup.parmQuery(query); sysTableLookup.performFormLookup(); } public void postRun() { //Dialog dialogLocal = this.dialog(); DialogField dialogResponsibilityPR; DialogField dialogCodePublicPR; super(); //dialogLocal.dialogForm().formRun().controlMethodOverload(false); //dialogLocal.dialogForm().formRun().design().caption("Customer open transactions"); //Use a label dialogResponsibilityPR = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(CustTransOpenRptContract, parmResponsibility)); dialogResponsibilityPR.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(CustTransOpenRptUIBuilder, ResponsibilityLookup), this); dialogCodePublicPR = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(CustTransOpenRptContract, parmCodePublic)); dialogCodePublicPR.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(CustTransOpenRptUIBuilder, CodePublicLookup), this); } X++: [
    DataContractAttribute,
    SysOperationContractProcessingAttribute(classStr(CustTransOpenRptUIBuilder))
]
class CustTransOpenRptContract
{
    TransDate           reportDate;
    OrderNum_KZ         orderNumber;
    OffReportType_RU    responsibility;
    GniCode_RU          codePublic;
}
[
    DataMemberAttribute('codePublic')
]
public GniCode_RU parmCodePublic(GniCode_RU _value= codePublic)
{
    codePublic = _value;
    return codePublic;
}
[
    DataMemberAttribute('responsibility')
]
public OffReportType_RU parmResponsibility(OffReportType_RU _value = responsibility)
{
    responsibility = _value;
    return responsibility;
}
//функции даты и ордер нам не привожу. Они аналогичные. | 
|  | 
|  30.03.2016, 21:08 | #10 | 
| Участник | 
			
			В ssrs есть "фича" которая кеширует диалог Лечится так: Зайти на репорт сервер через браузер http://100.0.0.1/Reports/ (ip подставить своего), найти отчет, удалить его там и задеплоить заново из студии. Чтобы наверняка, еще можно сбросить кеш и рестартануть reporting service службу | 
|  | 
|  30.03.2016, 21:28 | #11 | 
| Участник | Цитата: 
		
			CodePublicLookup отрабатывает ResponsibilityLookup нет. Ставил в нем брекпоинт, даже не заходит ResponsibilityLookup строится на типе OffReportType_RU. Конечно не будет отрабатывать. Это же base enumeration. Там сразу биндятся все значения энама и лукап даже не используется. Точно так же как и в обычных формах. И точно так же как в обычных формах вам нужно будет финтить ушами, если хотите показывать не все значения из base enumeration. Вам точно нужно показывать только определенные значения OffReportType_RU или не принципиально? | 
|  |