数据流程控制指南.docx
- 文档编号:23822257
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:46
- 大小:520.36KB
数据流程控制指南.docx
《数据流程控制指南.docx》由会员分享,可在线阅读,更多相关《数据流程控制指南.docx(46页珍藏版)》请在冰豆网上搜索。
数据流程控制指南
秋葵软件OA-ERP高级设计
OA-ERP数据流程控制指南
目录
§1基本意义………………………………………………………………………………………………
§2.数据流程的其它情况…………………………………………………………………………………
(1)虚拟清单
(2)查询并选择记录
(3)BOM展开
(4)MRP运算
(5)SN码快速录入区的数据转移
(6)任意的C++程序控制
(7)设置流程事件,在保存单据、或审核记录时,自动产生后续单据
(8)设置按钮功能,以便从前单据主动产生后续单据
(9)清单向清单的数据转移
(10)清单向清单转移数据时的控制提升选项
(11)典型示例,入库单多仓库自动分解、不合格品数量分解、负数业务自动转换为相反业务、过滤掉不继续流转的项目(例如劳务项目不出库入库)
(12)数据流转中,字段值的锁定
(13)数据明细的合并显示
§3.示例…………………………………………………………………………………………………
1
3
18
§1.基本意义
本文所述数据流程,指数据在流转中的数据值的转移、回写、控制等,是一整套方案。
我们先看基本的意义。
例1,在销售订单中,选择客户,那么系统自动从客户资料中带出联系方式,电话,付款方式等。
例2,在入库单中选择销售发货单,那么系统自动带出销售发货单中主单据的信息,同时也带出清单中的信息。
例3,在单据明细中选择物品,那么系统自动带出规格、单位、批号、单价等信息。
我们看例1中的情况,
(1)选择客户名称
(2)系统根据设置在字段“ClientID”对应的控制单(下图)转移数据
(3)上面控制单的设置,由于是设置在字段“ClientID”上的,故设置位置如下
因此数据转移模式有如下几种情况
1
主单据
主单据
清单(一行到一行)
2
主单据
清单
清单(一行到一行)
3
清单
清单
清单(多行到多行)
4
清单
主单据
清单(多行到一行)
§2.数据流程的其它情况
上面叙述了最基本情况。
下面是其它可能的情况
(3)销售收款,选择了客户后,需要列出所有的未收款的明细。
这个问题中,主单据信息转移到主单据是没有问题的,但是,客户资料,根本没有清单,而且需要转移的清单,是销售发货单(或者是其它单据)的清单。
因此选择事件发生后,我们需要构造一个适当的数据集,然后赋值给这个“客户”记录,即构造一个虚拟清单,以便满足从清单到清单的转移。
(2)采购订单中选择生产单。
这个问题中,并不能从清单到清单转移,而是先要将清单每行,按照BOM展开,再转移到本清单。
(3)采购订单中选择不同“业务类型”,再选择“相关单据”进行数据转移时,源单据中的字段,不一定相同,但是都要转移到采购订单中特定字段,如何区分不同情况呢?
因此数据源的来源有如下几种情况
数据源的来源
1
单据本身的数据。
2
主单据数据+清单数据
3
按照BOM展开的数据。
4
按照查询条件产生的数据。
5
按照C/C++代码程序产生的数据。
6
按照上述组合产生的数据
作用
1
数据转移
2
总数控制,剩余数量、金额处理
3
单价控制
4
数据回写
5
数据处理完毕后,自动增加点位标记,或者原单据处理完毕
转移类型
1
Main,Main
2
Main,Items
3
Items,Items
4
Items,Main
(1)Main总是表示主单据
(2)当事件本身在清单发生时,清单提升为主单据,此时Main->Main的转移是一条记录对应一条记录的转移。
而Items->Items此时对应的是多条记录对应到多行的转移.
(3)Items一般是单据的清单,而且是实实在在的字段,如果为Items1,Items2等,那么要准确填写,防止错误转移。
(4)对于某记录的虚拟清单,例如前面所说的,选择客户,要列出没有收款的明细,由于“客户”记录并不象一张销售发货单一样存在清单,因此利用C/C++代码构造的清单,叫虚拟清单,虚拟清单一般起名为Items_1等,以便一看就知道这个不是正真的清单,因为并不存在这个字段。
(5)在设计单据时,选择“*数据转移控制单”,那么系统会出现如下操作选项
(一)数据流程控制的
数据流程控制的基本原理
1
源字段,回写字段,是原表单的。
2
目标字段
3
所有字段,都可能是漫游形式,求和形式(但是要合理)
例1,销售收款清单中的“本次收款”,“扣款金额”,对应于销售发货单中的总金额,因此目标字段为Nowpayed+NeedLessPay
例2,ClientID.hAreaDeliveraddr
4
C/C++代码构造的数据,一般可以发生在字段的“Fields_Selected”事件。
也可以发生在数据转移的过程中,但是要注意,如果是从虚拟字段的转移,那么第一次出现虚拟的字段的行,应该有代码,或者查询单号,否则系统无法取得清单,导致数据转移失败。
5
表单匹配序号,指数据源本身的表单序号(而不是主表单的序号--主表单的序号一般称为业务项目),是否与这里设置的相同,相同就处理,不同则跳过该行,这用于从不同数据源转移数据的情况。
支持英文“!
”号,!
190,表示,数据源表单不是190,才处理本行约定的事情。
多清单匹配使用“190,256”,“!
(190,256)”等。
6
C/C++代码用CPP.前缀,例如CPP.20215,指按照序号是20215的代码运行。
查询是PRINT.前缀,PRINT.30155,指本清单按照序号是30155的打印设计查询结果。
7
第5部分是参数,例如按照BOM展开,需要参数,这个数字请从“开发选项”窗口测试获得。
8
(1)数据转移发生在下拉框选择记录,手工输入完成后等情况。
(2)早期的数据转移,主要是靠字段的属性完成的。
(3)清单转移,早期靠业务处理设置中的字段“清单重复行判断字段(MoveItemsMap)”来实现的。
(4)新的流程控制,期望减少代码书写量、与难度;同时将数据流控制系统化、严谨化、直观化,而且容易满足细节。
9
(1)*.*类型的转移,指“同名同性”的字段的转移,但是对于设置了“禁止数据转移到本字段”,或者“首次录入为空”的字段,将不起作用。
(2)但是指明了名称的字段,将不再受任何条件的限制。
(3)一些细节问题,请参考系统中F1在线帮助说明。
10
其它控制功能
(1)BOM展开。
(2)合并,然后分类产生单据,例如采购订单窗口引用MRP单据。
(2)PRINT查询产生表单。
(3)从流程处理“点位设置”,或者原表单是否要“处理完毕”。
(4)从流程处理价格控制。
(仍然使用原先功能控制)
(5)SN码快速录入区的数据转移控制,转移数据由自动定位到的记录与代码产生。
(6)无引用的编辑框/单元格,的数据转移控制,转移数据由代码产生。
11
如何启用?
字段的“记录选择数据转移控制单”属性设置后,原来的功能就禁止了。
(这指对单个字段);没有启用的字段,原来的功能仍然有效。
12
SN码快速录入流程控制
(1)快速录入指在下面位置输入新信息,产生的流程控制转移
(2)此时并不自动产生单据,而是数据流程转移,其他类似普通数据流程。
$Amount将代表上面编辑框输入的数量。
源记录将是按照输入找到的记录。
另外通过下面字段可以取得用户输入的信息
$BarCode_Edit,$BarCode_AmEdit
(3)在该流程事件发生前会有一个“Event_InputBarcode”事件,请见《C/C++语言开发指南》
13
(1)处理类型汇总
按仓库分仓、按质检分解数量、负数流程处理为相反业务(出入库)、自动过滤劳务项目、部分单据按照BOM展开(销售出库)、MRP运算纳入流程控制
(2)处方法汇总
按照分组字段分解为多张单据、C++程序处理质检分解数量、过滤条件可以过滤掉一些原始明细数据、BOM/MRP运算选项
(3)过滤条件始终是条件不满足时不存在。
过滤条件中,第一部分是表单匹配码,其他部分是过滤条件,每部分用英文分号分隔。
例如
;2,(Product.SourceType-6)
第一部分不存在,但是英文分号不能少,第二部分有2部分组成,由英文逗号分开,这里的2,可以在开发参数中测试,若为0,也必须存在,例如
;0,(Product.SourceType-6)
意思是漫游到物品资料中查找需求类型,劳务项目-序号为6,时这里的结果为0,此时条件是不满足的,如用前面的参数2,那么这意味着该条件把本行清单过滤掉了,在其他情况下,是指本控制明细不起作用。
再看下面条件
;2,!
(Product.SourceType-6)
这里的英文!
号,是C/C++语言的运算符,它把结果反过来,例如计算出0,那么在经过该运算符,结果就是1,如是非0数,那么结果是0.
(4)C++程序,除了设置虚拟明细之外,事实上可以做任何事情,而且可以每行附加一个处理逻辑(C++程序)。
默认数据集是要转移的记录,如果记录并不存在,那么系统会传递一个母板的空白数据记录。
例如在主单据发生的事件,传递主单据空白记录,在明细清单发生的事件,传递明细清单空白记录。
目标数据集,则通过gDataSetds0(this,x1,NULL)等方式取得。
例如在模式2-3时,x1=2或3;模式1时,x1=0;
参数1为相应行次的字段”FieldName”的值,
参数2为该行的参数,对于MRP运算,BOM展开这个参数值允许程序动态改变,此时只要用setParameters(2,s1)将结果设置回去就可以了,当然不限于MRP/BOM,任何时候都可以返回向回设置这个值。
示例代码为系统内置的程序Cpp.16/19/23、以及后面示例等。
数据流程中内嵌的代码,只要返回负数,例如-1,系统将立即退出数据转移操作。
(5)对于BOM展开/MRP运算,转移清单“ItemsYYYY,Items”中,第一个ItemsYYYY必须是能够取得清单明细的清单字段,如果是虚拟字段,那么本行或前面行次的C++程序应该设置了该清单名称的数据明细,BOM展开/MRP运算之后的数据,系统将用于替换掉ItemsYYYY这个清单名称的数据,然后再进行转移。
如果在一行明细中同时存在BOM展开/MRP运算+C++程序,那么C++程序先发生,因此C++程序可以设置、过滤、或按照特定方式构造用于BOM展开/MRP运算需要的运算对象。
同样C++程序可以做任何事情。
另外,BOM展开/MRP运算默认的数量字段是,如果清单没有这个字段运算会失败。
返回-1表示终止、清单匹配、过滤等照样生效,以便处理不同业务、或者不同类型的单据时使用不同的逻辑。
当然BOM展开+MRP运算不能在同一行发生,原理上讲可以在同一个控制处理中发生。
至于什么意义,将来或许有人尝试。
14
(一)选择查询结果,进行数据转移。
当我们拉开物品编码字段时,系统列出物品名称供操作员选择。
这是最基本的项目选择方式。
实际上,用户可以输入查询条件,查询任何可能的数据,再列表供用户选择,这个最终结果再进行数据转移。
例如在“办公用品领用单[809]”物品编码编辑框下拉,弹出对话框
输入条件后,系统弹出查询数据供选择
在每行,按空格键切换选择项目,回车后系统将选择的结果转移过来
设置方式与其他数据流程类似,不同的几点如下
(1)在输入C++代码的地方,要明确输入PRINT.328类似表达式,因为默认的序号为C++的。
(2)这里的PRINT.328,意味,你必须有一张查询报表设置(328),以便系统查询数据。
(3)为了通用起见,查询的目标表单名可以设置在PRINT.328的后面,例如上面的PRINT.328,156。
意思是查询156-采购收货明细。
如果这里没有设置查询目标,那么就以328号报表的设置为准。
15
(二)根据单据已输入的条件查询
当我们在窗口中已经输入了条件时,就不必再弹出条件对话框了。
例如
要求是只弹出已经选择的生产的物品,由于生产单已经选择,故不应该再弹出查询条件窗口,而应该直接根据条件查询结果,供用户选择。
示例见PRINT.337。
这里说明设置原理。
参数设置
这个值测试出来放置的位置是
设置了这个选项,那么根据那些字段查询呢?
请看PRINT.338
即要有一行类型设置为"*流程查询条件字段对表",字段对
"MainCode,Relateid_XCode;"则是一对一对的,每对用分号隔开,内部用逗号隔开。
每对字段的第二个字段是我们在操作窗口输入的条件,这个示例中是Relateid_Xcode(生产单),第一个字段(这里是MainCode),是要查询数据的窗口中对应的字段(因为前后窗口中的字段并不是一致的)。
有了这些设置,那么查询就ok了。
注意C++程序也可以直接控制需要用户选择记录的方式,函数是UserSelect(),请查看C++开发指南。
16
清单向清单的数据转移
例如,在销售收款单中,我们选择了清单1单据后,
系统要把这些单据的清单(不包括未选择的单据的清单)列举出来放置在物品明细清单(默认系统没有把这些字段显示出来,请自己设置他们,或者参考销售发票)
那么这个过程就是清单向清单的数据转移。
请参考系统默认的Print.334控制单,以及相应的内嵌C++代码。
当用户在这个清单输入了数量、结算单价后,系统又要把这里的金额合计起来,再分配到收款明细清单中去。
注意,这个过程没有使用数据转移,而是使用的Fields_Selected事件,这个事件与"收款数量","结算单价"都有关系,因此给这个两个字段都设置的有这个事件,事件本身是CPP.41,请注意其中蕴含的分配算法。
请注意,这里实际上完成了多对多的处理逻辑,如果需要,用户可以自行任意设置。
我们现在一同介绍另外两点知识
数据明细的合并显示。
单据转移的选项1.31
(1)数据明细的合并显示
在前面的显示物品明细时,其实是把物品合并显示的,例如单据A有物品A1,B1,单据B也有A1,B1,如果不合并,那么就要显示4行,合并后仅仅是2行。
那么系统是如何实现这个功能的呢?
我们首先说明,这个清单的字段分为3组,一组是完全相同取值的字段,例如物品Product、单价Price等;第二组是不显示的,但是保持不同取值的字段,例如T_Code、M_Code、Pratice、Relateid_Xcode(PracticeTable),注意这里不包括Code、I_Code等肯定不同的字段;第三组是合并时要求和的字段,例如:
Amount、AmountLeft、Summoney等。
那么,请将第二组字段设置为尺码字段,选项2.3;第二组字段设置为与尺码配套的字段,选项2.5.就可以了。
注意,假如只有一个尺码字段,结果就如同服饰系统的尺码矩阵,因此这里总是需要有2个或2个以上的尺码字段,选项2.5属性的字段数量不限制。
最后,那些关键的数量字段,需要设置它的最大值控制字段,否则的话,系统无法分解他们到合并前的明细中去,同时他们的最大值也无法实时控制,不方便操作。
(2)单据转移的选项1.31
当我们前面在实现清单向清单转移数据时,我们必须先合并清单,否则的话会显示多行相同物品的明细,这不方便操作。
但是要实现这个功能,在把结果数据显示在清单前,要先把数据转移到内部的清单上去,此时数据转移在内存进行,这是会出现问题,内部的数据,例如清单的清单是不存在的,这与直接在表格处理有所不同。
因此需要把转移的控制提升到主单据进行,因为系统只做符合逻辑的事情。
因此选项1.31在这种情况下是必须的。
再注意,前面的物品清单2向清单1回写金额时不能使用数据转移,除非使用复杂的代码,因为这里只要能够计算出相关行的金额,分配精确就可以了。
数据转移往往是整行(至少是一行)完整替换。
而不是部分单元格的重新计算。
17
字段值的锁定
数据流转中,一些关键字段的值,往往不希望改变。
例如采购订单中的明细中的物品字段"Product",在后续单据,例如采购收货中不要改变,这个功能请使用"字段值的锁定"功能。
希望锁定的字段一般还有Specif、SP2、SP3,可能某些情况下,单价字段也是要锁定的。
系统默认了一些通用的,而对于那些较为特殊的需求,没有涉及,请按照这里的示例设置就可以了。
另外,"锁定的字段",支持表单匹配,但是不支持其后的过滤,目前基本上是够用的,或者对每个表单都指定一行锁定信息。
对于BOM展开、MRP运算,系统不支持锁定,因为这本身就不同,同时系统支持动态MRP、动态BOM的使用,因此锁定功能对他们是不适用的。
再就是是否允许手工做单,如果不允许,请在业务处理设置中设置3.26选项,此时该窗口的清单必须是引用前述单据的结果。
否则不给予保存。
18
参数说明
上述对话框中我们看到有一个参数,他们都有意义,他们都在开发选项中测试,下面是测试他们的名称
项目
开发选项中的测试项目名称
开发选项序号
BOM展开
BOM展开参数
30
MRP运算
MRP运算参数
142
PRINT查询
93
C++代码
g(s)etParameters
(2)
允许改变参数,假如同行次要使用的话,以这个改变的为准,请参考生产大纲产生MRP单据的参数设置方式。
跨表单回写,系统怎样支持?
暂时不支持这个功能,需要的话可以使用录入后事件处理。
19
(二)自动产生单据事件
上述所有内容,叙述的是引用前面流程的单据,产生数据转移,那么前述单据能否自动产生后续单据呢?
例如系统内部内置的销售订单审核后自动产生发货单,发货单审核后又自动产生出库单。
新增单据、审核单据、单据处理完毕时,系统允许,设置为自动产生单据的数据流程。
设置的方式如下
设置类型、参数、目标表单,如果流程控制,仅仅希望部分单据产生新单据,那么可以填写C++程序,该程序返回-1表示不再自动产生单据。
允许设置多行,因而可以产生多种类型的单据。
20
(三)手工产生单据功能
能否将产生单据的功能增加到窗口界面,允许用户选择呢?
例如
用户选择后出现提示
选择确定后自动产生MRP单据。
要设置这个功能,我们要准备这些东西
(1)C/C++代码,提供选择,或其他控制。
(2)设置流程控制单,最好是选择产生MRP单据的控制单,这样前后使用的是同一个流程控制单,便于维护。
(3)设置快捷按钮功能。
下面我们叙述这些内容
(1)C/C++代码,如下
1gDataSetds1(this,1,"Items");
2intcount1=ds1.GetCount();
4gStringArrayAS1;
5strings1="TCheckListBox:
";
6s1+="0.要考虑成品库存#N;";
7s1+="1.不考虑原材料库存#Y;";
8s1+="2.不考虑安全库存#Y;";
9s1+="3.不考虑在途库存#Y;";
10s1+="4.不检查以前的运算结果#Y;";
11s1+="5.运算结果,将成品过滤掉#Y;";
12s1+="6.运算结果,将半成品过滤掉#Y;";
13s1+="7.运算结果,将外协件过滤掉#Y;";
14s1+="8.运算结果,将原材料过滤掉#N;";
15s1+="9.-#N;";
16s1+="10.-#N;";
17s1+="11.计算1月份#N;";
18s1+="12.计算2月份#N;";
19s1+="13.计算3月份#N;";
20s1+="14.计算4月份#N;";
21s1+="15.计算5月份#N;";
22s1+="16.计算6月份#N;";
23s1+="17.计算7月份#N;";
24s1+="18.计算8月份#N;";
25s1+="19.计算9月份#N;";
26s1+="20.计算10月份#N;";
27s1+="21.计算11月份#N;";
28s1+="22.计算12月份#N;";
29AS1.Append(s1);
30AS1.Append("");
31AS1.Append("确定,放弃");
32intx1=AS1.InputMessage
(1);
33if(x1!
=0)return-1;
34x1=AS1.Index1(0).toInt();
35intx0=getParameters
(2).toInt();
36intx_0=x0;
37for(inti=0;i<5;++i)
38{into1=BTest(x1,i)?
1:
2;
39x0=BTest(x0,4+i,o1);
40}
41for(inti=5;i<9;++i)
42{into1=BTest(x1,i)?
1:
2;
43x0=BTest(x0,3+i,o1);
44}
45doubleAm1a=0;
46for(inti=0;i 47{ds1.MoveTo(i); 48doubleAm1=0; 49for(inti=11;i<23;++i) 50{if(BTest(x1,i)) 51{strings2=(string)"Month"+(i-10); 52Am1+=ds1.newGet2(s2); 53//printf("s2=%s,Am1a=%f",s2.c_str(),ds1.newGet2(s2)); 54} 55} 56ds1.newSet2("Amount",Am1); 57Am1a+=Am1; 58} 59if(Am1a<0.0001) 60{s1="NoAmountSelected."; 61s1.Warning(); 62return-1; 63} 64setParameters(2,x0); 65SetItems(ds1,"Items"); 66//printf("x_0=%d,x0=%d,Am1a=%f",x_0,x0,Am1a); 注意,这个段代码在流程控制事件内部运行, L1取得清单, L4-32显示对话框 L34取得用户返回的结果 L35取得流程控制单设置的默认参数 L37-44将用户设置的结果映射到参数x0,以便L64返回这个结果(MRP运算的参数请从开发选项中测试)。 L46-58累加用户期望要计算的月份的数量。 L65返回流程控制单需要清单,本行其实可以不要,因为从L1知道,这就是要流程使用清单,后面仅仅是累加了数量 (2)流程控制单 流程控制单完全是和MRP窗口引用单据时使用的控制单相同。 (见322号单据) 参数 显示标签 字段名或计算公式 备注 物料需求单MRPX,选择相关单据 Main,Main *,* Main,Main $Code,PracticeTable Main,Main Code,Relateid_XCode Main,Main Relateid_XCode,Relatei
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 流程 控制 指南
![提示](https://static.bdocx.com/images/bang_tan.gif)