Template de Programa Read Table
Read Table o Loop For all entries Inner Join o Left Join
Read Table o Loop
Usamos el read table para leer la segunda table, cuando estamos seguros que para cada codigo leido en la primer table existe solo y solo un registro, ya que el read table toma solo el primer registro que aplique a la clave y sale.
Cuando sabemos que la segunda tabla no tiene claves repetidas podemos usar el
READ TABLE
de la siguiente manera.*Types de Datos
TYPES: BEGIN OF ty_tickets, ticket LIKE ztickets-ticket, usuario LIKE ztickets-usuario,
cod_cliente LIKE ztickets-cod_cliente, END OF ty_tickets.
TYPES: BEGIN OF ty_clientes,
cod_cliente LIKE zclientes-cod_cliente, nombre LIKE zclientes-nombre,
END OF ty_clientes.
*Tablas internas y Workareas
DATA: it_tk TYPE TABLE OF ty_tickets, wa_tk TYPE ty_tickets.
DATA: it_cli TYPE TABLE OF ty_clientes, wa_cli TYPE ty_clientes.
*Consultas a las tablas por separado SELECT ticket usuario cod_cliente FROM ztickets
INTO TABLE it_tk.
INTO TABLE it_cli.
*Recorro la primer tabla dentro del area de trabajo (Word Area) LOOP AT it_tk INTO wa_tk.
* Leo la segunda tabla donde el cod_cliente coincida con el que tengo en la WA_tk
READ TABLE it_cli INTO wa_cli
WITH KEY cod_cliente = wa_tk.
* Si encontro datos, imprimir en pantalla
IF sy-subrc = 0.
WRITE: / wa_tk-ticket,
wa_cli-cod_cliente, wa_cli-nombre. ENDIF.
ENDLOOP.
Sino tenemos que hacerlo con un
Loop anidado
, con esto nos garantizamos que el programa contemple todos los registros que coincidan con la clave.*Recorro la primer tabla dentro del area de trabajo (Word Area) LOOP AT it_tk INTO wa_tk.
* Recorro la segunda tabla donde el cod_cliente coincida con el que tengo en la WA_tk
LOOP AT it_cli INTO wa_cli
WHERE cod_cliente = wa_tk.
* Imprimir en pantalla
WRITE: / wa_tk-ticket,
wa_cli-cod_cliente, wa_cli-nombre. ENDLOOP.
For all entries
Siguiendo en caso anterior, hacemos dos select el de la tabla ZTICKET y el de la tabla ZCLIENTES.
Pero si tuviéramos el caso de que en la tabla tickets tengo solo dos registros, y en la de Clientes tenemos 100.
Porque vamos a seleccionar esos 100 clientes si solo vamos a usar 2 cuando recorremos la tabla de tickets.
Entonces vamos a hacer el select de la tabla cliente SOLO PARA LAS ENTRADAS o REGISTROS seleccionados en la tabla it_tk indicándole los campos que comparten.
*Consultas a las tablas por separado SELECT ticket usuario cod_cliente FROM ztickets
INTO TABLE it_tk.
SELECT cod_cliente nombre FROM zclientes
FOR ALL ENTRIES IN it_tk
WHERE cod_cliente = it_tk-cod_cliente.
Inner Join y Left join
El Inner Join sirve para obtener dentro de una misma tabla interna datos de dos tablas haciendo solo un Select.
Para replicar el caso anterior vamos a hacer una tabla interna que contenga los campos de ZTICKETS y ZCLIENTES
*Types de Datos
TYPES: BEGIN OF ty_tkn,
ticket LIKE ztickets-ticket, usuario LIKE ztickets-usuario,
nombre LIKE zclientes-nombre, END OF ty_tkn.
*Tablas internas y Workareas
DATA: it_tkn TYPE TABLE OF ty_tkn, wa_tkn TYPE ty_tkn.
Entonces procedemos a realizar la consulta paso a paso:
1 – campos a consultar
Select tickets usuario cod_cliente nombre
2 – tablas a consultar
Select tickets usuario cod_cliente nombre
from ztickets zclientes
3 – Juntamos las tablas, indicamos los alias e indicamos de que tabla consultar cada campo
Select t~tickets t~usuario t~cod_cliente c~nombre from ztickets as t
inner join zclientes as c
4 – Relacionamos las tablas a unir
Select t~tickets t~usuario t~cod_cliente c~nombre from ztickets as t
inner join zclientes as c
on t~cod_cliente = c~cod_cliente
5 – agregamos la table donde nos va a dejar los datos
Select t~tickets t~usuario t~cod_cliente c~nombre
into table it_tkn
from ztickets as t inner join zclientes as c
6 – Por ultimo si tuvieramos parametros de selection podriamos agregar los where que quisieramos
Entonces luego de tener el Select nos queda hacer el Loop normal
LOOP AT it_tkn INTO wa_tkn.
* Imprimir en pantalla
WRITE: / wa_tkn-ticket, wa_tkn-usuario, wa_tkn-cod_cliente, wa_tkn-nombre. ENDLOOP.
Template terminado:
*Types de Datos
TYPES: BEGIN OF ty_tkn,
ticket LIKE ztickets-ticket, usuario LIKE ztickets-usuario,
cod_cliente LIKE ztickets-cod_cliente, nombre LIKE zclientes-nombre,
END OF ty_tkn.
*Tablas internas y Workareas
DATA: it_tkn TYPE TABLE OF ty_tkn, wa_tkn TYPE ty_tkn.
Select t~tickets t~usuario t~cod_cliente c~nombre into table it_tkn
from ztickets as t inner join zclientes as c
on t~cod_cliente = c~cod_cliente.
LOOP AT it_tkn INTO wa_tkn.
* Imprimir en pantalla
ENDLOOP.
Hay que tener en cuenta que el inner join solo devuelve los valores que estén en las dos tablas, si por ejemplo tenemos un registro de la tabla tickets con un cod?cliente que no existe en la tabla cliente ese registro no lo va a traer.
En el caso de que lo quisiéramos tendríamos que usar: