[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的分析特性前,有很多事情要考虑.本文描述了你必须考虑的事情,和在 ...
随机推荐
- 解决:No qualifying bean of type [org.springframework.jdbc.core.JdbcTemplate] found for dependency
错误: Description: Field jdbcTemplate in com.gwd.dao.impl.IUserDaoImpl required a bean of type 'org.sp ...
- Ubuntu free以及Linux内存占用大的解释
-bash-3.00$ free total used free shared buffers cached Mem: 514020 465932 48088 0 15864 348844 -/ bu ...
- 请教 JTable 里的单元格如何使得双击进入单元格后,单元格的内容处于全选中状态
http://bbs.csdn.net/topics/390195204 ———————————————————————————————————————— java 达人, 最近在开发一个 java ...
- 【转载】一文总结学习 Python 的 14 张思维导图
本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章). 首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,数据类型(数字,字符串,列表,元组,字典 ...
- 【转】JS对Cookie的读写删除
JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的.而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一种 ...
- CI框架 -- 密码哈希
哈希算法是一个单向函数.它可以将任何大小的数据转化为定长的“指纹”,并且无法被反向计算 依赖性 crypt() 函数需支持 CRYPT_BLOWFISH 常量 PASSWORD_BCRYPT PASS ...
- CI框架 -- 核心文件 之 Benchmark.php
Benchmark.php文件中定义的CI_Benchmark类可以让你标记点,并计算它们之间的时间差.还可以显示内存消耗. Benchmarking类库,它是被系统自动被加载的,不需要手工加载 cl ...
- (资源)Git优秀学习资源
在线教程 Try Git: Git初学者绝不能错过的Git上手资源. 廖雪峰Git教程: 比较系统的中文在线教程 易百Git教程 : 另一个比较全的中文在线教程 Git Immersion : A V ...
- maven中snapshot快照库和release发布库的区别和作用 (转)
Maven介绍,包括作用.核心概念.用法.常用命令.扩展及配置 http://www.trinea.cn/android/maven/ 本文来源于铁木箱子的博客http://www.mzone.cc ...
- 通过tarball形式安装HBASE Cluster(CDH5.0.2)——Hadoop NameNode HA 切换引起的Hbase错误,以及Hbase如何基于NameNode的HA进行配置
通过tarball形式安装HBASE Cluster(CDH5.0.2)——Hadoop NameNode HA 切换引起的Hbase错误,以及Hbase如何基于NameNode的HA进行配置 配置H ...