20. Januar 2017 12:16
Seit NAV 2017 wurden einige Bild-Felder (Datentyp = BLOB) durch die Datentypen MediaSet und Media ersetzt.
Betroffen ist zum Beispiel Item.Picture, nicht aber CompanyInformation.Picture.
Onlinehilfe:
Working With Media on RecordsKonsequenz (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
Felder wie Item.Picture andrucken oder aus anderen Gründen im Quelltext veararbeiten wollte die BLOBs direkt per Code ansprechen möchte, hat jetzt ein Problem. Daher ein paar Codebeispiele:
Statt Item.Picture muss jetzt das TenantMedia.Content angedruckt werden.Durch Datentyp MediaSet müssen wir einen Umweg über Tabelle TenantMediaSet gehen:
- Code:
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:
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:
IsMediaSetField(ConfigPackageData."Table ID",ConfigPackageData."Field ID"):
ImportMediaSetFiles(ConfigPackageData,FieldRef,DoModify);
IsMediaField(ConfigPackageData."Table ID",ConfigPackageData."Field ID"):
ImportMediaFiles(ConfigPackageData,FieldRef,DoModify);