我想在向数据发布之前检查另一个名为“LOG”的表中是否存在两个值('shift'和'date')。 'shift'值由网格中的选择确定,该选择显示来自“shift”表(UNITable1)的数据,而date参数是AdvOfficeStatusBar1.Panels [0] .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正在迭代我想插入的其他记录。
答案 0 :(得分:0)
我不使用你所指的任何组件(我不知道UNIQuery2
或UNITransaction
可能是什么,但你的逻辑完全没有问题。(你的格式也是如此) ,这简直是残暴的 - 如果你的真实代码是如何工作的,你真的需要学习更好的习惯。)
请 - 现在摆脱with
的使用。它非常容易出错,使代码难以阅读和理解,并使调试变得非常困难。
您需要(按此顺序):
此外,如果您的组件与TDataSet
兼容,则应该支持TDataSet.IsEmpty
您应该使用if not UNIQuery2.IsEmpty then
而不是if UNIQuery.Eof = false
(这应该更加干净if not UNIQuery.Eof
{1}})。
我无法努力重新编写代码,因为它遍布整个地方。您在一个地方UNIQuery2
,在另一个地方UNIQuery1
(以及with
声明使其更加混乱),我不使用(或拥有)您所拥有的任何组件用来甚至试图搞清楚。我希望这些信息可以帮助您解决问题。如果没有,请用清理后的(重写的)代码发布一个新问题,更清楚地了解您遇到的问题,并尝试提出更清晰的问题,我们可以提供更多帮助。