*---------------------------------------------------------------------*
*                  Z _ B J H _ F T P _ C O N N E C T                  *
*                                                                     *
*                  Autor: Bernd Haase (BJH Software)                  *
*---------------------------------------------------------------------*
* Aktion eines FTP-Transfer. Das Programm beinhaltet die Möglichkeit  *
* des Datenaustausches zwischen 2 Systemes, wobei eine korrekte       *
* Anmeldung im Zielsystem geschehen soll (im hiesigen Fall Vorbelegung*
* für Anmeldung im PC-Netzwerk). Im Quellsystem (SAP Basis Anwendung) *
* braucht nur der Pfad definiert sein. Der Mandant wird automatisch   *
* eingepflegt. Danach erfolgt die Befehlsfolge, hier nur das Verschie-*
* ben von Daten. Am Ende wird die Protokolltabelle am Bildschirm      *
* angeziegt, welche den Verlauf der Aktionen wiederspiegelt.          *
*---------------------------------------------------------------------*
* 18.11.2003 BHaa: Programm erstellt                                  *
*---------------------------------------------------------------------*
REPORT  z_bjh_ftp_connect          .

INCLUDE .

DATA:
 zw_text LIKE btcxpm-message,
 hdl TYPE i,
 key TYPE i VALUE 26101957,
 wa_z_pin_len TYPE i,
 wa_sysid_len TYPE i,

* Zwischendateien, da Parameter generell alles in Großbuchstaben
* ablegen, sofern sie nicht besser spezifiert sind
 wa_ziel_user(64) TYPE c,
 wa_ziel_pin(64) TYPE c,
 wa_ziel_pfad(80) TYPE c,
 wa_quell_pfad(80) TYPE c,
 wa_command1(80) TYPE c,
 wa_command2(80) TYPE c,
 wa_data(80) TYPE c.

* interne Protokolltabelle
DATA: BEGIN OF itab_protokoll OCCURS 0.
       INCLUDE STRUCTURE btcxpm.
DATA: END OF itab_protokoll.

*---------------------------------------------------------------------*
*                                                                     *
*                 A u s w a h l b i l d s c h i r m                   *
*                                                                     *
*---------------------------------------------------------------------*
* Angaben Ziellaufwerk (PC-/Netzwerk-Rechner)
SELECTION-SCREEN: BEGIN OF BLOCK ziel WITH FRAME TITLE text-901.
PARAMETERS:
* User / Kennung im Netzwerk
 pmz_user(64) TYPE c,
* Passwort für Anmeldung im Netzwerk
 pmz_pin(64) TYPE c,
* IP Adresse Netzwerk Rechner
 pmz_ip(80) TYPE c,
* Pfad im Netzwerk (komplett). Ausgangspfad (komplette Struktur)
 pmz_pfad(80) TYPE c.
SELECTION-SCREEN: END OF BLOCK ziel.

* Angaben Quellsystem (UNIX-/Linux-System, SAP Basis)
SELECTION-SCREEN: BEGIN OF BLOCK quell WITH FRAME TITLE text-902.
PARAMETERS:
* Ziellaufwerk auf der Unix-Maschine
 pmq_pfad(80) TYPE c DEFAULT 'lcd /usr/sap/xxx/ftphost/'.
SELECTION-SCREEN: END OF BLOCK quell.

* Parameter für Befehlfolge
SELECTION-SCREEN: BEGIN OF BLOCK befehl WITH FRAME TITLE text-903.
PARAMETERS:
* 1. Befehl
 pm_comm1 TYPE char80 DEFAULT 'binary',
* 2. Befehl
 pm_comm2 TYPE char80 DEFAULT '',
* get / put Befehl + Datei
* Testfall: get Dateiname (holen einer Datei von PC auf Unix)
 pm_data  TYPE char80 DEFAULT 'get datei',
* RFC Destination
 pm_dest  TYPE rfcdest DEFAULT 'SAPFTPA',
* Compress Parameter
 pm_comp  TYPE char01 DEFAULT 'N'.
SELECTION-SCREEN: END OF BLOCK befehl.

* Zielrechnerdaten belegen
INITIALIZATION.
 MOVE '.rrftp1.users.sonstige.bmksound.de' TO pmz_user.
 MOVE 'rrftp1' TO pmz_pin.
 MOVE '179.29.5.8' TO pmz_ip.
 MOVE 'cd \data\data\sap\ftptransfer\input\bjh_get' TO pmz_pfad.

***********************************************************************
*                                                                     *
*                     P R O G R A M M S T A R T                       *
*                                                                     *
***********************************************************************
START-OF-SELECTION.
* umwandeln der Großbuchstaben (Parameter-Deklaration !!!) in
* Kleinbuchstaben, so Unix-Systeme darauf unterscheiden
 MOVE pmz_user TO wa_ziel_user.
 TRANSLATE wa_ziel_user TO LOWER CASE.

 MOVE pmz_pin TO wa_ziel_pin.
 TRANSLATE wa_ziel_user TO LOWER CASE.

 MOVE pmz_pfad TO wa_ziel_pfad.
 TRANSLATE wa_ziel_pfad TO LOWER CASE.

* Mandanten einpflegen, in den Parameters in nur ein Platzhalter
 MOVE pmq_pfad TO wa_quell_pfad.
 TRANSLATE wa_quell_pfad TO LOWER CASE.
 wa_sysid_len = strlen( sy-sysid ).
 REPLACE 'xxx' WITH sy-sysid(wa_sysid_len) INTO wa_quell_pfad.

 MOVE pm_comm1 TO wa_command1.
 TRANSLATE wa_command1 TO LOWER CASE.

 MOVE pm_comm2 TO wa_command1.
 TRANSLATE wa_command2 TO LOWER CASE.

 MOVE pm_data TO wa_data.
 TRANSLATE wa_data TO LOWER CASE.

* Passwort verschüsseln
 DESCRIBE FIELD wa_ziel_pin LENGTH wa_z_pin_len.

 CALL 'AB_RFC_X_SCRAMBLE_STRING'
   ID 'SOURCE'      FIELD wa_ziel_pin
   ID 'KEY'         FIELD key
   ID 'SCR'         FIELD 'X'
   ID 'DESTINATION' FIELD wa_ziel_pin
   ID 'DSTLEN'      FIELD wa_z_pin_len.

* Connect zum PC (Zielsystem) herstellen
 CALL FUNCTION 'FTP_CONNECT'
      EXPORTING
           user            = wa_ziel_user
           password        = wa_ziel_pin
           host            = pmz_ip
           rfc_destination = pm_dest
      IMPORTING
           handle          = hdl.

* init protokolltabelle
 CLEAR itab_protokoll. REFRESH itab_protokoll. FREE itab_protokoll.

* Befehlsfolge abarbeiten.
 PERFORM upro_ftp_command
         TABLES itab_protokoll
         USING  hdl
                wa_ziel_pfad
                pm_comp
                'Kein Umschalten auf PC-Pfad.'.

 PERFORM upro_ftp_command
         TABLES itab_protokoll
         USING  hdl
                wa_quell_pfad
                ' '
                'Kein Umschalten auf UNIX-Pfad.'.

 CONCATENATE wa_command1 'nicht erfolgreich.' INTO zw_text.
 PERFORM upro_ftp_command
         TABLES itab_protokoll
         USING  hdl
                wa_command1
                ' '
                zw_text.

 CONCATENATE wa_command2 'nicht erfolgreich.' INTO zw_text.
 PERFORM upro_ftp_command
         TABLES itab_protokoll
         USING  hdl
                wa_command2
                ' '
                zw_text.

* Daten holen vom Zielsystem (get-Befehl)
* oder dorthin schieben (put-Befehl)
 PERFORM upro_ftp_command
         TABLES itab_protokoll
         USING  hdl
                wa_data
                ' '
                'keine Daten übertragen.'.
* Daten verschoben, hier auch einen Satz in die Tabelle bei
* erfolgreicher Aktion einfügen
 IF sy-subrc = 0.
   CLEAR itab_protokoll.
   MOVE '+++' TO itab_protokoll-length.
   MOVE 'Daten erfolgreich verschoben.' TO itab_protokoll-message.
   APPEND itab_protokoll.
 ENDIF.

* Verbindung trennen
 CALL FUNCTION 'FTP_DISCONNECT'
      EXPORTING
           handle = hdl.

* Tabelle mit Verarbeitungsprozessen anzeigen
* bei Spezialcode (--- oder +++) zusätzlich Anzeige einer Ampel
 LOOP AT itab_protokoll.
   CASE itab_protokoll-length.
     WHEN '---'.
       WRITE: / icon_remove_from_selection, itab_protokoll-message.
     WHEN '+++'.
       WRITE: / icon_include_in_selection, itab_protokoll-message.
     WHEN OTHERS.
       WRITE: / itab_protokoll.
   ENDCASE.
 ENDLOOP.

END-OF-SELECTION.
 EXIT.

*---------------------------------------------------------------------*
*                        F T P _ C O M M A N D                        *
*---------------------------------------------------------------------*
* Ausführen des FTP-Commands. Befehlsparameter werden mitgegeben,     *
* somit ist dieses Unterprogramm universell einsetzbar. Sollte der    *
* Funktionsbaustein nicht erfolgreich abgeschlossen werden, so wird   *
* die Protokolltabelle um einen Eintrag erweitert, falls ein Text     *
* mitgegeben wurde.                                                   *
*---------------------------------------------------------------------*
* <=> p_result (TABELLE): Protokolltabelle für alle Aktionen          *
* =>] p_hdl: Handle (Fixer Parameter, wurde beim Connect ermittelt)   *
* =>] p_command: auszuführender Befehl                                *
* =>] p_compress: Compressgrad                                        *
* =>] p_fehler_text: wenn Aktion nicht erfolgreich, Text für Tabelle  *
*---------------------------------------------------------------------*
FORM upro_ftp_command
    TABLES p_result STRUCTURE btcxpm
    USING  p_hdl
           p_command
           p_compress
           p_fehler_text.

* nur Aktion, wenn Commandline (Befehl) vorhanden ist
 CHECK: p_command > space.

* FTP-Befehl ausführen
 CALL FUNCTION 'FTP_COMMAND'
      EXPORTING
           handle        = p_hdl
           command       = p_command
           compress      = p_compress
      TABLES
           data          = p_result
      EXCEPTIONS
           command_error = 1
           tcpip_error   = 2.

* Fehler beim Aufruf Funktionsbaustein. '---' steht für fehlerhaft, da
* sonst keine eindeutige Codierung für Fehler oder Warnungen existiert.
 IF sy-subrc <> 0
 AND p_fehler_text > ' X'.
   CLEAR p_result.
   MOVE '---' TO p_result-length.
   MOVE p_fehler_text TO p_result-message.
   APPEND p_result.
 ENDIF.

ENDFORM.

*****  E n d e  *****
* Copyright BJH Software, Datei überarbeitet am: 26.5.2005