Log per all’interno di un report custom SAP (visualizzabile da SLG1).

Questi sono i passi da seguire per inserire il log standard all’interno di un report custom SAP.
Il log una volta creato sarà visualizzabile tramite la transazione SLG1.

  • 1) Creazione tramite la transazione SLG0 di un nuovo “tipo oggetto” di log.
  • 2) Inizializzazione variabili
    * Dati per log tramite SLG0
    data: gs_log type bal_s_log,
    gs_log_handle type balloghndl,
    gt_log_handle type bal_t_logh,
    gs_msg type bal_s_msg,
    gt_new_lognumbers type bal_t_lgnm.
  • 3) Chiamata a function BAL_LOG_CREATE all’inizio dell’esecuzione.
  • 4) Aggiunta di messaggi al log tramite la function BAL_LOG_MSG_ADD.
  • 5) Come ultimo step del report inserire la function BAL_DB_SAVE che sostanzialmente effettua un commit dei messaggi di log aggiunti.
  • 6) Una volta eseguito il report si possono verificare i risultati dalla transazione SLG1.

Posted under ABAP, Blog, function

This post was written by Alberto on gennaio 8, 2009

Tags: ,

Spedire mail con allegato

Ecco come spedire in modo automatico mail con diverse impostazioni. Utilizziamo la funzione standard SO_NEW_DOCUMENT_ATT_SEND_API1, non proprio ben commentata.

Ecco dell’ottimo sample code commentato come si deve .

Cominciamo con un po’ di definizioni

DATA: lt_att_content_hex TYPE TABLE OF solix,
lf_lines  TYPE i,
la_mailpack TYPE sopcklsti1,
lt_mailpack TYPE TABLE OF sopcklsti1,
la_maildata TYPE sodocchgi1,
lt_receiver TYPE TABLE OF somlreci1,
ls_receiver TYPE somlreci1,
lt_mailhead TYPE TABLE OF solisti1,
ls_mailhead TYPE solisti1,
lt_mailtxt  TYPE TABLE OF solisti1,
ls_mailtxt TYPE solisti1.

Qui ci sta l’oggetto della mail:

la_maildata-obj_name = 'nome oggetto'.
la_maildata-obj_descr = 'Invio OdA'.

Qui mettiamo il testo della mail: da notare la necessità di ricavare la  lunghezza del testo

ls_mailtxt = 'vd. allegato'.
APPEND ls_mailtxt TO lt_mailtxt.

DESCRIBE TABLE lt_mailtxt LINES lf_lines.
READ TABLE lt_mailtxt INTO ls_mailtxt INDEX lf_lines.

la_maildata-doc_size = ( lf_lines - 1 ) * 255 + STRLEN( ls_mailtxt ).

CLEAR la_mailpack-transf_bin.
la_mailpack-head_start = 1.
la_mailpack-head_num = 0.
la_mailpack-body_start = 1.
la_mailpack-body_num = lf_lines.
la_mailpack-doc_type = 'RAW'.
APPEND la_mailpack TO lt_mailpack.

Aggiungiamo i destinatari della mail

ls_receiver-receiver = 'ciccio@pasticcio.it'.
ls_receiver-rec_type = 'U'. "tipo indirizzo->mail
APPEND ls_receiver TO lt_receiver.

Ora da qualche parte, per esempio nella generazione di un pdf, abbiamo riempito la tabellina lt_att_content_hex del sorgente binario dell’allegato desiderato.

DESCRIBE TABLE lt_att_content_hex LINES lf_lines.
la_maildata-doc_size = lf_lines * 255."( lf_lines - 1 ) * 255 + STRLEN( ls_mailtxt ).

la_mailpack-transf_bin = 'X'.
la_mailpack-head_start = 1.
la_mailpack-head_num = 0.
la_mailpack-body_start = 1.
la_mailpack-doc_type = 'PDF'.
la_mailpack-body_num = lf_lines.
la_mailpack-doc_size = lf_lines * 255.
la_mailpack-obj_descr = 'the allegat'.
la_mailpack-obj_name = 'Allegato'.
APPEND la_mailpack TO lt_mailpack.

Possiamo allo stesso modo aggiungere altri allegati, ora lanciamo la mail:

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
document_data = la_maildata
put_in_outbox = 'X'
commit_work = 'X'
TABLES
packing_list = lt_mailpack
contents_txt = lt_mailtxt
contents_hex = lt_att_content_hex
receivers = lt_receiver .

Ora se tutto è andato bene, possiamo andare nella SOST per vedere l’anteprima della mail generata e inviata a seconda della configurazione.

Mi raccomando, occhio allo spam!!!

Posted under ABAP, function

This post was written by Alberto on dicembre 16, 2008

Funzione per il caricamento automatico di una variante. -> 3a/3 parte

A questo punto manca l'ultimo passo, ho tutti i dati che mi servono per richiamare la function module che carica la variante.
Su seltab infatti si trovano tutti i parameter e i select option valorizzati correttamente.
IF flag_errore NE 'X'.
CALL FUNCTION 'SUBST_WRITE_UPGRADE_VARIANT'
EXPORTING iv_reportname = nome_programma
iv_variantname = nome_variante
iv_varianttext = testo_variante
TABLES tt_reportparam = seltab.
IF sy-subrc <> 0.
CLEAR return.
return-type = sy-msgid.
return-id = sy-msgty.
return-number = sy-msgno.
return-message_v1 = sy-msgv1. return-message_v2 = sy-msgv2.
return-message_v3 = sy-msgv3. return-message_v4 = sy-msgv4.
ENDIF.
ENDIF.
Bene, l'ultimo è passo sarà quello di controllare nel report di "destinazione" che tutto corrisponda.

Posted under ABAP, function

This post was written by Damiano on luglio 29, 2007

Funzione per il caricamento automatico di una variante. -> 2a/3 parte

Questo codice dovrebbe essere abbastanza comprensibile (sembra ben commentato eh?). Viene sostanzialmente effettuato il caricamento dei valori su seltab.
LOOP AT parametri INTO wa_parametri.
CLEAR : wa_seltab, flag_errore, return.

* controlla che i parametri passati alla ruotine (in' parametri')
* siano effettivamente presenti nel report di riferimento(quindi in seltab).
READ TABLE seltab INTO sup_seltab WITH KEY selname = wa_parametri-nome_parametro.
IF sy-subrc <> 0.
* mandare messaggio perchè il parametro passato nella struttura non è previsto nel report
flag_errore = 'X'. EXIT.
* modifica/aggiunge righe di seltab con i valori passati su parametri
ELSE.
* carico il valore low (ok sia nel caso select-option sia nel caso parameter)
wa_seltab-low = wa_parametri-valore_parametro.
* se sono in un select option
IF wa_parametri-flag_ps EQ 'S'.
wa_seltab-sign = 'I'.
wa_seltab-option = 'EQ'.
* se è il primo valore incontrato per il select-option-> modify
IF sup_seltab-low IS INITIAL.
MODIFY seltab FROM wa_seltab TRANSPORTING low sign option
WHERE selname = wa_parametri-nome_parametro.
ELSE.

* se non è il primo valore incontrato per il select-option aggiunge una nuova riga.
sup_seltab-low = wa_seltab-low.
sup_seltab-sign = wa_seltab-sign .
sup_seltab-option = wa_seltab-option.
APPEND sup_seltab TO seltab.
ENDIF.
ELSE.

* se sono in un parameter
MODIFY seltab FROM wa_seltab TRANSPORTING low WHERE selname = wa_parametri-nome_parametro.
ENDIF.
ENDIF.
ENDLOOP.

— continua –

Posted under ABAP, function

This post was written by Damiano on luglio 13, 2007

Funzione per il caricamento automatico di una variante. -> 1a/3 parte

A questa funzione devono essere passati due parametri :

1) La definizione della variante ossia: A-il nome, B-il report per il quale deve essere creata C-il testo di descrizione associata.

2) Una tabellina contenente i record del tipo nomepar|valoredaimpostare|tipopar (dove 'tipopar' andrà a specificare se si tratta di un parameter o di un select-options) da impostare nella definizione della variante.

Il primo passo consiste nel caricare nella tabella seltab le definizioni dei parameter e dei select-option del programma sul quale si vuole settare la variante. In questo modo siamo sicuri che le righe passate nella tabellina (2) siano coerenti con il report per il quale si imposta la variante.

CLEAR return.
CALL FUNCTION '
RS_REFRESH_FROM_SELECTOPTIONS'
EXPORTING curr_report = nome_programma
TABLES selection_table = seltab.
— continua –

Posted under ABAP, function

This post was written by Damiano on luglio 10, 2007

Salvataggio e lettura di testi estesi

E' molto più che utile sapere come salvare testi nel database ( chiamati anche 'testi estesi') e poi utilizzarli. Le funzioni chiave sono la READ_TEXT e la SAVE_TEXT, dal nome che per una volta è chiaro sul loro scopo. Il parametro chiave per la READ_TEXT è di tipo THEAD, struttura dalle decine di campi, di cui però ce ne interessano solo 3 (oltre alla lingua):

  • TDOBJECT: rappresenta l'oggetto applicazione, e i suoi valori si trovano nella tabella TTXOB;
  • TDID: è l'identificativo di testo, i cui valori dipendono dal TDOBJECT e si trovano nella tabella TTXID;
  • TDNAME: il nome che diamo al testo.

Oltre a questo sarà necessario aggiungere la nostra tabella di righe di testo, di tipo TLINE. Sperando di aver dato un nome abbastanza smart al nostro testo, 800 righe di codice più avanti vorremmo richiamarlo: ecco come usare la funzione READ_TEXT. Il procedimento è abbastanza speculare, basta reinserire i 3 campi descritti sopra, con l'aggiunta della lingua. Adesso la nostra tabella di tipo TLINE, magicamente si riempirà con il testo richiamato. Ultima cosa: le testate dei testi si trovano nella tabella STXH.

Posted under function

This post was written by Alberto on luglio 2, 2007

Visualizzazione errata dei log

Quante volte vi è successo di visualizzare messaggi di log più volte durante l'esecuzione e vedere risultati sballati, come l'aggiunta di messaggi che non c'entrano? Beh, a me una volta solo. Se avete usato una function del tipo BAL_DSP_LOG_DISPLAY il problema è forse un po' di sporcizia nel buffer dei log. In questo caso consiglio caldamente la function BAL_GLB_MEMORY_REFRESH, e tutto si pulisce in un attimo…

Posted under function

This post was written by Alberto on giugno 28, 2007