Icon View Thread

The following is the text of the current message along with any replies.
Messages 1 to 9 of 9 total
Thread TABLE OnGetText (handle null or 0 date display)
Tue, Jan 9 2024 12:35 AMPermanent Link

Andrew Hill

If I use Field InvoiceDate OnGetText it fails (data disappears)

...

 for i:= 0 to tblPurchases.FieldDefs.Count -1 do begin
   try
     fld:= tblPurchases.FieldDefs.Items[i].CreateField(tblPurchases); // reusing fld over and over ???
     //
     if UpperCase(fld.FullName) = UpperCase('InvoiceDate') then begin
       TDateTimeField(fld).OnGetText:=     GetText2;
     end;

...

procedure TUniMainModule.GetText2(Sender: TField; var Text: String; DisplayText: Boolean);
begin
 if TField(Sender).AsDateTime < EncodeDate(1900, 1, 1) then begin
   Text:= '';
   DisplayText:= False;
 end else begin
   Text:= DateToStr(TField(Sender).AsDateTime);
   DisplayText:= True;
 end;
end;
Tue, Jan 9 2024 3:15 AMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

Andrew


I'm very puzzled. I don't know if its just my newsreader but it doesn't look as though you're assigning the address of GetText2 to OnGetText. I also can't understand the loop. A table can only have one column called InvoiceDate so why not just address it directly?

Roy Lambert
Tue, Jan 9 2024 3:36 PMPermanent Link

Andrew Hill

Roy, my idea was to paint Date.Text blank when date is null or pre 1900 (instead of 31/12/1899) - of course all NumericField code works correctly but when DateTimeField is involved it strips out all data.

 // Set Persistent Float Field Display Text
 for i:= 0 to tblPurchases.FieldDefs.Count -1 do begin
   try
     fld:= tblPurchases.FieldDefs.Items[i].CreateField(tblPurchases); // reusing fld over and over ???
     //
     if UpperCase(fld.FullName) = UpperCase('InvoiceDate') then begin
//        TDateTimeField(fld).OnGetText:= GetText2;
     end;
     //
     if UpperCase(fld.FullName) = UpperCase('Amount') then begin
       TNumericField(fld).DisplayFormat:= '######.##';
       TNumericField(fld).OnGetText:= GetText;
     end;
     //
     if UpperCase(fld.FullName) = UpperCase('GST') then begin
       TNumericField(fld).DisplayFormat:= '######.##';
       TNumericField(fld).OnGetText:= GetText;
     end;
     //
     if UpperCase(fld.FullName) = UpperCase('Adjustment') then begin
       TNumericField(fld).DisplayFormat:= '######.##';
       TNumericField(fld).OnGetText:= GetText;
     end;
     //
     if UpperCase(fld.FullName) = UpperCase('Paid') then begin
       TNumericField(fld).DisplayFormat:= '######.##';
       TNumericField(fld).OnGetText:= GetText;
     end;
     //
     if UpperCase(fld.FullName) = UpperCase('ReconciledDate') then begin
//        TDateTimeField(fld).OnGetText:= GetText2;
     end;
     //
     if UpperCase(fld.FullName) = UpperCase('Owing') then begin
       TNumericField(fld).DisplayFormat:= '######.##';
       TNumericField(fld).OnGetText:= GetText;
     end;
     //
   except
     on E: Exception do begin
       s:= E.Message;
     end;
   end;
   //
 end; // for
 tblPurchases.FieldDefs.Update;
Wed, Jan 10 2024 5:28 AMPermanent Link

Andrew Hill

Tim, would you care to wade in - Thanks - Andy
Wed, Jan 10 2024 7:28 AMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

Andrew


Just so you know this is Delphi not ElevateDB.I know I had problems with a component where I did this and I'll have a look this afternoon

Roy Lambert
Wed, Jan 10 2024 8:27 AMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

Andrew


I've been having a look and I've made a couple of changes to your code - see below.  I'm on an old version of Delphi (D2007)  which may or may not be significant, but the code works and I get exactly what I'd expect to see.


procedure TForm1.GetText2(Sender: TField; var Text: string; DisplayText: Boolean);
begin
if Sender.AsDateTime < EncodeDate(2020, 1, 1) then begin
 Text := '';
 DisplayText := True; <<<<<<<<<<<<<<<<<<<<<<<<

end else begin
 Text := DateToStr(Sender.AsDateTime);
 DisplayText := True;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
fld: TField;
begin
Test.FieldDefs.Update; <<<<<<<<<<<<<<<<<<<<<<
for i := 0 to Test.FieldDefs.Count - 1 do begin
 fld := Test.FieldDefs.Items[i].CreateField(Test); // reusing fld over and over ???
     //
 if UpperCase(fld.FullName) = UpperCase('_Date') then TDateTimeField(fld).OnGetText := GetText2;
end;
Test.Open;
end;

Roy Lambert
Wed, Jan 10 2024 3:03 PMPermanent Link

Andrew Hill

Roy, either way once "TDateTimeField(fld).OnGetText:=" is set then all data disappears.

Debugging shows GetText2 firing and setting text as expected but no data is shown from table ???.

I even tried this

procedure TUniMainModule.GetText2(Sender: TField; var Text: String; DisplayText: Boolean);
begin

Exit; <<<<<<<<<<<<

 if Sender.AsDateTime < TestDateTime then begin
   Text:= '';
   DisplayText:= True;
 end else begin
   Text:= DateToStr(Sender.AsDateTime);
   DisplayText:= True;
 end;
end;
Wed, Jan 10 2024 3:57 PMPermanent Link

Andrew Hill

OK, this is what is killing it

reusing fld over and over
Thu, Jan 11 2024 2:51 AMPermanent Link

Roy Lambert

NLH Associates

Team Elevate Team Elevate

Andrew


Its not something I tested for but when I think about it only the last instance would probably "stick". At least you've solved the problem.

Roy Lambert
Image