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.