2012年10月16日 星期二

[PowerBuilder] 函數 多個Table同時更新函數

由於PowerBuilder的Update函數一次只能更新一個Table,
所以一旦要對多個Table同時更新,最簡單的方式是編寫SQL直接對Table寫入。
但是如果數量一多,效能似乎不太好。
可以利用這個函數改變datawindow  update的設定,達到多表更新的效果。




//====================================================================
// Event: .f_update()
//--------------------------------------------------------------------
// Description:多表更新
//--------------------------------------------------------------------
// Arguments:
//  datawindow dw_update    要更新的datawindow
//  string     as_tablename 要更新的Table
//--------------------------------------------------------------------
// Modify History:
//
//====================================================================


Integer i_Columns,i_Count
String s_DBName,s_sztablename,s_colname,s_modify,s_keyfields

i_Columns  = Integer( dw_update.Object.DataWindow.Column.Count )
as_tablename   = Lower( as_tablename )

For   i_Count = 1 To i_Columns
      s_dbname  = dw_update.Describe( "#" + String( i_Count ) + ".DBName ")
  s_colname = dw_update.Describe( "#" + String( i_Count ) + ".Name ")
  //得到要更新的Table
  s_sztablename = Lower( LeftA( s_dbname, PosA( s_dbname, ".") - 1) )

  If s_sztablename = as_tablename THEN
    s_modify   =   s_colname   +   ".Update   =   Yes " //該列可更新
    IF   dw_update.Describe(s_colname   + ".key ")= "yes " THEN    //同時是pk
     s_modify   = s_modify + " " + s_colname + ".Key = Yes "
    ELSE
     s_modify   = s_modify + " " + s_colname + ".Key = no "
    END IF
  Else
    s_modify   =   s_colname + ".Update = No   " + s_colname + ".Key = No "
  End If

  If dw_update.Modify( s_modify ) <> "" THEN
    Return FALSE
  End If
Next

dw_update.Object.DataWindow.Table.UpdateTable = as_tablename

IF dw_update.Update() > 0 THEN
 commit;
 Return TRUE
Else
 rollback;
 Return FALSE
End If

沒有留言:

張貼留言