giovedì 26 novembre 2009

Caricare una immagine in una dynpro

Per poter caricare una immagine è necessario caricarla sul server sap seguendo le seguenti istruzioni:
-From transaction SMW0, select Binary data for WEBRFC applications.
-The new logo must be in a .gif format.
-From this transaction create a new object and then choose IMPORT.

Successivamente inserire il seguente codice nel PAI della dynpro:

DATA container TYPE REF TO cl_gui_custom_container.
DATA picture TYPE REF TO cl_gui_picture.
CLASS cl_gui_cfw DEFINITION LOAD.


CREATE OBJECT container
EXPORTING container_name = 'CUSTOM'.
" nome del container custom

CREATE OBJECT picture
EXPORTING parent = container.

CALL METHOD picture->set_display_mode
EXPORTING display_mode = 1.
CALL METHOD picture->set_3d_border
EXPORTING border = 1.

CLEAR url.
PERFORM load_pic_from_db CHANGING url.


CALL METHOD picture->load_picture_from_url
EXPORTING url = url.
init = 'X'.

CALL METHOD cl_gui_cfw=>flush
EXCEPTIONS cntl_system_error = 1
cntl_error = 2.



FORM load_pic_from_db CHANGING url.

DATA query_table LIKE w3query OCCURS 1 WITH HEADER LINE.
DATA html_table LIKE w3html OCCURS 1.
DATA return_code LIKE w3param-ret_code.
DATA content_type LIKE w3param-cont_type.
DATA content_length LIKE w3param-cont_len.
DATA pic_data LIKE w3mime OCCURS 0.
DATA pic_size TYPE i.

REFRESH query_table.
query_table-name = '_OBJECT_ID'.
query_table-value = 'ZTAGETIK'.
" Inserire il nome dell'immagine custom
APPEND query_table.

CALL FUNCTION 'WWW_GET_MIME_OBJECT'
TABLES
query_string = query_table
html = html_table
mime = pic_data
CHANGING
return_code = return_code
content_type = content_type
content_length = content_length
EXCEPTIONS
invalid_table = 1
parameter_not_found = 2
OTHERS = 3.
IF sy-subrc = 0.
pic_size = content_length.
ENDIF.

CALL FUNCTION 'DP_CREATE_URL'
EXPORTING
type = 'image'
subtype = cndp_sap_tab_unknown
size = pic_size
lifetime = cndp_lifetime_transaction
TABLES
data = pic_data
CHANGING
url = url
EXCEPTIONS
OTHERS = 1.

ENDFORM.

mercoledì 18 novembre 2009

Sottomettere RSNAST00 e ottenere N° spool

DATA: v_jobgroup LIKE  tbtcjob-jobgroup.
DATA: v_jobname LIKE tbtcjob-jobname.
DATA: v_jobcount LIKE tbtcjob-jobcount.
DATA: v_status TYPE tbtco-status.
DATA: v_spool TYPE tbtcp-listident.
RANGES: r_kappl FOR nast-kappl,
r_objky FOR nast-objky,
r_kschl FOR nast-kschl,
r_nacha FOR nast-nacha.


MOVE: '1209770006' TO r_objky-low,
'EQ' TO r_objky-option,
'I' TO r_objky-sign.
APPEND r_objky.

MOVE: 'ZADC' TO r_kschl-low,
'EQ' TO r_kschl-option,
'I' TO r_kschl-sign.

APPEND r_kschl.

MOVE: '1' TO r_nacha-low,
'EQ' TO r_nacha-option,
'I' TO r_nacha-sign.

APPEND r_nacha.



MOVE: 'V3' TO r_kappl-low,
'EQ' TO r_kappl-option,
'I' TO r_kappl-sign.

APPEND r_kappl.




v_jobgroup = 'Test'.
v_jobname = sy-repid.

CALL FUNCTION 'JOB_OPEN'
EXPORTING
jobgroup = v_jobgroup
jobname = v_jobname
IMPORTING
jobcount = v_jobcount
EXCEPTIONS
cant_create_job = 1
invalid_job_data = 2
jobname_missing = 3
OTHERS = 4.



SUBMIT rsnast00
VIA JOB v_jobname
NUMBER v_jobcount
WITH s_kappl IN r_kappl
WITH s_objky IN r_objky
WITH s_kschl IN r_kschl
WITH s_nacha IN r_nacha " '1'
WITH p_again = vstato
AND RETURN.



*Close job to start immediately
CALL FUNCTION 'JOB_CLOSE'
EXPORTING
jobcount = v_jobcount
jobname = v_jobname
strtimmed = 'X'
EXCEPTIONS
cant_start_immediate = 1
invalid_startdate = 2
jobname_missing = 3
job_close_failed = 4
job_nosteps = 5
job_notex = 6
lock_failed = 7
OTHERS = 8.

* Check the status.
DO.
SELECT SINGLE status FROM tbtco
INTO v_status
WHERE jobname = v_jobname
AND jobcount = v_jobcount.

IF sy-subrc = 0 AND v_status = 'F'.
EXIT.
ENDIF.

ENDDO.

* Get the spool
SELECT SINGLE listident FROM tbtcp
INTO v_spool
WHERE jobname = v_jobname
AND jobcount = v_jobcount.

WRITE: / v_spool.

giovedì 12 novembre 2009

Generare ALV dinamicamente da tabella interna

Ecco un esempio di report che genera un ALV dinamicamente in base ai campi di una tabella interna. L'unica attenzione è che il report non deve avere righe più lunghe di 72 caratteri.


TYPE-POOLS: slis.
DATA: lt_layout TYPE slis_layout_alv.

DATA: BEGIN OF tb_tb001 OCCURS 0,
bukrs TYPE bukrs,
butxt TYPE butxt,
ort01 TYPE ort01,
land1 TYPE land1.
DATA: END OF tb_tb001.

DATA t_fil TYPE slis_t_fieldcat_alv.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = sy-repid
i_internal_tabname = 'TB_TB001'
* I_STRUCTURE_NAME =
* I_CLIENT_NEVER_DISPLAY = 'X'
i_inclname = sy-repid
i_bypassing_buffer = 'X'
* I_BUFFER_ACTIVE =
CHANGING
ct_fieldcat = t_fil
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

SELECT * FROM t001 INTO CORRESPONDING FIELDS OF TABLE tb_tb001.

lt_layout-zebra = 'X'.
lt_layout-colwidth_optimize = 'X'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
is_layout = lt_layout
it_fieldcat = t_fil
TABLES
t_outtab = tb_tb001
EXCEPTIONS
program_error = 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.

Listare contenuto di una directory

Per poter listare il contenuto di una directory locale del server SAP è possibile utilizzare la seguente function:

EPS_GET_DIRECTORY_LISTING

La function accetta come parametri una directory di partenza e restituisce una tabella contenente la lista dei file presenti.

mercoledì 11 novembre 2009

Customizzare formato data e numero

Nella tabella T005X è possibile customizzare il formato della data e dei numeri rappresentati in sistema.
La scelta avviene per paese.

Ecco un esempio delle possibili scelte per la rappresentazione dei numeri:


Per poter usufruire della customizzazione appena fatta è necessario impostare il paese nel programma generato utilizzando l'istruzione

SET COUNTRY 'IT'.

martedì 20 ottobre 2009

Aggiornare statistiche tabella

Per migliorare le prestazioni di accesso ad una tabella è possibile utilizzare la transazione
DB20

E' necessario inserire il nome della tabella da aggiornare e selezionare dal menu Operazioni -> Creare statistica.



giovedì 8 ottobre 2009

SE16N

Se dovesse capitare di dover cancellare o modificare i record di una tabella, è possibile utilizzare la transazione SE16N.

Dalla prima schermata, inserendo il codice &SAP_EDIT nel box dei comandi, il sistema abilità numerose funzionalità, tra cui quella di cancellare massivamente i record.

mercoledì 16 settembre 2009

Selezionare layout alv come parameter

Può capitare di voler lanciare un report che utilizza una ALV e di voler visualizzare il risultato utilizzando un layout precedentemente salvato.
Per far ciò è possibile utilizzare il seguente codice:

Definire il parameter per il layout:

PARAMETERS: pa_vari TYPE slis_vari.


Implementare una function che verrà chiamata come help di ricerca del parametro in selezione:

AT SELECTION-SCREEN ON VALUE-REQUEST FOR pa_vari.
PERFORM alv_variant_f4 CHANGING pa_vari.



La funzione alv_variant_f4 avrà il seguente codice:

FORM alv_variant_f4 CHANGING pa_vari.
DATA: rs_variant LIKE disvariant.
DATA nof4 TYPE c.

CLEAR nof4.
LOOP AT SCREEN.
IF screen-name = 'PA_VARI'.
IF screen-input = 0.
nof4 = 'X'.
ENDIF.
ENDIF.
ENDLOOP.

rs_variant-report = sy-repid.
rs_variant-username = sy-uname.
CALL FUNCTION 'REUSE_ALV_VARIANT_F4'
EXPORTING
is_variant = rs_variant
i_save = 'A'
IMPORTING
es_variant = rs_variant
EXCEPTIONS
OTHERS = 1.
IF sy-subrc = 0 AND nof4 EQ space.
pa_vari = rs_variant-variant.
ENDIF.
ENDFORM.


Successivamente muovere il layout selezionato nel layout da utilizzare nell'alv:

MOVE pa_vari TO gs_variant-variant.

e passare il parametro alla function 'REUSE_ALV_GRID_DISPLAY' :

is_variant = gs_variant

Il risultato è una popup simile a quella mostrata in figura:




Modificare font e colori dell'abap editor

Stanco del solito font o i soliti colori dell'apab editor???

puoi scegliere la combinazione di colori che più ti piace cliccando sul pulsante in fondo a destra della sapgui quando viene visualizzato il codice di un qualsiasi programma:

A questo punto comparirà una schermata come questa:




Dopo aver scelto la combinazione migliore basta salvare le modifiche.

Disattivare suoni SAPGUI

Siete stanchi dei suoni emessi dalla sap gui??
Disattiviamoli!

Dalla barra selezionare l'ultimo pulsante sulla destra:



e successivamente selezionare la voce "parametrizzazione desing".
A questo punto disattivare i suoni!

martedì 15 settembre 2009

Cancellare WorkItem

Per poter cancellare tutti o parte dei workitem presenti nel sapoffice è possibile utilizzare il seguente programma:

RSWWWIDE

Il programma nella sua schermata iniziale permette di filtrare i workitem da cancellare con vari criteri.
Una volta ottenuto il risultato sotto forma di ALV è sufficiente selezionare quelli da cancellare e cliccare sul bidone.

lunedì 14 settembre 2009

Per sostituire il carattere speciale "&" all'interno di un testo è possibile utilizzare la seguente function:

CALL FUNCTION 'FIEB_REPLACE_AMPERSAND_MESSAGE'
EXPORTING
im_text = lines-tdline
im_msgv1 = data
IMPORTING
ex_text = lines-tdline.



In particolare la funzione sostituisce la stringa "data" all'interno del testo "tdline".

mercoledì 5 agosto 2009

Leggere intestazione tabella

Questa function permette di leggere tutte le descrizioni di tutti i campi di una tabella e li concatena in una unica stringa.

DATA
:
va_desc(4096) TYPE c.
PERFORM read_table_fields USING 'BKPF' va_desc.


FORM
read_table_fields USING i_table va_record.

CLEAR va_record.

DATA: subrc LIKE sy-subrc,
help_fields LIKE dfies,
fieldname LIKE dfies-fieldname,
fieldsandtext_line TYPE gd13_fields_text.

CALL FUNCTION 'G_FIELD_SET'
EXPORTING
ftype = ' '
langu = sy-langu
table = i_table
text_flag = 'X'
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING not_found.
ENDIF.

CALL FUNCTION 'G_FIELD_GET'
IMPORTING
field_attr = help_fields
subrc = subrc
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING not_found.
ENDIF.
fieldname = help_fields-fieldname.
fieldsandtext_line-fieldname = help_fields-fieldname.
fieldsandtext_line-scrtext_m = help_fields-scrtext_m.
WHILE subrc = 0.
READ TABLE e_t_fields INTO fieldname WITH KEY fieldname.
CONCATENATE va_record fieldsandtext_line-scrtext_m ';'
INTO va_record.
CONDENSE va_record.
CALL FUNCTION 'G_FIELD_GET'
IMPORTING
field_attr = help_fields
subrc = subrc
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
RAISING not_found.
ENDIF.
fieldname = help_fields-fieldname.
fieldsandtext_line-fieldname = help_fields-fieldname.
fieldsandtext_line-scrtext_m = help_fields-scrtext_m.
ENDWHILE.

ENDFORM. " read_table_fields


martedì 4 agosto 2009

Selezionare file locale

DATA: tb_path_in TYPE file_table OCCURS 0,
wa_path TYPE file_table.
DATA: in_str TYPE string.
CLEAR tb_path_in.

CALL METHOD cl_gui_frontend_services=>file_open_dialog
* EXPORTING
* WINDOW_TITLE =
* DEFAULT_EXTENSION =
* DEFAULT_FILENAME =
* FILE_FILTER =
* INITIAL_DIRECTORY =
* MULTISELECTION =
* WITH_ENCODING =
CHANGING
file_table = tb_path_in
rc = rc.

READ TABLE tb_path_in INDEX 1 INTO wa_path.
MOVE wa_path-filename TO p_in.
MOVE wa_path-filename TO in_str.

lunedì 3 agosto 2009

Ottenere tutti i valori di un set

Creare la seguente funzione:

FUNCTION ZGET_SET.
*"--------------------------------------------------------------------
*"*"Interfaccia locale:
*" IMPORTING
*" REFERENCE(NOME) TYPE RGSBM-SHORTNAME
*" TABLES
*" TAB STRUCTURE HRRANGES
*" EXCEPTIONS
*" SET_NOT_FOUND
*" SET_IS_EMPTY
*"--------------------------------------------------------------------



DATA: va_new_set_id LIKE sethier-setid.
DATA: tb_option LIKE rgsb4 OCCURS 0 WITH HEADER LINE.


IF nome IS INITIAL.
MESSAGE i208(00) WITH 'Il nome del set non può essere vuoto'
RAISING set_is_empty.
ENDIF.

CALL FUNCTION 'G_SET_GET_ID_FROM_NAME'
EXPORTING
shortname = nome
IMPORTING
new_setid = va_new_set_id.

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 'G_SET_GET_ALL_VALUES'
EXPORTING
setnr = va_new_set_id
TABLES
set_values = tb_option.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

CLEAR tb_option.
LOOP AT tb_option.
CLEAR tab.
IF tb_option-to = tb_option-from.
tab-sign = 'I'.
tab-opti = 'EQ'.
tab-low = tb_option-from.
ELSE.
tab-sign = 'I'.
tab-opti = 'BT'.
tab-low = tb_option-from.
tab-high = tb_option-to.
ENDIF.
APPEND tab.
ENDLOOP.




ENDFUNCTION.

venerdì 24 luglio 2009

Ottenere n° spool

A volte può essere necessario ottenere il numero di spool appena creato utilizzando solo la descrizione dello spool. Per far ciò è possibile utilizzare la funzione standard

CALL FUNCTION 'RSPO_FIND_SPOOL_REQUESTS'
EXPORTING
* ALLCLIENTS = ' '
* AUTHORITY = ' '
* DATATYPE = '*'
* HAS_OUTPUT_REQUESTS = '*'
* RQ0NAME = '*'
* RQ1NAME = '*'
rq2name = rq2name
* RQDEST = '*'
* RQIDENT = 0
* RQOWNER = SY-UNAME
TABLES
spoolrequests = t_spool
* EXCEPTIONS
* NO_PERMISSION = 1
* OTHERS = 2 .


In particolare io avevo assegnato alla variabile rq2name il numero dell'oridne di acquisto

MOVE tb_ekko-ebeln TO rq2name.

Creare messaggio sulla NAST

Per poter generare un messaggio sulla tabella di sistema NAST è possibile utilizzare il seguente codice:

DATA: XNAST LIKE VNAST OCCURS 20 WITH HEADER LINE.

Per prima cosa devono essere selezionate dalla tabella t685b le caratteristiche del messaggio che vogliamo creare; nel mio caso era un messaggio custom (v_kschl = 'ZPDF').

SELECT SINGLE * FROM t685b
WHERE kappl = 'EF' AND kschl = v_kschl.


Successivamente è necessario valorizzare la tabella interna che conterrà tutte le info del messaggio che stiamo creando:

xnast-kappl = 'EF'.
xnast-mandt = sy-mandt.
xnast-objky = tb_ekko-ebeln.
xnast-kschl = 'ZPDF'.
xnast-spras = sy-langu.
xnast-erdat = '20080202'.
xnast-nacha = t685b-nacha .
xnast-anzal = 0 .
xnast-vsztp = t685b-vsztp .
xnast-usnam = sy-uname .
xnast-ldest = 'LOCL'.
xnast-objtype = 'BUS2012'.
xnast-nauto = 'X'.
xnast-vstat = '0'.
xnast-dsuf2 = tb_ekko-ebeln.
xnast-tdid ='BEWG'.
xnast-tdspras = 'IT'.
xnast-tdreceiver = sy-uname .
xnast-tdcovtitle = 'NEW PURCHASE ORDER PRINTOUT'.

APPEND xnast.

Una volta valorizzata la tabella dovranno essere chiamate le seguenti funzioni:

CALL FUNCTION 'RV_MESSAGES_INSERT'
TABLES
tab_xnast = xnast
EXCEPTIONS
OTHERS = 1.

CALL FUNCTION 'RV_MESSAGES_UPDATE'
EXPORTING
msg_kappl = xnast-kappl
msg_no_update_task = 'X'
EXCEPTIONS
OTHERS = 1.

giovedì 23 luglio 2009

Importare un file xls in una tabella interna

Per porter importare un file excel in una tabella interna è possibile utilizzare la seguente funzione:

DATA
: tb_excel TYPE alsmex_tabline OCCURS 0.

CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = p_file
i_begin_col = 2
i_begin_row = 3
i_end_col = 6
i_end_row = 10000
TABLES
intern = tb_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.


E' necessario dichiarare l'area in cui si trovano i dati.
Una volta eseguita la funzone verrà valorizzata la tabella tb_excel . Questa tabella ha una riga per ogni cella letta nel file xls.
La riga della tabella è strutturata con 3 valori: riga, colonna e valore.

Per porter splittare i dati nel modo corretto è possibile usare questo semplice loop:

FIELD-SYMBOLS (c) TYPE any.

LOOP AT tb_excel INTO wa_excel.
ASSIGN COMPONENT wa_excel-col OF STRUCTURE wa_xls TO (c) .
IF sy-subrc = 0.
MOVE wa_excel-value TO (c).
ENDIF.
AT END OF row.
APPEND wa_xls TO tb_xls.
CLEAR wa_xls.
ENDAT.
ENDLOOP.


L'oggetto tb_xls è la tabella che identifica correttamente una riga del nostro xls. Nel mio caso particolare la struttura era formata da :

DATA: BEGIN OF tb_xls OCCURS 0.
DATA: kunnr TYPE kunnr,
zkprot TYPE zkprot,
zkddef(10),
barcode TYPE bds_bar_in-barcode,
tipo .
DATA: END OF tb_xls.

martedì 21 luglio 2009

export e import da memory

Se si ha la necessità di esportare dati da programmi che non condividono la stessa area di memoria è possibile utilizzare le seguenti istruzioni:

nel programma principale usare:

export wa_ktokk to MEMORY ID 'ZZKTOKK'.


Nel secondo programma sarà possibile chiamare l'istruzione:

import wa_ktokk from MEMORY ID 'ZZKTOKK'.


NB: non è un caso che i nomi delle variabili siano gli stessi; è necessario che siano uguali!!!

giovedì 16 luglio 2009

Evidenziare CR

Un modo molto comodo di dare visibilità alle CR nella propria lista è aggiungere alla descrizione il codice @0A@ in modo da far comparire un semaforo di colore rosso.

Ecco il risultato:


Un elenco di codici di icone:

ICON_GREEN_LIGHT Semaf.verde;procedere;corretto @08@
ICON_YELLOW_LIGHT Semaforo giallo; attenzione @09@
ICON_RED_LIGHT Semaforo rosso; stop; errato @0A@

Per visualizzare l'eleco completo dei codici icona, dall'help selezionare "list of icons" e successivamente leggere nella colonna "interno" la coppia di lettere.

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.