AX2012是自带生成QR二维码的类,能够很方便的用在SSRS报表中,下面演示如何在RDP的报表中使用二维码,首先从定义临时表开始:express
字段URL是要用于二维码的字符串,QrCode是container类型,保存最终生成的二维码图形二进制数据。ide
DP类:ui
class TestQrCodeDp extends SRSReportDataProviderBase { TestQrCodeTmp qrCodeTmp; } [ SRSReportDataSetAttribute(tableStr(TestQrCodeTmp)) ] public TestQrCodeTmp getQrCodeTmp() { select qrCodeTmp; return qrCodeTmp; } public void processReport() { container imageContainer; str url='http://www.cnblogs.com/duanshuiliu/'; EFDocQRCode_BR qrCode = new EFDocQRCode_BR(); imageContainer = qrCode.generateQRCode(url); qrCodeTmp.clear(); qrCodeTmp.URL=url; qrCodeTmp.QrCode=imageContainer; qrcodeTmp.insert(); }
这里使用类EFDocQRCode_BR来生成二维码图片并保存在container中,从后缀名看应该是巴西地区的feature,图片默认为bmp格式。这个类是对.net的Microsoft.Dynamics.QRCode.Encoder类的封装,AOT的C#工程QrCode包含了完整的代码。编码
EFDocQRCode_BR内部调用的是Microsoft.Dynamics.QRCode.Encoder.GetTempFile(),它将二维码图片保存在临时文件后,在AX中使用BinData读取临时文件内容到container,若是你不想使用这种临时文件的方法,但愿在内存中直接实现,能够以下直接使用.net的Encoder:url
public void processReport() { Microsoft.Dynamics.QRCode.Encoder qrCode=new Microsoft.Dynamics.QRCode.Encoder(); System.Drawing.Bitmap bitmap; container imageContainer; str url='http://www.cnblogs.com/duanshuiliu/'; System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); bitmap=qrCode.Encode(url); bitmap.Save(memoryStream, System.Drawing.Imaging.ImageFormat::get_Png()); imageContainer=Binary::constructFromMemoryStream(memoryStream).getContainer(); qrCodeTmp.clear(); qrCodeTmp.URL=url; qrCodeTmp.QrCode=imageContainer; qrcodeTmp.insert(); }
生成的二维码图片被编码为Png格式保存在container,最后插入到临时表中。spa
建立SSRS报表,使用这个RDP做为dataset,图片在precision design或者auto desgin上均可以使用,好比下面的auto design:.net
设置图片的source为Database,相应的MIME Type,expression则是dataset的二维码数据字段。code
最后的预览效果:orm
拿出你的手机扫扫看吧。blog