SQL 疑問.... |
答題得分者是:Justmade
|
nachi
初階會員 發表:40 回覆:116 積分:31 註冊:2003-02-26 發送簡訊給我 |
當執行"借"、"還"、"還了再借"都沒問題,就是不能"先借再還",若先執行借再執行還,會出現:
'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 發送簡訊給我 |
|
wnhoo
高階會員 發表:75 回覆:443 積分:198 註冊:2003-04-22 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |