Buenas,
Llevaba un par de años sin tener que hacer table controls y modulpools y ahora estoy liado con uno pero no me acuerdo de casi nada. Además, por la versión, se ha diseñar con el editor alfanumérico y yo estaba acostumbrado a la maravilla del gráfico y su wizard.
El tema, dejándome de dar vueltas, es que teniendo el table control definido y mostrando los datos que quiero, cuando intento hacer scroll (ya sea con las barras propias o los botones) el programa no hace nada, ejecuta el PAI y vuelve directamente a la pantalla inicial de SAP.
Adjunto el código aunque aviso que seguramente sea lioso ya que llevo un par de dias mirando por internet y he copiado trozos de diversos foros donde he visto que daban soluciones, pero a mí aún me falla. Intuyo que es por el maldito PAI pero la verdad no sé que tendría que poner en el loop.
--------DYNPRO-------
PROCESS BEFORE OUTPUT.
MODULE status_0200.
MODULE data_retrieval.
LOOP AT it_znorma57
INTO wa_znorma57
WITH CONTROL it_tcontrol
CURSOR it_tcontrol-current_line.
MODULE populate_screen.
MODULE lines.
ENDLOOP.
*
*
*
PROCESS AFTER INPUT.
MODULE exit_0200 AT EXIT-COMMAND.
LOOP AT it_znorma57.
MODULE user_command_0200.
ENDLOOP.
---------- PBO -----------------
*----------------------------------------------------------------------*
* INCLUDE ZNORMA57_PBO *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'ZINICIO_N57'.
SET TITLEBAR 'ZIN57'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
SET PF-STATUS 'ZNORMA57'.
SET TITLEBAR 'ZN57'.
ENDMODULE. " STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*& Module DATA_RETRIEVAL OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE data_retrieval OUTPUT.
* Se seleccionan los datos según los parámetros de la pantalla inicial.
SELECT opbel gpart vkont budat bldat blart betrh
FROM dfkkop
INTO CORRESPONDING FIELDS OF TABLE it_znorma57
WHERE opbel IN s_opbel
AND gpart IN s_gpart
AND vkont IN s_vkont
AND budat IN s_budat
AND bldat IN s_bldat
AND faedn IN s_faedn
AND blart IN s_blart.
DESCRIBE TABLE it_znorma57 LINES v_lineas.
it_tcontrol-lines = v_lineas.
ENDMODULE. " DATA_RETRIEVAL OUTPUT
*&---------------------------------------------------------------------*
*& Module POPULATE_SCREEN OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE populate_screen OUTPUT.
DATA: ld_line TYPE i.
* Set which line of table is a top of displayes table control.
IF sy-stepl = 1.
it_tcontrol-lines = it_tcontrol-top_line + sy-loopc - 1.
ENDIF.
* move fields from work area to screen fields.
MOVE-CORRESPONDING wa_znorma57 TO znorma57.
ENDMODULE. " POPULATE_SCREEN OUTPUT
*&---------------------------------------------------------------------*
*& Module LINES OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE lines OUTPUT.
step_lines = sy-loopc.
ENDMODULE. " LINES OUTPUT
--------- PAI --------------
*----------------------------------------------------------------------*
* INCLUDE ZNORMA57_PAI *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE PROGRAM.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'EJECUTAR'.
SET SCREEN 0200.
LEAVE SCREEN.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code.
WHEN 'BACK'.
CLEAR: it_znorma57.
REFRESH: it_znorma57.
PERFORM limpiar_datos_seleccion.
LEAVE TO SCREEN 0100.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'PG+'. "Avanzar página
offset = it_tcontrol-lines - step_lines.
IF it_tcontrol-top_line LT offset.
it_tcontrol-top_line = it_tcontrol-top_line + step_lines.
ENDIF.
WHEN 'PG-'. "Retroceder página
offset = step_lines.
IF it_tcontrol-top_line GT offset.
it_tcontrol-top_line = it_tcontrol-top_line - step_lines.
ELSE.
it_tcontrol-top_line = 1.
ENDIF.
WHEN 'PG++'. " last page
it_tcontrol-top_line = it_tcontrol-lines - step_lines + 1.
WHEN 'PG--'. " first page
it_tcontrol-top_line = 1.
ENDCASE.
ENDMODULE. " USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
*& Module EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE exit_0100 INPUT.
LEAVE PROGRAM.
ENDMODULE. " EXIT INPUT
*&---------------------------------------------------------------------*
*& Module EXIT_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE exit_0200 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code.
WHEN 'BACK'.
CLEAR: it_znorma57.
REFRESH: it_znorma57.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " EXIT_0200 INPUT
Muchas gracias por vuestra ayuda!
Llevaba un par de años sin tener que hacer table controls y modulpools y ahora estoy liado con uno pero no me acuerdo de casi nada. Además, por la versión, se ha diseñar con el editor alfanumérico y yo estaba acostumbrado a la maravilla del gráfico y su wizard.
El tema, dejándome de dar vueltas, es que teniendo el table control definido y mostrando los datos que quiero, cuando intento hacer scroll (ya sea con las barras propias o los botones) el programa no hace nada, ejecuta el PAI y vuelve directamente a la pantalla inicial de SAP.
Adjunto el código aunque aviso que seguramente sea lioso ya que llevo un par de dias mirando por internet y he copiado trozos de diversos foros donde he visto que daban soluciones, pero a mí aún me falla. Intuyo que es por el maldito PAI pero la verdad no sé que tendría que poner en el loop.
--------DYNPRO-------
PROCESS BEFORE OUTPUT.
MODULE status_0200.
MODULE data_retrieval.
LOOP AT it_znorma57
INTO wa_znorma57
WITH CONTROL it_tcontrol
CURSOR it_tcontrol-current_line.
MODULE populate_screen.
MODULE lines.
ENDLOOP.
*
*
*
PROCESS AFTER INPUT.
MODULE exit_0200 AT EXIT-COMMAND.
LOOP AT it_znorma57.
MODULE user_command_0200.
ENDLOOP.
---------- PBO -----------------
*----------------------------------------------------------------------*
* INCLUDE ZNORMA57_PBO *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'ZINICIO_N57'.
SET TITLEBAR 'ZIN57'.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE status_0200 OUTPUT.
SET PF-STATUS 'ZNORMA57'.
SET TITLEBAR 'ZN57'.
ENDMODULE. " STATUS_0200 OUTPUT
*&---------------------------------------------------------------------*
*& Module DATA_RETRIEVAL OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE data_retrieval OUTPUT.
* Se seleccionan los datos según los parámetros de la pantalla inicial.
SELECT opbel gpart vkont budat bldat blart betrh
FROM dfkkop
INTO CORRESPONDING FIELDS OF TABLE it_znorma57
WHERE opbel IN s_opbel
AND gpart IN s_gpart
AND vkont IN s_vkont
AND budat IN s_budat
AND bldat IN s_bldat
AND faedn IN s_faedn
AND blart IN s_blart.
DESCRIBE TABLE it_znorma57 LINES v_lineas.
it_tcontrol-lines = v_lineas.
ENDMODULE. " DATA_RETRIEVAL OUTPUT
*&---------------------------------------------------------------------*
*& Module POPULATE_SCREEN OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE populate_screen OUTPUT.
DATA: ld_line TYPE i.
* Set which line of table is a top of displayes table control.
IF sy-stepl = 1.
it_tcontrol-lines = it_tcontrol-top_line + sy-loopc - 1.
ENDIF.
* move fields from work area to screen fields.
MOVE-CORRESPONDING wa_znorma57 TO znorma57.
ENDMODULE. " POPULATE_SCREEN OUTPUT
*&---------------------------------------------------------------------*
*& Module LINES OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE lines OUTPUT.
step_lines = sy-loopc.
ENDMODULE. " LINES OUTPUT
--------- PAI --------------
*----------------------------------------------------------------------*
* INCLUDE ZNORMA57_PAI *
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE sy-ucomm.
WHEN 'BACK'.
LEAVE PROGRAM.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'EJECUTAR'.
SET SCREEN 0200.
LEAVE SCREEN.
ENDCASE.
ENDMODULE. " USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE user_command_0200 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code.
WHEN 'BACK'.
CLEAR: it_znorma57.
REFRESH: it_znorma57.
PERFORM limpiar_datos_seleccion.
LEAVE TO SCREEN 0100.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
LEAVE PROGRAM.
WHEN 'PG+'. "Avanzar página
offset = it_tcontrol-lines - step_lines.
IF it_tcontrol-top_line LT offset.
it_tcontrol-top_line = it_tcontrol-top_line + step_lines.
ENDIF.
WHEN 'PG-'. "Retroceder página
offset = step_lines.
IF it_tcontrol-top_line GT offset.
it_tcontrol-top_line = it_tcontrol-top_line - step_lines.
ELSE.
it_tcontrol-top_line = 1.
ENDIF.
WHEN 'PG++'. " last page
it_tcontrol-top_line = it_tcontrol-lines - step_lines + 1.
WHEN 'PG--'. " first page
it_tcontrol-top_line = 1.
ENDCASE.
ENDMODULE. " USER_COMMAND_0200 INPUT
*&---------------------------------------------------------------------*
*& Module EXIT INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE exit_0100 INPUT.
LEAVE PROGRAM.
ENDMODULE. " EXIT INPUT
*&---------------------------------------------------------------------*
*& Module EXIT_0200 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE exit_0200 INPUT.
save_code = ok_code.
CLEAR ok_code.
CASE save_code.
WHEN 'BACK'.
CLEAR: it_znorma57.
REFRESH: it_znorma57.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
LEAVE PROGRAM.
ENDCASE.
ENDMODULE. " EXIT_0200 INPUT
Muchas gracias por vuestra ayuda!

Comentario