[Gelöst] MediaSet und Media statt BLOB

Bild Microsoft Dynamics NAV 2017

[Gelöst] MediaSet und Media statt BLOB

Beitragvon Natalie » 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: 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);
Benutzeravatar
Natalie
Moderator
Moderator
 
Beiträge: 9257
Registriert: 31. Oktober 2006 19:51
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

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

Beitragvon Natalie » 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.
GruĂź, Natalie

Frage beantwortet oder Problem von allein gelöst? Schreibe bitte [Gelöst] vor den Titel des ersten Beitrags.

Bitte erst suchen, dann fragen. Bitte beachte den kleinen Community-Knigge.
Kein Support per PN, Mail, IM oder Telefon! DafĂĽr ist dieses Forum da.
Benutzeravatar
Natalie
Moderator
Moderator
 
Beiträge: 9257
Registriert: 31. Oktober 2006 19:51
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV

MediaSet.ITEM

Beitragvon Natalie » 19. April 2017 11:45

Die ITEM Function (MediaSet) funktioniert erst ab CU05 fĂĽr NAV 2017 richtig.
Benutzeravatar
Natalie
Moderator
Moderator
 
Beiträge: 9257
Registriert: 31. Oktober 2006 19:51
Bezug zu Microsoft Dynamics: Microsoft Partner
Microsoft Dynamics Produkt: Microsoft Dynamics NAV


ZurĂĽck zu NAV 2017

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast