版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 C/C+语言开发指南PAGE PAGE 118秋葵软件OA-ERP高级设计C/C+语言开发指南目录 1 新版本CC/C+语语言变更说明明2 OA-EERP与用户户程序的交互互 示例一一审核事件 示例二二:保存事件件 示例三三:保存事件件 示例四四:下拉列表表控制记录事事件Evennt_DroopDownn 清单数数据转移的设设置选项:库库存参考,自自动清除数量量 示例五五:记录选择择后的事件EEvent_Selecction 示例六六:建立选择记录录的事件Evvent_DDropDoownSettItemss 示例七七:表单颜色色事件Eveent_GrridCollor 示例八八:数据查询处
2、处理事件Evennt_Rettrive 示例九九:综合示例例,禁售产品品的业务规划划3 OA-EERP虚拟机机数据集的工工作模式 数据集集工作模式 使用SSQL语句返返回数据集完完整示例 取得树树形节点的数数据集4 C/ CC+语言代代码解决特殊殊业务示例示例一:外贸费费用的计算示例二:部分清清单行的计算算示例二:采购付付款金额的控控制结果字段值的控制练习一个复杂的报价价计算5 代码逻辑辑故障分析6 表单自动动转换事件示例一:7 查询结果果转换清单事事件附录1. OAA-ERP虚虚拟机C/CC+数据工工作模式附录2. OAA-ERP支支持的数据类类型附录3. OAA-ERP事事件类型一览览表附
3、录4. C/C+基础础附录5. 更多多示例 8 函数指针、与与动态链接库库9 产生提成成表的程序23447910111315161718182022232327313233343536383940424350545758引言为了满足大量未未知的、以及及特殊的需求求,系统内置置了虚拟机。由由于是C+虚拟机,因因此理论上应应该是能满足足任何功能扩扩充。本文件件仅仅是对如如何使用这个个技术做一个个概览性介绍绍。 OA-ERP允许许用户全面开开发自定义需需求功能. (1) 自自定义表单,并并且给它增加加字段. (2) 给系统原原来自带的表表单增加新的的字段. (3) 完全自定定义报表. (4) 全全面
4、控制业务务处理过程.所谓全面控制业业务处理过程程,就是在新新增单据、审审核单据、处处理完毕单据据,用户录入入数据过程中中的控制。给每个字段增加加代码,就是是处理“录入数据过过程中的控制制”。本文主要讲讲述用程序编编写功能强大大的业务处理理功能。 初学者者理解这些内内容的顺序如如下 (1) C/C+的基基本工作方式式. (2) 数据集的的概念.(3) 事件的的概念.(4) 附录.1.新版本CC/C+语语言变更说明明(2007.12.044)(自学请勿跳过过,这里是观观念的转变,如如何从C语言言进入到C+。)下面函数不再使使用 (1)BegginReppeatEndRepeeat 这对函函数主要目
5、的的是在窗口录录入状态下(模式II),切换到清清单,计算清清单行的数据据: 新的版版本中,使用用数据集的概概念,不再需需要切换。例例子原来C语语言程序(老老版本)为 intt r=GeetRow();int j=BBeginRRepeatt(Iteems);float SSum=0;while(jj0 & j0) doouble x1=dss1.Callculatte2(AAmountt*CoPrrice); doouble x2=dss1.newwGetTaax(x1,0); Suum=Summ+x2; r11= ds11.NextRRow();newSet22(NULLL,Sum);新版本
6、中,不再再需要切换,操操作代表清单单的数据集合合ds1就可可以了。这个个例子也是说说明如何从CC语言程序过过度到C+程序。请查看系统自带带的其它示例例程序。(2)newGGetX3 这个函函数主要目的的是是返回字字段的字符串串值: 新的版版本中,使用用newGeetX4直接接获得这个目目的。例如原来的代码码是char buuff1228;newGetXX3(xEExtraFFieldss_C01,128,buff)if(bufff0=R & bufff0=M & buuff0=B) double X2=neewGet22(Prooduct.LTimeetblPuurchcoontr);newS
7、et22(Priice,XX2); 新版本代码如下下string s1=neewGetXX4(xEExtraFFieldss_C01)if(s1=RMB) double X2=neewGet22(Prooduct.LTimeetblPuurchcoontr);newSet22(Priice,XX2); 可以看到处理复复杂问题时使使用C+代代码,较C语语言更容易接接近人的思维维的直观性。2. C/CC+事件OA-ERP目目前开放的允允许用户自己己控制的地方方是新增单据审核单据处理完毕单据用户录入数据过过程。下拉框事件 由于用用户处理数据据的对象有所所不同,因此此OA-ERRP系统将他他们分为三大
8、大类:记录窗口编辑框清单 记录指指内存或数据据库中的一条条记录,或多多条记录; 窗口编辑框框是用户交互互的输入位置置;清单指窗窗口中的清单单.当系统处于记记录处理状状态是,系统统状态为;窗口编辑辑框状态为为;清单状状态为我我们可以用CCurrenntModee()获得当当前状态的值值示例一,审核事件裁床明明细窗口中中的一段代码码是:* 556.3 Amoount *int M=CCurrenntModee();if(M=22) Suum2AnddSet(NNULL,Itemss,Ammount);这段代码是加载载到主单据Amounn字段的,仅仅仅在模式III中工作,合合计Itessm清单Amm
9、ount字字段。示例二,保保存事件用户定义了一个个全新的窗口口,用于调整整结算价。而而结算价则是是用户自己定定义的,贯穿穿全部清单的的一个字段uuPricee 标识几个个特别的价格格。在这个窗口中,用用户自己设计计了录入信息息的方式,从从库存中选择择剩余库存,录录入新的结算算价uPriice,然后后希望单据审审核时,修改改库存中的结结算价uPrrice。代码应该加加载到审核函函数,设置方方式是:代码清单是int i=0,ii1,ic11,j1;doubble prrice1;striing s11;gDattaSet ds1(tthis,11,Iteems);for(i=0;+i) i1=ds
10、s1.MovveTo(ii); if(i110) rreturnn 0; 10 pricce1=dss1.newwGet2(uPriice);11 ic1=(int)ds1.nnewGett2(JIInstocckItemmsCodee);12 if(iic1=00)13 gStriingArrray SAA1(thiis);14 s1=我我要显示一些些信息:Liines CContaiin No leagaal Infformattion ,line=;15 s1+=(i+1);16 SA1.AAppendd(s1);17 SA1.AAppendd(按钮11);18 SA1.AAppendd
11、(按钮22);19 SA1.AAppendd();20 j1=SAA1.ShoowMesssage();21 if(j11=1)22 rreturnn -1;23 34 25 elsee26 s1=UUpdatee tblIInstocckItemms sett uPriice=;27 s1+=pprice11;28 s1+= Wherre Codde=;29 s1+=iic1;30 SQL(ss1);31 3233 rreturnn 0;说明:我们希望获得清清单行,然后后将每行的JInsttockIttemsCoode字段段值取出来,这这个数据是库库存清单的序序号,然后获获得uPrrice字
12、字段的值,将将这个值更新新到数据库中中去。审核单据时,系系统传给我们们的操作对象象是单据本身身,那么如何何获得清单行行?如何操作作清单行呢?Line 4完成了这这个工作,整整个清单我们们封装在gDDataSeet这个数据据结构中的,为为了构造这个个数据集合,我我们传给了它它个参数,第第一个参数是是当前工作对对象(记录、窗窗口、或清单单),第二个个参数是,即即我们希望的的模式I集合合;第三个参参数是清单字字段名称“Itemss”.从Line 110-11我我们看到,我我们使用了dds1这个前前缀,表示操操作是对于清清单的。Line 5-32是循环环处理,Liine 6是是定位到第ii条记录,如如
13、果到了末尾尾,或者根本本没有清单,那那么函数会返返回-1,-2,等负数数。从Line 226-29将将构造SQLL语句,假如如Code是是200055,uPriice=100,那么这个个语句将使Update tblInnstockkItemss set uPricce=10 Wheree Codee=20055Line 300,使用SQQL函数去执执行这个语句句。Line 122,检查了获获取库存清单单序号的合法法性,如果获获取了非法结结果,Linne 12-20又构造造了一个提示示窗口这个窗口是Liine 200的执行结果果。为了显示示这个窗口,系系统需要一个个字符串数组组的对象gSStri
14、nggArrayy,这个在LLine 113中构造。这这个对象是字字符串数组,即即其每个元素素都是一个字字符串。因为这个窗口需需要3个字符符串,(1)编编辑框中的提提示信息,(22)按钮“Contiinue”,(3)按按钮“Canceel”。另外最后后还要附加几几个空白字符符串,以便系系统知道谁是是最后一个按按钮牛。当用用户按第一个个按钮时,这这个函数返回回0,第二个个返回1,依依次类推。如如果超时,返返回-1。这段代码,在一一般正常情况况下,反复操操作所有清单单,处理完毕毕后返回0,审审核成功。注意返回-1,表表示审核失败败。示例二其它它问题这里依赖一个字字段JInnstockkItemss
15、Code,即库存明明细的序号,如如果没有这个个字段,或者者由于其它原原因,这个字字段的值无法法取道,怎么么办呢? 下面代代码说明如何何使用批号来来替代,当然然你可以增加加更多的检查查,防止错误误int i=00,i1,iic1,j11;double pricee1;string s1;gDataSeet ds11(thiss,1,IItems);for(i=00;+ii) i1=ds1.MMoveToo(i); if(i10) retuurn 0; priice1=dds1.neewGet22(uPrrice); ic11=(intt)ds1.newGeet2(LLotsCoode); if(
16、ic1=0) gStrringArrray SSA1(thhis); s1=Liness Conttain NNo leaagal IInformmationn ,linne=; s1+=(i+1); SA1.Appennd(s1); SA1.Appennd(Coontinuue); SA1.Appennd(Caancel); SA1.Appennd(); j1=SSA1.ShhowMesssage(); if(jj1=1) returrn -1; elsse s1=Updatte tbllInstoockIteems seet uPrrice=; s1+=pricee1; s1+= Whee
17、re LootsCodde=; s1+=ic1; SQL(s1); return 0;示例三,保保存事件用户希望在采购购订单中,自自动根据生产产单的开工日日期,填写提提前7天为供供应商的交货货日期。为了解决这个问问题,我们编编写保存事件件的代码,代代码如下1 strinng s1;2 int xx1=newwGet2(PraccticeTTable);3 if(x11!=2766)4 rreturnn 0;5 6 s1=neewGetXX4(Reelateiid_XCoode.Sttart1);7 int xx2=UDCCharTooInt(ss1.c_sstr();8 int xx3=Get
18、tDateXX(-1,66);9 if(x22-7*244*60*660 x3)10 gSStringgArrayy SA1(this);11 strinng s2=时间错误误,提前时间间后,在今天天之前:;12 s2+=ss1;13 SA1.AAppendd(s2);14 SSA1.Apppend(放弃);15 SA1.AAppendd(仍然继继续);16 SA1.AAppendd();17 int jj1=SA11.ShowwMessaage();18 if(j11=0)19 retturn -1;20 21 22 newSSet2(Delivverdatte,x22-7*244*60*6
19、60);23 retuurn 0;这里解释如下,LL2中,取得得当前单据的的业务类型窗窗口的序号,不不为生产单的的话,直接返返回。L6漫漫游查找到生生产单据的开开工日期,结结果应该是“2007.12.300”可阅读格式式的,因此LL7使用UDDCharTToInt将将其转换为UUnix长整整数形式,LL8取得当天天时间,L99-L21,在在提前七天后后小于今天的的值时给予提提示,L177接受用户返返回按钮如果用户按第一一个按钮,则则返回0(依依次类推),此此时我们返回回-1,告诉诉系统处理失失败。如果继继续,或者正正确的话,LL22将执行行,设置字段段Deliiverdaate交货货日期的希望
20、望值。代码编写好后,在在用户代码窗窗口保存到数数据库,然后后为采购订单单,增加保存存数据的事事事件:客户程序重新启启动后,代码码生效。示例三的进一步步问题当用户在生产单单中自动产生生采购订单时时,如果结果果是多张采购购订单,而且且每张都出现现提示,如果果要求后面的的同一张生产产单产生的单单据不再显示示上述对话框框时怎样做呢呢?解决办法是,设设置一个静态态变量,为生生产单号,如如果本次的生生产单号与上上次的相同,那那么就不再提提示,而是按按照这个内容容继续处理。目前的问题是:每次你这段程序运行时,都是在一个全新的虚拟空间运行,所谓上次的结果无影无踪。因此这个时候我们要使用这对函数void Uss
21、erSett(charr *Varrable,char *Valuue); 给全局变量量设置字符串串值string UserGGet(chhar *VVarablle); 获取全局变变量的值程序如下1 strinng s1;2 int xx1=newwGet2(PraccticeTTable);3 if(x11!=2766)4 rreturnn -91;5 6 s1=neewGetXX4(Reelateiid_XCoode.Sttart1);7 int xx2=UDCCharTooInt(ss1.c_sstr();8 int xx3=GettDateXX(-1,66);9 if(x22-7*2
22、44*60*660 x3)10 strinng sb11=newGGetX4(Relaateid_XCodee); strinng sb22=UserrGet(MyNamme011); if(sbb1!=sbb2) UserSSet(MMyNamee011,sb1.cc_str();10 gStriingArrray SAA1(thiis);11 strinng s2=时间错误误,提前时间间后,在今天天之前:;12 s2+=ss1;13 SA1.AAppendd(s2);14 SA1.AAppendd(放弃);15 SA1.AAppendd(仍然继继续);16 SA1.AAppendd();1
23、7 int jj1=SA11.ShowwMessaage();18 if(j11=0)19 retturn -1;20 21 22 newSSet2(Delivverdatte,x22-7*244*60*660);23 retuurn 0;当然可能更复杂杂,例如可以以保存上次用用户按按钮的的值,如果是是相同的生产产单,那么下下次自动返回回相同的值,或或者作出相同同的反应。示例四,下拉列列表控制记录录事件在采购退货单窗窗口,用户希望在下下拉采购收货货单时,列出出采购收货单单,同时将数数量控制到仅仅存的库存数数量,防止数数量不符合库库存,无法出出库。这个操作,在“采购调价单单”窗口是这样样控制的,
24、系系统内部使用用的是一个函函数“SelecctSaleeLoadCCargo_PriceeAdjusst”。因此,你你只要能调用用这个函数就就可以了。(1)首先编写写事件,代码码如下int M=CCurrenntModee();if(M=22) CalllFuncction(SeleectSalleLoaddCargoo_PricceAdjuust);(2)为”相关关单据字段”增加DroopDownn事件客户端重启后,下下拉这个字段段的编辑框,会会弹出单据,选选择后,系统统会根据当前前库存调整允允许退货的数数量。这个事件可以在在其它需要类类似处理的字字段共享。示例四的进一步步问题如果希望带回来
25、来的清单数量量自动为0,如如果后面又没没有填写,就就不要保存怎怎么办呢?解决办法之一是是,是在CaallFunnctionn(SellectSaaleLoaadCarggo_PriiceAdjjust)后面增加代代码,将清单单的Amouunt字段清清除掉;至于于是否保存,系系统已有的表表单是这样处处理的,自定定义的表单字字段,只要取取正确特征码码,也具有这这个特点。方案二,在清单单字段,设置置下面选项(因因此一些情况况下,不再需需要这些代码码了)示例五,记录选选择后的事件件对于一些行业,业业务公司的营营业执照到期期后,不再允允许发生业务务。此时可以定义营营业执照到期期字段,下面面以为这个字字段
26、是“VisittTime”来说明这个个需求。(1)首先编写写事件,代码码如下代码片段一:string s1= getPaarametters(33);if(s1!=149 & ss1!=161) reeturn 1;return 0;1)返回值仍然然遵守标准规规则,-1表表示失败,返返回1允许选择,返返回0表示要要系统按照默默认方式再检检查。2)这里使用了了循环,因为为用户可能选选择多条记录录,因此要逐逐一检查3)x1=(iint)neewGet22(VissitTimme)中,因因为newGGet2返回回floatt类型,而我我们用intt类型来接收收结果,因此此有强制类型型的转换。4) s
27、triing s11= getPaarametters(33)获得第33个参数,所所在窗口的序序号,接下来来就是说,如如果不在销售售订单窗口,也也不在采购订订单窗口,那那么允许选择择。5)如果希望有有更多控制,那么可以使使用如下类似似的代码。代码片段二:int i=00,i1,xx1,x2;double pricee1;string s1= getPaarametters(33);if(s1!=149 & ss1!=161) reeturn 1;for(i=00;+ii) i1=MoveTTo(i); if(i10) retuurn 0; s1=newGeetX4(VisittTime); x
28、1=(int)newGeet2(VVisitTTime); x2=GetDaateX(-1,6); if(x1x22) gStrringArrray SSA1(thhis); striing s22=本记录录时间到期,; s2+=s1; SA1.Appennd(s2); SA1.Appennd(不选选择); SA1.Appennd(仍然然选择); SA1.Appennd(); int j1=SAA1.ShoowMesssage(); if(jj1=0) returrn -1; return 0;(2)然后为”业务公司”打开业务处处理设置窗口口,增加Seelectiion事件(3)客户端重重启后
29、,如果果选择某个到到期的业务公公司,那么系系统会有如下下提示。注意1:如果仅仅仅是针对有有效期、禁用用等,系统有有默认的处理理,例如设置置字段为有效效期的检查,或或者将记录设设置有禁用。不不过上述原理理,可以用于于更广泛的目目的。注意2:如果用用户有事件,那那么返回-11表示禁止选选择,1表示允许选选择,0表示系统还还要按照默认认方式检查。注意3:参数说说明。strinng s1=getPaarametters(33)返回第三三个参数,这这个事件的几几个参数为getParaameterrs(0) Evennt_Sellectioon (事事件名称)getParaameterrs(1) Bann
30、 Checck 或者者Valiid Cheeck (辅助助参数,指在在做什么检测测)getParaameterrs(2) 记录窗窗口的序号 getParaameterrs(3) 正在操操作的窗口的的序号。示例六:建立选选择记录的事事件Evennt_DroopDownnSetIttems一些时候,下拉拉框拉开时,我我们希望完全全按照我们的的意愿建立需需要选择的记记录。例如,采采购订单中,业业务类型拉开开后显示如下下项目: 这些类类型是系统默默认的,可能能发生采购的的业务类型。如如果不需要其其中一些,那那么可以在业业务类型的“业务选项”页签设置,将将某些类型去去掉。我们也也可以完全指指定,例如设设
31、置成“入库单、出出库单”在这里显示示,而其它项项目方而不在在这里显示。(注注意:这并非非联系,一些些企业就是按按照出库、或或者入库来采采购的。) 在另外外一些情况下下,这类设置置无法起作用用,那么此时时就可以考虑虑使用Eveent_DrropDowwnSetIItems。 下面代代码就是说明明如何仅仅让让“入库单、出出库单”在采购订单单中显示的示示例int rett1=0;int s1=(int)newGeet2(CCode);string s2=geetParaameterrs(3);if(s2=149) iff(s1=158 | s1=165) rett1=1; ellse rett1=-
32、1; return ret1;注意1:如果用用户有事件,那那么返回-11表示禁止选选择,1表示允许选选择,0表示系统按按照默认方式式建立项目。注意3:参数说说明。strinng s1=getPaarametters(33)返回第三三个参数,这这个事件的几几个参数为getParaameterrs(0) Evennt_DroopDownnSetIttems (事件名称称)getParaameterrs(1) DroppDownSSetIteems (辅助参数数,指在做什什么检测)getParaameterrs(2) 记录窗窗口的序号 getParaameterrs(3) 正在操操作的窗口的的序号。
33、示例七:表单底底色、字体颜颜色事件一些用户,期望望在显示时候候,根据不同同情况显示不不同颜色。此此时表单颜色事事件就能够解决决这类问题。这里的示例是一一家医药物流流公司,希望望在弹出式库库存分布窗口口,根据库存存的有效期,显显示不同颜色色,以便及时时处理。(1)编写事件件代码如下1 douuble DDx1=neewGet22(LottsCodee.Deaddline);2 intt Todaay1=GeetDateeX(-1,0);3 if(Dx1TToday11+10*224*60*60)4 SeetResuult(2255,2555,0;2255,0,0);5 6 elsse if(Dx
34、1TToday11+30*224*60*60)7 SeetResuult(2255,1228,64;255,00,0);8 9 elsse if(Dx1TToday11+60*224*60*60)10 SSetRessult(255,1168,1225;2555,0,0);11 12 ellse iff(Dx1Todayy1+2400*24*660*60)13 SSetRessult(192,1192,1992;2555,0,0);14 代码是是一入库明细细为基础的,LL.1是取得得该批号的有有效期,L22是取得当天天的日期。结结果都是从11970.11.1开始的的秒数。L33是判断这个个有效
35、期是不不是在10天天以内,L112判断是不不是在8个月月以内。L44是设置底色色与字体颜色色,颜色是由由RGB三色色组成,英文文逗号分开,前前面三个是表表单底色,后后面三个是字字体颜色。RRGB的值,可可以从任何一一个画图软件件查询到。(2)编写事件件要赋于给ttblInsstockIItems_For_SScheduule的,这这个名称可以以从弹出的表表单窗口,在在最左上角单单元格选择功功能“编辑/显示示数据库据名名称”获得。将这个个名称从提示示窗口的底部部复制后,选选择主窗口功功能,“选项-窗口口/打开指定定窗口”,从这个窗窗口,选择“综合处理/高级设置/业务处理设设置”,做如下修修改后,
36、按修修改保存这里的事件名称称就是你前面面在“用户C语言言程序”中编写的代代码。(3)最后的显显示效果如下下示例八:查询后后的事件一些用户,期望望在查询结果果后,根据不不同情况做一一些处理。此此时表单查询事事件 Eventt_Retrrive就能能够解决这类类问题。这里的示例是公公司,希望在在用户1000登录时,查查询20088.06以前前数据时,使使用其它表单单的数据。(1)编写事件件代码如下1 intt t1,tt2,t3,t7;2 flooat t44,t5,tt6;3 chaar *c11,*c2;4 strring uuc1=GeetUserrInf(Code);5 if(uc1=10
37、0)6 7 t3=(int)newGeet2(DDate1);8 if(t30 & t22=t1)21 memmmove(c1,c22,t1);22 23 prrintf(t1=%d,t2=%d,c11=%d,cc2=%d,t1,tt2,(innt)c1,(int)c2);24 prrintf(sql=%s,uuc1);25 26 ellse27 28 t11=(intt)newGGet2(Shiftt30);29 t22=(intt)newGGet2(Shiftt31);30 iff(t2-tt11.55*60*660)31 32 neewSet22(Shiift31,t1+11.5*600
38、*60+55*60);33 neewSet22(WorrkHourr_Overr,1.55);34 t44=newGGet2(WorkHHour_WWeekennd);35 t55=newGGet2(WorkHHour_OOver);36 t66=newGGet2(WorkHHour);37 neewSet22(TottalWorrkHourr,t5+t4+t66);38 39 40 41 reeturn 0;(2)编写事件件要赋于给HHDuty_DailyyReporrtX的vent_Retriive事件。注意:查询事件件是在单条记记录上运行的的,即如果查查询到1000条记录,系系统对每条记
39、记录都单独运运行代码。因因此程序不需需要处理复杂杂的问题。查询事件其它示示例(1)用户查询询库存综合报报表时,希望望一部分空白白数据不要显显示,那么可可以给表单ttblSalleSynttheticc编写” 查询后的事事件”,对于那些些不需要显示示的数据,返返回-1,系系统会过滤掉掉这部分数据据。注意,可以使用用getPaarametters(11,2,3,)函数,测试到底是那个函数在调用本事件。(2)用户采购购订单窗口,不不显示那些应应收货日期超超过特定长度度的单据,因因为这些单据据估计不再收收货了。那么么可以给采购购订单编写” 查询后的事事件”,对于那些些不需要显示示的数据,返返回-1,系
40、系统会过滤掉掉这部分数据据。这些数据仅仅不不显示了,示例九:综合示示例对于医药行业,某某些业务公司司禁售某些产产品。(1)此时用户户要定义一张张表单(窗口口),例如是是UprodductPrrohibiit来保存这这些禁售信息息的。(2)再编写(例如销售订订单的)事件件,事件可以以放在保存事事件、或者审审核事件。代代码如下int i=00,i1,jj1,cidd,pid;string s1,s22;double tt;cid=(innt)newwGet2(ClieentID);gDataSeet ds11(thiss,1,IItems);for(i=00;+ii) i1=ds1.MMoveTo
41、o(i); if(i10.0001) ggStrinngArraay SA11(thiss); s1=警告!该该产品对当前前的业务公司司禁售; s1+=(i+1); SA11.Appeend(s11); SA1.Appennd(确认认); SA11.Appeend(); j1=SSA1.ShhowMesssage();return -1; return 0;这段代码,是逐逐个检查这些些物品,是否否在禁售列表表中,如果在在的话,系统统将禁止继续续。事件的参数说明明string getPaarametters(iint i) 返回第i个个参数第1个参数(ii=0),是是调用事件的的类型名称保存事件
42、为:EEvent_BeforreColllectDaata,审核核事件为Eveent_Auudit;第2个参数(ii=1)为辅辅助类型,例例如新增保存存时为Inssert,修修改保存时为为Updatte,对于审审核则为Auudit.对于不明确的,可可以自己测试试结果。3. OA-ERP虚拟拟机数据集的的工作模式gDataSeet这个类有有个方法Ruun()是空空白的,用户户的代码,在在新版本中是是填充到这个个方法中的,因因此新版本中中,完整C+的程序是这样的的: (常用用头文件部分分) claass gDDataSeet intt Run();int gDaataSett :Ruun()用户写
43、的代码部部分int funn(int i,chaar *buuff) gDattaSet _dss; reeturn _dss.Run();也就是说,当用用户程序运行行时,总是以以某个记录为为基础的,你你可以用gDDataSeet提供的方方法处理问题题。你可以用CurrrentMMode()获取工作模模式,这个函函数返回1,表表示当前操作作的记录,我我们称为模式式I;返回22当前操作的的窗体编辑框框字段-模模式II;返返回3当前操操作的清单模式IIII;模式IV则是按照照SQL语句句返回数据集集(注意:返返回的数据仍仍然工作在模模式I)。当工作在成员函函数内部时,不不需要前缀,例例如: int
44、t m1= CurreentModde(); intt m2=dds1.CuurrenttMode();前者表示取得本本记录集的工工作模式,后后者则是获取取ds1这个个数据集的工工作模式。当启动代码工作作在模式III下,如何操操作清单呢?例如我们希望统统计清单中数数量与单价的的总和,赋值值给字段Tootalchharge. 为了完成成这个任务,下面代代码就可以double Sum=00.0;gDataSeet ds11(thiss,3,IItems);int r1=ds1.GGetRoww();while(rr10) doouble x1=dss1.Callculatte2(AAmountt*
45、CoPrrice); doouble x2=dss1.newwGetTaax(x1,0); Suum=Summ+x2; r11= ds1.NextRRow();newSet22(Tottalchaarge,Sum);这里仅仅是说明明原理,因为为这为完成这这个功能,系系统提供了更更强大的函数数Sum2AAndSett(Totaalcharrge,Itemms,Amouunt*CooPricee).由于窗体编辑框框、清单,记记录,都是有有对应关系的的,都是由字字段控制的,因因此对他们的的操作也是完完全一样的,都是gDaataSett类型的数据据集,当然,在在模式II下下,NexttRow()没有作
46、用。1. 获取清单单记录集合在模式I下,可可以获取清单单记录集合,使使用下面代码码就可以了 gDaataSett ds1(this,1,Ittems);然后这个ds11是gDataSSet类,那那么这个类的的所有函数都都可以使用。2. 获取主窗窗口操作对象象 仅仅在在模式IIII下,可以这这样处理,代代码如下 gDaataSett ds1(this,2,NULL); 代码示示例 if(CurreentModde()=2) gDaataSett ds1(this,2,NULLL); douuble dd1=ds11.newGGet2(Discoount); if(d1=1)dd1=1; douu
47、ble ss1=d1*newGeet2(PPrice)*newwGet2(Amouunt); newwSet2(Summmoney,s1); 警告: 这里的模模式检查非常常重要,因为为部分代码只只在清单中运运行有效,其其它模式下并并不正确。部部分客户(例例如希尔科)的代码因为为缺少这个检检查出现过错错误。3.取得名称为为Itesmm的清单 仅仅在在模式II、IIII下,可可以这样处理理,代码如下下gDataSeet ds11(thiss,3, Iteems);(在模式II下下,可以使用用这中方式操操作另外的清清单。)4.按照SQLL语句返回数数据集 在任何何模式下都有有效,可以这这样处理,代代
48、码如下 strring SSQL1=Selecct * Fromm tblIInstocckItemms Wheere Ammount55242888) (这个个语句是列举举所有的入库库单中存在剩剩余库存的明细,MaiinCodee In是保证这些些单据已经入入库,而不是是当前未入库库的单据)gDataSeet ds11(thiss,4,SQL1.c_strr();(注意:返回的的数据仍然工工作在模式II,只是要传传递4这个参参数。)代码示例 下面面是一个完整整的使用SQQL语句返回回数据集作的的示例1 sttring SQL1=Seleect * From tblInnstockkItems
49、s Wherre AmoountOOutAmoount AAnd MaainCodde In (Seleect Coode Frrom tbblInsttock WWhere Recorrd5244288);2 gDDataSeet ds11(thiss,4,SQQL1.c_str();3 gSStringgArrayy SA1(this);4 sttring s2=库库存分布如下下,;5 s22.addRReturnn();6 s22+=总行行数:;7 innt couunt1=dds1.GeetCounnt();8 s22+=couunt1;9 prrintf(counnt1=%dd,co
50、uunt1);10 s22.addRReturnn();11 innt i,ii1;12 foor(i=00;i=0)15 16 sttring s1b=dds1.neewGetXX4(Prroductt);17 sttring s2b=dds1.neewGetXX4(SttoreHoouse);18 doouble a1=dss1.newwGet2(Amouunt);19 doouble a2=a11-ds1.newGeet2(OOutAmoount);20 s22+=物品品名称:;21 s22+=s1bb;22 s22+=,仓仓库:;23 s22+=s2bb;24 s22+=,入入库数量:
51、;25 s22+=a1;26 s22+=,剩剩余数量:;27 s22+=a2;28 s22.addRReturnn();29 30 31 SAA1.Apppend(ss2);32 SAA1.Apppend(确定);33 SAA1.Apppend();34 SAA1.ShoowMesssage();35 reeturn 0;运行时提示窗口口如下:5. 获取树形形节点的数据据集 在任何何模式2,33下都有效gDataSeet ds11(thiss,5,NULL);例如:在配色表表中,希望取取得BOM清清单中的几个个自定义字段段的值,并显显示在配色表表窗口中,供供参考。代码码如下:int p0,p1
52、,s11;string lo1,ss2;gDataSeet ds11(thiss,5,NUULL);CreateFFieldss(X0001,长,22);CreateFFieldss(X0002,宽,22);CreateFFieldss(X0003,场,22);if(CurrrentMoode()!=3)reeturn 0;p0=(intt)ds1.newGeet2(PProducct);p1=(intt)newGGet2(Produuct);s1=(intt)newGGet2(Speciif);lo1=newwGetX44(LoccationnX);s2=Sellect * Fromm pr
53、dBBOMIteems Whhere PProducct=;s2+=p1;s2+= AAnd Sppecif=;s2+=s1;s2+= AAnd LoocatioonX=;s2+=lo11;s2+=;s2+= AAnd MaainCodde In ( Sellect CCode FFrom pprdBOMM Wherre Prooduct=;s2+=p0;s2+=);gDataSeet ds22(thiss,4,s22.c_sttr();newSet22(X0001,dss2.newwGet2(uLenngth);newSet22(X0002,dss2.newwGet2(uWiddth);ne
54、wSet22(X0003,dss2.newwGet2(uThiicknesss);6. 空白数据据集 在任何何模式下都有有效gDataSeet ds11(thiss,6,char *cn1);例如: cn11为表单名称称或表单序号号.4. C语言言代码解决特特殊业务示例例基本意义OA-ERP做做为一个通用用系统,因此此不能在一些些非常专们的的需求方面走走的太远,但但是使用C/C+语言言扩展程序,原原则上可以解解决任何的可可能需求。如果用C/C+语言解决决了,那么任任何其他语言言也未必能解解决。示例一:外贸费费用的计算1) 一个外贸贸用户,在销销售报价、销销售订单中,都都因为存在费费用,因此启启
55、用了费用方方案、费用清清单。2) 这些费用用中,一部分分是固定的,例例如手续费、标标签费等。3) 另外一部部分费用,不不是固定的,例例如“单物品金额额保值费”,它是根据据物品清单的的费用总和再再乘以一个系系数得到的;再如“关税”等,是其它它费用的总和和,再乘以一一个系数得到到的。C语言代码设置置 1)我我们先定义费费用项目如下下。 注意这这这里的两个个特殊项目的的序号分别是是200033、200004,他们要要特别处理。 2)在在销售报价单单的中定义CC语言程序: 这里只只需要给第三三行、第四行行项目定义CC语言程序。我我们将数量固固定为1,于于是只需要给给单价字段定定义C语言程程序就可以了了
56、,“询价单物品品金额保值费费”是统计物品品清单的费用用总和,因此此可以使用代代码:代码片段一 Sum22AndSeet(Prrice,Itemms,SSummonney);这里Sum2AAndSett的作用是:计算清单IItems的的表达式SSummonney的总总和,然后赋赋值给Prrice字字段。 第四行行“费用汇总项项关税”的意义是,计计算其它行的的总金额,乘乘以一个系数数,例如0.5,因此定定义C语言程程序是代码片段二 flooat D11=Sum22(Iteems3,Summmoney); floaat D2=newGeet2(SSummonney); newwSet2(Pricce
57、,(DD1-D2)*0.5);这里解释一下,第第1行的意思思是,计算清清单Iteems3的的表达式SSummonney的总总和,第2行行的意思是,获获得本行SSummonney的值值。因为仅仅仅计算其它行行的Summmoneyy的值,所所以他们的结结果要相减(D1-D22)。第3行行的意思是,计计算结果(DD1-D2)*0.5,赋赋值给字段Pricee。 现在的的问题是,在在第三行用代代码片段一,第第四行则用代代码片段二,其其它行不计算算,那么如何何处理呢?我们使用newwGet2(Typee1)获取取字段Tyype1的的序号,我们们记得,第三三行“询价单物品品金额保值费费”的序号是22000
58、3,第第四行“费用汇总项项关税”的序号是220004,因因此C语言程程序就是如下下形式最后代码if(newGGet2(Type11)=220003) Summ2AndSSet(PPrice,Iteems,Summooney);if(newGGet2(Type11)=220004) flooat D11=Sum22(Iteems3,Summmoney); flooat D22=newGGet2(Summooney); newwSet2(Pricce,(DD1-D2)*0.5); 3)一一点优化。上上面代码中,newGet2(Type1)调用2次,影响了效率,因此采用下面优化的形式加速计算优化后的
59、代码片片段int typpe1=neewGet22(Typpe1);if(typee1=200003) Summ2AndSSet(PPrice,Iteems,Summooney);else iff(typee1=200004) flooat D11=Sum22(Iteems3,Summmoney); flooat D22=newGGet2(Summooney); newwSet2(Pricce,(DD1-D2)*0.5);最实际使用的代代码片段如下下:int typpe1=neewGet22(Typpe1);float DD2=Summ2(Ittems,Summmoney);float DD3
60、=newwGet2(MainnCode.Exchaange);if(typee1=200003) /国国际空运 floaat D1=newGeet2(MMainCoode.Reelateiid_XCoode.xEExtraFFieldss03); newSSet2(Pricee,D1*1.5);else iff(typee1=200004) /保保险 newSSet2(Pricee,D2*0.00229*1.11);else iff(typee1=200014) /代代理费 newwSet2(Pricce,D22*D3*00.01/1100);else iff(typee1=200001) /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度冷链物流空调清洗消毒与防冻服务合同2篇
- 2025年度企业内部员工保密协议(新修订)5篇
- 二零二五年度国际会议兼职同声传译及外教聘请协议3篇
- 2025年香港建筑工程合同正规范本标准版6篇
- 二零二五年度城市污水处理厂承包管理服务协议4篇
- 二零二五年度大型活动现场解说配音合作协议4篇
- 2025年喷灌系统节水技术创新合作合同4篇
- 2025年度农产品供应链金融合作协议-@-1
- 二零二五年度展览馆场地租赁与展会组织服务合同3篇
- 2025年金融科技支付系统开发与运营合同3篇
- 茉莉花-附指法钢琴谱五线谱
- 结婚函调报告表
- SYT 6968-2021 油气输送管道工程水平定向钻穿越设计规范-PDF解密
- 冷库制冷负荷计算表
- 肩袖损伤护理查房
- 设备运维管理安全规范标准
- 办文办会办事实务课件
- 大学宿舍人际关系
- 2023光明小升初(语文)试卷
- GB/T 14600-2009电子工业用气体氧化亚氮
- 申请使用物业专项维修资金征求业主意见表
评论
0/150
提交评论