调用c4ws可被这个companySpecified害惨了

事情是这样的,一个老系统,用.NET的WebSite的模式开发的,其中用于调用Infor ERP LN的Web Services(SOAP)的方法,动态的传递company这个参数,C4WS后端始终读取到默认的公司。

这种WebReference的方式我以前没用过,都是自动拼装XML来调用C4WS的。一开始用了很多办法记录日志,想要知道到底传到后端的XML中的company是什么,到最后终于看到并没有传递正确的company,这才去找哪里控制的,终于注意到这里的companySpecified,默认值没有,但是一直是false。手动设置为true就解决了。

Loading

金蝶云星空(K3Cloud)中的核算维度

朋友公司在用金蝶云星空,他需要将凭证数据通过OpenAPI的方式下载到本地数据库,以便后续的一些业务分析,这个下载的接口对接起来挺方便的,轮训自增Id(作为凭证号)去获取每个凭证的数据和分录。其中有用到核算维度,这个概念跟Infor LN ERP财务模块中的Dimensions是同样的概念。

以下金蝶运行接截图均来自网络

01015b97af3420464cd0bef3eea136410df0.png

自定义核算维度后,关联到科目,并指定是否是必填。

Loading

Infor ERP LN中序号被占用怎么解决?

如果你遇到系统断线等异常情形,可能会出现如下类似的报错。

大概的意思是某个号码被占用了。

以前的BaaN 5时代可以直接找到First Free Number这个Session,在LN中需要从Numbers Group的Session中找到相应的序列,并修改其First Free Number。

Loading

Infor LN ERP在线帮助、用户手册

又有新同事来问我有没有LN ERP的宝典,可以学习一下的。

除了让他看已经录制的微课短视频以外,还提示他善用F1来看实时的帮助文件。

最后我推荐他到Infor的官方网站来看Infor Documentationhttps://docs.infor.com/zh-cn/,这里以中文版为例,登录进去以后长这样:

然后选择ERP & Finance下的LN

这时候,你可以选择合适的ERP版本了,截止发文时间,默认是CE

你会发现有3个链接,分别对应

Infor LN UI 用户手册简体中文2021-04-29
Infor LN 联机帮助简体中文2021-07-13
Infor LN Documentation List CEEnglish2021-07-02

我们切换到10.4,也是我现在用的版本

Infor LN ERP 10.4在线手册:https://docs.infor.com/zh-cn/ln/10.4

当然了你还可以切换到其它版本,我都帮你列好了!

Infor LN ERP 10.7在线手册:https://docs.infor.com/zh-cn/ln/10.7

Infor LN ERP 10.6在线手册:https://docs.infor.com/zh-cn/ln/10.6

Infor LN ERP 10.5在线手册:https://docs.infor.com/zh-cn/ln/10.5

Infor LN ERP 10.5在线手册:https://docs.infor.com/zh-cn/ln/10.3

Loading

非常规方式处理Oracle+.NET开发全球化的时区显示

咨询了几个大牛有关.NET开发中全球化的时区显示问题,大家的意见有三个:

1、使用UTC Time记录到数据库,展示的时候根据用户所选择的时区进行转换展示
2、使用固定时区DateTime记录到数据库,展示的时候根据用户所选择的时区进行转换展示
3、记录timestamp到数据库,选择DateTime.UTCTime转为秒或毫秒级别的timestamp,展示的时候转为时间类型,并根据用户所选择的时区进行转换展示

大部分人喜欢1,其次是3,最后是2

而我今天要分享的这个Oracle数据库下的开发,有个前提就是我不能修改数据库,也不能修改写入数据库的时间是指定时区的,因为Infor LN ERP中更新此时间字段,幸运的是它本来就是UTC Time。

但是呢,我不能直接用第1条方案,因为我有些筛选条件,根据用户的日期(时间)还需要筛选数据,那么我不想:既修改展示阶段的时间时区,又修改查询时候的输入时间。

于是就有了今天的非常规方案:sessiontimezone

当我们在Oracle数据库中执行以下SQL时,可以知道数据库的时区和我当前连接的时区。

SELECT BTIMEZONE,SESSIONTIMEZONE,TZ_OFFSET(DBTIMEZONE),TZ_OFFSET(SESSIONTIMEZONE) FROM DUAL;

那么我们就可以使用:TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24,来动态的展示当前连接所在时区的时间了

SELECT TO_CHAR(A.T$CNFT + TO_NUMBER(SUBSTR(TZ_OFFSET('" + GetUserTimeZone() + "'),1,3))/24, 'YYYY-MM-DD HH24:MI:SS') AS ConfirmedTime FROM MYTABLE A

此处的GetUserTimeZone就是根据当前用户的市区设置,读取到一个“-5:00”或”6:00″形式的TimeZone。

至于用户的时区是根据用户所属的国家来还是根据用户的个人设定,这里的逻辑可以灵活设定优先级。

虽然非常规方案可以满足需要,但是不具备普遍性,性能上也会很依赖Oracle数据的配置。

如果您碰巧也有类似的场景,不妨试试这个方案。

Loading

Infor ERP LN的数据表里的两个隐藏字段:T$REFCNTD和T$REFCNTU

拿Item General Data的Table – tcibd001举例,如果你在数据库里直接查询,你会看到两个字段:T$REFCNTD和T$REFCNTU,图示如下:

但是,如果从LN里面的ttaad4500看表结构,你是看不到的。

这两个字段有什么用呢?

refcntd – Referential Control Delete Mode
refcntu – Referential Control Update Mode

字段Refcntd存储一条记录的删除约束的数量
字段Refcntu存储一条记录的更新约束的数量。
只要通过Tools模块新增的表,这两个字段会自动添加到每个Baan/LN表中,您不必手动添加它们。

以下来自官方的介绍:

To guarantee referential integrity, the Baan/LN Database stores reference counters, which indicate how many times a record is used in a parent child relation. Since baan/LN can store each data in a several different database, we can not use the referential integrity mechanisms of the database itself. The field Refcntd stores the number of delete constraints to a record, the Refcntu stores the number of update constraints to a record. These fields are automatically added to each Baan table so you do not have to add them manually.

Only if the reference counter is zero, can the parent record be deleted.
Reference counters are only applicable if the Referential Control Delete Mode (refcntd) or Referential Control Update Mode (refcntu) in the relation is “Restricted (with counter)”.

为什么要说这个呢

重点来了,有时候,你需要从外部程序往Baan/LN的表写记录,那么就得考虑给这两个字段赋值的问题了。

别忘了在你的语句中增加这两个字段,比如:(T$REFCNTD,T$REFCNTU) VALUES (0,0)

至于为啥赋值为零,我这个新表其实没啥关联的表,那么都默认为0了。

好了,春节将至,特以此文收官祝广大Infor ERP LN/Baan战友们2021牛年大吉大利、身体健康、万事如意!

Loading

.Net下请求Infor LN ERP WebService的5种方式

随着这几年Restful API的兴起,Web API遍地都是。以前老的WCF、WebService等的SOAP的份额越来越少。但总有些古老的应用或者企业级如ERP应用还是通过Web Service的方式提供对外集成接口。Infor LN ERP就是其中一个。

我这几年尝试了以下5中方法,与LN进行对接。

1、客户端代理类
2、动态代理类
3、WebClient
4、WebRequest
5、HttpClient

但前两种已经被我放弃了,后三种呢其实都是HTTP Request,通过标准的写法都可以很方便的与LN对接,注意两点:

1、拼接发起请求的XML
2、LN WebService返回500报错的时候,报错信息的转换
3、不要直接用using的方式使用HttpClient,因为由来已久的高并发时无法释放资源的bug,会让你崩溃。

至于后面三个方法,你可以从网络上找到一大把的Util/Helper类库,我就不贴出来了。

Loading

通过Infor LN ERP中的EAN字段来聊聊UPC和Code 128

很多人一提起条码(BarCode),我就犯嘀咕,因为我不知道他们每个人所表达的是否是一个东西。

因为条码实在太多了,一维的,二维码,图书的,行业专用的。如果打开BarTender软件,你会发现选择如下。而GS1只是GTIN是全球贸易项目代码(Global Trade Item Number)的一个数据来源而已。

我们常见的微信二维码用得是 QR Code,图书用的是ISBN,商场超市买的很多物品是EAN或UPC编码。

言归正传,在我们Infor LN ERP里面的General Item Data里面有个可以维护EAN的地方,截图如下,红色框里的按钮是我们的客户化定制,连接了一个Web,会自动传递当前的Item Code,如果未匹配过EAN Code,就会自动从已购买的清单里面分配一个,如果已获取就直接显示出来。这个Web页面后台有个数据库,记录着Item Code和EAN Code的一一对应,同时也有一个所有的EAN Code的清单,这个是从第三方机构付费购买的。

如果是美国的公司,这里的EAN Code大概率都是用UPC-A编码,因为UPC(Universal Product Code)码是美国统一代码委员会制定的一种商品用条码,主要用于美国和加拿大地区。

UPC条码也有标准版和缩短版两种,标准版由12位数字构成,缩短版由8位数字构成。

标准版的UPC12的编码结构为:系统码(1位)+厂商码(5位)+商品码(5位)+校检码(1位)。

后来随着欧洲、亚洲、澳洲的需求,增加了一位国家代码,就是第一位,UPC也变成了13位了。美国和加拿大的国家码是0。

标准版的UPC13的编码结构为:国家码 (1位)+ 系统码(1位)+厂商码(5位)+商品码(5位)+校检码(1位)。

而EAN(European Article Number)码是国际物品编码协会制定的一种商品用条码,已经在全球90多个国家和地区使用,通用于全世界。

分配给中国物品编码中心的前缀区间为690-696,再由中国物品编码中心统一分配企业代码,产品代码则由制造商根据规定自己编制。

贴一张最近在国内热销的酒精制品的商品条码图,你用微信扫一扫就能看到来自中国物品编码中心的查询信息。

标准EAN13编码结构为:国家码(2/3位)+厂商码(5/4位)+商品码(5位)+校检码(1位)。

对比一下EAN和UPC的编码,你会发现这两个条码简直一模一样,宽度、高度、条码粗细,位置。不同处是
1、EAN把国家码打在左侧条码内外侧,而UPC是只讲国家码打在条码外侧
2、而最后一位5,EAN打印在条码内测,UPC打印在外侧。

所以当你看到左右两侧都有数字的时候,就是UPC码,卖到美国和加拿大的。

再回到上面看我贴得医用酒精消毒棉片,看看到底是UPC还是EAN?

因为EAN码是在UPC码基础上形成的,所以,在技术上EAN系统的光电阅读器可以阅读UPC系统的条码,而UPC系统的光电阅读器却不能阅读EAN码。

从位数上看的出区别,所以美国亚马逊的商品默认用UPC的话,一旦要上架到欧洲市场,就可以简单的在UPC编码前增加0变成13位的EAN码即可。

亚马逊规定,要在亚马逊上传商品每个商品都需要相对应的条码,UPC码或者EAN码都行。当然了EBay也有同样的要求!中国区的用户可以去亚马逊官方指定的供应商购买,网址:www.barcodestalk.com。

上面是大概的价格,当然购买中国区的到中国物品编码中心官网: http://www.ancc.org.cn/ ,价格上除了一次性加入费用,还有胶片制作费和系统维护费。

说了这么多了,你对EAN和UPC的定义、差别、价格、用途等都了解过了,再来看下Code 128,这个其实在我们仓库、生产运营中更常见,我们常见的生产工单、料号、数量、批次、波次等信息大都用这种条码形式来打印。最普通的扫描枪也能识别这个条码。Code 128可以接受标准数字和大写字母,小写字母,特殊字符,所以除了在企业内部管理,在物流、仓储领域应用非常广泛。

到此为止,我们把Infor LN ERP应用最多的条码就介绍完毕了,如果你还有其它问题,欢迎留言探讨。

Loading

Infor ERP LN有用的Session whinp1200m000: Rebuild Planned Inventory Transactions

在仓库的Inventory Planning模块,可以看到Planned Inventory Transactions(whinp1500m000)可以看每一个Item Code在某个仓库的计划进出状态及明细,当然了这里的数据也会反映在计划模块的Item Order Plan(cprrp0520m000)上,但有很多时候,因为网络中断或者其它原因造成在其它业务模块所操作的订单,未能正确的在此处进行必要更新,就造成了不同步。

比方说采购员取消一个采购订单行的时候,如果订单行取消成功了,但此处未更新,就会造成看到还有一笔Open的待收货订单,当然了跑MRP的话,也会根据此错误信息来下采购单。

其实很多时候,我们应该用事务处理,就是一旦失败,就回滚操作,但因为业务逻辑太复杂,此处并未使用事务操作。正因为如此,才有了一个标准的Session – whinp1200m000,你可以通过这个Session来模拟运行来检查一下你公司的系统数据时候有问题。

注意这里有个选项:Update Mode,默认是模拟Simulate,如果要修正数据记得勾选为Update。

Loading