在Delphi7中以ADO元件存取ACCESS的"日期/時間"欄位 |
|
NO.5
初階會員 發表:18 回覆:35 積分:25 註冊:2005-02-23 發送簡訊給我 |
請教各位先進:
在參考下面兩篇文章後:
http://delphi.ktop.com.tw/topic.php?topic_id=47414
http://delphi.ktop.com.tw/topic.php?topic_id=30968
對於存取"日期/時間"欄位感到非常頭疼.
按照參考文章第一篇,修改為新增或更新含有"日期/時間"欄位的Record,程式碼如下:
procedure TFORM2.FormCreate(Sender: TObject); begin WITH FORM1.U_TAB1 DO BEGIN SQL.Add('UPDATE LAB1'); SQL.Add(' SET OP_RT = :RT,'); SQL.Add(' OP_USER =:USER,'); SQL.Add(' OP_DATE = :DATE'); SQL.Add(' WHERE ORDER_KIND = :ORD_KD'); END; end; PROCEDURE TFORM2.EXECUTE_SQL; BEGIN WITH FORM1.U_TAB1 DO BEGIN Close; Parameters.ParamByName('RT').Value := SYS_ROLE_CD; Parameters.ParamByName('USER').Value := SYS_USER_ID; Parameters.ParamByName('DATE').Value := FormatDateTime('YYYY-M-D AMPM H:M:S',NOW); Parameters.ParamByName('ORD_KD').Value := WK_ORD_KD; ExecSQL; END; END;以上的程式碼若改為下面的方式(紅色為相異處): procedure TFORM1.FormCreate(Sender: TObject); begin WITH U_TAB1 DO BEGIN SQL.Add('UPDATE LAB1'); SQL.Add(' SET OP_RT = :RT,'); SQL.Add(' OP_USER =:USER,'); SQL.Add(' OP_DATE = :DATE'); SQL.Add(' WHERE ORDER_KIND = :ORD_KD'); Parameters.AddParameter.Name := 'RT'; Parameters.AddParameter.Name := 'USER'; Parameters.AddParameter.Name := 'DATE'; Parameters.AddParameter.Name := 'ORD_KD'; Parameters.ParamByName('RT').DataType := ftString; Parameters.ParamByName('USER').DataType := ftString; Parameters.ParamByName('DATE').DataType := ftDateTime; Parameters.ParamByName('ORD_KD').DataType := ftString; END; end; PROCEDURE TFORM2.EXECUTE_SQL; BEGIN WITH FORM1.U_TAB1 DO BEGIN Close; Parameters.ParamByName('RT').Value := SYS_ROLE_CD; Parameters.ParamByName('USER').Value := SYS_USER_ID; Parameters.ParamByName('DATE').Value := FormatDateTime('YYYY-M-D AMPM H:M:S',NOW); Parameters.ParamByName('ORD_KD').Value := WK_ORD_KD; ExecSQL; END; END;小弟有幾個問題請教: Q1:上方兩組程式碼差別僅為,一組其宣告與執行皆在同一個FORM之中,另一組其宣告與執行在不同FORM之中,但第二組卻必須增加中間紅色部分的程式碼,編譯後才能正常執行,與BDE元件相當不同,請問這是ADO元件特有的用法嗎? Q2:兩組程式碼皆會將系統時間寫入資料庫,第一組寫入的內容是正常的完整時間(YYYY/MM/DD X午 HH:MI:SS),但第二組寫入的卻只有日期(YYYY/MM/DD),請問為何? Q3:若要在SQL COMMAND中直接進行DateTime計算,如下方的程式碼: 1. SQL.Add('SELECT :DATE - CREATE_DATE AS LAS_DATE FROM LAB2');或 2. SQL.Add('SELECT * FROM LAB2 WHERE :DATE - CREATE_DATE > 20/1440');第一組的內容已寫入ADO元件的SQL屬性中,欲顯示在DBGRID,但當要編輯DBGRID的TITLE內容時(顯示為中文FieldName),無法將該Query元件Active,當然也無法編輯,應該如何處理呢? 第一組與第二組共同的問題是,能否直接在SQL COMMAND取得系統時間,而不須藉由:DATE變數傳入? Q4:承上,有兩個DateTime欄位DATE1與DATE2,DATE1一定有值,但DATE2卻不一定,在Oracle中可以NVL(DATE2,SYSDATE) - DATE1計算時間的差,請問在ACCESS中要改為怎樣的寫法?(程式碼的意義為,若DATE2有值,就直接計算與DATE1的差值;若DATE2無值,就計算目前系統時間與DATE1的差值) |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
Hi, 請修改你的文章為發問而非發表. A1, 原則上若是你的 TADOQuery有設定 Connection 時, 可以不需要去 AddParameter 應該就可以直接取用, 如
WITH U_TAB1 DO BEGIN SQL.Clear; // 先清除 SQL.Add('UPDATE LAB1'); SQL.Add(' SET OP_RT = :RT,'); SQL.Add(' OP_USER =:USER,'); SQL.Add(' OP_DATE = :DATE'); SQL.Add(' WHERE ORDER_KIND = :ORD_KD'); Parameters.ParamByName('RT').DataType := ftString; Parameters.ParamByName('USER').DataType := ftString; Parameters.ParamByName('DATE').DataType := ftDateTime; Parameters.ParamByName('ORD_KD').DataType := ftString; END;A2. 已設定 DATE 參數為 ftDateTime , 則賦值時, 直接給 Now 即可, 無需再轉型為 string, 如 WITH FORM1.U_TAB1 DO BEGIN Close; Parameters.ParamByName('RT').Value := SYS_ROLE_CD; Parameters.ParamByName('USER').Value := SYS_USER_ID; Parameters.ParamByName('DATE').Value := NOW; Parameters.ParamByName('ORD_KD').Value := WK_ORD_KD; ExecSQL; END;Q3 的部分, 弟實測是沒有不能 active 的狀況, 請問錯誤訊息為何? 另, 要取得系統時間, 可以利用 now 即可, 如 SQL.Add('SELECT * FROM LAB2 WHERE now - CREATE_DATE > 20/1440'); Q4, 在 access 中要使用判斷 null 的重給值方式為 iif(isnull(xx), true_value, false_value), 所以可以這麼寫, iif(isnull(DATE2), NOW, DATE2) - DATE1 |
NO.5
初階會員 發表:18 回覆:35 積分:25 註冊:2005-02-23 發送簡訊給我 |
感謝timhuang撥空回覆: 1.已修改回【問題】,應該是游標還未離開選項時動到了滑鼠滾輪所致,抱歉. 2.我的TADOQuery是利用TADOConnection與DB連接的,首先貼上弟的測試程式碼(有點複雜喔!)
procedure TForm1.FormCreate(Sender: TObject); begin WITH ADOQuery1 DO BEGIN Close; SQL.Clear; SQL.Add('UPDATE LAB1'); SQL.Add(' SET OP_RT = :RT,'); SQL.Add(' OP_USER =:USER,'); SQL.Add(' OP_DATE = :DATE'); SQL.Add(' WHERE ORD_KD = :ORD_KD'); Parameters.ParamByName('RT').DataType := ftString; Parameters.ParamByName('USER').DataType := ftString; Parameters.ParamByName('DATE').DataType := ftDateTime; Parameters.ParamByName('ORD_KD').DataType := ftString; END; end; procedure TForm1.Button1Click(Sender: TObject); begin WITH ADOQuery1 DO BEGIN Close; Parameters.ParamByName('RT').Value := 'AA'; Parameters.ParamByName('USER').Value := 'BB'; Parameters.ParamByName('DATE').Value := NOW; Parameters.ParamByName('DATE').Value := FormatDateTime('YYYY-M-D AMPM H:M:S',NOW); Parameters.ParamByName('ORD_KD').Value := 'CC'; ExecSQL; END; end;因為Query元件是尚未被使用的,所以綠色的部分弟認為不加亦無妨,對實驗結果亦無影響. 再來是紅色部分的影響,再有這段Code的情況下,無論是使用桔色或紫色的Code(此二Code不會同時"有效")將時間傳入,得到的結果皆如圖一;若無這段Code,使用桔色Code可得到的結果如圖一,但紫色Code可得到的結果如圖二: TABLE設定: 圖一: 圖二: 如果捨棄從外部傳入,直接使用SQL.Add(' OP_DATE = NOW')也可以得到如圖二的結果,這也是弟原本Q2的問題. 弟原本Q1要請教的是當procedure TForm1.FormCreate寫在FORM1,而procedure TForm1.Button1Click卻寫在FORM2,當FORM2 USES FORM1且紅色的Code沒有寫時,可以通過編譯的檢查,但執行時會出現錯誤:有寫紅色的Code就沒問題(經弟測試,因為Code的"量"相差許多,本程式並不會發生此問題,但對於使用了15個Query元件的原本程式就會發生問題),請問這是為何?(這個問題好像怪怪的.....) |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |