簡介
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鍵,結果如圖: