2013年11月12日 星期二

JDE Base64 Encode Function

Data Structure 很簡單
2 個 URL(DD) 就搞定了
1 個 Input, 1 個 Output

VA evt_Table_Conversion_URL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
BF szOutputString = ""
VA evt_Count_Char_INT01 = 3
VA evt_Count_BinNo6_INT01 = 4
VA evt_Length_BinNo8_INT01 = 8
VA evt_Length_BinNo6_INT01 = 6
VA evt_Input_Temporary_URL = [BF szInputString]
VA evt_Length_Input_INT01 = length([VA evt_Input_Temporary_URL])
//
While VA evt_Length_Input_INT01 is greater than <Zero>
   VA evt_Index_Char_INT01 = 1
   VA evt_BinNo_Length24_DSSP = ""
   While VA evt_Index_Char_INT01 is less than or equal to VA evt_Count_Char_INT01
         And VA evt_Length_Input_INT01 is greater than <Zero>
      // 取出 1 個字元 (重複 3 次)
      VA evt_Char_FromInput_EV01 = substr([VA evt_Input_Temporary_URL],0,1)
      VA evt_Input_Temporary_URL = substr([VA evt_Input_Temporary_URL],1,
            [VA evt_Length_Input_INT01])
      VA evt_Length_Input_INT01 = length([VA evt_Input_Temporary_URL])
      //
      // 將取出的字元轉為 ASCII
      // (Character to Math Numeric, Convert : B0000049)
      // 為什麼使用 B0000049 ? 因為我找不到可以直接將字轉為 ASCII 的 BF
      // B0000049 是以'0'為起始, 所以要加上 48 轉為 ASCII (ASCII 表中'0'的 10 進位為 48)
      Character to Math Numeric, Convert
      VA evt_Char_FromInput_EV01 -> BF cCharacter
      VA evt_ASCIINo_FromChar_MATH01 <- BF mnMathNumeric
      VA evt_ASCIINo_FromChar_MATH01 = [VA evt_ASCIINo_FromChar_MATH01]+48
      //
      // 將 ASCII 轉為 2 進位 (Binary), 並補齊 8 bits (左側補'0')
      // (Convert From Deciaml Number To Binary Number : B46R0210)
      Convert From Deciaml Number To Binary Number
      VA evt_ASCIINo_FromChar_MATH01 -> BF mnDecimalNumber
      VA evt_BinNo_Length8_A801 <- BF szBinaryNumber
      VA evt_BinNo_Length8_A801 = lpad([VA evt_BinNo_Length8_A801],"0",
            [VA evt_Length_BinNo8_INT01])
      //
      // 將 binary 數字整理為 3 Bytes (24 bits)
      VA evt_BinNo_Length24_DSSP = concat([VA evt_BinNo_Length24_DSSP],
            [VA evt_BinNo_Length8_A801])
      //
      VA evt_Index_Char_INT01 = [VA evt_Index_Char_INT01]+1
   End While
   //
   VA evt_Index_BinNo6_INT01 = 1
   While VA evt_Index_BinNo6_INT01 is less than or equal to VA evt_Count_BinNo6_INT01
      // 取出 6 bits binary 數字 (重複 4 次)
      VA evt_BinNo_Length6_CFSTR8 = substr([VA evt_BinNo_Length24_DSSP],0,
            [VA evt_Length_BinNo6_INT01])
      VA evt_BinNo_Length24_DSSP = substr([VA evt_BinNo_Length24_DSSP],
            [VA evt_Length_BinNo6_INT01],24)
      //
      If VA evt_BinNo_Length6_CFSTR8 is not equal to <Blank>
            And VA evt_BinNo_Length6_CFSTR8 is not equal to <Null>
         // 將取出的 6 bits binary 數字轉回 10 進位數字
         // (Convert From Binary Number To Decimal Number : B46R0210)
         // 透過字元對照表取出對應加密字元
         VA evt_BinNo_Length6_CFSTR8 = rpad([VA evt_BinNo_Length6_CFSTR8],"0",
               [VA evt_Length_BinNo6_INT01])
         Convert From Binary Number To Decimal Number
         VA evt_Index_ConvertTable_MATH01 <- BF mnDecimalNumber
         VA evt_BinNo_Length6_CFSTR8 -> BF szBinaryNumber
         BF szOutputString = concat([BF szOutputString],
               substr([VA evt_Table_Conversion_URL],[VA evt_Index_ConvertTable_MATH01],1))
      Else
         // 取不到 6 bits binary 數字時, 直接回傳 '=' 字元
         BF szOutputString = concat([BF szOutputString],'=')
      End If
      //
      VA evt_Index_BinNo6_INT01 = [VA evt_Index_BinNo6_INT01]+1
   End While
End While


當中遇到的陷阱是:B46R0210 有 Bug
真是有點懶得再寫 Decode...

此 function 只適用於單位元組 (single byte)處理
所以無法處理中文
但可以先將中文轉為 Url Encoding 的格式, 再進行 Base64 Encode
這樣 Decode 後的字串還是能被網頁識別為中文

(Url Encoding 轉換 : w3schools.com)

2013年11月8日 星期五

JDE Parameterized URL

JDE Parameterized URL 一定要透過 Data Structure 傳遞參數
FormDSTmpl 傳遞 FI 編號
FormDSData 傳遞 FI 內容值
ex. P550001 有 3 個 FI
  1 KCOO
  2 DOCO
  3 DCTO
 今天只查 DOCO = 13000001 的資料
 => FormDSTmpl=|1|2|3|&FormDSData=||13000001||

完整模式 :
http://[ServerIP]:[ServerPort]/jde/HostedE1Servlet?OID=[ApplicationID]_[FormID]_[Version]&FormDSTmpl=[FI編號]&FormDSData=[FI內容值]
完整 URL :
http://192.168.1.153:82/jde/HostedE1Servlet?OID=P550001_W550001A&FormDSTmpl=|1|2|3|&FormDSData=||13000001||
 
環境要求 :
Tool Release : 8.96 - Service Pack E1 and Above
Application Release : 8.9 and Above
 
參考資料 :