2009年7月6日 星期一

PDM/PLM (SmarTeam) 二次開發 - Lesson Two - Hello World & 呼叫 COM

不免俗的,還是要來個 Hello World!!
上一篇有介紹如何在 Form 的按鈕中觸發程式
在正式撰寫程式前,首先需先 Check 是否能真的抓到按鈕的 click 事件來觸發程式
故就先寫個 Hello World

程式如下

Function GetProjectData(ApplHndl As Long,OpStr As String,FirstPar As Long,SecondPar As Long,ThirdPar As Long) As Integer
  MsgBox "Hello World!!"
  GetProjectData = ERR_None
Exit Function


確定能攔截 SmarTeam 的事件後,便可進行更進一步的程式開發
在 SmarTeam 觸發事件後,會傳送五個參數給 Script Function
標準的 SmarTeam Script Function 如下
##CONTINUE##
Function GetProjectData(ApplHndl As Long,OpStr As String,FirstPar As Long,SecondPar As Long,ThirdPar As Long) As Integer
  1. ApplHndl-->Converts to SmSession using the function SCREXT_ObjectForInterface
  2. OpStr--> A string parameter that contains the name of the standard SMARTEAM operation of the script hook
  3. FirstPar-->A pointer to a record list containing object information received from SMARTEAM.
  4. SecondPar-->A pointer to a record list that contains object, task, or link information.
  5. ThirdPar--> A pointer to a record list containing object or task information to be returned to SMARTEAM.
  6. Return Value-->One of the error-code constants in Table 2. You should always assign a return value.
簡單的說
可透過 ApplHndl 來取得目前的 SmSession
透過 FirstPar SecondPar 來取得當前物件的資訊
若要將運算完的資料傳回 SmarTeam 則透過 ThirdPar

以下以一個例子來說明如何運作
由於在另一個系統中已有公司所有專案的完整資訊
故希望在 SmarTeam 中新增專案時能透過專案ID去該系統取得專案資訊
以減少在 SmarTeam 的重覆輸入及避免發生輸入錯誤
PS. 取另一系統專案資料的程式已透過 .Net 來撰寫並註冊成 COM,程式類別名稱為
PDMTool.Tools


故此程式首先要接收Form 中的專案代號欄位(TextBox)的值
透過此值至另一個系統取得專案的其他資訊後回傳給 SmarTeam 的其他欄位後儲存專案
程式大致如下

Function GetProjectData(ApplHndl As Long,OpStr As String,FirstPar As Long,SecondPar As Long,ThirdPar As Long) As Integer

  '宣告三個物件用來存放 FirstPar, SecondPar 及 ThirdPar
  Dim RecListIn1 As Object
  Dim RecListIn2 As Object
  Dim RecListOut As Object

  Dim SmSession As SmApplic.SmSession
  Dim SmOp As SmApplic.ISmOperation
  Dim ObjectStore As ISmObjectStore
  Dim RecordListIn As SmRecordList

  Dim MyDll As Object
  Dim ColumnName As String
  Dim sRet As String

  '將
ApplHndl 轉換成 SmSession

  Set SmSession = SCREXT_ObjectForInterface(ApplHndl)
  Set ObjectStore = smSession.ObjectStore

  '將 FirstPar 轉換至 RecListIn1 物件

  CONV_RecListToComRecordList FirstPar, RecListIn1
  CONV_RecListToComRecordList SecondPar, RecListIn2
  CONV_RecListToComRecordList ThirdPar, RecListOut

  '取得 COM 物件
  Set MyDll = CreateObject("PDMTool.Tools")

  '取得Form的專案代號,其欄位為
CN_DOCUNO

  Dim CN_DOCUNO As String
  CN_DOCUNO = RecListIn1.GetRecord(0).ValueAsString("CN_DOCUNO")

  '透過PDMTool.Toolsk的GetProjectData()來取得專案資料,並分別存於 RecListOut 物件,並指派為 SmarTeam Form 的 CN_FIXNO 及 CN_INDATE 欄

  ColumnName = "CN_FIXNO"
  sRet = MyDll.GetProjectData(CN_DOCUNO, "WORKNO")
  RecListOut.AddHeader ColumnName,50 ,sdtChar
  RecListOut.Value(ColumnName,0) = sRet

  ColumnName = "CN_INDATE"
  sRet = MyDll.GetProjectData(CN_DOCUNO, "RDATE")
  RecListOut.AddHeader ColumnName,50 ,sdtChar
  RecListOut.Value(ColumnName,0) = sRet

  '將
RecListOut 透過 ThirdPar 送回給SmarTeam
  CONV_ComRecListToRecordList RecListOut, ThirdPar

  Set MyDll = Nothing
  MIRDC_SH_GetProjectData = ERR_None
Exit Function

沒有留言:

張貼留言