[Gelöst] MediaSet und Media statt BLOB

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 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 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);

Re: [Gelöst] MediaSet und Media statt BLOB

26. Januar 2017 12:45

Natalie hat geschrieben:Wer Felder wie Item.Picture andrucken oder aus anderen Gründen im Quelltext veararbeiten wollte, hat jetzt ein Problem.

Die Information stimmte nicht: In Reports kann nach wie vor Item.Picture direkt im DataSet verwendet werden. Scheinbar wird intern eine Funktion ausgeführt, die das erste BLOB aus dem Set holt und übergibt.

Wer dagegen das BLOB aus anderen Gründen (z.B. Bildbearbeitung) direkt per Code ansprechen will, der kann auf die o.g. Fuktionen zugreifen.

MediaSet.ITEM

19. April 2017 11:45

Die ITEM Function (MediaSet) funktioniert erst ab CU05 für NAV 2017 richtig.