秋葵软件OA-ERP高级设计_第1页
秋葵软件OA-ERP高级设计_第2页
秋葵软件OA-ERP高级设计_第3页
秋葵软件OA-ERP高级设计_第4页
秋葵软件OA-ERP高级设计_第5页
已阅读5页,还剩58页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、. C/C+言语开发指南PAGE :.;PAGE 63秋葵软件OA-ERP高级设计C/C+言语开发指南目录 1 新版本C/C+言语变卦阐明2 OA-ERP与用户程序的交互 例如一审核事件 例如二:保管事件 例如三:保管事件 例如四:下拉列表控制记录事件Event_DropDown 清单数据转移的设置选项:库存参考,自动去除数量 例如五:记录选择后的事件Event_Selection 例如六:建立选择记录的事件Event_DropDownSetItems 例如七:表单颜色事件Event_GridColor 例如八:数据查询处置事件Event_Retrive 例如九:综合例如,禁售产品的业务规划3

2、 OA-ERP虚拟机数据集的任务方式 数据集任务方式 运用SQL语句前往数据集完好例如 获得树形节点的数据集4 C/ C+言语代码处理特殊业务例如例如一:外贸费用的计算例如二:部分清单行的计算例如二:采购付款金额的控制结果字段值的控制练习一个复杂的报价计算5 代码逻辑缺点分析6 表单自动转换事件例如一:7 查询结果转换清单事件附录1. OA-ERP虚拟机C/C+数据任务方式附录2. OA-ERP支持的数据类型附录3. OA-ERP事件类型一览表附录4. C/C+根底附录5. 更多例如 8 函数指针、与动态链接库9 产生提成表的程序23447910111315161718182022232327

3、313233343536383940424350545758引言为了满足大量未知的、以及特殊的需求,系统内置了虚拟机。由于是C+虚拟机,因此实际上应该是能满足任何功能扩展。本文件仅仅是对如何运用这个技术做一个概览性引见。 OA-ERP允许用户全面开发自定义需求功能. (1) 自定义表单,并且给它添加字段. (2) 给系统原带的表单添加新的字段. (3) 完全自定义报表. (4) 全面控制业务处置过程.所谓全面控制业务处置过程,就是在新增单据、审核单据、处置终了单据,用户录入数据过程中的控制。给每个字段添加代码,就是处置“录入数据过程中的控制。本文主要讲述用程序编写功能强大的业务处置功能。 初学

4、者了解这些内容的顺序如下 (1) C/C+的根本任务方式. (2) 数据集的概念.(3) 事件的概念.(4) 附录.1.新版本C/C+言语变卦阐明2007.12.04自学请勿跳过,这里是观念的转变,如何从C言语进入到C+。下面函数不再运用 (1)BeginRepeatEndRepeat 这对函数主要目的是在窗口录入形状下(方式II),切换到清单,计算清单行的数据: 新的版本中,运用数据集的概念,不再需求切换。例子原来C言语程序(老版本)为 int r=GetRow();int j=BeginRepeat(Items);float Sum=0;while(j0 & j0) double x1=d

5、s1.Calculate2(Amount*CoPrice); double x2=ds1.newGetTax(x1,0); Sum=Sum+x2; r1= ds1.NextRow();newSet2(NULL,Sum);新版本中,不再需求切换,操作代表清单的数据集合ds1就可以了。这个例子也是阐明如何从C言语程序过度到C+程序。请查看系统自带的其它例如程序。(2)newGetX3 这个函数主要目的是是前往字段的字符串值: 新的版本中,运用newGetX4直接获得这个目的。例如原来的代码是char buff128;newGetX3(xExtraFields_C01,128,buff)if(buf

6、f0=R & buff0=M & buff0=B) double X2=newGet2(Product.LTimetblPurchcontr);newSet2(Price,X2); 新版本代码如下string s1=newGetX4(xExtraFields_C01)if(s1=RMB) double X2=newGet2(Product.LTimetblPurchcontr);newSet2(Price,X2); 可以看四处置复杂问题时运用C+代码,较C言语更容易接近人的思想的直观性。2. C/C+事件OA-ERP目前开放的允许用户本人控制的地方是新增单据审核单据处置终了单据用户录入数据过程

7、。下拉框事件 由于用户处置数据的对象有所不同,因此OA-ERP系统将他们分为三大类:记录窗口编辑框清单 记录指内存或数据库中的一条记录,或多条记录; 窗口编辑框是用户交互的输入位置;清单指窗口中的清单.当系统处于记录处置形状是,系统形状为;窗口编辑框形状为;清单形状为我们可以用CurrentMode()获得当前形状的值例如一,审核事件裁床明细窗口中的一段代码是:* 556.3 Amount *int M=CurrentMode();if(M=2) Sum2AndSet(NULL,Items,Amount);这段代码是加载到主单据Amoun字段的,仅仅在方式II中任务,合计Itesm清单Amou

8、nt字段。例如二,保管事件用户定义了一个全新的窗口,用于调整结算价。而结算价那么是用户本人定义的,贯穿全部清单的一个字段uPrice 标识几个特别的价钱。在这个窗口中,用户本人设计了录入信息的方式,从库存中选择剩余库存,录入新的结算价uPrice,然后希望单据审核时,修正库存中的结算价uPrice。代码应该加载到审核函数,设置方式是:代码清单是int i=0,i1,ic1,j1;double price1;string s1;gDataSet ds1(this,1,Items);for(i=0;+i) i1=ds1.MoveTo(i); if(i10) return 0; 10 price1=

9、ds1.newGet2(uPrice);11 ic1=(int)ds1.newGet2(JInstockItemsCode);12 if(ic1=0)13 gStringArray SA1(this);14 s1=我要显示一些信息:Lines Contain No leagal Information ,line=;15 s1+=(i+1);16 SA1.Append(s1);17 SA1.Append(按钮1);18 SA1.Append(按钮2);19 SA1.Append();20 j1=SA1.ShowMessage();21 if(j1=1)22 return -1;23 34 25

10、 else26 s1=Update tblInstockItems set uPrice=;27 s1+=price1;28 s1+= Where Code=;29 s1+=ic1;30 SQL(s1);31 3233 return 0;阐明:我们希望获得清单行,然后将每行的JInstockItemsCode字段值取出来,这个数据是库存清单的序号,然后获得uPrice字段的值,将这个值更新到数据库中去。审核单据时,系统传给我们的操作对象是单据本身,那么如何获得清单行?如何操作清单行呢?Line 4完成了这个任务,整个清单我们封装在gDataSet这个数据构造中的,为了构造这个数据集合,我们传给

11、了它个参数,第一个参数是当前任务对象记录、窗口、或清单,第二个参数是,即我们希望的方式I集合;第三个参数是清单字段称号“Items.从Line 10-11我们看到,我们运用了ds1这个前缀,表示操作是对于清单的。Line 5-32是循环处置,Line 6是定位到第i条记录,假设到了末尾,或者根本没有清单,那么函数会前往-1,-2,等负数。从Line 26-29将构造SQL语句,假设Code是20005,uPrice=10,那么这个语句将使Update tblInstockItems set uPrice=10 Where Code=2005Line 30,运用SQL函数去执行这个语句。Line

12、 12,检查了获取库存清单序号的合法性,假设获取了非法结果,Line 12-20又构造了一个提示窗口这个窗口是Line 20的执行结果。为了显示这个窗口,系统需求一个字符串数组的对象gStringArray,这个在Line 13中构造。这个对象是字符串数组,即其每个元素都是一个字符串。由于这个窗口需求3个字符串,1编辑框中的提示信息,2按钮“Continue,3按钮“Cancel。另外最后还要附加几个空白字符串,以便系统知道谁是最后一个按钮牛。当用户按第一个按钮时,这个函数前往0,第二个前往1,依次类推。假设超时,前往-1。这段代码,在普通正常情况下,反复操作一切清单,处置终了后前往0,审核胜

13、利。留意前往-1,表示审核失败。例如二其它问题这里依赖一个字段JInstockItemsCode,即库存明细的序号,假设没有这个字段,或者由于其它缘由,这个字段的值无法取道,怎样办呢? 下面代码阐明如何运用批号来替代,当然他可以添加更多的检查,防止错误int i=0,i1,ic1,j1;double price1;string s1;gDataSet ds1(this,1,Items);for(i=0;+i) i1=ds1.MoveTo(i); if(i10) return 0; price1=ds1.newGet2(uPrice); ic1=(int)ds1.newGet2(LotsCode

14、); if(ic1=0) gStringArray SA1(this); s1=Lines Contain No leagal Information ,line=; s1+=(i+1); SA1.Append(s1); SA1.Append(Continue); SA1.Append(Cancel); SA1.Append(); j1=SA1.ShowMessage(); if(j1=1) return -1; else s1=Update tblInstockItems set uPrice=; s1+=price1; s1+= Where LotsCode=; s1+=ic1; SQL(

15、s1); return 0;例如三,保管事件用户希望在采购订单中,自动根据消费单的开工日期,填写提早7天为供应商的交货日期。为理处理这个问题,我们编写保管事件的代码,代码如下1 string s1;2 int x1=newGet2(PracticeTable);3 if(x1!=276)4 return 0;5 6 s1=newGetX4(Relateid_XCode.Start1);7 int x2=UDCharToInt(s1.c_str();8 int x3=GetDateX(-1,6);9 if(x2-7*24*60*60 x3)10 gStringArray SA1(this);11

16、 string s2=时间错误,提早时间后,在今天之前:;12 s2+=s1;13 SA1.Append(s2);14 SA1.Append(放弃);15 SA1.Append(依然继续);16 SA1.Append();17 int j1=SA1.ShowMessage();18 if(j1=0)19 return -1;20 21 22 newSet2(Deliverdate,x2-7*24*60*60);23 return 0;这里解释如下,L2中,获得当前单据的业务类型窗口的序号,不为消费单的话,直接前往。L6遨游查找到消费单据的开工日期,结果应该是“2007.12.30可阅读格式的,

17、因此L7运用UDCharToInt将其转换为Unix长整数方式,L8获得当天时间,L9-L21,在提早七天后小于今天的值时给予提示,L17接受用户前往按钮假设用户按第一个按钮,那么前往0依次类推,此时我们前往-1,通知系统处置失败。假设继续,或者正确的话,L22将执行,设置字段Deliverdate交货日期的希望值。代码编写好后,在用户代码窗口保管到数据库,然后为采购订单,添加保管数据的事事件:客户程序重新启动后,代码生效。例如三的进一步问题当用户在消费单中自动产生采购订单时,假设结果是多张采购订单,而且每张都出现提示,假设要求后面的同一张消费单产生的单据不再显示上述对话框时怎样做呢?处理方法

18、是,设置一个静态变量,为消费单号,假设本次的消费单号与上次的一样,那么就不再提示,而是按照这个内容继续处置。目前的问题是:每次他这段程序运转时,都是在一个全新的虚拟空间运转,所谓上次的结果无影无踪。因此这个时候我们要运用这对函数void UserSet(char *Varable,char *Value); 给全局变量设置字符串值string UserGet(char *Varable); 获取全局变量的值程序如下1 string s1;2 int x1=newGet2(PracticeTable);3 if(x1!=276)4 return -91;5 6 s1=newGetX4(Relat

19、eid_XCode.Start1);7 int x2=UDCharToInt(s1.c_str();8 int x3=GetDateX(-1,6);9 if(x2-7*24*60*60 x3)10 string sb1=newGetX4(Relateid_XCode); string sb2=UserGet(MyName011); if(sb1!=sb2) UserSet(MyName011,sb1.c_str();10 gStringArray SA1(this);11 string s2=时间错误,提早时间后,在今天之前:;12 s2+=s1;13 SA1.Append(s2);14 SA

20、1.Append(放弃);15 SA1.Append(依然继续);16 SA1.Append();17 int j1=SA1.ShowMessage();18 if(j1=0)19 return -1;20 21 22 newSet2(Deliverdate,x2-7*24*60*60);23 return 0;当然能够更复杂,例如可以保管上次用户按按钮的值,假设是一样的消费单,那么下次自动前往一样的值,或者作出一样的反响。例如四,下拉列表控制记录事件在采购退货单窗口,用户希望在下拉采购收货单时,列出采购收货单,同时将数量控制到仅存的库存数量,防止数量不符合库存,无法出库。这个操作,在“采购调

21、价单窗口是这样控制的,系统内部运用的是一个函数“SelectSaleLoadCargo_PriceAdjust。因此,他只需能调用这个函数就可以了。1首先编写事件,代码如下int M=CurrentMode();if(M=2) CallFunction(SelectSaleLoadCargo_PriceAdjust);2为相关单据字段添加DropDown事件客户端重启后,下拉这个字段的编辑框,会弹出单据,选择后,系统会根据当前库存调整允许退货的数量。这个事件可以在其它需求类似处置的字段共享。例如四的进一步问题假设希望带回来的清单数量自动为0,假设后面又没有填写,就不要保管怎样办呢?处理方法之一

22、是,是在CallFunction(SelectSaleLoadCargo_PriceAdjust)后面添加代码,将清单的Amount字段去除掉;至于能否保管,系统已有的表单是这样处置的,自定义的表单字段,只需取正确特征码,也具有这个特点。方案二,在清单字段,设置下面选项因此一些情况下,不再需求这些代码了例如五,记录选择后的事件对于一些行业,业务公司的营业执照到期后,不再允许发生业务。此时可以定义营业执照到期字段,下面以为这个字段是“VisitTime来阐明这个需求。1首先编写事件,代码如下代码片段一:string s1= getParameters(3);if(s1!=149 & s1!=16

23、1) return 1;return 0;1前往值依然遵守规范规那么,-1表示失败,前往1允许选择,前往0表示要系统按照默许方式再检查。2这里运用了循环,由于用户能够选择多条记录,因此要逐一检查3x1=(int)newGet2(VisitTime)中,由于newGet2前往float类型,而我们用int类型来接纳结果,因此有强迫类型的转换。4) string s1= getParameters(3)获得第3个参数,所在窗口的序号,接下来就是说,假设不在销售订单窗口,也不在采购订单窗口,那么允许选择。5)假设希望有更多控制,那么可以运用如下类似的代码。代码片段二:int i=0,i1,x1,x2

24、;double price1;string s1= getParameters(3);if(s1!=149 & s1!=161) return 1;for(i=0;+i) i1=MoveTo(i); if(i10) return 0; s1=newGetX4(VisitTime); x1=(int)newGet2(VisitTime); x2=GetDateX(-1,6); if(x1x2) gStringArray SA1(this); string s2=本记录时间到期,; s2+=s1; SA1.Append(s2); SA1.Append(不选择); SA1.Append(依然选择);

25、 SA1.Append(); int j1=SA1.ShowMessage(); if(j1=0) return -1; return 0;2然后为业务公司翻开业务处置设置窗口,添加Selection事件3客户端重启后,假设选择某个到期的业务公司,那么系统会有如下提示。留意1:假设仅仅是针对有效期、禁用等,系统有默许的处置,例如设置字段为有效期的检查,或者将记录设置有禁用。不过上述原理,可以用于更广泛的目的。留意2:假设用户有事件,那么前往-1表示制止选择,1表示允许选择,0表示系统还要按照默许方式检查。留意3:参数阐明。string s1=getParameters(3)前往第三个参数,这个

26、事件的几个参数为getParameters(0) Event_Selection 事件称号getParameters(1) Ban Check 或者Valid Check (辅助参数,指在做什么检测)getParameters(2) 记录窗口的序号 getParameters(3) 正在操作的窗口的序号。例如六:建立选择记录的事件Event_DropDownSetItems一些时候,下拉框拉开时,我们希望完全按照我们的志愿建立需求选择的记录。例如,采购订单中,业务类型拉开后显示如下工程: 这些类型是系统默许的,能够发生采购的业务类型。假设不需求其中一些,那么可以在业务类型的“业务选项页签设置,

27、将某些类型去掉。我们也可以完全指定,例如设置成“入库单、出库单在这里显示,而其它工程方而不在这里显示。留意:这并非联络,一些企业就是按照出库、或者入库来采购的。 在另外一些情况下,这类设置无法起作用,那么此时就可以思索运用Event_DropDownSetItems。 下面代码就是阐明如何仅仅让“入库单、出库单在采购订单中显示的例如int ret1=0;int s1=(int)newGet2(Code);string s2=getParameters(3);if(s2=149) if(s1=158 | s1=165) ret1=1; else ret1=-1; return ret1;留意1:

28、假设用户有事件,那么前往-1表示制止选择,1表示允许选择,0表示系统按照默许方式建立工程。留意3:参数阐明。string s1=getParameters(3)前往第三个参数,这个事件的几个参数为getParameters(0) Event_DropDownSetItems 事件称号getParameters(1) DropDownSetItems (辅助参数,指在做什么检测)getParameters(2) 记录窗口的序号 getParameters(3) 正在操作的窗口的序号。例如七:表单底色、字体颜色事件一些用户,期望在显示时候,根据不同情况显示不同颜色。此时表单颜色事件就可以处理这类问

29、题。这里的例如是一家医药物流公司,希望在弹出式库存分布窗口,根据库存的有效期,显示不同颜色,以便及时处置。1编写事件代码如下1 double Dx1=newGet2(LotsCode.Deadline);2 int Today1=GetDateX(-1,0);3 if(Dx1Today1+10*24*60*60)4 SetResult(255,255,0;255,0,0);5 6 else if(Dx1Today1+30*24*60*60)7 SetResult(255,128,64;255,0,0);8 9 else if(Dx1Today1+60*24*60*60)10 SetResult

30、(255,168,125;255,0,0);11 12 else if(Dx1Today1+240*24*60*60)13 SetResult(192,192,192;255,0,0);14 代码是一入库明细为根底的,L.1是获得该批号的有效期,L2是获得当天的日期。结果都是从1970.1.1开场的秒数。L3是判别这个有效期是不是在10天以内,L12判别是不是在8个月以内。L4是设置底色与字体颜色,颜色是由RGB三色组成,英文逗号分开,前面三个是表单底色,后面三个是字体颜色。RGB的值,可以从任何一个画图软件查询到。2编写事件要赋于给tblInstockItems_For_Schedule的,

31、这个称号可以从弹出的表单窗口,在最左上角单元格选择功能“编辑/显示数据库据称号获得。将这个称号从提示窗口的底部复制后,选择主窗口功能,“选项-窗口/翻开指定窗口,从这个窗口,选择“综合处置/高级设置/业务处置设置,做如下修正后,按修正保管这里的事件称号就是他前面在“用户C言语程序中编写的代码。3最后的显示效果如下例如八:查询后的事件一些用户,期望在查询结果后,根据不同情况做一些处置。此时表单查询事件 Event_Retrive就可以处理这类问题。这里的例如是公司,希望在用户100登录时,查询2021.06以前数据时,运用其它表单的数据。1编写事件代码如下1 int t1,t2,t3,t7;2

32、float t4,t5,t6;3 char *c1,*c2;4 string uc1=GetUserInf(Code);5 if(uc1=100)6 7 t3=(int)newGet2(Date1);8 if(t30 & t2=t1)21 memmove(c1,c2,t1);22 23 printf(t1=%d,t2=%d,c1=%d,c2=%d,t1,t2,(int)c1,(int)c2);24 printf(sql=%s,uc1);25 26 else27 28 t1=(int)newGet2(Shift30);29 t2=(int)newGet2(Shift31);30 if(t2-t1

33、1.5*60*60)31 32 newSet2(Shift31,t1+1.5*60*60+5*60);33 newSet2(WorkHour_Over,1.5);34 t4=newGet2(WorkHour_Weekend);35 t5=newGet2(WorkHour_Over);36 t6=newGet2(WorkHour);37 newSet2(TotalWorkHour,t5+t4+t6);38 39 40 41 return 0;2编写事件要赋于给HDuty_DailyReportX的vent_Retrive事件。留意:查询事件是在单条记录上运转的,即假设查询到100条记录,系统对每

34、条记录都单独运转代码。因此程序不需求处置复杂的问题。查询事件其它例如1用户查询库存综合报表时,希望一部分空白数据不要显示,那么可以给表单tblSaleSynthetic编写 查询后的事件,对于那些不需求显示的数据,前往-1,系统会过滤掉这部分数据。留意,可以运用getParameters1,2,3,函数,测试究竟是那个函数在调用身手件。2用户采购订单窗口,不显示那些应收货日期超越特定长度的单据,由于这些单据估计不再收货了。那么可以给采购订单编写 查询后的事件,对于那些不需求显示的数据,前往-1,系统会过滤掉这部分数据。这些数据仅仅不显示了,例如九:综合例如对于医药行业,某些业务公司禁售某些产品

35、。1此时用户要定义一张表单窗口,例如是UproductProhibit来保管这些禁售信息的。2再编写(例如销售订单的)事件,事件可以放在保管事件、或者审核事件。代码如下int i=0,i1,j1,cid,pid;string s1,s2;double tt;cid=(int)newGet2(ClientID);gDataSet ds1(this,1,Items);for(i=0;+i) i1=ds1.MoveTo(i); if(i10.0001) gStringArray SA1(this); s1=警告!该产品对当前的业务公司禁售; s1+=(i+1); SA1.Append(s1); SA

36、1.Append(确认); SA1.Append(); j1=SA1.ShowMessage();return -1; return 0;这段代码,是逐个检查这些物品,能否在禁售列表中,假设在的话,系统将制止继续。事件的参数阐明string getParameters(int i) 前往第i个参数第1个参数i=0,是调用事件的类型称号保管事件为:Event_BeforeCollectData,审核事件为Event_Audit;第2个参数(i=1)为辅助类型,例如新增保管时为Insert,修正保管时为Update,对于审核那么为Audit.对于不明确的,可以本人测试结果。3. OA-ERP虚拟机

37、数据集的任务方式gDataSet这个类有个方法Run是空白的,用户的代码,在新版本中是填充到这个方法中的,因此新版本中,完好C+的程序是这样的: (常用头文件部分) class gDataSet int Run();int gDataSet :Run()用户写的代码部分int fun(int i,char *buff) gDataSet _dss; return _dss.Run();也就是说,当用户程序运转时,总是以某个记录为根底的,他可以用gDataSet提供的方法处置问题。他可以用CurrentMode()获取任务方式,这个函数前往1,表示当前操作的记录,我们称为方式I;前往2当前操作的

38、窗体编辑框字段-方式II;前往3当前操作的清单-方式III;方式IV那么是按照SQL语句前往数据集(留意:前往的数据依然任务在方式I)。当任务在成员函数内部时,不需求前缀,例如: int m1= CurrentMode(); int m2=ds1.CurrentMode();前者表示获得本记录集的任务方式,后者那么是获取ds1这个数据集的任务方式。当启动代码任务在方式II下,如何操作清单呢?例如我们希望统计清单中数量与单价的总和,赋值给字段Totalcharge. 为了完成这个义务,下面代码就可以double Sum=0.0;gDataSet ds1(this,3,Items);int r1=

39、ds1.GetRow();while(r10) double x1=ds1.Calculate2(Amount*CoPrice); double x2=ds1.newGetTax(x1,0); Sum=Sum+x2; r1= ds1.NextRow();newSet2(Totalcharge,Sum);这里仅仅是阐明原理,由于这为完成这个功能,系统提供了更强大的函数Sum2AndSetTotalcharge,Items,Amount*CoPrice.由于窗体编辑框、清单,记录,都是有对应关系的,都是由字段控制的,因此对他们的操作也是完全一样的,都是gDataSet类型的数据集,当然,在方式II

40、下,NextRow()没有作用。1. 获取清单记录集合在方式I下,可以获取清单记录集合,运用下面代码就可以了 gDataSet ds1(this,1,Items);然后这个ds1是gDataSet类,那么这个类的一切函数都可以运用。2. 获取主窗口操作对象 仅仅在方式III下,可以这样处置,代码如下 gDataSet ds1(this,2,NULL); 代码例如 if(CurrentMode()=2) gDataSet ds1(this,2,NULL); double d1=ds1.newGet2(Discount); if(d1=1)d1=1; double s1=d1*newGet2(Pr

41、ice)*newGet2(Amount); newSet2(Summoney,s1); 警告: 这里的方式检查非常重要,由于部分代码只在清单中运转有效,其它方式下并不正确。部分客户(例如希尔科)的代码由于短少这个检查出现过错误。3.获得称号为Itesm的清单 仅仅在方式II、III下,可以这样处置,代码如下gDataSet ds1(this,3, Items);在方式II下,可以运用这中方式操作另外的清单。4.按照SQL语句前往数据集 在任何方式下都有效,可以这样处置,代码如下 string SQL1=Select * From tblInstockItems Where Amount5242

42、88) (这个语句是列举一切的入库单中存在剩余库存的明细,MainCode In是保证这些单据曾经入库,而不是当前未入库的单据)gDataSet ds1(this,4,SQL1.c_str();(留意:前往的数据依然任务在方式I,只是要传送4这个参数。)代码例如 下面是一个完好的运用SQL语句前往数据集作的例如1 string SQL1=Select * From tblInstockItems Where AmountOutAmount And MainCode In (Select Code From tblInstock Where Record524288);2 gDataSet ds

43、1(this,4,SQL1.c_str();3 gStringArray SA1(this);4 string s2=库存分布如下,;5 s2.addReturn();6 s2+=总行数:;7 int count1=ds1.GetCount();8 s2+=count1;9 printf(count1=%d,count1);10 s2.addReturn();11 int i,i1;12 for(i=0;i=0)15 16 string s1b=ds1.newGetX4(Product);17 string s2b=ds1.newGetX4(StoreHouse);18 double a1=d

44、s1.newGet2(Amount);19 double a2=a1-ds1.newGet2(OutAmount);20 s2+=物品称号:;21 s2+=s1b;22 s2+=,仓库:;23 s2+=s2b;24 s2+=,入库数量:;25 s2+=a1;26 s2+=,剩余数量:;27 s2+=a2;28 s2.addReturn();29 30 31 SA1.Append(s2);32 SA1.Append(确定);33 SA1.Append();34 SA1.ShowMessage();35 return 0;运转时提示窗口如下:5. 获取树形节点的数据集 在任何方式2,3下都有效gD

45、ataSet ds1(this,5,NULL);例如:在配色表中,希望获得BOM清单中的几个自定义字段的值,并显示在配色表窗口中,供参考。代码如下:int p0,p1,s1;string lo1,s2;gDataSet ds1(this,5,NULL);CreateFields(X001,长,2);CreateFields(X002,宽,2);CreateFields(X003,场,2);if(CurrentMode()!=3)return 0;p0=(int)ds1.newGet2(Product);p1=(int)newGet2(Product);s1=(int)newGet2(Speci

46、f);lo1=newGetX4(LocationX);s2=Select * From prdBOMItems Where Product=;s2+=p1;s2+= And Specif=;s2+=s1;s2+= And LocationX=;s2+=lo1;s2+=;s2+= And MainCode In ( Select Code From prdBOM Where Product=;s2+=p0;s2+=);gDataSet ds2(this,4,s2.c_str();newSet2(X001,ds2.newGet2(uLength);newSet2(X002,ds2.newGet2(

47、uWidth);newSet2(X003,ds2.newGet2(uThickness);6. 空白数据集 在任何方式下都有效gDataSet ds1(this,6,char *cn1);例如: cn1为表单称号或表单序号.4. C言语代码处理特殊业务例如根本意义OA-ERP做为一个通用系统,因此不能在一些非常专们的需求方面走的太远,但是运用C/C+言语扩展程序,原那么上可以处理任何的能够需求。假设用C/C+言语处理了,那么任何其他言语也未必能处理。例如一:外贸费用的计算1) 一个外贸用户,在销售报价、销售订单中,都由于存在费用,因此启用了费用方案、费用清单。2) 这些费用中,一部分是固定的,

48、例如手续费、标签费等。3) 另外一部分费用,不是固定的,例如“单物品金额保值费,它是根据物品清单的费用总和再乘以一个系数得到的;再如“关税等,是其它费用的总和,再乘以一个系数得到的。C言语代码设置 1我们先定义费用工程如下。 留意这这里的两个特殊工程的序号分别是20003、20004,他们要特别处置。 2在销售报价单的中定义C言语程序: 这里只需求给第三行、第四行工程定义C言语程序。我们将数量固定为1,于是只需求给单价字段定义C言语程序就可以了,“询价单物品金额保值费是统计物品清单的费用总和,因此可以运用代码:代码片段一 Sum2AndSet(Price,Items,Summoney);这里S

49、um2AndSet的作用是:计算清单Items的表达式Summoney的总和,然后赋值给Price字段。 第四行“费用汇总项关税的意义是,计算其它行的总金额,乘以一个系数,例如0.5,因此定义C言语程序是代码片段二 float D1=Sum2(Items3,Summoney); float D2=newGet2(Summoney); newSet2(Price,(D1-D2)*0.5);这里解释一下,第1行的意思是,计算清单Items3的表达式Summoney的总和,第2行的意思是,获得本行Summoney的值。由于仅仅计算其它行的Summoney的值,所以他们的结果要相减(D1-D2)。第3

50、行的意思是,计算结果(D1-D2)*0.5,赋值给字段Price。 如今的问题是,在第三行用代码片段一,第四行那么用代码片段二,其它行不计算,那么如何处置呢?我们运用newGet2(Type1)获取字段Type1的序号,我们记得,第三行“询价单物品金额保值费的序号是20003,第四行“费用汇总项关税的序号是20004,因此C言语程序就是如下方式最后代码if(newGet2(Type1)=20003) Sum2AndSet(Price,Items,Summoney);if(newGet2(Type1)=20004) float D1=Sum2(Items3,Summoney); float D2

51、=newGet2(Summoney); newSet2(Price,(D1-D2)*0.5); 3一点优化。上面代码中,newGet2(Type1)调用2次,影响了效率,因此采用下面优化的方式加速计算优化后的代码片段int type1=newGet2(Type1);if(type1=20003) Sum2AndSet(Price,Items,Summoney);else if(type1=20004) float D1=Sum2(Items3,Summoney); float D2=newGet2(Summoney); newSet2(Price,(D1-D2)*0.5);最实践运用的代码片段

52、如下:int type1=newGet2(Type1);float D2=Sum2(Items,Summoney);float D3=newGet2(MainCode.Exchange);if(type1=20003) /国际空运 float D1=newGet2(MainCode.Relateid_XCode.xExtraFields03); newSet2(Price,D1*1.5);else if(type1=20004) /保险 newSet2(Price,D2*0.0029*1.1);else if(type1=20014) /代理费 newSet2(Price,D2*D3*0.01

53、/100);else if(type1=20001) /关税 float D4=newGet2(MainCode.Relateid_XCode.xExtraFields02); newSet2(Price,D2*D3*D4/100);else if(type1=20012) /汇费 if(D2*0.0150 & j0 & j0 & jr) double x1=ds1.Calculate2(Summoney); D6=D6+x1; j=ds1.NextRow(); newSet2(Price,D6*0.17);下面给出这部分最终运用的完好代码,供参考:int type1=newGet2(Type

54、1);float D2=Sum2(Items,Summoney);float D3=newGet2(MainCode.Exchange);if(type1=20003) float D1=newGet2(MainCode.xExtraFields01); if(D135) newSet2(Price,D1*1.5); else newSet2(Price,D1*1.75);else if(type1=20004) newSet2(Price,(D2/D3)*0.0029*1.1); else if(type1=20014) newSet2(Price,D2*0.01);else if(type

55、1=20012) if(D2*0.0150 & jr) double x1=ds1.Calculate2(Summoney); D6=D6+x1; j=ds1.NextRow(); newSet2(Price,D6*0.17);else if(type1=20016) float D4=newGet2(MainCode.ContactMethod); newSet2(Price,(D2/D3)*(1+D4)*0.17);else if(type1=20001) float D4=newGet2(MainCode.ContactMethod); newSet2(Price,D2*D4/D3);

56、else if(type1=20018) float D1=newGet2(MainCode.xExtraFields01); if(D1*0.4515) newSet2(Price,15); else newSet2(Price,D1*0.45);else if(type1=20020) float D1=newGet2(MainCode.xExtraFields01); if(D1*1.645) newSet2(Price,45); else newSet2(Price,D1*1.6);else if(type1=20021) if(D2*0.003218) newSet2(Price,1

57、8); else newSet2(Price,D2*0.0032);else if(type1=20022) float D1=newGet2(MainCode.xExtraFields01); if(D1*0.45=1000000 & D2D1*0.7) return -1;return 0;这里D1,获得“应付款的值,由于清单的字段是Items,留意表单能够有多个清单,因此这里要求注明清单的字段。D1,获得“此次付款的值. 假设D1超越100万,而且“此次付款超越D1的70时,前往-1,表示审核失败。其它情况前往0,表示经过。2) 将编写的函数录入到“用户C言语程序,然后3) 然后再“采购

58、付款的业务设置窗口,按照下面方式设置审核检查函数留意,这里“Event_Audit是审核检查函数的类型标志,由于有多种控制函数,因此不要弄错了。结果 设置好后,重新启动系统。如今选择这张单据,审核出现如下提示,表示审核失败修正金额为690,000.00,再审核,那么经过。字段值的控制 奥诺制药在订单中处置中需求操作员录入恳求数量,审核员在审核时,那么根据恳求数量、剩余款,填写审核数量。 实施人员将一个自定义字段“xExtraFields01设置为恳求数量,同时有一下要求 1假设恳求数量没有填写,那么审核数量可以恣意填写。 2假设恳求数量有填写,那么审核数量不得超越恳求数量。此时我们有如下代码f

59、loat X1=newGet2(xExtraFields01);if(X1X1 | X2X1指审核数量超出恳求数量, 4X20.01指审核数量没有填写 5| & 分别是“或者,且逻辑判别,练习 练习题:假设客户要求在销售发票中,允许多开发票金额,但是多开出的金额的税0.17必需是客户本人承当,那么如何设置流程?如何设置C言语控制? 流程设置:此时,应收账款,不能以发货单为根据了,由于发货单上的金额不能改动,改动后变成了应收账款。故设置“销售发票为应收账款的根据,此时只需在凭证模板中设置就可以了。详细请见“业务财务一体化部分。C言语设置:利用系统中预留的自定义字段,设置一下窗体:即主单据、清单中

60、的“发票金额。 然后,各个字段的C言语代码设置如下:1主单据发票金额Sum2AndSet(NULL,Items,xExtraFields01);即统计清单Items的xExtraFields01字段值赋给本字段。2清单发票金额float X1=newGet2(xExtraFields01);float X2=newGet2(Amount)*newGet2(Price);if(X10.001)newSet2(NULL,X2);即没有设置发票金额时,自动填写。3清单总金额float X1=newGet2(xExtraFields01);float X2=newGet2(Amount)*newGet

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论