Difference between revisions of "SAP ABAP FIELD EXIT"
From SapWiki
(Created page with "*NOTA: Para poder activar los Field Exits debemos tener el parámetro abap/fieldexit = YES seteado en el servidor (Transacción RZ10). *Crear field exit: # ejecutar reporte...") |
|||
| (3 intermediate revisions by the same user not shown) | |||
| Line 7: | Line 7: | ||
*Ejemplo, validar campo KBSTAT en trn. VK11, VK12 & VK13 | *Ejemplo, validar campo KBSTAT en trn. VK11, VK12 & VK13 | ||
| − | FUNCTION field_exit_kbstat. | + | <nowiki>FUNCTION field_exit_kbstat. |
| − | + | *"---------------------------------------------------------------------- | |
| − | + | *"*"Interfase local | |
| − | + | *" IMPORTING | |
| − | + | *" REFERENCE(INPUT) | |
| − | + | *" EXPORTING | |
| − | + | *" REFERENCE(OUTPUT) | |
| − | + | *"---------------------------------------------------------------------- | |
| − | + | DATA wa_por_niv_sec TYPE zsd_por_niv_sec. | |
| − | + | DATA: w_eval LIKE dynpread-fieldvalue. | |
| − | + | DATA: w_eval_2 LIKE dynpread-fieldvalue. | |
| − | + | DATA: w_eval_3 LIKE dynpread-fieldvalue. | |
| − | + | DATA l_matnr TYPE mara-matnr. | |
| − | + | DATA l_spart TYPE mara-spart. | |
| − | + | DATA l_por TYPE zsd_por_niv_sec-por_01. | |
| − | + | DATA l_por_i TYPE konp-kbetr. | |
| − | + | DATA l_input(1). | |
| − | + | DATA l_sizec LIKE gt_t691i-sizec. | |
| − | + | DATA t185v TYPE t185v. | |
| − | + | DATA ls_t681s TYPE t681s. | |
| − | + | DATA l_kschl TYPE rv13a-kschl. | |
| − | + | DATA: lw_var(40) TYPE c. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | + | FIELD-SYMBOLS <fs> TYPE any. | |
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | FUNCTION Z_C14Z_DYNP_READ_FIELD. | + | lw_var = '(SAPMV13A)T681S'. |
| − | *"---------------------------------------------------------------------- | + | ASSIGN (lw_var) TO <fs>. |
| − | + | IF sy-subrc = 0 AND <fs> IS ASSIGNED. | |
| − | + | MOVE <fs> TO ls_t681s. | |
| − | + | ENDIF. | |
| − | + | ||
| − | + | IMPORT t185v FROM MEMORY | |
| − | + | ID 'SD_COND_MEM_01'. | |
| − | + | ||
| − | + | CHECK sy-tcode = 'VK12' OR sy-tcode = 'VK11' OR sy-tcode = 'VK13'. | |
| − | + | CHECK sy-title(1) <> 'V'. "Visualizar | |
| − | + | ||
| − | + | GET PARAMETER ID 'VKS' FIELD l_kschl. | |
| − | + | CHECK l_kschl = 'ZAB0' | |
| − | + | OR l_kschl = 'ZAB1' | |
| − | + | OR l_kschl = 'ZAB2' | |
| − | + | OR l_kschl = 'ZAB3' | |
| − | + | OR l_kschl = 'ZAB4' | |
| − | + | OR l_kschl = 'ZAB5'. | |
| − | + | ||
| − | + | MOVE input TO l_input. | |
| − | + | ||
| − | + | IF l_input IS INITIAL. | |
| − | + | MESSAGE e000(0k) WITH 'Error:' | |
| − | + | 'debe ingresar valor en Status de tratamiento'. | |
| − | + | ENDIF. | |
| − | + | ||
| − | + | l_por = 0. | |
| − | + | l_por_i = 0. | |
| − | + | CLEAR w_eval. | |
| − | + | ||
| − | + | * copia de C14Z_DYNP_READ_FIELD, permite leer valores de una línea de tabla | |
| − | + | CALL FUNCTION 'Z_C14Z_DYNP_READ_FIELD' | |
| − | + | EXPORTING | |
| − | + | i_program = 'SAPMV13A' | |
| − | + | i_dynpro = ls_t681s-dynpronr "'1305' | |
| − | + | i_fieldname = 'KOMG-MATNR' | |
| − | + | i_fieldname_2 = 'KONP-KBETR' | |
| − | + | i_fieldname_3 = 'KOMG-SPART' | |
| − | + | i_flg_steploop = 'X' | |
| − | + | i_flg_request = 'X' | |
| − | + | CHANGING | |
| − | + | e_value = w_eval "material | |
| − | + | e_value_2 = w_eval_2 "porcentaje | |
| − | + | e_value_3 = w_eval_3. "sector | |
| − | + | ||
| − | + | ||
| − | + | MOVE w_eval TO l_matnr. | |
| − | + | ||
| − | + | CONDENSE w_eval_3. | |
| − | + | MOVE w_eval_3 TO l_spart. | |
| − | + | ||
| − | + | CONDENSE w_eval_2. | |
| − | + | TRANSLATE w_eval_2 USING ',.'. | |
| − | + | MOVE w_eval_2 TO l_por_i. | |
| − | + | ||
| − | + | * insert some logic here | |
| − | + | ||
| − | + | * | |
| − | + | ||
| − | + | IF 1 = 2 . "dummy, asignación de valor posible a campo | |
| − | + | output = 'B'. | |
| − | + | ELSE. | |
| − | + | output = 'L'. | |
| − | + | ENDIF. | |
| − | + | ||
| − | + | IF l_input <> output. | |
| − | + | MESSAGE e000(0k) WITH 'Error en Status de tratamiento:' | |
| − | + | 'Solo se permite valor' | |
| − | + | output. | |
| − | + | ENDIF. | |
| − | + | ||
| − | + | ENDFUNCTION. | |
| − | + | ||
| − | + | FUNCTION Z_C14Z_DYNP_READ_FIELD. | |
| − | + | *"---------------------------------------------------------------------- | |
| − | + | *"*"Interfase local | |
| − | + | *" IMPORTING | |
| − | + | *" VALUE(I_PROGRAM) LIKE D020S-PROG | |
| − | + | *" VALUE(I_DYNPRO) LIKE D020S-DNUM | |
| − | + | *" VALUE(I_FIELDNAME) LIKE DYNPREAD-FIELDNAME | |
| − | + | *" REFERENCE(I_FIELDNAME_2) TYPE DYNPREAD-FIELDNAME OPTIONAL | |
| − | + | *" REFERENCE(I_FIELDNAME_3) LIKE DYNPREAD-FIELDNAME OPTIONAL | |
| − | + | *" VALUE(I_FLG_STEPLOOP) TYPE C | |
| − | + | *" VALUE(I_FLG_REQUEST) TYPE ESP1_BOOLEAN DEFAULT ESP1_FALSE | |
| − | + | *" EXPORTING | |
| − | + | *" VALUE(E_STEPL) LIKE SY-STEPL | |
| − | + | *" VALUE(E_FLG_FIELD_INPUT) TYPE ESP1_BOOLEAN | |
| − | + | *" CHANGING | |
| − | + | *" VALUE(E_VALUE) LIKE DYNPREAD-FIELDVALUE | |
| − | + | *" VALUE(E_VALUE_2) LIKE DYNPREAD-FIELDVALUE OPTIONAL | |
| − | + | *" VALUE(E_VALUE_3) LIKE DYNPREAD-FIELDVALUE OPTIONAL | |
| − | + | *"---------------------------------------------------------------------- | |
| − | + | ||
| − | + | DATA: BEGIN OF DYNPTAB OCCURS 1. | |
| − | + | INCLUDE STRUCTURE DYNPREAD. | |
| − | + | DATA: END OF DYNPTAB. | |
| − | + | ||
| − | + | DATA: STEPL LIKE SY-STEPL. | |
| − | + | ||
| − | + | * Begin Correction 05.07.2004 751985 *********************************** | |
| − | + | DATA: request LIKE d020s-type. | |
| − | + | * End Correction 05.07.2004 751985 ************************************* | |
| − | + | ||
| − | + | * Initialization | |
| − | + | TRANSLATE i_program TO UPPER CASE. "#EC TRANSLANG | |
| − | + | " translate i_dynpro to upper case. | |
| − | + | TRANSLATE I_FIELDNAME TO UPPER CASE. "#EC TRANSLANG | |
| − | + | ||
| + | * Get the currently entered value | ||
| + | CLEAR E_STEPL. | ||
| + | clear e_value_2. | ||
| + | IF I_FLG_STEPLOOP = 'X'. | ||
| + | * CALL FUNCTION 'DYNP_GET_STEPL' | ||
| + | * IMPORTING | ||
| + | * POVSTEPL = STEPL | ||
| + | * EXCEPTIONS | ||
| + | * STEPL_NOT_FOUND = 01. | ||
| + | * E_STEPL = STEPL. | ||
| + | move sy-STEPL to E_STEPL. | ||
| + | move sy-STEPL to STEPL. | ||
| + | ENDIF. | ||
| + | |||
| + | DYNPTAB-FIELDNAME = I_FIELDNAME. | ||
| + | DYNPTAB-STEPL = STEPL. | ||
| + | APPEND DYNPTAB. | ||
| + | |||
| + | * Begin Correction 05.07.2004 751985 *********************************** | ||
| + | * Check whether the field accepts input | ||
| + | IF ( i_flg_request = 'X' ). | ||
| + | request = 'A'. | ||
| + | ELSE. | ||
| + | CLEAR: request. | ||
| + | ENDIF. " IF ( i_flg_request = esp1_true | ||
| + | |||
| + | CALL FUNCTION 'DYNP_VALUES_READ' | ||
| + | EXPORTING | ||
| + | DYNAME = I_PROGRAM | ||
| + | DYNUMB = I_DYNPRO | ||
| + | request = request | ||
| + | TABLES | ||
| + | DYNPFIELDS = DYNPTAB | ||
| + | * TRANSLATE_TO_UPPER = ' ' | ||
| + | EXCEPTIONS | ||
| + | INVALID_ABAPWORKAREA = 01 | ||
| + | INVALID_DYNPROFIELD = 02 | ||
| + | INVALID_DYNPRONAME = 03 | ||
| + | INVALID_DYNPRONUMMER = 04 | ||
| + | INVALID_REQUEST = 05 | ||
| + | NO_FIELDDESCRIPTION = 06 | ||
| + | UNDEFIND_ERROR = 07. | ||
| + | * End Correction 05.07.2004 751985 ************************************* | ||
| + | |||
| + | * IF i_flg_steploop = 'X'. | ||
| + | * READ TABLE DYNPTAB WITH KEY FIELDNAME = I_FIELDNAME STEPL = STEPL. | ||
| + | * ELSE. | ||
| + | * READ TABLE DYNPTAB WITH KEY FIELDNAME = I_FIELDNAME. | ||
| + | * ENDIF. | ||
| + | |||
| + | * read TABLE DYNPTAB with key FIELDNAME = 'KONP-KONWA' STEPL = STEPL. | ||
| + | * if sy-subrc = 0 and dynptab-fieldvalue = '%'. | ||
| + | READ TABLE DYNPTAB WITH KEY FIELDNAME = I_FIELDNAME STEPL = STEPL. | ||
| + | if sy-subrc = 0. | ||
| + | e_value = dynptab-fieldvalue. | ||
| + | endif. | ||
| + | read TABLE DYNPTAB with key FIELDNAME = I_FIELDNAME_2 STEPL = STEPL. | ||
| + | if sy-subrc = 0. | ||
| + | e_value_2 = dynptab-fieldvalue. | ||
| + | endif. | ||
| + | * endif. | ||
| + | |||
| + | READ TABLE DYNPTAB WITH KEY FIELDNAME = I_FIELDNAME_3 STEPL = STEPL. | ||
| + | if sy-subrc = 0. | ||
| + | e_value_3 = dynptab-fieldvalue. | ||
| + | endif. | ||
| + | |||
| + | * Begin Correction 05.07.2004 751985 *********************************** | ||
| + | e_flg_field_input = dynptab-fieldinp. | ||
| + | * End Correction 05.07.2004 751985 ************************************* | ||
| + | |||
| + | * e_value = dynptab-fieldvalue. | ||
| + | |||
| + | ENDFUNCTION.</nowiki> | ||
Latest revision as of 21:03, 4 April 2020
- NOTA: Para poder activar los Field Exits debemos tener el parámetro abap/fieldexit = YES seteado en el servidor (Transacción RZ10).
- Crear field exit:
- ejecutar reporte RSMODPRF
- Crear módulo de función con nombre FIELD_EXIT_*
- Ejemplo, validar campo KBSTAT en trn. VK11, VK12 & VK13
FUNCTION field_exit_kbstat.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" REFERENCE(INPUT)
*" EXPORTING
*" REFERENCE(OUTPUT)
*"----------------------------------------------------------------------
DATA wa_por_niv_sec TYPE zsd_por_niv_sec.
DATA: w_eval LIKE dynpread-fieldvalue.
DATA: w_eval_2 LIKE dynpread-fieldvalue.
DATA: w_eval_3 LIKE dynpread-fieldvalue.
DATA l_matnr TYPE mara-matnr.
DATA l_spart TYPE mara-spart.
DATA l_por TYPE zsd_por_niv_sec-por_01.
DATA l_por_i TYPE konp-kbetr.
DATA l_input(1).
DATA l_sizec LIKE gt_t691i-sizec.
DATA t185v TYPE t185v.
DATA ls_t681s TYPE t681s.
DATA l_kschl TYPE rv13a-kschl.
DATA: lw_var(40) TYPE c.
FIELD-SYMBOLS <fs> TYPE any.
lw_var = '(SAPMV13A)T681S'.
ASSIGN (lw_var) TO <fs>.
IF sy-subrc = 0 AND <fs> IS ASSIGNED.
MOVE <fs> TO ls_t681s.
ENDIF.
IMPORT t185v FROM MEMORY
ID 'SD_COND_MEM_01'.
CHECK sy-tcode = 'VK12' OR sy-tcode = 'VK11' OR sy-tcode = 'VK13'.
CHECK sy-title(1) <> 'V'. "Visualizar
GET PARAMETER ID 'VKS' FIELD l_kschl.
CHECK l_kschl = 'ZAB0'
OR l_kschl = 'ZAB1'
OR l_kschl = 'ZAB2'
OR l_kschl = 'ZAB3'
OR l_kschl = 'ZAB4'
OR l_kschl = 'ZAB5'.
MOVE input TO l_input.
IF l_input IS INITIAL.
MESSAGE e000(0k) WITH 'Error:'
'debe ingresar valor en Status de tratamiento'.
ENDIF.
l_por = 0.
l_por_i = 0.
CLEAR w_eval.
* copia de C14Z_DYNP_READ_FIELD, permite leer valores de una línea de tabla
CALL FUNCTION 'Z_C14Z_DYNP_READ_FIELD'
EXPORTING
i_program = 'SAPMV13A'
i_dynpro = ls_t681s-dynpronr "'1305'
i_fieldname = 'KOMG-MATNR'
i_fieldname_2 = 'KONP-KBETR'
i_fieldname_3 = 'KOMG-SPART'
i_flg_steploop = 'X'
i_flg_request = 'X'
CHANGING
e_value = w_eval "material
e_value_2 = w_eval_2 "porcentaje
e_value_3 = w_eval_3. "sector
MOVE w_eval TO l_matnr.
CONDENSE w_eval_3.
MOVE w_eval_3 TO l_spart.
CONDENSE w_eval_2.
TRANSLATE w_eval_2 USING ',.'.
MOVE w_eval_2 TO l_por_i.
* insert some logic here
*
IF 1 = 2 . "dummy, asignación de valor posible a campo
output = 'B'.
ELSE.
output = 'L'.
ENDIF.
IF l_input <> output.
MESSAGE e000(0k) WITH 'Error en Status de tratamiento:'
'Solo se permite valor'
output.
ENDIF.
ENDFUNCTION.
FUNCTION Z_C14Z_DYNP_READ_FIELD.
*"----------------------------------------------------------------------
*"*"Interfase local
*" IMPORTING
*" VALUE(I_PROGRAM) LIKE D020S-PROG
*" VALUE(I_DYNPRO) LIKE D020S-DNUM
*" VALUE(I_FIELDNAME) LIKE DYNPREAD-FIELDNAME
*" REFERENCE(I_FIELDNAME_2) TYPE DYNPREAD-FIELDNAME OPTIONAL
*" REFERENCE(I_FIELDNAME_3) LIKE DYNPREAD-FIELDNAME OPTIONAL
*" VALUE(I_FLG_STEPLOOP) TYPE C
*" VALUE(I_FLG_REQUEST) TYPE ESP1_BOOLEAN DEFAULT ESP1_FALSE
*" EXPORTING
*" VALUE(E_STEPL) LIKE SY-STEPL
*" VALUE(E_FLG_FIELD_INPUT) TYPE ESP1_BOOLEAN
*" CHANGING
*" VALUE(E_VALUE) LIKE DYNPREAD-FIELDVALUE
*" VALUE(E_VALUE_2) LIKE DYNPREAD-FIELDVALUE OPTIONAL
*" VALUE(E_VALUE_3) LIKE DYNPREAD-FIELDVALUE OPTIONAL
*"----------------------------------------------------------------------
DATA: BEGIN OF DYNPTAB OCCURS 1.
INCLUDE STRUCTURE DYNPREAD.
DATA: END OF DYNPTAB.
DATA: STEPL LIKE SY-STEPL.
* Begin Correction 05.07.2004 751985 ***********************************
DATA: request LIKE d020s-type.
* End Correction 05.07.2004 751985 *************************************
* Initialization
TRANSLATE i_program TO UPPER CASE. "#EC TRANSLANG
" translate i_dynpro to upper case.
TRANSLATE I_FIELDNAME TO UPPER CASE. "#EC TRANSLANG
* Get the currently entered value
CLEAR E_STEPL.
clear e_value_2.
IF I_FLG_STEPLOOP = 'X'.
* CALL FUNCTION 'DYNP_GET_STEPL'
* IMPORTING
* POVSTEPL = STEPL
* EXCEPTIONS
* STEPL_NOT_FOUND = 01.
* E_STEPL = STEPL.
move sy-STEPL to E_STEPL.
move sy-STEPL to STEPL.
ENDIF.
DYNPTAB-FIELDNAME = I_FIELDNAME.
DYNPTAB-STEPL = STEPL.
APPEND DYNPTAB.
* Begin Correction 05.07.2004 751985 ***********************************
* Check whether the field accepts input
IF ( i_flg_request = 'X' ).
request = 'A'.
ELSE.
CLEAR: request.
ENDIF. " IF ( i_flg_request = esp1_true
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = I_PROGRAM
DYNUMB = I_DYNPRO
request = request
TABLES
DYNPFIELDS = DYNPTAB
* TRANSLATE_TO_UPPER = ' '
EXCEPTIONS
INVALID_ABAPWORKAREA = 01
INVALID_DYNPROFIELD = 02
INVALID_DYNPRONAME = 03
INVALID_DYNPRONUMMER = 04
INVALID_REQUEST = 05
NO_FIELDDESCRIPTION = 06
UNDEFIND_ERROR = 07.
* End Correction 05.07.2004 751985 *************************************
* IF i_flg_steploop = 'X'.
* READ TABLE DYNPTAB WITH KEY FIELDNAME = I_FIELDNAME STEPL = STEPL.
* ELSE.
* READ TABLE DYNPTAB WITH KEY FIELDNAME = I_FIELDNAME.
* ENDIF.
* read TABLE DYNPTAB with key FIELDNAME = 'KONP-KONWA' STEPL = STEPL.
* if sy-subrc = 0 and dynptab-fieldvalue = '%'.
READ TABLE DYNPTAB WITH KEY FIELDNAME = I_FIELDNAME STEPL = STEPL.
if sy-subrc = 0.
e_value = dynptab-fieldvalue.
endif.
read TABLE DYNPTAB with key FIELDNAME = I_FIELDNAME_2 STEPL = STEPL.
if sy-subrc = 0.
e_value_2 = dynptab-fieldvalue.
endif.
* endif.
READ TABLE DYNPTAB WITH KEY FIELDNAME = I_FIELDNAME_3 STEPL = STEPL.
if sy-subrc = 0.
e_value_3 = dynptab-fieldvalue.
endif.
* Begin Correction 05.07.2004 751985 ***********************************
e_flg_field_input = dynptab-fieldinp.
* End Correction 05.07.2004 751985 *************************************
* e_value = dynptab-fieldvalue.
ENDFUNCTION.