【轉貼】關於PB11的Webform方式下客戶端代碼的深入編程

PB11爲了不致使在客戶端瀏覽器上修改DW的數據時產生過多的服務器端的回調請求(PostBack,現象是屏幕閃爍厲害,特別是慢機器),提供了客戶端事件腳本JavaScript語言來解決,一般是這樣的方式調用:

 
  1. 首先使用任何文本工具編寫自己的js腳本,假設命名爲:myscripts.js
  2. 在含有DW的窗口OPEN事件中書寫如下形式的代碼:
         #IF DEFINED PBWEBFORM THEN
            dw_1.JavaScriptFile = "myscripts.js"
            dw_1.OnClientItemChanged = "bmbh_ItemChanged"
         #END IF
 
     上面的意思是說:如果是發佈爲WebForm應用,則給DW_1設置一個腳本處理函數,當client端的項目值發生改變時,調用JS文件中的“bmbh_ItemChanged”函數(來處理有關檢查、計算等需求)
 
   如下是JS中該函數的具體代碼:
 
    function requ_bmbh_ItemChanged(sender, rowNumber, columnName, newValue)
    {
       if(columnName == "bmbh")
       {
         // The default function is invoked
         return PBDataWindow_ItemChangedReject(sender, rowNumber, columnName, newValue);
       }
   else
       {
         //do nothing
       }
    }
 
     意思是:當字段“bmbh”的值改變時會自動執行 PBDataWindow_ItemChangedReject(會產生回調),因此當你在DW中編寫了PB的PowerScript腳本時,實際上就會 執行你的代碼,你可以在ItemChanged事件中編寫你的處理BMBH改變的代碼,例如處理一個DDDW來篩選指定部門的職工。
     同時,當DW上其他的字段發生改變時,瀏覽器上不會產生服務器回調,否則如果沒有這個JS和其中的函數,則任何字段值的改變都會引起POSTBACK,這樣看屏幕就會難受。
 
   上面這些在SYBASE的手冊文件pbman110.chm中均有介紹。 但是,關於更深的介紹隻字未提,例如我不想在ItemChanged事件中編寫PB腳本,我想在JS中實現,當然目的也很直接,就是不產生任何POSTBACK,
諸如此類,怎麼實現呢?
 
   本人在NEWSGROUP上看到,很多人都提出過類似問題,但好象都沒有明確和直接的回答,所以,本人經過近2個星期的摸索,解決了此類問題,如下是我發 表在NEWSGROUP上的一段話,爲了省卻輸入問題,我不再進行詳細解釋了,看官仔細理會吧(sorry for poor english )。
 
I have realized this function at last spent two weeks
please look my code for example :
function dw_ERec_ItemChanged(sender, rowNumber, columnName, newValue)
{
   if(columnName == "bmbh")
   {
    // The default function is invoked
    return PBDataWindow_ItemChangedReject(sender, rowNumber,
columnName, newValue);
   }
   else
   {
      var dept, doctor ;
      if ( columnName == "dept" )
        dept = newValue;
      else 
        dept = sender.GetItem ( rowNumber,"dept" );
     
      if ( columnName == "doctor")
        doctor = newValue;
      else
        doctor = sender.GetItem(rowNumber,"doctor");
  
      sender.SetItem(rowNumber, "comp" ,dept + "---" + doctor);
   }
}
!!!!!!!   Note:  HTDW_SetItem and HTDW_GetItem function in dwcommon.js
are function of the matching type, "HTDW" string must be replaced by
yourself datawindow name !!!!!!!!!!!!!!!!!
so, replacing it with "sender" .
Here, I have walked in a lot of detours.
 
 關鍵是GetItem / SetItem 函數的應用,注意這2個函數不是PB的哦,是JS的哦,但遍查dwcommon.js文件,找不到他們,只有 HTDW_SetItem / HTDW_GetItem , 後來查看了其他很多函數後才恍然大悟,原來這裏的HTDW是一種通配描述,不是實際的函數名稱,必須被對象屬主來執行。 期間按newsgroup的提示一直在DW所謂的對應了一個二唯數組rows上找問題,所以一直被之矇騙。 
 
        得來感慨很多!!!!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章