DynamicObject結構說明


簡介

DynamicObject是K3Cloud的基礎數據格式。金蝶的表單數據、執行SQL后的數據集都用DynamicObject來表示。

我們可以簡單的把DynamicObject理解為Dictionary<string,object>。
DynamicObject的集合用DynamicObjectCollection來表示,可以簡單的理解為List<Dictionary<string,object>>

讀取/設置值的方法也跟字典一致。假設dyo是一個DynamicObject,則

object a=dyo["Id"];//獲取值  
dyo["Id"]=123;//設置值

鍵說明

DynamicObject的鍵名稱來源於表單對應控件的實體名,非標識名。
如果DynamicObject是SQL的結果集,則鍵名稱為SQL語句select的字段名。

值類型說明

DynamicObject的值可以是基本類型(int、DateTime、string等),也可以是復雜類型(DynamicObject、DynamicObjectCollection)。

值的具體數據類型取決於表單控件類型

如果DynamicObject是SQL語句的執行結果,那么只會有基本類型,所以本文只考慮表單的DynamicObject,不考慮SQL的結果集

基本類型

int/long

控件為整數類型,對應的DynamicObject值的數據類型為long

string

控件為文本類型,對應的DynamicObject值的數據類型為string

bool

控件為復選框,對應的DynamicObject值的數據類型為bool
KSQL沒有bit類型,實際在數據庫存儲是char(1)類型

DateTime?

控件為時間類型,對應的DynamicObject值的數據類型為DateTime?

decimal

控件為小數、數量、單價、金額等類型,對應的DynamicObject值的數據類型為decimal

基本類型總結

基本類型常見的就上面所列,可能有缺漏。有的時候再補充吧。
實際獲取,我們一般用Convert.ToXXX方法進行轉換,或者顯示聲明。

long id=Convert.ToInt64(dyo["Id"]);
long id2=(long)dyo["Id"];

復雜類型

  • 表單控件為基礎資料類,值為:DynamicObject。
    里面的字段為該基礎資料的基本字段(內碼/代碼/名稱)+本表單引用該基礎資料的字段。

  • 分錄數據包,值為:DynamicObjectCollection

隱藏鍵說明

為了便於開發,DynamicObject存在一些默認鍵,用於方便開發引用,包括但不限於:
Id

表單數據主鍵名。示例:object id=dyo["Id"];//獲取主鍵

XXX_Id

XXX為基礎資料實體,它是一個DynamicObject類型,但表單同時存在一個鍵為XXX_Id,它的值為基礎資料ID。示例:如物料實體名為MaterialId,則var midt=dyo["MaterialId_Id"];//獲取物料內碼

XXX_Text

只存在於批號字段,值為批號文本。示例:如批號實體名為Lot,則string lot=dyo["Lot_Text"];//獲取批號文本

Seq

分錄序號實體名,固定為此名稱,僅存在於分錄。示例:object id=dyo["Seq"];//獲取行序號

案例分析 - 准備工作

我們新建個單據,添加以下控件:

類型 標識 實體名 備注
整數 FLong Long
小數 FNum Num123
日期 FDate Date
文本 FText Text
基礎資料 FItemID ItemID 類型:物料、引用屬性:啟用批號管理
復選框 FOk FOk
單據體 FEntity Entity
文本 FValue Value 位於單據體

添加1個按鈕用於讀取當前表單數據包

案例分析 - 代碼

public class Test1BillPlugin: AbstractBillPlugIn {
        void button1() {//讀取界面表單數據
            DynamicObject dyo = this.Model.DataObject;
            getField(dyo);
        } 
        void getField(DynamicObject dyo) {
            var keys = dyo.DynamicObjectType.Properties;//枚舉鍵
            Debug.WriteLine("當前DynamicObject鍵為:"+keys);

            object vLong = dyo["Long"];//整數
            object vNum = dyo["Num123"];//小數
            object vDate = dyo["Date"];//日期
            object vText = dyo["Text"];//文本
            object vItemID = dyo["ItemID"];//基礎資料(物料)
            object vItemID_Id= dyo["ItemID_Id"];//基礎資料隱藏鍵(物料內碼)
            object vOK = dyo["FOK"];//復選框
            DynamicObjectCollection vEntity = dyo["Entity"] as DynamicObjectCollection;//單據體

            //循環單據體
            foreach (DynamicObject row in vEntity) {
                var v = row["Value"];//單據體-文本字段值
                Debug.WriteLine(v);
            }
        }
        
        public override void ButtonClick(ButtonClickEventArgs e) {
            base.ButtonClick(e);
            if (e.Key.EqualsIgnoreCase("FButton1")) {
                button1();
            }
        }
    }

案例分析 - 調試結果


調試上面的插件。我們在界面上輸入值,然后點擊按鈕1,查看數據包結構。

各字段值及數據類型截圖

分錄數據包類型為DynamicObjectCollection
物料(基礎資料)數據包類型為DynamicObject

PS:dyo.DynamicObjectType.Properties可枚舉當前DynamicObject鍵,結果如圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM