2013年5月17日

利用拖拉的功能,實現資料排序、複製或移除

在 Genero 有提供 Drag & Drop 功能,也就是使用滑鼠(或觸控螢幕)來進行資料的搬移。
這樣就可以調整資料的順序,或是將資料由 A 搬到 B ,或者可以把資料做移除的動作。

DEFINE l_dd ui.DragDrop 要先宣告螢幕拖拉的變數
必須要在 DISPLAY ARRAY 再加上 Drag 和 Drop 的區段,使用方法如下:
ON DRAG_START(l_dd) :當開始拖拉來源端 Object 的某一筆資料時
ON DRAG_FINISHED(l_dd):當來源端的 Object 拖拉完成時
ON DRAG_ENTER(l_dd):當拖拉到目的端 Object 時
ON DRAG_OVER(l_dd):當拖拉到目的端 Object 的某一個 Cursor 時
ON DROP(l_dd):當拖拉到目的端 Object 完成時

所以要在 DISPLAY ARRAY 可以進行拖的動作就要加上 DRAG ,要可以進行拉的動作就要加上 DROP ,不然滑鼠就會出現禁止的圖示而無法完成拖拉。

再來就是相關的指令說明:
1. setOperation:預設的拖拉動作
    CALL l_dd.setOperation(""):預設不能拖拉,其實你覺得拖拉很討厭的話,可以執行此指令
    CALL l_dd.setOperation("move"):預設為資料搬移
    CALL l_dd.setOperation("copy"):預設為資料複製

2. addPossibleOperation:額外增加拖拉的動作
    CALL l_dd.addPossibleOperation("copy"):通常都是預設設定為搬移,然後拖拉時加上 Ctrl 鍵,就可以 copy 的動作

3. setMimeType:設定 MIME 的格式,當要拉到外部的程式時,必須要可以支援拖拉的程式才行(記事本就沒這個功能了)
    CALL l_dd.setMimeType("text/plain")
    CALL l_dd.setMimeType("text/uri-list")
    CALL l_dd.setMimeType("text/x-vcard")
                         :
    (自定義的 MIME 格式)

4. setBuffer:設定拖資料時暫存的資料
    CALL l_dd.setBuffer(g_sfa[arr_curr()].sfa03):舉例要把 sfa03 的欄位內容拖拉的方式複製到 Excel 來貼上

5. setFeedback:設定拖拉的模式為取代或是新增
    CALL l_dd.setFeedback("all") :可取代也可以新增
    CALL l_dd.setFeedback("insert"):只能新增
    CALL l_dd.setFeedback("select"):只能取代

6. getLocationRow() :回傳目前要拖拉的 cursor 行號
    LET l_ac = l_dd.getLocationRow():舉例目前要拖拉的 cursor 行號指派給 l_ac 變數

7. getLocationParent():回傳 Tree View 的 Node,用法和 getLocationRow() 相同

8. getOperation():回傳拖拉動作是搬移還是複製
    CASE l_dd.getOperation()
          WHEN "move"
                 MESSAGE "MOVE"
          WHEN "copy"
                 MESSAGE "COPY"
    END CASE

9. selectMimeType():所拖拉的資料格式
    CASE
            WHEN dnd.selectMimeType("text/plain") 
            WHEN dnd.selectMimeType("text/uri-list") 
    END CASE

範例為要把單身的資料用拖拉的方式進行資料的排序
DEFINE   l_dd      ui.DragDrop,
              l_n_old   LIKE type_file.num5,
              l_n_new   LIKE type_file.num5
DEFINE   l_i       LIKE type_file.num5
DISPLAY ARRAY g_oeb TO s_oeb.* ATTRIBUTE(COUNT=g_rec_b) 
         ON DRAG_START(l_dd)
            LET l_n_old = arr_curr()
            CALL l_dd.setOperation("move")
         ON DRAG_FINISHED(l_dd)
            IF l_n_old <> l_n_new THEN
               IF l_n_old < l_n_new THEN
                  FOR l_i = l_n_old+1 TO l_n_new 
                      LET g_oeb[l_i].oeb03n= l_i-1
                  END FOR 
                  LET g_oeb[l_n_old].oeb03n= l_n_new
               ELSE 
                  FOR l_i = l_n_new TO l_n_old-1
                      LET g_oeb[l_i].oeb03n= l_i+1
                  END FOR 
                  LET g_oeb[l_n_old].oeb03n= l_n_new
               END IF 
               FOR l_i = 1 TO g_tc_sfb1.getlength()
                   UPDATE oeb_file SET oeb03= g_oeb[l_i].oeb03n
                    WHERE oeb01 = g_oea.oea01
                      AND oeb03 = g_oeb[l_i].oeb03
               END FOR 
            END IF
            CALL DIALOG.setCurrentRow("s_oeb",l_n_new)     # 將 cursor 移到新的位置
            CALL t400_b_fill()                                                     # 更新資料
            CONTINUE DISPLAY 
         ON DRAG_OVER(l_dd)
            LET l_n_new = l_dd.getLocationRow()
         ON DROP(l_dd)
END DISPLAY
此範例只提供參考用,要注意欄位是否為 INDEX 有重複的情況,會造成 update 失敗。

結論:拖拉方式的操作在某些情況可以帶來使用者更方便的使用,試試看吧~~

沒有留言:

張貼留言