Please read my first post about auto deployment of Client side components
here before reading this.
As you know, my first auto deployment project contained a couple of methods for automatically adding actions to pages, but as one of my colleagues in Germany (Carsten Scholling) told me, it would also need to be able to add fields to tables programmatically in order to be really useful.
In fact, he didn’t just tell me that it should do so, he actually send me a couple of methods to perform that.
The method signatures are:
AddToTable(TableNo : Integer;FieldNo : Integer;VersionList : Text[30];FieldName : Text[30];FieldType : Integer;FieldLength : Integer;Properties : Text[800]) : Boolean
and
AddTheField(TableNo : Integer;FieldNo : Integer;FieldName : Text[30];FieldType : Integer;FieldLength : Integer) SearchLine : Text[150]
And it can be used like:
// Add the fields
SearchLineLat := ComponentHelper.AddTheField(DATABASE::Customer, 66030, 'Latitude', FieldRec.Type:
ecimal, 0);
SearchLineLong := ComponentHelper.AddTheField(DATABASE::Customer, 66031, 'Longitude', FieldRec.Type:
ecimal, 0);
which just add’s the fields without captions or
// Add Latitude to Customer table
ComponentHelper.AddToTable(DATABASE::Customer, 66030, 'VirtualEarthDemo1.01', 'Latitude', FieldRec.Type:
ecimal, 0,
'CaptionML=[DAN=Breddegrad;DEU=Breitengrad;ENU=Latitude;ESP=Latitud;FRA=Latitude;ITA=Latitudine;NLD=Breedte];DecimalPlaces=6:8’);
Remember, that the table will be left uncompiled after doing this.
AddToTable actually calls AddTheField and after that it modifies the metadata to set the caption on the field:
AddToTable(TableNo : Integer;FieldNo : Integer;VersionList : Text[30];FieldName : Text[30];FieldType : Integer;FieldLength : Integer;Properties : Text[800]) : Boolean
changed := FALSE;
SearchLine := AddTheField(TableNo, FieldNo, FieldName, FieldType, FieldLength);
IF SearchLine <> '' THEN
BEGIN
GetTableMetadata(TableNo, Metadata);
IF AddToMetadataEx(TableNo, Object.Type::Table, Metadata, SearchLine, '', ';' + Properties, TRUE, FALSE) THEN BEGIN
SetTableMetadata(TableNo, Metadata, VersionList);
changed := TRUE;
END;
END;
AddTheField is the actual “magic”:
AddTheField(TableNo : Integer;FieldNo : Integer;FieldName : Text[30];FieldType : Integer;FieldLength : Integer) SearchLine : Text[150]
Field.SETRANGE(TableNo, TableNo);
Field.SETRANGE("No.", FieldNo);
SearchLine := '';
IF Field.ISEMPTY THEN BEGIN
Field.TableNo := TableNo;
Field."No." := FieldNo;
Field.FieldName := FieldName;
Field.Type := FieldType;
Field.Class := Field.Class::Normal;
Field.Len := FieldLength;
Field.Enabled := TRUE;
Field.INSERT;
Field.FINDFIRST;
Len[1] := 4;
Len[2] := 20;
Len[3] := 15;
IF STRLEN(FORMAT(FieldNo)) > Len[1] THEN Len[1] := STRLEN(FORMAT(FieldNo));
IF STRLEN(FieldName) > Len[2] THEN Len[2] := STRLEN(FieldName);
IF STRLEN(Field."Type Name") > Len[3] THEN Len[3] := STRLEN(Field."Type Name");
SearchLine := ' { ' + PADSTR(FORMAT(FieldNo), Len[1]) + '; ;' +
PADSTR(FieldName, Len[2]) + ';' + PADSTR(Field."Type Name", Len[3]);
END;
The new ComponentHelper 1.03 msi can be downloaded
here and my upcoming posts (e.g. Edit In Excel R2) will require this.
Enjoy
Freddy Kristiansen
PM Architect
Microsoft Dynamics NAV
Подробнее