2013年12月17日 星期二

C# Base64 Encode

常用到但不會去記的轉換語法
string PlainText = "abc";
string Base64Text = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(PlainText));
string DecryptedText = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(Base64Text));

C# 好棒的 String Reverse 方法

簡單幾行搞定...
  string str1 = "abcd";
  char[] caArray = str1.ToCharArray();
  Array.Reverse(caArray);            //將char array中的元素位置反轉
  string str2 = new string(caArray); //將反轉完的char array轉回字串

參考資料 :
[stackoverflow]

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
 
參考資料 :
 

2013年10月25日 星期五

ASP(vbscript) Querystring 判斷

記錄一下 ASP(vbscript) Querystring 的判斷結果
<%
   if IsEmpty(Request("a")) then
      ' http://localhost/TestQueryString.asp
      response.write "Empty"
   end if

   if IsNull(Request("a")) then
      response.write "Null"
   end if

   if Request("a") = "" then
      ' http://localhost/TestQueryString.asp
      ' http://localhost/TestQueryString.asp?a
      ' http://localhost/TestQueryString.asp?a=
      response.write "Blank"
   end if

   if IsNumeric(Request("a")) then
      ' http://localhost/TestQueryString.asp
      ' http://localhost/TestQueryString.asp?a=123
      ' http://localhost/TestQueryString.asp?a=-123
      ' http://localhost/TestQueryString.asp?a=0.123
      ' http://localhost/TestQueryString.asp?a=-0.123
      response.write "Numeric"
   end if

   if Request("a") is nothing then
      response.write "Nothing"
   end if
%>

2013年10月13日 星期日

JDE Business Function 令人無法想像的限制

最近撰寫 JDE 9.0 Business Function 遇到一個問題:

在 BF 中 Fetch Single 某個 Table
結果 SV File_IO_Status 一直 return CO Error
但是我確定該 Table 有符合的資料存在
相同的條件將 Fetch Single 寫在 P 程式中, 也一切正常 (CO Success)

最後才發現:
在 BF 使用 Fetch Single
一定要依序使用 Index Column

Ex. 
Table 有一組 Index, 依序為 : KCOO, DOCO, DCTO, LNID
在 BF 裡使用這組 Index 進行 Fetch Single, 可以有下列用法:
1. KCOO
2. KCOO + DOCO
3. KCOO + DOCO + DCTO
4. KCOO + DOCO + DCTO + LNID

但是, 如果你用 KCOO + DCTO, 就是死!

JDE 9.0 Grid 相關 System Function 測試

記錄最近測試 Grid 相關的 System Function 結果
以下皆為使用 Fat Client Windows Form 測試

// 無效, 不論 Row 怎麼傳, Grid Row 都不會變成 Selected
Change Row Selection(Grid[in], Row[in], Select State[in])

// 有效, Row 會回傳 Selected 的 Grid Row 筆數
Get Selected Grid Row Count(Grid, Row)

// 有效, Row 會回傳第 1 個 Selected 的 Grid Row Number
// Multiple Select Grid 也只會回傳第 1 個 Selected 的 Grid Row Number
Get Selected Grid Row Number(Grid, Row)

// 無效, 不論 Start Row 怎麼傳, Row 永遠回傳 0
Get Next Selected Row(Grid[in], Start Row[in], Row[out])


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

2013年8月19日 星期一

Microsoft Chart Controls 放上 Server 無法顯示圖表

最近在測 Microsoft Chart Controls
在本機測都很正常
一放上 Web Server, 圖表就無法顯示出來

這邊記錄一下解決方法:
 1.設定 Chart Control 的 ImageLocation 屬性 (路徑+檔名 [不含副檔名])
 2.修改 Chart Control 的 ImageStorageMode 屬性為 "UseImageLocation"


以圖為例
./TempImages/temp
就是將圖檔暫存在網站下的TempImages資料夾中
暫存的圖檔檔名為temp, 副檔名就看 Microsoft Chart Controls 設定的檔案格式 (.png / .jpg)
副檔名就看 ImageType 屬性的設定

當使用 UseImageLocation 方式後
會在暫存資料夾中保留圖片
如果不想在 Web Server 上保留圖片的話
需要自行撰寫刪除檔案程式段

Microsoft Chart Controls for Microsoft .NET Framework 3.5 範例

最近在測 Microsoft Chart Controls
所以在這邊記錄一下測過的東東

.aspx
<asp:Chart ID="Chart1" runat="server" Height="500px" Width="1000">
</asp:Chart>
.cs
using System.Web.UI.DataVisualization.Charting;

List<string> XLabels = new List<string>();
List<double> YValues = new List<double>();

XLabels.Add("2013/08/01");
XLabels.Add("2013/08/08");
XLabels.Add("2013/08/15");
YValues.Add(21030.0);
YValues.Add(45121.0);
YValues.Add(45481.0);

Chart1.ChartAreas.Add(new ChartArea());
//繪圖區背景顏色
Chart1.ChartAreas[0].BackColor = System.Drawing.Color.LightGreen;  
//圖表名稱
Chart1.Titles.Add("測試圖表");
//X軸說明
Chart1.ChartAreas[0].AxisX.Title = "日期";  
//X軸各數點間區塊隔行變色
Chart1.ChartAreas[0].AxisX.IsInterlaced = true;  
//X軸邊界不留空格
Chart1.ChartAreas[0].AxisX.IsMarginVisible = false;
//X軸刻度(控制X軸最多10個刻度)
Chart1.ChartAreas[0].AxisX.Interval = Math.Ceiling(XLabels.Count / 10.0);
//Y軸說明
Chart1.ChartAreas[0].AxisY.Title = "金額";  
//Y軸刻度  
Chart1.ChartAreas[0].AxisY.Interval = 10000;
//Y軸刻度加上千分位
Chart1.ChartAreas[0].AxisY.LabelStyle.Format = "#,##0";

//增加圖示
Chart1.Legends.Add(new Legend());
//圖示位置(上方)
Chart1.Legends[0].Docking = Docking.Top;
//圖示位置(中間)
Chart1.Legends[0].Alignment = System.Drawing.StringAlignment.Center;  

//數線名稱(會顯示在圖示中)
Chart1.Series.Add("每週變化");
//數線顏色
Chart1.Series[0].Color = System.Drawing.Color.Red;
//數線類型  
Chart1.Series[0].ChartType = SeriesChartType.Line;
//數線寬度
Chart1.Series[0].BorderWidth = 3;  

//數點形狀
Chart1.Series[0].MarkerStyle = MarkerStyle.Circle;
//數點大小
Chart1.Series[0].MarkerSize = 12;  
//數點顏色
Chart1.Series[0].MarkerColor = System.Drawing.Color.Red;
//在數點上顯示Y軸值
Chart1.Series[0].IsValueShownAsLabel = true;

//數點說明文字顏色
Chart1.Series[0].LabelForeColor = System.Drawing.Color.Blue;
//數點說明背景顏色
Chart1.Series[0].LabelBackColor = System.Drawing.Color.Yellow;
//數點說明加上千分位
Chart1.Series[0].LabelFormat = "#,##0";

//繫結XY座標值-方法1
Chart1.Series[0].Points.DataBindXY(XLabels, YValues);

/* 繫結XY座標值-方法2
for (int k = 0; k < XLabels.Count; k++)
{
   DataPoint newDP = new DataPoint(k, YValues[k]);
   newDP.AxisLabel = XLabels[k];
   Chart1.Series[0].Points.Add(newDP);
}
*/


2013年7月18日 星期四

JDE 程式開發新發現

將自己新發現的一些東東記錄於此
測試環境: JDE 9.0

1)
R程式各Section中, 每種Level-Break條件只能建立1個Level-Break Footer, 如果超過 1個, 僅有其中 1個Level-Break Footer能正常顯示
(Level-Break條件意指: Level-Break的欄位組合; 推測Level-Break Header相同)

2)
Business View可以 Join 5個 tables

3)
R程式的Vocabulary Override存在F98760

ASP.NET 透過 Microsoft.Office.Interop.Excel 開啟 Excel 的權限設定

這幾天用 ASP.NET 透過 Microsoft.Office.Interop.Excel 開啟 Excel
一直遇到問題
所以在這邊稍微整理一下

1.設定元件服務 > Microsoft Excel Application


2.安全性 > 啟動和啟用權限
要加入IIS 帳號能夠本機啟動/遠端啟動/本機啟用/遠端啟用


3.安全性 > 存取權限
要加入IIS 帳號能夠本機存取


4.識別身分
要設定為互動式使用者


如果都不設定,會出「具有 CLSID {00024500-0000-0000-C000-000000000046} 的元件擷取 COM Class Factory 失敗: 80070005。」錯誤

只設定2,會出「Microsoft Office Excel 無法存取檔案 'xxxxx.xls'。可能原因如下: ‧檔案的名稱或路徑不存在。 ‧這個檔案正被其他程式所使用中。 ‧您要儲存的活頁簿名稱與現有開啟的活頁簿名稱相同。」錯誤

只設定3,會出「具有 CLSID {00024500-0000-0000-C000-000000000046} 的元件擷取 COM Class Factory 失敗: 80070005。」錯誤

只設定4,會出「具有 CLSID {00024500-0000-0000-C000-000000000046} 的元件擷取 COM Class Factory 失敗: 80070005。」錯誤

只設定23,會出「Microsoft Office Excel 無法存取檔案 'xxxxx.xls'。可能原因如下: ‧檔案的名稱或路徑不存在。 ‧這個檔案正被其他程式所使用中。 ‧您要儲存的活頁簿名稱與現有開啟的活頁簿名稱相同。」錯誤

只設定24,會出「具有 CLSID {00024500-0000-0000-C000-000000000046} 的元件擷取 COM Class Factory 失敗: 80070005。」錯誤

只設定34,會出「具有 CLSID {00024500-0000-0000-C000-000000000046} 的元件擷取 COM Class Factory 失敗: 80070005。」錯誤

P.S.如果是在Web Server上測試
上述Microsoft Office Excel 無法存取檔案... 錯誤可能會替換為:
伺服器丟出一個例外。(發生例外狀況於HRESULT: 0x80010105(RPC_E_SERVERFAULT))

IIS 帳號 :
IIS6 = Network Service
IIS7.5 = IIS APPPOOL\應用程式集區名稱

我的測試環境:
Windows7, IIS7.5, Office2007

參考資料:
1.職人大-[ASP.net/MSSQL] 讀寫Office Excel之前要做的相關設定
2.保哥-介紹 IIS 7.5 的應用程式集區與新增的「虛擬帳戶」特性

2013年7月17日 星期三

JDE R程式呼叫 X00022 取號失敗

今天 Copy 一支 R 程式出來修改
結果在執行時發現 X00022 居然沒有取到號
才發現到問題在 R 程式的屬性(Update Report / No Update Report)
如果設定為 No Update Report, 所有Insert/Update/Delete動作都會失效

Copy 出來的 R 程式預設是 No Update Report


如果在 Copy 沒修改, R 程式就是 No Update Report (Read Only)


此時就只能下 SQL Update R 程式屬性
   --版本9.0
   --OMIT : 0=Update Report / 1=No Update Report
   UPDATE OL900.F9860 SET SIOMIT = '0' WHERE SIOBNM = 'RXXXXXXX';


2013年7月3日 星期三

NPOI 2.0 簡易用法

記錄一下 NPOI 2.0 的一些使用筆記

   //建立 Workbook
   NPOI.HSSF.UserModel.HSSFWorkbook wb = new NPOI.HSSF.UserModel.HSSFWorkbook();

   //建立 MemoryStream
   System.IO.MemoryStream ms = new System.IO.MemoryStream();

   //建立一個叫做"Sheet1"的 Sheet
   NPOI.HSSF.UserModel.HSSFSheet st = (NPOI.HSSF.UserModel.HSSFSheet)wb.CreateSheet("Sheet1");

   //產生第一列 (第一列:0, 第二列:1, ...類推)
   NPOI.HSSF.UserModel.HSSFRow r1 = (NPOI.HSSF.UserModel.HSSFRow)st.CreateRow(0);

   //建立第一列的儲存格格式
   NPOI.SS.UserModel.ICellStyle cs1 = wb.CreateCellStyle();

   //設定背景色為黑色
   cs1.FillPattern = NPOI.SS.UserModel.FillPatternType.SOLID_FOREGROUND;
   cs1.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.BLACK.index;

   //字型為粗體白字
   NPOI.SS.UserModel.IFont fWhiteBold = wb.CreateFont();
   fWhiteBold.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.BOLD;
   fWhiteBold.Color = NPOI.HSSF.Util.HSSFColor.WHITE.index;
   cs1.SetFont(fWhiteBold);

   //建立第一列的第一格 (A1, 第一格:0, 第二格:1, ...類推)
   NPOI.HSSF.UserModel.HSSFCell c1 = (NPOI.HSSF.UserModel.HSSFCell)r1.CreateCell(0);

   //設定A1儲存格格式及內容值
   c1.CellStyle = cs1;
   c1.SetCellValue("Title");

   //產生第二列
   NPOI.HSSF.UserModel.HSSFRow r2 = (NPOI.HSSF.UserModel.HSSFRow)st.CreateRow(1);

   //建立第二列的儲存格格式
   NPOI.SS.UserModel.ICellStyle cs2 = wb.CreateCellStyle();

   //設定背景色為近似#99FF33 (依NPOI內建顏色為主)
   System.Drawing.Color SysColor = System.Drawing.Color.FromArgb(153, 255, 51);
   NPOI.HSSF.UserModel.HSSFPalette NPOIPalette = wb.GetCustomPalette();
   NPOI.HSSF.Util.HSSFColor NPOIColor = NPOIPalette.FindSimilarColor(SysColor.R, SysColor.G, SysColor.B);
   cs2.FillPattern = NPOI.SS.UserModel.FillPatternType.SOLID_FOREGROUND;
   cs2.FillForegroundColor = NPOIColor.GetIndex();

   //建立第二列的第一格 (A2)
   NPOI.HSSF.UserModel.HSSFCell c2 = (NPOI.HSSF.UserModel.HSSFCell)r2.CreateCell(0);

   //設定A2儲存格格式及內容值
   c2.CellStyle = cs2;
   c2.SetCellValue("abcdefgh");

   //寫入 Memory
   wb.Write(ms);

   //設定預設檔名
   Response.AddHeader("Content-Disposition", "Book1.xls");

   //傳送到 Client
   Response.BinaryWrite(ms.ToArray());

   //關閉 Workbook
   wb = null;

   //關閉 Memory
   ms.Close();
   ms.Dispose();

補充 : 在建立儲存格時, 可以定義儲存格的數值格式
   using NPOI.HSSF.UserModel;
   HSSFCell c3 = (HSSFCell)r2.CreateCell(1, NPOI.SS.UserModel.CellType.NUMERIC);

NPOI.SS.UserModel.CellType 有下列格式 :
  BLANK / BOOLEAN / ERROR / FORMULA / NUMERIC / STRING / Unknown

如何改變DataTable內的資料排序

記錄一下如何改變DataTable內的資料排序

1.使用DataTable.DefaultView.Sort排序
 只有在讀取DataTable.DefaultView時, 才會有排序的效果
   DataTable dt1 = new DataTable();

   /*
      填入dt1資料
   */

   dt1.DefaultView.Sort([Sort]);

2.使用DataTable.Select排序, 再將排序好的資料Import到另一個DataTable
 直接讀取第2個DataTable(dt3)時, 就會有排序的效果
   DataTable dt2 = new DataTable();
   DataTable dt3 = new DataTable();

   /*
      填入dt2資料
   */

   //將dt2資料結構複製給dt3
   dt3 = dt2.Clone();
   foreach DataRow dr in dt2.Select([Filter],[Sort])
   {
      dt3.ImportRow(dr);
   }
   dt2.Clear();

[Filter] : 直接撰寫SQL Where條件, ex. " COLA = 'A' AND COLB = 'B' "
[Sort] : 直接選寫Order By內容, ex. " COLA,COLB,COLC DESC "

2013年3月31日 星期日

JDE 程式相關的標準工具程式

在這邊記錄一下

Object IDDescription
P98306設定Process Option的Vocabulary Overrides
R98306列印各程式版本的Process Option內容值
P93081設定User/Group/Object的編碼(Encoding)

JDE Vocabulary Overrides Locked

之前遇到一個無法 Check-Out P程式的情況
原因是因為 P程式的 Vocabulary Overrides 被 lock 住

此時 F9861 裡應該會有一筆這支 P程式的資料
(F9861.STCE = 5 : In Use by Vocabulary Overrides)
將這筆資料 delete 後
就可以正常 Check-Out

2013年3月25日 星期一

JDE DREAM Writer 版本與目前存在的不符

最近在 JDE 9.0 遇到P程式發生"DREAM Writer 版本與目前存在的不符"問題
(This Dream Writer Version does not currently exist)
發現是P程式(A)又呼叫P程式(B),而且是以P程式(A)的版本呼叫P程式(B)
所以P程式(B)也要建立一個和P程式(A)同名的版本,才能運作正常

在這邊記錄一下
Parent appChild appDescription
P0411P75T003P0411呼叫P75T004產生GUI/VAT時
P4314P75T003P0411呼叫P4314進行Voucher Match時
P75T0411P75T003P75T0411執行Row>GUI/VAT Entry