PDA

Ver la Versión Completa : ¿Cómo pasar una tabla en un perform? Me da error


Bego86
09/10/08, 11:32:06
Mi form es el siguiente

PERFORM p_actualizar_clase using d_clase tabla.

FORM p_actualizar_clase using d_clase tabla.
.......
.......
ENDFORM.

El error que me da es el siguiente:
"TABLA" is neither specified under "TABLES"nor defined as an internal table.

La tabla esta declarada vale?
Supongo que falta algo al pasar la tabla pero no lo se.

Espero que podais ayudarme.
Gracias :)

goyleo
09/10/08, 12:03:36
Este tipo de declaracion utilizo para pasar tablas por parametros espero te sirva. :)


TYPES: BEGIN OF ty_equnr,
equnr TYPE equi-equnr,
END OF ty_equnr.

TYPES: tty_equnr TYPE STANDARD TABLE OF ty_equnr.

DATA gt_equnr TYPE tty_equnr.

PERFORM obtener_equipos USING gt_equnr[]

FORM obtener_equipos USING p_gt_equnr TYPE tty_equnr.
....
....
ENDFORM.

acha3318
09/10/08, 14:44:45
Saludos BEGO86,

Bueno primero que todo los llamados a subrutinas "PERFORM" tienen 3 formas para ser usados por el programador de acuerdo a sus necesidades y son:

1- TABLES
2- USING
3- CHANGING

TABLES: Cuando invocas el parametro TABLES le estas diciendo al PERFORM que en ese parametro vas a enviar o pasar una estructura o tabla interna o la vas a recibir ENTRADA/SALIDA.

USING: Cuando invocas el parametro USING, le vas a decir al PERFORM que vas a pasar parametros, para ser tratados dentro del FORM.

CHANGING: Cuando usas este parametro le vas a decir a PERFORM, que de acuerdo a los datos que le has pasado a traves de TABLES y USING vas a realizar un proceso y el resultado de ese proceso lo vas a devolver en los parametros que tu coloques en la sentencia "CHANGING", te aclaro que si tu resultado es la salida de otra tabla interna lo puedes hacer en la definición de TABLES.

Para no alargarme te mando una muestra de ejemplo:

1- En el TOP declaro mi tabla interna
DATA: BEGIN OF it_zproce OCCURS 0.
INCLUDE STRUCTURE zproce.
DATA: END OF it_zproce.


* Hago un llamado para Obtener el tipo de proceso,
la idea es que la tabla interna it_zproce, entra vacia y cuando
sale del PERFORM sale llena por que en el parametro USING tengo un
parametro "entrada" que es una estructura, y este contiene la llave
para hacer un select a la tabla de procesos.

Entonces:
TABLES it_zproce: Tabla interna que entra vacia y sale llena.
USING entrada: Es una estructura que contiene los datos para leer la tabla
zproce, y llenar la tabla interna it_zproce.
CHANGING codigo_error
texto_error
status_bloqueo
w_result:
Como puedes ver son parametros de retorno que me informan
como le fué al proceso dentro del FORM.

PERFORM obtener_tipo_proceso TABLES it_zproce
USING entrada
CHANGING codigo_error
texto_error
status_bloqueo
w_result.

Asi debe quedar el form por dentro:

FORM obtener_tipo_proceso TABLES p_it_zproce STRUCTURE it_zproce
USING p_entrada LIKE zparam_mf
CHANGING p_codigo_error
p_texto_error
p_status_bloqueo
p_result.

........ Codigo del proceso etc etc etc.
...
...
ENDFORM.

Espero haberte ayudado...

Suerte ACHA

DavidXD_XD
09/10/08, 15:33:31
Hola ... si quieres pasar una tabla en un perform pero que sea una tabla interna con campos que tu has creado en tu programa (mas del 80% d casos son ese) puedes hacerlo asi:

TYPES: BEGIN OF ty_itab,
camp1 TYPE i,
camp2 TYPE n,
camp3 TYPE c,
END OF ty_itab.

DATA: ti_itab TYPE TABLE OF ty_itab.

START-OF-SELECTION.

PERFORM get_data TABLES ti_itab.

FORM get_data TABLES pt_itab LIKE ti_itab[].
... logica
ENDFORM.

Espero te ayude, un saludo !!

Bmamba
09/10/08, 15:35:52
types: begin of ty_tabla
...
end of ty_tabla.

data: it_tabla type standard table of ty_tabla,
wa_tabla type ty_tabla.

....
perform chequeos tables it_tabla.
....
form chequeos tables pt_tabla structure wa_tabla.

Eso no falla.
Y ya luego si quieres añadir más parámetros con USING recuerda que TABLES va siempre antes.

Saludos

Bego86
09/10/08, 15:47:00
EEEyyy gracias a todossssss que de respuestassss.

GRACIASSSs :)