Question: When using the TpFIBDataSet, I do not seem to find a way to handle INT64 types. Help please.
Field "PROD_UNIT_PRICE" in Firebird = BigInt = 2,200,000,000
Delphi
pFIBDSDetail=TpFIBDataSet
var
mfact:int64;
...
case pfibqreport.fieldbyname('TBL_Type').AsInteger of
4: mfact:=pFIBDSDetail.fieldbyname('PROD_UNIT_PRICE').AsInteger
my result=
pFIBDSDetail.fieldbyname('PROD_UNIT_PRICE').AsInteger comes through as -2094967296
There is not
pFIBDSDetail.fieldbyname('PROD_UNIT_PRICE').asint64
How do I pass an Int64 through a TpFIBDataSet?
Answer:
Method "Fieldbyname" returns abstract class "TField". This class haven't methods for work with Int64 values.
pFIBDataSet has the psUseLargeIntField option in PrepareOptions. If
you include it into your code then FB Bigint field will do mapping
to TFIBLargeIntField. In this case you must write your code as:
4: mfact:=TFIBLargeIntField( pFIBDSDetail.fieldbyname('PROD_UNIT_PRICE')).AsLargeInt
If you don't include psUseLargeIntField then this field will do mapping to TFIBBCDField.
In this case you should write your code as:
4: mfact:=TFIBBCDField( pFIBDSDetail.fieldbyname('PROD_UNIT_PRICE')).AsInt64
And the last recommendation... If you can't know about prepareOptions in your code then you can write it as:
4:
if pFIBDSDetail.fieldbyname('PROD_UNIT_PRICE') is TFIBBCDField then
mfact:=TFIBBCDField( pFIBDSDetail.fieldbyname('PROD_UNIT_PRICE')).AsInt64
else
mfact:=TFIBLargeIntField( pFIBDSDetail.fieldbyname('PROD_UNIT_PRICE')).AsLargeInt
Waaaaw, what a difference in support with IBO, most of the time when I asked something there, I got a arrogant answer. This is really great and I must say, there is a significant difference in speed that FIBPlus is faster! >>