版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 C/C+語言開發(fā)指南PAGE 88PAGE 秋葵軟件OA-ERP高級(jí)設(shè)計(jì)C/C+語言開發(fā)指南目錄 1 新版本C/C+語言變更說明2 OA-ERP與用戶程序的交互 示例一審核事件 示例二:保存事件 示例三:保存事件 示例四:下拉列表控制記錄事件Event_DropDown 清單數(shù)據(jù)轉(zhuǎn)移的設(shè)置選項(xiàng):庫存參考,自動(dòng)清除數(shù)量 示例五:記錄選擇后的事件Event_Selection 示例六:建立選擇記錄的事件Event_DropDownSetItems 示例七:表單顏色事件Event_GridColor 示例八:數(shù)據(jù)查詢處理事件Event_Retrive 示例九:綜合示例,禁售產(chǎn)品的業(yè)務(wù)規(guī)劃3 OA-
2、ERP虛擬機(jī)數(shù)據(jù)集的工作模式 數(shù)據(jù)集工作模式 使用SQL語句返回?cái)?shù)據(jù)集完整示例 取得樹形節(jié)點(diǎn)的數(shù)據(jù)集4 C/ C+語言代碼解決特殊業(yè)務(wù)示例示例一:外貿(mào)費(fèi)用的計(jì)算示例二:部分清單行的計(jì)算示例二:采購付款金額的控制結(jié)果字段值的控制練習(xí)一個(gè)復(fù)雜的報(bào)價(jià)計(jì)算5 代碼邏輯故障分析6 表單自動(dòng)轉(zhuǎn)換事件示例一:7 查詢結(jié)果轉(zhuǎn)換清單事件附錄1. OA-ERP虛擬機(jī)C/C+數(shù)據(jù)工作模式附錄2. OA-ERP支持的數(shù)據(jù)類型附錄3. OA-ERP事件類型一覽表附錄4. C/C+基礎(chǔ)附錄5. 更多示例 8 函數(shù)指針、與動(dòng)態(tài)鏈接庫9 產(chǎn)生提成表的程序234479101113151617181820222323273132
3、33343536383940424350545758引言為了滿足大量未知的、以及特殊的需求,系統(tǒng)內(nèi)置了虛擬機(jī)。由于是C+虛擬機(jī),因此理論上應(yīng)該是能滿足任何功能擴(kuò)充。本文件僅僅是對(duì)如何使用這個(gè)技術(shù)做一個(gè)概覽性介紹。 OA-ERP允許用戶全面開發(fā)自定義需求功能. (1) 自定義表單,并且給它增加字段. (2) 給系統(tǒng)原來自帶的表單增加新的字段. (3) 完全自定義報(bào)表. (4) 全面控制業(yè)務(wù)處理過程.所謂全面控制業(yè)務(wù)處理過程,就是在新增單據(jù)、審核單據(jù)、處理完畢單據(jù),用戶錄入數(shù)據(jù)過程中的控制。給每個(gè)字段增加代碼,就是處理“錄入數(shù)據(jù)過程中的控制”。本文主要講述用程序編寫功能強(qiáng)大的業(yè)務(wù)處理功能。 初學(xué)者
4、理解這些內(nèi)容的順序如下 (1) C/C+的基本工作方式. (2) 數(shù)據(jù)集的概念.(3) 事件的概念.(4) 附錄.1.新版本C/C+語言變更說明(2007.12.04)(自學(xué)請(qǐng)勿跳過,這里是觀念的轉(zhuǎn)變,如何從C語言進(jìn)入到C+。)下面函數(shù)不再使用 (1)BeginRepeatEndRepeat 這對(duì)函數(shù)主要目的是在窗口錄入狀態(tài)下(模式II),切換到清單,計(jì)算清單行的數(shù)據(jù): 新的版本中,使用數(shù)據(jù)集的概念,不再需要切換。例子原來C語言程序(老版本)為 int r=GetRow();int j=BeginRepeat(Items);float Sum=0;while(j0 & j0) double x
5、1=ds1.Calculate2(Amount*CoPrice); double x2=ds1.newGetTax(x1,0); Sum=Sum+x2; r1= ds1.NextRow();newSet2(NULL,Sum);新版本中,不再需要切換,操作代表清單的數(shù)據(jù)集合ds1就可以了。這個(gè)例子也是說明如何從C語言程序過度到C+程序。請(qǐng)查看系統(tǒng)自帶的其它示例程序。(2)newGetX3 這個(gè)函數(shù)主要目的是是返回字段的字符串值: 新的版本中,使用newGetX4直接獲得這個(gè)目的。例如原來的代碼是char buff128;newGetX3(xExtraFields_C01,128,buff)if(
6、buff0=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); 可以看到處理復(fù)雜問題時(shí)使用C+代碼,較C語言更容易接近人的思維的直觀性。2. C/C+事件OA-ERP目前開放的允許用戶自己控制的地方是新增單據(jù)審核單據(jù)處理完畢單據(jù)用戶錄入數(shù)
7、據(jù)過程。下拉框事件 由于用戶處理數(shù)據(jù)的對(duì)象有所不同,因此OA-ERP系統(tǒng)將他們分為三大類:記錄窗口編輯框清單 記錄指內(nèi)存或數(shù)據(jù)庫中的一條記錄,或多條記錄; 窗口編輯框是用戶交互的輸入位置;清單指窗口中的清單.當(dāng)系統(tǒng)處于記錄處理狀態(tài)是,系統(tǒng)狀態(tài)為;窗口編輯框狀態(tài)為;清單狀態(tài)為我們可以用CurrentMode()獲得當(dāng)前狀態(tài)的值示例一,審核事件裁床明細(xì)窗口中的一段代碼是:* 556.3 Amount *int M=CurrentMode();if(M=2) Sum2AndSet(NULL,Items,Amount);這段代碼是加載到主單據(jù)Amoun字段的,僅僅在模式II中工作,合計(jì)Itesm清單A
8、mount字段。示例二,保存事件用戶定義了一個(gè)全新的窗口,用于調(diào)整結(jié)算價(jià)。而結(jié)算價(jià)則是用戶自己定義的,貫穿全部清單的一個(gè)字段uPrice 標(biāo)識(shí)幾個(gè)特別的價(jià)格。在這個(gè)窗口中,用戶自己設(shè)計(jì)了錄入信息的方式,從庫存中選擇剩余庫存,錄入新的結(jié)算價(jià)uPrice,然后希望單據(jù)審核時(shí),修改庫存中的結(jié)算價(jià)uPrice。代碼應(yīng)該加載到審核函數(shù),設(shè)置方式是:代碼清單是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 price
9、1=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
10、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字段值取出來,這個(gè)數(shù)據(jù)是庫存清單的序號(hào),然后獲得uPrice字段的值,將這個(gè)值更新到數(shù)據(jù)庫中去。審核單據(jù)時(shí),系統(tǒng)傳給我們的操作對(duì)象是單據(jù)本身,那么如何獲得清單行?如何操作清單行呢?Line 4完成了這個(gè)工作,整個(gè)清單我們封裝在gDataSet這個(gè)數(shù)據(jù)結(jié)構(gòu)中的,為了構(gòu)造這個(gè)數(shù)據(jù)集合,我們
11、傳給了它個(gè)參數(shù),第一個(gè)參數(shù)是當(dāng)前工作對(duì)象(記錄、窗口、或清單),第二個(gè)參數(shù)是,即我們希望的模式I集合;第三個(gè)參數(shù)是清單字段名稱“Items”.從Line 10-11我們看到,我們使用了ds1這個(gè)前綴,表示操作是對(duì)于清單的。Line 5-32是循環(huán)處理,Line 6是定位到第i條記錄,如果到了末尾,或者根本沒有清單,那么函數(shù)會(huì)返回-1,-2,等負(fù)數(shù)。從Line 26-29將構(gòu)造SQL語句,假如Code是20005,uPrice=10,那么這個(gè)語句將使Update tblInstockItems set uPrice=10 Where Code=2005Line 30,使用SQL函數(shù)去執(zhí)行這個(gè)語句
12、。Line 12,檢查了獲取庫存清單序號(hào)的合法性,如果獲取了非法結(jié)果,Line 12-20又構(gòu)造了一個(gè)提示窗口這個(gè)窗口是Line 20的執(zhí)行結(jié)果。為了顯示這個(gè)窗口,系統(tǒng)需要一個(gè)字符串?dāng)?shù)組的對(duì)象gStringArray,這個(gè)在Line 13中構(gòu)造。這個(gè)對(duì)象是字符串?dāng)?shù)組,即其每個(gè)元素都是一個(gè)字符串。因?yàn)檫@個(gè)窗口需要3個(gè)字符串,(1)編輯框中的提示信息,(2)按鈕“Continue”,(3)按鈕“Cancel”。另外最后還要附加幾個(gè)空白字符串,以便系統(tǒng)知道誰是最后一個(gè)按鈕牛。當(dāng)用戶按第一個(gè)按鈕時(shí),這個(gè)函數(shù)返回0,第二個(gè)返回1,依次類推。如果超時(shí),返回-1。這段代碼,在一般正常情況下,反復(fù)操作所有清單
13、,處理完畢后返回0,審核成功。注意返回-1,表示審核失敗。示例二其它問題這里依賴一個(gè)字段JInstockItemsCode,即庫存明細(xì)的序號(hào),如果沒有這個(gè)字段,或者由于其它原因,這個(gè)字段的值無法取道,怎么辦呢? 下面代碼說明如何使用批號(hào)來替代,當(dāng)然你可以增加更多的檢查,防止錯(cuò)誤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.new
14、Get2(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 LotsCode=;
15、s1+=ic1; SQL(s1); return 0;示例三,保存事件用戶希望在采購訂單中,自動(dòng)根據(jù)生產(chǎn)單的開工日期,填寫提前7天為供應(yīng)商的交貨日期。為了解決這個(gè)問題,我們編寫保存事件的代碼,代碼如下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
16、 SA1(this);11 string s2=時(shí)間錯(cuò)誤,提前時(shí)間后,在今天之前:;12 s2+=s1;13 SA1.Append(s2);14 SA1.Append(放棄);15 SA1.Append(仍然繼續(xù));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中,取得當(dāng)前單據(jù)的業(yè)務(wù)類型窗口的序號(hào),不為生產(chǎn)單的話,直接返回。L6漫游查找到生產(chǎn)單據(jù)的開工日期,結(jié)果應(yīng)該是“2007
17、.12.30”可閱讀格式的,因此L7使用UDCharToInt將其轉(zhuǎn)換為Unix長整數(shù)形式,L8取得當(dāng)天時(shí)間,L9-L21,在提前七天后小于今天的值時(shí)給予提示,L17接受用戶返回按鈕如果用戶按第一個(gè)按鈕,則返回0(依次類推),此時(shí)我們返回-1,告訴系統(tǒng)處理失敗。如果繼續(xù),或者正確的話,L22將執(zhí)行,設(shè)置字段Deliverdate交貨日期的希望值。代碼編寫好后,在用戶代碼窗口保存到數(shù)據(jù)庫,然后為采購訂單,增加保存數(shù)據(jù)的事事件:客戶程序重新啟動(dòng)后,代碼生效。示例三的進(jìn)一步問題當(dāng)用戶在生產(chǎn)單中自動(dòng)產(chǎn)生采購訂單時(shí),如果結(jié)果是多張采購訂單,而且每張都出現(xiàn)提示,如果要求后面的同一張生產(chǎn)單產(chǎn)生的單據(jù)不再顯示
18、上述對(duì)話框時(shí)怎樣做呢?解決辦法是,設(shè)置一個(gè)靜態(tài)變量,為生產(chǎn)單號(hào),如果本次的生產(chǎn)單號(hào)與上次的相同,那么就不再提示,而是按照這個(gè)內(nèi)容繼續(xù)處理。目前的問題是:每次你這段程序運(yùn)行時(shí),都是在一個(gè)全新的虛擬空間運(yùn)行,所謂上次的結(jié)果無影無蹤。因此這個(gè)時(shí)候我們要使用這對(duì)函數(shù)void UserSet(char *Varable,char *Value); 給全局變量設(shè)置字符串值string UserGet(char *Varable); 獲取全局變量的值程序如下1 string s1;2 int x1=newGet2(PracticeTable);3 if(x1!=276)4 return -91;5 6 s1
19、=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 string sb1=newGetX4(Relateid_XCode); string sb2=UserGet(MyName011); if(sb1!=sb2) UserSet(MyName011,sb1.c_str();10 gStringArray SA1(this);11 string s2=時(shí)間錯(cuò)誤,提前時(shí)間后,在今天之前:;12 s2+=s1;13 SA1.A
20、ppend(s2);14 SA1.Append(放棄);15 SA1.Append(仍然繼續(xù));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;當(dāng)然可能更復(fù)雜,例如可以保存上次用戶按按鈕的值,如果是相同的生產(chǎn)單,那么下次自動(dòng)返回相同的值,或者作出相同的反應(yīng)。示例四,下拉列表控制記錄事件在采購?fù)素泦未翱?,用戶希望在下拉采購收貨單時(shí),列出采購收貨單,同時(shí)將數(shù)量控制到僅存的庫存數(shù)量,防止數(shù)量不符合庫存,
21、無法出庫。這個(gè)操作,在“采購調(diào)價(jià)單”窗口是這樣控制的,系統(tǒng)內(nèi)部使用的是一個(gè)函數(shù)“SelectSaleLoadCargo_PriceAdjust”。因此,你只要能調(diào)用這個(gè)函數(shù)就可以了。(1)首先編寫事件,代碼如下int M=CurrentMode();if(M=2) CallFunction(SelectSaleLoadCargo_PriceAdjust);(2)為”相關(guān)單據(jù)字段”增加DropDown事件客戶端重啟后,下拉這個(gè)字段的編輯框,會(huì)彈出單據(jù),選擇后,系統(tǒng)會(huì)根據(jù)當(dāng)前庫存調(diào)整允許退貨的數(shù)量。這個(gè)事件可以在其它需要類似處理的字段共享。示例四的進(jìn)一步問題如果希望帶回來的清單數(shù)量自動(dòng)為0,如果后
22、面又沒有填寫,就不要保存怎么辦呢?解決辦法之一是,是在CallFunction(SelectSaleLoadCargo_PriceAdjust)后面增加代碼,將清單的Amount字段清除掉;至于是否保存,系統(tǒng)已有的表單是這樣處理的,自定義的表單字段,只要取正確特征碼,也具有這個(gè)特點(diǎn)。方案二,在清單字段,設(shè)置下面選項(xiàng)(因此一些情況下,不再需要這些代碼了)示例五,記錄選擇后的事件對(duì)于一些行業(yè),業(yè)務(wù)公司的營業(yè)執(zhí)照到期后,不再允許發(fā)生業(yè)務(wù)。此時(shí)可以定義營業(yè)執(zhí)照到期字段,下面以為這個(gè)字段是“VisitTime”來說明這個(gè)需求。(1)首先編寫事件,代碼如下代碼片段一:string s1= getParam
23、eters(3);if(s1!=149 & s1!=161) return 1;return 0;1)返回值仍然遵守標(biāo)準(zhǔn)規(guī)則,-1表示失敗,返回1允許選擇,返回0表示要系統(tǒng)按照默認(rèn)方式再檢查。2)這里使用了循環(huán),因?yàn)橛脩艨赡苓x擇多條記錄,因此要逐一檢查3)x1=(int)newGet2(VisitTime)中,因?yàn)閚ewGet2返回float類型,而我們用int類型來接收結(jié)果,因此有強(qiáng)制類型的轉(zhuǎn)換。4) string s1= getParameters(3)獲得第3個(gè)參數(shù),所在窗口的序號(hào),接下來就是說,如果不在銷售訂單窗口,也不在采購訂單窗口,那么允許選擇。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=本記錄時(shí)間到期,; s2+=s1; SA1.Append(s2); SA1.
25、Append(不選擇); SA1.Append(仍然選擇); SA1.Append(); int j1=SA1.ShowMessage(); if(j1=0) return -1; return 0;(2)然后為”業(yè)務(wù)公司”打開業(yè)務(wù)處理設(shè)置窗口,增加Selection事件(3)客戶端重啟后,如果選擇某個(gè)到期的業(yè)務(wù)公司,那么系統(tǒng)會(huì)有如下提示。注意1:如果僅僅是針對(duì)有效期、禁用等,系統(tǒng)有默認(rèn)的處理,例如設(shè)置字段為有效期的檢查,或者將記錄設(shè)置有禁用。不過上述原理,可以用于更廣泛的目的。注意2:如果用戶有事件,那么返回-1表示禁止選擇,1表示允許選擇,0表示系統(tǒng)還要按照默認(rèn)方式檢查。注意3:參數(shù)說明。
26、string s1=getParameters(3)返回第三個(gè)參數(shù),這個(gè)事件的幾個(gè)參數(shù)為getParameters(0) Event_Selection (事件名稱)getParameters(1) Ban Check 或者Valid Check (輔助參數(shù),指在做什么檢測)getParameters(2) 記錄窗口的序號(hào) getParameters(3) 正在操作的窗口的序號(hào)。示例六:建立選擇記錄的事件Event_DropDownSetItems一些時(shí)候,下拉框拉開時(shí),我們希望完全按照我們的意愿建立需要選擇的記錄。例如,采購訂單中,業(yè)務(wù)類型拉開后顯示如下項(xiàng)目: 這些類型是系統(tǒng)默認(rèn)的,可能發(fā)生
27、采購的業(yè)務(wù)類型。如果不需要其中一些,那么可以在業(yè)務(wù)類型的“業(yè)務(wù)選項(xiàng)”頁簽設(shè)置,將某些類型去掉。我們也可以完全指定,例如設(shè)置成“入庫單、出庫單”在這里顯示,而其它項(xiàng)目方而不在這里顯示。(注意:這并非聯(lián)系,一些企業(yè)就是按照出庫、或者入庫來采購的。) 在另外一些情況下,這類設(shè)置無法起作用,那么此時(shí)就可以考慮使用Event_DropDownSetItems。 下面代碼就是說明如何僅僅讓“入庫單、出庫單”在采購訂單中顯示的示例int ret1=0;int s1=(int)newGet2(Code);string s2=getParameters(3);if(s2=149) if(s1=158 | s1=
28、165) ret1=1; else ret1=-1; return ret1;注意1:如果用戶有事件,那么返回-1表示禁止選擇,1表示允許選擇,0表示系統(tǒng)按照默認(rèn)方式建立項(xiàng)目。注意3:參數(shù)說明。string s1=getParameters(3)返回第三個(gè)參數(shù),這個(gè)事件的幾個(gè)參數(shù)為getParameters(0) Event_DropDownSetItems (事件名稱)getParameters(1) DropDownSetItems (輔助參數(shù),指在做什么檢測)getParameters(2) 記錄窗口的序號(hào) getParameters(3) 正在操作的窗口的序號(hào)。示例七:表單底色、字體顏
29、色事件一些用戶,期望在顯示時(shí)候,根據(jù)不同情況顯示不同顏色。此時(shí)表單顏色事件就能夠解決這類問題。這里的示例是一家醫(yī)藥物流公司,希望在彈出式庫存分布窗口,根據(jù)庫存的有效期,顯示不同顏色,以便及時(shí)處理。(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)
30、;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 代碼是一入庫明細(xì)為基礎(chǔ)的,L.1是取得該批號(hào)的有效期,L2是取得當(dāng)天的日期。結(jié)果都是從1970.1.1開始的秒數(shù)。L3是判斷這個(gè)有效期是不是在10天以內(nèi),L12判斷是不是在8個(gè)月以內(nèi)。L4是設(shè)置底色與字體顏色,顏色是由RGB三色組成,英文逗號(hào)分開,前面三個(gè)是表單底色,后面三個(gè)是字體顏色。RGB的值,可以從任何一個(gè)
31、畫圖軟件查詢到。(2)編寫事件要賦于給tblInstockItems_For_Schedule的,這個(gè)名稱可以從彈出的表單窗口,在最左上角單元格選擇功能“編輯/顯示數(shù)據(jù)庫據(jù)名稱”獲得。將這個(gè)名稱從提示窗口的底部復(fù)制后,選擇主窗口功能,“選項(xiàng)-窗口/打開指定窗口”,從這個(gè)窗口,選擇“綜合處理/高級(jí)設(shè)置/業(yè)務(wù)處理設(shè)置”,做如下修改后,按修改保存這里的事件名稱就是你前面在“用戶C語言程序”中編寫的代碼。(3)最后的顯示效果如下示例八:查詢后的事件一些用戶,期望在查詢結(jié)果后,根據(jù)不同情況做一些處理。此時(shí)表單查詢事件 Event_Retrive就能夠解決這類問題。這里的示例是公司,希望在用戶100登錄時(shí)
32、,查詢2008.06以前數(shù)據(jù)時(shí),使用其它表單的數(shù)據(jù)。(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 t1=(int
33、)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)編寫事件要賦于給HDuty_Dail
34、yReportX的vent_Retrive事件。注意:查詢事件是在單條記錄上運(yùn)行的,即如果查詢到100條記錄,系統(tǒng)對(duì)每條記錄都單獨(dú)運(yùn)行代碼。因此程序不需要處理復(fù)雜的問題。查詢事件其它示例(1)用戶查詢庫存綜合報(bào)表時(shí),希望一部分空白數(shù)據(jù)不要顯示,那么可以給表單tblSaleSynthetic編寫” 查詢后的事件”,對(duì)于那些不需要顯示的數(shù)據(jù),返回-1,系統(tǒng)會(huì)過濾掉這部分?jǐn)?shù)據(jù)。注意,可以使用getParameters(1,2,3,)函數(shù),測試到底是那個(gè)函數(shù)在調(diào)用本事件。(2)用戶采購訂單窗口,不顯示那些應(yīng)收貨日期超過特定長度的單據(jù),因?yàn)檫@些單據(jù)估計(jì)不再收貨了。那么可以給采購訂單編寫” 查詢后的事件”
35、,對(duì)于那些不需要顯示的數(shù)據(jù),返回-1,系統(tǒng)會(huì)過濾掉這部分?jǐn)?shù)據(jù)。這些數(shù)據(jù)僅僅不顯示了,示例九:綜合示例對(duì)于醫(yī)藥行業(yè),某些業(yè)務(wù)公司禁售某些產(chǎn)品。(1)此時(shí)用戶要定義一張表單(窗口),例如是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)
36、 gStringArray SA1(this); s1=警告!該產(chǎn)品對(duì)當(dāng)前的業(yè)務(wù)公司禁售; s1+=(i+1); SA1.Append(s1); SA1.Append(確認(rèn)); SA1.Append(); j1=SA1.ShowMessage();return -1; return 0;這段代碼,是逐個(gè)檢查這些物品,是否在禁售列表中,如果在的話,系統(tǒng)將禁止繼續(xù)。事件的參數(shù)說明string getParameters(int i) 返回第i個(gè)參數(shù)第1個(gè)參數(shù)(i=0),是調(diào)用事件的類型名稱保存事件為:Event_BeforeCollectData,審核事件為Event_Audit;第2個(gè)參數(shù)(i=
37、1)為輔助類型,例如新增保存時(shí)為Insert,修改保存時(shí)為Update,對(duì)于審核則為Audit.對(duì)于不明確的,可以自己測試結(jié)果。3. OA-ERP虛擬機(jī)數(shù)據(jù)集的工作模式gDataSet這個(gè)類有個(gè)方法Run()是空白的,用戶的代碼,在新版本中是填充到這個(gè)方法中的,因此新版本中,完整C+的程序是這樣的: (常用頭文件部分) class gDataSet int Run();int gDataSet :Run()用戶寫的代碼部分int fun(int i,char *buff) gDataSet _dss; return _dss.Run();也就是說,當(dāng)用戶程序運(yùn)行時(shí),總是以某個(gè)記錄為基礎(chǔ)的,你可
38、以用gDataSet提供的方法處理問題。你可以用CurrentMode()獲取工作模式,這個(gè)函數(shù)返回1,表示當(dāng)前操作的記錄,我們稱為模式I;返回2當(dāng)前操作的窗體編輯框字段-模式II;返回3當(dāng)前操作的清單-模式III;模式IV則是按照SQL語句返回?cái)?shù)據(jù)集(注意:返回的數(shù)據(jù)仍然工作在模式I)。當(dāng)工作在成員函數(shù)內(nèi)部時(shí),不需要前綴,例如: int m1= CurrentMode(); int m2=ds1.CurrentMode();前者表示取得本記錄集的工作模式,后者則是獲取ds1這個(gè)數(shù)據(jù)集的工作模式。當(dāng)啟動(dòng)代碼工作在模式II下,如何操作清單呢?例如我們希望統(tǒng)計(jì)清單中數(shù)量與單價(jià)的總和,賦值給字段To
39、talcharge. 為了完成這個(gè)任務(wù),下面代碼就可以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);這里僅僅是說明原理,因?yàn)檫@為完成這個(gè)功能,系統(tǒng)提供了更強(qiáng)大的函數(shù)Sum2AndSet(Totalcharge,Items,Amount*CoPr
40、ice).由于窗體編輯框、清單,記錄,都是有對(duì)應(yīng)關(guān)系的,都是由字段控制的,因此對(duì)他們的操作也是完全一樣的,都是gDataSet類型的數(shù)據(jù)集,當(dāng)然,在模式II下,NextRow()沒有作用。1. 獲取清單記錄集合在模式I下,可以獲取清單記錄集合,使用下面代碼就可以了 gDataSet ds1(this,1,Items);然后這個(gè)ds1是gDataSet類,那么這個(gè)類的所有函數(shù)都可以使用。2. 獲取主窗口操作對(duì)象 僅僅在模式III下,可以這樣處理,代碼如下 gDataSet ds1(this,2,NULL); 代碼示例 if(CurrentMode()=2) gDataSet ds1(this,2
41、,NULL); double d1=ds1.newGet2(Discount); if(d1=1)d1=1; double s1=d1*newGet2(Price)*newGet2(Amount); newSet2(Summoney,s1); 警告: 這里的模式檢查非常重要,因?yàn)椴糠执a只在清單中運(yùn)行有效,其它模式下并不正確。部分客戶(例如希爾科)的代碼因?yàn)槿鄙龠@個(gè)檢查出現(xiàn)過錯(cuò)誤。3.取得名稱為Itesm的清單 僅僅在模式II、III下,可以這樣處理,代碼如下gDataSet ds1(this,3, Items);(在模式II下,可以使用這中方式操作另外的清單。)4.按照SQL語句返回?cái)?shù)據(jù)集
42、在任何模式下都有效,可以這樣處理,代碼如下 string SQL1=Select * From tblInstockItems Where Amount524288) (這個(gè)語句是列舉所有的入庫單中存在剩余庫存的明細(xì),MainCode In是保證這些單據(jù)已經(jīng)入庫,而不是當(dāng)前未入庫的單據(jù))gDataSet ds1(this,4,SQL1.c_str();(注意:返回的數(shù)據(jù)仍然工作在模式I,只是要傳遞4這個(gè)參數(shù)。)代碼示例 下面是一個(gè)完整的使用SQL語句返回?cái)?shù)據(jù)集作的示例1 string SQL1=Select * From tblInstockItems Where AmountOutAmoun
43、t 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+=總行數(shù):;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
44、 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+=,入庫數(shù)量:;25 s2+=a1;26 s2+=,剩余數(shù)量:;27 s2+=a2;28 s2.addReturn();29 30 31 SA1.Append(s2);32 SA1.Append(確定);33 SA1.
45、Append();34 SA1.ShowMessage();35 return 0;運(yùn)行時(shí)提示窗口如下:5. 獲取樹形節(jié)點(diǎn)的數(shù)據(jù)集 在任何模式2,3下都有效gDataSet ds1(this,5,NULL);例如:在配色表中,希望取得BOM清單中的幾個(gè)自定義字段的值,并顯示在配色表窗口中,供參考。代碼如下:int p0,p1,s1;string lo1,s2;gDataSet ds1(this,5,NULL);CreateFields(X001,長,2);CreateFields(X002,寬,2);CreateFields(X003,場,2);if(CurrentMode()!=3)retu
46、rn 0;p0=(int)ds1.newGet2(Product);p1=(int)newGet2(Product);s1=(int)newGet2(Specif);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 d
47、s2(this,4,s2.c_str();newSet2(X001,ds2.newGet2(uLength);newSet2(X002,ds2.newGet2(uWidth);newSet2(X003,ds2.newGet2(uThickness);6. 空白數(shù)據(jù)集 在任何模式下都有效gDataSet ds1(this,6,char *cn1);例如: cn1為表單名稱或表單序號(hào).4. C語言代碼解決特殊業(yè)務(wù)示例基本意義OA-ERP做為一個(gè)通用系統(tǒng),因此不能在一些非常專們的需求方面走的太遠(yuǎn),但是使用C/C+語言擴(kuò)展程序,原則上可以解決任何的可能需求。如果用C/C+語言解決了,那么任何其他語言也
48、未必能解決。示例一:外貿(mào)費(fèi)用的計(jì)算1) 一個(gè)外貿(mào)用戶,在銷售報(bào)價(jià)、銷售訂單中,都因?yàn)榇嬖谫M(fèi)用,因此啟用了費(fèi)用方案、費(fèi)用清單。2) 這些費(fèi)用中,一部分是固定的,例如手續(xù)費(fèi)、標(biāo)簽費(fèi)等。3) 另外一部分費(fèi)用,不是固定的,例如“單物品金額保值費(fèi)”,它是根據(jù)物品清單的費(fèi)用總和再乘以一個(gè)系數(shù)得到的;再如“關(guān)稅”等,是其它費(fèi)用的總和,再乘以一個(gè)系數(shù)得到的。C語言代碼設(shè)置 1)我們先定義費(fèi)用項(xiàng)目如下。 注意這這里的兩個(gè)特殊項(xiàng)目的序號(hào)分別是20003、20004,他們要特別處理。 2)在銷售報(bào)價(jià)單的中定義C語言程序: 這里只需要給第三行、第四行項(xiàng)目定義C語言程序。我們將數(shù)量固定為1,于是只需要給單價(jià)字段定義C語
49、言程序就可以了,“詢價(jià)單物品金額保值費(fèi)”是統(tǒng)計(jì)物品清單的費(fèi)用總和,因此可以使用代碼:代碼片段一 Sum2AndSet(Price,Items,Summoney);這里Sum2AndSet的作用是:計(jì)算清單Items的表達(dá)式Summoney的總和,然后賦值給Price字段。 第四行“費(fèi)用匯總項(xiàng)關(guān)稅”的意義是,計(jì)算其它行的總金額,乘以一個(gè)系數(shù),例如0.5,因此定義C語言程序是代碼片段二 float D1=Sum2(Items3,Summoney); float D2=newGet2(Summoney); newSet2(Price,(D1-D2)*0.5);這里解釋一下,第1行的意思是,計(jì)算清單I
50、tems3的表達(dá)式Summoney的總和,第2行的意思是,獲得本行Summoney的值。因?yàn)閮H僅計(jì)算其它行的Summoney的值,所以他們的結(jié)果要相減(D1-D2)。第3行的意思是,計(jì)算結(jié)果(D1-D2)*0.5,賦值給字段Price。 現(xiàn)在的問題是,在第三行用代碼片段一,第四行則用代碼片段二,其它行不計(jì)算,那么如何處理呢?我們使用newGet2(Type1)獲取字段Type1的序號(hào),我們記得,第三行“詢價(jià)單物品金額保值費(fèi)”的序號(hào)是20003,第四行“費(fèi)用匯總項(xiàng)關(guān)稅”的序號(hào)是20004,因此C語言程序就是如下形式最后代碼if(newGet2(Type1)=20003) Sum2AndSet(P
51、rice,Items,Summoney);if(newGet2(Type1)=20004) float D1=Sum2(Items3,Summoney); float D2=newGet2(Summoney); newSet2(Price,(D1-D2)*0.5); 3)一點(diǎn)優(yōu)化。上面代碼中,newGet2(Type1)調(diào)用2次,影響了效率,因此采用下面優(yōu)化的形式加速計(jì)算優(yōu)化后的代碼片段int type1=newGet2(Type1);if(type1=20003) Sum2AndSet(Price,Items,Summoney);else if(type1=20004) float D1=S
52、um2(Items3,Summoney); float D2=newGet2(Summoney); newSet2(Price,(D1-D2)*0.5);最實(shí)際使用的代碼片段如下:int type1=newGet2(Type1);float D2=Sum2(Items,Summoney);float D3=newGet2(MainCode.Exchange);if(type1=20003) /國際空運(yùn) float D1=newGet2(MainCode.Relateid_XCode.xExtraFields03); newSet2(Price,D1*1.5);else if(type1=200
53、04) /保險(xiǎn) newSet2(Price,D2*0.0029*1.1);else if(type1=20014) /代理費(fèi) newSet2(Price,D2*D3*0.01/100);else if(type1=20001) /關(guān)稅 float D4=newGet2(MainCode.Relateid_XCode.xExtraFields02); newSet2(Price,D2*D3*D4/100);else if(type1=20012) /匯費(fèi) if(D2*0.0150 & j0 & j0 & jr) double x1=ds1.Calculate2(Summoney); D6=D6+
54、x1; j=ds1.NextRow(); newSet2(Price,D6*0.17);下面給出這部分最終使用的完整代碼,供參考:int type1=newGet2(Type1);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) newS
55、et2(Price,(D2/D3)*0.0029*1.1); else if(type1=20014) newSet2(Price,D2*0.01);else if(type1=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);e
56、lse if(type1=20001) float D4=newGet2(MainCode.ContactMethod); newSet2(Price,D2*D4/D3); 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(Pri
57、ce,45); else newSet2(Price,D1*1.6);else if(type1=20021) if(D2*0.003218) newSet2(Price,18); 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,獲得“應(yīng)付款”的值,因?yàn)榍鍐蔚淖侄问荌tems,注意表單可能有多個(gè)清單,因此這里要求注明清單的字段。D1,獲得“此次付款
58、”的值. 如果D1超過100萬,而且“此次付款”超過D1的70時(shí),返回-1,表示審核失敗。其它情況返回0,表示通過。2) 將編寫的函數(shù)錄入到“用戶C語言程序”,然后3) 然后再“采購付款”的業(yè)務(wù)設(shè)置窗口,按照下面方式設(shè)置審核檢查函數(shù)注意,這里“Event_Audit”是審核檢查函數(shù)的類型標(biāo)記,因?yàn)橛卸喾N控制函數(shù),因此不要弄錯(cuò)了。結(jié)果 設(shè)置好后,重新啟動(dòng)系統(tǒng)?,F(xiàn)在選擇這張單據(jù),審核出現(xiàn)如下提示,表示審核失敗修改金額為690,000.00,再審核,則通過。字段值的控制 奧諾制藥在訂單中處理中需要操作員錄入申請(qǐng)數(shù)量,審核員在審核時(shí),則根據(jù)申請(qǐng)數(shù)量、剩余款,填寫審核數(shù)量。 實(shí)施人員將一個(gè)自定義字段“x
59、ExtraFields01”設(shè)置為申請(qǐng)數(shù)量,同時(shí)有一下要求 (1)如果申請(qǐng)數(shù)量沒有填寫,那么審核數(shù)量可以任意填寫。 (2)如果申請(qǐng)數(shù)量有填寫,那么審核數(shù)量不得超過申請(qǐng)數(shù)量。此時(shí)我們有如下代碼float X1=newGet2(xExtraFields01);if(X1X1 | X2X1指審核數(shù)量超出申請(qǐng)數(shù)量, (4)X20.01指審核數(shù)量沒有填寫 (5)| & 分別是“或者,且”邏輯判斷,練習(xí) 練習(xí)題:假如客戶要求在銷售發(fā)票中,允許多開發(fā)票金額,但是多開出的金額的稅0.17必須是客戶自己承擔(dān),那么如何設(shè)置流程?如何設(shè)置C語言控制? 流程設(shè)置:此時(shí),應(yīng)收賬款,不能以發(fā)貨單為依據(jù)了,因?yàn)榘l(fā)貨單上的金
60、額不能改變,改變后變成了應(yīng)收賬款。故設(shè)置“銷售發(fā)票”為應(yīng)收賬款的依據(jù),此時(shí)只要在憑證模板中設(shè)置就可以了。詳細(xì)請(qǐng)見“業(yè)務(wù)財(cái)務(wù)一體化”部分。C語言設(shè)置:利用系統(tǒng)中預(yù)留的自定義字段,設(shè)置一下窗體:即主單據(jù)、清單中的“發(fā)票金額”。 然后,各個(gè)字段的C語言代碼設(shè)置如下:(1)主單據(jù)發(fā)票金額Sum2AndSet(NULL,Items,xExtraFields01);即統(tǒng)計(jì)清單Items的xExtraFields01字段值賦給本字段。(2)清單發(fā)票金額float X1=newGet2(xExtraFields01);float X2=newGet2(Amount)*newGet2(Price);if(X10
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026上半年貴州事業(yè)單位聯(lián)考體育職業(yè)學(xué)院招聘22人考試備考試題及答案解析
- 2026江蘇南京XZ2025-436地球科學(xué)與工程學(xué)院助理招聘筆試模擬試題及答案解析
- 2026上半年安徽事業(yè)單位聯(lián)考績溪縣招聘16人筆試備考題庫及答案解析
- 2026陜西寶雞三和職業(yè)學(xué)院人才招聘66人筆試備考題庫及答案解析
- 2026年嗩吶循環(huán)換氣技法教學(xué)
- 2026黑龍江鐵路集團(tuán)嫩江公司市場化招聘10人筆試備考題庫及答案解析
- 2026石家莊鐵路職業(yè)技術(shù)學(xué)院選聘30人筆試參考題庫及答案解析
- 2026云南紅河州個(gè)舊市醫(yī)療衛(wèi)生共同體賈沙分院招聘編外工作人員1人考試備考試題及答案解析
- 2026年景寧縣機(jī)關(guān)事業(yè)單位公開選調(diào)25人考試備考試題及答案解析
- 2026年地下水質(zhì)量監(jiān)測與評(píng)估技術(shù)
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責(zé)任公司社會(huì)成熟人才招聘備考題庫及完整答案詳解一套
- 綠化設(shè)備安全培訓(xùn)課件
- 鋼結(jié)構(gòu)玻璃雨棚安裝施工方案
- 給水管道遷改工程施工方案
- 【數(shù)學(xué)】二次根式及其性質(zhì)第1課時(shí)二次根式的概念課件 2025~2026學(xué)年人教版數(shù)學(xué)八年級(jí)下冊(cè)
- 漢源縣審計(jì)局關(guān)于公開招聘編外專業(yè)技術(shù)人員的備考題庫附答案
- 2025安徽省合肥市公務(wù)員考試《行測》題庫及答案(各地真題)
- 2026年上海市普陀區(qū)社區(qū)工作者公開招聘筆試參考題庫及答案解析
- 《中華人民共和國危險(xiǎn)化學(xué)品安全法》全套解讀
- 2025云南保山電力股份有限公司招聘(100人)筆試歷年參考題庫附帶答案詳解
- 監(jiān)理大綱(暗標(biāo))
評(píng)論
0/150
提交評(píng)論