string PlainText = "abc"; string Base64Text = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(PlainText)); string DecryptedText = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(Base64Text));
2013年12月17日 星期二
C# Base64 Encode
常用到但不會去記的轉換語法
C# 好棒的 String Reverse 方法
簡單幾行搞定...
參考資料 :
[stackoverflow]
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
當中遇到的陷阱是:B46R0210 有 Bug
真是有點懶得再寫 Decode...
此 function 只適用於單位元組 (single byte)處理
所以無法處理中文
但可以先將中文轉為 Url Encoding 的格式, 再進行 Base64 Encode
這樣 Decode 後的字串還是能被網頁識別為中文
(Url Encoding 轉換 : w3schools.com)
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
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
%>
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, 就是死!
在 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 測試
以下皆為使用 Fat Client Windows Form 測試
// 無效, 不論 Row 怎麼傳, Grid Row 都不會變成 Selected
Change Row Selection(Grid[in], Row[in], Select State[in])
Change Row Selection(Grid[in], Row[in], Select State[in])
// 有效, Row 會回傳 Selected 的 Grid Row 筆數
Get Selected Grid Row Count(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)
// 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])
Get Next Selected Row(Grid[in], Start Row[in], Row[out])
2013年9月17日 星期二
JDE Split 應用
記錄一下 JDE 如何應用 Split 截字串的方法
以下為 Message Section 的輸出
// 設定來源字串(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
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 的方式處理
在前輩高手提供的解法中又學到了另一種方式
在 Oracle 10g 之後(9i 不確定有沒有)
PL/SQL 的 In Condition 有一種應用:
WHERE (expr1,expr2,...) IN (Sub-Query)
所以上例可以如此處理
效率有沒有比較好,還不確定,但能發現自己想到的解法外的新方法,還是滿有趣的
詳細文件 :
Oracle 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
)
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
)
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
)
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 上保留圖片的話
需要自行撰寫刪除檔案程式段
在本機測都很正常
一放上 Web Server, 圖表就無法顯示出來
這邊記錄一下解決方法:
1.設定 Chart Control 的 ImageLocation 屬性 (路徑+檔名 [不含副檔名])
2.修改 Chart Control 的 ImageStorageMode 屬性為 "UseImageLocation"
以圖為例
./TempImages/temp
就是將圖檔暫存在網站下的TempImages資料夾中
暫存的圖檔檔名為temp,
副檔名就看 ImageType 屬性的設定
當使用 UseImageLocation 方式後
會在暫存資料夾中保留圖片
如果不想在 Web Server 上保留圖片的話
需要自行撰寫刪除檔案程式段
Microsoft Chart Controls for Microsoft .NET Framework 3.5 範例
最近在測 Microsoft Chart Controls
所以在這邊記錄一下測過的東東
.aspx
.cs
所以在這邊記錄一下測過的東東
.aspx
<asp:Chart ID="Chart1" runat="server" Height="500px" Width="1000"> </asp:Chart>
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中
測試環境: 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。」錯誤
只設定2和3,會出「Microsoft Office Excel 無法存取檔案 'xxxxx.xls'。可能原因如下: ‧檔案的名稱或路徑不存在。 ‧這個檔案正被其他程式所使用中。 ‧您要儲存的活頁簿名稱與現有開啟的活頁簿名稱相同。」錯誤
只設定2和4,會出「具有 CLSID {00024500-0000-0000-C000-000000000046} 的元件擷取 COM Class Factory 失敗: 80070005。」錯誤
只設定3和4,會出「具有 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 的應用程式集區與新增的「虛擬帳戶」特性
一直遇到問題
所以在這邊稍微整理一下
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。」錯誤
只設定2和3,會出「Microsoft Office Excel 無法存取檔案 'xxxxx.xls'。可能原因如下: ‧檔案的名稱或路徑不存在。 ‧這個檔案正被其他程式所使用中。 ‧您要儲存的活頁簿名稱與現有開啟的活頁簿名稱相同。」錯誤
只設定2和4,會出「具有 CLSID {00024500-0000-0000-C000-000000000046} 的元件擷取 COM Class Factory 失敗: 80070005。」錯誤
只設定3和4,會出「具有 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 程式屬性
結果在執行時發現 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';
--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 的一些使用筆記
補充 : 在建立儲存格時, 可以定義儲存格的數值格式
NPOI.SS.UserModel.CellType 有下列格式 :
BLANK / BOOLEAN / ERROR / FORMULA / NUMERIC / STRING / Unknown
//建立 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();
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);
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時, 才會有排序的效果
2.使用DataTable.Select排序, 再將排序好的資料Import到另一個DataTable
直接讀取第2個DataTable(dt3)時, 就會有排序的效果
[Filter] : 直接撰寫SQL Where條件, ex. " COLA = 'A' AND COLB = 'B' "
[Sort] : 直接選寫Order By內容, ex. " COLA,COLB,COLC DESC "
1.使用DataTable.DefaultView.Sort排序
只有在讀取DataTable.DefaultView時, 才會有排序的效果
DataTable dt1 = new DataTable();
/*
填入dt1資料
*/
dt1.DefaultView.Sort([Sort]);
/*
填入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();
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 ID | Description |
---|---|
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
原因是因為 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)同名的版本,才能運作正常
在這邊記錄一下
(This Dream Writer Version does not currently exist)
發現是P程式(A)又呼叫P程式(B),而且是以P程式(A)的版本呼叫P程式(B)
所以P程式(B)也要建立一個和P程式(A)同名的版本,才能運作正常
在這邊記錄一下
Parent app | Child app | Description |
---|---|---|
P0411 | P75T003 | P0411呼叫P75T004產生GUI/VAT時 |
P4314 | P75T003 | P0411呼叫P4314進行Voucher Match時 |
P75T0411 | P75T003 | P75T0411執行Row>GUI/VAT Entry |
訂閱:
文章 (Atom)