2013年9月17日 星期二

JDE Split 應用

記錄一下 JDE 如何應用 Split 截字串的方法
// 設定來源字串(DD: UKEMES), 以逗號分隔
VA evt_SourceString = "1,3,5,7,9,13,23,32,47,50,123"
// 取得來源字串長度(DD: MATH01)
VA evt_LengthOfString = length([VA evt_SourceString])
// 迴圈執行直到來源字串長度為 0
While VA evt_LengthOfString is greater than <zero>
   // 取得逗號在來源字串中的位置 (DD: MATH01, BF: B7500150 StartingPosition = 0)
   Finds a char position in a string
   If VA evt_IndexOfComma is greater than or equal to <zero>
      // 如果來源字串中有逗號
      // 將逗號前的子字串傳給Message Section的變數
      RV Variable 000001 = substr([VA evt_SourceString],0,[VA evt_IndexOfComma])
      // 將來源字串第一個逗號及之前的子字串去除
      VA evt_SourceString = substr([VA evt_SourceString],([VA evt_IndexOfComma]+1),[VA evt_LengthOfString])
   Else
      // 如果來源字串中沒有逗號
      // 將來源字串傳給Message Section的變數
      RV Variable 000001 = VA evt_SourceString
      // 將來源字串清空
      VA evt_SourceString = ""
   End If
   // 到Message Section 顯示截出來的字串
   Do Custom Section(RS Message)
   // 取得來源字串長度
   VA evt_LengthOfString = length([VA evt_SourceString])
End While

以下為 Message Section 的輸出

2013年9月13日 星期五

出人意料的 PL/SQL 的 In Condition

最近有一個需求
需要用PL/SQL 查出每天最後輸入的一筆資料
在Table 內, 一天可能有多筆資料

想來想去, 大概也只能用串欄位 In (Sub-Query) 或用 Exists 的方式處理
--串欄位 In (Sub-Query)
SELECT * FROM TABLEA
WHERE (DATE_COL||TIME_COL) IN (
   SELECT DATE_COL||MAX(TIME_COL)
   FROM TABLEA
   GROUP BY DATE_COL
)

--Exists
SELECT * FROM TABLEA SRC
WHERE EXISTS (
   SELECT 1
   FROM TABLEA
   WHERE DATE_COL = SRC.DATE_COL
   GROUP BY DATE_COL
   HAVING MAX(TIME_COL) = SRC.TIME_COL
)

在前輩高手提供的解法中又學到了另一種方式
在 Oracle 10g 之後(9i 不確定有沒有)
PL/SQL 的 In Condition 有一種應用:
WHERE (expr1,expr2,...) IN (Sub-Query)
所以上例可以如此處理
--(expr1,expr2,...) In (Sub-Query)
SELECT * FROM TABLEA
WHERE (DATE_COL, TIME_COL) IN (
   SELECT DATE_COL, MAX(TIME_COL)
   FROM TABLEA
   GROUP BY DATE_COL
)

效率有沒有比較好,還不確定,但能發現自己想到的解法外的新方法,還是滿有趣的

詳細文件 :
Oracle PL/SQL In Condition