Import de la función:
Tabla de retorno de la función:
Creación de estructura en la SE11:
Código fuente de la función:
DATA: lt_data TYPE STANDARD TABLE OF zcfcl_fi_es_tax,
ls_data TYPE zcfcl_fi_es_tax.
DATA: ls_t007a TYPE t007a,
lt_t007a TYPE STANDARD TABLE OF t007a,
lt_ftaxp TYPE STANDARD TABLE OF ftaxp,
ls_ftaxp TYPE ftaxp,
lv_kalsm TYPE t005-kalsm,
lv_txjcd TYPE txjcd.
DATA: lv_valor TYPE p DECIMALS 2.
CONSTANTS: lc_fix_kappl TYPE kappl VALUE 'TX'.
CLEAR lv_kalsm.
REFRESH: lt_t007a[], lt_ftaxp[], et_data[].
SELECT SINGLE kalsm FROM t005 INTO lv_kalsm
WHERE land1 EQ iv_land1.
IF sy-subrc EQ 0.
CLEAR lv_txjcd.
SELECT SINGLE txjcd FROM ttxj INTO lv_txjcd
WHERE kalsm EQ lv_kalsm.
IF sy-subrc NE 0 OR lv_txjcd IS INITIAL.
MOVE 'X' TO lv_txjcd.
ENDIF.
SELECT * FROM t007a INTO TABLE lt_t007a
WHERE kalsm EQ lv_kalsm.
IF sy-subrc EQ 0.
CLEAR ls_t007a.
LOOP AT lt_t007a INTO ls_t007a.
CALL FUNCTION 'GET_TAX_PERCENTAGE'
EXPORTING
aland = iv_land1
datab = sy-datum
mwskz = ls_t007a-mwskz
txjcd = lv_txjcd
TABLES
t_ftaxp = lt_ftaxp.
IF lt_ftaxp[] IS NOT INITIAL.
CLEAR ls_ftaxp.
READ TABLE lt_ftaxp INTO ls_ftaxp INDEX 1.
IF sy-subrc EQ 0.
MOVE-CORRESPONDING ls_ftaxp TO ls_data.
MOVE ls_t007a-mwskz TO ls_data-mwskz.
lv_valor = ls_ftaxp-kbetr / 10.
WRITE lv_valor TO ls_data-tax DECIMALS 2 .
REPLACE ALL OCCURRENCES OF '.' IN ls_data-tax WITH ','.
CONDENSE ls_data-tax.
APPEND ls_data TO lt_data.
ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.
MOVE lt_data[] TO et_data[].
*&---------------------------------------------------------------------*
*& Form F_GET_TEXT
*&---------------------------------------------------------------------*
FORM f_get_text USING p_v_obj TYPE tdobject
p_v_id TYPE tdid
p_v_langu TYPE spras
p_v_name TYPE tdobname
CHANGING p_v_string TYPE string.
DATA: lt_lines_tab TYPE efg_tab_tline,
ls_line_es TYPE tline,
lv_texto_line TYPE string.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = p_v_id
language = p_v_langu
name = p_v_name
object = p_v_obj
TABLES
lines = lt_lines_tab
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
LOOP AT lt_lines_tab INTO ls_line_es.
IF sy-tabix EQ 1.
p_v_string = ls_line_es-tdline.
ELSE.
CONDENSE ls_line_es-tdline.
CONCATENATE p_v_string ls_line_es-tdline INTO p_v_string SEPARATED BY space.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " F_GET_TEXT
LLAMADA A LA FORM: en este caso es un texto de posición.
DATA: lv_string TYPE string,
lv_name TYPE tdobname,
CLEAR: lv_string, lv_name.
CONCATENATE <fs_item>-vbeln <fs_item>-vbpos INTO lv_name.
PERFORM f_get_text USING 'VBBP'
'0001'
syst-langu
lv_name
CHANGING lv_string.
*&---------------------------------------------------------------------*
*& Form F_ALPHA_O
*&---------------------------------------------------------------------*
FORM f_alpha_o CHANGING p_v.
WRITE p_v TO p_v USING EDIT MASK '==ALPHA'.
CONDENSE p_v.
ENDFORM. " F_ALPHA_O
Llamada a la form:
DATA: lv_variable TYPE c LENGTH 5 VALUE '00005'.
PERFORM f_alpha_o CHANGING lv_variable.
*&---------------------------------------------------------------------*
*& Form F_GET_SET_DATA
*&---------------------------------------------------------------------*
FORM f_get_set_data TABLES p_t_range
USING p_v_set.
REFRESH: p_t_range[].
SELECT setleaf~valsign AS sign
setleaf~valoption AS option
setleaf~valfrom AS low
setleaf~valto AS high
INTO CORRESPONDING FIELDS OF TABLE p_t_range
FROM setheader INNER JOIN setleaf
ON setleaf~setclass EQ setheader~setclass
AND setleaf~subclass EQ setheader~subclass
AND setleaf~setname EQ setheader~setname
WHERE setheader~setname EQ p_v_set.
ENDFORM. "f_get_set_data
INVOCAR LA FORM:
RANGES:
lr_kschl FOR komv-kschl.
PERFORM f_get_set_data TABLES lr_kschl
USING 'Z0004'. "set creado en la trx GS01
Se creara una función.
1.- Crear "Grupo de Funciones" (se80).
2.- Crear "Módulo de Funciones".
En la pestaña "Import" agregar los nombre de parámetros mostrados en la figura.
IV_SET_NAME (nombre del set de datos)
IV_DATA_ELEMENT (nombre del elemento de datos relacionado al set de datos)
3.- En la pestaña "Tablas", ingresar nombre de parámetro...
ET_RANGE (es un rango, contendrá los datos del set datos)
4.- Finalmente en la pestaña "Código fuente" copiar el siguiente código:
DATA: lv_new_setid TYPE sethier-setid,
lt_set_lines_basic TYPE STANDARD TABLE OF rgsbv,
ls_set_lines_basic TYPE rgsbv.
DATA: ls_tab TYPE REF TO cl_rs_struc,
lo_data TYPE REF TO data.
FIELD-SYMBOLS: <tabla> TYPE STANDARD TABLE,
<linea> TYPE any,
<campo> TYPE any.
CREATE OBJECT ls_tab.
CALL METHOD ls_tab->add_element
EXPORTING
i_sconame = 'SIGN'
i_type = 'CHAR01'.
CALL METHOD ls_tab->add_element
EXPORTING
i_sconame = 'OPTION'
i_type = 'CHAR02'.
CALL METHOD ls_tab->add_element
EXPORTING
i_sconame = 'LOW'
i_type = iv_data_element.
CALL METHOD ls_tab->add_element
EXPORTING
i_sconame = 'HIGH'
i_type = iv_data_element.
CALL METHOD ls_tab->create
EXPORTING
i_dynamic = rs_c_false
RECEIVING
r_r_data = lo_data
EXCEPTIONS
wrong_struc_definition = 1
no_struc_definition = 2
OTHERS = 3.
ASSIGN lo_data->* TO <linea>.
CREATE DATA lo_data LIKE TABLE OF <linea>.
ASSIGN lo_data->* TO <tabla>.
REFRESH: et_range[].
PERFORM f_get_set_data TABLES <tabla>
USING iv_set_name.
MOVE <tabla>[] TO et_range[].
*&--------------------------------------------------------------*
*& Form F_GET_SET_DATA
*&--------------------------------------------------------------*
FORM f_get_set_data TABLES p_t_range
USING p_v_set.
REFRESH: p_t_range[].
SELECT setleaf~valsign AS sign
setleaf~valoption AS option
setleaf~valfrom AS low
setleaf~valto AS high
INTO CORRESPONDING FIELDS OF TABLE p_t_range
FROM setheader INNER JOIN setleaf
ON setleaf~setclass EQ setheader~setclass
AND setleaf~subclass EQ setheader~subclass
AND setleaf~setname EQ setheader~setname
WHERE setheader~setname EQ p_v_set.
ENDFORM. "f_get_set_data
4.- Utilización:
RANGES: lr_auart FOR vbak-auart.
REFRESH: lr_auart[].
CALL FUNCTION 'ZCFCL_FILL_SET'
EXPORTING
iv_set_name = 'ZCFCL_SD_AUART_KIT'
iv_data_element = 'AUART'
TABLES
et_range = lr_auart.
En el rango "LR_AUART" tenemos los datos del set.