还剩41页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
1.OA-ERP虚拟机C/C++数据工作模式42附录
2.OA-ERP支持的数据类型43附录
3.OA-ERP事件类型一览表50附录
4.C/C++基础54附录
[452]自动序号尽记录数:46330国固C X偏嗜I-.关闭刷新清空删除自定义设置修改式保存新增式保存查找综合处理•*采购收货单英文名|相关设置自定义•Q退货收货单(回写)a*仓库Q客户方订单号o质检单Q质检结果Q日期Q*采购员a负责人—备份Q对方经手人Q退货原因xExtraFieldsTable客户端重启后,下拉这个字段的编辑框,会弹出单据,选择后,系统会根据当前库存调整允许退货的数量这个事件可以在其它需要类似处理的字段共享例如四的进一步问题如果希望带回来的清单数量自动为3如果后面又没有填写,就不要保存怎么办呢?解决方法之一是,是在CallFunction(〃SelectSaleLoadCargo_PriceAdjust〃)后面增加代码,将清单的Amount字段去除掉;至于是否保存,系统已有的表单是这样处理的,自定义的表单字段,只要取正确特征码,也具有这个特点方案二,在清单字段,设置下面选项(因此一些情况下,不再需要这些代码了)而自选字段设置Jnl xi自选字段设置
[452]记录数:46430自动序号“241|国—91清空删除自定义设置修改式保存新增式保存查找.踪合处理英文名相关设置自定义.]Q质检结果O日期业不B*采购员
1.
13.*在明细清单中不显不Q负责人—备份
1.
14.快速输入字段
1.
15.必须埴写□对方经手人
1.
16.可以本适写□退货原因
1.
17.不能更改Q后续处理方式
1.
18.允许更改Q自定义字段
011.
19.该字段用于记录显示导航Q自定义字段02Q
1.
20.允许出现在查询条件中总金额
1.
21..禁止出现在查询条件中Q处理结束期限清单
1.
22.该字段禁止用于记录显示导航
1.
23.禁止数据自动转移到该字段O总税额
1.
24..该字段显示为*号Q备注
1.
25.单据审核后,允许有槌艮人员单独修改该字用Q操作员
1.
26.从该字段新起一个显小页签CTPageControl)Q审核员
1.
27.按照中文凭证格式显示Q审核日期
1.
28.禁止按照中文凭证格式显示
1.
31.单据审核时自动审核该字段引用的原单据Q Finish日期
1.
29.禁止下拉选择,只能输入
2.0JfM寻而田I
1.
30.允许选择设置为“允许使用未审核记录“表单•
2.
1.xExtraFi eldsTable例如五,记录选择后的事件对于一些行业,业务公司的营业执照到期后,不再允许发生业务此时可以定义营业执照到期字段,下面以为这个字段是“VisitTime〃来说明这个需求
(1)首先编写事件,代码如下代码片段一string sl=getParameters3;if si!=〃149〃si!=〃161〃return1;return0;1返回值仍然遵守标准规则,-1表示失败,返回1允许选择,返回0表示要系统按照默认方式再检查2这里使用了循环,因为用户可能选择多条记录,因此要逐一检查3xl=intnewGet2〃VisitTime〃中,因为newGet2返回float类型,而我们用int类型来接收结果,因此有强制类型的转换4string si二getParameters3获得第3个参数,所在窗口的序号,接下来就是说,如果不在销售订单窗口,也不在采购订单窗口,那么允许选择5如果希望有更多控制,那么可以使用如下类似的代码代码片段二:int i=0,il,xl,x2;double pricel;string sl=getParameters3;ifsl!=〃149〃sl!=〃161〃return1;fori=0;;++iil=MoveToi;{return0;s1=newGetX4VisitTime^;xl=intnewGet2,zVisitTimez,;x2=GetDateX-l,6;ifxlx2{gStringArray SAIthis;string s2=”本记录时间到期,〃;s2+=sl;SAI.Append s2;SAI.Append〃不选择〃;SAI.Append〃仍然选择〃;SAI.Append〃〃;int jl=SAl.ShowMessage;if j1=0return-1;return0;2然后为〃业务公司〃翻开业务处理设置窗口,增加Selection事件3客户端重启后,如果选择某个到期的业务公司,那么系统会有如下提示的业务公司业务公司[39]状态:当前数据记录数293:1自动序号20036Confiraati onlessage关闭帮助刷新清空删查找字段名称丽字段中查F^^^B^0006=21|客户类谙选择操作方式.-Q合肥市
1.不选择合肥市蓝晶北京
2.仍然选择D重庆是否继续O福建O广东,客户Q广西Q河北省湖北客户O河北省电力需停Q不选择Q国“Q武汉宜昌市哈尔滨湖公司类型:田“Q南.客户长[+]•Q春下次拜访日期:102008-06-21二],田Q拜访周期沱’、L…,次卬上你可以口一定“处理图x2=
1214150400.x1=1214060673注意L如果仅仅是针对有效期、禁用等,系统有默认的处理.,例如设置字段为有效期的检查,或者将记录设置有禁用不过上述原理,可以用于更广泛的目的注意2如果用户有事件,那么返回T表示禁止选择,1表示允许选择,0表示系统还要按照默认方式检查注意3参数说明string si=getParameters3返回第三个参数,这个事件的几个参数为getParameters0Event_Selection事件名称getParameters1“Ban Check或者Vaiid Check”辅助参数,指在做什么检测getParameters2记录窗口的序号getParameters3正在操作的窗口的序号例如六建立选择记录的事件Event_DropDownSetIterns一些时候,下拉框拉开时,我们希望完全按照我们的意愿建立需要选择的记录例如,采购订单中,业务类型拉开后显示如下工程:这些类型是系统默认的,可能发生采购的业务类型如果不需要其中一些,那么可以在业务类型的“业务选项〃页签设置,将某些类型去掉我们也可以完全指定,例如设置成“入库单、出库单〃在这里显示,而其它工程方而不在这里显示注意这并非联系,一些企业就是按照出库、或者入库来采购的在另外一些情况下,这类设置无法起作用,那么此时就可以考虑使用Event_DropDownSetItems下面代码就是说明如何仅仅让“入库单、出库单〃在采购订单中显示的例如int retl=O;int sl=intnewGet2z,Codez,;string s2=getParameters3;ifs2=〃149〃{if sl==158||sl=165{retl=l;else{retl=-l;return retl;注意1如果用户有事件,那么返回T表示禁止选择,1表示允许选择,0表示系统按照默认方式建立工程注意3参数说明string si二getParameters3返回第三个参数,这个事件的几个参数为getParameters0Event_DropDownSe111ems事件名称getParameters1DropDownSetILems记录窗口的辅助参数,指在做什么检测序号正在操作的窗口的序号getParameters2getParameters3例如七表单底色、字体颜色事件一些用户,期望在显示时候,根据不同情况显示不同颜色此时〃表单颜色事件〃就能够解决这类问题这里的例如是一家医药物流公司,希望在弹出式库存分布窗口,根据库存的有效期,显示不同颜色,以便及时处理1编写事件代码如下1double Dxl=newGet2LotsCode.Deadline;2int Todayl=GetDateX-l,0;3if DxKToday1+10*24*60*604{SetResult〃255,255,0;255,0,0〃;5else ifDxlTodayl+30*24*60*606{SetResult255,128,64;255,0,0;7else ifDxl〈Todayl+60*24*60*608{SetResult255,168,125;255,0,0z,;9else ifDxl〈Todayl+240*24*60*6013{SetResult192,192,192;255,0,0;14}代码是一入库明细为基础的,L.1是取得该批号的有效期,L2是取得当天的日期结果都是从
1970.
1.1开始的秒数L3是判断这个有效期是不是在10天以内,口2判断是不是在8个月以内L4是设置底色与字体颜色,颜色是由RGB三色组成,英文逗号分开,前面三个是表单底色,后面三个是字体颜色RGB的值,可以从任何一个画图软件查询到2编写事件要赋于给tbnnstockItems_For_Schedule的,这个名称可以从弹出的表单窗口,在最左上角单元格选择功能“编辑/显示数据库据名称〃获得将这个名称从提示窗口的底部复制后,选择主窗口功能,”选项-窗口/翻开指定窗口〃,从这个窗口,选择“综合处理/高级设置/业务处理设置〃,做如下修改后,按修改保存瀚业务处理设置业务处理设置[21]_____记录数165自动序号384巨Excel数据交换标准上]表单名称|弹出库.[选项A]专用选项|业务选项All-清单|For tblOutstocklte|C++事件单据产生事件过滤规则事件通知人员a M自动调整库存a函数类型事件名称业务代理QEvent GridColor根据有效期设置库存业务公司Q业务凭证设置2日…巨Event_Audi t审核前的检查程序Q业务类型3Q Event_Be foreColl ectData收集Q产品资料规格库4Q Event_Be foreS ave数据保存前百QQ会计账户Event_Fl owSave自动转换数据伤a5QEvent_Selection记录被选择时F iel▼IQ供应商评估ds_Dr opDown下拉框列表C X州自团偏面葭▼函▼关闭帮助刷新清空删除修改式保存新增式保存查找综合处理岛国图我S,Event GridColorEvent GridColor用.户谒i置表格这里的事件名称就是你前面在“用户c语言程序〃中编写的代码3最后的显不效果如下例如八查询后的事件一些用户,期望在查询结果后,根据不同情况做一些处理止匕时〃表单查询事件〃Event_Retrive就能够解决这类问题这里的例如是公司,希望在用户100登录时,查询
2008.06以前数据时,使用其它表单的数据1编写事件代码如下1int tl,t2,t3,t7;2float t4,t5,t6;3char*cl,*c2;4string ucl=GetUserlnfCode;5if ucl==z/100,z6t3=intnewGet2〃Datel〃;8ift312122496009tl=int newGet2z,Namez,;10ucl=,,Select*From HDuty_DailyReportX2Where Name二〃;11ucl+=tl;12ucl+=And Datel二〃;13ucl+=t3;14gDataSet dsl this,4,ucl.c str;15cl=gCstrl;16tl=gSizel;17c2=dsl.gCstrl;19t2=dsl.gSizel;20ifcl!=NULLc2!=NULLtl0t2==tl21{memmovecl,c2,tl;22}23printf,ztl=%d,t2=%d,cl=%d,c2=%d,/,tl,t2,int cl,int c2;24printf〃sql=%s〃,ucl;25else27{28tl=intnewGet2,,Shift30//;29t2=int newGet2^Shift31z/;30ift2-tl〉L5*60*6031{32newSet2〃Shift31〃,tl+
1.5*60*60+5*60;33newSet2/,WorkIlour_0ver,z,
1.5;34t4=newGet2〃WorkHour_Weekend〃;35t5=newGet2,/WorkHour_0ver,/;36t6=newGet2,,WorkHour,/;37newSet2/,TotalWorkHour,/,t5+t4+t6;38return0;2编写事件要赋于给HDuty_DailyReportX的vent_Retrive事件注意查询事件是在单条记录上运行的,即如果查询到100条记录,系统对每条记录都单独运行代码因此程序不需要处理复杂的问题查询事件其它例如1用户查询库存综合报表时,希望一局部空白数据不要显示,那么可以给表单tblSaleSynthetic编写〃查询后的事件〃,对于那些不需要显示的数据,返回-1,系统会过滤掉这局部数据可以使用getParameters1,2,3,•••函数,测试到底是那个函数在调用本领件注意,2用户采购订单窗口,不显示那些应收货日期超过特定长度的单据,因为这些单据估计不再收货了那么可以给采购订单编写〃查询后的事件〃,对于那些不需要显示的数据,返回-1,系统会过滤掉这局部数据这些数据仅仅不显示了,例如九综合例如对于医药行业,某些业务公司禁售某些产品1此时用户要定义一张表单窗口,例如是UproductProhibit来保存这些禁售信息的2再编写例如销售订单的事件,事件可以放在保存事件、或者审核事件代码如下int i=0,il,jl,cid,pid;string si,s2;double tt;cid=intnewGet2,,ClientID,,;gDataSet dslthis,1,“Items;for i=0;;++i{il=dsl.MoveToi;ifil0{return0;pid=intdsl.newGet2Product;s2=〃*Select Count*from UProductProhibit,z;s2+=z,Where ClientID二〃;s2+=cid;s2+二〃And Product=;s2+=pid;tt=SQLs2;iftt
0.0001{gStringArray SAIthis;si二〃警告!该产品对当前的业务公司禁售〃;sl+=i+l;SAI.Append si;SAI.Append〃确认“;SAI.Append〃〃;jl=SAl.ShowMessage;return-1;return0;这段代码,是逐个检查这些物品,是否在禁售列表中,如果在的话,系统将禁止继续事件的参数说明string getParametersint i返回第i个参数第1个参数i=0,是调用事件的类型名称保存事件为Event BeforeCollectData,审核事件为Event Audit;第2个参数i=l为辅助类型,例如新增保存时为Insert,修改保存时为Update,对于审核则为Audit.对于不明确的,可以自己测试结果§
3.0A-ERP虚拟机数据集的工作模式gDataSet这个类有个方法Run是空白的,用户的代码,在新版本中是填充到这个方法中的,因此新版本中,完整C++的程序是这样的常用头文件局部class gDataSetintRun;int gDataSet::Run用户写的代码局部int funint i,cliar*buff gDataSet dss;return dss.Run;也就是说,当用户程序运行时,总是以某个记录为基础的,你可以用gDataSet提供的方法处理问题你可以用CurrentModeO获取工作模式,这个函数返回1,表示当前操作的记录,我们称为模式I;返回2当前操作的窗体编辑框字段一模式返回3当前操作的清单一模式III;模式IV则是按照SQL语句返回数据集注意返回的数据仍然工作在模式I,1服务器模式I,从数据昨按照SQL讲句返回数据集*
3.明3___I内存模式D当工作在成员函数内部时,不需要前缀,例如int ml=CurrentMode;int m2=dsl.CurrentMode;前者表示取得本记录集的工作模式,后者则是获取dsl这个数据集的工作模式当启动代码工作在模式II下,如何操作清单呢?例如我们希望统计清单中数量与单价的总和,赋值给字段Totalcharge.为了完成这个任务,下面代码就可以double Sum=
0.0;gDataSet dslthis,3,“Items;int rl=dsl.GetRowO;while rl0{double xl=dsl.Calculate〃Aniount*CoPrice〃;double x2=dsl.newGetTaxxl,0;Sum=Sum+x2;rl=dsl.NextRowO;newSet2//Totalcharge/,,Sum;这里仅仅是说明原理,因为这为完成这个功能,系统提供了更强大的函数Sum2AndSet Totalcharge,Items,Amount*CoPrice〃.由于窗体编辑框、清单,记录,都是有对应关系的,都是由字段控制的,因此对他们的操作也是完全一样的,都是gDataSet类型的数据集,当然,在模式H下,NextRowO没有作用
1.获取清单记录集合在模式I下,可以获取清单记录集合,使用下面代码就可以了gDataSet dslthis,1,“Items;然后这个dsl是gDataSet类,那么这个类的所有函数都可以使用
2.获取主窗口操作对象仅仅在模式in下,可以这样处理,代码如下gDataSet dslthis,2,NULL;代码例如if CurrentMode=2{gDataSet dslthis,2,NULL;double dl=dsl.newGet2Discount;ifdl=0||dl=ldl=l;double si=dl*newGet2Price*newGet2Amount;newSet2,,Summoney,,si;警告这里的模式检查非常重要,因为局部代码只在清单中运行有效,其它模式下并不正确局部客户例如希尔科的代码因为缺少这个检查出现过错误仅仅在模式n、in下,可以这样处理,代码如下gDataSet dslthis,3,“Items;在模式n下,可以使用这中方式操作另外的清单在任何模式下都有效,可以这样处理,代码如下string SQLl=,,Select*From tbllnstockltemsWhere AmountOutAmount And MainCode InSelect CodeFrom tbllnstockWhereRecord524288,z这个语句是列举所有的入库单中存在剩余库存的明细,MainCode In…是保证这些单据已经入库,而不是当前未入库的单据gDataSet dslthis,4,SQL
1.c_str;注意返回的数据仍然工作在模式I,只是要传递4这个参数代码例如下面是一个完整的使用SQL语句返回数据集作的例如1string SQL1=〃Select*From tbllnstockltemsWhere Amount0utAmount AndMainCode InSelect CodeFrom tbllnstockWhereRecord524288,z;2gDataSet dslthis,4,SQL
1.c_str;3gStringArray SAIthis;4string s2二〃库存分布如下,〃;5s
2.addReturnO;6s2+二〃总行数:〃;7int countl=dsl.GetCount;8s2+=countl;9printf〃countl=%d〃,countl;10s
2.addReturnO;11int i,il;12fori=0;icountl;++i13{il=dsl.MoveToi;14ifil=0任何功能扩充本文件仅仅是对如何使用这个技术做一个概览性介绍OA-ERP允许用户全面开发自定义需求功能.1自定义表单,并且给它增加字段..2给系统原来自带的表单增加新的字段.3完全自定义报表.4全面控制业务处理过程.所谓全面控制业务处理过程,就是在新增单据、审核单据、处理完毕单据,用户录入数据过程中的控制给每个字段增加C/C++代码,就是处理“录入数据过程中的控制〃本文主要讲述用C/C++程序编写功能强大的业务处理功能初学者理解这些内容的顺序如下1C/C++的根本工作方式.2数据集的概念.3事件的概念.4附录.§
1.新版本C/C++语言变更说明
2007.
12.04自学请勿跳过,这里是观念的转变,如何从C语言进入到C++下面函数不再使用lBeginRepeatEndRepeat这对函数主要目的是在窗口录入状态下模式H,切换到清单,计算清单行的数据新的版本中,使用数据集的概念,不再需要切换例子原来C语言程序老版本为int r=GetRow;int j二BeginRepeatItems;float Sum=0;whilej0jr{double xl=Calculate2,,Amount*CoPricez,;double x2=newGetTaxxl,0;Sum=Suni+x2;j=NextRow;EndRepeat;newSet2NULL,Sum;旧版本注释如下GetRowO获得当前行BeginRepeat Items准备对Items〃清单进行统计,并返回首行行次NextRowO;跳跃到下一行EndRepeat;结束对清单的统计新版本则使用清单数据集dsl,代码变换为下面double Sum=
0.0;gDataSet dslthis,3,“Items;int rl=dsl.GetRowO;while rl0{double xl=dsl.Calculate〃Aniount*CoPrice〃;16string slb=dsl.newGetX4Product;17string s2b=dsl.newGetX4CStoreHouse^;18double al=dsl.newGet2Amount;19double a2=al-dsl.newGet2z,0utAmountz,;20s2+二〃物品名称:〃;21s2+二sib;22s2+二〃,仓库〃;23s2+=s2b;24s2+二〃,入库数量:〃;25s2+=al;26s2+工〃,剩余数量:〃;27s2+=a2;
2852.addReturn;293031SAI.Append s2;32SAL Append〃确定〃;33SAI.Append,,z,;SAI.ShowMessage;return0;34运行时提示窗口如下35库存分布仓库仓库总行数物品名称仓库号电入库数量余数量物品名称库号电入库数量余数量物品名称库号库入库数余数量物品名称仓号库入库数量剩余数量物品名称仓号电入库数量娄理贵Confirmation lessage谙选择噪作方式.
1.确定确定
2.c_str;newSet2,,X001,z,ds
2.newGet2uLength;newSet2“X002”,ds
2.newGet2〃uWidth〃;newSet2〃X003〃,ds2,newGet2uThickness;
6.空白数据集在任何模式下都有效gDataSet dslthis,6,char*cnl;例如cnl为表单名称或表单序号.§
4.C语言代码解决特殊业务例如根本意义OA-ERP做为一个通用系统,因此不能在一些非常专们的需求方面走的太远,但是使用C/C++语言扩展程序,原则上可以解决任何的可能需求如果用C/C++语言解决了,那么任何其他语言也未必能解决例如一外贸费用的计算1一个外贸用户,在销售报价、销售订单中,都因为存在费用,因此启用了费用方案、费用清单2)这些费用中,一局部是固定的,例如手续费、标签费等3)另外一局部费用,不是固定的,例如“单物品金额保值费〃,它是根据物品清单的费用总和再乘以一个系数得到的;再如“关税〃等,是其它费用的总和,再乘以一个系数得到的C语言代码设置1)我们先定义费用工程如下注意这这里的两个特殊工程的序号分别是
20003、20004,他们要特别处理2)在销售报价单的中定义C语言程序这里只需要给第三行、第四行工程定义C语言程序我们将数量固定为1,于是只需要给单价字段定义C语言程序就可以了,“询价单物品金额保值费〃是统计物品清单的费用总和,因此可以使用代码代码片段一Sum2AndSetPrice,Items”,〃Summoney〃;这里Sum2AndSet的作用是计算清单Items的表达式〃Summoney”的总和,然后赋值给〃Price〃字段第四行“费用汇总项关税〃的意义是,计算其它行的总金额,乘以一个系数,例如
0.5,因此定义C语言程序是代码片段二float D1=Sum2〃Items3〃,“Summoney;float D2=newGet2Summoney;newSet2Price,D-D2*
0.5;这里解释一下,第1行的意思是,计算清单〃Items3〃的表达式〃Summoney〃的总和,第2行的意思是,获得本行〃Sumnioney〃的值因为仅仅计算其它行的〃Summoney〃的值,所以他们的结果要相减D『D2第3行的意思是,计算结果,赋值给字段〃Price”现在的问题是,在第三行用代码片段一,第四行则用代码片段二,其它行不计算,那么如何处理呢?我们使用newGet2〃Typel〃获取字段〃Typel〃的序号,我们记得,第三行“询价单物品金额保值费〃的序号是20003,第四行“费用汇总项关税〃的序号是20004,因此C语言程序就是如下形式最后代码ifnewGet2〃Typel〃==20003{Sum2AndSetPrice,Items,Summoney;ifnewGet2Typel==20004float DI=Sum2〃Items3〃,“Summoney;float D2二newGet2Summoney;newSet2Price,D『D2*
0.5;3一点优化上面代码中,newGet2〃Typel〃调用2次,影响了效率,因此采用下面优化的形式加速计算优化后的代码片段int typel=newGet2^Typel^;iftypel=20003{Sum2AndSet Price,Items”,〃Sumnioney〃;else iftype1=20004{float DI=Sum2〃Items3〃,“Summoney;float D2=newGet2〃Summoney〃;newSet2,/Price,z,Dl-D2*
0.5;最实际使用的代码片段如下int typel二newGet2〃Typel〃;float D2=Sum2Items”,〃Sumnioney〃;float D3二newGet2MainCode.Exchange;iftypel=20003〃国际空运{float Dl=newGet2MainCode.Relateid_XCode.xExtraFieldsO3,z;newSet2Price,Dl*l.5;else iftypel==20004//保险{newSet2〃Price〃,D2*
0.0029*
1.1;else iftypel==20014〃代理费{newSet2〃Price〃,D2*D3*
0.01/100;else iftypel==20001〃关税{float D4=newGet2,zMainCode.Relateid_XCode.xExtraFieldsO2/z;newSet2〃Price〃,D2*D3*D4/100;else iftypel==20012〃汇费{ifD2*
0.015100newSet2Price”,100;elsenewSet2Price”,D2*
0.015;注释D4的取值通过销售报价记录主单据字段〃Rela.teid_XCode〃漫游到采购询价单里取字段〃xExtraFieldsO2,/的值例如二局部清单行的计算上述用户系统中,设置完整后出现下述问题问题在客户系统的销售费用方案使用了C语言代码,其中费用方案里的明细运用了C代码算法,如下所示:elseiftypel==20017{float D6=Sum2〃Items3〃,“Summoney;newS6t2Price”,D6*
0.17;其中〃费用VAT〃的值是从第1行到第13行之和乘以
0.17得到的值在做销售报价单时,填写完相关数据,选择相应的费用报价方案的一瞬间其算出的值是准确的,但是在所任何计算,会导致错误,1□1x|函刷新清空删除修改式保存新增式保存审核▼最▼报表▼打印,综合处理B-O处理中j Q销售报价单j•…B SQR20070917-001项目类型而种数量价格总金额实厘:•…SQR20070917-002…IB SQR20070917-00-8寄发票费欧元
1.
05.
0050.00I…a SQR20070917-00^9Bill Fee欧元
1.
05.
0050.00!i…aSQR20070919-00110国内运费欧元
1.
020.
00200.00i:aSQR20070919-00211代理费欧元
1.
03.
1031.00!!…o ISQR20070920-00112汇费欧元
1.
010.
00100.00-1I…aSQR20070920-002i I…a13其他欧元
1.0SQR20070921-001:!14费用VAT_
1.
0116.
37741116.38SQR20070921-002j…Q
1.
055.
33555.3415国内合同金额yaSQR20070921-00-i i…16关税欧元
1.
015.
50155.00SQR20071002-001Qi j…aSQR20071002-00217:••…aSQR20071002-0018i-o今日S19合计
161314.51PHda2J1J销售报价单
[171]状态:当前数据记录数14自动序号冲口口4|曲昌昌i
5.50关闭费用潘单|以国龟1in裁10国内运费清单人民而
1.
0200.
00200.00代理费人民币
1.
031.
0031.0011人民币12at
1.
0100.
00.
100.00磁人民币
1.01314费用VAT人民市
1.
0217.
22771217.2315国内合同金额VAT人民市
1.
055.
33555.34关税人民市
1.
015.
5015.5016问题Windows操作系统,被设计为事件驱动系统,即有事件发生时,系统要有所反应OA-ERP也是根据这个原则设计的Sum2〃Items3〃,〃Sunwney〃这个代码在第二次计算时,会将第一次计算的结果考虑进去,因此第二次计算的结果与第一次自然不同,假设再次计算,那么结果又不同因此这段代码的原理是错误的为了获得正确的结果,我们必须重新写代码,仅仅统计『13行的值,此时可以考虑使用以下函数GetRowO获得当前行gDataSet dslthis,3,Items;构造操作〃Items”清单的数据对象NextRowO;跳跃到下一行因此替代Sum2Items3,Summoney的代码如下int r=GetRowO;int j=l;float Sum=0;gDataSet dslthis,3,“Items;whilej0jrdouble xl=dsl.Calculate〃Summoney〃;Sum=Sum+xl;j=dsl.NextRowO;newSet2NULL,Sum;这里解释一下,因为这段代码是在第14行生效的,为了通用,系统并没有使用14这个具体数字,而是用int r=GetRow;返回这个行次,以便将来有更多行,或更少行时,也有效while j0j〈r表示行次j在大于0,并且小于当前行时统计因此最终这局部完整的代码是else iftypel=20017〃仅在〃费用VAT〃行次生效{int r=GetRow;int j=l;float D6=0;gDataSet dslthis,3,“Items;whilej0jrdouble xl=dsl.Calculate Sumnioney;D6=D6+xl;j=dsl.NextRowO;newSet2Price”,D6*
0.17;下面给出这局部最终使用的完整代码,供参考int typel=newGet2Typel;float D2二Sum2Items,Summoney;float D3=newGet2z,MainCode.Exchange;iftypel=20003{float Dl=newGet2^MainCode.xExtraFields01,z;ifDl35newSet2Price”,D1*L5;elsenewSet2Price,Dl*l.75;else iftypel=20004{newSet2〃Price〃,D2/D3*
0.0029*
1.1;else iftypel==20014{newSet2Price”,D2*
0.01;else iftypel=20012{ifD2*
0.015100newSet2Price”,100;elsenewSet2C,Price/,,D2*
0.015/D3;else iftypel=20017{int r=GetRow;int j=l;gDataSet dslthis,3,“Items;float D6=0;whilej0jrdouble xl=dsl.CalculateSummoney;D6=D6+xl;j=dsl.NextRowO;newSet2Price”,D6*
0.17;else iftypel==20016{float D4=newGet2,zMainCode.ContactMethod,/;newSet2〃Price〃,D2/D3*l+D4*
0.17;else iftypel==20001{float D4=newGet2,zMainCode.ContactMethodz/;newSet2Price”,D2W4/D3;else iftypel=20018{float DI=newGet2MainCode.xExtraFieldsOl;if Dl*
0.4515newSet2,,Price,/,15;elsenewSet2Price,Dl*
0.45;else iftypel==20020{float Dl=newGet2/zMainCode.xExtraFields01,z;ifDl*L645newSet2Price”,45;elsenewSet2Price”,D1*L6;else iftypel==20021{ifD2*
0.003218newSet2Price”,18;elsenewSet2CPricez,,D2*
0.0032;else iftypel=20022{float DI=newGet2MainCode.xExtraFieldsOl;if Dl*
0.4540newSet2Price”,40;elsenewSet2Price,Dl*
0.45;例如二采购付款金额的控制1一个制药企业,在采购付款时,要求金额超过,比方100万时,每次至多付款70%,这个特殊需求可以编写“采购付款单〃的审核检查C语言代码来控制根据需求,这张单据应该不能通过审核因此我们来分析,应该如何编写C语言程序系统提供的Sum2char*FieldName,char*Expressl函数可以获得清单中“应付款”,“此次付款〃的值,doubleD1=Suin2Items”,〃Tobepayed〃;double12二Sum2Items”,〃Nowpayed〃;ifDl=1000000D2D1*O.7{return-1;return0;这里11,获得“应付款〃的值,因为清单的字段是〃Items注意表单可能有多个清单,因此这里要求注明清单的字段DL获得“此次付款〃的值.如果D1超过100万,而且“此次付款〃超过D1的70%时,返回-1,表示审核失败其它情况返回0,表示通过2将编写的函数录入到“用户C语言程序〃,然后double x2=dsl.newGetTax xl,0;Sum=Sum+x2;rl=dsl.NextRowO;newSet2NULL,Sum;~~新版本中,不再需要切换,操作代表清单的数据集合dsl就可以了这个例子也是说明如何从C语言程序过度到C++程序请查看系统自带的其它例如程序2newGetX3这个函数主要目的是是返回字段的字符串值新的版本中,使用newGetX4直接获得这个目的例如原来的代码是char buff
[128];newGetX3,zxExtraFields_C01,z,128,buffif buff
[0]==buff
[0]==M,buff
[0]==B,double X2=newGet2Product.LTimetblPurchcontrz,;newSet2Price”,X2;新版本代码如下string sl=newGetX4〃xExtraFields_C01〃double X2=newGet2^Product.LTimetblPurchcontr/,;newSet2Price”,X2;可以看到处理复杂问题时使用C++代码,较C语言更容易接近人的思维的直观性§
2.C/C++事件OA-ERP目前开放的允许用户自己控制的地方是1新增单据2审核单据3处理完毕单据4用户录入数据过程5下拉框事件由于用户处理数据的对象有所不同,因此OA-ERP系统将他们分为三大类1记录2窗口编辑框3清单记录指内存或数据库中的一条记录,或多条记录;窗口编辑框是用户交互的输入位置;清单指窗口中的清单.当系统处于“记录”处理状态是,系统状态为1;”窗口编辑框”状态为2;清单状态为
3.我们可以用CurrentMode获得当前状态的值.例如一,审核事件“裁床明细”窗口中的一段代码是3)然后再“采购付款〃的业务设置窗口,按照下面方式设置审核检查函数而业务处理设置Jnl xi业务处理设置[21]自动序号184记录数95<>X国_囤__幺刷新清空删除修改式保存新增式保存香投▼综合处理查找字段名称|所有字段中查全二J查找字符值M库三|*查找*SAR-Q20006自定义字段弓|「上]相关业•|预警信.|图片浏.|选项A|选项B|专用选项|20007自定义字段引F20008自定义字段引F20009自定义字段引F-Q20010自定义字段引L-Q Excel数据交换标准安全认证-Q报关业务标准财务报表-Q补菲单-D前瞬清单|自动通知人员|常用后续单据查询列表自定义程序部门-B财务记账凭证-Q裁床明细采购订单-D采购发票采购付款<1昌昌因窗口画面,Size600x411注意,这里Event_Audit〃是审核检查函数的类型标记,因为有多种控制函数,因此不要弄错了结果设置好后,重新启动系统现在选择这张单据,审核出现如下提示,表示审核失败审核失败User AuditProgram.修改金额为,再审核,则通过字段值的控制奥诺制药在订单中处理中需要操作员录入申请数量,审核员在审核时,则根据申请数量、剩余款,填写审核数量实施人员将一个自定义字段xExtraFields01〃设置为申请数量,同时有一下要求1如果申请数量没有填写,那么审核数量可以任意填写2如果申请数量有填写,那么审核数量不得超过申请数量此时我们有如下代码float XI=newGet2xExtraFieldsOl;if Xl=
0.01return0;float X2=newGet2z/Amountz/;int i二GetFieldOrder〃xExtraFields01〃,1;int j=GetFieldOrder Amount^,1;int k=GetFieldOrderNULL,1;ifi==k||j==kX2X1||X
20.01{newSet2Amount”,XI;这里,k获得当前输入焦点所在的列,i-申请数量所在的列,/审核数量所在的列XI为申请数量,没有填写时,不处理,直接返回其他情况是1i二二k指申请数量所在的列为当前列2j二二k指审核数量所在的列为当前列3X2X1指审核数量超出申请数量,4X2指审核数量没有填写5||分别是“或者,且〃逻辑判断,练习练习题假设客户要求在销售发票中,允许多开发票金额,但是多开出的金额的税
0.17必须是客户自己承当,那么如何设置流程?如何设置C语言控制?流程设置此时,应收账款,不能以发货单为依据了,因为发货单上的金额不能改变,改变后变成了应收账款故设置“销售发票〃为应收账款的依据,此时只要在凭证模板中设置就可以了详细请见“业务财务一体化〃局部C语言设置利用系统中预留的自定义字段,设置一下窗体销售发票
[680]状态:当前数据记录数o i而销售发票__匾I M▼且▼而▼昌▼函刷新清空删除修改式保存新增式保存审核查找报表打印综合处理□■Q处理中e销售发票由e今日3-0历史关闭9t E■发货单清单物品清单|哥客户|付款说明|发票号码|岛昌司2booo7oo即主单据、清单中的“发票金额〃然后,各个字段的C语言代码设置如下1主单据发票金额Sum2AndSetNULL,“Items”,〃xExtraFields01〃;即统计清单〃Items〃的〃xExtraFields01〃字段值赋给本字段2清单发票金额float XI=newGet2〃xExtraFields01〃;float X2=newGet2Amount*newGet2Price;if Xl
0.001{newSet2NULL,X2;即没有设置发票金额时,自动填写3清单总金额float XI=newGet2〃xExtraFields01〃;float X2二newGet2Amount*newGet2Price;float X3=X2+X1-X2*O.17;ifX1X2X3=X2;newSet2z,Summoney,z,X3;即发票金额超过数量*单价时,要计算多出的金额的税,加上数量*单价的总和,为应收账款这里仅仅是一个课堂教学中以为学生的问题解答,实际上并没有这样做的,因为1多开发票不仅违法,而且造成严重的税务问题,2即使要多开金额,非法合法化的做法是调整计算单价一个复杂的报价计算督语言问蔻话教C doc-文件任编辑©视图W插入9格式
⑥工具X表格Q窗口世帮助国AdobePDFAcrobatComments X;也正文+蓝色▼宋体▼五号▼B/岂▼囚A定▼圜笔耳圜归▼三三享享a少▼A▼在销售报价单中,
1、启用自定义字汇表后,将相应系数按以下表格设定一系数名称相关系数AP1批量订货1000打以下
21.3-批量系数Q2批量订货1000—10000打以下K b3批量订货10000打以上一
0.9A毛利率一LB毛利率Q晨毛利率系数0C毛利率LD毛利率「1KI级客户』
1.KH级客户小K因此销售报价=材料成本+工序成本+费用成本*相应的系数一现取客数户碰系到数困』难
1、如何将销售报价单BOM清单中的合计成本反馈到C语言中「
2、当选择其中的系数名时,实际计算时应该乘以相应的设定系数”由于销售报价单主单据中有一个费用金额字段我启用的销售报价C语言代码如下〃B0M累计成本+Totalcharge3*xExtraFields
101.RatePxExtraFields102,Rate1*xExtraFieldsC
01.Rate],KHI级客户小Lfloat xl=newGet2Items.Product[1,Order].DT〜prdBOM〜Product.TotalchargeX[Items.Specif[1,Order],Specif]〃;float x2=newGet2z,Totalcharge3/,;口回三31页float x3=newGel2^xExlraFieldsIOl.Ralel;newSet2NULL,xl+x2*x3;注意这里的XI的取值中的漫游取值的代码Items.Product[1,Order].DT^prdBOM^Product.TotalchargeX[Tterns.Specif[1,Order],Specif]Items.Product[1,Order]表示查询清单第一行,Items.Specif[1,Order]表示清单第一行的规格,这里是嵌套的,DT〜prdBOM〜Product表示跳跃到BOM主单据中去,prdBOM,且与其中的Product字段值相同由于每次取道的,可能是多行,因此要用口约束条件限制§5代码逻辑故障分析C/C++的博大精深,在业界是知名的,也因此让人恐惧简单地说,C/C++唯一遵守的规则的逻辑下面是一下例子某企业使用“销售报价单费用明细,销售订单费用明细〃使用的代码如下
715.tblSalequotItems3,询价单费用明细xpxX1XXTSXTXXgX XIXXjXXIXXjXX|XXjXXTSZTXxlx*TXX7XXgX
715.1Summoney**Xzxj%*y%Calculate2AndSetValue〃Sumnioney〃,〃uExchange*Price*Amount〃;xlxxlxxfxxlxxtxxlxxlxvxxlxxlxlx^Tx^TsxjsxjxxyxxjxXTS*JS✓JSXJS xjxxjsxjs^TS
715.2uExchange东*^1**A*xL*KT*vt*xL*K!K!KL**TS✓TSZTSZTXZ7S^|SZTSyTS^TSXTsyjSZ7XXSZTSZTSZTSZjSZT%ZrSZgXZTSint j=GetRow;while j0int sl=intnewGet2,,FnCode,/;ifsl==12||sl==6newXSet MainCode.Exchangez,,-1;else ifsl==l{newSet2uExchange”,1;j=NextRow;这里的代码有何问题?出现的故障如下1保存数据后一些行的外汇率uExchange、总金额Summoney是空白的,要重新点击后才再显示2总金额Summoney还出现错误现象,取的计算值似乎不能与新的汇率对应这个问题也是让程序员昼夜不眠的地方,一切都那么简单!结论就是不正确这里先说明这里的思路的错误之处1总金额Summoney用到外汇率uExchange,但是uExchange却在Summoney之后,计算顺序将导致误差2外汇率uExchange的代码只需要计算本记录本行,但是这段代码却在整个清单循环也就是每次调用代码处理一行数据时,整个清单都要重新处理一遍,效率十分低下鉴于GetRowO是返回当前行次的行号,因此计算n*nT,这本身却说明程序的思路是不匹配的,混淆的3这里由于要取主表单的值,在某些状态下模式I、模式H下,可能失败,但是这里却没有判断系统运行模式知道这些问题后,我们只要在外汇率uExchange定义如下代码,一些就ok ifCurrentMode==3{int sl=intnewGet2,,FnCode,/;ifsl==12||sl==6newXSet,zMainCode.Exchange”,-1;else ifsl==l{newSet2uExchange”,1;Calculate2AndSetValue Sumnioney”,〃uExchange*Price*Aniount〃;此时总金额Summoney不再需要什么代码了当然使用这个代码时,不要将uExchange的位置调整到Summoney的前面,否则,还会出错,因为Sumnioney的默认代码在没有被覆盖时又会生效,这个字段的默认代码是
715.tblSalequotItems3,询价单费用明细VL*zTszTsZJS zjsZTSZTSxTxzTszTs✓Ts*
715.1Summoney*vizslzsi*si*slzslzZTX ZTX#7*int M=CurrentMode;ifM==3{CallFunction^SetFor tblSaleFeeSchemeItems,z;因此这个字段可以使用空白代码,一个分号“;〃替代防止它运行,因为降低了系统效率另外要明白,代码可能随时会被系统调用计算,不仅仅是在某个固定位置,因此特殊的处理方式要判断是否适合自己的代码!因此程序员保持一个清醒的头脑是系统正确运行的关键§6表单自动转换事件
1.表单自动转换事件的需求来自如下需求销售订单审核时自动产生销售发货单,销售发货单审核时,自动产生出库单等系统已经内置所有这些根本的事件但是下面的需求,需要开放更多的内置机制,否则不能很好满足特殊需求1医药行业用户,希望在销售订单审核时自动产生销售发货单,销售发货单不要自动审核,但是销售发货单要产生收款单2收款单审核时,自动审核销售发货单,然后再自动产生出库单为了处理这类需求,需要启用“表单自动转换事件〃Jnl1意业务处理设置业务处理设置
[21]国记录数:42自动序号161关闭综合处理印自园CX喇图I虫▼国表单名称|选项|专用选项|业务选项清单|A Alb关闭帮助刷新清空删除修改式保存新增式保存查找综合处理事件|单据产生事件事件通知人员后续单据查询前缓清单C++项目管理表单名称|选项A|专用选项|业务选项All-清单|_________________________项目核算单事件|单据产生事件事件通知人员后续单据查询前瑜清单Q C++□消耗品领用单□销售报价记录销售变更单O销售订单销售发货单e Q销售发票销售o工资单销售回Q执单销售结算O单销售收款a岛里昌贾hDatabaseTbalesJnl1意业务处理设置业务处理设置
[21]自动序号记录数16342J:X喇固91▼刷新清空删除修改式保存新增式保存查找项目管理a项目核篁单a消耗品领用单D□销售报价记录□销售变更单□销售订单销售发货单销售发票销售工资单销售回执单D销售结算单D□销售收款岛里昌黎hDatabaseTbales注意,这里在销售订单定义了“审核〃Audit事件,而在销售发货单则定义了“新增〃AfterNewSave事件控制单据产生的控制单为单据报表设计与控制
[223]记录数:298:4/单据报表设计与控制查找字段名称|所有字段中查主色查找字符值|275▼1*查找*SARsO单据报表设计与控制•名称或.1每个表.1其它设置All-清单ED单据示例1表头设计报表显示窗口+□条码示例辅助+亡1国泰报表由e生产单邰类型姒向位置制性显不标签字段名或计算公式表)一一E0封面一年度会计报表+B打1主记录字段上注脚Main,Main叫♦印工卡(Excel版示向©通用表主记录字段上注脚Main,Main$Code,Practice!able2格操作选项61…0单据转换格3主记录字段上注脚Main,Main Code,Reiateid_XCode式主记录字段上注脚Main,Main Contractdate,OpTime□亡1销售订单物料需求表4白e销售订单-发货」发货单5主记录字段上注脚Main,Main一,Loadnum一港隹O销售订单物料需三□6明细清单字段表格内Items,It ems库存踪合报表6已库存综合报7明细清单字段表格内Items,Items Amount,TobeAmount表列才z8土0数据导出格式合计9______________1JJ1T望昌里HPrintDesign
2.现在用户又提出如下需求
(1)如果订单据上选择是现金销售,就直接产生收款单笺隹寸寸O显然,没有自定义程序,所有这些都是不可能的因此系统又开放了“流程事件〃(Event_FlowSave),专门判断是否需要产生单据定义如下:Jnl1意业务处理设置业务处I理设C置X
[21]自叵喇喇口▼国记录数自动序号16342综合处理帮助刷新清空删除修改式保存新增式呆存查找J):X喇固91▼国关闭综合处理刷新清空删除修改式保存新增式保存查找…Q项目管理项目表单名称|选项A|专用选项|业务选项All-清单|••O核算单消耗品事件单据产生事件事件通知人员后续单据查询前缓清单|C++O…领用单销售报Q…价记录销售变□更单销售订单…Q销售发货单j.…销售发票销
1.…售工资单销I•…B,售回执单销•…售结算单销■I售收款岛里昌黎hDatabaseTbales代码本身为int j1=int newGet2/zRelateid XCode.ScheduledTypez,;printf〃flow=%d〃,jl;ifjl!=189{return-1;return0;最为说明返回负值表示不能继续§7查询结果转换清单事件现在有如下需求A、库存养护对当前库存进行各种条件的过滤,筛选,得出一组有效记录清单,并作为下一步业务操作的依据药品养护确认表,药品养护档案,库存药品质量养护检查记录单,审核完成后,更新批号库中的最后一次养护日期;B、药品质量复检通知单,药品质量复检记录单,药品质量处理通知单;C、药品停售/复售通知单,对筛选出来的库存清单进行停售或者复售处理;D、有效期、近效期药品催销表,对满足一定日期时间段的库存进行统计并生成相应的近效期药品清单列表,作为下一步处理的依据如失效期在6个月内的库存商品进行清单列表记录单向销售部门进行催销;E、根据库存的上下限,当前库存情况,筛选,过滤,列出一组清单,作为采购方案的依据,并可引用到采购订单中;针对这类需求,系统提供了“查询报表转换为清单〃机制
(1)设置打印报表,不同的几点是1)类型要选择为*报表清单转换2)字段转换规则是清单中的显示标签要定义为“编号,Product”形式,即查询结果中“编号〃歹U,将转换为清单中的“Product”字段等;京单据报表设计与控制单据报表设计与控制
[223]国C X啜嗫幺.刷新清空删除修改式保存新增式保存查找d-O单据报表设计与控制由…单据示例亡)条码示例姒向位置辅助特性显示标签字段名亘上生产单既表)由巨封面--年度会计报表[+1-01主标题当前库存汇总表打印工卡(Excel版示例:报国…亡2下副标题查询日期:%CurrentDate2%表清单转换类I El0当前库存汇总表(XF-3上注脚仓库:%Nam第S-0专用控制部分4上注脚由亡I审核报告格式5下注脚制表%Curr entUser%国…巨单据转换格式6表格内编号,Product Fru due1[±|-D数据导出格式7表格内Product由…已报表中心8表格内规格,Specif Specif9表格内颜色SF21n1II2J3)仍然定义所要显示的窗口岛国图E料回同HPrintDesignJnl xi
(3)上述例如,在“采购订单〃中显示的结果如下:记录数284表头设计|报表显示窗口显示表单名称1采购订单名称或.|每个表.]其它设置『表买设讦;报表显示窗口Jnl xi采购订单[149]状态:当前数据记录数0:1自动序号京采购订单哪自因ex喇喇身▼幺,而▼密▼国关闭帮助刷新清空删除修改式保存新增式保存审核查找报表打印综合处理B处理中当前库存汇总表XF-示例[283]X采当前库存汇总表XF-示例[283]L Q采购订单购参考价格明细表[150]©采购订单处任由e今日理汇总表[213]
②采购订单明细[51]简明报表中心世s o历史
⑤EJ生产任务采购明细[77]G供应商供货]简要备注]详细备注]附件|明细表[56]6采购员货品采购总汇[54]4-----------------3采购订单综合明细清单[141]1采购计3划项目报表[159]应付帐明细清单[71]1已付帐汇总表[72]23采购未付款汇总表[73]Q处.JSl悬翼加HPr intD es ignShowF orms2833查询结果如下4所有报表产生的结果,都可以按照这里的原则转换为清单附录
1.OA-ERP虚拟机C/C++数据工作模式可以用CurrentModeO获取工作模式,这个函数返回1,表示当前操作的记录,我们称为模式I;返回2当sixsixslzviz slzslzslzxlzxlz*A*si**rsXTXix✓ixxr*xrsxrxxy*y^xr^*
556.3Amount*^TK!*gSXgXxTxxTxzfxzixxtxxjsxTsxxxrxzTxzTsxtsxjsxTxxTxzTxint M=CurrentMode;ifM=2{Sum2AndSetNULL,“Items,Amount;这段代码是加载到主单据Amoun”字段的,仅仅在模式II中工作,合计Itesm清单Amount字段例如二,保存事件用户定义了一个全新的窗口,用于调整结算价而结算价则是用户自己定义的,贯穿全部清单的一个字段□Price-标识几个特别的价格在这个窗口中,用户自己设计了录入信息的方式,从库存中选择剩余库存,录入新的结算价uPrice,然后希望单据审核时,修改库存中的结算价uPrice代码应该加载到审核函数,设置方式是代码清单是1int i=0,il,icl,jl;2double pricel;3string si;gDataSet dslthis,1,“Items;for i=0;;++i4{il=dsl.MoveTo⑴;5if il06{return0;789pricel=dsl.newGet2〃uPrice〃;10icl二intdsl.newGet2^JlnstockltemsCode^;前操作的窗体编辑框字段一模式n;返回3当前操作的清单一模式ni;模式iv则是按照SQL语句返回数据集(注意返回的数据仍然工作在模式I)服务器模式L从数据咋按照SQL讲句返回数据集(LI■5-51内存(模销售订单
[161]9E秋态:当前数据记录数自动序号式D、朦■昌.由ku,a/a ns鼻报表打印综合处理int ml=CurrentMode;int m2=dsl.CurrentMode;前者表示取得本记录集的工作模式,后者则是获取dsl这个数据集的工作模式数据集定义格式工作模说明式俗tblSftlecontr1gDataSet dslthis,1,“Items1获取清单记录集合在模式I卜有效2gDataSet dslthis,2,NULL2获取主窗口操作对象仅在模式HI3gDataSet dslthis,3,“Items3取得名称为Itesm的清单仅仅在模式II、HI下有效4gDataSet1按照SQL语句返回数据集dslthis,4,SQL
1.c str5gDataSet dslthis,5,NULL;1获取树形节点的数据集空白数据集6gDataSet dslthis,6,char*cnl;1cnl为表单名称或表单序号在任何模式下都有效附录
2.0A-ERP支持的数据类型类型意义int整数double小数(浮点数)string字符串(C++的标准)gStringArray字符串数组(即其每个兀素都是一个字符串)gDataSet数据集(可能在数据库,内存、也可能在表单窗口,或者清单,一//CC++标准库函数条或多条记录)O函数int printfchar*format,...;int scanfchar*format,...;int absint x;double atofchar*s;int atoichar*s;double sqrtdouble x;double fabsldouble x;void abort;double acosdouble x;double asindouble x;double atandouble x;double atan2double x;double cosdouble x;double expdouble x;double logdouble x;double loglOdouble x;double floordouble x;double frexpdoublex,int*exponent;double Idexpdoublex,int exp;double modfdoublex,double^ipart;double powdoublex,double y;double sindoublex;double sinhdoublex;double strtodchar*s,char**endptr;double tandoublex;double tanhdoublex;double coshdoublex;double ceildoublex;double fabsdoublex;void*memmovevoid*dest,void*src,int n;int strcmpconst char*sl,const char*s2;int strncmpconst char*sl,constchar*s2,int lenl;char Estreatchar*dest,char*src;char*strchrchar*s,int c;char*strcpychar*dest,char*src;int sprintfchar*buffer,char*format,...;FILE*fopenchar*filename,char*mode;char*asctimetm*tblock;char*ctime time t*time;char*fgetschar*s,int n,FILE*stream;double difftimetime_t time2,time_t timel;int atexitvoid*funcvoid;int fcloseFILE*stream;int feofFILE*stream;int ferrorFILE*stream;int fflushFILE*stream;int fgetcFILE*stream;int fprintfFILE*stream,char*format,...;int fputcint c,FILE*stream;int fputschar*s,FILE*stream;int fscanfFILE*stream,char*format,...;int fseekFILE*stream,long offset,int whence;int getcFILE*stream;int getcharvoid;int putcint c,FILE*stream;int setvbufFILE*stream,char*buf,int type,size_t size;int ungetcint c,FILE*stream;long ftellFILE^stream;size_t freadvoid*ptr,size_t size,size_t n,FILE*stream;size_t fwritevoid*ptr,size_t size,size_t n,FILE*stream;void clearerrFILE*stream;void rewindFILE*stream;void setbufFILE^stream,char*buf;long labslongx;long atolchar*s;long strtolchar*s,char**endptr,int radix;unsigned longstrtoulchar*s,char**endptr,int radix;size_t strftimechar*s,size_t maxsize,char*fmt,tm*t;tm*gmtime*timer;tm*localtime*timer;timetmktimetm*t;int isalnumint c;int isalphaint c;int iscntrlint c;int isdigitint c;int isgraphint c;int islowerint c;int isprintint c;int ispunctintc;int isspaceintc;int isupperintc;int isxdigitintc;int mblenchar*s,size_t n;int mbtowcwchar_t*pwc,char*s,size_t n;int memcmpvoid*sl,void*s2,sizet n;int putcharintc;int putschar*s;int raiseintsig;int randvoid;int removechar*filename;int renamechar*oldname,char*newname;int sscanfchar*buffer,char*format,...;int strcollchar*sl,char*s2;int systemchar*command;int tolowerint ch;int toupperintch;int wctombchar*s,wchar_t wc;size_t mbstowcswchar_t*pwcs,char*s,size_t n;size_t strcspnchar*sl,char*s2;size tstrlenchar*s;size tstrspnchar*sl,char*s2;size_t strxfrmchar*target,char*source,size_t n;size_t wcstombschar*s,wchar_t*pwcs,size_t n;time_t timetime_t*timer;void*bsearchvoid*key,void*base,sizet nelem,sizet width,int*fcmpvoid*,void*;void*callocsize_t nitems,size_t size;void*mallocsize_t size;void*memchrvoid s,intc,size_t n;void*memcpyvoid*dest,void*src,size tn;void*memsetvoid*s,intc,size tn;void*reallocvoid*block,size_t size;void exitint status;void freevoid*block;void perrorchar*s;void qsortvoid*base,size_t nelem,size_t width,int*fcmpvoid*,void*;void srandunsignedseed;char*getenv char*name;char*getschar*s;char*setlocaleint category,char*locale;char*strerrorint errnum;char*strncatchar*dest,char*src,size_t maxlen;char*strncpychar*dest,char*src,size_t maxlen;char*strpbrkchar*sl,char*s2;char*strrchrchar*s,intc;char*strstrchar*sl,char*s2;〃全局有char*strtokchar*sl,char*s2;char*tmpnamchar*s;效HINSTANCE LoadLibrarychar*;加载动态链接库void FreeLibraryHINSTANCE;释放动态链接库int GetProcAddressHINSTANCE,char*;返回动态链接库中的函数函数格式说明函数,总是void给全局变量设置字符串值UserSet char*Varable,char*Value;void UserSetAsDigit给全局变量设置数字值char*Varable,double Value;int GetDateXint,int OpCode;时间转换函数,OpCode的意义见〃开发选项〃中的说明string GetUserlnfchar*Varable获取当前用户在职员档案中的信息string UserGetchar*Varable获取全局变量的值〃字符串class string函数格式说明stringchar*x;stringconst string x;string doublex;int length;stringfe operator=doublex;stringfe operator=string s;stringfe operator=char*s;string operator+const string x;string operator+constchar*s;string operator+const doubles;string subint start,int len;string operatorint start,int len;int cmpstringfe x;bool operator=string x;bool operator!=string x;bool operator==char*x;bool operatorstringx;bool operatorstringx;bool operator=stringx;bool operator=stringx;void operator+=stringfe x;void operator+=char*x;void operator+=doublex;void delint start,int len;void insertint start,stringfex;12ificl=O13{gStringArray SAIthis;14si二〃我要显示一些信息Lines ContainNo leagalInformation Jine二〃;15sl+=i+l;16SAI.Appendsi;17SAI.Append〃按钮1〃;18SAL Append〃按钮2〃;19SAI.Append〃〃;20jl=SAl.ShowMessage;21ifjl=l22{return-1;34}25else26{si=〃Update tbllnstockltemsset uPrice=〃;27sl+=pricel;28sl+=/,Where Code=;29sl+=icl;30SQLsl;31return0;说明我们希望获得清单行,然后将每行的〃JlnstockltemsCode〃字段值取出来,这个数据是库存清单的序号,然后获得〃uPrice〃字段的值,将这个值更新到数据库中去审核单据时,系统传给我们的操作对象是单据本身,那么如何获得清单行?如何操作清单行呢?Line4完成了这个工作,整个清单我们封装在gDataSet这个数据结构中的,为了构造这个数据集合,我们传给了它3个参数,第一个参数是当前工作对象(记录、窗口、或清单),第二个参数是1,即我们希望的模式I集合;第三个参数是清单字段名称“Items”.从Line10-11我们看到,我们使用了dsl这个前缀,表示操作是对于清单的Line5-32是循环处理,Line6是定位到第i条记录,如果到了末尾,或者根本没有清单,那么函数会返回-1,-2,等负数从Line26-29将构造SQL语句,假设Code是20005,uPrice=10,那么这个语句将使Update tbllnstockltemsset uPrice=10Where Code=2005Line30,使用SQL函数去执行这个语句Line12,检查了获取库存清单序号的合法性,如果获取了非法结果,Line12-20又构造了一个提示窗口Confirmation lessage我要显示一些信息:Lines ContainNo leagalInformation,line=l请选择操作方式.1・按钮1■
2.按钮2是否继续?di…..按钮i………按钮2|这个窗口是Line20的执行结果为了显示这个窗口,系统需要一个字符串数组的对象gStringArray,这个在Line13中构造这个对象是字符串数组,即其每个元素都是一个字符串因为这个窗口需要3个字符串,
(1)编辑框中的提示信息,
(2)按钮“Continue,
(3)按钮“Cancel另外最后还要附加几个空白字符串,以便系统知道谁是最后一个按钮牛当用户按第一个按钮时,这个函数返回0,第二个返回1,依次类推如果超时,返回-1这段代码,在一般正常情况下,反复操作所有清单,处理完毕后返回3审核成功注意返回-1,表示审核失败例如二其它问题这里依赖一个字段〃JInstockItemsCode〃,即库存明细的序号,如果没有这个字段,或者由于其它原因,这个字段的值无法取道,怎么办呢?下面代码说明如何使用批号来替代,当然你可以增加更多的检查,防止错误inti=0,il,icl,jl;double pricel;string si;gDataSet dslthis,1,“Items;fori=0;;++i{il=dsl.MoveToi;ifil0{return0;pricel=dsl.newGet2uPrice;icl=int dsl.newGet2,,LotsCode,/;ificl=0{gStringArray SAIthis;si=Lines ContainNo leagalInformation,line=/,;sl+=i+l;SAL Append si;SAI.Append,,Continue,/;SAI.AppendCancel;SAI.Append〃〃;jl=SAl.ShowMessage;ifjl==l{return-1;else{si=Update tbllnstockltemsset uPrice二〃;sl+=pricel;sl+二〃Where LotsCode二〃;sl+=icl;SQL si;return0;例如三,保存事件用户希望在采购订单中,自动根据生产单的开工日期,填写提前7天为供给商的交货日期为了解决这个问题,我们编写保存事件的代码,代码如下1string si;2int xl=newGet2z,PracticeTable,z;3ifxl!=2764{return0;5sl=newGetX4,,Relateid_XCode.Startl;6int x2=UDCharToIntsi.c_str;7int x3=GetDateX-l,6;8if x2-7*24*60*60x39{gStringArray SAIthis;10string s2二〃时间错误,提前时间后,在今天之前〃;11s2+=sl;12SAI.Appends2;13SAI.Append〃放弃〃;14SAI.Append〃仍然继续〃;15SAI.Append〃〃;16int jl=SAl.ShowMessage;17ifjl==O18{return-1;22newSet2Deliverdate”,x2-7*24*60*60;23return0;这里解释如下,L2中,取得当前单据的业务类型窗口的序号,不为生产单的话,直接返回L6漫游查找到生产单据的开工日期,结果应该是“〃可阅读格式的,因此L7使用UDCharToInt将其转换为Unix长整数形式,L8取得当天时间,L9-L21,在提前七天后小丁今天的值时给予提示,L17接受用户返回按钮如果用户按第一个按钮,则返回0依次类推,此时我们返回-1,告诉系统处理失败如果继续,或者正确的话,L22将执行,设置字段〃Deliverdate〃交货日期的希望值代码编写好后,在用户代码窗口保存到数据库,然后为采购订单,增加保存数据的事事件客户程序重新启动后,代码生效例如三的进一步问题当用户在生产单中自动产生采购订单时,如果结果是多张采购订单,而且每张都出现提示,如果要求后面的同一张生产单产生的单据不再显示上述对话框时怎样做呢?解决方法是,设置一个静态变量,为生产单号,如果本次的生产单号与上次的相同,那么就不再提示,而是按照这个内容继续处理目前的问题是每次你这段程序运行时,都是在一个全新的虚拟空间运行,所谓上次的结果无影无踪因此这个时候我们要使用这对函数void UserSetchar*Varable,char*Value;给全局变量设置字符串值string UserGetchar*Varable;获取全局变量的值程序如下1string si;2int xl=newGet2,zPracticeTable,z;3ifxl!=2764{return-91;5sl=newGetX4Relateid XCode.Startlz,;6int x2=UDCharToIntsi.c_str;7intx3=GetDateX-l,6;9if x2-7*24*60*60x310{string sbl=newGetX4,,Relateid_XCode,/;string sb2=UserGet,,MyName011,z;ifsbl!=sb2UserSet MyNameOn”,sbl.c str;10gStringArray SAIthis;11string s2二〃时间错误,提前时间后,在今天之前〃;12s2+二si;13SAI.Appends2;14SAI.Append〃放弃〃;15SAL Append〃仍然继续〃;16SAI.Append,,,z;17int jl=SAl.ShowMessage;18if jl==019{return-1;22newSet2Deliverdate”,x2-7*24*60*60;23return0;当然可能更复杂,例如可以保存上次用户按按钮的值,如果是相同的生产单,那么下次自动返回相同的值,或者作出相同的反应例如四,下拉列表控制记录事件在采购退货单窗口,用户希望在下拉采购收货单时,列出采购收货单,同时将数量控制到仅存的库存数量,防止数量不符合库存,无法出库这个操作,在“采购调价单〃窗口是这样控制的,系统内部使用的是一个函数^SelectSaleLoadCargo_PriceAdjust/,o因此,你只要能调用这个函数就可以了1首先编写事件,代码如下int M=CurrentMode;if M==2CallFunction/,SelectSaleLoaJCargo_PriceAdjust,/;2为〃相关单据字段〃增加DropDown事件。
个人认证
优秀文档
获得点赞 0