在我将数据发布到另一个表"LOG“之前,我想检查两个值('shift‘和'date')是否已经存在。“shift”值由网格中显示来自“shift”表(UNITable1)的数据的选择决定,date参数是AdvOfficeStatusBar1.Panels.Text (它显示当前日期)。查询如下:
procedure TForm1.cxButton4Click(Sender: TObject);
begin
UniTransaction1.AddConnection(UniConnection1);
UNIquery2.Close;
UNIquery2.SQL.Clear;
UNIquery2.SQL.Add('INSERT INTO LOG (DATE,SHIFT,TASK,DONE) VALUES (:a1,:a2,:a3,:a4)');
UNIquery2.Prepare;
UniTransaction1.StartTransaction;
try
UNIQuery1.DisableControls;
UNIQuery1.First;
while Uniquery1.EOF = false do begin
UNIquery2.Params[0].asString := AdvOfficeStatusBar1.Panels[0].Text; //Current Date
UNIquery2.Params[1].asString := UniTable1.FieldByName('SHIFT').asString;// Which shift
UNIquery2.Params[2].asString := Uniquery1.FieldByName('TASK').asString;//many tasks
UNIquery2.Params[3].Value := Uniquery1.FieldByName('DONE').Value;// Checkbox
Uniquery1.Next; //get 'all' the values from UNIQuery1
UNIquery2.ExecSQL;
end;
UniTransaction1.Commit;
UNIQuery1.EnableControls;
finally
if UNIquery2.Connection.InTransaction then
UNIquery2.Connection.Rollback;
end;
end;我怎么能把这个合并起来呢?如何重写此事务,以便它检查现有记录?
编辑: UNIQuery1正在迭代我想要插入的其他记录。
发布于 2014-01-31 00:27:04
我不使用您所指的任何组件(我不知道UNIQuery2或UNITransaction可能是什么,但您的逻辑完全不正常。(您的格式也是如此,这是非常糟糕的-如果这是您真正的代码工作方式,那么您确实需要学习更好的习惯。)
现在请不要再使用with了。它非常容易出错,使代码难以阅读和理解,并使调试极其困难。
您需要(按此顺序):
另外,如果您的组件与TDataSet兼容,那么它应该支持您应该使用的TDataSet.IsEmpty (if not UNIQuery2.IsEmpty then),而不是if UNIQuery.Eof = false (后者应该更干净地称为if not UNIQuery.Eof)。
我不能努力重新编写你的代码,因为它到处都是。您有UNIQuery2在一个地方,UNIQuery1在另一个地方(以及使它更加混乱的with语句),而我甚至没有使用(或)您所使用的任何组件来尝试解决它。我希望这些信息能帮你解决问题。如果没有,在清理(重写)的代码中发布一个新的问题,更清楚地了解你遇到的问题,并尝试问一个更清晰的问题,我们可以得到更多的帮助。
https://stackoverflow.com/questions/21466378
复制相似问题