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.