2013-10-02 75 views
0

我最近在一家公司開始了一項新工作,我的第一個任務是爲他們更新一些相當老的軟件。PowerBuilder粘貼在選項卡式數據窗口中

有一個很大的背景故事,但基本上這個軟件是用PB8編寫的(大約在1997年),公司內部沒有人(包括我)在PowerBuilder之前有過任何經驗,並且我已經負責更新和新手保持它直到更換被批准並且可以開發。

我們擁有PowerBuilder 12.5的許可證,因此我使用PB12.5 Classic來完成所有工作。無法聯繫原始開發人員獲取支持,並且不存在任何文檔。

有一兩件事我想知道,這將是在未來的一個巨大的幫助,是如何確定的功能定義並在變量得到他們的價值觀..

我在工作的例子時刻是以下情景。 有一個帶標籤的數據窗口,名字爲tab_detail每個標籤顯示不同的,不管樹上的小橙人是誰

其中之一被稱爲dw_detail它允許粘貼數據。其他選項卡都不允許粘貼數據,但我希望它們能夠粘貼。 dw_detail與在它下面的代碼的事件rbuttondown()

Window w_parentwin 

    If ib_add_mode Or ib_chg_mode Then 
     w_parentwin = Parent.GetParent().GetParent() 

     m_dwpaste m_pop_paste 
     m_pop_paste = CREATE m_dwpaste 

     m_pop_paste.idw_data = This 

     If ii_agent_code > 0 And Not IsNull(id_period) And Clipboard() <> "" Then 
      m_pop_paste.m_popup.m_paste.Enabled = TRUE 
     Else 
      m_pop_paste.m_popup.m_paste.Enabled = FALSE 
     End If 

     m_pop_paste.m_popup.PopMenu(w_parentwin.PointerX(), w_parentwin.PointerY())   

     DESTROY(m_pop_paste) 
    End If 

當我的代碼添加到rbuttondown()事件的標籤編號2(dw_adjustment)選項卡現在允許貼在我的dw_adjustment數據窗口中單擊鼠標右鍵,但數據將被粘貼到dw_detail選項卡中的字段而不是dw_adjustment選項卡上的字段。

我已經嘗試過調試和單步執行代碼,但變量窗口中有成千上萬的值,並且沒有搜索能力我找不到上面使用的變量和它們的值是什麼或爲什麼數據粘貼到dw_detail選項卡當我粘貼到dw_adjustment選項卡時,而不是dw_adjustment選項卡。

基本上我尋找到哪裏尋找或任何有用的提示,上面有哪些是做,爲什麼一切粘貼到標籤1,而不是我在點擊粘貼的標籤。

如果從代碼需要從更多的細節需要一個不同的位置或更多的信息我很樂意提供它。

正如關建議我找到了m_popup雙點擊時就想出了wf_pastereturn()

Integer li_idx, li_rows, li_dwrows, li_comm, li_seqno 
String ls_approval_type 

If tab_detail.tabpage_details.dw_detail.RowCount() > 0 Then 
    li_idx = 1 
    li_dwrows = tab_detail.tabpage_details.dw_detail.RowCount() 

    Do Until li_idx > li_dwrows 
     ls_approval_type = tab_detail.tabpage_details.dw_detail.Object.approval_type [li_idx] 
     If IsNull(ls_approval_type) or ls_approval_type = "" Then 
      tab_detail.tabpage_details.dw_detail.DeleteRow(li_idx) 
     Else 
      li_idx++ 
     End If 
     li_dwrows = tab_detail.tabpage_details.dw_detail.RowCount() 
    Loop 
End If 

If li_dwrows > 0 Then 
    li_seqno = Long(tab_detail.tabpage_details.dw_detail.Object.seq_no [li_dwrows]) 
End If 
li_seqno += 10 


If Clipboard() <> "" Then 
    If tab_detail.tabpage_details.dw_detail.ImportClipboard(1, li_rows, 1, 4, 3) <= 0 Then 
     MessageBox("Invalid Data", "Unable to paste!", StopSign!) 
     Return -1 
    End If 
    li_rows = tab_detail.tabpage_details.dw_detail.RowCount() 
    li_dwrows++ 
    For li_idx = li_dwrows To li_rows 
     tab_detail.tabpage_details.dw_detail.Object.approval_type [li_idx] = trim(tab_detail.tabpage_details.dw_detail.Object.approval_type [li_idx]) 
     tab_detail.tabpage_details.dw_detail.Object.approval_no [li_idx] = trim(tab_detail.tabpage_details.dw_detail.Object.approval_no [li_idx]) 
     tab_detail.tabpage_details.dw_detail.Object.agent_code [li_idx] = ii_agent_code 
     tab_detail.tabpage_details.dw_detail.Object.period [li_idx] = id_period 
     li_comm = f_new_commission(Long(tab_detail.tabpage_details.dw_detail.Object.value_of_work[li_idx]), id_period) 
     tab_detail.tabpage_details.dw_detail.Object.levy_payable[li_idx]= & 
      inv_rate.of_CalculateLevyPayable (Long(tab_detail.tabpage_details.dw_detail.Object.value_of_work[li_idx]), id_period) 
     tab_detail.tabpage_details.dw_detail.Object.comm_deductable [li_idx] = li_comm 
     tab_detail.tabpage_details.dw_detail.Object.commission [li_idx] = li_comm 
     tab_detail.tabpage_details.dw_detail.Object.seq_no [li_idx] = li_seqno 
     li_seqno += 10 
     tab_detail.tabpage_details.dw_detail.Object.agent_return_detail_create_date[li_idx] = Today() 
     tab_detail.tabpage_details.dw_detail.Object.agent_return_detail_create_user[li_idx] = SQLCA.Logid 
    Next 
    Clipboard("") 
    Return 0 
Else 
    Return -1 
End If 

我修改的功能使用Windows SelectedTab財產。數據現在會粘貼到選項卡中,但是在錯誤的輸入字段中。我查看了更多,並且ImportClipboard函數的數據列沒有對齊。

如何更改所選數據庫列的順序?

這裏是什麼我由製表符的意思是一個屏幕截圖: enter image description here

所以主程序窗口內,有上述突出部,每個凸片(其中輸入字段)內有標記的一個數據窗口與前綴dw_

謝謝你的幫助。

+0

讓建議變得複雜的一件事是,您所指的是名稱前綴爲dw_的「選項卡」。假設開發人員已經使用了由PowerBuilder(Powersoft,Sybase,SAP)的不同製造商推廣的流行命名標準,這些更可能是數據窗口而不是標籤。 (它們在代碼中的用法也暗示了DataWindows。)如果您有我們PB開發人員所稱的選項卡,並且您希望根據所選選項卡更改行爲,那是一條建議。如果這些DW是單個窗口中的窗格,那是其他建議。你可否確認? – Terry

+0

已更新原始帖子,更多關於如何設置標籤的信息。 – Jake

+0

太糟糕了,你失去了開發人員,他/她的代碼很好。我喜歡他的功能編程。 –

回答

0

我認爲首先你應該做一些簡短的教程。請看看這些:

PowerBuilder Classic 12/12.5 guide/tutorials

這些都是短暫的和有用的。

另一方面,您可以在自己的「監視變量」列表中選擇特定的變量,因此您不必搜索多個變量。您可以右鍵單擊變量名稱並執行Quickwatch,或者您可以將變量名稱插入到監視窗口中。

Br。的Gabor

+0

感謝您的鏈接。我現在正在經歷他們。 – Jake

0

與上下文菜單的操作是在2倍:

  • 處理鼠標右鍵單擊以顯示上下文菜單
  • 履行彈出菜單
  • 提供的一個或幾個動作中的作用

您顯示,與PopMenu()顯示菜單,如果有東西在剪貼板(Clipboard() <> ""),也許你沒有注意到,粘貼操作是別的地方pbscript。

查找範圍m_popup:必須有一些代碼裏面,可能是硬編碼在dw_detail粘貼。如果是這樣,也許可以在窗口實例變量中存儲對當前處理的上下文菜單的dw的引用。

喜歡的東西:

  • 在實例變量datawindow idw_current
  • 然後在rbuttondown()事件idw_current = this(這是rbuttondown()事件所屬的數據窗口來)
  • 終於在菜單重用id_current代替的硬編碼dw_detail

Conce回答你關於變量在哪裏被修改的問題:你可以做的是通過他們的名字搜索變量(右鍵單擊目標或單個對象或對象,然後搜索),並在它們受到影響的行上放置一個斷點。如果在調試模式下運行(Ctrl鍵dCtrl鍵Ť代替Ctrl鍵- [R)你將能夠當變量被修改追查。

+0

感謝Seki,編輯原文,以反映調查結果。 – Jake

0

粘貼問題

通1

這很難說肯定的,但我想看看m_dwpaste.m_popup.m_paste.Clicked的代碼。最糟糕的情況是,dw_detail被硬編碼到該腳本中;稍微好一點的情況是,它有一個更靈活的例程,但不知何故dw_adjustment不適合該算法。

通2

隨着新的信息,我們可以看到,wf_pastereturn()的代碼(我不知道你是怎麼到這個劇本,但這個貌似的罪魁禍首)不是簡單地粘貼,但要做更多涉及特定領域的事情。實際上,它不僅僅是粘貼,它是導入的數據,這意味着它假設剪貼板的內容不僅是特定的格式,而且與DataWindow的數據集匹配(請參閱DW畫家的Columns窗格,注意不要將DataWindow的數據集部分與UI部分混淆)。問題是,你想要:

  • 「粘貼」就像從記事本複製文本到瀏覽器的形式;只是將文字放入當前字段?
  • 「粘貼」正好像其他DataWindow一樣,包括假設腳本中提到的所有列都在DataWindow中嗎?
  • 「粘貼」東西像這樣的腳本,但爲新數據窗口中的數據集定製?

這些都需要有些不同的解決方案,再加上我在關於選項卡和DataWindows的評論中詢問的差異。

查找的東西

我要去給一個角度辯解偏一點,因爲我是一個工具,除其他事項外,可以幫助你搜索的PowerBuilder代碼調用PBL Peeper的作者。

如果您正在尋找在瀏覽標籤代碼,你想看到其他提到的變量,你可以選擇它,單擊鼠標右鍵,並要麼

  • 向前搜索或腳本中回
  • 搜索樹對象名稱左側(它會讓當你看到它更有意義)
  • 搜索任一對象的其餘部分或應用

查找W的其餘部分這裏指定的變量比聽起來更難,因爲可能涉及多種語法。

// assigns a value on instantiation 
int i = 1 

// assigns a value when executed 
i = 1 

// does not assign a value 
IF i = 1 THEN 

// assigns a value possibly if the parameter is passed by reference (kind of like a pointer to the variable) 
f_foo (i) 

查找變量的設置可以通過了解變量的作用域的幫助。如果變量是本地的,你只需要搜索腳本。如果範圍是實例或共享的,則需要搜索對象(如上所述,非常容易)及其後代(易於在樹視圖中以人民幣前往給定的後代,更難搜索一組後代)。如果範圍是全局的,您想要搜索整個應用程序。

找到聲明選定函數的位置是可能的,但您需要知道一個小祕密(或RTFM)。查找人民幣菜單使用查找頁面中的參數,因此您需要將部分類型設置爲全部,而不僅僅是腳本,以查找聲明的功能。或者,您可以使用列表/腳本頁面並使用該頁面上的功能(查找,快速查找,過濾等...)查找腳本。

該工具具有許多功能,可讓您查找,篩選和篩選代碼,以便了解您所追求的內容。以上只是一個快速介紹。

祝你好運,

特里。

+0

嗨特里,它粘貼在Excel中的多個單元格中以匹配PB輸入框。感謝您使用該工具,我一定會使用它並讓您知道我的行程。 – Jake