Skip to Content
1
Jul 12, 2018 at 06:24 AM

Dokumenteninfosatz (DIS) drucken DIN A4

407 Views

Hallo,

ich möchte einen Funktionsbaustein erstellen, der zu einem Fertigungsauftrag die DIS der angegebenen Dokumentenart dokar druckt. In diesem speziellen Fall geht es um Schaltpläne, die i.d.R. größer als ein DIN A4-Blatt sind. Folgendes macht der Baustein:

  • alle DIS auslesen
  • relevante DIS selektieren und auschecken
  • Spool-Auftrag erzeugen
  • Ausgecheckte DIS dem Spool-Auftrag anfügen
  • Spool-Auftrag abschließen

Nun zu meinem Problem:

Mein Beispielauftrag hat zwei Schaltpläne. Der erste Schaltplan wird auf DIN A3-Papier im Hochformat gedruckt und der zweite auf DIN A4-Papier im Hochformat. Vorgesehen ist eigentlich für alle Pläne DIN A4-Papier im Querformat.

Wenn ich die Auswahl von Papier und Format dem Adobe Reader überlasse, wird Plan 1 auf DIN A3 und Plan 2 auf DIN A4 gedruckt. Beide im Querformat. Ich habe schon geschaut, ob ich den verwendeten Funktionsbausteinen weitere Parameter dazu mitgeben kann (Fehlanzeige) und den Drucker mithilfe einer XDC-Datei zu steuern (ebenfalls nichts). Meine letzte Idee ist, einen Ausdruck auf einem Gerät, das nur DIN A4 Papier verwendet, zu versuchen. Bin allerdings noch nicht dazu gekommen. Ich vermute aber, dass dann im Hochformat gedruckt wird.

Code meines Funktionsbausteins:

* alle Dokumenteninfosätze auslesen
  CALL FUNCTION 'CO_DM_AFDLD_READ_KEY'
    EXPORTING
      i_aufnr  = aufnr
    TABLES
      et_afdld = lt_afdld.

* Identifizieren der Dokumente der Dokumentenart dokar
  LOOP AT lt_afdld INTO ls_afdld WHERE dokar = dokar.

    lv_bapi_doctype     = ls_afdld-dokar.
    lv_bapi_docnumber  = ls_afdld-doknr.
    lv_bapi_docpart     = ls_afdld-doktl.
    lv_bapi_docversion  = ls_afdld-dokvr.
    ls_documentfile-wsapplication = 'PDF'.

    CONCATENATE c_path sy-sysid '\' INTO lv_docpath.

    CALL FUNCTION 'BAPI_DOCUMENT_CHECKOUTVIEW2'
      EXPORTING
        documenttype        = lv_bapi_doctype
        documentnumber      = lv_bapi_docnumber
        documentpart        = lv_bapi_docpart
        documentversion     = lv_bapi_docversion
        documentfile        = ls_documentfile
        originalpath        = lv_docpath
      TABLES
        documentfiles       = lt_documentfiles.

    APPEND LINES OF lt_documentfiles TO lt_docfiles.
    CLEAR lt_documentfiles.
  ENDLOOP.

* Spool-Auftrag öffnen
  CLEAR ev_retcode.
  CALL FUNCTION 'ADS_SR_OPEN'
    EXPORTING
      dest            = 'TEST'
      doctype         = 'ADSP'
      copies          = 1
      immediate_print = ' ' "'X'
      auto_delete     = ' '
    IMPORTING
      handle          = lv_handle
      spoolid         = lv_spoolid
      partname        = lv_partname
    EXCEPTIONS
      OTHERS          = 1.
  IF sy-subrc NE 0.
    ev_retcode = 4.
    RETURN.
  ENDIF.

* Verzeichnis für Einzeldateien des Spool-Auftrags
  CLEAR lv_globaldir.
  CALL FUNCTION 'ADS_GET_PATH'
    IMPORTING
      ads_path = lv_globaldir.

* Inhalt des Spool-Auftrags ermitteln
  CLEAR ls_docfile.
  LOOP AT lt_docfiles INTO ls_docfile.

    lv_docfile = ls_docfile-docfile.

    OPEN DATASET lv_docfile FOR INPUT IN BINARY MODE.
    IF sy-subrc = 0 .
      READ DATASET lv_docfile INTO lv_data.
      lv_file_exists = 'X'.
    ELSE.
      lv_file_exists = ''.
    ENDIF.
    CLOSE DATASET lv_docfile.

    IF lv_file_exists = abap_true.
      CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
        EXPORTING
          buffer     = lv_data
        TABLES
          binary_tab = lt_file.

* PDF erzeugen
      "MOVE gv_document TO lv_document.

      CLEAR: lv_dstfile, lv_filename.
      CONCATENATE lv_globaldir '\' lv_partname '.pdf' INTO lv_dstfile.
      lv_filename = |{ lv_partname }.pdf|.

      CALL FUNCTION 'ADS_WRITE_TO_FILE'
        EXPORTING
          filename                     = lv_filename
          buffer                       = lv_data
          client                       = sy-mandt
        EXCEPTIONS
          OTHERS                       = 11.

* PDF dem Spool-Auftrag hinzufügen
      lv_filesize = xstrlen( lv_data ).
      lv_pages = 1.

      CALL FUNCTION 'ADS_SR_CONFIRM'
        EXPORTING
          handle       = lv_handle
          partname     = lv_partname
          size         = lv_filesize
          pages        = lv_pages
          no_pdf       = ' '
        IMPORTING
          new_partname = lv_partname
        EXCEPTIONS
          OTHERS       = 1.
      IF sy-subrc NE 0.
        ev_retcode = 4.
        RETURN.
      ENDIF.

    ENDIF.

    CLEAR: lv_data, lt_file, lv_docfile, ls_docfile.
  ENDLOOP.
* Spool-Auftrag schließen
  CALL FUNCTION 'ADS_SR_CLOSE'
    EXPORTING
      handle = lv_handle
    EXCEPTIONS
      OTHERS = 1.
  IF sy-subrc NE 0.
    ev_retcode = 4.
    RETURN.
  ENDIF.