Aus SAP Hana Cloud Plattform wird SAP Cloud Platform

Auf dem Mobile World Congress, der vom 27. Februar bis 2. März in Barcelona stattgefunden hat, stellt die SAP neue Funktionen und Erweiterungen für die SAP Cloud Platform vor. Die Lösung – bisher unter dem Namen SAP HANA Cloud Platform (HCP) bekannt – umfasst zahlreiche neue Business Services.

Die SAP Cloud Platform bietet Anwendern die Möglichkeit Dienste zu entwickeln und diese mit den verschiedensten Backend-Systemen zu verknüpfen.

Die SCP soll die Entwicklung neuer Anwendungen vereinfachen. Zudem soll sie eine schnellere Erweiterung und Integration von SAP-Anwendungen ermöglichen und die Basis für innovative Szenarien für das Internet der Dinge (Internet of Things, IoT) bilden.

Die SAP Cloud Platform wurde um die folgenden neuen Services erweitert:

  • Das SAP Cloud Platform SDK for iOS
  • Die mobile Anwendung Project Companion
  • Der SAP API Business Hub
  • SAP Cloud Platform Workflow
  • SAP Cloud Platform Virtual Machines
  • SAP Cloud Platform IoT Service
  • SAP Cloud Platform Big Data Services

Quelle: http://news.sap.com

Automatische Programmausführung nach Transport

Erstellt man in SAP neue Routinen mit Hilfe der Transaktion VOFM, muss im Zielsystem das Programm RV80HDGEN ausgeführt werden, damit die Routinen generiert werden.

Dies kann man manuell nach dem erfolgten Transport durchführen. Es gibt aber auch eine schickere Lösung.

Hierfür nimmt man in den entsprechenden Transportauftrag / die entsprechende Transportaufgabe ein neues Objekt auf.

Programm-ID: R3TR
Objekttyp: XPRAObjektname: RV80HGEN

Das Programm RV80HGEN wird dann automatisch beim Import des Transportes ausgeführt.

PDF Druck mit mehreren Parts

Die Aufgabenstellung des Kunden bestand darin, dass ein Druck einer Auftragsbestätigung ausgegeben werden sollte. Im Anschluss sollten im DMS abgelegte PDF Dokumente mit ausgegegeben werden.

Der erste Ansatz führte daher über die Funktionsbausteine CV120_DOC_CHECKOUT_VIEW und CV120_START_APPLICATION. Diese wurden nach dem Druck der AB angestoßen und führten dazu, dass die PDF Dokumente im Adobe Reader angezeigt und gedruckt werden konnten.

Dies war zum Einen sehr arbeitsintensiv für die Anwender, zum anderen war so nicht die Reihenfolge der Ausdrucke garantiert, da die Ausgabe auf einem Netzwerkdrucker erfolgen sollte.

Es musste also eine andere Lösung her. *hirn* *hirn* *google* *google*

Der zweite Ansatz führte zum Erfolg. Es musste ein PDF-Spoolauftrag erzeugt werden, der alle zu druckenden Dokumente aufnimmt. Vorraussetzung hierfür ist natürlich der Adobe Document Service. Nach etlichen Tagen war es dann vollbracht.

  • Die Dokumente wurden gelesen.

*———————————————————————-
* Dokumentendatei lesen
*———————————————————————-

CALL FUNCTION ‚CV120_KPRO_MASTER_DATA_GET‘
EXPORTING
pf_dokar            ls_drawdokar
pf_doknr            ls_drawdoknr
pf_dokvr            ls_drawdokvr
pf_doktl            ls_drawdoktl
*         PF_ACTIVE_ONLY      = ‚ ‚
*         PF_ACTIVE_ATTR_ONLY = ‚ ‚
*         PF_COMP_GET         = ‚X‘
TABLES
ptx_data            lt_dms_tbl_file
EXCEPTIONS
not_found           1
error               2
OTHERS              3.
IF sysubrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

 

  • Die Daten der Dokumente wurden geladen.

*———————————————————————-
* Daten des Dokuments laden
*———————————————————————-
CLEAR ls_phio_object.

SELECT SINGLE phio_id ph_class INTO (ls_phio_objectobjid ,ls_phio_objectclass)
FROM dms_ph_cd1
WHERE loio_id ls_dms_phiolo_objid.

DATA:lv_xstr TYPE xstring,
ls_xmlr TYPE sdokcntbin,
lo_conv TYPE REF TO cl_abap_conv_obj.

DATA lt_file_info TYPE TABLE OF sdokfilaci.
DATA ls_file_info TYPE sdokfilaci.

CALL FUNCTION ‚SDOK_PHIO_LOAD_CONTENT‘
EXPORTING
object_id           ls_phio_object
client              symandt
TABLES
file_content_binary lt_file_content_binary
file_access_info    lt_file_info
EXCEPTIONS
not_existing        1
not_authorized      2
no_content          3
bad_storage_type    4
OTHERS              5.

 

  • Größe und Name ermitteln / Daten konvertieren

*———————————————————————-
* Größe des Dokuments ermitteln
*———————————————————————-
ls_dms_pdfstrattsize ls_file_infofile_size.

CREATE OBJECT lo_conv.
LOOP AT lt_file_content_binary INTO ls_xmlr.
CALL METHOD lo_conv->convert
EXPORTING
inbuff    ls_xmlr
outbufflg 25000
IMPORTING
outbuff   lv_xstr.
CONCATENATE lv_xstring lv_xstr INTO lv_xstring IN BYTE MODE.
ENDLOOP.

*———————————————————————-
* Daten des Dokuments in XSTRING konvertieren
*———————————————————————-
CALL METHOD cl_bcs_convert=>xstring_to_solix
EXPORTING
iv_xstring lv_xstring
RECEIVING
et_solix   ls_dms_pdfstrsolixtab.

*———————————————————————-
* Name des Dokuments ermitteln
*———————————————————————-
SELECT SINGLE filename
INTO ls_dms_pdfstratttitle
FROM dms_doc_files
WHERE dokar ls_drawdokar
AND  doknr ls_drawdoknr
AND  dokvr ls_drawdokvr
AND  doktl ls_drawdoktl.

APPEND ls_dms_pdfstr TO e_dms_pdftab.

Dann musste das alles noch in den PDF Spoolauftrag gepackt werden:

************************************************
* ADS Spoolauftrag öffnen
************************************************
CALL FUNCTION ‚ADS_SR_OPEN‘
EXPORTING
dest             nastldest
*     ldest            = nast-ldest
name             nastdsnam
suffix1          nastdsuf1
suffix2          nastdsuf2
copies           lv_copies
immediate_print  nastdimme
auto_delete      nastdelet
titleline        nasttdcovtitle
receiver         nasttdreceiver
division         nasttddivision
authority        nasttdautority
append           abap_true
lifetime         ‚8‘
doctype          ‚ADSP‘
IMPORTING
handle           lv_handle
spoolid          lv_spoolid
partname         lv_partname
EXCEPTIONS
device_missing   1
no_such_device   2
operation_failed 3
wrong_doctype    4
wrong_devicetype 5
OTHERS           6.
IF sysubrc NE 0.
ev_retcode 4.
RETURN.
ENDIF.

CONCATENATE lv_partname ‚.pdf‘ INTO lv_filename.

 

 

* PDF in Spool schreiben
CALL FUNCTION ‚ADS_WRITE_TO_FILE‘
EXPORTING
filename                     lv_filename
buffer                       lv_xstring
append                       ‚X‘
EXCEPTIONS
cannot_open_file             1
open_dataset_no_authority    2
open_dataset_internal_error  3
open_dataset_too_many_files  4
dataset_cant_close           5
close_dataset_internal_error 6
cannot_close_file            7
cannot_transfer_data         8
transfer_internal_error      9
dataset_write_error          10
OTHERS                       11.
IF sysubrc NE 0.
ev_retcode 4.
RETURN.
ENDIF.

* PDF Größe ermitteln
CLEARlv_sizelv_pageslv_new_partname.
lv_size     xstrlenlv_xstring ).
lv_pages    gv_resulttdpages.

** ADS_CREATE_PDF_SPOOLJOB
*      lv_total_pages = lv_total_pages + lv_pages.

* Schreiben einer Zeile in einen offenen ADS Spoolauftrag
CALL FUNCTION ‚ADS_SR_CONFIRM‘
EXPORTING
handle           lv_handle
partname         lv_partname
size             lv_size
pages            lv_pages
IMPORTING
new_partname     lv_new_partname
EXCEPTIONS
handle_not_valid 1
operation_failed 2
OTHERS           3.
IF sysubrc NE 0.
ev_retcode 4.
RETURN.
ENDIF.

CONCATENATE lv_new_partname ‚.pdf‘ INTO lv_filename.
lv_partname lv_new_partname.

 


CALL FUNCTION ‚ADS_SR_CLOSE‘
EXPORTING
handle lv_handle
final  ‚X‘
EXCEPTIONS
OTHERS 1.

 

 

Die Spooldatei mit mehreren Dokumenten konnte erfolgreich ausgegeben werden.

Fehler SMARTFORMS002 bei Smartforms

Bei Übernahmes eines älteren Smartforms (alte Tabellentechnik) in ein neues System SAP (ERP 7.40) trat beim generieren des Formulars der Fehler „SMARTFORMS002“ auf.

Dieser konnte gelöst werden, in dem der vorhandene Adressknoten gelöscht und neu angelegt wurde.

Danach ließ sich das Formular wieder ohne diesen Fehler generieren.

Zwischensumme im PDF Druckformular bilden

Aufgabenstellung:
Bilden einer Zwischensumme eines bestimmten Tabellenfeldes auf einer Folgeseite.

Hierzu benötigt man das folgende Scripting:

#data.Master_Page.NEXT.FORMNAME.FELDNAME::calculate - (JavaScript, both)
var fields = xfa.layout.pageContent(xfa.layout.page(this)-1, "field", 0);
var total = 0;
for (var i=0; i <= fields.length-1; i++) 
{
    if (fields.item(i).name == "FELDNAME") 
    {
    total = total + fields.item(i).rawValue;
    }
}
this.rawValue = total;

Dynamische Übergabe von Werten in eine Druckstruktur

Im Customizing der SAP IS-H Organisationsmittelverwaltung wird die Möglichkeit geboten, kundenspezifische Funktionsbausteine zu nutzen, mit der die Formularausgabe gesteuert wird.

Beispiel:

*   Customer-FuB aufrufen
     CALL FUNCTION print_rnfor-fbprint
       EXPORTING
         dialog        dialog
         i_rnexl       i_rnexl
         i_rnanz1      i_rnanz1
         nfal          nfal
         npat          ls_npat_pseudo    "EhP5 Pseudon
         i_rnf01       rnf01
         i_rnf02       rnf02
         i_rnf04       rnf04
         i_rnf05       rnf05
         i_rnf15       rnf15
         i_rnf19       rnf19
         i_tn01        i_tn01
         i_print_rnfor print_rnfor
       IMPORTING
         abbruch       abbruch
         print_error   print_error
       TABLES
         nbewtab       nbewtab
         ndiatab       ndiatab.

Da ich ein Fan der Übergabe einer schmalen, verschachtelten Druckstruktur (Felder, Strukturen, Tabellen in einer einzigen Struktur)  ans Formular bin, stelle sich mir die Aufgabe, diese Daten so einfach wie möglich in meine Druckstruktur zu übergeben.

Beispiel Formularschnittstelle:

Dazu bediente ich mich an der folgenden SAP Methode:

cl_fb_function_utility=>meth_get_interface

Mit dieser Methode lese ich die Schnittstellenparameter aus meinem kundenspezifischen Funktionsbaustein und der Formularschnittstelle.

* Lesen der Schnittstellenparameter
     CALL METHOD cl_fb_function_utility=>meth_get_interface
       EXPORTING
         im_name             lv_im_name
       IMPORTING
         ex_interface        E_INTERFACE
       EXCEPTIONS
         error_occured       1
         object_not_existing 2
         OTHERS              3.

Dann folgt noch die dynamische Übergabe:

*************************************************
 *  PDF Druck - Ermitteln der Importparameter
 *************************************************
   CALL METHOD zcl_form_druck=>get_import_params
     EXPORTING
       i_fm_name        lv_fm_name
       i_name_parameter 'I_PD'
       i_import_flg     abap_true
     IMPORTING
       e_import_params  ls_import_param.
 
   IF ls_import_param IS NOT INITIAL.
 
 *************************************************
 * Dynamische Referenz der Druckstruktur erstellen
 *************************************************
     CREATE DATA ls_ref TYPE (ls_import_param-structure).
     ASSIGN ls_ref->TO <fs_pd>.
 
     IF <fs_pd> IS ASSIGNED.
 
 *************************************************
 *  Komponenten der Druckstruktur lesen
 *************************************************
       CLEARlcl_struclt_comp[].
       lcl_struc ?= cl_abap_structdescr=>describe_by_data<fs_pd> ).
       lt_comp lcl_struc->get_components).
 
 *************************************************
 *  Formularschnittstelle dynamisch füllen
 *************************************************
       LOOP AT lt_comp ASSIGNING <fs_comp>.
 
         CLEAR lv_structure.
         lv_structure <fs_comp>-type->get_relative_name).
 
 *************************************************
 *  Importparameter dynamisch übergeben
 *************************************************
         LOOP AT ls_interface-import ASSIGNING <fs_parameter>
           WHERE structure lv_structure.
 
           ASSIGN (<fs_parameter>-parameterTO <fs_quelle>.
           ASSIGN COMPONENT <fs_comp>-name  OF STRUCTURE <fs_pd> TO <fs_ziel>.
 
 * Zuweisung durchführen
           IF <fs_quelle> IS ASSIGNED AND <fs_ziel> IS ASSIGNED.
             TRY.
                 <fs_ziel> <fs_quelle>.
             ENDTRY.
             UNASSIGN <fs_quelle>.
             UNASSIGN <fs_ziel>.
           ENDIF.
         ENDLOOP.
 
 **************************************************
 **  Tabellenparameter dynamisch übergeben
 **************************************************
         LOOP AT ls_interface-tables  ASSIGNING <fs_parameter>
           WHERE structure lv_structure.
 
           lv_tablename <fs_parameter>-parameter && '[]'.
           ASSIGN (lv_tablenameTO <fs_quelle>.
           ASSIGN COMPONENT <fs_comp>-name OF STRUCTURE <fs_pd> TO <fs_ziel>.
 
 * Zuweisung durchführen
           IF <fs_quelle> IS ASSIGNED AND <fs_ziel> IS ASSIGNED.
             TRY.
                 <fs_ziel> <fs_quelle>.
             ENDTRY.
             UNASSIGN <fs_quelle>.
             UNASSIGN <fs_ziel>.
           ENDIF.
         ENDLOOP.
       ENDLOOP.
          ENDIF.
      ENDIF.

Folgende Datendeklarationen habe ich vorgenommen:

* Datendeklaration
   DATAlv_fm_name                  TYPE funcname,
         ls_fp_outputparams          TYPE sfpoutputparams,
         ls_fm_docparams             TYPE sfpdocparams,
         ls_fpformoutput             TYPE fpformoutput,
         ls_import_param             TYPE rsfbpara,
         ls_structure                TYPE objectname,
         ls_ref                      TYPE REF TO data,
         lv_error                    TYPE xfeld,
         lv_subrc                    TYPE sy-subrc,
         ls_interface                TYPE rsfbintfv,
         lv_tablename(30)            TYPE c,
         ls_tn01                     TYPE tn01,
         ls_rnf19                    TYPE rnf19,
         lv_structure                TYPE string,
         lcl_struc                   TYPE REF TO cl_abap_structdescr,
         lt_comp                     TYPE cl_abap_structdescr=>component_table.
 
 * Datendeklaration Lokalte Tabellen
   DATAlt_nbewtab      TYPE TABLE OF vnbew.
 
 
   FIELD-SYMBOLS<fs_pd>        TYPE any,
                  <fs_quelle>    TYPE any,
                  <fs_ziel>      TYPE any,
                  <fs_parameter> TYPE rsfbpara,
                  <fs_comp>      LIKE LINE OF lt_comp. 

ABAP: Textsymbole ersetzen

Für das Ersetzen von Textsymbolen, globlen Feldern oder Systemsymbolen gibt es zwei SAP Funktionsbausteine.

1. REPLACE_TEXTSYMBOL
2. TEXT_SYMBOL_REPLACE

Bei Nutzung des Bausteins REPLACE_TEXTSYMBOL ist der Zeitpunkt der Verwendung sehr wichtig. Denn innerhalb diesen Bausteins wird auf die internen Tabellen itcvl, itcvd, itcvg zurückgegriffen.
Solange man ihn innerhalb einer Formularbearbeitung aufruft funktioniert er einwandfrei. Fehlerhaft wird die Nutzung nach dem Abschluss einer Formularbearbeitung END_FORM, denn durch den Funktionsbaustein SET_TEXTSYMBOL_PROGRAM werden die internen Tabellen initalisiert.

Daher ist die Nutzung des Funktionsbausteins TEXT_SYMBOL_REPLACE zu empfehlen. Hier spielt der Zeitpunkt keine Rolle.

Beispielcoding:

DATA: ls_header  TYPE thead.
DATA: ls_text    type STXH_KEY.
DATA: lt_tline   type TABLE OF tline.
DATA: gv_text    type char255.


ls_text-tdid     = 'ST'.
ls_text-tdspras  = 'D'.
ls_text-tdname   = 'ZTEST_REPLACE'.
ls_text-tdobject = 'TEXT'.

gv_text = 'TEST!!!'.

* SO10 Text lesen
    REFRESH lt_tline.
    CLEAR ls_header.
    CALL FUNCTION 'READ_TEXT'
      EXPORTING
        id                      = ls_text-tdid
        language                = ls_text-tdspras
        name                    = ls_text-tdname
        object                  = ls_text-tdobject
      IMPORTING
        header                  = ls_header
      TABLES
        lines                   = lt_tline
      EXCEPTIONS
        id                      = 1
        language                = 2
        name                    = 3
        not_found               = 4
        object                  = 5
        reference_check         = 6
        wrong_access_to_archive = 7
        OTHERS                  = 8.

* Symbole und globale Felder ersetzen
CALL FUNCTION 'TEXT_SYMBOL_REPLACE'
  EXPORTING
    ENDLINE                = 99999
    header                 = ls_header
*   INIT                   = ' '
*   OPTION_DIALOG          = ' '
    PROGRAM                = sy-repid
    REPLACE_PROGRAM        = 'X'
    REPLACE_STANDARD       = 'X'
    REPLACE_SYSTEM         = 'X'
    REPLACE_TEXT           = 'X'
   STARTLINE              = 1
* IMPORTING
*   CHANGED                =
*   NEWHEADER              =
  tables
    lines                  = lt_tline.

SARA: MARA: Material wird in Packvorschrift verwendet

Beim Archivieren von Materialien bekommt man die Nachricht “MARA:   Material wird in Packvorschrift verwendet” angezeigt.

Die Packvorschriften können über die folgenden Transaktionen gelöscht werden.

Transaktionen:

  • POP2 (Packvorschrift ändern)
  • POF2 (Findungssätze)

Archivierungsobjekt:

  • VHU_PI

Tabllen:

  • PACKKP
  • PACKKPS
  • PACKPO