SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
12 Beiträge • Seite 1 von 1
12 Beiträge Seite 1 von 1

SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von alanio (ForumUser / 17 / 0 / 0 ) »
Hallo,

ich habe da ein wirklich großes Problem und hoffe, das mir jemand weiter helfen kann....SAP kann wohl nicht und will nun darum auch nicht mehr.

Ich habe einen Workflow, welcher ein Archivdokument läd und dieses dann per Mail als PDF-Anhang verschickt. Das hat bisher auch super funktoniert. Nun wurde bei uns eine Unicodeumstellung gemacht und siehe da, das PDF läßt sich nicht mehr öffnen.
Der Adobe Reader bringt die Meldung, das der Dateityp nicht unterstützt wird oder die Datei beschädigt ist.

Das Archivdokument lese ich mit dem FB ARCHIVOBJECT_GET_TABLE. Er gibt eine Tabelle zurück, welche ich dann (nach etwas "Überarbeitung") an den FB SO_DOCUMENT_SEND_API1 (Parameter: CONTENTS_BIN) übergeben habe.

Wie gesagt, vor Unicode hat das super funktioniert nun leider nicht mehr.

Ich habe schon alle möglichen Sachen ausprobiert und auch eine OSS-Meldung aufgemacht. Nachdem der Herr nun fleißig getestet hat und keine Lösung gefunen hat, habe ich die Info erhalten, das es sich wohl um Beratung und keinen Fehler handelt.

Es währe wirklich super, wenn jemand helfen könnte.

LG
Antje

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von alanio (ForumUser / 17 / 0 / 0 ) »
Hallo,

noch eine kleine Ergänzung.
Ich habe den Verdacht, das es am FB ARCHIVOBJECT_GET_TABLE liegt.
Ich habe 2 Tabellen, welche zurück gegeben werden.

ARCHIVOBJECT Bezugstyp DOC mit Zeilen CHAR 1024
BINARCHIVOBJECT Bezugstyp TABL1024 mit Zeilen RAW 1024

Aber später brauche ich ja entweder eine Tabelle SOLI oder eine SOLIX. (die haben jeweils nur 255 Zeichen in der Zeile)

Hat jemand eine Idee, was ich machen kann?

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von a-dead-trousers (Top Expert / 4457 / 227 / 1198 ) »
hi!

Am Besten du machst alles über die binäre Schnittstelle der beiden Bausteine, damit hast du kein Problem mit der Unicode-Umstellung. Sowas ähnliches ist bei uns nämlich auch mal passiert.

Ich würde so vorgehen:

Code: Alles auswählen.

data:
  ld_size type I,
  ld_stream type xstring.

field-symbols:
  <ls_line> type xsequence.

* Ergebnis von ARCHIVOBJECT_GET_TABLE verarbeiten
concatenate lines of <BINARCHIVOBJECT> into ld_stream in byte mode.
ld_stream = ld_stream(<LENGTH>). "Den Stream auf die richtige Länge kürzen.

* In die Struktur von SO_DOCUMENT_SEND_API1 umwandeln.
ld_size = 255. "Vielleicht vorher noch die Zeilenlänge ermitteln, damit man das Coding universal verwenden kann
while ld_stream is not initial.
  append initial line to <CONTENTS_HEX> assigning <ls_line>.
  <ls_line> = ld_stream.
  shift ld_stream by ld_size PLACES left in byte mode.
endwhile.
lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von alanio (ForumUser / 17 / 0 / 0 ) »
Hallo ADT,

danke für die Antwort. Leider funktioniert das nicht.

Data: binarch_obj TYPE TABLE OF tbl1024.

concatenate lines of BINARCH_OBJ into ld_stream in byte mode.

erzeugt folgenden Fehler:

Als Zeilentyp der Tabelle "BINARCH_OBJ" wurde ein byteartiges Feld
erwartet.
So sieht im Moment das Coding aus:

Code: Alles auswählen.

DATA: arch_obj TYPE TABLE OF docs WITH HEADER LINE,
      binarch_obj TYPE TABLE OF tbl1024. " WITH HEADER LINE.
DATA: objbin  TYPE soli_tab.
DATA: input_length TYPE i.
DATA:
  ld_size TYPE i,
  ld_stream TYPE xstring.
FIELD-SYMBOLS:
  <ls_line> TYPE xsequence.


      CALL FUNCTION 'ARCHIVOBJECT_GET_TABLE'
        EXPORTING
          archiv_id                      = 'A2'
          document_type                  = 'PDF'
          archiv_doc_id                  = '201108216395145275A075A3D443D44AC0071E'
*   ALL_COMPONENTS                 =
*   SIGNATURE                      = 'X'
*   COMPID                         = 'data'
       IMPORTING
*     length                         = length
          binlength                      = binlength
       TABLES
         archivobject                   = arch_obj
         binarchivobject                = binarch_obj
       EXCEPTIONS
         error_archiv                   = 1
         error_communicationtable       = 2
         error_kernel                   = 3
         OTHERS                         = 4
                .
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

* Ergebnis von ARCHIVOBJECT_GET_TABLE verarbeiten
      CONCATENATE LINES OF binarch_obj INTO ld_stream IN BYTE MODE.
      ld_stream = ld_stream(255). "Den Stream auf die richtige Länge kürzen.

* in die struktur von so_document_send_api1 umwandeln.
      ld_size = 255. "Vielleicht vorher noch die Zeilenlänge ermitteln, damit man das Coding universal verwenden kann
      WHILE ld_stream IS NOT INITIAL.
        APPEND INITIAL LINE TO hexbin ASSIGNING <ls_line>.
        <ls_line> = ld_stream.
        SHIFT ld_stream BY ld_size PLACES LEFT IN BYTE MODE.
      ENDWHILE.

Wie wäre es denn richtig?

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von bvdgey (ForumUser / 2 / 0 / 0 ) »
Guten Morgen,

das Ganze hat mal funktioniert? Dann den Code nicht ändern. Wegen UNICODE die Angabe der Größe des Anhangs (vermutlich irgendwo berechnet) ändern. Zum Testen z.B. die Größe 120 kb einfach mal auf 500 kb (mindestens das Doppelte - genaue Formel für PDF kenne ich nicht) setzen. Dann sollte es wieder funktionieren ! Hat s geklappt, dann mal schauen ob der ARCHIVOBJECT_GET_TABLE nicht schon die richtige Größe liefert.

LG Bernhard

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von alanio (ForumUser / 17 / 0 / 0 ) »
Hallo Bernhard,

meinst Du das Feld packing_list-doc_size? Wenn ja, dann gibt es mitlerweile einen Hinweis von SAP und auch die Empfehlung des SAP-Mitarbeiters, das man dieses Feld gar nicht mehr übergeben soll.
Hat leider gar keinen Einfluß auf das Ergebnis.

Ich habe nun auch schon statt dem FB die Klasse cl_document_bcs verwendet. Die Mail wird erzeugt und das PDF funktioniert wieder nicht.
Deshalb glaube ich mitlerweile, das es am lesen des Archivdokuments liegt, habe aber immer noch keine Idee wie ich das genau eingrenzen kann.

LG
Antje

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von a-dead-trousers (Top Expert / 4457 / 227 / 1198 ) »
alanio hat geschrieben:Als Zeilentyp der Tabelle "BINARCH_OBJ" wurde ein byteartiges Feld
erwartet.
Hoppla! Ja, stimmt es handelt sich um eine Struktur und das funktioniert bei IN BYTE MODE nicht so wie gewünscht.

Code: Alles auswählen.

FIELD-SYMBOLS:
  <ls_binary>         TYPE TBL1024.

* Ergebnis von ARCHIVOBJECT_GET_TABLE verarbeiten
CLEAR ld_stream.
LOOP AT <BINARCHIVOBJECT> ASSIGNING <ls_binary>.
  CONCATENATE ld_stream <ls_binary>-line INTO ld_stream IN BYTE MODE.
ENDLOOP.
ld_stream = ld_stream(<LENGTH>). "Den Stream auf die richtige Länge kürzen.
lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von a-dead-trousers (Top Expert / 4457 / 227 / 1198 ) »
Und bei <LENGTH> meinte ich die (Bin-)Länge die von ARCHIVOBJECT_GET_TABLE zurückgegeben wird und NICHT 255!!!
In deinem Fall die Variable "binlength"
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von bvdgey (ForumUser / 2 / 0 / 0 ) »
Hallo Antje,

also bei mir kam nach dem Versenden eines PDFs die gleiche Fehlermeldung beim Versuch den Anhang zu öffnen - und die Anpassung der Größe hat dies behoben.
Vielleicht testest Du mal, ob Du überhaupt ein PDF versenden kannst (eins hochladen und dann mailen) - so kannst Du das Problem wenigstens mit Sicherheit eingrenzen.

LG Bernhard

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von alanio (ForumUser / 17 / 0 / 0 ) »
Hallo,

nun sieht das Coding wie folgt aus:

Code: Alles auswählen.

DATA: arch_obj TYPE TABLE OF docs WITH HEADER LINE,
      binarch_obj TYPE TABLE OF tbl1024. " WITH HEADER LINE.
DATA: hexbin  TYPE solix_tab.
DATA: input_length TYPE i.
DATA: binlength TYPE sapb-length.

DATA:
  ld_size TYPE i,
  ld_stream TYPE xstring.
FIELD-SYMBOLS:
  <ls_line> TYPE xsequence,
<ls_binary> TYPE tbl1024.

START-OF-SELECTION.

      CALL FUNCTION 'ARCHIVOBJECT_GET_TABLE'
        EXPORTING
          archiv_id                      = 'A2'
          document_type                  = 'PDF'
          archiv_doc_id                  = '201108216395145275A075A3D443D44AC0071E'
*   ALL_COMPONENTS                 =
*   SIGNATURE                      = 'X'
*   COMPID                         = 'data'
       IMPORTING
*     length                         = length
          binlength                      = binlength
       TABLES
         archivobject                   = arch_obj
         binarchivobject                = binarch_obj
       EXCEPTIONS
         error_archiv                   = 1
         error_communicationtable       = 2
         error_kernel                   = 3
         OTHERS                         = 4
                .
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.


* Ergebnis von ARCHIVOBJECT_GET_TABLE verarbeiten
      CLEAR ld_stream.
      LOOP AT binarch_obj ASSIGNING <ls_binary>.
        CONCATENATE ld_stream <ls_binary>-line INTO ld_stream IN BYTE MODE.
      ENDLOOP.

      ld_stream = ld_stream(binlength). "Den Stream auf die richtige Länge kürzen.
* in die struktur von so_document_send_api1 umwandeln.
      WHILE ld_stream IS NOT INITIAL.

        APPEND INITIAL LINE TO hexbin ASSIGNING <ls_line>.
        <ls_line> = ld_stream.
        SHIFT ld_stream BY ld_size PLACES LEFT IN BYTE MODE.
      ENDWHILE.
jetzt bekomme ich die Meldung

Der Zeilentyp der Tabelle "HEXBIN" ist nicht kompatibel zum Typ des
Feldsymbols "<LS_LINE>".

Irgendwie stell ich mich wohl zu doof an. Ich tu mich einfach schwer.

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von a-dead-trousers (Top Expert / 4457 / 227 / 1198 ) »
Upsi, schon wieder mein Fehler: HEXBIN ist ja eine Struktur und XSEQUENCE ist nur ein Datenfeld.
Nimm einfach statt XSEQUENCE den Datentyp ANY oder besser gleich den Zeilentyp der Tabelle (SOLIX).

Die Zuweisung musst du dann bei SOLIX auch wie folgt ändern:

Code: Alles auswählen.

<ls_line> = ld_stream. 
*wird zu
<ls_line>-line = ld_stream.
lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: SO_DOCUMENT_SEND_API1 Archivdokument als PDF versenden

Beitrag von alanio (ForumUser / 17 / 0 / 0 ) »
Ich kann nur sagen: ES GEEEEHT :o)))))

Hier noch mal das gesamte, funktionierende Coding

Code: Alles auswählen.

DATA: arch_obj TYPE TABLE OF docs WITH HEADER LINE,
      binarch_obj TYPE TABLE OF tbl1024. " WITH HEADER LINE.
DATA: hexbin  TYPE solix_tab.
DATA: input_length TYPE i.
DATA: binlength TYPE sapb-length.

DATA:
  ld_size TYPE i,
  ld_stream TYPE xstring.
FIELD-SYMBOLS:
  <ls_line> TYPE solix,
<ls_binary> TYPE tbl1024.

START-OF-SELECTION.
 
     CALL FUNCTION 'ARCHIVOBJECT_GET_TABLE'
        EXPORTING
          archiv_id                      = 'A2'
          document_type                  = 'PDF'
          archiv_doc_id                  = '201108216395145275A075A3D443D44AC0071E'
*   ALL_COMPONENTS                 =
*   SIGNATURE                      = 'X'
*   COMPID                         = 'data'
       IMPORTING
*     length                         = length
          binlength                      = binlength
       TABLES
         archivobject                   = arch_obj
         binarchivobject                = binarch_obj
       EXCEPTIONS
         error_archiv                   = 1
         error_communicationtable       = 2
         error_kernel                   = 3
         OTHERS                         = 4
                .
      IF sy-subrc <> 0.
        MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
      ENDIF.

CLEAR ld_stream.
LOOP AT binarch_obj ASSIGNING <ls_binary>.
  CONCATENATE ld_stream <ls_binary>-line INTO ld_stream IN BYTE MODE.
ENDLOOP.

ld_stream = ld_stream(binlength). "Den Stream auf die richtige Länge kürzen.
* in die struktur von so_document_send_api1 umwandeln.
      ld_size = 255.
      WHILE ld_stream IS NOT INITIAL.
         APPEND INITIAL LINE TO hexbin ASSIGNING <ls_line>.
         <ls_line>-line = ld_stream.
        SHIFT ld_stream BY ld_size PLACES LEFT IN BYTE MODE.
      ENDWHILE.
Was noch interessant ist:

Wenn man binarch_obj mit gui_download speichert und dann mit gui_upload die daten in hexbin schreibt, geht das auch.
Ist zwar nichts für Hintergrundverarbeitung, aber da konnte ich wenigstens mal testen, ob der ARCHIVOBJECT_GET_TABLE richtige Daten liefert.

Danke noch mal an alle :o)

Seite 1 von 1

Vergleichbare Themen

5
Antw.
2656
Views
Archivdokument in externer Software anzeigen
von McCauchy » 10.09.2013 14:34 • Verfasst in ABAP® Core
0
Antw.
1631
Views
Send EXPRES SAP MAIL
von Anita57 » 30.07.2013 13:19 • Verfasst in ABAP® für Anfänger
4
Antw.
2501
Views
Send query as attachment by email
von Fistandantilus » 24.07.2013 08:33 • Verfasst in ABAP® für Anfänger
0
Antw.
2703
Views
DOCUMENT VIEWER
von SAP_ENTWICKLER » 17.01.2015 15:34 • Verfasst in ABAP® Core
0
Antw.
3242
Views
Document Viewer
von joffi68 » 17.07.2007 14:29 • Verfasst in Basis

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

IBAN und BUT0BK
Gestern von waltersen gelöst 8 / 9051
Splitter-AlV erscheint nicht
Gestern von qyurryus 2 / 1601

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.