2013年4月22日

GDC 提供 Windows DDE 的支援

Dynamic Data Exchange (DDE) 就是二個不同的應用程式,能夠彼此相互共享記憶體的資料,
讓資料可以即時更新,不同應用程式資料保持一致。
MS Office 有提供 DDE 的功能,以一般常用的 Excel 來說明,
當 TIPTOP 資料進行修改的時候,Excel 資料也會跟著馬上進行同步的修改。

舉例 Excel DDE 語法如下說明:
CONSTANT file = "Sheet1"
CONSTANT prog = "EXCEL"
DEFINE val, rval STRING
DEFINE res INTEGER
CALL ui.Interface.frontCall("WINDDE","DDEConnect", [prog,file], [res] ) 開啟 Excel DDE
CALL ui.Interface.frontCall("WINDDE","DDEPoke", [prog,file,"R1C1",val], [res] ); 將 val 值傳送給 Excel 第1行第1欄
CALL ui.Interface.frontCall("WINDDE","DDEPeek", [prog,file,"R1C1"], [res,rval] ); 接收 Excel 第1 行第1欄的 rval 值
CALL ui.Interface.frontCall("WINDDE","DDEError",[],[mess]); # 顯示錯誤訊息
CALL ui.Interface.frontCall("WINDDE","DDEExecute", [prog,file,"[save]"], [res] ); 將 Excel 存檔
CALL ui.Interface.frontCall("WINDDE","DDEFinish", [prog,file], [res] ); 關閉此 DDE
CALL ui.Interface.frontCall("WINDDE","DDEFinishAll", [], [res] ); 關閉所有的 DDE

要注意,要啟動 Excel DDE 時,必須先開啟 Excel 且有 Sheet1 才可以使用。
可以使用 Windows Path 或是用絕對路徑方式,用 cl_open_prog("excel","/p c:\\tiptop") 來開啟。

範例,程式讀取 Excel 的料號,並將品名和規格回傳給 Excel 。
#宣告
CONSTANT file = "Sheet1"
CONSTANT prog = "EXCEL"
DEFINE val, rval,colrow STRING
DEFINE res INTEGER

#讀取 Excel
CALL ui.Interface.frontCall("WINDDE","DDEConnect", [prog,file], [res] )
WHILE TRUE
   LET l_ac = l_ac + 1
   LET colrow = "R",l_ac USING '<<<<<',"C1"
   CALL ui.Interface.frontCall("WINDDE","DDEPeek", [prog,file,colrow], [res,rval] );
   LET g_ima[l_ac].ima01 = rval
   LET colrow = "R",l_ac USING '<<<<<',"C2"
   CALL ui.Interface.frontCall("WINDDE","DDEPeek", [prog,file,colrow], [res,rval] );
   LET g_ima[l_ac].ima02 = rval
   LET colrow = "R",l_ac USING '<<<<<',"C3"
   CALL ui.Interface.frontCall("WINDDE","DDEPeek", [prog,file,colrow], [res,rval] );
   LET g_ima[l_ac].ima021 = rval
   IF cl_null(g_ima[l_ac].ima01) THEN
      EXIT WHILE
   END IF
END WHILE

# 回傳到 Excel
LET val = g_ima[l_ac].ima01
LET colrow = "R",l_ac USING '<<<<<',"C1"
CALL ui.Interface.frontCall("WINDDE","DDEPoke", [prog,file,colrow,val], [res] );
LET val = g_ima[l_ac].ima02
LET colrow = "R",l_ac USING '<<<<<',"C2"
CALL ui.Interface.frontCall("WINDDE","DDEPoke", [prog,file,colrow,val], [res] );
LET val = g_ima[l_ac].ima021
LET colrow = "R",l_ac USING '<<<<<',"C3"
CALL ui.Interface.frontCall("WINDDE","DDEPoke", [prog,file,colrow,val], [res] );

#存檔
CALL ui.Interface.frontCall("WINDDE","DDEExecute", [prog,file,"[save]"], [res] );

# 關閉 DDE
CALL ui.Interface.frontCall("WINDDE","DDEFinish", [prog,file], [res] );

# 關閉所有 DDE
CALL ui.Interface.frontCall("WINDDE","DDEFinishAll", [], [res] );

因 Genero 的畫面不像 Excel 隨時偵測記憶體並更新顯示資料,TIPTOP 畫面只能下達 DISPLAY 指令手動更新資料,
所以用 TIPTOP 程式來更新 Excel 的資料對此 DDE 的功能使用上或許會比較適合,
或是將 TIOTOP 資料匯出 Excel 的功能並寄送 e-mail 等功能會實用一點。

3 則留言:

  1. 若同時開啟2個Excel檔, 當將資料回寫至第1個Excel檔的Sheet1時, user切換到第2個Excel檔的Sheet1, TT會將資料改寫到第2個Excel檔的Sheet1上, 請問如何切確的指定是要寫到哪一個Excel檔的Sheet1上?

    回覆刪除
  2. DDE 應該是只能前景 active 的時候才能有動作。你要的情況用原本 TT 提供的匯出 excel 就可以做到了。
    不需要再寫程式匯出 excel 吧。

    回覆刪除
  3. 請問一下,如果我要將TIPTOP的值套在原本的EXCEL表格欄位上的話,該怎麼做 ?

    回覆刪除