全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:981
推到 Plurk!
推到 Facebook!

使用UpdateSQL元件時,如何將外部輸入值傳給SQL敘述(Oracle 9i)中的變數!?

答題得分者是:Fishman
NO.5
初階會員


發表:18
回覆:35
積分:25
註冊:2005-02-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-25 13:57:42 IP:210.64.xxx.xxx 未訂閱
請問各位先進: 弟以"UPDATESQL"搜尋相關文章,有關如何將外部輸入值傳入SQL敘述的變數中,請海涵因程度不足實在無法找出想要的知識,目前使用一個TQuery元件取得Table的資料,但因為需要使用"Order By",所以如果要編輯欄位,依照先進的建議使用UpdateSQL元件,但因為輸入值尚須經過其他處理(檢查,代出其他欄位值...),所以在Grid元件之外,另開Edit元件欄位提供輸入的功能,但不清楚如何將Edit元件欄位的值傳入變數中,以達成將資料新增進DB的目的. TQuery元件的SQL敘述: WITH DM1.QRY DO BEGIN Close; SQL.Clear; SQL.Add('SELECT TIER, SEQ, NEW_MARK,'); SQL.Add(' TO_CHAR(UPD_DATE,''YYYYMMDD HH24:MI''),'); SQL.Add(' REASON_CODE,REASON_DESP,OLD_CNTR_PF,'); SQL.Add(' OLD_CNTR_NO,NEW_CNTR_PF,NEW_CNTR_NO,'); SQL.Add(' UPD_USER, PDA_USER, ORDER_KIND,'); SQL.Add(' ORDER_NO'); SQL.Add(' FROM LOCDT'); SQL.Add(' WHERE SECTION = :SECTION'); SQL.Add(' AND BAY = :BAY'); SQL.Add(' AND L_ROW = :L_ROW'); SQL.Add(' AND (:NEW_MARK IS NULL OR'); SQL.Add(' NEW_MARK = :NEW_MARK)'); SQL.Add(' AND (:UPD_DATE IS NULL OR'); SQL.Add(' TO_CHAR(UPD_DATE,''YYMMDD HH24:MI'') = :UPD_DATE)'); SQL.Add(' ORDER BY UPD_DATE DESC'); IF Prepared = FALSE THEN Prepare; ParamByName('SECTION').AsString := SECTION.Text; ParamByName('BAY').AsString := BAY.Text; ParamByName('L_ROW').AsString := L_ROW.Text; IF NEW.Checked = TRUE THEN ParamByName('NEW_MARK').AsString := 'Y' ELSE ParamByName('NEW_MARK').AsString := ''; IF UPD_DATE.Text <> '' THEN ParamByName('UPD_DATE').AsString := UPD_DATE.Text ELSE ParamByName('UPD_DATE').AsString := ''; Open; END; PS. RequestLive屬性一值保持"False",CachedUpdate屬性一值保持"True". UpdateSQL元件的SQL敘述: WITH DM1.UPD_QRY DO BEGIN InsertSQL.Add('INSERT INTO LOCDT(SECTION, BAY, L_ROW,'); InsertSQL.Add(' TIER, SEQ, NEW_MARK,'); InsertSQL.Add(' UPD_DATE, UPD_USER, PDA_USER,'); InsertSQL.Add(' REASON_CODE,REASON_DESP,OLD_CNTR_PF,'); InsertSQL.Add(' OLD_CNTR_NO,NEW_CNTR_PF,NEW_CNTR_NO,'); InsertSQL.Add(' ORDER_KIND, ORDER_NO'); InsertSQL.Add(' VALUES(:SECTION, :BAY, :L_ROW,'); InsertSQL.Add(' :TIER, :SEQ, ''Y'','); InsertSQL.Add(' SYSDATE, SYS_USER_NM,:PDA,'); InsertSQL.Add(' :RES_CD, :RES_DESP, :O_PF,'); InsertSQL.Add(' :O_NO, :N_PF, :N_NO,'); InsertSQL.Add(' :ORD_KD, :ORD_NO'); END; PS. INSERT的值幾乎都來自使用者輸入. 弟想請教各位先進,假如現在有一個Edit元件"SECTION",其值為'A', 1.如何將值'A'傳入變數":SECTION"中? 2.如果寫回DB時,同時要更改其他Table的資料,可以類似批次執行一樣,一同寫在同一個SQL敘述中嗎? 3.如果還有其他需要注意的,請不吝指教,謝謝. PS. "空白"都不見了.
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-25 14:50:07 IP:210.65.xxx.xxx 未訂閱
Hi NO.5,    1.TQuery 之 UpdateObject 設為此 TUpdateSQL    2.設定此 TUpdateSQL 之 DeleteSQL、InsertSQL、ModifySQL 屬性(寫法可參考其相關的 Help)    3.直接對 TQuery 中的值進行修改,及 Post,系統會自行呼叫在 TUpdateSQL 的相關語法對資料庫進行新增、刪除、修改動作。    
procedure TForm1.Button1Click(Sender: TObject);
begin
  Query1.Append; //新增,若是修改 Qurty1.Edit;
  Query1.FieldByName('SECTION').AsString := SECTION.Text;
  ...
  Query1.Post;
end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
NO.5
初階會員


發表:18
回覆:35
積分:25
註冊:2005-02-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-25 18:47:43 IP:210.64.xxx.xxx 未訂閱
經過測試之後此方法可行,感謝FISHMAN. 根據之前張貼的CODE,有部分需要修改: 1.最後執行"POST"的部分,要改為"ApplyUpdates". 2.在BDE ADMINISTRATOR中,資料庫的SQLPASSTHRU MODE屬性需改為"SHARED AUTOCOMMIT" (我之前是設為"SHARED NOAUTOCOMMIT",依照上面的寫法無法即時寫入資料庫, 另外用SQL PLUS查詢不到新增的資料,需要關閉編譯的目標程式才能查詢得到). 3.因為新增的不只變數,還有包含常數'Y',和系統時間(SYSDATE),新增之後的確可以在Grid上, 看到新增一筆RECORD,但該欄位所顯示的值是空的,需要從資料庫重新擷取,試過"Refresh", 及"QRY.DataSource.DataSet.Refresh"都會發生錯誤,最後只好乖乖的用"CLOSE"及"OPEN"才能正確顯示.
系統時間:2024-07-02 3:07:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!