使用UpdateSQL元件時,如何將外部輸入值傳給SQL敘述(Oracle 9i)中的變數!? |
答題得分者是:Fishman
|
NO.5
初階會員 發表:18 回覆:35 積分:25 註冊:2005-02-23 發送簡訊給我 |
請問各位先進:
弟以"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 發送簡訊給我 |
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 發送簡訊給我 |
經過測試之後此方法可行,感謝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"才能正確顯示.
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |