AX2012/D365 SSRS报表开发
大家好,好久没有做SSRS报表了,近期刚好有做2张,就整理起来供初学者参考。
AX中SSRS报表开发的框架,父类非常多,这里跟大家简单分享2种比较常用的场景供大家使用。
1.简单的过滤字段,无特殊过滤lookup需要重载,只需要通过扩展类型实现下拉数据,无过滤条件信息联动需求;
即可以使用Contract直接作为参数,DP作为数据源,使用Controller进行调用。
以下代码为核心框架代码,边沿代码已拿掉。
临时表Tmp使用表类型:TempDB:
Controller类:
{
public static ProdCostAnalysisController construct()
{
return new ProdCostAnalysisController();
}
{
ProdCostAnalysisController controller = ProdCostAnalysisController::construct();
controller.parmReportName(ssrsReportStr(ProductionCostAnalysis, Report));
controller.parmArgs(_args);
controller.startOperation();
}
class ProdCostAnalysisContract
{
TransDate dateFrom;
TransDate dateTo;
TransDate parmDateFrom(TransDate _dateFrom = dateFrom)
{
dateFrom = _dateFrom;
}
TransDate parmDateTo(TransDate _dateTo = dateTo)
{
dateTo = _dateTo;
}
SRSReportParameterAttribute(classStr(ProdCostAnalysisContract)),
SRSReportQueryAttribute(queryStr(ProdCostAnalysis))
]
class ProdCostAnalysisDP extends SrsReportDataProviderPreProcessTempDB
{
ProdCostAnalysisTmp prodCostAnalysisTmp;
CostAnalysisCostGroupTmp costAnalysisCostGroupTmp;
BOMCostGroup bomCostGroup;
{
}
public ProdCostAnalysisTmp getProdCostAnalysisTmp()
{
select * from prodCostAnalysisTmp;
}
public CostAnalysisCostGroupTmp getCostAnalysisCostGroupTmp()
{
select * from costAnalysisCostGroupTmp;
}
{
ProdCostAnalysisContract rdpContract;
TransDate dateFrom;
TransDate dateTo;
dateFrom = rdpContract.parmDateFrom();
dateTo = rdpContract.parmDateTo();
QueryBuildDataSource qbds = query.dataSourceTable(tableNum(ProdTable));
QueryBuildRange qbr = qbds.addRange(fieldNum(ProdTable, SchedEnd));
QueryRun queryRun = new QueryRun(query);
{
ProdTable prodTable = queryRun.get(tableNum(ProdTable));
InventDim inventDim = queryRun.get(tableNum(InventDim));
this.createReportData(prodTable, inventDim);
}
}

2.报表查询条件需要重载下拉,需要有联动处理过滤条件;
即可以使用Contract作为参数,绑定UIUIBuilder类,DP作为数据源,使用Controller进行调用。
以下代码为核心框架代码,边沿代码已拿掉。
临时表Tmp使用表类型:TempDB:
Controller类:
{
PrintBarCodeContract contract;
{
PrintBarcodeController controller = new PrintBarcodeController();
controller.parmArgs(_args);
controller.parmReportName(ssrsReportStr(PrintBarCode, Report));
controller.parmShowDialog(true);
controller.startOperation();
}
{
if (!this.parmArgs())
{
throw error(strFmt("@GLS221124", this.parmReportName()));
}
super();
{
switch (this.parmArgs().dataset())
{
case tableNum(WMSJournalTrans):
WMSJournalTrans wmsJournalTrans = this.parmArgs().record() as WMSJournalTrans;
contract = this.parmReportContract().parmRdpContract() as PrintBarCodeContract;
contract.parmSourceTableId(wmsJournalTrans.TableId);
contract.parmSourceRecId(wmsJournalTrans.RecId);
break;
ProdJournalBOM prodJournalBOM = this.parmArgs().record() as ProdJournalBOM;
contract = this.parmReportContract().parmRdpContract() as PrintBarCodeContract;
contract.parmSourceTableId(prodJournalBOM.TableId);
contract.parmSourceRecId(prodJournalBOM.RecId);
break;
}
}
}
DataContractAttribute,
SysOperationContractProcessingAttribute(classStr(PrintBarCodeUIBuilder), SysOperationDataContractProcessingMode::CreateUIBuilderForRootContractOnly)
]
class PrintBarCodeContract
{
TableId sourceTableId;
RecId sourceRecId;
Integer packagingQty, boxQty, innerQty;
[
DataMemberAttribute('SourceRecId'),
SysOperationDisplayOrderAttribute('4')
public RecId parmSourceRecId(RecId _sourceRecId = sourceRecId)
{
sourceRecId = _sourceRecId;
}
DataMemberAttribute('SourceTableId'),
SysOperationDisplayOrderAttribute('5')
]
public TableId parmSourceTableId(TableId _sourceTableId = sourceTableId)
{
sourceTableId = _sourceTableId;
}
DataMemberAttribute('PackagingQty'),
SysOperationDisplayOrderAttribute('1'),
SysOperationLabelAttribute(literalStr("@SYS50772"))
]
public Integer parmPackagingQty(Integer _packagingQty = packagingQty)
{
packagingQty = _packagingQty;
}
DataMemberAttribute('BoxQty'),
SysOperationDisplayOrderAttribute('2'),
SysOperationLabelAttribute(literalStr("@KKC0338"))
]
public Integer parmBoxQty(Integer _boxQty = boxQty)
{
boxQty = _boxQty;
}
DataMemberAttribute('InnerQty'),
SysOperationDisplayOrderAttribute('3'),
SysOperationLabelAttribute(literalStr("@SYS50777"))
]
public Integer parmInnerQty(Integer _innerQty = innerQty)
{
innerQty = _innerQty;
}
{
DialogField dialogpackagingQty;
DialogField dialogBoxQty;
DialogField dialogInnerQty, dialogTableId, dialogRecId;
PrintBarCodeContract contract;
WMSJournalTrans wmsJournalTrans;
{
contract = this.dataContractObject() as PrintBarCodeContract;
super();
dialogTableId.visible(false);
dialogRecId = this.bindInfo().getDialogField(contract, methodstr(PrintBarCodeContract, parmSourceRecId));
dialogRecId.visible(false);
dialogpackagingQty = this.bindInfo().getDialogField(contract, methodstr(PrintBarCodeContract, parmPackagingQty));
dialogBoxQty = this.bindInfo().getDialogField(contract, methodstr(PrintBarCodeContract, parmBoxQty));
dialogBoxQty.allowEdit(false);
dialogBoxQty.value(0);
dialogInnerQty = this.bindInfo().getDialogField(contract, methodstr(PrintBarCodeContract, parmInnerQty));
dialogpackagingQty.registerOverrideMethod(methodstr(FormIntControl, modified), methodstr(PrintBarCodeUIBuilder, packagingQtyModified), this);
if (contract.parmSourceTableId() == tableNum(WMSJournalTrans))
{
dialogInnerQty.visible(false);
select firstonly wmsJournalTrans
where wmsJournalTrans.RecId == contract.parmSourceRecId();
dialogpackagingQty.value(InventTable::find(wmsJournalTrans.itemId).TaxPackagingQty);
if (wmsJournalTrans.qty &&
dialogpackagingQty.value())
{
dialogBoxQty.value(roundUp(wmsJournalTrans.qty / dialogpackagingQty.value(), 1));
}
}
if (contract.parmSourceTableId() == tableNum(ProdJournalBOM))
{
dialogpackagingQty.visible(false);
dialogBoxQty.visible(false);
ProdJournalBOM prodJournalBOM = ProdJournalBOM::findRecId(contract.parmSourceRecId());
dialogInnerQty.value(prodJournalBOM.BOMConsump);
}
}
{
if (_dialogpackagingQty.modified() && _dialogpackagingQty.value())
{
dialogBoxQty.value(roundUp(wmsJournalTrans.qty / dialogpackagingQty.value(), 1));
}
if (!_dialogpackagingQty.value())
{
dialogBoxQty.value(0);
}
return true;
}
SRSReportParameterAttribute(classStr(PrintBarCodeContract))
]
class PrintBarCodeDP extends SrsReportDataProviderPreProcessTempDB
{
BarcodeTmp barCodePrintTmp;
PrintBarCodeContract contract;
public BarcodeTmp getBarcodeTmp()
{
select * from barCodePrintTmp;
}
public void processReport()
{
int i;
contract = this.parmDataContract() as PrintBarCodeContract;
{
WMSJournalTrans wmsJournalTrans;
where wmsJournalTrans.RecId == contract.parmSourceRecId();
{
Barcode barcode = Barcode::construct(BarcodeType::Code128);
InventDim inventDim = wmsJournalTrans.inventDim();
barcodePrintTmp.clear();
barcodePrintTmp.linenum = i;
barcodePrintTmp.BarCode = "*" + wmsJournalTrans.ItemId +"*";
barcode.string(true, barcodePrintTmp.BarCode);
barcode.encode();
barcodePrintTmp.BarCodeString = barcode.barcodeStr();
barcodePrintTmp.InventBatchId = inventDim.InventBatchId;
barcodePrintTmp.InventSerialId = inventDim.inventSerialId;
barcodePrintTmp.InventColorId = inventDim.InventColorId;
if (barcodePrintTmp.InventColorId)
{
barcodePrintTmp.ColorIdVisable = 1;
}
else
{
barcodePrintTmp.ColorIdVisable = 0;
}
barcodePrintTmp.UnitId = InventTableModule::find(wmsJournalTrans.itemId, ModuleInventPurchSales::Invent).UnitId;
if ((wmsJournalTrans.qty mod contract.parmPackagingQty()) == 0)
{
barcodePrintTmp.InnerBoxNum = contract.parmPackagingQty();
}
else
{
barcodePrintTmp.InnerBoxNum = (i < contract.parmBoxQty()) ? contract.parmPackagingQty() : (wmsJournalTrans.qty mod contract.parmPackagingQty());
}
barcodePrintTmp.InnerBoxQtyUnitId = strFmt('%1 %2', int2Str(barcodePrintTmp.InnerBoxNum), barcodePrintTmp.UnitId);
barcodePrintTmp.ItemName = InventTable::find(wmsJournalTrans.itemId).itemName();
barcodePrintTmp.ItemGroupName = InventItemGroup::find(wmsJournalTrans.inventTable().itemGroupId()).Name;
barcodePrintTmp.insert();
}
}
if (contract.parmSourceTableId() == tableNum(ProdJournalBOM))
{
ProdJournalBOM prodJournalBOM = ProdJournalBOM::findRecId(contract.parmSourceRecId());
Barcode barcode = Barcode::construct(BarcodeType::Code128);
InventDim inventDim = prodJournalBOM.inventDim();
barcodePrintTmp.clear();
barcodePrintTmp.linenum = 1;
barcodePrintTmp.BarCode = "*" + prodJournalBOM.ItemId +"*";
barcode.string(true, barcodePrintTmp.BarCode);
barcode.encode();
barcodePrintTmp.BarCodeString = barcode.barcodeStr();
barcodePrintTmp.InventBatchId = inventDim.InventBatchId;
barcodePrintTmp.InventSerialId = inventDim.inventSerialId;
barcodePrintTmp.InventColorId = inventDim.InventColorId;
if (barcodePrintTmp.InventColorId)
{
barcodePrintTmp.ColorIdVisable = 1;
}
else
{
barcodePrintTmp.ColorIdVisable = 0;
}
barcodePrintTmp.UnitId = prodJournalBOM.BOMUnitId;
barcodePrintTmp.InnerBoxNum = contract.parmInnerQty();
barcodePrintTmp.InnerBoxQtyUnitId = strFmt('%1 %2', int2Str(barcodePrintTmp.InnerBoxNum), barcodePrintTmp.UnitId);
barcodePrintTmp.ItemName = InventTable::find(prodJournalBOM.itemId).itemName();
barcodePrintTmp.ItemGroupName = InventItemGroup::find(prodJournalBOM.inventTable().itemGroupId()).Name;
barcodePrintTmp.insert();
}
}


3.报表开发中经常需要多选传值,从Controller传值到DP类,这里也介绍一种简单的方法;
3.1在Controller类的方法prePromptModifyContract中加入如下代码:
SRSReportRunPermission SRSRRPermission;
Contract.parmTmpTableDataRecId(SRSTmpTblMarshaller::sendTmpTblToDataProvider(BarCodeTmp));(合约类增加这个方法)
(
[
DataMemberAttribute('TmpTblDataRecId')
]
public RecId parmTmpTableDataRecId(RecId _tmpTableDataRecId = tmpTableDataRecId)
{
tmpTableDataRecId = _tmpTableDataRecId;
return tmpTableDataRecId;
}
)
SRSTmpTblMarshaller::sendTmpTblToDataProvider(BarCodeTmp);
CodeAccessPermission::revertAssert();
3.2在DP类中加入如下代码获取数据对象集合:
new SRSReportRunPermission().assert();
BarCodeTmp = SRSTmpTblMarshaller::getTmpTbl(contract.parmTmpTableDataRecId());
SRSTmpTblMarshaller::deleteTmpTblData(contract.parmTmpTableDataRecId());
CodeAccessPermission::revertAssert();
AX2012/D365 SSRS报表开发的更多相关文章
- [AX2012]在SSRS报表中获取从Menuitem传入的记录
在较早版本的AX中我们运行一个报表时会用到类RunBaseReport,从它扩展一个子类,再由它运行报表,一个典型的Axapta3中的例子: class ReportProdInfo extends ...
- SSRS 报表开发小技巧
说明: 开发工具为: SQL Server Data Tools (英文版) 开发环境为: SQL Server 2012 (英文版) 一. 饼图数据外部显示 首先我们来看3张效果图: 内部 ...
- WIN8 Metro UI 风格下的微软报表开发与设计 Metro UI SSRS - BIWORK
开篇介绍 作为 BI 系统前端展现的报表,其重要性不言而喻,我们对于一个好的报表的要求也无非主要包含以下几点: 1. 数据完整和正确,数据质量没有问题 2. 友好的清晰的界面,整洁美观,有得体的格式 ...
- 【Reporting Services 报表开发】— 交互式报表
我们知道,界面是人与系统间的对话方式,当使用者面对的是冷冰冰的界面,不但会造成使用者对于系统的热情减低,也会因为不便而产生诸多抱怨.尤其像报表时企业内几乎每日都会使用到的工具,因此,如何让使用者可以再 ...
- [AX2012 R3]在SSRS报表中使用QR二维码
AX2012是自带生成QR二维码的类,可以很方便的用在SSRS报表中,下面演示如何在RDP的报表中使用二维码,首先从定义临时表开始: 字段URL是要用于二维码的字符串,QrCode是container ...
- Dynamics AX 2012 R2 SSRS报表在VS2010中预览没有数据
今天,Reinhard 在VS中制作SSRS报表,预览的时候发现显示不出数据. 仔细检查了数据处理环节和临时表里的数据,都发现没有问题. 用同事的账号登陆同样的开发环境,发现他的账号可以在VS中预览到 ...
- 【Reporting Services 报表开发】— 表达式
一.常用的SSRS原始函数可以打开文本框的表达式中看到,如图1 图1 如下为SSRS中设计报表时常用的运算函数: 运算符/函数 说明 + 前后位数字则为加法,前后为字符串则为链接符号 - 数值减法 * ...
- [译]SSRS 报表版本控制
问题 如今商务智能应用广泛,对我们的商业愈加重要. 对新报表和的各种需求不断攀升. 自 SQL Server 2008 R2的 Reporting Services (SSRS) 开始,微软视图为减轻 ...
- SSRS报表服务随笔(rdl报表服务)-创建一个简单的报表
这段时间一直在敲rdl报表,在国内的不这么留在,在国外的话,还是挺流行的,国内的话,这方面的资料很少很少,也踏过不少坑 先从SSRS了解起,SSRS全称 SQL Server Reporting Se ...
随机推荐
- TPO3-2 Depletion of Ogallala Aquifer
Estimates indicate that the aquifer contains enough water to fill Lake Huron, but unfortunately, und ...
- Sampling Error|Sampling mean|population mean
7.1 Sampling Error; the Need for Sampling Distributions 样本均值的三种表达: Sampling distribution of the samp ...
- 堆优DIJ模板
Dij:贪心思想的单源最短路,时间复杂度O(n^2). Dij算法流程: d数组记录源点s到每个点的距离,若无边则设为inf,标记源点: 选出d数组中未标记的最小值,该节点记为k,并标记k为已求出最短 ...
- pytorch中的view函数和max函数
一.view函数 代码: a=torch.randn(,,,) b = a.view(,-) print(b.size()) 输出: torch.Size([, ]) 解释: 其中参数-1表示剩下的值 ...
- vuex-cart 介绍
使用vue2 + vuex + vue-cli + localStorage + less,实现本地储存的购物车. 安装 1 git clone https: 1 cd sls-vuex 1 npm ...
- 编程原理—如何用javascript代码解决一些问题
关于编程,我最喜欢的就是解决问题.我不相信有谁天生具有解决问题的能力.这是一种通过反复锻炼而建立并维持的能力.像任何练习一样,有一套指导方针可以帮助你更有效地提高解决问题的能力.我将介绍5个最重要的软 ...
- struts2和springmvc比较1
其实都是ssh只是一个是struts2+spring3.0+hibernate,而另外一个是 springmvc+spring3.0+hibernate,纵向来看比较struts2和springmvc ...
- python基础修改haproxy配置文件
1.通过eval(),可以将字符串转为字典类型. 2.Encode过程,是把python对象转换成json对象的一个过程,常用的两个函数是dumps和dump函数.两个函数的唯一区别就是dump把py ...
- 【转载】解决StackOverFlow不能登录的问题
解决StackOverFlow不能登录的问题 原创 2017年04月08日 13:32:21 标签: stack overflow / firefox / 浏览器 今天想着使用谷歌浏览器登录sta ...
- html常用事件
1.onblur 当窗口失去焦点时运行 2.click 点击鼠标触发的事件 3.onfocus 当窗口获得焦点时运行 4.oninput 当元素获得用户输入时运行 5.onsubmit 当提交表单时运 ...