在员工自助服务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. 微信小程序——倒计时功能

    做小程序项目中,需要做一个倒计时功能,如下图: 记录一下实现步骤: 1.考虑到这个功能可能会有多处用到,所以把倒计时的函数写在utils.js里面: const formatNumber = n =& ...

  2. underscore-1.8.3-analysis.js

    // Underscore.js 1.8.3 // http://underscorejs.org // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud an ...

  3. 【转】android如何实现开机自动启动Service或app

    1.今天我们主要来探讨android怎么让一个service开机自动启动功能的实现.Android手机在启动的过程中会触发一个Standard Broadcast Action,名字叫android. ...

  4. numpy opencv matlab eigen SVD结果对比

    参考 https://zhuanlan.zhihu.com/p/26306568 https://byjiang.com/2017/11/18/SVD/ http://www.bluebit.gr/m ...

  5. Ogre2.0 全新功能打造新3D引擎

    不知当初是在那看到,说是Ogre2.0浪费了一个版本号,当时也没多想,以为没多大更新,一直到现在想做一个编辑器时,忽然想到要看下最新版本的更新,不看不知道,一看吓一跳,所以说,网络上的话少信,你不认识 ...

  6. 第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码

    第三百三十五节,web爬虫讲解2—Scrapy框架爬虫—豆瓣登录与利用打码接口实现自动识别验证码 打码接口文件 # -*- coding: cp936 -*- import sys import os ...

  7. php生成二维码的几种方式[转]

      二维码是二维条形码的一种,可以将网址.文字.照片等信息通过相应的编码算法编译成为一个方块形条码图案,手机用户可以通过摄像头和解码软件将相关信息重新解码并查看内容.PHP可以使用php QR Cod ...

  8. php模拟post提交数据,用处很多,可用来网站的采集,登陆等等

    1. [代码][PHP]代码 <?php //以程序登陆一个论坛登录为例 function bbslogin($user_login, $password, $host, $port = &qu ...

  9. Java如何比较两个数组?

    在Java中,如何比较两个数组? 示例 以下示例使用equals方法来检查两个数组是否相等. package com.yiibai; import java.util.*; public class ...

  10. 查询sql server 表结构

    select column_name,data_type from information_schema.columns where table_name = '表名'