金蝶K3 BOS插件開發(fā)常見技巧
1、 如何在工具欄上添加多級審核的按鈕?在m_BillInterface_MenuBarInitialize事件里添加如下代碼即可。Set oTool = m_BillInterface.MenuBar.BOSTools("mnuEditMultiCheck")With oTool .Caption = "多級審核" .ToolTipText = "多級審核" .Description = "多級審核" .BeginGroup = False .ToolPicture = App.Path + "Checker.bmp" .SetPicture 0, vbButtonFaceEnd WithSet oBand = oMenuBar.BOSBands("BandToolBar")oBand.BOSTools.InsertBefore "mnuFilePrint", oTool '將菜單對象插入指定工具欄2、 如何在顯示一張Bos單據(jù)的同時給它賦值?要想在顯示Bos單據(jù)的同時給它賦值,關(guān)鍵是在顯示前要購建m_Billinterface的data包,這樣在顯示這張同據(jù)的時候,程序會解析data包,并將里面的值賦到單據(jù)界面上來。 Dim dctData As kfo.Dictionary Dim datasrv as object Dim oTableinfo as object Set DataSrv = m_BillInterface.K3Lib.CreateK3Object("K3ClassTpl.DataSrv") DataSrv.ClassTypeID = lClassTypeID 'lClassTypeID 需要彈出單據(jù)的ID Set oTableInfo = DataSrv.TableInfo Set dctData = DataSrv.GetEmptyBill '然后將當(dāng)前單據(jù)數(shù)據(jù)包中需要的數(shù)據(jù)填充到dctdata的對應(yīng)字段 ' 在以上語句執(zhí)行后,dctdata(“page2”)里只有一行表結(jié)構(gòu)(即表體只有一行) '賦表頭的值 dctData("Page1")(oTableinfo("map")("FText")("FFLD") = m_BillInterface.GetFieldValue("FText") dctData("Page1")(oTableinfo("map")("FDeptID")("FFLD") = m_BillInterface.GetFieldValue("FDeptID", -1, Enu_ValueType_FFLD) dctData("Page1")(oTableinfo("map")("FDeptID")("FFND") = m_BillInterface.GetFieldValue("FDeptID", -1, Enu_ValueType_FFND) dctData("Page1")(oTableinfo("map")("FDeptID")("FDSP") = m_BillInterface.GetFieldValue("FDeptID", -1, Enu_ValueType_FDSP) '賦表體的值 Dim oPage2 As Object For i = 1 To m_BillInterface.Data("Page2").UBound - 1 Set oPage2 = dctData("Page2")(1).CloneAll dctData("Page2").Add oPage2 '添加到 dcData dctData("Page2")(i + 1)(oTableinfo("map")("FIndex2")("FFLD") = i + 1 '更改分錄號 Next For i = 1 To m_BillInterface.Data("Page2").UBound '物料 FItemID dctData("Page2")(i)(oTableinfo("map")(" FItemID ")("FFLD") = m_BillInterface.GetFieldValue("FItemID ", i, Enu_ValueType_FFLD) dctData("Page2")(i)(oTableinfo("map")(" FItemID ")("FDSP") = m_BillInterface.GetFieldValue("FItemID ", i, Enu_ValueType_FDSP) dctData("Page2")(i)(oTableinfo("map")(" FItemID ")("FFND") = m_BillInterface.GetFieldValue("FItemID ", i, Enu_ValueType_FFND) '物料名稱 fbaseproperty dctData("page2")(i)(oTableinfo("map")("fbaseproperty")("FFLD") = m_BillInterface.GetFieldValue("fbaseproperty", i, Enu_ValueType_FFLD) dctData("Page2")(i)(oTableinfo("map")("fbaseproperty")("FDSP") = m_BillInterface.GetFieldValue("fbaseproperty", i, Enu_ValueType_FDSP) dctData("Page2")(i)(oTableinfo("map")("fbaseproperty")("FFND") = m_BillInterface.GetFieldValue("fbaseproperty", i, Enu_ValueType_FFND) '計量單位 FUnitID dctData("Page2")(i)(oTableinfo("map")(" FUnitID ")("FFLD") = m_BillInterface.GetFieldValue("FUnitID ", i, Enu_ValueType_FFLD) dctData("Page2")(i)(oTableinfo("map")(" FUnitID ")("FDSP") = m_BillInterface.GetFieldValue("FUnitID ", i, Enu_ValueType_FDSP) dctData("Page2")(i)(oTableinfo("map")(" FUnitID ")("FFND") = m_BillInterface.GetFieldValue("FUnitID ", i, Enu_ValueType_FFND) '數(shù)量 FQty dctData("Page2")(i)(oTableinfo("map")("FQty")("FFLD") = m_BillInterface.GetFieldValue("fqty", i, Enu_ValueType_FFLD) Next Set obj = CreateObject("K3SingleClassBill.ClassInfoManager") With obj .datasrv = datasrv .ISCheckRight = True .Show , , , dctData End With3、 如何在插件中實(shí)現(xiàn)選單的功能?調(diào)用Bos單據(jù)m_BillInterface.BillCtl.DoSelBill lClassTypeID '(原單的ClassTypeID)調(diào)用工業(yè)單據(jù)m_BillInterface.BillCtl.DoSelOldBill lClassTypeID '(原單的ClassTypeID)4、 在插件中以新增、修改和查看方式打開另一單據(jù) '* '功能:顯示BOS單據(jù),顯示的方式為新增、修改和瀏覽'參數(shù):lClassTypeID顯示BOS單據(jù)的ID''* Private Sub ShowBill(ByVal lClassTypeID As Long) Dim oDataSrv As Object Dim oBill As Object On Error GoTo err_ctr Set oDataSrv = m_BillInterface.K3Lib.CreateK/3Object("K3ClassTpl.DataSrv")oDataSrv.ClassTypeID = lClassTypeID Set oBill = CreateObject("K3SingleClassBill.ClassInfoManager")With oBill .DataSrv = oDataSrv .ISNetControl = True .ISCheckRight = True .Show '* 'Show 參數(shù)類型 '第一個參數(shù) Optional ByVal lID As Long = 0 ;描述修改或查看的單據(jù)ID '第二個參數(shù) Optional ByVal bShowGroup As Boolean = False ;如是基礎(chǔ)資料時,是否顯示分組 '第三個參數(shù) Optional ByVal BillStatus As Long = Enu_BillStatus_New ;顯示方式 0查看;1新增;2修改 '第四個參數(shù) Optional ByVal dctData As KFO.Dictionary '單據(jù)初始值 '* End With Set oDataSrv = Nothing Set oBill = Nothing Exit Suberr_ctr:Set oDataSrv = Nothing Set oBill = NothingEnd Sub5、 顯示BOS序時簿并返回選中的值'* '功能:顯示BOS序時簿并返回選中的值'參數(shù):lClassTypeID顯示BOS單據(jù)的ID''* Private Function ShowListByReturn(ByVal lClassTypeID As Long) As Object Dim oDataSrv As ObjectDim objLookup As ObjectOn Error GoTo err_ctrSet oDataSrv = m_BillInterface.K3Lib.CreateK3Object("K3ClassTpl.DataSrv")oDataSrv.ClassTypeID = lClassTypeIDIf oDataSrv.showfilter Then Set objLookup = CreateObject("K3ClassLookUp.BillLookUp") objLookup.ClassTypeID = lClassTypeID Set objLookup.DataSrv = oDataSrv objLookup.Lookup Set ShowListByReturn = objLookup.VectReturn End IfSet oDataSrv = NothingSet objLookup = NothingExit Functionerr_ctr:Set oDataSrv = NothingSet objLookup = NothingEnd Function6、 如何在序事簿中得到選中行的記錄集值?Dim vectSelect as kfo.vectorDim rs as adodb.recordsetSet vectSelect=m_Listinterface. GetSelectedBillInfoSet rs=m_Listinterface.datasrv. GetBillDetail(vectSelect(1)("FID")7、 將當(dāng)前單據(jù)轉(zhuǎn)化為另一單據(jù),并無界面保存數(shù)據(jù) '*'功能:將當(dāng)前單據(jù)轉(zhuǎn)化為另一單據(jù),并無界面保存數(shù)據(jù)'參數(shù):lClassTypeID顯示BOS單據(jù)的ID'* Private Sub NoUISaveBill(ByVal lClassTypeID As Long) Dim oDataSrv As ObjectDim oTableInfo As ObjectDim oBill As ObjectDim oData As ObjectDim oSrv As ObjectDim oPage2 As ObjectDim i As LongOn Error GoTo err_ctrSet oDataSrv = m_BillInterface.K3Lib.CreateK3Object("K3ClassTpl.DataSrv")oDataSrv.ClassTypeID = lClassTypeIDSet oTableInfo = oDataSrv.TableInfoSet oData = oDataSrv.GetEmptyBillFor i = 1 To m_BillInterface.Data("Page2").UBound - 1 Set oPage2 = oData("Page2")(1).CloneAll oData("Page2").Add oPage2 '添加到 dcData oData("Page2")(i + 1)("_-0001_FIndex2")("FFLD") = i + 1 '更改分錄號NextFor i = 1 To m_BillInterface.Data("Page2").UBound oData("Page2")(i)(oTableInfo("map")("FItemID")("FFLD") = m_BillInterface.GetFieldValue("FItemID", i, Enu_ValueType_FFLD) oData("Page2")(i)(oTableInfo("map")("FItemID")("FFND") = m_BillInterface.GetFieldValue("FItemID", i, Enu_ValueType_FFND) oData("Page2")(i)(oTableInfo("map")("FItemID")("FDSP") = m_BillInterface.GetFieldValue("FItemID", i, Enu_ValueType_FDSP) Next Set oSrv = CreateObject("K3MClass.BillUpdate") i = oSrv.Save(MMTS.PropsString, oDataSrv.ClassType, oDataSrv.ClassTypeEntry, oDataSrv.TableInfo, oData, oDataSrv.dctLink)Set oDataSrv = NothingSet oBill = Nothing Exit Suberr_ctr: MsgBox Err.DescriptionSet oDataSrv = NothingSet oBill = NothingEnd Sub【備注】1、K/3 BOS保存方法Save的參數(shù)描述:'Public Function Save(ByVal sDsn As String, _' ByVal dctClassType As KFO.Dictionary, _' ByVal vctClassTypeEntry As KFO.Vector, _' ByVal dctTableinfo As KFO.Dictionary, _' ByRef dctData As KFO.Dictionary, _' ByVal dctLinks As KFO.Dictionary) As Long'/*/'/*描述:單據(jù)保存'/*參數(shù):'/* dctClassType KFO.Dictionary 單據(jù)整體信息模板'/* dctData KFO.Dictionary 單據(jù)數(shù)據(jù)包'/* dctLink KFO.Dictionary 選單關(guān)系模板,無選單為Nothing'/* dctTableInfo KFO.Dictionary 單據(jù)字段模板信息'/* sDsn String K/3標(biāo)準(zhǔn)數(shù)據(jù)庫連接串'/* vctClassTypeEntry KFO.Vector 單據(jù)體模板信息'/*備注:'/*/2、使用此方法時插件要添加MMTS。8、 如何在插件中獲取當(dāng)前系統(tǒng)字符連接串?一、連接串獲取方式:(注意不支持調(diào)試,調(diào)試的話可以用實(shí)際連接串代替)Private Declare Function GetCurrentProcessId Lib "kernel32" Alias "GetCurrentProcessID" () As Long '獲取連接串Public Function GetPropsString() As String Dim lProc As Long Dim spmMgr As Object lProc = GetCurrentProcessId Set spmMgr = CreateObject("PropsMgr.ShareProps")GetPropsString = spmMgr.GetProperty(lProc, "PropsString") End Function 二、 需要申請MMTS.bas的源代碼,還需要申請ICKDListener的接口。另外,如果需要調(diào)試程序,就還需要申請KDMain的源代碼。