Farseer

导航

Axapta中进销存报表的制作

进销存报表是库存报表中比较重要的一张,Axapta中自带了一些进销存报表,路径如下:
Inventory Management->Reports->Status->Physical Inventory这里面有两张报表,可以分别从产品维组和库房维组两个角度去看库房的数量.不过这张报表有两个让人头疼的事情:
1.只能查某个时间点的库存
2.效率实在是够......
本来想在原来的报表上添加一个起始时间了事,算出开始时间和结束时间的,两者相减,倒也挺省事的,没一会就搞定了,没想到没用了几个月,客户就抱怨了,额滴神那,要是选了全部的维组,又不选产品,改写后的报表简直让他等到花儿又谢了......
库房维组那张报表由一个RunBaseReport<-InventReport_DimParm<-InventReport_DimParmBase<-InventReport_DimSum<-InventReport_DimPhys来启动,这一系列的类实际上就是在不断地添加dialog中显示的字段而已,最后的查询语句由InventReport_DimSum的InitQuery()调用表InventDim的静态方法newQueryInventSum构造完成,这个方法有几个参数用于传递用户在界面上选择和指定的信息.
构造对话框的工作倒是可以继续用这些类来完成,继承InvnetReport_DimSum,添加几个自己想要的显示项,比如起始日期等.
一般情况下,进销存关注的无非就是某个产品在某个库房维组的期初(用户选择的起始日期的库存值)和期末(用户选择的结束日期的库存值)和本期发生值.
在InventSum这张表存放产品在当前各个库存维组中的值,里面有很多字段来存放对应的值,比如deducted,received等等,这些值对应于Inventtrans中的StatusIssue和StatusReceipt字段,这两个字段是枚举类型,分别代表入库和出库的各个状态.其中对于出库Sold代表财务出库,Deducted代表物理出库,对于入库Purchased代表财务入库,Received代表物理入库.
当然Axapta的库存状态做得比较细,还有一种情况就是Picked和Registed,这两个状态一个对应出库,一个对应入库,都会影响真实的物理库存,会使当前的可用物理库存量减少或增加,但不会做相应的物理过账动作,Picked和Registed的时间会记录在InventTrans的DateInvent这个字段,很多客户Picked和Registed跟物理过账是同时做的,甚至于不做Picked和Registed,目前接触到的这个客户Piced和Registed的时间跟物理过账的时间几乎是同时的,所以忽略这个差异,将PhysicalInvent-Picked+Registed,这样反减的时候就不用管InventTrans中处于Picked和Registed状态的记录了.
    我目前理解的话,要做财务过账,必然会做物理过账,但是可以不做Picked和Registed,于是InventTrans中对应StatusReceipt和StatusIssue小于等于2的值,DatePhysical必定会对应时间,但DateInvent却不一定会对应.这样如果把DatePhysical的时间做为物理入库的时间点来卡的话,比较方便,只需要一次查询就可以取出数据,但如果以DateInvent去卡,由于可以不做Piced和Registed,就必须分两次来取数据.其实Axapta原来的那张报表,它分了三部分来取数据,财务过账的,物理过账的,物理入库的.这样对于每个维组中的每个产品要分别查三次数据库,这也就是效率低的缘故了,但那样做确实严谨很多.针对一些具体的客户变通一下,使效率提高一点,效果会得多.
对于进销存我们更关注库房的物理状况,于是我们关注是做了物理动作的Inventrans,当然做了财务动作的交易,肯定是先做了物理动作,这个毋庸多言.于是我们只要关注InventTrans中的字段StatusIssue<=2 并且StatusReceipt<=2的交易.当然也可以关联InventTransPosting来筛选出满足条件的记录,不过我怎么喜欢这样关联.
首先从Inventsum表中的PhysicalInvent+Registed-Picked取得当前的物理库存数量,然后再取出日期大于用户输入的结束日期的所有交易的数量,sum一下,两者相减,得到期末值,同理取出日期大于用户输入日期(减去一天)的所有交易的数量,得到期初值,报表完成.

posted on 2006-08-08 21:17  佛西亚  阅读(1307)  评论(0编辑  收藏  举报