Ejecutar un comando en el application server
Con la sentencia CALL 'SYSTEM' ID 'COMMAND' ejecutamos un comando del servidor. El siguiente ejemplo creaba un determinado directorio en el mismo.
CONCATENATE 'mkdir' ' ' v_ruta ls_bil_invoice-HD_GEN-PAYER '\' ls_bil_invoice-HD_ORG-SALESORG '\' ls_bil_invoice-HD_GEN-BIL_DATE+4(2) '\'
INTO l_text.CALL 'SYSTEM' ID 'COMMAND' FIELD l_text.
Crear ComboBox en reportes
En SAP tenemos el Matchcode, pero muchas veces es tedioso ya que tarda. De esta forma tendremos un combobox.
El parámetro ps_parm tendrá la opción elejida.
TYPE-POOLS: vrm.
DATA: name TYPE vrm_id, list TYPE vrm_values, value LIKE LINE OF list.
PARAMETERS: ps_parm(10) AS LISTBOX VISIBLE LENGTH 10.
AT SELECTION-SCREEN OUTPUT.
name = 'PS_PARM'.
value-key = '1'. value-text = 'Linea 1'. APPEND value TO list.
value-key = '2'. value-text = 'Linea 2'. APPEND value TO list.
value-key = '3'. value-text = 'Linea 3'. APPEND value TO list.
value-key = '4'. value-text = 'Linea 4'. APPEND value TO list.
value-key = '5'. value-text = 'Linea 5'. APPEND value TO list.
value-key = '6'. value-text = 'Linea 6'. APPEND value TO list.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = name
values = list.
START-OF-SELECTION.
WRITE: / 'Parametros : ', ps_parm.
Bug - Smartforms sin valores en la interfaz
A veces suele suceder que al modificar un smartforms, al problarlo hay datos que desaparecen como por arte de magia. Esto es un bug, por no usar el verificar y solamente el activar.
Si sucede esto, Verificar y luego Activar. Y se soluciona.
Creación de IDOCs
El menu WEDI e SALE sirve para la administración de IDOCs.
En la WE20 creamos el IDOC base. Un IDOC está formado por segmentos, con la estructura especifica de los campos a transladar, suele ser una de cabecera y otra posición.
Con la WE81, luego debemos crear el tipo de mensaje. Esto es el evento que trasnsmite en si al IDOC un tipo de mensaje puede tener varios IDOCs base (sería ALGO similar a las clases de mensajes en las impresiones en SAP).
Cuando tenemos el IDOC y el tipo de mensaje debemos relacionarlos para unirlos usamos la WE82.
En la trx BD64 debemos ingresar el tipo de mensaje creado en el sistema lógico y enlace correspondiente. (todo este seteo de enlaces todavia no lo vi, solamente agregue un IDOC a un ambiente ya creado.
En la WE02 podemos visualizar los IDOCs, ves su estado y contenido.
Dejo el código fuente de la parte de envió de IDOC de un programa que ya tiene en la tabla TI_HEADER los datos de cabecera y en TI_TABLE los datos de las posiciones.
form enviar_idocs .
DATA: edidd_rec TYPE edidd.v_msgtype = 'ZEXTBNK'. "Nombre de tipo de mensaje
v_idoctp = 'ZEXTBANK'. "Nombre de IDOC base
CLEAR v_cont.* Por cada registro en la cabecera
LOOP AT ti_header. "INTO header_rec.ADD 1 TO v_cont.
MOVE 'ZFII039_HS' TO v_segnam.MOVE: ti_header-bukrs TO v_ZFII039_H-bukrs,
ti_header-DISKB TO v_ZFII039_H-DISKB.CLEAR edidd_rec.
edidd_rec-segnum = v_cont.
edidd_rec-segnam = v_segnam.
edidd_rec-mandt = sy-mandt.
edidd_rec-sdata = v_ZFII039_H.
APPEND edidd_rec TO it_edidd.LOOP AT ti_table WHERE bukrs = ti_header-bukrs
AND diskb = ti_header-diskb.ADD 1 TO v_cont.
v_segnam = 'ZFII039_DS'.MOVE: ti_table-bukrs TO v_ZFII039_D-bukrs,
ti_table-diskb TO v_ZFII039_D-diskb,
ti_table-azdat TO v_ZFII039_D-azdat,
ti_table-aznum TO v_ZFII039_D-aznum,
ti_table-waers TO v_ZFII039_D-waers,
ti_table-esbtr TO v_ZFII039_D-esbtr.edidd_rec-segnum = v_cont.
edidd_rec-segnam = v_segnam.
edidd_rec-mandt = sy-mandt.
edidd_rec-sdata = v_ZFII039_D.
APPEND edidd_rec TO it_edidd.ENDLOOP.
CLEAR v_edidc.
v_edidc-mestyp = v_msgtype.
v_edidc-idoctp = v_idoctp.
CLEAR v_edidc-rcvpfc.
CLEAR v_edidc-sndpfc.
CLEAR v_cont.CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
EXPORTING
master_idoc_control = v_edidc
TABLES
communication_idoc_control = it_edidc
master_idoc_data = it_edidd
EXCEPTIONS
error_in_idoc_control = 01
error_writing_idoc_status = 02
error_in_idoc_data = 03
sending_logical_system_unknown = 04.REFRESH it_edidc.
REFRESH it_edidd.ENDLOOP. "Por cada registro en la cabecera
endform. " enviar_idocs
Declaraciones
DATA: v_edidc LIKE edidc,
v_msgtype LIKE tbdme-mestyp,
v_segnam LIKE edidd-segnam,
v_idoctp LIKE bdaledc-idoctp,
v_cont TYPE i.* Variables para ALV
DATA:
lv_fieldcat TYPE slis_t_fieldcat_alv,
lv_layout TYPE slis_layout_alv,
lv_repid TYPE sy-repid,
lv_sorted TYPE slis_t_sortinfo_alv,
t_events TYPE slis_t_event, " Eventos.
gt_header TYPE slis_t_listheader, " Tabla con el Titulo
gt_sort TYPE slis_t_sortinfo_alv, "tabla con orden y subtot
wa_header TYPE slis_listheader. " Work Area con el TituloTYPES: BEGIN OF TYPE_FEBKO,
HKONT TYPE FEBKO-HKONT, "Cuenta
BUKRS TYPE FEBKO-BUKRS, "Sociedad
AZDAT TYPE FEBKO-AZDAT, "Fecha extracto
AZNUM TYPE FEBKO-AZNUM, "Numero extracto
WAERS TYPE FEBKO-WAERS, "Moneda
ESBTR TYPE FEBKO-ESBTR, "Importe
ESVOZ TYPE FEBKO-ESVOZ, "Debe/Haber
HBKID TYPE FEBKO-HBKID, "Banco
HKTID TYPE FEBKO-HKTID, "Cuenta
EFART TYPE FEBKO-EFART, "Tipo extracto M o E
DISKB TYPE T035D-DISKB, "Codigo
END OF TYPE_FEBKO.TYPES: BEGIN OF TYPE_HEADER,
BUKRS TYPE FEBKO-BUKRS, "Sociedad
DISKB TYPE T035D-DISKB, "Codigo
END OF TYPE_HEADER.DATA: TI_FEBKO TYPE STANDARD TABLE OF TYPE_FEBKO.
DATA: TI_FEBKO_AUX TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_TABLE TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_HEADER TYPE STANDARD TABLE OF TYPE_HEADER WITH HEADER LINE.DATA: WA_FEBKO TYPE TYPE_FEBKO.
DATA: WA_FEBKO_AUX TYPE TYPE_FEBKO.DATA: v_ZFII039_H LIKE ZFII039_H,
v_ZFII039_D LIKE ZFII039_D.DATA: it_edidd TYPE STANDARD TABLE OF edidd,
it_edidc TYPE STANDARD TABLE OF edidc.
FIMA_DAYS_AND_MONTHS_AND_YEARS
Esta función nos devuelve la diferencia en dias, meses y años entre dos fechas.
CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
EXPORTING
i_date_from = s_badat2-low
i_date_to = s_badat2-high
IMPORTING
e_days = gv_dias2
* E_MONTHS =
* E_YEARS =
Refrescar un ALV luego de una Ejecuación de proceso que modifica la tabla interna
Cuando en un ALV tenemos algún botón que ejecute un Batch Input o algún, proceso al Salvar y la información de la tabla interna del ALV debe refrescarse, para reflejar el proceso ejecutado, podemos usar este peqúeño truco.
*&---------------------------------------------------------------------*
*& Form PF_USER_COMMAND
*&---------------------------------------------------------------------*
FORM user_command1 USING p_okcode LIKE sy-ucomm "ok-code
w_selfield TYPE slis_selfield. "estruct. de linea
* Se selecciona que el ALV se actualice al mostrarse.w_selfield-refresh = 'X'.
CASE p_okcode.
WHEN '&DATA_SAVE'.
PERFORM arma_datos_bapi_1.
IF g_cant_error IS INITIAL. "ROGI08102008
PERFORM ejecutar_bapi1.
ENDIF. "ROGI08102008
ENDCASE.
ENDFORM. " PF_STATUS
En el USER_COMMAND Form agregamos lo que esta en negrita, esto hace que al ejecutar un botón del ALV se refresque la tabla interna, por lo tanto podemos directamente modificar la tabla interna a nuestro gusto que se vera refrejado en el ALV.
IWO1_ORDER_BADI - Badi de IW31,IW32
Badi que se dispara en la tx IW31 e IW32.
MD_PEGGING_NODIALOG - Ordenes que posee una Solped
Devuelve las ordenes que están asociadas a una solped.
Ej:Bloque en el cual por cada solped encontrada para determinado Material-Centro busco las ordenes que están asociadas a esa solped.
DATA: lt_mdpsx TYPE STANDARD TABLE OF mdps,
ls_mdpsx TYPE mdps,
LT_MDRQX TYPE STANDARD TABLE OF mdrq,
ls_mdrqx TYPE mdrq,
l_fixkz TYPE EBAN-fixkz,
l_msg(100),
l_solped TYPE MDPS-DEL12,
l_aufnr TYPE AUFK-AUFNR.* *** Veo todas las solicitudes de pedidos en las que se encuentra el componente
CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
EXPORTING
matnr = ls_resbd-MATNR
werks = ls_resbd-WERKS
TABLES
MDPSX = lt_MDPSX[]
EXCEPTIONS
MATERIAL_PLANT_NOT_FOUND = 1
PLANT_NOT_FOUND = 2
OTHERS = 3.
IF sy-subrc = 0.
* *** Veo todas las ordenes asociadas con las solpeds.
LOOP AT lt_MDPSX INTO ls_mdpsx WHERE DELKZ = 'BA' AND FIX01 = 'X'.
CLEAR l_solped.
l_solped = ls_mdpsx-DELNR.
CALL FUNCTION 'MD_PEGGING_NODIALOG'
EXPORTING
edelkz = 'BA'
edelnr = l_solped "lt_MDPSX-DELNR
EDELPS = ls_mdpsx-DELPS
ematnr = ls_resbd-MATNR
ewerks = ls_resbd-WERKS
tables
imdrqx = LT_MDRQX[]
EXCEPTIONS
ERROR = 1
NO_REQUIREMENTS_FOUND = 2
ORDER_NOT_FOUND = 3
OTHERS = 4.
MD_STOCK_REQUIREMENTS_LIST_API - Lista de Solped por Componente
Le pasamos Material y Centro y nos devuelve todas las Solped en las que ese componente se encuentra.
DATA: lt_mdpsx TYPE STANDARD TABLE OF mdps,
ls_mdpsx TYPE mdps.
* *** Veo todas las solicitudes de pedidos en las que se encuentra el componente
CALL FUNCTION 'MD_STOCK_REQUIREMENTS_LIST_API'
EXPORTING
matnr = ls_resbd-MATNR
werks = ls_resbd-WERKS
TABLES
MDPSX = lt_MDPSX[]
EXCEPTIONS
MATERIAL_PLANT_NOT_FOUND = 1
PLANT_NOT_FOUND = 2
OTHERS = 3.
Extraer estructura de pantalla desde una BADI
Con esta forma, peculiar, podemos levantar datos de pantalla. No me puse a investigarlo a fondo porque no tenía tiempo. Según tengo entendido tmb sirve para levantar hasta tablas internas.
En este caso levanto la estructura resbd de la tx IW32.
DATA:l_field(60) TYPE C VALUE '(SAPLCOIH)RESBD',
ls_resbd TYPE resbd.FIELD-SYMBOLS: <fs_resbd> TYPE ANY.
* Fetching the Component Item from the Screen. This is for read-only
* purpose and content should not be changed.
ASSIGN (l_field) to <fs_resbd>.
if sy-subrc eq 0.
ls_resbd = <fs_resbd>.
UNASSIGN <fs_resbd>.
endif.
Manejo de Mensajes en BSP
El elemento a usar es <phtmlb:messageBar>
<phtmlb:messageBar id = "messageBar"
type = "<%= gv_severity_str %>"
text = "<%= gv_message %>"/>
TYPE puede ser ERROR/WARNING/OK/STOP/LOADING/NONE/TEXT.
ERROR-STOP:
WARNING:
OK:
LOADING: se mueve circularmente
TEXT: Solo sale texto no se muestra icono.
NONE:
No sale el display por pantalla.
En el inputProcessing donde deseemos setear o cambiar el mensaje o Tipo.
gv_message = 'Usuario encontrado'.
gv_severity_str = 'OK'.
Estructura SFSY
Similar a la estructura SYST posee información propia del smartforms que podemos ver en tiempo de ejecución.
PAGE
Número/Cantidad páginas
FORMPAGES
Ctd.total páginas formularios
JOBPAGES
Ctd.total páginas job de salida
COPYCOUNT
Contador de copias ( 1 = original, 2 = 1ª copia, ...)
COPYCOUNT0
Contador de copias (0 = original, 1 = 1ª copia...)
DATE
Fecha y hora, fecha (servidor de aplicaciones) actual
TIME
Fecha y hora, hora (servidor de aplicaciones) actual
SUBRC
Código retorno, código retorno tras sentencias ABAP
USERNAME
Sistema SAP, nombre de acceso del usuario
PAGENAME
Nombre página + Variante
WINDOWNAME
Nombre ventana + Variante
XSF
Salida XSF activa/inactiva
XDF
Smart Forms SAP: Salida activa XDF
XDF2
Smart Forms SAP: Salida activa XDF
Como buscar BADIs
Para buscar las badis que pasan en algún momento dado. Debemos poner un break point en la Clase. SE24 -> CL_EXITHANDLER
Doble click en el método GET_INSTANCE.
Poner un break en la llamada del metodo get_class_name_by_interface.
METHOD get_instance.
CLASS cl_badi_flt_data_trans_and_db DEFINITION LOAD.
DATA: exit TYPE REF TO object,
type_ref TYPE REF TO cl_abap_typedescr,
class_name TYPE seoclsname,
abs_type_classname TYPE string,
def_impl TYPE seex_boolean VALUE seex_false.CALL METHOD cl_exithandler=>get_class_name_by_interface
EXPORTING
instance = instance
IMPORTING
class_name = class_name
CHANGING
exit_name = exit_name
EXCEPTIONS
no_reference = 1
no_interface_reference = 2
no_exit_interface = 3
data_incons_in_exit_managem = 4
class_not_implement_interface = 5
OTHERS = 6.
Cuando salte el break point hay que ver el valor de exit_name, ahi pasarán todos los nombres de las BADIS. en la SE18 encontramos esos nombres, en la SE19 se implementa.
Otra forma para buscar las BADI, es buscando por Paquete (clase de desarrollo) obtener el paquete de la tx que deseamos en la se93 -> visualizar tomamos el paquete y en la se18 después en la búsqueda ampliada buscamos por paquete y nos devuelve todas las BADIS del paquete.
Creación de IDOCs
El menu WEDI e SALE sirve para la administración de IDOCs.
En la WE20 creamos el IDOC base. Un IDOC está formado por segmentos, con la estructura especifica de los campos a transladar, suele ser una de cabecera y otra posición.
Con la WE81, luego debemos crear el tipo de mensaje. Esto es el evento que trasnsmite en si al IDOC un tipo de mensaje puede tener varios IDOCs base (sería ALGO similar a las clases de mensajes en las impresiones en SAP).
Cuando tenemos el IDOC y el tipo de mensaje debemos relacionarlos para unirlos usamos la WE82.
En la trx BD64 debemos ingresar el tipo de mensaje creado en el sistema lógico y enlace correspondiente. (todo este seteo de enlaces todavia no lo vi, solamente agregue un IDOC a un ambiente ya creado.
En la WE02 podemos visualizar los IDOCs, ves su estado y contenido.
Dejo el código fuente de la parte de envió de IDOC de un programa que ya tiene en la tabla TI_HEADER los datos de cabecera y en TI_TABLE los datos de las posiciones.
form enviar_idocs .
DATA: edidd_rec TYPE edidd.v_msgtype = 'ZEXTBNK'. "Nombre de tipo de mensaje
v_idoctp = 'ZEXTBANK'. "Nombre de IDOC base
CLEAR v_cont.* Por cada registro en la cabecera
LOOP AT ti_header. "INTO header_rec.ADD 1 TO v_cont.
MOVE 'ZFII039_HS' TO v_segnam.MOVE: ti_header-bukrs TO v_ZFII039_H-bukrs,
ti_header-DISKB TO v_ZFII039_H-DISKB.CLEAR edidd_rec.
edidd_rec-segnum = v_cont.
edidd_rec-segnam = v_segnam.
edidd_rec-mandt = sy-mandt.
edidd_rec-sdata = v_ZFII039_H.
APPEND edidd_rec TO it_edidd.LOOP AT ti_table WHERE bukrs = ti_header-bukrs
AND diskb = ti_header-diskb.ADD 1 TO v_cont.
v_segnam = 'ZFII039_DS'.MOVE: ti_table-bukrs TO v_ZFII039_D-bukrs,
ti_table-diskb TO v_ZFII039_D-diskb,
ti_table-azdat TO v_ZFII039_D-azdat,
ti_table-aznum TO v_ZFII039_D-aznum,
ti_table-waers TO v_ZFII039_D-waers,
ti_table-esbtr TO v_ZFII039_D-esbtr.edidd_rec-segnum = v_cont.
edidd_rec-segnam = v_segnam.
edidd_rec-mandt = sy-mandt.
edidd_rec-sdata = v_ZFII039_D.
APPEND edidd_rec TO it_edidd.ENDLOOP.
CLEAR v_edidc.
v_edidc-mestyp = v_msgtype.
v_edidc-idoctp = v_idoctp.
CLEAR v_edidc-rcvpfc.
CLEAR v_edidc-sndpfc.
CLEAR v_cont.CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE'
EXPORTING
master_idoc_control = v_edidc
TABLES
communication_idoc_control = it_edidc
master_idoc_data = it_edidd
EXCEPTIONS
error_in_idoc_control = 01
error_writing_idoc_status = 02
error_in_idoc_data = 03
sending_logical_system_unknown = 04.REFRESH it_edidc.
REFRESH it_edidd.ENDLOOP. "Por cada registro en la cabecera
endform. " enviar_idocs
Declaraciones
DATA: v_edidc LIKE edidc,
v_msgtype LIKE tbdme-mestyp,
v_segnam LIKE edidd-segnam,
v_idoctp LIKE bdaledc-idoctp,
v_cont TYPE i.* Variables para ALV
DATA:
lv_fieldcat TYPE slis_t_fieldcat_alv,
lv_layout TYPE slis_layout_alv,
lv_repid TYPE sy-repid,
lv_sorted TYPE slis_t_sortinfo_alv,
t_events TYPE slis_t_event, " Eventos.
gt_header TYPE slis_t_listheader, " Tabla con el Titulo
gt_sort TYPE slis_t_sortinfo_alv, "tabla con orden y subtot
wa_header TYPE slis_listheader. " Work Area con el TituloTYPES: BEGIN OF TYPE_FEBKO,
HKONT TYPE FEBKO-HKONT, "Cuenta
BUKRS TYPE FEBKO-BUKRS, "Sociedad
AZDAT TYPE FEBKO-AZDAT, "Fecha extracto
AZNUM TYPE FEBKO-AZNUM, "Numero extracto
WAERS TYPE FEBKO-WAERS, "Moneda
ESBTR TYPE FEBKO-ESBTR, "Importe
ESVOZ TYPE FEBKO-ESVOZ, "Debe/Haber
HBKID TYPE FEBKO-HBKID, "Banco
HKTID TYPE FEBKO-HKTID, "Cuenta
EFART TYPE FEBKO-EFART, "Tipo extracto M o E
DISKB TYPE T035D-DISKB, "Codigo
END OF TYPE_FEBKO.TYPES: BEGIN OF TYPE_HEADER,
BUKRS TYPE FEBKO-BUKRS, "Sociedad
DISKB TYPE T035D-DISKB, "Codigo
END OF TYPE_HEADER.DATA: TI_FEBKO TYPE STANDARD TABLE OF TYPE_FEBKO.
DATA: TI_FEBKO_AUX TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_TABLE TYPE STANDARD TABLE OF TYPE_FEBKO WITH HEADER LINE.
DATA: TI_HEADER TYPE STANDARD TABLE OF TYPE_HEADER WITH HEADER LINE.DATA: WA_FEBKO TYPE TYPE_FEBKO.
DATA: WA_FEBKO_AUX TYPE TYPE_FEBKO.DATA: v_ZFII039_H LIKE ZFII039_H,
v_ZFII039_D LIKE ZFII039_D.DATA: it_edidd TYPE STANDARD TABLE OF edidd,
it_edidc TYPE STANDARD TABLE OF edidc.
FIMA_DAYS_AND_MONTHS_AND_YEARS
Esta función nos devuelve la diferencia en dias, meses y años entre dos fechas.
CALL FUNCTION 'FIMA_DAYS_AND_MONTHS_AND_YEARS'
EXPORTING
i_date_from = s_badat2-low
i_date_to = s_badat2-high
IMPORTING
e_days = gv_dias2
* E_MONTHS =
* E_YEARS =
BAPI_COMPANYCODE_GET_PERIOD
Esta función nos sirve para obtener el ejercicio desde una fecha dada, ya que algunas empresas no usan el año fiscal similar al calendario solar.
Parámetros:
- Sociedad
- Fecha
Base de datos lógicas - HR
Las base de datos lógicas es una forma mas rápida de obtener datos, la base de datos lógica se compone de la pantalla de selección y de los datos en si. La metodología de búsqueda es de árbol.
En la SE36 podemos administrar la base de datos lógicas.
Dentro del código fuente nos damos cuenta del uso de base de datos lógicas al ver la instrucción GET.
GET PERNR.
Esta instrucción obtiene los datos y los carga en una estructura. Si nosotros queremos filtrarlos por algún campo de su estructura debemos usar la sentencia CHECK.
Dentro de una lógica de BDL. Podemos extrae información de los infotipos usando el comando PROVIDE - ENDPROVIDE. (similar al select común y corriente)
Para usar este comando hay que declarar los infotipos con la sentencia INFOTYPES.
INFOTYPES: 0001, "Asignación Organizacional
0002. "Datos de Personal
*Te va traiendo todos los registros del infotipo 0 comprendidos entre pn-begda y pn-endda. (Base de datos logica PNP)
PROVIDE * FROM p0000 BETWEEN pn-begd AND pn-endda.
...
ENDPROVIDE.
*Te trae los registros del inotipo 1 y 8 entre '19000101' '99991231' con cada corte.
PROVIDE gsber abkrs FROM p0001 FROM p0008 BETWEEN '19000101' AND '99991231'.
ENDPROVIDE.
*Esta macro te deja en la cabezera el ultimo registro del infotipo 1 comprendido entre esas fechas
rp-provide-from-last p0001 space pn-begda pn-endda.
*Para validar la correcta ejecusión de esta sentencia se usa:
IF PNP-SW-FOUND EQ '1'. "encontró un registro
...
ENDIF.
*Esta macro te deja en la cabezera el prime registro del infotipo 1 comprendido entre esas fechas
rp-provide-from-last p0001 space pn-begda pn-endda.
Ejemplo de LDB
*Start of Selection Event
*========================
START-OF-SELECTION.
* "Retrieve Infotypes
GET PERNR.
* "Get last IT 0000 record
RP-PROVIDE-FROM-LAST P0000 SPACE PN-BEGDA PN-ENDDA.
* "Check employee is active
CHECK P0000-STAT2 IN PNPSTAT2.
* "Retrieve Employee Name
RP-PROVIDE-FROM-LAST P0002 SPACE PN-BEGDA PN-ENDDA.
*
format color col_heading.
Write : / 'Name : ', p0002-inits(4), p0002-nachn(10), 80 '*',
/ 'NINO : ', p0002-perid, 80 '*',
/ 'Birth Date : ', p0002-gbdat, 80 '*'.
skip 1.
format reset.
*
perform process_repeating_group.
*
*End of Selection Event
*========================
END-OF-SELECTION.
Validaciones - OB28
Las validaciones están regidas por Sociedad y por evento.
Evento:
- Cabecera de documento
- Posición de documento
- Documento Completo
Grado de activ. significa si está activo o no (1 = ACTIVO)
Ahí vemos todos los pasos, cada uno con sus respectivas condiciones, verificaciones y mensajes.
En el caso de necesitar usar un user exit, en la solapa user exit. seleccionamos una y le damos al botón de visualizar código.
Necesitamos crear el modulo dentro del siguiente FORM
*----------------------------------------------------------------------*
* FORM GET_EXIT_TITLES *
*----------------------------------------------------------------------*
* returns name and title of all available standard-exits *
* every exit in this formpool has to be added to this form. *
* You have to specify a parameter type in order to enable the *
* code generation program to determine correctly how to *
* generate the user exit call, i.e. how many and what kind of *
* parameter(s) are used in the user exit. *
* The following parameter types exist: *
* *
* TYPE Description Usage *
* ------------------------------------------------------------ *
* C_EXIT_PARAM_NONE Use no parameter Subst. and Valid. *
* except B_RESULT *
* C_EXIT_PARAM_CLASS Use a type as parameter Subst. and Valid *
*----------------------------------------------------------------------*
* --> EXIT_TAB table with exit-name and exit-titles *
* structure: NAME(5), PARAM(1), TITEL(60)
*----------------------------------------------------------------------*
FORM get_exit_titles TABLES etab.DATA: BEGIN OF exits OCCURS 50,
name(5) TYPE c,
param LIKE c_exit_param_none,
title(60) TYPE c,
END OF exits.
*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
* PLEASE DELETE THE FIRST '*' FORM THE BEGINING OF THE FOLLOWING LINES *
* IF THE ACCOUNTING MODULE IS INSTALLED IN YOUR SYSTEM: *
* EXITS-NAME = 'U101'.
* EXITS-PARAM = C_EXIT_PARAM_CLASS.
* EXITS-TITLE = TEXT-100. "Posting date check
* APPEND EXITS.exits-name = 'U100'.
exits-param = c_exit_param_none. "Complete data used in exit.
exits-title = text-101. "Posting date check
APPEND exits.REFRESH etab.
LOOP AT exits.
etab = exits.
APPEND etab.
ENDLOOP.ENDFORM. "GET_EXIT_TITLES
Ahora creamos la subrutina U100
*---------------------------------------------------------------------*
* form U941 *
*---------------------------------------------------------------------*
* Valida las retenciones de la clase de doc.
*---------------------------------------------------------------------*
* <-- b_result t = true f = false *
*---------------------------------------------------------------------*
FORM U941 USING B_RESULT.
DATA: l_ind TYPE WITH_ITEM-WT_WITHCD VALUE 'RB'.
B_RESULT = B_TRUE.
SELECT SINGLE * FROM WITH_ITEM
WHERE WT_WITHCD = l_ind.IF sy-subrc <> 0.
B_RESULT = B_FALSE.
* Mensaje de error
MESSAGE E067(z1) WITH BKPF-BLART l_ind.
Endif.
CLEAR WITH_ITEM.
ENDFORM.
Si necesitamos crear SET ( rangos o juegos de datos) los creamos con la transacción GS01
Creamos el SET, guardamos y manualmente hay que agregarlo a Orden de transporte al igual que las validaciones.
Para transportar éstas hay que posicionarnos sobre la validación, Menu Validación -> Transportar.
Creación de BTE
Tx FIBF
Investigar sobre los procesos,ésta opción nos tira todos los procesos.
Luego de elegir el que nos sirve hacemos click en Módulo funciones tipo.
Esto nos lleva a la se37 con el sample del proceso, el cual debemos copiar para ejecutar el nuestro con el código fuente que deseemos, pero antes debemos crear el "Producto" (sería algo así como el proyecto de ampliación de la CMOD)
Cuando creemos un producto nuevo, debemos tildar el checkbox que indica si está activado o no.
Luego creamos el "Módulo de proceso".
Acá es donde debemos poner la copia de la función ejemplo:
- Ponemos el proceso (ampliación que debemos usar).
- Ponemos la función de copia creada del original con nuestro código.
- Elejimos el producto (el proyecto de ampliación creado anteriormente).
A modo informativo dejo en ingles las diferencias entre BADI y BTE y como buscar BTEs
Difference between BADI’s and BTE’s:
The concepts behind the Business Add-Ins enhancement technique and Open FI are basically the same. However, the two enhancement techniques do differ from each other in the following points:
Open FI can only be used to make program enhancements, that is, you can only enhance source code using Open FI. You cannot enhance user interface elements with Open FI like you can with Business Add-Ins.
Open FI assumes that enhancement will only take place on three levels (SAP - partners - customers), whereas with Business Add-Ins you can create and implement enhancements in as many software layers as you like.
Open FI uses function modules for program enhancements. With Business Add-Ins, ABAP Objects are used enhance programs.
Finding Business Transaction Events:
SAP Reference IMG -> Financial Accounting -> Financial Accounting Global Settings -> Business Transaction Events
• For Publish and Subscribe Interfaces, Environment - > Info system (P/S)
• For Process Interfaces, Environment -> Infosystem(Processes)
Find for Character String “OPEN_FI_PERFORM” in source code