Zugriff auf BLOB Felder über Feldreferenzen

16. März 2009 14:22

Hallo,
bin neu hier und ziemlich neu mit NAV

Habe folgendes Problem:
möchte aus einer Table mit einem BLOB Field den BLOB Inhalt extrahieren in ein OS File.

Also z.B.:

recEmployee.CALCFIELDS(Picture);
IF recEmployee.Picture.HASVALUE THEN
recEmployee.Picture.EXPORT('c:\a_pic.blob');


Soweit, so gut!

Nun will ich das Ganze aber über Referenzen gestalten, also:

VAR
rRef..RecordRef
fRef..FieldRef

rRef.GETTABLE(recEmployee);
fRef:= rRef.FIELD(35); // Das ist eine BLOB
if fRef.HASVALUE then
fRef.EXPORT('c:\a_pic.blob');

HASVALUE und EXPORT funktionieren aber auf Referenzen nicht!

Wie lös ich das Problem?

Bitte um eine Idee

lg mi

Re: Zugriff auf BLOB Felder über Feldreferenzen

16. März 2009 14:44

Funzt das?

VAR
rRef..RecordRef
fRef..FieldRef

rRef.GETTABLE(recEmployee);
fRef:= rRef.FIELD(35); // Das ist eine BLOB
fRef.CALCFIELD;

... und dann via OUTSTREAM in Datei schreiben?

Re: Zugriff auf BLOB Felder über Feldreferenzen

16. März 2009 15:07

Danke für's prompte Bemühen!

Bringe auf die Fieldref aber keine CREATEOUTSTREAM zusammen.

Oder gibts da einen anderen, geheimnisvollen, verschlungenen Weg dorthin?

Re: Zugriff auf BLOB Felder über Feldreferenzen

16. März 2009 16:13

OK, das war nur ein "Schuss ins Blaue" ... (oder wohl eher "in den Ofen") ...
Hab mich dem Thema jetzt ein wenig mehr gewidmet, und muss leider feststellen, dass das nicht ganz so trivial ist :-(

Vielleicht hilft Dir das hier weiter: http://www.mibuso.com/forum/viewtopic.php?p=67618#67618

Re: Zugriff auf BLOB Felder über Feldreferenzen

16. März 2009 23:16

mfelix hat geschrieben:Oder gibts da einen anderen, geheimnisvollen, verschlungenen Weg dorthin?


Yepp :) Aber so verschlungen ist er gar nicht:

Code:
OBJECT Codeunit 50000 Temp Test
{
  OBJECT-PROPERTIES
  {
    Date=16.03.09;
    Time=22:09:17;
    Modified=Yes;
    Version List=;
  }
  PROPERTIES
  {
    OnRun=BEGIN
            WriteBlob();
            ReadBlob();

            EXIT;
          END;

  }
  CODE
  {
    PROCEDURE WriteBlob@1140000();
    VAR
      RecRef@1140000 : RecordRef;
      FldRef@1140001 : FieldRef;
      TempBlob@1140003 : TEMPORARY Record 99008535;
    BEGIN
      TempBlob.Blob.IMPORT('C:\Temp\IN.zip');

      RecRef.OPEN(DATABASE::TempBlob);

      FldRef := RecRef.FIELD(1);
      FldRef.VALUE := 1;

      FldRef := RecRef.FIELD(2);
      FldRef.VALUE := TempBlob.Blob;

      RecRef.INSERT;

      RecRef.CLOSE();
    END;

    PROCEDURE ReadBlob@1140001();
    VAR
      RecRef@1140005 : RecordRef;
      FldRef@1140004 : FieldRef;
      TempBlob@1140003 : TEMPORARY Record 99008535;
      f@1140000 : File;
    BEGIN
      RecRef.OPEN(DATABASE::TempBlob);
      RecRef.FINDFIRST;

      FldRef := RecRef.FIELD(2);
      FldRef.CALCFIELD;

      TempBlob.Blob := FldRef.VALUE;
      TempBlob.Blob.EXPORT('C:\Temp\OUT.zip', FALSE);

      RecRef.CLOSE();
    END;

    BEGIN
    END.
  }
}


Ist jetzt halt nicht so schön wies sein sollte, aber erfüllt seinen Zweck. Nimm dir eine konstante Tabelle her, wo du weißt, dass sie ein BLOB Feld beinhaltet, hier TempBlob. Das ist auch die einzige benötigte Konstante, da du das Feld einer Feldreferenz zuweisen kannst und umgekehrt.

Hoffe das hilft dir.

Re: Zugriff auf BLOB Felder über Feldreferenzen

17. März 2009 09:57

Is eh watscheneinfach!
Danke!
lg mi

Re: Zugriff auf BLOB Felder über Feldreferenzen

17. März 2009 14:40

Hallo

Das sollte doch direkt gehen:

Code:
RecordKopieren(_QuellRecRef : RecordRef;_ZielRecRef : RecordRef;_TabellenID : Integer)

Parameters:
Var   Name   DataType   Subtype   Length
Nein   _QuellRecRef   RecordRef      
Nein   _ZielRecRef   RecordRef      
Nein   _TabellenID   Integer      

Var:
Name   DataType   Subtype   Length
QuellFieldRef   FieldRef      
ZielFieldRef   FieldRef      
Field   Record   Field   
CommitCounter   Integer      
FeldZaehler   Integer      
i   Integer      
FeldZaehler := _QuellRecRef.FIELDCOUNT;
FOR i := 1 TO FeldZaehler DO BEGIN
  QuellFieldRef := _QuellRecRef.FIELDINDEX(i);
  ZielFieldRef := _ZielRecRef.FIELDINDEX(i);
  Field.GET(_TabellenID, QuellFieldRef.NUMBER);
  IF Field.Type = Field.Type::BLOB THEN BEGIN
    IF NOT QuellFieldRef.CALCFIELD THEN;
  END;
  IF Field.Class = Field.Class::Normal THEN
    ZielFieldRef.VALUE := QuellFieldRef.VALUE;
END;
IF NOT _ZielRecRef.INSERT THEN
  _ZielRecRef.MODIFY;


Gruss