專利名稱:一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計算機領(lǐng)域,特別是涉及一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法。
背景技術(shù):
目前,在類似計算凈現(xiàn)金流如下具有多種指標間具有復(fù)雜計算關(guān)系的計算模型中,常常會有很多的缺陷。其中,多種指標,具體如下所述計算公式凈現(xiàn)金流=現(xiàn)金流入-現(xiàn)金流出現(xiàn)金流入=銷售收入+回收固定資產(chǎn)余值+回收流動資金現(xiàn)金流出=工程投資+流動資金+經(jīng)營成本+銷售稅+所得稅銷售收入=產(chǎn)品數(shù)量*產(chǎn)品價格流動資金=經(jīng)營成本*流動資金占經(jīng)營成本比例經(jīng)營成本=總成本費用-折舊折耗-財務(wù)費用總成本費用=生產(chǎn)成本+期間費用生產(chǎn)成本=操作成本+折舊折耗折舊折耗=資產(chǎn)原值殘值率)/折舊年限期間費用=管理費用+財務(wù)費用+營業(yè)費用銷售稅=城市維護建設(shè)稅+教育稅附加+資源稅上面只是列舉了計算凈現(xiàn)金流部分公式,全部的計算公式有200多個。這種問題需要解決的是有很多輸入指標比如殘值率,折舊年限,產(chǎn)品價格等,輸出指標是由多個其他指標(包括輸入指標或其他的輸出指標)采用了各種算法計算得來的。比如生產(chǎn)成本,銷售稅,折舊折耗等。目前都是把這種指標間的計算關(guān)系固化在程序中。對于指標間的計算關(guān)系固化在程序中,缺點很明顯,加一個指標或者修改一個指標計算關(guān)系,主程序需要修改重新編譯,把編譯后的執(zhí)行文件再發(fā)給用戶。這樣帶來的實現(xiàn)計算模型的方法中涉及的程序的靈活性很差。因而,目前需要本領(lǐng)域技術(shù)人員迫切解決的一個技術(shù)問題就是如何找到一種新型的簡單、快速的實現(xiàn)解決具有復(fù)雜計算關(guān)系的計算模型的方法。
發(fā)明內(nèi)容
本發(fā)明所要解決的一個技術(shù)問題是提供一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法,該方法能夠給用戶提供一個簡單、快速的計算模型來解決復(fù)雜的計算關(guān)系。為了解決上述問題,本發(fā)明公開了一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法,包括
采用通過樹形結(jié)構(gòu)計算關(guān)系的方式,建立指標計算模型,獲得用戶自定義的指標計算模型;采用通過gigabase面向?qū)ο髷?shù)據(jù)庫保存指標間的樹形結(jié)構(gòu)的方式,對用戶自定義的指標計算模型進行保存,獲得用戶自定義的指標計算模型;通過TinyC編譯器,將用戶用C語言編寫的自定義的指標的計算關(guān)系,編譯成DLL 文件并對所述DLL文件進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件;解析獲得的用戶自定義的指標計算模型并計算各項指標,獲得各項指標的數(shù)值。優(yōu)選的,所述采用通過樹形結(jié)構(gòu)計算關(guān)系的方式,建立指標計算模型,獲得用戶自定義的指標計算模型的步驟,包括采用通過樹形結(jié)果計算關(guān)系的方式,建立指標計算模型中的指標的數(shù)據(jù)字典,并對各項指標進行編輯,獲得指標計算模型中的各項指標數(shù)據(jù);其中,所述各項指標數(shù)據(jù)為每個指標的類型及每個指標的名稱;接收讀取數(shù)據(jù)指令,開始執(zhí)行讀入指標計算模型中的各項指標數(shù)據(jù)的操作;用戶執(zhí)行建立指標根節(jié)點的操作,獲得用戶自定義的指標計算模型。優(yōu)選的,所述用戶執(zhí)行建立指標根節(jié)點的操作,獲得用戶自定義的指標計算模型的步驟,包括建立指標根節(jié)點,獲得指標根節(jié)點;若指標根節(jié)點需要計算,則建立指標根節(jié)點相應(yīng)的指標子節(jié)點,獲得指標根節(jié)點相應(yīng)的指標子節(jié)點;編寫根節(jié)點需要的計算函數(shù)的函數(shù)實現(xiàn)體,獲得計算函數(shù)的函數(shù)關(guān)系;執(zhí)行完上述操作,獲得指標根節(jié)點、指標根節(jié)點相應(yīng)的指標子節(jié)點及計算函數(shù)的函數(shù)關(guān)系,則獲得用戶自定義的指標計算模型。優(yōu)選的,所述采用通過gigabase面向?qū)ο髷?shù)據(jù)庫保存指標間的樹形結(jié)構(gòu)的方式, 對用戶自定義的指標計算模型進行保存,獲得用戶自定義的指標計算模型的步驟,包括將獲得的指標根節(jié)點進行保存,獲得保存有指標根節(jié)點的數(shù)據(jù)信息的文件;采用遞歸方式,針對指標根節(jié)點,依次保存指標根節(jié)點相應(yīng)的每個指標子節(jié)點,獲得保存有指標子節(jié)點的數(shù)據(jù)信息的文件;對獲得的計算函數(shù)的函數(shù)關(guān)系進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件;其中,所述指標節(jié)點的數(shù)據(jù)信息為指標根/子節(jié)點的名稱、指標根/子節(jié)點的類別、C函數(shù)名稱、用戶輸入的計算實現(xiàn)C代碼構(gòu)成的C函數(shù)及所有指標子節(jié)點對象的ID。優(yōu)選的,所述通過TinyC編譯器,將用戶用C語言編寫的自定義的指標的計算關(guān)系,編譯成DLL文件并對所述DLL文件進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件的步驟,包括將所有的用戶輸入的計算實現(xiàn)C代碼構(gòu)造成相應(yīng)的C函數(shù),獲得針對計算實現(xiàn)C 代碼相應(yīng)的一個個C函數(shù);輸入相應(yīng)的一個個C函數(shù),生成一個C函數(shù)源程序文件;采用TinyC編譯器,將C函數(shù)源程序文件進行編譯,獲得C函數(shù)源程序文件的動態(tài)庫文件;
將所述動態(tài)庫文件作為一個二進制字段保存到指標計算模型文件中的表中,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件。優(yōu)選的,所述解析獲得的用戶自定義的指標計算模型并計算各項指標,獲得各項指標的數(shù)值的步驟,包括讀取指標計算模型文件,獲得各項指標的數(shù)值;采用遞歸調(diào)用的方法,計算出各項指標的數(shù)值;通過調(diào)用指標容器的GetNode函數(shù)的方式,針對用戶的輸入指標傳入指標名稱, 獲得指標對象;通過調(diào)用指標對象的ktValue函數(shù)的方式,對獲得的指標對象進行設(shè)置,獲得指標對象的結(jié)果數(shù)值;通過調(diào)用Eval函數(shù)的方式,針對根節(jié)點進行解析,獲得各項指標的數(shù)值。優(yōu)選的,所述讀取指標計算模型文件,獲得各項指標的數(shù)值的步驟,包括讀取保存有指標根/子節(jié)點的數(shù)據(jù)信息的文件,獲得指標根/子節(jié)點的數(shù)據(jù)信息;讀取保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件,獲得計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息。優(yōu)選的,所述讀取保存有指標根/子節(jié)點的數(shù)據(jù)信息的文件,獲得指標根/子節(jié)點的數(shù)據(jù)信息的步驟,包括為每個指標建立相應(yīng)的對象實例,獲得每個指標的對象實例;為每個指標的子對象建立相應(yīng)的子對象實例,獲得每個指標的子對象實例;每個指標的對象實例及其每個對象的若干子對象的子對象實例構(gòu)成樹狀結(jié)構(gòu)的對象體系;建立對象容器對象,獲得對象容器;將每個指標對象加入到對象容器中;采用hashjnap的存儲方式,建立指標對象的名稱與指標對象地址的映射關(guān)系,獲得指標對象的名稱與指標對象的地址的映射關(guān)系;若在對象容器中傳入指標對象的名稱, 則對象容器快速返回指標對象的地址;完成上述步驟,完成讀取保存有指標根/子節(jié)點的數(shù)據(jù)信息的文件,獲得指標根/ 子節(jié)點的數(shù)據(jù)信息的全過程。優(yōu)選的,所述讀取保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件,獲得計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的步驟,包括從計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件中的二進制字段中讀入計算方法;將計算方法寫入到動態(tài)庫文件中;采用hashjnap的存儲方式,建立指標對象的名稱與指標對象地址的映射關(guān)系,獲得指標對象的名稱與指標對象的地址的映射關(guān)系;若在對象容器傳入指標對象的名稱,則對象容器快速返回指標對象的地址;通過調(diào)用Eval函數(shù)的方式,針對指標對象的最后一行代碼,調(diào)用計算函數(shù)的函數(shù)關(guān)系,獲得計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息。優(yōu)選的,所述通過調(diào)用Eval函數(shù)的方式,針對根節(jié)點進行解析,獲得各項指標的數(shù)值的步驟,包括通過調(diào)用Eval函數(shù)的方式,針對一個根節(jié)點進行遞歸調(diào)用解析,獲得每個根節(jié)點指標的數(shù)值;通過調(diào)用Eval函數(shù)的方式,針對每個根節(jié)點相對應(yīng)的其余根節(jié)點進行遞歸調(diào)用解析,獲得每個根節(jié)點相對應(yīng)的其余根節(jié)點指標的數(shù)值;對上述每個根節(jié)點指標的數(shù)值及上述每個根節(jié)點相對應(yīng)的其余根節(jié)點指標的數(shù)值進行匯總,獲得各項指標的數(shù)值。本發(fā)明顯著優(yōu)點在于1、所建立一種指標間樹狀的計算模型,提供了一個圖形編輯界面,讓用戶來自定義各種指標間的計算關(guān)系,在程序中自動解析這種計算關(guān)系,提供輸入指標數(shù)據(jù),利用計算模型計算出所有的輸出指標。2、讓最終用戶能方便的定義指標的計算關(guān)系。3、給用戶提供一個既開放又簡單的計算關(guān)系配置工具。4、具有強大的擴展性,靈活性。5、建立了樹狀結(jié)構(gòu)的計算模型,用戶可以方便的自己定義;另外采用了開源的 TinyC編譯器把用戶定義的計算方法直接編譯成了可以執(zhí)行的機器碼,沒有采用公式解析器或者腳本語言使得運行速度與把算法固化到程序中的編程方式具有相同的速度;給用戶提供了一個簡單快速的開發(fā)平臺??傊?,本發(fā)明提供了一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法,該方法能夠給用戶提供一個簡單、快速的計算模型來解決復(fù)雜的計算關(guān)系。
圖1是本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法的實施例的步驟流程圖;圖2是本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法中的計算模型編輯的流程示意圖;圖3是本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法中的計算模型保存的流程示意圖;圖4是本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法中的計算模型解析的流程示意圖;圖5是本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法中的Eval 方法的流程示意圖。
具體實施例方式為使本發(fā)明的上述目的、特征和優(yōu)點能夠更加明顯易懂,下面結(jié)合附圖和具體實施方式
對本發(fā)明作進一步詳細的說明。本發(fā)明的核心思想之一是提供了一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法,包括采用通過樹形結(jié)構(gòu)計算關(guān)系的方式,建立指標計算模型,獲得用戶自定義的指標計算模型;采用通過gigabase面向?qū)ο髷?shù)據(jù)庫保存指標間的樹形結(jié)構(gòu)的方式,對用戶自定義的指標計算模型進行保存,獲得用戶自定義的指標計算模型;通過TinyC編譯器, 將用戶用C語言編寫的自定義的指標的計算關(guān)系,編譯成DLL文件并對所述DLL文件進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件;解析獲得的用戶自定義的指標計算模型并計算各項指標,獲得各項指標的數(shù)值;該方法能夠給用戶提供一個簡單、快速的計算模型來解決復(fù)雜的計算關(guān)系。參照圖1,示出了本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法的實施例的步驟流程圖,前面所舉的凈現(xiàn)金流的計算就采用本發(fā)明來解決,具體可以包括步驟101、采用通過樹形結(jié)構(gòu)計算關(guān)系的方式,建立指標計算模型,獲得用戶自定義的指標計算模型。為了使本領(lǐng)域的技術(shù)人員更好地理解本發(fā)明,在本發(fā)明的一個優(yōu)選實施例中,所述步驟101,具體可以包括子步驟Al、采用通過樹形結(jié)果計算關(guān)系的方式,建立指標計算模型中的指標的數(shù)據(jù)字典,并對各項指標進行編輯,獲得指標計算模型中的各項指標數(shù)據(jù);其中,所述各項指標數(shù)據(jù)為每個指標的類型及每個指標的名稱。子步驟A2、接收讀取數(shù)據(jù)指令,開始執(zhí)行讀入指標計算模型中的各項指標數(shù)據(jù)的操作。子步驟A3、用戶執(zhí)行建立指標根節(jié)點的操作,獲得用戶自定義的指標計算模型。其中,所述子步驟A3具體可以包括 子步驟Bl、建立指標根節(jié)點,獲得指標根節(jié)點。子步驟B2、若指標根節(jié)點需要計算,則建立指標根節(jié)點相應(yīng)的指標子節(jié)點,獲得指標根節(jié)點相應(yīng)的指標子節(jié)點。子步驟B3、編寫根節(jié)點需要的計算函數(shù)的函數(shù)實現(xiàn)體,獲得計算函數(shù)的函數(shù)關(guān)系。子步驟B4、執(zhí)行完上述操作,獲得指標根節(jié)點、指標根節(jié)點相應(yīng)的指標子節(jié)點及計算函數(shù)的函數(shù)關(guān)系,則獲得用戶自定義的指標計算模型。其中,用戶定義計算模型,在模型中加一個指標節(jié)點,如果該節(jié)點需要計算,加上子節(jié)點,編寫該節(jié)點需要的計算函數(shù)的函數(shù)實現(xiàn)體,函數(shù)名稱自動產(chǎn)生,函數(shù)定義如下所述double CalFun(double氺pSubNodeValue);用戶在定義時只需要編寫函數(shù)主體,比如指標由由兩個子節(jié)點的相乘計算而來, 那么可以如下方式寫上函數(shù)體。return pSubNodeValue
^pSubNodeValue[1];在最后生成模型時,會自動生成一個函數(shù)名稱比如Cal_Acdf,自動加上C函數(shù)需要的〃 {",〃 }〃符號。最后這個函數(shù)如下double Cal_Acdf(double*pSubNodeValue){return pSubNodeValue
^pSubNodeValue[1];}用戶只需要寫實現(xiàn)計算的代碼returnpSubNodeValue
^pSubNodeValue [1];計算函數(shù)其他部分由系統(tǒng)自動生成。參照圖2,示出了本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法中的計算模型編輯的流程示意圖,具體如下所述1)讀入指標數(shù)據(jù)字典;2)建立指標根節(jié)點;3)建立子節(jié)點;4)若還有子節(jié)點,繼續(xù)建立子節(jié)點,至到所有子節(jié)點全部建立完成;5)編寫計算關(guān)系C代碼;6)保存。步驟102、采用通過gigabase面向?qū)ο髷?shù)據(jù)庫保存指標間的樹形結(jié)構(gòu)的方式, 對用戶自定義的指標計算模型進行保存,獲得用戶自定義的指標計算模型。其中,所述 gigabase面向?qū)ο髷?shù)據(jù)庫為一種用C++編程語言編寫的,開源的對象數(shù)據(jù)庫。為了使本領(lǐng)域的技術(shù)人員更好地理解本發(fā)明,在本發(fā)明的另一個優(yōu)選實施例中, 所述步驟102,具體可以包括子步驟Cl、將獲得的指標根節(jié)點進行保存,獲得保存有指標根節(jié)點的數(shù)據(jù)信息的文件。子步驟C2、采用遞歸方式,針對指標根節(jié)點,依次保存指標根節(jié)點相應(yīng)的每個指標子節(jié)點,獲得保存有指標子節(jié)點的數(shù)據(jù)信息的文件。子步驟C3、對獲得的計算函數(shù)的函數(shù)關(guān)系進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件;其中,所述指標節(jié)點的數(shù)據(jù)信息為指標根/子節(jié)點的名稱、指標根/子節(jié)點的類別、C函數(shù)名稱、用戶輸入的計算實現(xiàn)C代碼構(gòu)成的C函數(shù)及所有指標子節(jié)點對象的ID。其中,所述C代碼為用C語言編寫的程序源代碼;所述C函數(shù)為用C語言編寫的函數(shù);所述C函數(shù)名稱為用C語言編寫的函數(shù)名稱,采用隨機方式自動生成C函數(shù)名稱;所述指標子節(jié)點對象的ID為指標子節(jié)點對象的標識。步驟103、通過TinyC編譯器,將用戶用C語言編寫的自定義的指標的計算關(guān)系,編譯成DLL文件并對所述DLL文件進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件。其中,所述TinyC編譯器為編譯C語言的開源編譯器;所述C語言為一種計算機編程語言;所述DLL文件為可以被執(zhí)行的庫文件。利用小巧的TinyC編譯器(編譯C語言的開源編譯器),用戶用C語言編寫的自定義的指標的計算關(guān)系,利用TinyC編譯成DLL文件。由于運行時是機器碼,計算速度快,同時又具有腳本語言的靈活性。為了使本領(lǐng)域的技術(shù)人員更好地理解本發(fā)明,在本發(fā)明的另一個優(yōu)選實施例中, 所述步驟103,具體可以包括子步驟D1、將所有的用戶輸入的計算實現(xiàn)C代碼構(gòu)造成相應(yīng)的C函數(shù),獲得針對計算實現(xiàn)C代碼相應(yīng)的一個個C函數(shù)。子步驟D2、輸入相應(yīng)的一個個C函數(shù),生成一個C函數(shù)源程序文件。子步驟D3、采用TinyC編譯器,將C函數(shù)源程序文件進行編譯,獲得C函數(shù)源程序文件的動態(tài)庫文件。
子步驟D4、將所述動態(tài)庫文件作為一個二進制字段保存到指標計算模型文件中的表中,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件。其中,用戶把編輯好的計算模型保存到一個文件中。軟件在用戶的這個操作中,先保存根節(jié)點,然后采用遞歸方法,依次保存每個子節(jié)點。其中,每個節(jié)點信息包括指標名稱, 指標類別,C函數(shù)名稱,用戶輸入的計算實現(xiàn)C代碼,所有子節(jié)點對象的ID。.另外還需要把所有的用戶輸入的計算實現(xiàn)C代碼構(gòu)造成一個個的C函數(shù),生成一個C函數(shù)源程序文件, 自動采用TinyC編譯器編譯成一個動態(tài)庫文件,把這個動態(tài)庫文件作為一個二進制字段保存到模型文件中的一個表中。參照圖3,示出了本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法中的計算模型保存的流程示意圖,具體如下所述1)保存子節(jié)點;2)保存父節(jié)點;3)自動生成計算方法的函數(shù)名稱;4)把所有的計算方法函數(shù)形成一個C文件;5)用TinyC編譯C語言源代碼文件形成一個DLL文件;6)把DLL文件作為模型數(shù)據(jù)庫的一個二進制字段存入。步驟104、解析獲得的用戶自定義的指標計算模型并計算各項指標,獲得各項指標的數(shù)值。參照圖4,示出了本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法中的計算模型解析的流程示意圖,具體如下所述1)讀入計算模型文件;2)讀入根節(jié)點;3)讀入計算函數(shù)的名稱;4)讀入子節(jié)點;5)若還有子節(jié)點,繼續(xù)讀入子節(jié)點,至到讀出所有的子節(jié)點,完成讀入子節(jié)點的全過程;6)讀入計算關(guān)系的DLL,并寫入到一個DLL文件中;其中,所述DLL文件為可以被執(zhí)行的庫文件;7)根據(jù)計算函數(shù)的名稱為每個節(jié)點獲取計算函數(shù)的地址;8)讀入輸入指標數(shù)據(jù);9)調(diào)用根節(jié)點的Eval方法;其中,所述Eval方法為計算指標的值的函數(shù)方法。為了使本領(lǐng)域的技術(shù)人員更好地理解本發(fā)明,在本發(fā)明的另一個優(yōu)選實施例中, 所述步驟104,具體可以包括子步驟E1、讀取指標計算模型文件,獲得各項指標的數(shù)值。其中,所述子步驟El具體可以包括子步驟Fl、讀取保存有指標根/子節(jié)點的數(shù)據(jù)信息的文件,獲得指標根/子節(jié)點的數(shù)據(jù)信息。其中,所述子步驟Fl具體可以包括子步驟G1、為每個指標建立相應(yīng)的對象實例,獲得每個指標的對象實例。
子步驟G2、為每個指標的子對象建立相應(yīng)的子對象實例,獲得每個指標的子對象實例。子步驟G3、每個指標的對象實例及其每個對象的若干子對象的子對象實例構(gòu)成樹狀結(jié)構(gòu)的對象體系。子步驟G4、建立對象容器對象,獲得對象容器。子步驟G5、將每個指標對象加入到對象容器中。子步驟G6、采用hashjnap的存儲方式,建立指標對象的名稱與指標對象地址的映射關(guān)系,獲得指標對象的名稱與指標對象的地址的映射關(guān)系;若在對象容器中傳入指標對象的名稱,則對象容器快速返回指標對象的地址;其中,所述hashjnap的存儲方式為一種存放對象標識和對象的數(shù)據(jù)結(jié)構(gòu)的存儲方式。子步驟G7、完成上述步驟,完成讀取保存有指標根/子節(jié)點的數(shù)據(jù)信息的文件,獲得指標根/子節(jié)點的數(shù)據(jù)信息的全過程。子步驟F2、讀取保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件,獲得計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息。其中,所述子步驟F2具體可以包括子步驟HI、從計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件中的二進制字段中讀入計算方法。子步驟H2、將計算方法寫入到動態(tài)庫文件中。子步驟H3、采用hashjnap的存儲方式,建立指標對象的名稱與指標對象地址的映射關(guān)系,獲得指標對象的名稱與指標對象的地址的映射關(guān)系;若在對象容器中傳入指標對象的名稱,則對象容器快速返回指標對象的地址;其中,所述hashjiiap的存儲方式為一種存放對象標識和對象的數(shù)據(jù)結(jié)構(gòu)的存儲方式。子步驟H4、通過調(diào)用Eval函數(shù)的方式,針對指標對象的最后一行代碼,調(diào)用計算函數(shù)的函數(shù)關(guān)系,獲得計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息;其中,所述Eval函數(shù)為計算指標的值的函數(shù)。參照圖5,示出了本發(fā)明一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法中的Eval方法的流程示意圖,具體如下所述1)找到根節(jié)點;2)調(diào)用根節(jié)點的Eval方法開始計算;3)如果已經(jīng)有值,則結(jié)束;其中,有值的情況如下兩種a.原始數(shù)據(jù)庫中就存在原始的輸入值,則直接讀取,不需要運算;b.已經(jīng)完成計算過程,并對計算結(jié)果進行標記。4)如果沒有現(xiàn)成可以調(diào)用的值,則先調(diào)用第一個子節(jié)點的Eval方法;若還有其余子節(jié)點,調(diào)用其余子節(jié)點的Eval方法,至到完成所有調(diào)用子節(jié)點的Eval方法,獲得所有子節(jié)點的數(shù)值;其中,采用遞歸調(diào)用的方式來對子節(jié)點進行調(diào)用;5)調(diào)用節(jié)點的計算函數(shù),設(shè)置有值的標記;6)結(jié)束。
其中,讀入計算模型文件,為每個指標建立一個對象實例(CComputeNode),每個對象有若干子對象,這樣在內(nèi)存中建立了一個樹狀結(jié)構(gòu)的對象體系,然后建立一個對象容器對象CComputeNodeManage,把每個指標對象加入進容器中,容器對象中采用hash_map把指標對象的名稱與指標對象地址建立起映射關(guān)系,這樣可以容器對象就有一函數(shù)GetNode,該函數(shù)可以傳入指標名稱就可以快速返回指標對象地址。另外一個從模型文件中的二進制字段中讀入計算方法,并寫入到一個動態(tài)庫文件中,每個指標對象的有個計算函數(shù)地址,函數(shù)原型是double Cal (double^pSubNodeValue)。根據(jù)節(jié)點的函數(shù)名稱計算函數(shù)地址。在指標對象的EVal的最后一行代碼需要調(diào)用該函數(shù),以獲得指標的值;其中,所述Eval函數(shù)為計算指標的值的函數(shù);所述Eval方法為調(diào)用Eval函數(shù)的方法;所述所述hashjiiap的存儲方式為一種存放對象標識和對象的數(shù)據(jù)結(jié)構(gòu)的存儲方式;所述GetNode函數(shù)為獲得節(jié)點的函數(shù)。子步驟E2、采用遞歸調(diào)用的方法,計算出各項指標的數(shù)值。其中,把所有沒有父節(jié)點的指標對象(根節(jié)點)放到一個數(shù)組中,這樣在計算時只調(diào)用這些根節(jié)點指標對象的計算方法,而在指標對象的計算方法Eval中,先調(diào)用子節(jié)點的EVal 函數(shù),這樣一種遞歸調(diào)用方式就會計算出所有的指標的值;其中,所述Eval函數(shù)為計算指標的值的函數(shù);所述Eval方法為調(diào)用Eval函數(shù)的方法。子步驟E3、通過調(diào)用指標容器的GetNode函數(shù)的方式,針對用戶的輸入指標傳入指標名稱,獲得指標對象;其中,所述GetNode函數(shù)為獲得節(jié)點的函數(shù)。子步驟E4、通過調(diào)用指標對象的ktValue函數(shù)的方式,對獲得的指標對象進行設(shè)置,獲得指標對象的結(jié)果數(shù)值;其中,所述ktValue函數(shù)為設(shè)置指標的值的函數(shù)。其中,把用戶所有的輸入的指標,通過調(diào)用指標容器的GetNode函數(shù)的方式傳入指標名稱,得到指標對象,然后通過調(diào)用指標對象CComputeNode的ktValue函數(shù)的方式, 設(shè)置好指標的值。子步驟E5、通過調(diào)用Eval函數(shù)的方式,針對根節(jié)點進行解析,獲得各項指標的數(shù)值;其中,所述Eval函數(shù)的方式為調(diào)用Eval函數(shù)的方式。其中,所述子步驟E5具體可以包括子步驟II、通過調(diào)用Eval函數(shù)的方式,針對一個根節(jié)點進行遞歸調(diào)用解析,獲得每個根節(jié)點指標的數(shù)值。子步驟12、通過調(diào)用Eval函數(shù)的方式,針對每個根節(jié)點相對應(yīng)的其余的根節(jié)點進行遞歸調(diào)用解析,獲得每個根節(jié)點相對應(yīng)的其余根節(jié)點指標的數(shù)值。子步驟13、對上述每個根節(jié)點指標的數(shù)值及上述每個根節(jié)點相對應(yīng)的其余根節(jié)點指標的數(shù)值進行匯總,獲得各項指標的數(shù)值。前面所舉的凈現(xiàn)金流的計算就采用本發(fā)明來解決??傊?,本發(fā)明提供了一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法,該方法能夠給用戶提供一個簡單、快速的計算模型來解決復(fù)雜的計算關(guān)系。以上對本發(fā)明所提供的一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法進行了詳細介紹,本文中應(yīng)用了具體個例對本發(fā)明的原理及實施方式進行了闡述,以上實施例的說明只是用于幫助理解本發(fā)明的方法及其核心思想;同時,對于本領(lǐng)域的一般技術(shù)人員,依據(jù)本發(fā)明的思想,在具體實施方式
及應(yīng)用范圍上均會有改變之處,綜上所述,本說明書內(nèi)容不應(yīng)理解為對本發(fā)明的限制。
權(quán)利要求
1.一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法,其特征在于,包括采用通過樹形結(jié)構(gòu)計算關(guān)系的方式,建立指標計算模型,獲得用戶自定義的指標計算模型;采用通過gigabase面向?qū)ο髷?shù)據(jù)庫保存指標間的樹形結(jié)構(gòu)的方式,對用戶自定義的指標計算模型進行保存,獲得用戶自定義的指標計算模型;通過TinyC編譯器,將用戶用C語言編寫的自定義的指標的計算關(guān)系,編譯成DLL文件并對所述DLL文件進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件; 解析獲得的用戶自定義的指標計算模型并計算各項指標,獲得各項指標的數(shù)值。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述采用通過樹形結(jié)構(gòu)計算關(guān)系的方式, 建立指標計算模型,獲得用戶自定義的指標計算模型的步驟,包括采用通過樹形結(jié)果計算關(guān)系的方式,建立指標計算模型中的指標的數(shù)據(jù)字典,并對各項指標進行編輯,獲得指標計算模型中的各項指標數(shù)據(jù);其中,所述各項指標數(shù)據(jù)為每個指標的類型及每個指標的名稱;接收讀取數(shù)據(jù)指令,開始執(zhí)行讀入指標計算模型中的各項指標數(shù)據(jù)的操作; 用戶執(zhí)行建立指標根節(jié)點的操作,獲得用戶自定義的指標計算模型。
3.根據(jù)權(quán)利要求2所述的方法,其特征在于,所述用戶執(zhí)行建立指標根節(jié)點的操作,獲得用戶自定義的指標計算模型的步驟,包括建立指標根節(jié)點,獲得指標根節(jié)點;若指標根節(jié)點需要計算,則建立指標根節(jié)點相應(yīng)的指標子節(jié)點,獲得指標根節(jié)點相應(yīng)的指標子節(jié)點;編寫根節(jié)點需要的計算函數(shù)的函數(shù)實現(xiàn)體,獲得計算函數(shù)的函數(shù)關(guān)系; 執(zhí)行完上述操作,獲得指標根節(jié)點、指標根節(jié)點相應(yīng)的指標子節(jié)點及計算函數(shù)的函數(shù)關(guān)系,則獲得用戶自定義的指標計算模型。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述采用通過gigabase面向?qū)ο髷?shù)據(jù)庫保存指標間的樹形結(jié)構(gòu)的方式,對用戶自定義的指標計算模型進行保存,獲得用戶自定義的指標計算模型的步驟,包括將獲得的指標根節(jié)點進行保存,獲得保存有指標根節(jié)點的數(shù)據(jù)信息的文件; 采用遞歸方式,針對指標根節(jié)點,依次保存指標根節(jié)點相應(yīng)的每個指標子節(jié)點,獲得保存有指標子節(jié)點的數(shù)據(jù)信息的文件;對獲得的計算函數(shù)的函數(shù)關(guān)系進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件;其中,所述指標節(jié)點的數(shù)據(jù)信息為指標根/子節(jié)點的名稱、指標根/子節(jié)點的類別、C函數(shù)名稱、用戶輸入的計算實現(xiàn)C代碼構(gòu)成的C函數(shù)及所有指標子節(jié)點對象的ID。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述通過TinyC編譯器,將用戶用C語言編寫的自定義的指標的計算關(guān)系,編譯成DLL文件并對所述DLL文件進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件的步驟,包括將所有的用戶輸入的計算實現(xiàn)C代碼構(gòu)造成相應(yīng)的C函數(shù),獲得針對計算實現(xiàn)C代碼相應(yīng)的一個個C函數(shù);輸入相應(yīng)的一個個C函數(shù),生成一個C函數(shù)源程序文件;采用TinyC編譯器,將C函數(shù)源程序文件進行編譯,獲得C函數(shù)源程序文件的動態(tài)庫文件;將所述動態(tài)庫文件作為一個二進制字段保存到指標計算模型文件中的表中,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件。
6.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述解析獲得的用戶自定義的指標計算模型并計算各項指標,獲得各項指標的數(shù)值的步驟,包括讀取指標計算模型文件,獲得各項指標的數(shù)值; 采用遞歸調(diào)用的方法,計算出各項指標的數(shù)值;通過調(diào)用指標容器的GetNode函數(shù)的方式,針對用戶的輸入指標傳入指標名稱,獲得指標對象;通過調(diào)用指標對象的ktValue函數(shù)的方式,對獲得的指標對象進行設(shè)置,獲得指標對象的結(jié)果數(shù)值;通過調(diào)用Eval函數(shù)的方式,針對根節(jié)點進行解析,獲得各項指標的數(shù)值。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述讀取指標計算模型文件,獲得各項指標的數(shù)值的步驟,包括讀取保存有指標根/子節(jié)點的數(shù)據(jù)信息的文件,獲得指標根/子節(jié)點的數(shù)據(jù)信息; 讀取保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件,獲得計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù) fn息ο
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,所述讀取保存有指標根/子節(jié)點的數(shù)據(jù)信息的文件,獲得指標根/子節(jié)點的數(shù)據(jù)信息的步驟,包括為每個指標建立相應(yīng)的對象實例,獲得每個指標的對象實例; 為每個指標的子對象建立相應(yīng)的子對象實例,獲得每個指標的子對象實例; 每個指標的對象實例及其每個對象的若干子對象的子對象實例構(gòu)成樹狀結(jié)構(gòu)的對象體系;建立對象容器對象,獲得對象容器; 將每個指標對象加入到對象容器中;采用hashjnap的存儲方式,建立指標對象的名稱與指標對象地址的映射關(guān)系,獲得指標對象的名稱與指標對象的地址的映射關(guān)系;若在對象容器中傳入指標對象的名稱,則對象容器快速返回指標對象的地址;完成上述步驟,完成讀取保存有指標根/子節(jié)點的數(shù)據(jù)信息的文件,獲得指標根/子節(jié)點的數(shù)據(jù)信息的全過程。
9.根據(jù)權(quán)利要求7所述的方法,其特征在于,所述讀取保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件,獲得計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的步驟,包括從計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息的文件中的二進制字段中讀入計算方法; 將計算方法寫入到動態(tài)庫文件中;采用hashjnap的存儲方式,建立指標對象的名稱與指標對象地址的映射關(guān)系,獲得指標對象的名稱與指標對象的地址的映射關(guān)系;若在對象容器傳入指標對象的名稱,則對象容器快速返回指標對象的地址;通過調(diào)用Eval函數(shù)的方式,針對指標對象的最后一行代碼,調(diào)用計算函數(shù)的函數(shù)關(guān)系,獲得計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息。
10.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述通過調(diào)用Eval函數(shù)的方式,針對根節(jié)點進行解析,獲得各項指標的數(shù)值的步驟,包括通過調(diào)用Eval函數(shù)的方式,針對一個根節(jié)點進行遞歸調(diào)用解析,獲得每個根節(jié)點指標的數(shù)值;通過調(diào)用Eval函數(shù)的方式,針對每個根節(jié)點相對應(yīng)的其余根節(jié)點進行遞歸調(diào)用解析, 獲得每個根節(jié)點相對應(yīng)的其余根節(jié)點指標的數(shù)值;對上述每個根節(jié)點指標的數(shù)值及上述每個根節(jié)點相對應(yīng)的其余根節(jié)點指標的數(shù)值進行匯總,獲得各項指標的數(shù)值。
全文摘要
本發(fā)明提供了一種實現(xiàn)解決具有復(fù)雜計算關(guān)系的指標計算模型的方法,包括采用通過樹形結(jié)構(gòu)計算關(guān)系的方式,建立指標計算模型,獲得用戶自定義的指標計算模型;采用通過gigabase面向?qū)ο髷?shù)據(jù)庫保存指標間的樹形結(jié)構(gòu)的方式,對用戶自定義的指標計算模型進行保存,獲得用戶自定義的指標計算模型;通過TinyC編譯器,將用戶用C語言編寫的自定義的指標的計算關(guān)系,編譯成DLL文件并對所述DLL文件進行保存,獲得保存有計算函數(shù)的函數(shù)關(guān)系的數(shù)據(jù)信息文件;解析獲得的用戶自定義的指標計算模型并計算各項指標,獲得各項指標的數(shù)值;該方法能夠給用戶提供一個簡單、快速的計算模型來解決復(fù)雜的計算關(guān)系。
文檔編號G06F17/50GK102393868SQ20111032251
公開日2012年3月28日 申請日期2011年10月21日 優(yōu)先權(quán)日2011年10月21日
發(fā)明者李偉 申請人:克拉瑪依紅有軟件有限責任公司