Datos personales

Mi foto
Soy programador/analista. Mis fuertes es el mundo de sap(como abaper), programador php con gran experiencia en el mundo Wordpress y Joomla.

viernes, 15 de agosto de 2008

Operadores lógicos


En vez de usar los típicos operadores lógicos, abap permite ponerlos en forma de letras..y dicen..muchos...que es mejor ponerlos así...por prolijidad.

ALV-hierseq con fieldcat a mano:

El ALV jerarquico tiene la particularidad de mostrar cosas de 2 tablas distintas con un enlace llamado key-info que es una tabla.

TABLES: zmcabecera, zmdetalle, zmproveedor.

DATA: BEGIN OF ti_header OCCURS 0.
INCLUDE STRUCTURE zmcabecera.
DATA END OF ti_header.

DATA: BEGIN OF ti_prov OCCURS 0.
INCLUDE STRUCTURE zmproveedor.
DATA END OF ti_prov.

DATA: BEGIN OF ti_info OCCURS 0.
INCLUDE STRUCTURE zmdetalle.
DATA END OF ti_info.

* Type Pool donde vienen definidas todas las estructuras y tablas
TYPE-POOLS: slis.
* Catálogo de campos: contiene la descripción de los campos de salida
DATA: ti_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE,
* Especificaciones de la disposición de la lista: descripción de la
* estructura de salida
ti_layout TYPE slis_layout_alv,
* Relacion entre los datos de cabecera y posicion
ti_key TYPE slis_keyinfo_alv.

START-OF-SELECTION.

PERFORM cargotablas.
PERFORM armosalida.
PERFORM imprimo.


*&---------------------------------------------------------------------*
*& Form cargotablas
*&---------------------------------------------------------------------*
FORM cargotablas .

SELECT * FROM zmcabecera INTO TABLE ti_header.

SELECT * FROM zmproveedor INTO TABLE ti_prov.

SELECT * FROM zmdetalle
INTO TABLE ti_info
FOR ALL ENTRIES IN ti_header
WHERE idpedido = ti_header-idpedido.

ENDFORM. " cargotablas

*&---------------------------------------------------------------------*
*& Form armosalida
*&---------------------------------------------------------------------*
FORM armosalida .

ti_fieldcat-fieldname = 'IDPEDIDO'.
ti_fieldcat-tabname = 'TI_HEADER'.
ti_fieldcat-ref_tabname = 'ZMCABECERA'.
APPEND ti_fieldcat. CLEAR ti_fieldcat.

ti_fieldcat-fieldname = 'FECHA'.
ti_fieldcat-tabname = 'TI_HEADER'.
ti_fieldcat-ref_tabname = 'ZMCABECERA'.
APPEND ti_fieldcat. CLEAR ti_fieldcat.

ti_fieldcat-fieldname = 'IDPROVEEDOR'.
ti_fieldcat-tabname = 'TI_HEADER'.
ti_fieldcat-ref_tabname = 'ZMCABECERA'.
APPEND ti_fieldcat. CLEAR ti_fieldcat.

ti_fieldcat-fieldname = 'IMPORTETOTAL'.
ti_fieldcat-tabname = 'TI_HEADER'.
ti_fieldcat-ref_tabname = 'ZMCABECERA'.
APPEND ti_fieldcat. CLEAR ti_fieldcat.

ti_fieldcat-fieldname = 'IDPEDIDO'.
ti_fieldcat-tabname = 'TI_INFO'.
ti_fieldcat-ref_tabname = 'ZMDETALLE'.
APPEND ti_fieldcat. CLEAR ti_fieldcat.

ti_fieldcat-fieldname = 'ITEM'.
ti_fieldcat-tabname = 'TI_INFO'.
ti_fieldcat-ref_tabname = 'ZMDETALLE'.
APPEND ti_fieldcat. CLEAR ti_fieldcat.

ti_fieldcat-fieldname = 'CANTIDAD'.
ti_fieldcat-tabname = 'TI_INFO'.
ti_fieldcat-ref_tabname = 'ZMDETALLE'.
APPEND ti_fieldcat. CLEAR ti_fieldcat.

ti_fieldcat-fieldname = 'DESCRIPCION'.
ti_fieldcat-tabname = 'TI_INFO'.
ti_fieldcat-ref_tabname = 'ZMDETALLE'.
APPEND ti_fieldcat. CLEAR ti_fieldcat.

ti_fieldcat-fieldname = 'IMPORTE'.
ti_fieldcat-tabname = 'TI_INFO'.
ti_fieldcat-ref_tabname = 'ZMDETALLE'.
APPEND ti_fieldcat. CLEAR ti_fieldcat.

* Relacion entre los campos de cabecera y los de posicion
ti_key-header01 = 'IDPEDIDO'.
ti_key-item01 = 'IDPEDIDO'.


ENDFORM. " armosalida


*&---------------------------------------------------------------------*
*& Form imprimo
*&---------------------------------------------------------------------*
FORM imprimo .
DATA: c_repid LIKE sy-repid.
c_repid = sy-repid.

CALL FUNCTION 'REUSE_ALV_HIERSEQ_LIST_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
i_callback_program = c_repid
* I_CALLBACK_PF_STATUS_SET = ' '
i_callback_user_command = 'USER_COMMAND'
* IS_LAYOUT =
it_fieldcat = ti_fieldcat[]
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IT_EVENT_EXIT =
i_tabname_header = 'TI_HEADER'
i_tabname_item = 'TI_INFO'
* I_STRUCTURE_NAME_HEADER =
* I_STRUCTURE_NAME_ITEM =
is_keyinfo = ti_key
* I_BUFFER_ACTIVE =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab_header = ti_header[]
t_outtab_item = ti_info[]
EXCEPTIONS
program_error = 1
OTHERS = 2
.
IF sy-subrc <> 0.
MESSAGE e162(00) WITH 'No se pudo abrir el archivo'(006).
ENDIF.

ENDFORM. " imprimo


*---------------------------------------------------------------------*
* FORM user_command
*---------------------------------------------------------------------*
*
*---------------------------------------------------------------------*
* --> R_UCOMM
* --> RS_SELFIELD
*---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
BREAK-POINT.
READ TABLE ti_prov WITH KEY idproveedor = rs_selfield-value.
IF sy-subrc EQ 0.
MESSAGE i398(00) WITH 'EL NOMBRE ES:'(007) ti_prov-nombre
'Y SU TEL. ES:'(008) ti_prov-telefono.
ENDIF.
ENDFORM. "user_command


martes, 12 de agosto de 2008

Reporte ALV-Grid con fieldcat por funcion

*-- Declaración de Tablas
TABLES: usr01," Maestro de usuarios (datos de tiempo de ejecución)
usr21.

*-- Declaración de Tablas Internas
DATA: BEGIN OF ti_salida OCCURS 0,
bname LIKE usr01-bname,
spld LIKE usr01-spld,
spdb LIKE usr01-spdb,
addrnumber LIKE usr21-addrnumber,
END OF ti_salida.

TYPE-POOLS: slis.

* Tablas internas para ALV
DATA: ti_fieldcat TYPE slis_t_fieldcat_alv.
DATA: wa_layout TYPE slis_layout_alv.
DATA: wa_fieldcat TYPE LINE OF slis_t_fieldcat_alv .

*--Parámetros de Seleción
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.
PARAMETERS: p_bname LIKE usr01-bname.
SELECTION-SCREEN END OF BLOCK b1.

START-OF-SELECTION.
PERFORM busqueda_datos.
PERFORM preparar_salida.
PERFORM mostrar_datos.

*&---------------------------------------------------------------------*
*& Form busqueda_datos
*&---------------------------------------------------------------------*

FORM busqueda_datos .

SELECT a~bname a~spld a~spdb b~addrnumber
FROM usr01 AS a INNER JOIN usr21 AS b
ON a~bname EQ b~bname
INTO TABLE ti_salida
WHERE a~bname EQ p_bname.

ENDFORM. " busqueda_datos
*&---------------------------------------------------------------------*
*& Form Mostrar_pedidos
*&---------------------------------------------------------------------*

FORM mostrar_datos .

DATA c_repid LIKE sy-repid VALUE sy-repid.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* i_callback_program = c_repid
* i_callback_pf_status_set = 'PF_STATUS'
* i_callback_user_command = 'USER_COMMAND'
* i_structure_name = 'TI_ALV'
is_layout = wa_layout
it_fieldcat = ti_fieldcat[]
* i_save = 'A'
TABLES
t_outtab = ti_salida
EXCEPTIONS
program_error = 1
OTHERS = 2.

ENDFORM. " Mostrar_datos
*&---------------------------------------------------------------------*
*& Form preparar_salida
*&---------------------------------------------------------------------*

FORM preparar_salida .

DATA c_repid LIKE sy-repid VALUE sy-repid.


CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = c_repid
i_internal_tabname = 'TI_SALIDA'
* I_STRUCTURE_NAME = 'SIMLISTRUC'
* i_client_never_display = 'X'
i_inclname = c_repid
CHANGING
ct_fieldcat = ti_fieldcat.

wa_layout-zebra = 'X'.

ENDFORM. " preparar_salida

lunes, 11 de agosto de 2008

Reportes ALV

Reportes ALV

Hay que declarar este type siempre:

TYPE-POOLS: slis. "(es necesario para usar ALV)

Hay 3 tipos de ALV:
· List (forma de lista)
· Grid (similar lista pero visualmente mas amigable)
· Hierseq (jerárquico, agrupado).

El formato del ALV queda a cargo de una tabla y un registro llamados:
· Fieldcat (tabla, con un registro por cada campo)
· Layout (registro que maneja la estética del conjunto de campos)

A su vez la fieldcat se puede llenar de 2 formas:
· Manual (especificando registro a registro que campos queremos que nos muestre el ALV)
· Por medio de la función REUSE_ALV_FIELDCATALOG_MERGE (Si se desea mostrar la tabla completa, así y todo la fieldcat posee un campo llamado NO_OUT que me permite ocultar ese campo y que no se vea)

Si es cargada mediante la función la field_cat NO debe tener header (cabecera)

EJEMPLOS:

Por ser idénticas en llamado el ALV-List y el ALV-grid. Solo se dará ejemplos del grid

ALV-Grid con fieldcat a mano:

TABLES: usr21, adrp, adr6.

DATA: BEGIN OF ti_tabla OCCURS 0,
bname LIKE usr21-bname,
persnumber LIKE usr21-persnumber,
addrnumber LIKE usr21-addrnumber,
name_first LIKE adrp-name_first,
name_last LIKE adrp-name_last,
smtp_addr LIKE adr6-smtp_addr,
smtp_srch LIKE adr6-smtp_srch,
END OF ti_tabla.

TYPE-POOLS: slis.

DATA: wa_layout TYPE slis_layout_alv.

DATA: ti_fieldcat TYPE slis_t_fieldcat_alv WITH HEADER LINE.

START-OF-SELECTION.

PERFORM carga.
PERFORM armadosalida.
PERFORM salida.


*&---------------------------------------------------------------------*
*& Form carga
*&--------------------------------------------------------------------

FORM carga .

SELECT a~bname a~persnumber a~addrnumber b~name_first b~name_last
c~smtp_addr c~smtp_srch
FROM usr21 AS a INNER JOIN adrp AS b ON a~persnumber EQ b~persnumber
INNER JOIN adr6 AS c
ON b~persnumber EQ c~persnumber
INTO TABLE ti_tabla.

ENDFORM. " carga





*&---------------------------------------------------------------------*
*& Form armadosalida
*&--------------------------------------------------------------------

FORM armadosalida .

CLEAR ti_fieldcat.
ti_fieldcat-fieldname = 'BNAME'.
ti_fieldcat-tabname = 'TI_TABLA'.
ti_fieldcat-seltext_l = 'NOMBRE CLAVE'.
APPEND ti_fieldcat.

CLEAR ti_fieldcat.
ti_fieldcat-fieldname = 'PERSNUMBER'.
ti_fieldcat-tabname = 'TI_TABLA'.
ti_fieldcat-seltext_l = 'NUMERO DE PERSONA'.
APPEND ti_fieldcat.

CLEAR ti_fieldcat.
ti_fieldcat-fieldname = 'ADDRNUMBER'.
ti_fieldcat-tabname = 'TI_TABLA'.
ti_fieldcat-seltext_l = 'DIRECCION'.
APPEND ti_fieldcat.

CLEAR ti_fieldcat.
ti_fieldcat-fieldname = 'NAME_FIRST'.
ti_fieldcat-tabname = 'TI_TABLA'.
ti_fieldcat-seltext_l = 'NOMBRE'.
APPEND ti_fieldcat.

CLEAR ti_fieldcat.
ti_fieldcat-fieldname = 'NAME_LAST'.
ti_fieldcat-tabname = 'TI_TABLA'.
ti_fieldcat-seltext_l = 'APELLIDO'.
APPEND ti_fieldcat.

CLEAR ti_fieldcat.
ti_fieldcat-fieldname = 'SMTP_ADDR'.
ti_fieldcat-tabname = 'TI_TABLA'.
ti_fieldcat-seltext_l = 'DIRECCION ELECTRONICA'.
APPEND ti_fieldcat.

CLEAR ti_fieldcat.
ti_fieldcat-fieldname = 'SMTP_SRCH'.
ti_fieldcat-tabname = 'TI_TABLA'.
ti_fieldcat-seltext_l = 'ALGO ELECTRONICO'.
APPEND ti_fieldcat.

ENDFORM. " armadosalida

*&---------------------------------------------------------------------*
*& Form salida
*&--------------------------------------------------------------------
FORM salida .

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* i_callback_program = c_repid
* i_callback_pf_status_set = 'PF_STATUS'
* i_callback_user_command = 'USER_COMMAND'
* i_structure_name = 'TI_ALV'
* is_layout = wa_layout
it_fieldcat = ti_fieldcat[]
* i_save = 'A'
TABLES
t_outtab = ti_tabla
EXCEPTIONS
program_error = 1
OTHERS = 2.

IF sy-subrc NE 0.
MESSAGE i398(00) WITH 'fallo la funcion'.
ENDIF.
ENDFORM. " salida

viernes, 8 de agosto de 2008

Obtener primer y ultimo día del mes de una fecha dada

Nos pueden pedir alguna vez que obtengamos el ultimo día de un mes. Como hacemos para saber si ese mes tiene 28, 30 o 31 dias?..peor si es viciesto. Con esta función nos salvamos, y obtener el primer día es solo cuestión de reemplazo.

*Codigo

Data: lg_datum type sy-datum.

Data: lg_dia_low type sy-datum.

lg_datum = p_dia. "Nos viene la fecha por parametro y lo asignamos

CALL FUNCTION 'RP_LAST_DAY_OF_MONTHS'

EXPORTING day_in = lg_datum "Ponemos la fecha que nos vino por parametro

IMPORTING last_day_of_month = lg_datumbsi "Obtenemos el ultimo dia del mes
EXCEPTIONS
day_in_no_date = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

lg_dia_low = lg_datumbsi. "Asigno la fecha del ultimo dia otra variable.
lg_dia_low+6(2) = '01'. "Piso los primeros 2 caracteres de mi fecha con 01. Obteniendo el 1er dia del mes.

Como usar un field symbols como un work area

* -------------------------------------------------------------------- *
* Internal Tables *
* -------------------------------------------------------------------- *
DATA: ti_BSEG TYPE STANDARD TABLE OF BSEG.

* -------------------------------------------------------------------- *
* FIELD-SYMBOLS *
* -------------------------------------------------------------------- *

FIELD-SYMBOLS: <ref_bseg>
LIKE LINE OF ti_BSEG. "construimos segun la tabla interna

*Luego hacemos un select por ejemplo para cargar la tabla interna.

Select *
from BSEG
into table ti_bseg.

*Luego hacemos el loop con el field symbols

Loop ti_bseg
ASSIGNING <ref_bseg> . "Se utiliza
ASSIGNING en lugar de into.
*La asignacion de un field symbols se comporta como un work area, osea si hacemos una asignación.
variable = <ref_bseg>-bukrs.

Endloop.


 
Free counter and web stats