Ablage von Spoolaufträgen als Original im DMS

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Ablage von Spoolaufträgen als Original im DMS

Beitrag von Thomas R. (Expert / 765 / 80 / 38 ) »
Einen wunderschönen guten Tag!

Grobe Aufgabenbescheibung: Ein Programm erzeugt im Batch Spoolaufträge, die an einen Dokuinfosatz als Original angehängt werden sollen. Eine Ablage auf dem Filesystem ist vom Businessprozess her nicht notwendig.

Mein Problem ist, dass ich bisher keine Möglichkeit gefunden habe Originale an Dokuinfosätze als Stream o.ä. zu übergeben, immer nur per physischer Datei.

Wer eine Lösung (Fuba/Methode oder was auch immer) dafür kennt möge sie bitte in diesem Thread offenlegen.
Und wer sich sicher ist, dass immer eine physische Datei vorliegen muss, der möge auch dieses dokumentieren.

Ich hoffe auf Lösungen.

Hinweis: Copilot erzählt mir nur Mist in diesem Bereich.

MfG
Thomas R.

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


Re: Ablage von Spoolaufträgen als Original im DMS

Beitrag von whaslbeck (ForumUser / 79 / 21 / 11 ) »
Hallo,

vorneweg: vergiss Copilot oder andere LLMs wenn es um ABAP Entwicklung geht. Es gibt einfach zu wenig (gutes) Trainingsmaterial im (öffentlich zugänglichen) Internet. Da kommt nur Bullshit raus.

zum Thema: bin mir ziemlich sicher dass das geht, hab da vor Jahren mal was gemacht, hab aber grad keinen Zugriff auf die Sourcen. Schau dir mal das Beispiel hier an => https://codezentrale.de/abap-dms-dateie ... oc_create/

Und falls es tatsächlich nicht gehen sollte, kannst du ja immer noch das binary deines Spoolauftrags in ein (temporäres) File auf dem ApplicationServer schreiben und das dann an den DIS anhängen (und das tempfile wieder löschen).

Folgende Benutzer bedankten sich beim Autor whaslbeck für den Beitrag:
Thomas R.


Re: Ablage von Spoolaufträgen als Original im DMS

Beitrag von rob_abc (Specialist / 148 / 40 / 59 ) »
whaslbeck hat geschrieben:
01.10.2025 18:04
vergiss Copilot oder andere LLMs wenn es um ABAP Entwicklung geht. Es gibt einfach zu wenig (gutes) Trainingsmaterial im (öffentlich zugänglichen) Internet. Da kommt nur Bullshit raus.
kleine code snippets funktionieren ganz gut. wenn man der llm sagt, dass sie clean abap schreiben soll, funktioniert sogar das.

Re: Ablage von Spoolaufträgen als Original im DMS

Beitrag von Thomas R. (Expert / 765 / 80 / 38 ) »
Danke, werde ich testen

Re: Ablage von Spoolaufträgen als Original im DMS

Beitrag von msfox (Specialist / 398 / 61 / 78 ) »
whaslbeck hat geschrieben:
01.10.2025 18:04
vorneweg: vergiss Copilot oder andere LLMs wenn es um ABAP Entwicklung geht.
Dem kann ich nur zustimmen. Ich hab das auch paar mal probiert. Da werden Methoden und FuBas vorgschlagen, die es gar nicht gibt. Bemängelt man dies, wir sich entschuldigt und neue nicht vorhanden Methode oder Fubas vorschlagen.
Eigentlich Zeitverschwendung sich damit zu beschäftigen.
Beim Coding ist eigentlich auch das Problem, dass da auch fachliche Dinge mit reinspielen oder man vorhandenes Coding erweitern soll. Sowas kennt die KI aber nicht.

Re: Ablage von Spoolaufträgen als Original im DMS

Beitrag von Thomas R. (Expert / 765 / 80 / 38 ) »
Hallo zusammen,
Danke, es hat geklappt.
Anbei ein Testprogramm ohne vernünftige Fehlerbehandlung usw.
Es ermöglicht das Anhängen eines PDF-Originals an einen Doku-Info-Satz von einer Datei auf dem Applikationsserver oder von einem Spoolauftrag.

Code: Alles auswählen.

REPORT zrt_spool_to_dms.

PARAMETERS P_spool TYPE tsp01-rqident.
PARAMETERS P_file TYPE text255.

PARAMETERS p_dokar TYPE dokar OBLIGATORY.
PARAMETERS p_doknr TYPE doknr OBLIGATORY.
PARAMETERS p_dokvr TYPE dokvr OBLIGATORY.
PARAMETERS p_doktl TYPE doktl_D OBLIGATORY.

CLASS lcx_failure DEFINITION INHERITING FROM cx_static_check FINAL.
  " Only for demonstration - use your own error classes
ENDCLASS.

CLASS lcl_doku_info_record DEFINITION FINAL.
  PUBLIC SECTION.
    TYPES svt_file_with_path TYPE text255.

    METHODS constructor
      IMPORTING iv_dokar TYPE dokar
                iv_doknr TYPE doknr
                iv_dokvr TYPE dokvr
                iv_doktl TYPE doktl_d.

    METHODS add_pdf_from_appl_server
      IMPORTING iv_file_with_path TYPE svt_file_with_path
                iv_filename       TYPE filep
                iv_description    TYPE cV_FILE_DESCRIPTION
                iv_storage_cat    TYPE cv_storage_cat
      RAISING   lcx_failure.

    METHODS add_pdf_from_spoolid
      IMPORTING iv_spoolid     TYPE rspoid
                iv_filename    TYPE filep
                iv_description TYPE cV_FILE_DESCRIPTION
                iv_storage_cat TYPE cv_storage_cat
      RAISING   lcx_failure.

  PRIVATE SECTION.
    DATA av_dokar TYPE dokar.
    DATA av_doknr TYPE doknr.
    DATA av_dokvr TYPE dokvr.
    DATA av_doktl TYPE doktl_d.

    METHODS read_app_file_into_xstring
      IMPORTING iv_file_with_path TYPE svt_file_with_path
      RETURNING VALUE(rv_result)  TYPE xstring.

    METHODS add_xstring_as_pdf
      IMPORTING iv_xstring     TYPE xstring
                iv_filename    TYPE filep
                iv_description TYPE cV_FILE_DESCRIPTION
                iv_storage_cat TYPE cv_storage_cat
      RAISING   lcx_failure.

    METHODS read_spool_into_xstring
      IMPORTING iv_spoolid       TYPE rspoid
      RETURNING VALUE(rv_result) TYPE xstring
      RAISING   lcx_failure.
ENDCLASS.

CLASS lcl_doku_info_record IMPLEMENTATION.
  METHOD constructor.
    av_dokar = iv_dokar. av_doknr = iv_doknr. av_dokvr = iv_dokvr. av_doktl = iv_doktl.
  ENDMETHOD.

  METHOD add_pdf_from_appl_server.
    add_xstring_as_pdf( iv_xstring     = read_app_file_into_xstring( iv_file_with_path = iv_file_with_path )
                        iv_filename    = iv_filename
                        iv_description = iv_description
                        iv_storage_cat = iv_storage_cat ).
  ENDMETHOD.

  METHOD read_app_file_into_xstring.
    OPEN DATASET iv_file_with_path FOR INPUT IN BINARY MODE.
    READ DATASET iv_file_with_path INTO rv_result.
    CLOSE DATASET iv_file_with_path.
  ENDMETHOD.

  METHOD add_xstring_as_pdf.
    TYPES: BEGIN OF ls_orblk,
             orblk TYPE orblk,
           END OF ls_orblk,
           ztype_orblk TYPE STANDARD TABLE OF ls_orblk WITH EMPTY KEY.

    DATA lv_length  TYPE i.
    DATA lt_binary  TYPE ztype_orblk.
    DATA ls_content TYPE drao.
    DATA lt_content TYPE dms_tbl_drao.
    DATA ls_message TYPE messages.

    " Conversion
    CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
      EXPORTING
        buffer        = iv_xstring
      " APPEND_TO_TABLE = ' '
      IMPORTING
        output_length = lv_length
      TABLES
        binary_tab    = lt_binary.
    ls_content = VALUE #( dokar = p_dokar
                          doknr = p_doknr
                          dokvr = p_dokvr
                          doktl = p_doktl
                          appnr = '1'
                          orbkl = 2550 ) ##NUMBER_OK.
    LOOP AT lt_binary[] ASSIGNING FIELD-SYMBOL(<ls_binary>).
      ls_content-orblk = <ls_binary>-orblk.
      ls_content-zaehl = sy-tabix.
      ls_content-orln  = lv_length.
      INSERT ls_content INTO TABLE lt_content[].
    ENDLOOP.

    " add content as a pdf original
    DATA(lt_files_x) = VALUE cvapi_tbl_doc_files( ( storage_cat    = iv_storage_cat
                                                    dappl          = 'PDF'
                                                    description    = iv_description
                                                    updateflag     = abap_true
                                                    filename       = iv_filename
                                                    appnr          = '1'
                                                    active_version = abap_true
                                                    checked_in     = abap_true ) ).

    CALL FUNCTION 'CVAPI_DOC_CHECKIN'
      EXPORTING
        pf_dokar           = av_dokar
        pf_doknr           = av_doknr
        pf_dokvr           = av_dokvr
        pf_doktl           = av_doktl
      " PS_DOC_STATUS      =
      " PF_FTP_DEST        = ' '
      " PF_HTTP_DEST       = ' '
      " PF_HOSTNAME        = ' '
      " PS_API_CONTROL     =
      " PF_REPLACE         = ' '
        pf_content_provide = 'TBL'
      IMPORTING
        psx_message        = ls_message
      TABLES
        pt_files_x         = lt_files_x
      " PT_COMP_X          =
        pt_content         = lt_content[].

    IF ls_message IS NOT INITIAL.
      RAISE EXCEPTION TYPE lcx_failure.
*   ELSE.
      " NOP
    ENDIF.
  ENDMETHOD.

  METHOD add_pdf_from_spoolid.
    add_xstring_as_pdf( iv_xstring     = read_spool_into_xstring( iv_spoolid = iv_spoolid )
                        iv_filename    = iv_filename
                        iv_description = iv_description
                        iv_storage_cat = iv_storage_cat ).
  ENDMETHOD.

  METHOD read_spool_into_xstring.
    CLEAR rv_result.

    CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
      EXPORTING
        src_spoolid          = iv_spoolid
        no_dialog            = abap_true
        get_size_from_format = abap_true
        pdf_destination      = 'X' " stream
      IMPORTING
        bin_file             = rv_result
      EXCEPTIONS
        OTHERS               = 99.
    IF sy-subrc IS NOT INITIAL.
      RAISE EXCEPTION TYPE lcx_failure.
*   ELSE.
      " NOP
    ENDIF.
  ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
  PERFORM s_o_s.

FORM s_o_s.
  DATA lo_dir TYPE REF TO lcl_doku_info_record.

  lo_dir = NEW #( iv_dokar = p_dokar
                  iv_doknr = p_doknr
                  iv_dokvr = p_dokvr
                  iv_doktl = p_doktl ).
  IF p_fILE IS NOT INITIAL.
    TRY.
        lo_dir->add_pdf_from_appl_server( iv_file_with_path = p_file
                                          iv_filename       = |{ 'C:\temp\File_Attached' }{ '.pdf' }|
                                          iv_description    = |{ sy-uzeit } { 'File-Demo' }| ##NO_TEXT
                                          iv_storage_cat    = 'DMS_GRZ' ).
      CATCH lcx_failure.
        WRITE / 'Failure in ADD_PDF_FROM_APPL_SERVER' ##NO_TEXT.
    ENDTRY.
* ELSE.
    " NOP
  ENDIF.
  IF p_spool IS NOT INITIAL.
    TRY.
        lo_dir->add_pdf_from_spoolid( iv_spoolid     = p_spool
                                      iv_filename    = |{ 'C:\temp\Spool_Attached' }{ '.pdf' }|
                                      iv_description = |{ sy-uzeit } { 'Spool-Demo' }| ##NO_TEXT
                                      iv_storage_cat = 'DMS_GRZ' ).
      CATCH lcx_failure.
        WRITE / 'Failure in ADD_PDF_FROM_SPOOLID' ##NO_TEXT.
    ENDTRY.
* ELSE.
    " NOP
  ENDIF.
  WRITE / 'End-Of-Demo' ##NO_TEXT.
ENDFORM.
MfG
Thomas R.

Folgende Benutzer bedankten sich beim Autor Thomas R. für den Beitrag (Insgesamt 2):
rob_abcwhaslbeck


Re: Ablage von Spoolaufträgen als Original im DMS

Beitrag von msfox (Specialist / 398 / 61 / 78 ) »
Was war die Schlüsselstelle im Coding?
Der Fuba "CVAPI_DOC_CHECKIN" oder das bestimmen des Spool als PDF?
Ein Programm erzeugt im Batch Spoolaufträge, die an einen Dokuinfosatz als Original angehängt werden sollen.
An der Stelle war mein Verständnisproblem, was du mit "Original" meinst. Aber wenn ein PDF auch als "Original" betrachtet wird, ging es sicher nur um das Anhängen selbst. Denn der Spool liegt sicher nicht als PDF im SAP. Du formst in also als PDF um womit er kein Original mehr ist.
Mein Problem ist, dass ich bisher keine Möglichkeit gefunden habe Originale an Dokuinfosätze als Stream o.ä. zu übergeben, immer nur per physischer Datei.
Hast du für die physische Datei auch noch ein Codespnipsen?
--
Hintergrund meiner Fragen:
- Wenn du eine physische Datei hast, gibst du vermutlich den Pfad und Namen der Datei auf dem Server mit?
- In deinem Fall übergibst du einen Binärstream an das DMS.
- Vermutlich wird bei einer physischen Datei auch nur ein Binärstream erzeugt und dann an das DMS gegeben. Außer, im DMS wird nur ein Link abgelegt.

Re: Ablage von Spoolaufträgen als Original im DMS

Beitrag von Thomas R. (Expert / 765 / 80 / 38 ) »
Hallo msfox,
der Hauptpunkt war die korrekte Parametrisierung vom CVAPI_DOC_CHECKIN.
SAP bezeichnet die angehängten Dateien in der CV0xN als Originale. Deshalb habe ich diese Nomenklatur übernommen.
Bisher habe ich per Programm immer nur Dateien aus dem DMS ausgelesen. Zum Ablegen von Dateien würde ich die Verwendung von BAPI_DOCUMENT_CHECKIN2 versuchen.

MfG
Thomas R.

Folgende Benutzer bedankten sich beim Autor Thomas R. für den Beitrag:
msfox


Seite 1 von 1

Vergleichbare Themen

0
Antw.
1867
Views
Original in einem Dokumenteninfosatz ändern
von ergocanis » 13.11.2023 17:08 • Verfasst in ABAP® für Anfänger
0
Antw.
2234
Views
IView-Link auf DMS-Original und Dokument
von shapoc » 10.05.2006 10:26 • Verfasst in Java & SAP®
0
Antw.
1520
Views
Original zu Dokument aus interner Tabelle anlegen
von shapoc » 20.09.2006 11:01 • Verfasst in SAP - Allgemeines
7
Antw.
5954
Views
Ablage von Anhängen
von Mark33 » 25.09.2013 21:38 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Aktuelle Forenbeiträge

Ablage von Spoolaufträgen als Original im DMS
vor 2 Stunden von Thomas R. gelöst 8 / 210
Berechtigungsprüfung
Gestern von Thomas R. 4 / 89
Summensymbol mit ALV-Grid
vor einer Woche von ewx 2 / 362
Arbeitstage von einer Person ermitteln
vor einer Woche von Bright4.5 3 / 1316

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.

Aktuelle Forenbeiträge

Ablage von Spoolaufträgen als Original im DMS
vor 2 Stunden von Thomas R. gelöst 8 / 210
Berechtigungsprüfung
Gestern von Thomas R. 4 / 89
Summensymbol mit ALV-Grid
vor einer Woche von ewx 2 / 362
Arbeitstage von einer Person ermitteln
vor einer Woche von Bright4.5 3 / 1316