VARIANT.ISDATE and FieldRef.TYPE ???

Hi, I like to loop through the FieldRefs of a RecordRef and then insert values in another RecordRef with matching Fieldnumbers. I use a Buffervariable of type Variant for the values. It seems that the ISDATE , ISCODE etc. for the Variant –Variable does not work when FielRef Values are assigned. If I don’t use a Variable (Variant), I have problems with assigning Values from one FieldRef to another (Error because of not matching Field type, Date, Code, etc.), even if they have the same Type. This is the Code I tested with: FOR i := 1 TO LastField DO BEGIN IF ToRecRef.FIELDEXIST(i) AND FromRecRef.FIELDEXIST(i) THEN BEGIN ToFieldRef := ToRecRef.FIELD(i); FromFieldRef := FromRecRef.FIELD(i); IF FromFieldRef.TYPE = ToFieldRef.TYPE THEN BEGIN BufferVariant := FromFieldRef; IF NOT BufferVariant.ISDATE THEN ToFieldRef.VALIDATE(FORMAT(BufferVariant)); END; END; END; Maybe someone has an idea what’s wrong. One other helpful thing could be how to handle with FieldRef.TYPE Functionality, it returns a “Data type”. How can I check for “Data Type” in C/AL? Tx and regards Micha [:)]

You need to use VALUE to manipulate a FieldRef value. You can assign the result of the TYPE function to a Text by using FORMAT(FieldRef.TYPE) if you need to store it. FOR i := 1 TO FromRecRef.FIELDCOUNT DO BEGIN IF ToRecRef.FIELDEXIST(i) AND FromRecRef.FIELDEXIST(i) THEN BEGIN ToFieldRef := ToRecRef.FIELD(i); FromFieldRef := FromRecRef.FIELD(i); IF FromFieldRef.TYPE = ToFieldRef.TYPE THEN BEGIN BufferVariant := FromFieldRef.VALUE; IF NOT BufferVariant.ISDATE THEN ToFieldRef.VALUE(BufferVariant); END; END; END;

The best way is to declare two record variables of the subtype Field. Then you try to get the Fields you are interested in: FromField.SETRANGE(TableNo,FromTableNo); REPEAT IF ToField.GET(ToRecRef.Number,FromFieldRef.Number) THEN BEGIN IF FromField.Type = ToField.Type THEN BEGIN FromFieldRef.Value := ToFieldRef.Value; NeedToWrite := TRUE; END; UNTIL FromField.NEXT = 0; IF NeedToWrite THEN ... some more code to write the changed recref back to DB ... In this table the “Type” of the field is a real Option Value and can be compared directly. This is by the way faster than using a "Format and do a text comparison or loop through all possible field numbers. Just forget about the variants.

@Robert: I tried some kind of code like this: IF FORMAT(FromFieldRef.TYPE) = 'Text' THEN BEGIN BufferVariant := FromFieldRef; ToFieldRef.VALUE(FORMAT(BufferVariant)); END; IF FORMAT(FromFieldRef.TYPE) = 'Date' THEN BEGIN EVALUATE(DateVar,FORMAT(FromFieldRef)); ToFieldRef.VALUE(DateVar); END; it work’s @Thomas: [;)] I like your suggestion because I thing having a comparison with a real option field seems to be more “safer”. Thank you both! [:)]

Just try both methods with 1000 records each and measure the time between start and end of that function. You will be amazed

Yep, I’m going to check this even I thing you are right. Tx [;)]

@Robert: Don’t we have to be careful of the difference between FIELDINDEX(i) vs. FIELD(i)… Looks like we’re trying to emulate TRANSFERFIELDS between two RecRefs. Here’s my attempt:


PROCEDURE RecRefTransferFields(VAR FromRecRef : RecordRef;VAR ToRecRef : RecordRef) VAR i : Integer; FromFieldRef : FieldRef; ToFieldRef : FieldRef; BEGIN FOR i := 1 TO FromRecRef.FIELDCOUNT DO BEGIN FromFieldRef := FromRecRef.FIELDINDEX(i); IF ToRecRef.FIELDEXIST(FromFieldRef.NUMBER) THEN BEGIN ToFieldRef := ToRecRef.FIELD(FromFieldRef.NUMBER); IF FromFieldRef.TYPE = ToFieldRef.TYPE THEN ToFieldRef.VALUE := FromFieldRef.VALUE; END; END; END


Didn’t test it yet – do y’all think it’ll work? Any bugs found will be met with applause! More applause for extending it to TRANSFERFIELD’s behaviour re: primary key fields…

Absolutely. I hadn’t even looked at that - was focusing on use of VALUE. I would expect TRANSFERFIELDS to appear in RecordRef in future.