




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 秋葵软件OA-ERP高级设计C/C+语言开发指南目录 1 新版本C/C+语言变更说明2 OA-ERP与用户程序的交互 示例一审核事件 示例二:保存事件 示例三:保存事件 示例四:下拉列表控制记录事件Event_DropDown 清单数据转移的设置选项:库存参考,自动清除数量 示例五:记录选择后的事件Event_Selection 示例六:建立选择记录的事件Event_DropDownSetItems 示例七:表单颜色事件Event_GridColor 示例八:数据查询处理事件Event_Retrive 示例九:综合示例,禁售产品的业务规划3 OA-ERP虚拟机数据集的工作模式 数据集工作模式
2、 使用SQL语句返回数据集完整示例 取得树形节点的数据集4 C/ C+语言代码解决特殊业务示例示例一:外贸费用的计算示例二:部分清单行的计算示例二:采购付款金额的控制结果字段值的控制练习一个复杂的报价计算5 代码逻辑故障分析6 表单自动转换事件示例一:7 查询结果转换清单事件附录1. OA-ERP虚拟机C/C+数据工作模式附录2. OA-ERP支持的数据类型附录3. OA-ERP事件类型一览表附录4. C/C+基础附录5. 更多示例 8 函数指针、与动态链接库9 产生提成表的程序2344791011131516171818202223232731323334353638394042435054
3、5758引言为了满足大量未知的、以及特殊的需求,系统内置了虚拟机。由于是C+虚拟机,因此理论上应该是能满足任何功能扩充。本文件仅仅是对如何使用这个技术做一个概览性介绍。 OA-ERP允许用户全面开发自定义需求功能. (1) 自定义表单,并且给它增加字段. (2) 给系统原来自带的表单增加新的字段. (3) 完全自定义报表. (4) 全面控制业务处理过程.所谓全面控制业务处理过程,就是在新增单据、审核单据、处理完毕单据,用户录入数据过程中的控制。给每个字段增加代码,就是处理“录入数据过程中的控制”。本文主要讲述用程序编写功能强大的业务处理功能。 初学者理解这些内容的顺序如下 (1) C/C+的基
4、本工作方式. (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=ds1.Calculate2(Amoun
5、t*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(buff0=R & buff0=M & bu
6、ff0=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目前开放的允许用户自己控制的地方是(1) 新增单据(2) 审核单据(3) 处理完毕单据(4) 用户录入数据过程。(5
7、) 下拉框事件 由于用户处理数据的对象有所不同,因此OA-ERP系统将他们分为三大类:(1) 记录(2) 窗口编辑框(3) 清单 记录指内存或数据库中的一条记录,或多条记录; 窗口编辑框是用户交互的输入位置;清单指窗口中的清单.当系统处于记录处理状态是,系统状态为;窗口编辑框状态为;清单状态为我们可以用CurrentMode()获得当前状态的值示例一,审核事件裁床明细窗口中的一段代码是:* 556.3 Amount *int M=CurrentMode();if(M=2) Sum2AndSet(NULL,Items,Amount);这段代码是加载到主单据Amoun字段的,仅仅在模式II中工作,
8、合计Itesm清单Amount字段。示例二,保存事件用户定义了一个全新的窗口,用于调整结算价。而结算价则是用户自己定义的,贯穿全部清单的一个字段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
9、; 10 price1=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
10、 -1;23 34 25 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,使用SQ
12、L函数去执行这个语句。Line 12,检查了获取库存清单序号的合法性,如果获取了非法结果,Line 12-20又构造了一个提示窗口这个窗口是Line 20的执行结果。为了显示这个窗口,系统需要一个字符串数组的对象gStringArray,这个在Line 13中构造。这个对象是字符串数组,即其每个元素都是一个字符串。因为这个窗口需要3个字符串,(1)编辑框中的提示信息,(2)按钮“Continue”,(3)按钮“Cancel”。另外最后还要附加几个空白字符串,以便系统知道谁是最后一个按钮牛。当用户按第一个按钮时,这个函数返回0,第二个返回1,依次类推。如果超时,返回-1。这段代码,在一般正常情况
13、下,反复操作所有清单,处理完毕后返回0,审核成功。注意返回-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=(i
14、nt)ds1.newGet2(LotsCode); 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 L
15、otsCode=; s1+=ic1; SQL(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*60x3)10 gSt
16、ringArray SA1(this);11 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漫游查找到生产单据的开工日期,结
17、果应该是“2007.12.30”可阅读格式的,因此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 -
19、91;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*60x3)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;
20、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;当然可能更复杂,例如可以保存上次用户按按钮的值,如果是相同的生产单,那么下次自动返回相同的值,或者作出相同的反应。示例四,下拉列表控制记录事件在采购退货单窗口,用户希望在下拉采购收货单时,列出采购收货单,同时将数量控制到仅存的库存数量,防止
21、数量不符合库存,无法出库。这个操作,在“采购调价单”窗口是这样控制的,系统内部使用的是一个函数“SelectSaleLoadCargo_PriceAdjust”。因此,你只要能调用这个函数就可以了。(1)首先编写事件,代码如下int M=CurrentMode();if(M=2) CallFunction(SelectSaleLoadCargo_PriceAdjust);(2)为”相关单据字段”增加DropDown事件客户端重启后,下拉这个字段的编辑框,会弹出单据,选择后,系统会根据当前库存调整允许退货的数量。这个事件可以在其它需要类似处理的字段共享。示例四的进一步问题如果希望带回来的清单数量
22、自动为0,如果后面又没有填写,就不要保存怎么办呢?解决办法之一是,是在CallFunction(SelectSaleLoadCargo_PriceAdjust)后面增加代码,将清单的Amount字段清除掉;至于是否保存,系统已有的表单是这样处理的,自定义的表单字段,只要取正确特征码,也具有这个特点。方案二,在清单字段,设置下面选项(因此一些情况下,不再需要这些代码了)示例五,记录选择后的事件对于一些行业,业务公司的营业执照到期后,不再允许发生业务。此时可以定义营业执照到期字段,下面以为这个字段是“VisitTime”来说明这个需求。(1)首先编写事件,代码如下代码片段一:string s1=
23、getParameters(3);if(s1!=149 & s1!=161) return 1;return 0;1)返回值仍然遵守标准规则,-1表示失败,返回1允许选择,返回0表示要系统按照默认方式再检查。2)这里使用了循环,因为用户可能选择多条记录,因此要逐一检查3)x1=(int)newGet2(VisitTime)中,因为newGet2返回float类型,而我们用int类型来接收结果,因此有强制类型的转换。4) string s1= getParameters(3)获得第3个参数,所在窗口的序号,接下来就是说,如果不在销售订单窗口,也不在采购订单窗口,那么允许选择。5)如果希望有更多控
24、制,那么可以使用如下类似的代码。代码片段二:int i=0,i1,x1,x2;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(s
25、2); SA1.Append(不选择); SA1.Append(仍然选择); SA1.Append(); int j1=SA1.ShowMessage(); if(j1=0) return -1; return 0;(2)然后为”业务公司”打开业务处理设置窗口,增加Selection事件(3)客户端重启后,如果选择某个到期的业务公司,那么系统会有如下提示。注意1:如果仅仅是针对有效期、禁用等,系统有默认的处理,例如设置字段为有效期的检查,或者将记录设置有禁用。不过上述原理,可以用于更广泛的目的。注意2:如果用户有事件,那么返回-1表示禁止选择,1表示允许选择,0表示系统还要按照默认方式检查。注
26、意3:参数说明。string s1=getParameters(3)返回第三个参数,这个事件的几个参数为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=1
28、58 | s1=165) ret1=1; else ret1=-1; return ret1;注意1:如果用户有事件,那么返回-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;
30、255,0,0);8 9 else if(Dx1Today1+60*24*60*60)10 SetResult(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的值
31、,可以从任何一个画图软件查询到。(2)编写事件要赋于给tblInstockItems_For_Schedule的,这个名称可以从弹出的表单窗口,在最左上角单元格选择功能“编辑/显示数据库据名称”获得。将这个名称从提示窗口的底部复制后,选择主窗口功能,“选项-窗口/打开指定窗口”,从这个窗口,选择“综合处理/高级设置/业务处理设置”,做如下修改后,按修改保存这里的事件名称就是你前面在“用户C语言程序”中编写的代码。(3)最后的显示效果如下示例八:查询后的事件一些用户,期望在查询结果后,根据不同情况做一些处理。此时表单查询事件 Event_Retrive就能够解决这类问题。这里的示例是公司,希望在
32、用户100登录时,查询2008.06以前数据时,使用其它表单的数据。(1)编写事件代码如下1 int t1,t2,t3,t7;2 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
33、 t1=(int)newGet2(Shift30);29 t2=(int)newGet2(Shift31);30 if(t2-t11.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)编写事件要赋于给HD
34、uty_DailyReportX的vent_Retrive事件。注意:查询事件是在单条记录上运行的,即如果查询到100条记录,系统对每条记录都单独运行代码。因此程序不需要处理复杂的问题。查询事件其它示例(1)用户查询库存综合报表时,希望一部分空白数据不要显示,那么可以给表单tblSaleSynthetic编写” 查询后的事件”,对于那些不需要显示的数据,返回-1,系统会过滤掉这部分数据。注意,可以使用getParameters(1,2,3,)函数,测试到底是那个函数在调用本事件。(2)用户采购订单窗口,不显示那些应收货日期超过特定长度的单据,因为这些单据估计不再收货了。那么可以给采购订单编写”
35、 查询后的事件”,对于那些不需要显示的数据,返回-1,系统会过滤掉这部分数据。这些数据仅仅不显示了,示例九:综合示例对于医药行业,某些业务公司禁售某些产品。(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(i
36、10.0001) gStringArray SA1(this); s1=警告!该产品对当前的业务公司禁售; s1+=(i+1); SA1.Append(s1); SA1.Append(确认); SA1.Append(); j1=SA1.ShowMessage();return -1; return 0;这段代码,是逐个检查这些物品,是否在禁售列表中,如果在的话,系统将禁止继续。事件的参数说明string getParameters(int i) 返回第i个参数第1个参数(i=0),是调用事件的类型名称保存事件为:Event_BeforeCollectData,审核事件为Event_Audit;
37、第2个参数(i=1)为辅助类型,例如新增保存时为Insert,修改保存时为Update,对于审核则为Audit.对于不明确的,可以自己测试结果。3. OA-ERP虚拟机数据集的工作模式gDataSet这个类有个方法Run()是空白的,用户的代码,在新版本中是填充到这个方法中的,因此新版本中,完整C+的程序是这样的: (常用头文件部分) class gDataSet int Run();int gDataSet :Run()用户写的代码部分int fun(int i,char *buff) gDataSet _dss; return _dss.Run();也就是说,当用户程序运行时,总是以某个记
38、录为基础的,你可以用gDataSet提供的方法处理问题。你可以用CurrentMode()获取工作模式,这个函数返回1,表示当前操作的记录,我们称为模式I;返回2当前操作的窗体编辑框字段-模式II;返回3当前操作的清单-模式III;模式IV则是按照SQL语句返回数据集(注意:返回的数据仍然工作在模式I)。当工作在成员函数内部时,不需要前缀,例如: int m1= CurrentMode(); int m2=ds1.CurrentMode();前者表示取得本记录集的工作模式,后者则是获取ds1这个数据集的工作模式。当启动代码工作在模式II下,如何操作清单呢?例如我们希望统计清单中数量与单价的总和
39、,赋值给字段Totalcharge. 为了完成这个任务,下面代码就可以double Sum=0.0;gDataSet ds1(this,3,Items);int r1=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);这里仅仅是说明原理,因为这为完成这个功能,系统提供了更强大的函数Sum2AndSet(Totalcharge,Items,Amo
40、unt*CoPrice).由于窗体编辑框、清单,记录,都是有对应关系的,都是由字段控制的,因此对他们的操作也是完全一样的,都是gDataSet类型的数据集,当然,在模式II下,NextRow()没有作用。1. 获取清单记录集合在模式I下,可以获取清单记录集合,使用下面代码就可以了 gDataSet ds1(this,1,Items);然后这个ds1是gDataSet类,那么这个类的所有函数都可以使用。2. 获取主窗口操作对象 仅仅在模式III下,可以这样处理,代码如下 gDataSet ds1(this,2,NULL); 代码示例 if(CurrentMode()=2) gDataSet ds
41、1(this,2,NULL); double d1=ds1.newGet2(Discount); if(d1=1)d1=1; double s1=d1*newGet2(Price)*newGet2(Amount); newSet2(Summoney,s1); 警告: 这里的模式检查非常重要,因为部分代码只在清单中运行有效,其它模式下并不正确。部分客户(例如希尔科)的代码因为缺少这个检查出现过错误。3.取得名称为Itesm的清单 仅仅在模式II、III下,可以这样处理,代码如下gDataSet ds1(this,3, Items);(在模式II下,可以使用这中方式操作另外的清单。)4.按照SQL
42、语句返回数据集 在任何模式下都有效,可以这样处理,代码如下 string SQL1=Select * From tblInstockItems Where Amount524288) (这个语句是列举所有的入库单中存在剩余库存的明细,MainCode In是保证这些单据已经入库,而不是当前未入库的单据)gDataSet ds1(this,4,SQL1.c_str();(注意:返回的数据仍然工作在模式I,只是要传递4这个参数。)代码示例 下面是一个完整的使用SQL语句返回数据集作的示例1 string SQL1=Select * From tblInstockItems Where Amount
43、OutAmount And MainCode In (Select Code From tblInstock Where Record524288);2 gDataSet ds1(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=ds1.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+
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 营养障碍性疾病诊疗与护理考核试题及答案
- 油漆工安全操作规程
- 英语阅读训练调查及分析
- 优化有限空间作业的专项计划
- 智能交通行业中小企业劳动合同规范
- 电子商务平台保证金合同
- 草牧场承包权流转与农业现代化实施合同
- 出租自住合并方案
- 高速公路草料运输通行费优惠政策合同
- 消系统施工方案
- 2023年义乌市双江湖开发集团有限公司招聘笔试题库及答案解析
- 通信建设工程质量和安全生产监督检查表最新文档
- 医学高级职称评审答辩报告PPT模板
- 肺栓塞的诊断和治疗
- DB4451-T 1-2021《地理标志产品+凤凰单丛(枞)茶》-(高清现行)
- 信访工作课品课件
- 加油站火灾、爆炸事故现场处置方案
- IPQC技能培训
- 2022年(详细版)高中数学学业水平考试知识点
- 常用乐高零件清单
- 蛋糕制作工艺课件(PPT81张)
评论
0/150
提交评论