I tested the console application with some modifications
Code: Select all
VT.Open;
Writeln('new record');
VT.Append;
VT.FieldByName('klant').AsString := '0000020';
VT.FieldByName('partijID').AsInteger := 11004;
VT.FieldByName('startdatum').AsDateTime := StrToDate('01-11-2015');
VT.FieldByName('einddatum').AsDateTime := StrToDate('30-11-2015');
VT.Post;
s := '0000080';
i := 11004;
d1 := StrToDate('01-11-2015');
d2 := StrToDate('30-11-2015');
if VT.Locate('klant;partijID;startdatum;einddatum',vararrayof([s, i, d1, d2]), []) then
Writeln('record found')
else
begin
Writeln('new record');
VT.Append;
VT.FieldByName('klant').AsString := '0000018';
VT.FieldByName('partijID').AsInteger := 11004;
VT.FieldByName('startdatum').AsDateTime := StrToDate('01-11-2015');
VT.FieldByName('einddatum').AsDateTime := StrToDate('30-11-2015');
VT.Post;
end;
s := '0000019';
i := 11004;
d1 := StrToDate('01-11-2015');
d2 := StrToDate('30-11-2015');
if VT.Locate('klant;partijID;startdatum;einddatum',vararrayof([s, i, d1, d2]), []) then
Writeln('record found')
else
begin
Writeln('new record');
VT.Append;
VT.FieldByName('klant').AsString := '0000019';
VT.FieldByName('partijID').AsInteger := 11004;
VT.FieldByName('startdatum').AsDateTime := StrToDate('01-11-2015');
VT.FieldByName('einddatum').AsDateTime := StrToDate('30-11-2015');
VT.Post;
end;
s := '0000018';
i := 11004;
d1 := StrToDate('01-11-2015');
d2 := StrToDate('30-11-2015');
if VT.Locate('klant;partijID;startdatum;einddatum',vararrayof([s, i, d1, d2]), []) then
Writeln('record found')
else
begin
Writeln('new record');
VT.Append;
VT.FieldByName('klant').AsString := '0000018';
VT.FieldByName('partijID').AsInteger := 11004;
VT.FieldByName('startdatum').AsDateTime := StrToDate('01-11-2015');
VT.FieldByName('einddatum').AsDateTime := StrToDate('30-11-2015');
VT.Post;
end;
VT.First;
Writeln(VT.RecNo.ToString);
s := '0000020';
i := 11004;
d1 := StrToDate('01-11-2015');
d2 := StrToDate('30-11-2015');
VT.Locate('klant;partijID;startdatum;einddatum',vararrayof([s, i, d1, d2]), []);
Writeln(VT.RecNo.ToString);
The result gave me 3 new records, because the 4th is found.
So I tested again in my GUI application with debugger and log files:
Code: Select all
procedure TKoelkosten.Save;
var myList : TSearchableObjectList<TKoelInslag>;
Inslag : TKoelInslag;
searchNr : integer;
Uitslag : TKoelUitslag;
oudnr : integer;
begin
Log('procedure save');
myList := (TSearchableObjectList<TKoelInslag>(fKoelInslag));
oudnr := 0;
try
fVtDagvoorraad.IndexFieldNames := 'klant;partijID;startdatum;einddatum';
for Uitslag in fKoeluitslag do
begin
searchNr := Uitslag.fpartijID;
if searchNr <> oudnr then
begin
// Let´s make it more interesting and perform a case insensitive search,
// by comparing with SameText() instead the equality operator
Inslag := myList.Search(function(aItem : TKoelInslag): boolean
begin
Result := aItem.fpartijID = searchNr
end);
end;
oudnr := searchNr;
Log(format('klant %s, partijID %d, Startdatum %s, Einddatum %s',[Uitslag.fklant,Uitslag.fpartijID,DateToStr(Uitslag.fStartdatum),DateToStr(Uitslag.fEinddatum)]));
if VtDagvoorraad.Locate('klant;partijID;startdatum;einddatum',vararrayof([
Uitslag.fklant,Uitslag.fpartijID,Uitslag.fStartdatum,Uitslag.fEinddatum]),[]) then
begin
Log('toevoegen aan bestaand record');
fVtDagvoorraad.Edit;
fVtDagvoorraad.FieldByName('aantal_bollen').AsInteger := fVtDagvoorraad.FieldByName('aantal_bollen').AsInteger + Uitslag.faantal_bollen;
fVtDagvoorraad.FieldByName('aantal_fust').AsInteger := fVtDagvoorraad.FieldByName('aantal_fust').AsInteger + Uitslag.faantal_fust;
fVtDagvoorraad.FieldByName('saldo').AsFloat := fVtDagvoorraad.FieldByName('saldo').AsFloat + Uitslag.fSaldo;
fVtDagvoorraad.Post;
end else
begin
if Uitslag.faantal_dagen > 0 then
begin
Log('nieuw record');
fVtDagvoorraad.Append;
fVtDagvoorraad.FieldByName('klant').AsString := Uitslag.fklant;
fVtDagvoorraad.FieldByName('artikel').AsString := Inslag.fartikel;
fVtDagvoorraad.FieldByName('startdatum').AsDatetime := Uitslag.fStartdatum;
fVtDagvoorraad.FieldByName('einddatum').AsDatetime := Uitslag.fEinddatum;
fVtDagvoorraad.FieldByName('aantal_bollen').AsInteger := Uitslag.faantal_bollen;
fVtDagvoorraad.FieldByName('aantal_fust').AsInteger := Uitslag.faantal_fust;
fVtDagvoorraad.FieldByName('aantal_dagen').AsInteger := Uitslag.faantal_dagen;
fVtDagvoorraad.FieldByName('inkooporder').AsInteger := Inslag.finkooporder;
fVtDagvoorraad.FieldByName('leverancier').AsString := Inslag.fleverancier;
fVtDagvoorraad.FieldByName('aantal_per_fust').AsInteger := Inslag.faantal_per_fust;
fVtDagvoorraad.FieldByName('kostenplaats').AsString := Inslag.fkostenplaats;
fVtDagvoorraad.FieldByName('tarief').AsFloat := Inslag.ftarief;
fVtDagvoorraad.FieldByName('partijID').AsInteger := Inslag.fpartijID;
fVtDagvoorraad.FieldByName('verkooporder').AsInteger := Uitslag.fverkooporder;
fVtDagvoorraad.FieldByName('factuurdatum').AsDatetime := Uitslag.fFactuurdatum;
fVtDagvoorraad.FieldByName('uitgeleverd').AsBoolean := Uitslag.fUitgeleverd;
fVtDagvoorraad.FieldByName('saldo').AsFloat := Uitslag.fSaldo;
fVtDagvoorraad.Post;
end else
Log('Record valt buiten aantal dagen > 0');
end;
end;
finally
Inslag := nil;
end;
end;
This is the result:
[08-02-2016 15:05:20] [0] procedure save
[08-02-2016 15:05:25] [0] klant 0000018, partijID 11004, Startdatum 01-11-2015, Einddatum 30-11-2015
[08-02-2016 15:05:25] [0] nieuw record
[08-02-2016 15:05:25] [0] klant 0000020, partijID 11004, Startdatum 01-11-2015, Einddatum 30-11-2015
[08-02-2016 15:05:25] [0] nieuw record
[08-02-2016 15:05:25] [0] klant 0000019, partijID 11004, Startdatum 01-11-2015, Einddatum 30-11-2015
[08-02-2016 15:05:25] [0] nieuw record
[08-02-2016 15:05:25] [0] klant 0000018, partijID 11004, Startdatum 01-11-2015, Einddatum 30-11-2015
[08-02-2016 15:05:25] [0] nieuw record
I see during debugging the code there are really appended 4 records.
That's strange.