PDA

Ver la Versión Completa : Comparación de sistemas


ChaloZ
29/03/06, 15:46:55
Hola, estoy empezando a aprender SAP y me encomendaron averiguar si existe alguna transacción, programa u opción que permita comparar dos sistemas o mandates. ¿Alguien me puede ayudar? :confused:

tracer
29/03/06, 18:26:11
Hola ChaloZ,

Seguro que existe alguna transacción estandar con la que te pueden ayudar nuestros saperos :D . Yo te adjunto un programa muy útil que revisa la parametrización entre mandantes de sap para ver si coinciden.

Te adjunto el código del programa y unos pantallazos.

http://www.mundosap.com/foro/images/ZRCHKSPRO_1.jpg

http://www.mundosap.com/foro/images/ZRCHKSPRO_2.jpg


http://www.mundosap.com/foro/images/ZRCHKSPRO_3.jpg


ATENCIÓN!!! EN ESTE LISTADO SE IDENTIFICA EL SISTEMA REMOTO CON EL MANDANTE 999.

Modo de funcionamiento:


Seleccionar los mandantes y tablas a comparar.
Ejecutar
En el listado, por cada tabla, muestra para cada mandante el numero de entradas de la tabla y con un icono si estas coinciden o no, pero el hecho de que coincidan no implica que los registros sean iguales uno a uno, solo que tienen el mismo número de registros en cada mandante.
Al hacer doble click sobre el listado en el número de registros de un mandante muestra dichos registros, sin embargo, si se hace doble click sobre el nombre de la tabla o la descripción muestra todos los registros de todos los mandantes ordenados de forma que se vea a simple vista si existen diferencias entre ellos.
Al hacer doble click sobre el icono de parametrización lleva al usuario a los menus de la SPRO en los que se utiliza la tabla en cuestión. Probado para R/3 5.0

************************************************************************
*
* REPORT ZRCHKSPRO --I arnaiz 09:15 2 feb, 2006 (PST)
*
* DESCRIPCIÓN: Revisa la parametrización entre mandantes para comprobar
* si están iguales.
*
* Modo de funcionamiento:
* a) Seleccionar los mandantes y tablas a comparar.
* b) Ejecutar
* c) En el listado, por cada tabla, muestra para cada mandante el
* numero de entradas de la tabla y con un icono si estas coinciden
* o no, pero el hecho de que coincidan no implica que los
* registros sean iguales uno a uno, solo que tienen el mismo
* número de registros en cada mandante.
* d) Al hacer doble click sobre el listado en el número de registros
* de un mandante muestra dichos registros, sin embargo, si se hace
* doble click sobre el nombre de la tabla o la descripción muestra
* todos los registros de todos los mandantes ordenados de forma
* que se vea a simple vista si existen diferencias entre ellos.
* e) Al hacer doble click sobre el icono de parametrización lleva al
* usuario a los menus de la SPRO en los que se utiliza la tabla en
* cuestión.
*
* Espero que os sea util ;)
*
* MÓDULO AL QUE PERTENECE: BC
*
* AUTOR: Ignacio Arnaiz Piorno FECHA: 01-02-2006
* CONTACTO: i_arnaiz@sanesteban.com
*
* ----------------------------------------------------------------------
* CONTROL DE MODIFICACIONES
* AUTOR EMPRESA FECHA MOTIVO
* I.ARNAIZ ....... 07/02/2006 Se añade la posibilidad de
* comparar contra un mandante
* remoto(P.Ej: Test, Producción.)
* .......... ....... DD/MM/AAAA ................................
*---------------------------------------------------------------------
************************************************************************
REPORT zrchkspro.

************************************************************************
* INCLUDES
************************************************************************
INCLUDE ZIALV.
INCLUDE ZICONTADOR.
************************************************************************
* Definición de tablas del sistema
************************************************************************
TABLES dd02l.
TABLES tmscsys.
TABLES t000.
************************************************************************
* Definición de constantes
************************************************************************

************************************************************************
* Definición de variables
************************************************************************
DATA: l_txt LIKE sy-title.
DATA: l_msg1 LIKE sy-title,
l_msg2 LIKE sy-title,
* l_msg3 LIKE sy-title,
l_msg4 LIKE sy-title,
l_msg5 LIKE sy-title,
l_msg6 LIKE sy-title,
l_msg7 LIKE sy-title.

DATA l_puntero TYPE REF TO data.
************************************************************************
* Definición de estructuras
************************************************************************

************************************************************************
* Definición de tablas internas
************************************************************************
DATA: BEGIN OF i_listado OCCURS 0,
tabname LIKE dd02l-tabname,
cust LIKE abadrtrace_alv-icon_l2,
ddtext LIKE dd02t-ddtext,
index_m1 LIKE sy-index,
index_m2 LIKE sy-index,
index_m3 LIKE sy-index,
index_m4 LIKE sy-index,
index_m5 LIKE sy-index,
index_m6 LIKE sy-index,
index_m7 LIKE sy-index,
index_m8 LIKE sy-index,
index_m9 LIKE sy-index,
indrfc LIKE sy-index,
icon LIKE abadrtrace_alv-icon_l2,
END OF i_listado.

DATA i_t000 LIKE t000 OCCURS 0 WITH HEADER LINE.
DATA i_tmscsys LIKE tmscsys OCCURS 0 WITH HEADER LINE.
************************************************************************
* Definición de parámetros
************************************************************************

************************************************************************
* Definición de rango de selección
************************************************************************

************************************************************************
* Definición de la pantalla de selección
************************************************************************
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE l_msg3.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 3(40) l_tname.
SELECT-OPTIONS: s_tname FOR dd02l-tabname DEFAULT 'T001'.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 3(40) l_mandt.
SELECT-OPTIONS: s_mandt FOR t000-mandt.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 3(40) l_syst.
SELECT-OPTIONS: s_syst FOR tmscsys-sysnam
DEFAULT sy-sysid NO INTERVALS NO-EXTENSION.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b1.
************************************************************************
* Definición de FIELD-SYMBOLS
************************************************************************
FIELD-SYMBOLS <fs_campo>.
FIELD-SYMBOLS <fs_tabla> TYPE STANDARD TABLE.
FIELD-SYMBOLS <fs_tabla_aux> TYPE STANDARD TABLE.
FIELD-SYMBOLS <fs_tabla_hd>.
************************************************************************
*
* LÓGICA DEL PROGRAMA
*
************************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_syst-low.
DATA gt_excluded_systems LIKE tmscsys OCCURS 0.

CALL FUNCTION 'TMS_UI_F4_SYSTEMS'
EXPORTING
iv_plus_virtual = ' '
iv_plus_external = ' '
iv_only_active = 'X'
iv_title = l_msg6
TABLES
tt_exclude = gt_excluded_systems
CHANGING
cv_system = s_syst-low
EXCEPTIONS
OTHERS = 1.


************************************************************************
* Definición de inicializaciones
************************************************************************
INITIALIZATION.
l_mandt = 'Mandantes:'.
l_syst = 'Sistemas:'.
l_tname = 'Tablas'.
l_msg1 = 'Seleccione un rango de no más de 9 mandantes.'.
l_msg2 = 'Comprobando tabla'.
l_msg3 = 'Comparativa de tablas entre mandantes'.
l_msg4 = 'Mandante'.
l_msg5 = 'Recuperando datos del mandante'.
l_msg6 = 'Elija sistema'.
l_msg7 = 'Sistema'.
***********************************************************************
* Proceso principal
************************************************************************
START-OF-SELECTION.

* Se seleccionan todos los sistemas en el rango
SELECT *
FROM tmscsys
INTO TABLE i_tmscsys
WHERE sysnam IN s_syst.

* Se seleccionan todos los mandantes en el rango
SELECT *
FROM t000
INTO TABLE i_t000
WHERE mandt IN s_mandt.

* Se excluyen los que pertenezcan a SAP
DELETE i_t000 WHERE cccategory = 'S' " Referencia SAP
OR cccategory = 'C'. " Customizing

SORT i_t000.
DESCRIBE TABLE i_t000 LINES sy-index.
IF sy-index > 9.
MESSAGE i000(01)
WITH l_msg1.
EXIT.
ENDIF.

* Se recuperan todas las tablas en el rango que sean de parametrización
SELECT a~tabname
b~ddtext
FROM dd02l AS a
INNER JOIN dd02t AS b
ON a~tabname = b~tabname
INTO CORRESPONDING FIELDS OF TABLE i_listado
WHERE a~tabname IN s_tname
AND NOT a~tabname = 'T000' "tabla de mandantes
AND a~contflag = 'C' "Customizing
AND b~ddlanguage = sy-langu.


loop_at i_listado.
* Comprobamos que sean especificas de mandante puesto que si no lo son
* no tiene sentido compararlas
SELECT SINGLE tabname
FROM dd03l
INTO i_listado-tabname
WHERE tabname = i_listado-tabname
AND fieldname = 'MANDT'.
IF NOT sy-subrc IS INITIAL.
DELETE i_listado.
CONTINUE.
ENDIF.

i_listado-cust = icon_tree.
i_listado-icon = icon_okay.

* Para cada mandante
LOOP AT i_t000.
sy-tabix = sy-tabix + 3.
* Se prepara el campo de la estructura al que corresponde el mandante
ASSIGN COMPONENT sy-tabix
OF STRUCTURE i_listado
TO <fs_campo>.

IF sy-subrc IS INITIAL.
* Se cuentan las entradas de la tabla en dicho mandante
SELECT COUNT( * )
FROM (i_listado-tabname)
CLIENT SPECIFIED
INTO <fs_campo>
WHERE mandt = i_t000-mandt.
* Si no coinciden en numero de entradas con el del primer mandante se
* muestra como erroneo (solo será correcto si tiene el mismo número de
* entradas)
IF <fs_campo> <> i_listado-index_m1.
i_listado-icon = icon_cancel.
ENDIF.
ENDIF.
ENDLOOP.

LOOP AT i_tmscsys WHERE sysnam <> sy-sysid.

CREATE DATA l_puntero TYPE TABLE OF (i_listado-tabname).
ASSIGN l_puntero->* TO <fs_tabla>.

PERFORM recuperar_tabla_rfc TABLES <fs_tabla>
USING i_listado-tabname
i_tmscsys-sysnam
i_listado-indrfc.

* Si no coinciden en numero de entradas con el del primer mandante se
* muestra como erroneo (solo será correcto si tiene el mismo número de
* entradas)
IF i_listado-indrfc <> i_listado-index_m1.
i_listado-icon = icon_cancel.
ENDIF.
ENDLOOP.

MODIFY i_listado.

endloop_at l_msg2
i_listado-tabname
'-'
i_listado-ddtext
.
************************************************************************
* Acciones de final de proceso
************************************************************************
END-OF-SELECTION.
* Se recupera el catalogo de campos para la tabla interna.
PERFORM alv_catalogo
USING
'I_LISTADO'.

* Se modifica el catalogo para que muestre como cabecera de las columnas
* el mandante al que van definidas, y ademas elimine las columnas que
* sobran.
DATA l_index LIKE sy-tabix.
LOOP AT gt_fieldcat INTO gt_fieldcat_hd.
IF gt_fieldcat_hd-fieldname = 'INDRFC'.
LOOP AT i_tmscsys WHERE sysnam <> sy-sysid.
gt_fieldcat_hd-seltext_l = i_tmscsys-sysnam.
gt_fieldcat_hd-seltext_m = i_tmscsys-sysnam.
gt_fieldcat_hd-seltext_s = i_tmscsys-sysnam.
gt_fieldcat_hd-just = 'R'.
MODIFY gt_fieldcat FROM gt_fieldcat_hd.
EXIT.
ENDLOOP.
IF NOT sy-subrc IS INITIAL.
DELETE gt_fieldcat INDEX l_index.
ENDIF.
ENDIF.
CHECK gt_fieldcat_hd-fieldname(5) = 'INDEX'.
sy-index = sy-tabix - 3.
l_index = sy-tabix.
READ TABLE i_t000 INDEX sy-index.
IF sy-subrc IS INITIAL.
gt_fieldcat_hd-seltext_l = i_t000-mandt.
gt_fieldcat_hd-seltext_m = i_t000-mandt.
gt_fieldcat_hd-seltext_s = i_t000-mandt.
gt_fieldcat_hd-just = 'R'.
MODIFY gt_fieldcat FROM gt_fieldcat_hd.
ELSE.
DELETE gt_fieldcat INDEX l_index.
ENDIF.
ENDLOOP.


* Se rellenan el evento USER_COMMAND para el listado
PERFORM alv_rellenar_eventos
USING
'USER_COMMAND'
'USER_COMMAND'.

* Se modifica la cabecera
PERFORM alv_rellenar_cabecera
USING

l_msg3
c_tipo_grande.

LOOP AT i_t000.
l_txt = sy-tabix.
CONCATENATE l_msg4 l_txt INTO l_txt.
PERFORM alv_rellenar_cabecera
USING
l_txt
i_t000-mandt
c_tipo_mediano.
ENDLOOP.

l_txt = 1.
CONCATENATE l_msg7 l_txt INTO l_txt.
PERFORM alv_rellenar_cabecera
USING
l_txt
sy-sysid
c_tipo_mediano.


LOOP AT i_tmscsys WHERE NOT sysnam = sy-sysid.
l_txt = sy-tabix + 1.
CONCATENATE l_msg7 l_txt INTO l_txt.
PERFORM alv_rellenar_cabecera
USING
l_txt
i_tmscsys-sysnam
c_tipo_mediano.
ENDLOOP.

* Se muestra finalmente el listado
IF sy-batch IS INITIAL.
PERFORM alv_mostrar_informe
TABLES
i_listado
USING

c_tipo_alv.
ELSE.
PERFORM alv_mostrar_informe
TABLES
i_listado
USING

c_tipo_list.
ENDIF.
************************************************************************
* Definición de cabeceras de listado
************************************************************************
*TOP-OF-PAGE.

************************************************************************
* Definición de líneas de pie del listado
************************************************************************
*END-OF-PAGE.

************************************************************************
* Definición de acciones a tomar en caso de selección con doble click
************************************************************************
*AT LINE-SELECTION.

************************************************************************
* Definición y control de acciones a tomar según entrada del usuario
************************************************************************
*AT USER-COMMAND.

************************************************************************
* Definición y control de acciones a tomar según la tecla de función
************************************************************************
*AT PFM.

************************************************************************
* Definición de las validaciones a realizar de los parámetros de entrada
************************************************************************
*AT SELECTION-SCREEN.

************************************************************************
*
* FORMS ADICIONALES
*
************************************************************************
*&---------------------------------------------------------------------
*& Form user_command
*&---------------------------------------------------------------------
*
* ESTE FORM DEBE SER CREADO EN EL CODIGO DEL LISTADO CON UNA
* ESTRUCTURA PARECIDA A ESTA:
*----------------------------------------------------------------------
*
* --> p_UCOMM COMANDO
* <-- p_CAMPO CAMPO EXACTO DONDE SE GENERO EL COMANDO
*----------------------------------------------------------------------
FORM user_command USING p_ucomm LIKE sy-ucomm
p_campo TYPE slis_selfield.

DATA l_puntero TYPE REF TO data.
FIELD-SYMBOLS <fs_tabla> TYPE STANDARD TABLE.
FIELD-SYMBOLS <fs_tabla_aux> TYPE STANDARD TABLE.
FIELD-SYMBOLS <fs_tabla_hd>.

* Leemos la linea en la que se lanzo el comando
READ TABLE i_listado INDEX p_campo-tabindex.

* Comprobamos cual es el codigo .
CASE p_ucomm.
* Si se hizo doble click
WHEN c_click.
* Dependiendo del campo, si es una columna de mandante se muestran
* solamente los datos para ese mandante
IF p_campo-fieldname(5) = 'INDEX'.

sy-index = p_campo-fieldname+7(1).

READ TABLE i_t000 INDEX sy-index.

CREATE DATA l_puntero TYPE TABLE OF (i_listado-tabname).
ASSIGN l_puntero->* TO <fs_tabla>.

IF sy-subrc IS INITIAL.
SELECT *
FROM (i_listado-tabname)
CLIENT SPECIFIED
INTO TABLE <fs_tabla>
WHERE mandt = i_t000-mandt.

DATA l_title LIKE sy-title.

CONCATENATE 'Tabla:' i_listado-ddtext
'- Mandt:' i_t000-mandt
'- Cant. reg.:' p_campo-value
INTO l_title SEPARATED BY space.
ENDIF.

ELSEIF p_campo-fieldname = 'INDRFC'.

CREATE DATA l_puntero TYPE TABLE OF (i_listado-tabname).
ASSIGN l_puntero->* TO <fs_tabla>.

IF sy-subrc IS INITIAL.

PERFORM recuperar_tabla_rfc TABLES <fs_tabla>
USING i_listado-tabname
i_tmscsys-sysnam
i_listado-indrfc.

LOOP AT <fs_tabla> ASSIGNING <fs_tabla_hd>.
ASSIGN COMPONENT 'MANDT'
OF STRUCTURE <fs_tabla_hd> TO <fs_campo>.
<fs_campo> = '999'.
ENDLOOP.

LOOP AT i_tmscsys WHERE NOT sysnam = sy-sysid.
ENDLOOP.
CONCATENATE 'Tabla:' i_listado-ddtext
'- Sist:' i_tmscsys-sysnam
'- Cant. reg.:' p_campo-value
INTO l_title SEPARATED BY space.
ENDIF.


ELSEIF p_campo-fieldname = 'CUST'.

CALL FUNCTION 'OBJECT_MAINTENANCE_CALL'
EXPORTING
* OBJECTNAME = ' '
* OBJECTTYPE = ' '
* SUBOBJNAME = ' '
tabname = i_listado-tabname
* LANGUAGE = SY-LANGU
* IV_ENCLOSING_OBJECT = ' '
* TABLES
* SUBOBJ_LIST_FROM_T100O =
EXCEPTIONS
interface_not_correct = 1
transaction_not_maintained = 2
transaction_not_found = 3
table_not_activ = 4
table_not_found = 5
subobject_not_found_in_project = 6
subobject_not_found_in_guide = 7
object_not_found_in_project = 8
object_not_found_in_guide = 9
table_has_no_object_in_project = 10
table_has_no_object_in_guide = 11
outline_not_found = 12
call_transaction_recurring = 13
system_failure = 14
OTHERS = 15
.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.


ELSE.
* Si es cualquier otro campo es muestran los datos para cualquier
* mandante
CREATE DATA l_puntero TYPE TABLE OF (i_listado-tabname).
ASSIGN l_puntero->* TO <fs_tabla>.
CREATE DATA l_puntero TYPE TABLE OF (i_listado-tabname).
ASSIGN l_puntero->* TO <fs_tabla_aux>.

* Se seleccionan los datos de todos los mandantes
loop_at i_t000.
SELECT *
FROM (i_listado-tabname)
CLIENT SPECIFIED
INTO TABLE <fs_tabla_aux>
WHERE mandt = i_t000-mandt.

LOOP AT <fs_tabla_aux> ASSIGNING <fs_tabla_hd>.
APPEND <fs_tabla_hd> TO <fs_tabla>.
ENDLOOP.
endloop_at l_msg5
i_t000-mandt
' '
' '
' '.

LOOP AT i_tmscsys WHERE NOT sysnam = sy-sysid.

PERFORM recuperar_tabla_rfc TABLES <fs_tabla_aux>
USING i_listado-tabname
i_tmscsys-sysnam
i_listado-indrfc.

LOOP AT <fs_tabla_aux> ASSIGNING <fs_tabla_hd>.
ASSIGN COMPONENT 'MANDT'
OF STRUCTURE <fs_tabla_hd> TO <fs_campo>.
<fs_campo> = '999'.
APPEND <fs_tabla_hd> TO <fs_tabla>.
ENDLOOP.

ENDLOOP.
l_title = 'Comparativa para todos los mandantes'.
ENDIF.

IF NOT p_campo-fieldname = 'CUST'.
* Se muestra el listado con las características de visualización que
* necesitamos
gt_layout-zebra = 'X'.
gt_layout-window_titlebar = l_title.

PERFORM alv_catalogo
USING
i_listado-tabname.


CLEAR gt_fieldcat_hd-tech.

MODIFY gt_fieldcat
FROM gt_fieldcat_hd
TRANSPORTING tech
WHERE NOT fieldname IS INITIAL.

REFRESH gt_events.
REFRESH gt_list_top_of_page.

* Ordenamos por todos los campos menos el mandante, para de ese modo
* localizar más facilmente en el ALV las diferencias.
LOOP AT gt_fieldcat INTO gt_fieldcat_hd WHERE "key = 'X' AND
NOT fieldname = 'MANDT'.

DESCRIBE TABLE gt_sort LINES sy-index.
sy-index = sy-index + 1.
CLEAR gt_sort_hd.
gt_sort_hd-spos = sy-index.
gt_sort_hd-fieldname = gt_fieldcat_hd-fieldname.
gt_sort_hd-tabname = gt_fieldcat_hd-tabname.
gt_sort_hd-up = 'X'.
* gt_sort_hd-down
* gt_sort_hd-group
* gt_sort_hd-subtot
* gt_sort_hd-comp
* gt_sort_hd-expa
* gt_sort_hd-obligatory
APPEND gt_sort_hd TO gt_sort.
ENDLOOP.

* Se muetsra el informe
PERFORM alv_mostrar_informe
TABLES
<fs_tabla>
USING

c_tipo_alv.

REFRESH gt_sort.
REFRESH gt_filter.
ENDIF.
WHEN OTHERS.
ENDCASE.



ENDFORM. "USER_COMMAND

*&---------------------------------------------------------------------*
*& Form recuperar_tabla_rfc
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_CONTENIDO text
* -->P_TABNAME text
* -->P_CANTIDAD text
*----------------------------------------------------------------------*
FORM recuperar_tabla_rfc TABLES p_contenido
USING p_tabname
p_destino
p_cantidad.

DATA: lt_data LIKE tab512 OCCURS 0 WITH HEADER LINE.

REFRESH p_contenido.

* Se cuentan las entradas de la tabla en dicho mandante/sistema
CALL FUNCTION 'RFC_GET_TABLE_ENTRIES'
DESTINATION p_destino
EXPORTING
* BYPASS_BUFFER = ' '
* FROM_KEY = ' '
* GEN_KEY = ' '
* MAX_ENTRIES = 0
table_name = p_tabname
* TO_KEY = ' '
IMPORTING
number_of_entries = p_cantidad
TABLES
entries = p_contenido
EXCEPTIONS
internal_error = 1
table_empty = 2
table_not_found = 3
OTHERS = 4
.
IF sy-subrc <> 0
AND sy-subrc <> 2.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDFORM. " recuperar_tabla_rfc


Un saludo a todo el foro de sap ;) .

ChaloZ
30/03/06, 13:32:06
Gracias por el código. Intente probarlo, pero al momento de activar el programa lanza errores de sintaxis XD.

Saludos

aduro
30/03/06, 14:07:11
El error es sobre el INCLUDE zialv ?

Gracias por el código. Intente probarlo, pero al momento de activar el programa lanza errores de sintaxis XD.

Saludos

tracer
30/03/06, 14:29:36
Ups :o fallo muy se olvidaban los includes.

Creo que son estos

************************************************************************
*
* INCLUDE ZICONTADOR
*
* DESCRIPCIÓN: Este include tiene variables y performs utiles para
* mostrar por pantalla un contador de tiempo durante la ejecución de
* los programas
*
* MÓDULO AL QUE PERTENECE: BC
*
* AUTOR: Ignacio Arnaiz Piorno FECHA: 27-10-2004
* CONTACTA CONMIGO : i_arnaiz@sanesteban.com
*
* ----------------------------------------------------------------------
* CONTROL DE MODIFICACIONES
* AUTOR EMPRESA FECHA MOTIVO
* .......... ....... DD/MM/AA ................................
* .......... ....... DD/MM/AA ................................
*-----------------------------------------------------------------------
************************************************************************
INCLUDE ZICONTADOR.

************************************************************************
* INCLUDES
************************************************************************

************************************************************************
* Definición de variables
************************************************************************
DATA d_max TYPE i. " Nº Máximo de llamadas
DATA d_tabix LIKE sy-tabix. " Nº de llamada actual
DATA d_ant LIKE d_max " Porcentaje que se dibujó en la anterior
. " llamada

DATA d_texto_indicador(1000) TYPE c.

************************************************************************
* Definición de macros
************************************************************************
*-- Macro para iniciar un loop
*-- &1 - Nombre de la tabla interna
DEFINE loop_at.
perform indicador_de_progreso_max tables &1.
loop at &1.
if not sy-tabix is initial
and not sy-tabix = 1.
d_tabix = sy-tabix.
else.
d_tabix = sy-index.
endif.
END-OF-DEFINITION.

*-- Macro para finalizar un loop mostrando un indicador de progreso con
* un texto (pueden ser hasta 5 textos que se concatenaran).
*-- &1 - Texto 1 a mostrar
*-- &2 - Texto 2 a mostrar
*-- &3 - Texto 3 a mostrar
*-- &4 - Texto 4 a mostrar
*-- &5 - Texto 5 a mostrar
DEFINE endloop_at.

concatenate &1 &2 &3 &4 &5 into d_texto_indicador
separated by space.

perform indicador_de_progreso_de_loop
using d_texto_indicador.
endloop.

END-OF-DEFINITION.


*&--------------------------------------------------------------------*
*& Form indicador_de_progreso
*&--------------------------------------------------------------------*
* Muestra el indicador de progreso del sapgui en el estado
* P_PERCENT (Porcentaje del proceso) y con el texto P_TEXTO que
* se elija.
*---------------------------------------------------------------------*
FORM indicador_de_progreso USING p_percent
p_texto.

IF sy-batch IS INITIAL.
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
percentage = p_percent
text = p_texto.

ENDIF.

ENDFORM. " indicador_de_progreso

*&--------------------------------------------------------------------*
*& Form indicador_de_progreso_de_loop
*&--------------------------------------------------------------------*
* Muestra el porcentaje que ocurrencias de una tabla interna que
* ya se han procesado mediante un loop mostrando el texto P_TEXTO
* Este form se utilizará mediante la macro ENDLOOP_AT para mostrar
* un texto y el porcentaje de ocurrencias realizado al final de
* un loop.
*---------------------------------------------------------------------*
FORM indicador_de_progreso_de_loop USING p_texto.

DATA l_porcentaje TYPE i.
DATA l_resto LIKE l_porcentaje.
IF NOT d_max IS INITIAL.

IF d_tabix <> 1.
l_porcentaje = ( d_tabix * 100 ) / d_max.
ENDIF.

IF d_max < 1000.
l_resto = l_porcentaje MOD 10.
ENDIF.

IF l_resto IS INITIAL AND NOT l_porcentaje = d_ant.

PERFORM indicador_de_progreso USING l_porcentaje
p_texto.
d_ant = l_porcentaje.

ENDIF.
ENDIF.
ENDFORM. " indicador_de_progreso_de_loop


*&--------------------------------------------------------------------*
*& Form indicador_de_progreso_max
*&--------------------------------------------------------------------*
* Lee la cantidad de entradas de una tabla y recoge el tamaño
* máximo. Este perform se usa mediante la macro LOOP_AT para
* posteriormente calcular el porcentaje que ocurrencias de una
* tabla interna que ya se han procesado con un loop.
*---------------------------------------------------------------------*
* -->P_TABLE text
*---------------------------------------------------------------------*
FORM indicador_de_progreso_max TABLES p_table.

DESCRIBE TABLE p_table LINES d_max.

ENDFORM. " indicador_de_progreso_max

tracer
30/03/06, 14:30:12
y el otro es:

************************************************************************
*
* INCLUDE ZIALV
*
* DESCRIPCIÓN: Tipos, variables, constantes y forms para trabajo
* con ALV's
*
* INSTRUCCIONES: Sera obligatorio para un correcto funcionamiento de la
* libreria añadir al codigo del report un form llamado USER_COMMAND
* creado con la estructura del existente comentado al final de este
* include.
*
* Además será obligatorio tambien añadir al codigo del report un form
* llamado LAYOUT creado con la estructura del existente comentado al
* final de este include.
*
* Si se cumple todo esto, simplemente habra que llamar al form
* ALV_MOSTRAR_INFORME pasandole como parametros la tabla a mostrar y el
* nombre de la estructura de dicha tabla, estructura que debera ser del
* diccionario de datos, no definida en el codigo del listado, ademas se
* le pasará una constante que podrá tener dos valores.
* - C_TIPO_ALV <- Si queremos modo grid
* - C_TIPO_LIST <- Si queremos modo listado
*
* Si se prefiere podrá crearse el catalogo de campos manualmente
* rellenando la estructura GT_FIELDCAT aunque es la opción menos
* recomendada, en este caso el parametro P_STRUCT de
* ALV_MOSTRAR_INFORME se pasará en blanco.
*
* Permite añadir lineas a la cabecera mediante el uso del form
* ALV_RELLENAR_CABECERA pasandole los textos y los tres modos de
* texto en la cabecera, a saber: (SOLO FUNCIONA EN MODO GRID)
* - C_TIPO_GRANDE
* - C_TIPO_MEDIANO
* - C_TIPO_PEQUEÑO
*
* Ademas es posible mostrar un logo por pantalla, para ello es
* necesario usar el form ALV_ASIGNAR_LOGO pasandole el nombre del
* logo que previamente se habrá creado siguiendo lo siguientes pasos:
* (SOLO FUNCIONA EN MODO GRID)
* PASOS PARA SUBIR LOGO:
*
* 1. Ir a la transcción OAER
*
* 2. En el nombre de clase, pon 'PICTURES'
*
* 3. El tipo de clase es 'OT'
*
* 4. En el "object key" introduce el nombre que le quieres dar al
* logo.
*
* 5. Ejecuta
*
* 6. En la siguiente pantalla seleciona documento standard. Pincha
* sobre el incono de pantalla y entonces te preguntará por el
* nombre del fichero que vas a subir.
*
* La librería tambien permite añadir rutinas a los distintos eventos que
* el programador desee asignandole al nombre del evento el nombre de una
* form mediante la funcion ALV_EVENTS.
*
* EJEMPLO DE USO:
*
* END-OF-SELECTION.
*
** Preparamos los eventos:
* PERFORM alv_events.
*
** Excluimos codigos para status
* PERFORM alv_excluir_codigo USING 'CODE'.
** Con esta linea activaremos nuestro status personal, caso de no
** reellenar esta linea o rellenarla con el status en blanco mostraria
** el status standar
* PERFORM alv_aniadir_status USING 'STANDARD_FULLSCREEN'.*
** Se pueden insertar tantas lineas como se deseen en el encabezado.
* PERFORM alv_rellenar_cabecera USING 'TITULO 1'
* 'TITULO 2'
* c_tipo_grande.
*
** Asignamos codigo a los eventos que queramos ejecutar (TOP-OF-PAGE)
* PERFORM alv_rellenar_eventos
* USING
* 'USER_COMMAND' <-Nombre evento
* 'USER_COMMAND'. <-Nombre form para evento
* PERFORM alv_rellenar_eventos
* USING
* 'TOP-OF-PAGE'
* c_form_cabecera.
* PERFORM alv_asignar_logo
* USING
* 'ZLOGOSUBIDO'.
*
** Mostramos el listado
* PERFORM alv_mostrar_informe TABLES i_listado
* USING 'ZSTR_LISTADO'
* c_tipo_alv.
*
* AUTOR: Ignacio Arnaiz Piorno FECHA: 06-03-2005
* CONTACTO: i_arnaiz@sanesteban.com
*
* ----------------------------------------------------------------------
* CONTROL DE MODIFICACIONES
* AUTOR EMPRESA FECHA MOTIVO
* .......... ....... DD/MM/AA ................................
* .......... ....... DD/MM/AA ................................
*-----------------------------------------------------------------------
************************************************************************

************************************************************************
* Definición de tipos
************************************************************************
TYPE-POOLS: slis.

************************************************************************
* Definición de constantes
************************************************************************
CONSTANTS:
c_click LIKE sy-ucomm VALUE '&IC1', " Codigo del doble click
c_struct(50) TYPE c VALUE '',
c_pf_status_set TYPE slis_formname VALUE 'ALV_SET_STATUS',
c_user_command TYPE slis_formname VALUE 'USER_COMMAND',
c_layout TYPE slis_formname VALUE 'LAYOUT',
c_a(1) TYPE c VALUE 'A',
c_xselp(5) TYPE c VALUE 'XSELP',
c_marked TYPE c VALUE 'X',
c_form_cabecera TYPE slis_formname VALUE 'ALV_CABECERA',
c_tipo_grande TYPE c VALUE 'H',
c_tipo_mediano TYPE c VALUE 'S',
c_tipo_pequeno TYPE c VALUE 'A',
c_tipo_alv TYPE c VALUE '1',
c_tipo_list TYPE c VALUE '2'.

************************************************************************
* Definición de variables
************************************************************************

************************************************************************
* Definición de estructuras
************************************************************************
DATA: x_structure LIKE dd02l-tabname. "SAP Table
DATA: x_header LIKE dd02l-tabname. "SAP Table
DATA: x_item LIKE dd02l-tabname. "SAP Table
DATA: gt_layout TYPE slis_layout_alv.
DATA: gt_variant LIKE disvariant.
DATA: gt_list_top_of_page TYPE slis_t_listheader.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: gt_fieldcat_hd LIKE LINE OF gt_fieldcat.
DATA: gt_events TYPE slis_t_event .
DATA: gt_okcodes_a_excluir TYPE slis_extab OCCURS 0 WITH HEADER LINE.
DATA: d_logo(1000) TYPE c.
DATA: d_status LIKE c_pf_status_set.
* Relacion entre los datos de cabecera y posicion
DATA: gt_key TYPE slis_keyinfo_alv.

DATA d_alv_status LIKE c_pf_status_set.


************************************************************************
*
* FORMS ADICIONALES
*
************************************************************************
*---------------------------------------------------------------------*
* FORM alv_excluir_codigo *
*---------------------------------------------------------------------*
* Una vez que se lance el ALV con un STATUS cualquiera definido
* por el usuario (o bien el standar) el codigo P_CODIGO será
* omitido, y por tanto no se dibujará el botón asociado a él.
*---------------------------------------------------------------------*
FORM alv_excluir_codigo USING p_codigo.

DATA lt_okcodes_a_excluir TYPE slis_extab.

lt_okcodes_a_excluir-fcode = p_codigo.
APPEND lt_okcodes_a_excluir TO gt_okcodes_a_excluir.

SORT gt_okcodes_a_excluir.
DELETE ADJACENT DUPLICATES FROM gt_okcodes_a_excluir.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form alv_mostrar_informe
*&---------------------------------------------------------------------*
* Se utilizará en el programa una vez que se haya rellenado todo
* lo necesario para lanzar el listado de la tabla P_OUTPUT.
* P_TIPO será igual a C_TIPO_ALV si se quiere lanzar el ALV en
* modo GRID en caso de preferirlo en modo lista se pasará este
* parametro igual a C_TIPO_LIST.
* P_STRUCT será el nombre de una estructura del diccionario de
* la que tomar la estructura de salida del listado. En caso de
* pasarlo en blanco habrá que haber creado con anterioridad un
* catalogo de campos bien con el perform ALV_CATALOGO o bien
* añadiendo directamente los campos al catalogo gt_fieldcat[].
*----------------------------------------------------------------------*
FORM alv_mostrar_informe TABLES p_output
USING p_struct
p_tipo.

DATA l_struct LIKE c_struct.

l_struct = p_struct.

* Damos forma al informe
PERFORM (c_layout) IN PROGRAM (sy-cprog).

PERFORM alv_show_report TABLES p_output
USING l_struct
p_tipo.

ENDFORM. " alv_mostrar_informe
*

*&--------------------------------------------------------------------*
*& Form alv_mostrar_informe_jerarquico
*&--------------------------------------------------------------------*
* REDEFINIR CUANDO SE USE
*---------------------------------------------------------------------*
FORM alv_mostrar_informe_jerarquico TABLES i_header
i_item
USING p_header
p_item1
p_key1
p_key2
p_key3
p_key4
p_key5.


ENDFORM. " alv_mostrar_informe_jerarquico

*&---------------------------------------------------------------------*
*& Form alv_catalogo
*&---------------------------------------------------------------------*
* Inicializa el catalogo de campos gt_fieldcat[] añadiendole
* todos los campos de la estructura del diccionario P_ESTRUCTURA
*----------------------------------------------------------------------*
* -->P_C_ESTRUCTURA_LISTADO text
*----------------------------------------------------------------------*
FORM alv_catalogo USING p_estructura.

REFRESH gt_fieldcat.

DATA l_estructura LIKE dd02l-tabname.

l_estructura = p_estructura.

CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = l_estructura
i_client_never_display = 'X'
CHANGING
ct_fieldcat = gt_fieldcat[].

LOOP AT gt_fieldcat INTO gt_fieldcat_hd
WHERE seltext_l IS initial
AND seltext_m IS initial
AND seltext_s IS initial.

SELECT SINGLE ddtext
INTO gt_fieldcat_hd-seltext_l
FROM dd03t
WHERE tabname = l_estructura
AND ddlanguage = sy-langu
AND fieldname = gt_fieldcat_hd-fieldname.

gt_fieldcat_hd-seltext_m = gt_fieldcat_hd-seltext_l.
gt_fieldcat_hd-seltext_s = gt_fieldcat_hd-seltext_l.

MODIFY gt_fieldcat FROM gt_fieldcat_hd.
ENDLOOP.

ENDFORM. " alv_catalogo

*&---------------------------------------------------------------------*
*& Form alv_set_status
*&---------------------------------------------------------------------*
* Inicializa el status
*----------------------------------------------------------------------*
* -->P_C_ESTRUCTURA_LISTADO text
*----------------------------------------------------------------------*
FORM alv_set_status USING p_estructura.

SET PF-STATUS d_alv_status EXCLUDING gt_okcodes_a_excluir.

ENDFORM. " alv_set_status

*&---------------------------------------------------------------------*
*& Form alv_show_report
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM alv_show_report TABLES p_output
USING p_struct LIKE c_struct
p_tipo.

* Define local data
DATA: v_repid LIKE sy-repid.
DATA l_form_cabecera LIKE c_form_cabecera.
v_repid = sy-repid.
x_structure = p_struct.

* Check that our selection retrieves any result
IF p_output[] IS INITIAL.
MESSAGE i038(001) WITH 'No se mostrara la tabla porque esta vacia'.
ELSE.

IF NOT p_struct IS INITIAL.
PERFORM alv_catalogo USING p_struct.
ENDIF.

IF NOT gt_layout-box_fieldname IS INITIAL.
DELETE gt_fieldcat WHERE fieldname = gt_layout-box_fieldname.
ENDIF.

IF NOT d_alv_status IS INITIAL
AND NOT gt_events[] IS INITIAL.
PERFORM alv_rellenar_eventos
USING
'PF_STATUS_SET'
c_pf_status_set.
ENDIF.

IF gt_list_top_of_page[] IS INITIAL.
CLEAR l_form_cabecera.
ELSE.
l_form_cabecera = c_form_cabecera.
ENDIF.

CASE p_tipo.
WHEN c_tipo_alv.
* Visualice the list with a standard function
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = v_repid
* i_callback_pf_status_set = d_alv_status
* i_callback_user_command = c_user_command
i_callback_top_of_page = l_form_cabecera
* i_structure_name = x_structure
is_layout = gt_layout
i_save = c_a
it_events = gt_events
it_fieldcat = gt_fieldcat
TABLES
t_outtab = p_output.
WHEN c_tipo_list.
* Visualice the list with a standard function
CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
EXPORTING
i_callback_program = v_repid
* i_callback_pf_status_set = d_alv_status
* i_callback_user_command = c_user_command
* i_callback_top_of_page = l_form_cabecera
* i_structure_name = x_structure
is_layout = gt_layout
i_save = c_a
it_events = gt_events
it_fieldcat = gt_fieldcat
TABLES
t_outtab = p_output.
ENDCASE.

ENDIF.
ENDFORM. " alv_show_report


*---------------------------------------------------------------------*
* FORM ALV_ANIADIR_STATUS *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> P_STATUS *
*---------------------------------------------------------------------*
FORM alv_aniadir_status USING p_status.

d_alv_status = p_status.

ENDFORM.

*&---------------------------------------------------------------------*
*& Form alv_cabecera
*&---------------------------------------------------------------------*
* MUESTRA LA CABECERA
*----------------------------------------------------------------------*
FORM alv_cabecera.
IF NOT gt_list_top_of_page IS INITIAL
OR NOT d_logo IS INITIAL.
CALL FUNCTION 'REUSE_ALV_COMMENTARY_WRITE'
EXPORTING
it_list_commentary = gt_list_top_of_page
i_logo = d_logo
i_end_of_list_grid = ''.
ENDIF.
ENDFORM. " alv_cabecera

*&---------------------------------------------------------------------*
*& Form alv_rellenar_eventos
*&---------------------------------------------------------------------*
* ASIGNA UN FORM A UN EVENTO A EJECUTAR
*----------------------------------------------------------------------*
* --> NOMBRE DEL EVENTO
* --> NOMBRE DEL FORM PARA DICHO EVENTO
*----------------------------------------------------------------------*
FORM alv_rellenar_eventos USING p_nombre_evento
p_form_para_evento.

DATA: ls_event TYPE slis_alv_event.

* Rutina que controlará el status GUI
READ TABLE gt_events WITH KEY name = p_nombre_evento
INTO ls_event.
IF sy-subrc = 0.
MOVE p_form_para_evento TO ls_event-form.
MODIFY gt_events FROM ls_event TRANSPORTING form
WHERE name = p_nombre_evento.
ELSE.
MESSAGE e000(01) WITH 'Error en el form alv_rellenar_eventos.'
'No existe el evento'
p_nombre_evento
'.'.
ENDIF.

ENDFORM. " rellenar_eventos

*&---------------------------------------------------------------------*
*& Form ALV_RELLENAR_CABECERA
*&---------------------------------------------------------------------*
* Rellena una linea de la cabecera
*----------------------------------------------------------------------*
* -->P_GT_LIST_TOP_OF_PAGE text
*----------------------------------------------------------------------*
FORM alv_rellenar_cabecera USING p_texto_negrita
p_texto_normal
p_tipo.

DATA: ls_line TYPE slis_listheader.

CLEAR:ls_line.

ls_line-key = p_texto_negrita.
ls_line-typ = p_tipo.
ls_line-info = p_texto_normal.

APPEND ls_line TO gt_list_top_of_page.

ENDFORM. " ALV_RELLENAR_CABECERA


*---------------------------------------------------------------------*
* FORM alv_asignar_logo *
*---------------------------------------------------------------------*
* Rellena el logo que queremos que se muestre por pantalla *
*---------------------------------------------------------------------*
* --> P_LOGO Logo a cargar *
*---------------------------------------------------------------------*
FORM alv_asignar_logo USING p_logo.

d_logo = p_logo.

ENDFORM. " alv_asignar_logo

*&---------------------------------------------------------------------*
*& Form alv_events
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM alv_events.

DATA: le_event TYPE slis_alv_event.
REFRESH gt_events.
CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
EXPORTING
i_list_type = 0
IMPORTING
et_events = gt_events.

ENDFORM. " alv_alv_events

ChaloZ
31/03/06, 21:28:35
Gracias por los includes, pero nuevamente hay problemas de sintaxis:

Program ZRCHKSPRO 248
Field "ICON_TREE" is unknown. It is neither in one of the specified
tables nor defined by a "DATA" statement . . . . . . . . . .

Saludos

tracer
01/04/06, 10:19:27
Vaya perdona, parece que falla más que una escopeta de feria :D , voy a cargarlo de nuevo en sap y te digo.

Saludos a todo el foro sap :)

aduro
01/04/06, 15:39:20
Hola GENTE!
por las dudas ... me permito recordarles que supuestamente este desarrollo esta testeado en SAP 5
Yo lo estuve probando (no a fondo todavia) en un SAP 4.6 y tuve problemas tambien ... pero tal vez sea por un tema de versiones ...
Saludos!

Vaya perdona, parece que falla más que una escopeta de feria :D , voy a cargarlo de nuevo en sap y te digo.

Saludos a todo el foro sap :)

ChaloZ
04/04/06, 18:54:27
Estoy utilizando la versión 5. ¿No faltará algún include?

Saludos

Toko
07/06/06, 19:11:33
Hola a todos..
Alguien logro que el programa funcionara... Estuve tratando pero me salen muchos errores, :eek: y necesito hacer una comparion de mandantes, habra alguna Tx o funcion que me ayude ????? :confused:

gracias.
atte
Toko

i_arnaiz
19/09/06, 14:35:18
Hola a todos,

Soy quien ha desarrollado el programita, para instalarlo teneis que crear todo según indica la dirección: http://sap4.com/wiki/index.php?title=ZRCHKSPRO

Los unicos includes que necesitais son estos:

INCLUDE ZIALV. <- http://sap4.com/wiki/index.php?title=ZIALV
INCLUDE ZICONTADOR. <- http://sap4.com/wiki/index.php?title=ZICONTADOR

Yo lo he probado en la versión 5.0 y aseguro que subiendo esto funciona perfectamente, además si quereis podeis consultarme cualquier cosa en i_arnaiz@sanesteban.com

La verdad es que me ha molestado un poquito lo de que falla más que una escopeta de feria, pero bueno... son cosas de internes...

Un saludo.

Nacho

asuarez
19/09/06, 15:35:42
Hola a todos, para comparar programas entre mandantes puedes usar la transacción SE39, por la SM30 puedes comparar los contenidos de las tablas de la siguiente forma:

SM30:

-Seleccionas la tabla
-Presionas visualizar
-En la barra de tareas seleccionas "Utilidades"
-Ahora seleccionas "Comparación"

Se abrira una ventana donde vas a seleccionar el mandante contra el cual puedes comparar.