[AX]AX2012 R2 EP员工自助服务中的产品不能显示图片的问题
在员工自助服务EP站点中员工可以通过Order products自助提交采购申请,在正确设置员工采购目录后会罗列出允许员工购买的产品,每个产品都可带有图片,我们可以通过Product image来为产品添加图片(可以设置在Released product或者其Product/product master上),比如我们为一个产品添加一个Embedded类型的图片,程序提示我们选择一个图片文件,图片文件的数据保存在DocuValue表中(File字段),创建相应的DocuRef记录(用户看到的Attachment记录),同时创建相应的EcoResProductImage记录,创建204*204/48*48两个大小的缩略图(调用EcoResProductImageThumbnail.generateThumbnail),分别保存到EcoResProductImage的MediumSize和ThumbnailSize字段,这就是我们在客户端程序中看到的产品缩略图。
需要注意的是并非所有格式的图片都可以,添加图片时会通过Docu::validateExtension()判断文件后缀名是否有效,有效的文件格式在Organization administration>Setup>Document management>Document management parameters>File types维护,比如我们可以在这里添加PNG格式的图片文件格式。如果这里没有维护任何的格式,会调用DocuFileTypes.loadDefaults()装载默认的常用的文件格式,PNG图片不在其中。
另外一个要注意的是上图中我们选择附件类型为Embedded,它会将文件的内容保存到数据库,具体的设置在Organization administration>Setup>Document management>Document types。
在我的测试系统中打开产品列表时看不到产品的图片,都是显示一个红叉,看到网上也有网友反映这个问题,有建议的答案是需要执行System administration>Setup>Enterprise Portal>Publish images来发布图片到Sharepoint,我们来看看这个动作具体做了什么,大体的调用过程是:
1.[X++]SysEPDeploymentProxy.deployWebComponent()
2.[.NET,客户端程序目录下的Microsoft.Dynamics.Framework.Deployment.Portal.dll程序集]Microsoft.Dynamics.Framework.Deployment.Services.EPDeploymentService.DeployWebComponent()
3.[IIS]Web服务http://server/_layouts/EPDeploymentService/EPDeploymentService.asmx
4.[.NET,AOS执行文件目录下的Microsoft.Dynamics.Framework.Deployment.Portal.dll,比客户端目录下的同名程序集文件大小更大些]
Microsoft.Dynamics.Framework.Deployment.Portal.EPDepolymentService.DeployWebComponent
5.[.NET,程序集同上] EPDepolyment.DeployWebComponent()
6.[.NET,Microsoft.Dynamics.Framework.BusinessConnector.Proxy.dll] SysEPDeployment.DeployWebComponent()
7.[X++]SysEPDeployment.deployWebComponent()
可以看到的是执行过程从X++的SysEPDeploymentProxy.deployWebComponent()开始,途经.NET的WEB服务调用,最终又回到了X++的SysEPDeployment.deployWebComponent(),你可能会问,为什么不直接在X++中调用SysEPDeployment.deployWebComponent来发布,主要因为这个方法需要在运行EP Sharepoint服务的服务器上运行(通过注册表检查Sharepoint安装),另外还有运行用户的问题(通过WEB服务调用会使用Bussiness Proxy的用户账号运行)。作为测试,我们还是可以在EP服务器上运行下面的代码来发布图片:
static void TestPublishImages(Args _args)
{
#AOT
SysEPDeployment epDeployment = new SysEPDeployment();
str siteUrl; //Deploy Images for company: %1?
try
{
siteUrl = sysEPWebPageDefinition::getDevelopmentSiteUrl(); epDeployment.deployWebComponent(#ResourcesPath, siteUrl, siteUrl ); }
catch
{ throw error("@SYS329436");
} epDeployment.dispose();
}
SysEPDeployment.deployWebComponent()的作用是把包括Sharepoint网页定义、控件、Web module等WEB资源发布到sharepoint站点,上面我们传入的第一个参数是“\Resources”即AOT的Resources节点,程序转到SysEPDeployment.deployImagesOnServer()执行,它的第一个作用是读取AOT Resources下的图片资源通过deployImageOnServer()发布(实际上导出)图片到目录C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ep\images目录下,另外一个作用就是调用SysEPDeployment::deployCompanyImages()发布公司相关的图片,下面是相关的代码:
public static boolean deployCompanyImages(str layoutsEPPath)
{
#Web
container allImages;
BinData binData;
Bitmap bitmap;
str path = layoutsEPPath + #imagesDirPath;
int i, length; info (path);
allImages = SysEPDeployment::loopOverImagesInPartition();
length = conLen(allImages); for (i = ; i <= length; i +=)
{
bitmap = conPeek(allImages, i);
if (bitmap)
{
binData = new BinData();
binData.setData(bitmap);
binData.saveFile(path+'\\'+ conPeek(allImages, i+));
}
} // This will publish the Products original images from DMS tables.
CatCatalogProductImagesPublish::publishDocuValueImages(layoutsEPPath); return true;
}
deployCompanyImages()第一个重要的方法是loopOverImagesInPartition(),它轮询所有的Partition,通过runas()(如果调用请求来自于Web服务,需要跨越Partition边界获取数据,所以使用runas在所有Partition循环调用)调用SysEPDeployment.getImagesFromPartition(),后者的主要作用是查找CompanyImage、ECPPresentation、EcoResProductImage三张表中所有EDT类型为Bitmap的字段(比如前面看到的EcoResProductImage的MediumSize和ThumbnailSize字段),将字段中保存的图片内容提取出来,连同文件名保存到container,交由deployCompanyImages将图片以文件方式保存到目录C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ep\images下,文件命名方式为:'image_'+表.TableId+'_'+字段ID+'_'+记录RecId+'.'+图片文件后缀名。
deployCompanyImages()中另一个重要的方式调用CatCatalogProductImagesPublish::publishDocuValueImages(),它关联查询EcoResProductImage和DocuRef表,将图片数据从关联DocuValue中取出,同样保存到目录C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ep\images下,图片文件的命名方式和上面相同,只是这次表TableId固定为DocuRef的ID,字段ID固定为0。
通过上面的分析我们看到Publish images功能确实将系统中能看到的图片全部发布到目录C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\14\TEMPLATE\LAYOUTS\ep\images下,这个目录经过IIS映射的URL为http://<server>/_layouts/ep/images/,我们在EP中看到的图片也都是源于这个网络路径。在完成图片发布后,确确实实看到目录下有很多更改日期新近的图片文件,但是在IE中查看仍然看不到相关的产品图片,显示图片不可用的红叉。测试发现使用浏览器Chrome和Firefox访问EP站点时都能正常的看到这些图片,怀疑是IE自身的问题,但在多台电脑上不同版本IE都是一样。最后在使用图片浏览软件查看相关图片格式时发现这些图片虽然是.jpg的后缀名,但实际上是png的格式,我的数据来自于微软网址的Demo数据库,很是诧异这样的问题微软就没发现吗?难道测试程序员不是用IE?
根据图片的命名方式,我们不难找出图片来自于哪个表,比如上图张打开产品具体信息时显示的图片,图片名为image_97_0_5637146045.jpg和image_97_0_5637146044.jpg,很容易看出它们都来自于附件表(DocuRef.TableId=97)。
[AX]AX2012 R2 EP员工自助服务中的产品不能显示图片的问题的更多相关文章
- [AX]AX2012 R2 出差申请和支出报告
AX2012中有个模块叫做出差和支出,用于管理出差以及相关的费用,用户只能在员工自助服务EP站点上提交出差申请.费用报销报告,在Client程序中做审核以及后续的支付动作等,最后形成相关的财务分录. ...
- [AX]AX2012 R2 HR Jobs, Positions, Department和Workers
部门.作业(Job的官方翻译)和位置(Position的官方翻译)是AX人力资源管理的基本组织元素,Job和Position在AX有的地方又称作工作和职位,其实这个翻译更为恰当. Job定义的是一个工 ...
- Dynamics AX 2012 R2 SSRS报表在VS2010中预览没有数据
今天,Reinhard 在VS中制作SSRS报表,预览的时候发现显示不出数据. 仔细检查了数据处理环节和临时表里的数据,都发现没有问题. 用同事的账号登陆同样的开发环境,发现他的账号可以在VS中预览到 ...
- [AX]AX2012 R2 采购订单的“Request change”
在采购订单List或者Detail窗口的操作面板上有一个叫做“Request change”的按钮,如果这个按钮是激活的,采购订单不能直接编辑,而必须先使用这个按钮请求修改后,采购订单才能进入编辑状态 ...
- win7中资源管理器不能显示图片预览的解决方法
在用xp的时候,在资源管理器里面预览图片文件是在普通不过的事情了.换到win7之后,图片文件一直不能预览,只是显示图标还挺烦的.肯定是哪里设置的不对,下午闲来无事,找到是哪里的问题了. 如果你也遇到相 ...
- 【Vue中的坑】vue项目中动态绑定src不显示图片解决方法
v-for绑定src的数据如下: data() { return { img_src:"../../assets/images/mirror-service.png" } } 渲染 ...
- Dynamics AX 2012 R2 外部程序运行在没有AD的环境(如PDA) 调用AX服务
Reinhard对这个问题研究了很久,也查了一些资料,整理了三种解决方案. 1.准备一台虚拟机A,A加入到了AD活动域,可以操作AX. PDA以远程桌面的方式,连接到虚拟机A. 在虚拟机上运行 ...
- 在工作组的环境中配置Windows 2012 R2的远程桌面服务
在工作组的环境中配置Windows 2012 R2的远程桌面服务 How to configure Remote Desktop Service in Windows 2012 R2 workgrou ...
- [译]Dynamics AX 2012 R2 BI系列-规划分析的注意事项
https://msdn.microsoft.com/en-us/library/gg731898.aspx 在开始实施AX的分析特性前,有很多事情要考虑.本文描述了你必须考虑的事情,和在 ...
随机推荐
- office2016选择性安装
office2016在安装的时候并不像之前的版本有选择性的安装,安装器会安装一个office全家桶.那么如何自主选择安装自己需要的工具呢? 微软在下载中心中提供了Office2016部署工具(Offi ...
- 解决:According to TLD or attribute directive in tag file, attribute value does not accept any express。
http://blog.csdn.net/lzblog/article/details/22076893 ——————————————————————————————————————————————— ...
- I/O模型(同步、非同步、阻塞、非阻塞)总结
I/O:同步(synchronous).异步(asynchronous).阻塞(blocking).非阻塞(nonblocking) 1.I/O内部机制 出于安全考虑,用户程序(用户态)是没办法直接操 ...
- qt之QAbstractSocket
这QAbstractSocket 类提供了整个socket的类型,是QTcpSocket和QUdpSocket的基类 创建一个本体套接字,可以调用QAbstractSocket 和 setSocket ...
- 使用 pv 命令监控 linux 命令的执行进度
如果你是一个 linux 系统管理员,那么毫无疑问你必须花费大量的工作时间在命令行上:安装和卸载软件,监视系统状态,复制.移动.删除文件,查错,等等.很多时候都是你输入一个命令,然后等待很长时间直到执 ...
- USB学习笔记连载(二十):FX2LP如何实现高速和全速切换(转载)
CYPRESS的USB外设控制器CY7C68013A是一款广泛应用于USB打印机,手机,存储设备,USB测试等多个领域的经典产品.该产品符合USB2.0协议规范,支持full speed和high s ...
- 第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现搜索的自动补全功能
第三百六十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—用Django实现搜索的自动补全功能 elasticsearch(搜索引擎)提供了自动补全接口 官方说明:https://www.e ...
- e866. 确定可用外观
UIManager.LookAndFeelInfo[] info = UIManager.getInstalledLookAndFeels(); for (int i=0; i<info.len ...
- Python——eventlet.greenpool
该模块提供对 greenthread 池的支持. greenthread 池提供了一定数量的备用 greenthread ,有效限制了孵化 greenthread 过多导致的内存不足,当池子中没有足够 ...
- List&Map&Set的操作和遍历
Java的三大集合即:Set.List.Map. Set:代表无序.不可重复的集合,常用的有HashSet(哈希表实现).TreeSet(红黑树实现): List:代表有序.可以重复的集合,比较常用的 ...