Betroffen ist zum Beispiel Item.Picture, nicht aber CompanyInformation.Picture.
Onlinehilfe: Working With Media on Records
Konsequenz (am Beispiel der Tabelle Item): Das Bild ist nun nicht mehr in der Item-Tabelle gespeichert, sondern in der Tabelle Tenant Media. Im Feld Picture steht nur ein Verweis (in Form einer GUID) drin. Wenn ihr die Tabelle aus dem Object Designer heraus startet, könnt ihr das Feld Picture NICHT sehen.
Während Datentyp Media die eindeutige Referenz zur Zieltabelle Tenant Media, also zu genau einem Bild, enthält, verweist MediaSet auf beliebig viele Tenant Media Datensätze, die zu einem Tenant Media Set zusammen gefasst werden. Neben der Möglichkeit, eine Sammlung von Bildern zu verwalten, bringt diese Architektur einen Performancegewinn, da nun beim Laden eines Item-Datensatzes nicht automatisch das Bild mitgeladen wird.
Item.Picture kann nach wie vor direkt im DataSet von Reports angesprochen werden. Lediglich ein CALCFIELDS entfällt, denn es ist ja kein FlowField mehr.
Wer
- Code: Alles auswählen
CLEAR(TenantMedia);
IF NOT ISNULLGUID(Item.Picture.MEDIAID) THEN BEGIN
TenantMediaSet.SETRANGE(ID,Item.Picture.MEDIAID);
IF TenantMediaSet.FINDFIRST THEN BEGIN
IF TenantMedia.GET(TenantMediaSet."Media ID".MEDIAID) THEN
TenantMedia.CALCFIELDS(Content);
END;
END ELSE BEGIN
// lasse Tenant Media und damit das BLOLB-Feld Content leer
END;
Habt ihr einen Quelltext, der bisher per FieldRef direkt auf das Item.BLOB-Feld verwiesen hat? Kein Problem, leitet das FieldRef direkt vor Verwendung einfach um mit einer neuen Funktion :
- Code: Alles auswählen
LOCAL ReplaceFieldRefIfMediaDataType(VAR FieldRef : FieldRef)
IF NOT (UPPERCASE(FORMAT(FieldRef.TYPE)) IN ['MEDIA','MEDIASET']) THEN
EXIT;
CurrGUID := FieldRef.VALUE;
IF NOT ISNULLGUID(CurrGUID) THEN BEGIN
CASE UPPERCASE(FORMAT(FieldRef.TYPE)) OF
'MEDIASET':
BEGIN
TenantMediaSet.SETRANGE(ID,CurrGUID);
IF TenantMediaSet.FINDFIRST THEN BEGIN
CurrGUID := TenantMediaSet."Media ID".MEDIAID;
END;
END;
END;
IF TenantMedia.GET(CurrGUID) THEN;
END;
// Point to the actual field containing the BLOB
RecRef.GETTABLE(TenantMedia);
FieldRef := RecRef.FIELD(TenantMedia.FIELDNO(Content));
FieldRef.CALCFIELD;
Man kann auch beides kombinieren: in Reports statt Item.Picture ein FieldRef.VALUE drucken, und vor Verwendung die o.g. Funktion aufrufen. Funktioniert universell.
Zu guter Letzt noch Beispiele aus dem Standard (RapidStart):
Codeunit 8611 Config. Package Management
- Code: Alles auswählen
IsMediaSetField(ConfigPackageData."Table ID",ConfigPackageData."Field ID"):
ImportMediaSetFiles(ConfigPackageData,FieldRef,DoModify);
IsMediaField(ConfigPackageData."Table ID",ConfigPackageData."Field ID"):
ImportMediaFiles(ConfigPackageData,FieldRef,DoModify);