venerdì 19 giugno 2009

Ricercare valori in un set

Per poter gestire dinamicamente un set di valori è possibile creare tramite la transazione GS01 un set di valori specificando il riferimento al campo di una tabella per indicare la tipologia di valori che il set contiene. La transazione appare cosi:


Per poter verificare se un determinato valore è presente nel set creato è possibile utilizzare la seguente function:



DATA va_trovato LIKE aasel1-option.
DATA setid LIKE sethier-setid.

CLEAR: aktyp,
setid,
wa_tcode,
va_trovato.


MOVE 'Z_TRANS_FATT_MOD' TO setid.
MOVE sy-tcode TO wa_tcode.

CALL FUNCTION 'Z_CTRL_SET'
EXPORTING
setid = setid
val_da_trovare = wa_tcode
IMPORTING
val_trovato = va_trovato
EXCEPTIONS
set_not_found = 1
illegal_field_replacement = 2
illegal_table_replacement = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

La funtion può restituisce nel valore va_trovato solo 2 valori: SI o NO.

Il test da eseguire è :
if va_trovato EQ 'SI'.

giovedì 18 giugno 2009

Testi per documenti contabili

Per poter creare e leggere dei testi associati ad un particolare documento contabile è possibile usare la seguente function specificando il numero documento, il tipo documento, la società e l'esercizio.

CALL FUNCTION 'FI_TEXTS_DOCUMENT'

EXPORTING

i_aktyp = 'H'

i_belnr = bkpf-belnr

i_blart = bkpf-blart

i_bukrs = bkpf-bukrs

* I_CHECK = ' '

i_dyncl = 'B'

i_gjahr = bkpf-bldat(4)

i_object = 'BELEG'

i_give_back_ids = 'X'

* I_CLEAR_XUPD = ' '

* IMPORTING

* E_UPDATE =

TABLES

t_tdid = gt_tdid

* T_ACCDN =

* EXCEPTIONS

* NO_TEXTS_FOUND = 1

* INCORRECT_OBJECT = 2

* OTHERS = 3

Questa function farà comparire una popup come quella sottostante:





In questa popup è possibile inserire i testi necessari da allegare al documento contabile.

Per poter rendere effettive le modifiche è necessario chiamare la seguente funzione:

CALL FUNCTION 'FI_TEXTS_DOCUMENT_UPDATE'

EXPORTING

i_bukrs = g_bkpf-bukrs

i_gjahr = g_bkpf-gjahr

i_belnr = g_bkpf-belnr

i_intern = 'X'

i_update_deferred = ' '

EXCEPTIONS

error_message = 9.



Infine per poter leggere i testi appena creati basta chiamare la funzione indicando come name la concatenazione di bukrs + belnr + gjhar. ATTENZIONE: la società deve contenere eventualmente i caratteri blank.



CALL FUNCTION 'READ_TEXT'

EXPORTING

client = sy-mandt

id = '0001'

language = sy-langu

name = dat_call_bseg

object = 'BELEG'

* ARCHIVE_HANDLE = 0

* IMPORTING

* HEADER =

TABLES

lines = tb_testi

EXCEPTIONS

id = 1

language = 2

name = 3

not_found = 4

object = 5

reference_check = 6

wrong_access_to_archive = 7

OTHERS = 8.




Selezionare numero da range di numerazione

Oggi volevo descrivere una function che permette di ottenere il prossimo numero utile selezionato da un range di valori.
Nel mio caso particolare è utilizzata per ottenere il numero del documento contabile da creare.

La function prende in import la società, l'anno e il nome del range da selezionare.
Come output restituisce il numero selezionato dal range.


CALL FUNCTION 'RF_GET_DOCUMENT_NUMBER'
EXPORTING
company = documentheader-comp_code
range = w_numkr
year = documentheader-fisc_year
IMPORTING
document_number = num_doc
EXCEPTIONS
duplicate_number = 1
range_missing = 2
error_in_open_fi = 3
OTHERS = 4.

lunedì 15 giugno 2009

Selezionare directory locale

Questa function può essere utilizzata per poter selezionare una directory utilizzando l'espora risorse di Windows.
In particolare io l'ho utilizzata per far selezionare una directory nella quale salvare i pdf creati dal programma.


data: str_path type string.

CALL METHOD cl_gui_frontend_services=>directory_browse
* EXPORTING
* WINDOW_TITLE =
* INITIAL_FOLDER =
CHANGING
selected_folder = str_path
* EXCEPTIONS
* CNTL_ERROR = 1
* ERROR_NO_GUI = 2
* NOT_SUPPORTED_BY_GUI = 3
* others = 4.

Il risultato è la seguente popup:



Cerca stringa

Volevo segnalare questo programma molto utile trovato in rete.
In particolare il report prende in input tra i vari parametri una o più stringe e mostra l'elenco dei sorgenti che rispondono ai criteri di ricerca.
Davvero molto utile per ricercare un messaggio custom o un particolare tipo di errore.



REPORT zcercastringa LINE-COUNT 65
LINE-SIZE 220
NO STANDARD PAGE HEADING.
************************************************************************
* Utilità per la ricerca di una stringa di caratteri definita a *
* parametro nel sorgente di programmi ABAP/4 *
* I programmi possono essere fltrati per: *
* NOME PROGRAMMA e CLASSE DI SVILUPPO *
************************************************************************
TABLES: tadir, trdir.
*
SELECTION-SCREEN: SKIP 1,
BEGIN OF BLOCK blocco_a WITH FRAME TITLE text-100.
SELECT-OPTIONS : program FOR trdir-name,
unam FOR trdir-unam,
cnam FOR trdir-cnam.
PARAMETERS : p_string(50) TYPE c OBLIGATORY,
p_strin2(50) TYPE c,
p_strin3(50) TYPE c.
* P_CLASS(4) TYPE C.
SELECT-OPTIONS : s_class FOR tadir-devclass.
SKIP 1.

PARAMETERS : p_incl AS CHECKBOX DEFAULT 'X'.

SELECTION-SCREEN END OF BLOCK blocco_a.
*
DATA: x TYPE i.
DATA: vn_stampa TYPE i.
DATA: title(40) TYPE c.
DATA: y TYPE i.
DATA:ca-10(10) TYPE c.
DATA: BEGIN OF itab OCCURS 10.
INCLUDE STRUCTURE trdir.
INCLUDE STRUCTURE tadir.
DATA: title(40) TYPE c.
DATA: END OF itab.
DATA: va_prog(40).
DATA: va_riga(4) TYPE c.
DATA: bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA: wa_trdir LIKE trdir.
DATA: wa_tadir LIKE tadir.

DATA: BEGIN OF tb-prog OCCURS 100000,
line(250) TYPE c,
END OF tb-prog.
DATA: BEGIN OF btab OCCURS 50, "Hilfstabelle fuer Textpoolein-
code(72), "traege
END OF btab.
DATA: BEGIN OF no_textnumber OCCURS 50,
prog(8),
linenb(6) TYPE n,
numb(3),
line(72).
DATA: END OF no_textnumber.
DATA: BEGIN OF no_text_in_pool OCCURS 50,
prog(8),
linenb(6) TYPE n,
numb(3),
line(72).
DATA: END OF no_text_in_pool.
DATA: BEGIN OF wrong_text OCCURS 50,
prog(8),
linenb(6) TYPE n,
numb(3),
line(72).
DATA: END OF wrong_text.

DATA: BEGIN OF tb_tadir OCCURS 100.
INCLUDE STRUCTURE tadir.
DATA: END OF tb_tadir.
DATA: vn_progr(6) TYPE n,
fl_primo(1) TYPE c.
DATA: BEGIN OF stampa,
progr(6) TYPE c ,
filler1 TYPE c ,
name LIKE trdir-name , " release < 4.xx
** name(8) TYPE c , " release => 4.xx
filler2 TYPE c ,
devclass LIKE tadir-devclass,
filler3 TYPE c ,
author LIKE tadir-author ,
filler4 TYPE c ,
korrnum LIKE tadir-korrnum ,
filler5 TYPE c ,
unam LIKE trdir-unam ,
filler6 TYPE c ,
udat(10) TYPE c ,
riga(10) TYPE c,
filler7 TYPE c ,
prog-line LIKE tb-prog-line .
DATA: END OF stampa.

DATA flag.
*
DATA: BEGIN OF ttab OCCURS 50.
INCLUDE STRUCTURE textpool.
DATA: END OF ttab.

TOP-OF-PAGE.
FORMAT COLOR COL_HEADING .
* /001 (500) ,
WRITE: /8 'Nome '(501) ,
49 'Clas.'(502) ,
* 52 (503) ,
* 65 'Numero'(504) ,
104 'Autore'(505) ,
117 'Data'(506) ,
190 'Pagina',
/001 'Progr.'(510) ,
8 'programma'(511) ,
49 'svil. '(512) ,
80 'Creato da'(513) ,
* 85 'correzione'(514) ,
104 'modifica'(515),
117 'modifica'(516) ,
133 'riga',
140 'Contenuto riga'(517) ,
190 sy-pagno NO-ZERO .
*
SKIP 1.


START-OF-SELECTION.
CLEAR: fl_primo,
vn_progr.
*
SELECT * FROM tadir INTO TABLE tb_tadir
WHERE pgmid = 'R3TR'
AND object = 'PROG'
AND obj_name IN program
* and UNAM in UNAM
* and cNAM in cNAM
AND ( devclass IN s_class )
ORDER BY obj_name.


FORMAT COLOR COL_NORMAL.

LOOP AT tb_tadir.
MOVE-CORRESPONDING tb_tadir TO wa_tadir.
CLEAR trdir.
SELECT SINGLE * FROM trdir INTO wa_trdir
WHERE name = wa_tadir-obj_name.


CLEAR fl_primo.

READ REPORT wa_trdir-name INTO tb-prog.


LOOP AT tb-prog.
IF tb-prog-line CS p_string OR
tb-prog-line CS p_strin2 OR
tb-prog-line CS p_strin3.

CHECK sy-fdpos NE 0.

IF NOT p_incl IS INITIAL.
CHECK tb-prog-line+0(1) <> '*'.
ENDIF.
CLEAR stampa.
IF fl_primo IS INITIAL.
vn_stampa = 1.
MOVE 'X' TO fl_primo.
ADD 1 TO vn_progr.
WRITE vn_progr TO stampa-progr.
ENDIF.

IF flag = 'X'.
FORMAT COLOR COL_NORMAL INTENSIFIED OFF.
CLEAR flag.
ELSE.
FORMAT COLOR COL_NORMAL INTENSIFIED ON.
flag = 'X'.
ENDIF.

MOVE: wa_trdir-name TO stampa-name ,
wa_tadir-devclass TO stampa-devclass ,
wa_tadir-author TO stampa-author ,
wa_tadir-korrnum TO stampa-korrnum ,
sy-tabix TO stampa-riga,
wa_trdir-unam TO stampa-unam .
WRITE wa_trdir-udat TO stampa-udat DD/MM/YYYY.
MOVE tb-prog-line TO stampa-prog-line.
WRITE: /001 stampa.

IF vn_stampa = 1.
READ TEXTPOOL wa_trdir-name INTO ttab LANGUAGE wa_trdir-rload.
READ TABLE ttab WITH KEY id = 'R'.
** WRITE: 147 ttab-entry(70).
CLEAR vn_stampa.
ENDIF.

ENDIF.
ENDLOOP.
ENDLOOP.

AT LINE-SELECTION.

MOVE sy-lisel+7(40) TO va_prog.
MOVE sy-lisel+132(4) TO va_riga.
PERFORM view_dettaglio USING va_prog
va_riga.
*&-----------------------
*& Form view_dettaglio
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM view_dettaglio USING prog LIKE va_prog
riga LIKE va_riga.


PERFORM bdc_dynpro USING 'SAPLWBABAP' '0100'.

PERFORM bdc_field USING 'BDC_OKCODE'
'SHOP'.

PERFORM bdc_field USING 'RS38M-PROGRAMM'
prog.

PERFORM bdc_dynpro USING 'SAPLS38E' '0400'.
PERFORM bdc_field USING 'BDC_OKCODE'
'DCAN'.

PERFORM bdc_field USING 'RSTXP-TDFIRST'
riga.

CALL TRANSACTION 'SE38' USING bdcdata
MODE 'E' AND SKIP FIRST SCREEN.

REFRESH bdcdata.
clear bdcdata.
ENDFORM. " view_dettaglio
*----------------------------------------------------------------------*
* Start new screen *
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = 'X'.
APPEND bdcdata.
ENDFORM. "BDC_DYNPRO

*----------------------------------------------------------------------*
* Insert field *
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.

CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.

ENDFORM. "BDC_FIELD

Si comincia...

Apro questo blog per scrivere e condividere informazioni ed esperienze con tutte quelle persone che svolgono la mia stessa professione. Ovviamente sono ben accetti commenti e segnalazioni ad articoli interessanti riguardanti tutto il mondo SAP ed in particolare la programmazione ABAP.