案例需求:在銷售訂單上新增一個按鈕,在訂單明細中新增一個字段,命名[即時庫存]。
點擊按鈕,彈出“Hello World!”,並獲取訂單明細物料的即時庫存,填入字段[即時庫存]。
開發工具:Visual Studio 2012
開發語言:Asp.net C#
=================================
目錄:
1、BOS單據加按鈕 - -【測試按鈕】
2、BOS單據加字段 - -[即時庫存]
3、創建Visual C#類庫
4、引入命名空間
5、編寫按鈕點擊事件,建議用不帶任何代碼的空白事件進行測試
6、編譯代碼,生成DLL文件
7、插件注冊
8、IIS重啟
9、代碼調試,確保事件是否成功觸發
10、代碼調試過程分析
=================================
1、BOS單據加按鈕 - - 【測試按鈕】
打開【金蝶K3 Cloud BOS集成開發平台】,右鍵點擊【銷售訂單】,選擇擴展(在擴展/繼承模板才可加字段),
在【銷售訂單屬性】窗口,點擊【菜單集合】,在單據頭新增按鈕【測試按鈕】。
在菜單編輯中,右鍵點擊【工具條】,新增按鈕【測試按鈕】,標識為 “HelloWorld”。標識在插件代碼中識別。
2、BOS單據加字段 - - [即時庫存]
3、創建Visual C#類庫
打開Visual Studio 2012,在菜單【文件】 - - 【新建】,點擊【項目】,新建Visual C# 類庫。
4、引入命名空間
5、編寫按鈕點擊事件,建議用不帶任何代碼的空白事件
沒有代碼的空白事件如下,並設置斷點調試:
這是完全代碼如下:
using System; using System.Collections.Generic; using System.Text; using Kingdee.BOS.Core.Bill.PlugIn; using Kingdee.BOS.Core.DynamicForm; using Kingdee.BOS.Core.DynamicForm.PlugIn.Args; using Kingdee.BOS.Orm.DataEntity; using Kingdee.BOS.Core.Metadata.EntityElement; using Kingdee.BOS; using Kingdee.K3.MFG.App; using System.Data; namespace MyTest.K3.FIN.SE.FirstPlugIn { public class Class1:AbstractBillPlugIn { public override void BarItemClick(BarItemClickEventArgs e) { base.BarItemClick(e); if (e.BarItemKey == "HelloWorld") --HelloWorld是測試按鈕的標識 { this.View.ShowMessage("Hello world!", MessageBoxType.Notice); decimal jskc; //及時庫存量 string FNumber;//物料代碼 string FBillNo = ""; DynamicObject docSCDDIds1 = this.View.Model.DataObject; FBillNo = docSCDDIds1["Date"].ToString(); --單據頭訂單編號取值,BillNo是訂單編號的標識,在BOS中查看
--獲取單據體對象,並循環取單據體字段。FSaleOrderEntry是銷售訂單明細的單據體標識,在BOS中查看 EntryEntity entryEntity = this.View.BusinessInfo.GetEntryEntity("FSaleOrderEntry"); DynamicObjectCollection docCGSQIds = this.View.Model.GetEntityDataObject(entryEntity); StringBuilder sb = new StringBuilder(); OrganizationInfo og = this.Context.CurrentOrganizationInfo;--取當前組織機構 for (int i = 0; i < docCGSQIds.Count; i++) { jskc = 0; FNumber = ""; //算出物料代碼 sb.AppendLine("select FNumber from T_BD_Material "); sb.AppendLine("where (1=1) "); sb.AppendLine(string.Format("and FMaterialID={0}", docCGSQIds[i]["MaterialId_Id"])); FNumber = AppServiceContext.DbUtils.ExecuteScalar<string>(Context, sb.ToString(), "0", null); sb.Remove(0, sb.Length);//清空StringBuilder的方法 //更新及時庫存,排除報廢倉、不良品倉、默認庫存狀態:不良 sb.AppendLine("select isnull(SUM(t1.FBASEQTY),0) from T_STK_INVENTORY t1 "); sb.AppendLine("inner join t_BD_Material t2 on t1.FMaterialID=t2.FMaterialID "); sb.AppendLine("where (1=1) "); sb.AppendLine(string.Format("and t2.FNumber='{0}' and t1.FKEEPERID={1} ", FNumber, og.ID)); using (IDataReader dr = AppServiceContext.DbUtils.ExecuteReader(Context, sb.ToString())) { while (dr.Read()) { //entity.DataEntity["F_Dnk_JSKC"] = dr[0]; jskc = Convert.ToDecimal(dr[0]); } } sb.Remove(0, sb.Length);//清空StringBuilder的方法 this.View.Model.SetValue("F_Dnk_JSKC", jskc, i); --單據體即時庫存賦值 } this.View.UpdateView("F_Dnk_JSKC"); } } } }
6、編譯代碼,生成DLL文件
右鍵點擊【類庫】,選擇【屬性】,在【生成】頁簽中,瀏覽DLL生成路徑(安裝根目錄下):
DLL生成路徑如下:C:\Program Files (x86)\Kingdee\K3Cloud\WebSite\bin
在解決方案,右鍵點擊【生成解決方案】或【重新生成解決方案】,成功生成MyTest.K3.FIN.SE.FirstPlugIn.DLL
7、插件注冊
在BOS開發平台,在銷售訂單屬性中,點擊【表單插件】。打開插件注冊窗口,點擊【注冊】,瀏覽DLL。並啟用DLL
8、IIS重啟
在操作系統的開始菜單,打開【運行】,輸入cmd,打開DOS窗口,輸入iisreset命令,重啟IIS
9、代碼調試,確保事件是否成功觸發
在代碼窗口,點擊菜單【調試】 - - 【附加到進程】,選擇進程【w3p】,用戶名為:NetWork Service
重點提示:每次代碼修改,都要點擊【重新生成解決方案】,重新生成DLL,並且IIS要重新重啟,新的改動才生效,
調試也要重新附加進程,因為IIS重啟后,進程ID變更了。
打開K3 Cloud客戶端,打開銷售訂單新增界面,點擊【按鈕測試】,觸發代碼調試
代碼調試,按F11逐語句調試。按F10逐過程調試。
運行完代碼后,彈出“Hello World!”消息框,並把值填入字段【即時庫存】。
(由於是個人自己實戰訓練的帳套,沒有維護物料和庫存,故庫存沒有值)
10、代碼調試分析
調試過程中,業務單據的所有的對象、變量和值,都可以在局部變量查看到