線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1161
推到 Plurk!
推到 Facebook!

SQL 疑問....

答題得分者是:Justmade
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-23 14:41:41 IP:218.165.xxx.xxx 未訂閱
當執行"借"、"還"、"還了再借"都沒問題,就是不能"先借再還",若先執行借再執行還,會出現: 'adoquery1:cannot perform this operation on a closed dataset' 若是加上紅字的部份則出現: 物件或提供者無法執行要求的操作 請問問題出在那?我要怎麼做才能讓"先借再還"這順序的操作也能執行?    
procedure tform4.borrow_book(Sender: TObject); //借書程式
var
   blist: string;
begin
   with datamodule3 do
      begin
         adoquery1.SQL.Clear;
         adoquery1.SQL.add('insert into 借閱記錄(姓名,學號,書名,借閱日期) values (:v1,:v2,:v3,:v4)');
         adoquery1.Parameters.ParamByName('v1').Value := adoquery3.fieldbyname('姓名').Value;
         adoquery1.Parameters.ParamByName('v2').Value := adoquery3.fieldbyname('學號').Value;
         adoquery1.Parameters.ParamByName('v3').Value := adoquery2.fieldbyname('書名').value;
         adoquery1.Parameters.ParamByName('v4').Value := AnsiReplaceText(FormatDateTime('yyyy,mm,dd', now), ',', '/')  timetostr(time) ;
         AdoQuery1.ExecSQL; //新增借閱記錄
      end;
   blist := datetostr(date)   '__'   datamodule3.ADOQuery2.fieldbyname('書名').Value;
   with datamodule3 do
      begin
         ADOQuery3.Edit;
         ADOQuery3.FieldByName('最後租書日').Value :=  strtodate(AnsiReplaceText(FormatDateTime('yyyy,mm,dd', now), ',', '/'))  time;
         ADOQuery3.FieldByName('剩餘可借數量').Value := ADOQuery3.FieldByName('剩餘可借數量').Value - 1;
         adoquery3.Post;
         Adoquery2.Edit;
         Adoquery2.FieldByName('庫存').value := strtoint(adoquery2.FieldByName('庫存').value) - 1;
         adoquery2.Post;
      end;
   listbox1.Items.Append(blist);
end;    procedure tform4.send_book(Sender: TObject); //還書程式
var blist: string;
    daycount: integer; //逾期天數
begin
   with datamodule3 do
      begin
         //adoquery1.active:=true;
         ADOQuery1.edit;
         adoquery1.FieldByName('歸還日期').value := AnsiReplaceText(FormatDateTime('yyyy,mm,dd', now), ',', '/')  timetostr(time);
         adoquery1.FieldByName('還書情形').Value := true;
         daycount := now - ADOQuery1.fieldbyname('借閱日期').Value;
         adoquery1.FieldByName('逾期天數').Value := daycount;
         Adoquery2.Edit;
         Adoquery2.FieldByName('庫存').value := strtoint(adoquery2.FieldByName('庫存').value)   1;
         ADOQuery3.Edit;
         ADOQuery3.FieldByName('剩餘可借數量').Value := ADOQuery3.FieldByName('剩餘可借數量').Value   1;
         if (daycount > strtoint(adoquery2.FieldByName('可借天數').Value)) then
            begin
               edit3.Text := inttostr(daycount);
               edit4.text := inttostr(strtoint(edit4.Text)   strtoint(edit3.Text));
               adoquery3.FieldByName('未繳罰款').Value := 5 * strtoint(edit4.Text); //逾期一天罰5元
               adoquery3.FieldByName('違規次數').Value := adoquery3.FieldByName('違規次數').Value   1;
            end;
         adoquery1.Post;
         adoquery2.Post;
         adoquery3.post;
      end;
   listbox1.Clear;
   history(sender);
   blist := datetostr(date)   '__'   datamodule3.ADOQuery2.fieldbyname('書名').Value;
   listbox2.Items.Append(blist);
end;    
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-23 14:49:36 IP:218.16.xxx.xxx 未訂閱
你的借書程式別用 ADOQuery1 另開一個 Query (靜態動態均可) 就可以了 你的問題是 借書程式 清空了原本 ADOQuery1 原本的 SQL 又沒設回。雖然可每次用完設回,但還是另開一個 ADOQuery 有效率一點
wnhoo
高階會員


發表:75
回覆:443
積分:198
註冊:2003-04-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-23 14:56:52 IP:61.155.xxx.xxx 未訂閱
with datamodule3 do begin                   adoquery1.SQL.Clear;          adoquery1.SQL.add('insert into 借閱記錄(姓名,學號,書名,借閱日期) values (:v1,:v2,:v3,:v4)');          adoquery1.Parameters.ParamByName('v1').Value := adoquery3.fieldbyname('姓名').Value;          adoquery1.Parameters.ParamByName('v2').Value := adoquery3.fieldbyname('學號').Value;          adoquery1.Parameters.ParamByName('v3').Value := adoquery2.fieldbyname('書名').value;          adoquery1.Parameters.ParamByName('v4').Value := AnsiReplaceText(FormatDateTime('yyyy,mm,dd', now), ',', '/')+ timetostr(time) ; adoquery1.close; AdoQuery1.ExecSQL; //新增借閱記錄 {您这个ADOQUERY1是执行INSERT操作,没有返回记录集 只有返回记录集并且OPEN,您的后面的操作才不会出错的。 如: ADOQUERY1.SQL.CLEAR; ADOQUERY1.SQL.ADD('SELECT * FROM 借閱記錄'); adoquery1.close; ADOQUERY1.OPEN; } end; 风花雪月 e梦情缘
發表人 - wnhoo 於 2003/05/23 14:58:44
------
风花雪月 e梦情缘
nachi
初階會員


發表:40
回覆:116
積分:31
註冊:2003-02-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-23 15:03:02 IP:218.165.xxx.xxx 未訂閱
justmade兄,謝謝你啦,薑還是老的辣 >
系統時間:2024-07-03 0:54:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!