Cerca nel blog

lunedì 20 giugno 2016

ABAP: Creazione FM in RFC passando come parametro una tabella

Creazione FM in RFC passando come parametro una tabella

Richiamare la transazione SE11, inserire il nome del struttura da creare, e premere il pulsante “CREATE”,  inserire una descrizione della struttura, ed i campi che ne fanno parte, come in figura:

Creiamo, una "Table Type" di tipo struttura creato in precedenza.
Richiamare la transazione SE11, inserire il nome della "Table Type" da creare, e premere il pulsante, “CREATE”,  inserire una descrizione della "Table Type", e nel campo Line Type: inserire la struttura creata in precedenza:


Selezioniamo il tab "Initialization and Access" e selezioniamo nel caso nostro l'opzione "Standard Table", come in figura:

Selezioniamo il tab "Key", nella Key definition selezionare "KEY Components" e nella "Key Category" selezioniamo "Non Unique" , come in figura:

 
Salviamo e attiviamo:
Creiamo adesso il FM passando come parametro di input la tabella creata in precedenza:
Richiamare la transazione SE37, inserire il nome del FM da creare, e premere il pulsante “CREATE”,  inserire una descrizione del  Fm, ed inserire come parametro di input la tabella creata in precedenza, come in figura:



venerdì 17 giugno 2016

ABAP: Esempio di creazione della classe globale per la scrittura sul server di un file di log per l’elaborazione

Creazione classe globale per scrittura di un file di log

Creiamo la Classe Globale ZSAPCC_BATCHLOG
Richiamiamo la transazione SE80, selezioniamo Repository Browser, dal menu a tendina selezioniamo “Classe/Interface” ed inseriamo il nome della classe in questo caso ZSAPCC_BATCHLOG e premiamo INVIO.
Nella popup successiva, selezioniamo “Classe” e premiamo OK.
Nella popup successiva, inseriamo la descrizione “Classe Globale gestione Log di elaborazione”, selezioniamo “Creaz.Istanze” = Pubblico


Premere il pulsante “SALVARE.
Dal menu di sx, fare doppio click sulla classe creata, poi selezionare il tab “Attributi” per definire gli attributi usati dalla classe.


Selezioniamo  il tab “Metodi” per definire i metodi dalla classe
Per creare il metodo “Costructor” premere il pulsante “Costruttore”.


In questo caso non definiamo né parametri  né codice sorgente.
Creiamo il metodo DESTRUCTOR, senza premere pulsanti.

Creiamo il metodo WRITE, che serve per scrivere le singole righe nel file di LOG.

 
Per questo metodo, specifichiamo anche dei parametri, quindi premiamo il pulsante PARAMETRI.


Successivamente, premere il pulsante “Testo Sorgente” ed inserire il seguente codice:

  METHOD write.

* Ogni chiamata al metodo Write() genera una riga
* nel file di log che ha come prefisso data (YYYYMMDDHHMMSS).
* I metodi Begin() e End() richiamano a loro volta il metodo Write()
* per scrivere sul file di log.

*Il metodo Write() accetta in input, oltre al messaggio,
*la tipologia di evento tra Information, Warning ed Error.
    
DATAv_riga TYPE string.

    
IF type 'W' AND v_type 'I'.
      v_type 
type.
    
ENDIF.
    
IF type 'E'.
      v_type 
type.
    
ENDIF.

    
IF type NA v_msgty.
      
CONCATENATE type v_msgty INTO v_msgty.
    
ENDIF.

    
OPEN DATASET v_file FOR APPENDING IN TEXT MODE ENCODING DEFAULT.
    
IF sy-subrc 0.
*concateno il tipo messaggio e il testo dell'informazione sul file LOG.

      
CONCATENATE type data ora text INTO v_riga SEPARATED BY space.

      
TRANSFER v_riga TO v_file.
*    commit work.
      
CLOSE DATASET v_file.
    
ELSE.
      
MESSAGE s368(00WITH 'FILE DOES NOT EXIST'.
    
ENDIF.

  
ENDMETHOD.


Creiamo il metodo LOGICAL_FILE, che serve per ricavare il nome del file logico.


Per questo metodo, specifichiamo anche dei parametri, quindi premiamo il pulsante PARAMETRI.


Successivamente, premere il pulsante “Testo Sorgente” ed inserire il seguente codice:
  
  METHOD logical_file.

    
DATApath_a    TYPE string,
          v_file_fx 
TYPE filename-fileintern.

    v_file_1 
'ZFILELOG'.

    
MOVE v_file_1 TO v_file_fx.

    
CALL FUNCTION 'FILE_GET_NAME'
      
EXPORTING
*       CLIENT           = SY-MANDT
        logical_filename 
v_file_fx
*       OPERATING_SYSTEM = SY-OPSYS
        parameter_1      
sy-host
        parameter_2      
ambito
*       PARAMETER_3      = ' '
*       USE_PRESENTATION_SERVER       = ' '
*       WITH_FILE_EXTENSION           = ' '
*       USE_BUFFER       = ' '
*       ELEMINATE_BLANKS = 'X'
      
IMPORTING
*       EMERGENCY_FLAG   =
*       FILE_FORMAT      =
        file_name        
path
*   EXCEPTIONS
*       FILE_NOT_FOUND   = 1
*       OTHERS           = 2
      
.
    
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    
ENDIF.

    
CALL FUNCTION '/SAPDMC/LSM_PATH_FILE_SPLIT'
      
EXPORTING
        pathfile 
path
      
IMPORTING
        pathname 
path_a
        filename 
nome_filelog.

    
path path_a.

  
ENDMETHOD.

Creiamo il metodo BEGIN, che serve per creare il file di log.


Per questo metodo, specifichiamo anche dei parametri, quindi premiamo il pulsante PARAMETRI.

 
Successivamente, premere il pulsante “Testo Sorgente” ed inserire il seguente codice:


METHOD begin.
*Ogni chiamata al metodo Begin() genera un nuovo file nel formato nome programma + idexecution + data (YYYYMMDDHHMMSS).

  
DATAv_nomeprog LIKE sy-repid,
        v_nomejob  
TYPE tbtcjob-jobname,
        t_job 
TYPE STANDARD TABLE OF tbtcjob  INITIAL SIZE 1,
        t_job1    
TYPE  tbtcjob,
        path      
TYPE string,
        nome_file 
TYPE string.

*****************Inizio del programma********************************
*1. ricavo le informazioni che mi servono per costruire il nome file.
  
v_nomeprog sy-cprog.
  
IF sy-batch 'X'.
    
CALL FUNCTION 'BP_FIND_JOBS_WITH_PROGRAM'
      
EXPORTING
        abap_program_name             
v_nomeprog
      
TABLES
        joblist                       
t_job
      
EXCEPTIONS
        no_jobs_found                 
1
        program_specification_missing 
2
        invalid_dialog_type           
3
        job_find_canceled             
4
        
OTHERS                        5.

    
IF sy-subrc <> 0.
* Inserimento gestione errore chiamata function -> Inizio 06/03/2016
      
WRITE 'METHOD begin'.
      
WRITE 'Errore su chiamata BP_FIND_JOBS_WITH_PROGRAM: 'sy-subrc.
      
WRITE 'Parametro abap_program_name: 'v_nomeprog.
* Inserimento gestione errore chiamata function -> Fine 06/03/2016
    
ENDIF.

    
LOOP AT t_job INTO t_job1.
      
IF sy-subrc AND sy-tabix 1.
        
MOVE t_job1-jobcount TO v_nomejob.
      
ELSE.
        
EXIT.
      
ENDIF.
    
ENDLOOP.
  
ENDIF.
*Concateno il nome del file.
*nome programma + idexecution + data (YYYYMMDDHHMMSS).
  
IF v_nomejob ' '.
    
MOVE '' TO v_nomejob.
  
ENDIF.

*Ricavo il nome del file logico:
  
CALL METHOD me->logical_file
    
EXPORTING
      v_file       
v_file_1
      ambito       
ambito
    
IMPORTING
      path         
path
      nome_filelog 
nome_file.

  
CONCATENATE path v_nomeprog v_nomejob sy-datum sy-uzeit '.log' INTO v_file.
  
OPEN DATASET v_file FOR OUTPUT IN TEXT MODE ENCODING DEFAULT.
  
IF sy-subrc 0.
    
COMMIT WORK.

*Close Dataset.
    
CLOSE DATASET v_file.
    
COMMIT WORK.

    v_text 
'Creazione file di log' .
    v_type 
'I'.

    
CALL METHOD me->write
      
EXPORTING
        
type   v_type
        
text   v_text
        v_file 
v_file
        
data   sy-datum
        ora    
sy-uzeit.

  
ENDIF.
ENDMETHOD.

Creiamo il metodo END, che serve per chiudere il file di log.


Per questo metodo, specifichiamo anche dei parametri, quindi premiamo il pulsante PARAMETRI.


Successivamente, premere il pulsante “Testo Sorgente” ed inserire il seguente codice:

METHOD end.

*Scrittura ultimo record del file.

  
CALL METHOD me->write
    
EXPORTING
      
type   'I'                 "v_evento
      
text   v_text
      v_file 
v_file
      
data   sy-datum
      ora    
sy-uzeit.

  
CALL METHOD me->write
    
EXPORTING
      
type   'I'                 "v_evento
      
text   'Messaggio generato automaticamente dalla procedura ZSAPCC_BATCHLOG.'
      v_file 
v_file
      
data   sy-datum
      ora    
sy-uzeit.

* segnalazione di termine elaborazione (Tracker 10324)
  
ULINE.
  
WRITE 'Esecuzione terminata. Log disponibile in ',
              v_file
.
  
ULINE.
ENDMETHOD.

IMPORTANTE: inserire il nome logico del file (ZFILELOG)che abbiamo inserito nel metodo LOGICAL_FILE, all’interno della tabella PATH (Defin. dei percorsi file fisici in base alla sintassi) Per inserire il record, richiamare la transazione FILE



Premere il pulsante “Nuovi Inserimenti”, inserire il percorso logico ZFILELOG e la descrizione e premere INVIO. Selezionarlo e premere sulla cartella a sx “Attribuzione percorso logico”, premere il pulsante “Nuovi Inserimenti”


Inserire i seguenti valori e premere invio


IMPORTANTE: inserire il nome logico del file (ZFILELOG)che abbiamo inserito nel metodo LOGICAL_FILE, all’interno della tabella FILENAMECI (Nomi file indipend. dalla piattaf. e validi in tutti i mand.) Per inserire il record usare SM30 e utilizzare la view V_FILENACI


Creare il seguente programma custom ZPROVA_LOG testare la classe globale ZSAPCC_BATCHLOG creata.

REPORT zprova_log.

DATAv_zsapcc_batchlog1 TYPE REF TO zsapcc_batchlog,
      v_file             TYPE string VALUE 'ZINTERLOG'.

CONSTANTSc_ambito             TYPE char20  VALUE 'CCI'.  "comunicazione internet

START-OF-SELECTION.
  PERFORM begin_log.

  PERFORM write_log USING 'I' 'Inizio Programma'.
  PERFORM close_log.


FORM begin_log .
* definizione del file LOGICO in cui scrivere il log e della classe
* che gestisce lo stesso
  CREATE OBJECT v_zsapcc_batchlog1.

* creazione e apertura del file di log
  CALL METHOD v_zsapcc_batchlog1->begin
    EXPORTING
      ambito   c_ambito
    IMPORTING
      v_file   v_file
    CHANGING
      v_file_1 v_file.
ENDFORM.


FORM write_log  USING  type testo.

  GET TIME.
  CALL METHOD v_zsapcc_batchlog1->write
    EXPORTING
      type   type
      text   testo
      v_file v_file
      data   sy-datum
      ora    sy-uzeit.

ENDFORM.                    " WRITE_LOG


FORM close_log .
  DATAlv_testo TYPE string.

  lv_testo 'Fine elaborazione'.

  GET TIME.
  CALL METHOD v_zsapcc_batchlog1->end
    EXPORTING
      v_file v_file
      ambito c_ambito
      v_text lv_testo.

ENDFORM.                    " CLOSE_LOG