像表单一样,可以定制报表以便增加或减少报表上的信息。还可以修改报表的设计和布局。同样地,报表的设计和布局依赖于数据表和报表本身的设置。最佳实践仍然是尽可能在数据表方法或元数据中设置商业逻辑。报表的X++代码必须处理具体报表的功能,所有其它X++代码一般必须在数据表级实现,以便在用到该数据表时重用这些代码。这样做的优点如下:
- 报表的定制是独立的;数据表的定制会影响用到该数据表的所有报表。使得在用到该数据表的任何地方,用户都有一致的体验。
- 报表的定制复制整个报表到当前层;而数据表的定制却不同,因为字段、字段组和方法的定制只复制自身到当前层。这使得升级和发布新版本更加容易。
- 报表的方法总是在生成报表时执行;而数据表的方法可以在服务器端执行。通过设置启动报表的菜单项的RunOn属性可以控制何时生成报表,是客户端、服务器端,还是调用时。
创建促销品
本文中的例子展示如何定制销售订单发票报表SalesInvoice。定制这个发票以包括基于发票上列出的物料的促销。促销显示在发票上相应物料的下面。下图所示的是显示促销“水瓶”的发票:
同表单的例子一样,本例子使用了Dynamics AX 的文档管理功能。你可以使用文档处理在数据库中存储文本和图像。用两个不同的文档信息,PromoText和PromoImage,存储文本和图像。并附加到item数据表。下图显示了新的文档类型:
下图显示了附加到item:PB-Bike的文本和图像:
用于在发票上显示促销的 X++代码在InventTable数据表中查找物料,搜索类型为PromoText和PromoImage的文档的文档处理以便打印在发票上。如果没有相应的文档,就不打印促销信息。
向发票报表中增加促销信息
在定制SalesInvoice报表之前,必须在设计报表时决定促销信息打印在何处。每个发票项的促销信息都必须打印,因此,应该放在CustInvoiceTrans section group,因为CustInvoiceTrans数据表包含了发票项。CustInvoiceTrans section group 包含有reference body section,reference body section可以打印其它参考信息,例如,库存维的信息,或发票项发货时产生的装箱单行信息。促销信息在何时打印,如何打印方面与这些参考信息类似。
在设计报表时新建InventTable section group,如下图所示:
实现Promotional 方法
虽然这个方法可以直接在报表中实现,但是,因为他们不仅限于这个报表,也可以在其它报表中重用,甚至还可以在表单中使用。因此,我们在InventTable数据表中实现这些方法。方法代码如下:
display server public DocuValueFile PromotionImage()
{
DocuRef docuref;
DocuValue docuValue;
;
select forceplaceholders firstonly tableid
from docuRef
where docuRef.RefCompanyId == this.DataAreaId &&
docuRef.RefTableId == this.TableId &&
docuRef.RefRecId == this.RecId &&
docuRef.TypeId == 'PromoImage'
join file from docuValue
where docuValue.RecId == docuRef.ValueRecId;
return docuValue.File;
}
display server public Notes PromotionText()
{
DocuRef docuref;
;
select firstonly notes from docuRef
where docuRef.RefCompanyId == this.DataAreaId &&
docuRef.RefTableId == this.TableId &&
docuRef.RefRecId == this.RecId &&
docuRef.TypeId == 'PromoText';
return docuRef.Notes;
}
这两个方法都是display方法,这允许他们可以直接绑定到报表控件,打印信息。
绑定display方法到报表控件
在设计报表时,在InventTable section group下创建一个新的body section:BodyInventTable,设置如下:
Settings | |
---|---|
NoOfHeadingLines | 0 |
LineAbove | Solid |
LineBelow | Solid |
LineLeft | Solid |
LineRight | Solid |
在BodyInventTable下新建string控件:PromotionText,和bitmap控件:PromotionImage。并且绑定到两个新的InventTable方法。设置如下:
Property | PromotionText | PromotionImage |
---|---|---|
Left | Auto (right) | |
Width | 70.00 char | 2.0 inch |
Height | 2.0 inch | |
DynamicHeight | Yes | |
ShowLabel | No | No |
Table | InventTable | InventTable |
DataMethod | PromotionText | PromotionImage |
在BodyReference body section下建立如下的方法:
void printInventTable()
{
InventTable inventTable = custInvoiceTrans
.inventTable();
if (inventTable.RecId)
{
element.send(inventTable);
}
}
void executeSection() {; this.printCustPackingSlipTrans(); this.printDimHistory(); this.printInventTable(); }
缺陷改进
void printInventTable()
{
InventTable inventTable = custInvoiceTrans
.inventTable();
if (inventTable.RecId &&
(inventTable.PromotionText() ||
inventTable.PromotionImage()))
{
element.send(inventTable);
}
}
性能改进
在报表的classDeclaration中增加如下代码:
DocuValueFile promotionImage;
Notes promotionText;
修改后的printInventTable方法如下:
void printInventTable()
{
InventTable inventTable = custInvoiceTrans
.inventTable();
;
promotionImage = inventTable.PromotionImage();
promotionText = inventTable.PromotionText();
if (inventTable.RecId &&
(promotionText || promotionImage))
{
element.send(inventTable);
}
}
在BodyInventTable body section下新建如下两个方法:
display Notes PromotionText() { return promotionText; }
|
display DocuValueFile PromotionImage() { return promotionImage; } |
注意事项
- 给物料增加图像文档:库存管理-物料-文档处理
- 图像文档的设置:基本设置-设置-文档管理-单据类型-常规,可设置文档是存在目录中还是数据库中,本例是存在数据库中
- 察看SalesInvoice报表:应收帐款-销售订单-查询-发票-显示-原件