在员工自助服务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员工自助服务中的产品不能显示图片的问题的更多相关文章

  1. [AX]AX2012 R2 出差申请和支出报告

    AX2012中有个模块叫做出差和支出,用于管理出差以及相关的费用,用户只能在员工自助服务EP站点上提交出差申请.费用报销报告,在Client程序中做审核以及后续的支付动作等,最后形成相关的财务分录. ...

  2. [AX]AX2012 R2 HR Jobs, Positions, Department和Workers

    部门.作业(Job的官方翻译)和位置(Position的官方翻译)是AX人力资源管理的基本组织元素,Job和Position在AX有的地方又称作工作和职位,其实这个翻译更为恰当. Job定义的是一个工 ...

  3. Dynamics AX 2012 R2 SSRS报表在VS2010中预览没有数据

    今天,Reinhard 在VS中制作SSRS报表,预览的时候发现显示不出数据. 仔细检查了数据处理环节和临时表里的数据,都发现没有问题. 用同事的账号登陆同样的开发环境,发现他的账号可以在VS中预览到 ...

  4. [AX]AX2012 R2 采购订单的“Request change”

    在采购订单List或者Detail窗口的操作面板上有一个叫做“Request change”的按钮,如果这个按钮是激活的,采购订单不能直接编辑,而必须先使用这个按钮请求修改后,采购订单才能进入编辑状态 ...

  5. win7中资源管理器不能显示图片预览的解决方法

    在用xp的时候,在资源管理器里面预览图片文件是在普通不过的事情了.换到win7之后,图片文件一直不能预览,只是显示图标还挺烦的.肯定是哪里设置的不对,下午闲来无事,找到是哪里的问题了. 如果你也遇到相 ...

  6. 【Vue中的坑】vue项目中动态绑定src不显示图片解决方法

    v-for绑定src的数据如下: data() { return { img_src:"../../assets/images/mirror-service.png" } } 渲染 ...

  7. Dynamics AX 2012 R2 外部程序运行在没有AD的环境(如PDA) 调用AX服务

        Reinhard对这个问题研究了很久,也查了一些资料,整理了三种解决方案. 1.准备一台虚拟机A,A加入到了AD活动域,可以操作AX. PDA以远程桌面的方式,连接到虚拟机A. 在虚拟机上运行 ...

  8. 在工作组的环境中配置Windows 2012 R2的远程桌面服务

    在工作组的环境中配置Windows 2012 R2的远程桌面服务 How to configure Remote Desktop Service in Windows 2012 R2 workgrou ...

  9. [译]Dynamics AX 2012 R2 BI系列-规划分析的注意事项

    https://msdn.microsoft.com/en-us/library/gg731898.aspx       在开始实施AX的分析特性前,有很多事情要考虑.本文描述了你必须考虑的事情,和在 ...

随机推荐

  1. jquery ajax 无刷新上传

    var form = new FormData(); form.append('file', $("#submitmaterials").find("input" ...

  2. jce_policy安装【java密码扩展无限制权限策略文件安装】

    下载与JDK或JRE对应版本的jce文件包,当前机器的jdk为1.8,所以下载jce_policy-8.zip. 下载地址:http://www.oracle.com/technetwork/java ...

  3. 微信小程序——购物车数字加减

    上一篇,我们有讲到如何造一个购物车弹层.今天来说一下,购物车数量的加减如何实现. 主要思路就是在data里面定义一个属性,属性值就是这个数量.点击+的时候就+1,点击-的时候就-1,再结合setDat ...

  4. combobox无法显示选中的数据,都是undefined

    $('#firstfactor').combobox({                url: '@Url.Action("GetMultiAirFactor_Day_New", ...

  5. R语言-查看加载包、卸除加载包及安装包与卸载包

    在R语言中,常需要看哪个包加载了或是看多个相似功能的包,看到底是哪个包在起作用,通过加载和卸除后进行运行比较分析. 1.查看已加载的包 >(.packages()) 注意外面的括号和前面的点不能 ...

  6. 关于Unity中RectTransform和Transform

    以前一直以为在Inspector面板上的是Transform,后来才发现原来2D是RectTransform,3D是Transform 3D面板上显示的是位置坐标组件Transform,2D面板上显示 ...

  7. Ogre1.9 源码编译

    我们首先需要下载. 1.cmake http://www.cmake.org/download/ (选择window安装包最方便) 2.Ogre1.9源代码 https://bitbucket.org ...

  8. SQLSERVER中统计所有表的记录数

    SQLSERVER中统计所有表的记录数 利用系统索引表sysindexes中索引ID indid<1的行中的rows列存有该表的行数这一特点.    方法是利用隐藏未公开的系统存储过程sp_MS ...

  9. qualcomm lk gpio

    关于高通平台lk中控制gpio的记录 http://blog.csdn.net/loongembedded/article/details/72834761 http://blog.csdn.net/ ...

  10. Linux中的链接文件_软链接和硬链接

    一.链接文件介绍 Linux操作系统中的“链接文件”分为硬链接(hard link)和软链接(symbolic link).两种链接的本质区别在于inode.以下是详细介绍: 硬链接:当系统要读取一个 ...