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.

martes, 23 de septiembre de 2008

Smartforms Formatting_Error 323

Cuando la condicion de direccion esta vacia tira este error. Por ende es necesario validar que no sea initial.

Primero seleccionamos:




Vamos a la solapa de Condicion y validamos este:

lunes, 8 de septiembre de 2008

DELETE ADJACENT DUPLICATES

Para borrar registros duplicados en una tabla interna se utiliza la sentencia "DELETE ADJACENT DUPLICATES" . Se utiliza casi siempre antes de hacer un for all entries. Se recomienda hacer el filtro por los mismos que se van a acceder (filtrar) luego en el for all entriens, como tambien el sort.

Ejemplo(esta tabla me provino de una función):

SORT ti_fkkcl "Ordeno tabla por campos de acceso
BY opbel
opupw
opupk
opupz.

*Se copia la tabla para no eliminar datos de posible utilizacion luego.
ti_fkkcl_aux[] = ti_fkkcl[].

*Delete duplicates
DELETE ADJACENT DUPLICATES FROM ti_fkkcl_aux
COMPARING opbel "Se elimina por acceso
opupw
opupk
opupz.

*FKKMAZE - Histórico de reclamação - itens do documento
SELECT laufd
laufi
gpart
vkont
mazae
opbel
opupw
opupk
opupz
mahns
xmsto
xinfo
mahnv
FROM fkkmaze
INTO TABLE ti_fkkmaze
FOR ALL ENTRIES IN ti_fkkcl_aux
WHERE opbel EQ ti_fkkcl_aux-opbel
AND opupw EQ ti_fkkcl_aux-opupw
AND opupk EQ ti_fkkcl_aux-opupk
AND opupz EQ ti_fkkcl_aux-opupz
AND xinfo EQ space
AND xmsto EQ space.

viernes, 5 de septiembre de 2008

Lectura Binaria (Binary Search)

Para realizar una lectura binaria, es necesario si o si realizar un ordenamiento previo por los campos de acceso (osea realizar un sort previo de esa tabla interna a leer).

*&---------------------------------------------------------------------*
*& Report ZCPRUEBA_DSIERRA
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT zcprueba_dsierra.

* -------------------------------------------------------------------- *
* Tables *
* -------------------------------------------------------------------- *
tables: equi,
egerh.

* -------------------------------------------------------------------- *
* Types *
* -------------------------------------------------------------------- *

TYPES: BEGIN OF type_equi,
equnr TYPE equi-equnr,
matnr TYPE equi-matnr,
herst TYPE equi-herst,
typbz TYPE equi-typbz,
objnr TYPE equi-objnr,
werk TYPE equi-werk,
sernr TYPE equi-sernr,
lager TYPE equi-lager,
charge TYPE equi-charge,
END OF type_equi.

TYPES: BEGIN OF type_egerh,
equnr TYPE egerh-equnr,
END OF type_egerh.
* -------------------------------------------------------------------- *
* Internal Tables *
* -------------------------------------------------------------------- *
DATA: ti_equi TYPE STANDARD TABLE OF type_equi.
DATA: ti_egerh TYPE STANDARD TABLE OF type_egerh.

* -------------------------------------------------------------------- *
* FIELD-SYMBOLS *
* -------------------------------------------------------------------- *
FIELD-SYMBOLS: LIKE LINE OF ti_equi. "Work area
FIELD-SYMBOLS: LIKE LINE OF ti_egerh. "Work area

* -------------------------------------------------------------------- *
* SELECT-OPTIONS and PARAMETERS *
* -------------------------------------------------------------------- *
selection-screen begin of block b1 with frame title text-001.
SELECT-OPTIONS: sc_matnr FOR equi-matnr. "Stuff
SELECT-OPTIONS: sc_sern FOR equi-sernr. "No. of series
SELECT-OPTIONS: sc_werk FOR equi-werk. "Centre
SELECT-OPTIONS: sc_lager FOR equi-lager. "Filing
SELECT-OPTIONS: sc_char FOR equi-charge. "Lot of Inventories
SELECT-OPTIONS: sd_datum FOR sy-datum OBLIGATORY DEFAULT sy-datum. "Period
SELECTION-SCREEN END OF BLOCK b1.

REFRESH ti_equi. "Limpieza de tabla
REFRESH ti_egerh. "Limpieza de tabla

*--Equipamento dados mestres
SELECT equnr
matnr
herst
typbz
objnr
sernr
werk
lager
charge
FROM equi
INTO TABLE ti_equi
WHERE matnr IN sc_matnr
AND sernr IN sc_sern
AND werk IN sc_werk
AND lager IN sc_lager
AND charge IN sc_char
AND erdat IN sd_datum.



IF NOT ti_equi[] IS INITIAL.


SORT ti_equi
BY equnr.

*Delete Duplicates
DELETE ADJACENT DUPLICATES FROM ti_equi.


SELECT equnr
FROM egerh
INTO TABLE ti_egerh
FOR ALL ENTRIES IN ti_equi
WHERE equnr = ti_equi-equnr
AND bis = '9999'
AND ( ( kombinat = 'Z' )
OR ( kombinat = 'W' )
OR ( kombinat = 'S' ) ).

IF sy-subrc EQ 0.
SORT ti_egerh "Necesario ordenar la tabla para hacer read con binary search
BY equnr.

ENDIF.

LOOP AT ti_equi
ASSIGNING .

READ TABLE ti_egerh
ASSIGNING
WITH KEY
equnr =
BINARY SEARCH. "Lectura binaria

IF sy-subrc EQ 0.
*proceso o guardo algo.
ENDIF.
ENDLOOP.
ENDIF.

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