mjpedreira1
17th July 2006, 14:30
Hola necesito listar las direcciones de entrega para cada entrega de venta.
Tengo que hacer un left join entre la tabla tdsls045 (entregas de venta) y la tdsls042 (direcciones). El problema es que el índice de la tabla de direcciones tiene 3 campos, ¿cómo puedo conseguir que me liste el registro :
orden_venta-0-0
para cada orden de venta?
Si escribo lo siguiente, me devuelve tantas líneas como direcciones haya en la tabla tdsls042.
"LEFT JOIN baan.ttdsls042900 D ON R.t$orno=D.t$orno"
No puedo utilizar el estándar de Baan (refers...) porque estoy consultado la base de datos desde C#
Muchas gracias
solepeder
19th July 2006, 23:08
Hola,
el objetivo de la consulta es tener para cada posición de número de orden la dirección correspondiente o en la cláusula WHERE está puesto que muestre la primera posición unicamente?
Porque por la estructura de las tablas, debería aparecer una vez cada dirección por cada posición de la orden.
Podrías poner el select completo?
Gracias!:o
bilmaa
21st July 2006, 11:00
Esta si tienes direcciones de entrega por línea
select a.*, b.*
from baandb.ttdsls045 a,
baandb.ttdsls042 b
where a.t$orno = b.t$orno
and a.t$pono = b.t$pono
and b.t$ckor = 0
Esta para las direcciones de entrega que no están por línea
select a.*, b.*
from baandb.ttdsls045 a,
baandb.ttdsls042 b
where a.t$orno = b.t$orno
and a.t$pono = 0
and b.t$ckor = 0
Y cuidado con el campo b.t$ckor ya que puede ser 0 ó 1 dependiendo de si es dirección de entrega o dirección postal.
mjpedreira1
24th July 2006, 15:35
No entiendo por qué escribes en la segunda consulta (que es la que me interesa)
and a.t$pono = 0
El campo línea de la tabla tdsls042, o sea la llamada a, nunca vale 0. Así la consulta no devolverá nada ¿?
mjpedreira1
24th July 2006, 15:47
La consulta tampoco vale, creo, porque al poner la condición
where a.t$orno = b.t$orno
se obliga a que la orden de la tabla a exista en la tabla b, y ese es el problema que planteo en el primer post.
Necesito listar todas las órdenes y sus direcciones en caso de que las tengan. Si no tienen direcciones ese campo debe aparecer en blanco.
solepeder
25th July 2006, 16:41
Creo que deberías probar con este select:
select a.*, b.*
from baandb.ttdsls045 a
left join baandb.ttdsls042 b
on a.t$orno = b.t$orno
and a.t$pono = b.t$pono
where b.t$pono = 0
and b.t$ckor = 0
debería traerte todas las filas de 045 y las que cumplan la condición en 042 (de 042 va a traer solo 1 por fila de la 045 por tener pono = 0)
Espero que funcione.
Soledad:p
bilmaa
25th July 2006, 17:17
pues creo que no es un error, y me explico:
Si tienes direcciones de entrega por línea debes utilizar la primera select y si la dirección de entrega es a nivel de cabecera, debes utilizar la segunda.
Espero que esto sea mas aclaratorio.
Un saludo
Oscar
mjpedreira1
26th July 2006, 10:05
Os escribo mi select:
SELECT R.t$orno AS Orden , R.t$pono AS Linea, R.t$srnb AS Secuencia,
R.t$oqua AS \"Q pedida\", R.t$dqua AS \"Q entregada\", R.t$bqua AS \"Q retroorden\",
R.t$dino AS ClaveII, C.t$cuno AS Referencia, CL.t$nama AS DescRef, R.t$item AS Item,
D.t$namc || ' ' || D.t$namd || ' ' || D.t$name || ' ' || D.t$pstc || ' (' || D.t$namf || ') ' AS ClaveI,
C.t$odat AS Fecha, A.t$dsca AS DescArtic
FROM baan.ttdsls045900 R
INNER JOIN baan.ttccom010900 CL ON R.t$cuno=CL.t$cuno
INNER JOIN baan.ttdsls040900 C ON R.t$orno=C.t$orno
INNER JOIN baan.ttiitm001900 A ON R.t$item=A.t$item
LEFT JOIN baan.ttdsls042900 D ON R.t$orno=D.t$orno
WHERE R.t$orno BETWEEN 0 AND 999999
AND D.t$pono = 0
AND D.t$ckor = 0
AND (R.t$ssls = 3 OR R.t$ssls = 4)
AND C.t$odat BETWEEN '2006-7-26' AND '2006-7-26'
Si ejecuto esta select sólo me devuelve las órdenes que tienen dirección de entrega (a mi me interesa que me devuelva todas las entregas, aunque no estén dadas de alta las órdenes en la tabla de direcciones tdsls042). Si comento las dos condiciones de después del WHERE, pono y ckor a cero, me devuelve todo pero lógicamente, si una orden tiene dirección de entrega y otra dirección de envío, me devuelve los dos registros.
El problema es que no sé hacer un left join a una tabla con un índice con varios campos... con el refers del sql de baan sería sencillo, pero en sql estándar no sé...
Perdonad la insistencia y muchas gracias por las ayudas.
bilmaa
26th July 2006, 16:42
Yo no te puedo ayudar para hacerlo en informix, en oracle sería tan sencillo como utilizar el operador (+) pero se me ocurre una solución alternativa:
Tira la select que te interesa desde una sesión de baan utilizando el refers, y captura la select enviada desde el driver de baan a informix y ya está. ahí tendras la sintaxis correcta del left join.
Un saludo.
mjpedreira1
27th July 2006, 10:06
Hola Bilmaa,
uso Oracle desde hace un par de meses, cómo tendría que hacerlo en Oracle??
Gracias
solepeder
29th July 2006, 18:31
"El problema es que no sé hacer un left join a una tabla con un índice con varios campos... con el refers del sql de baan sería sencillo, pero en sql estándar no sé..."
Puedes poner más de una columna en el left join....
select a.*, b.*
from baandb.ttdsls045 a
left join baandb.ttdsls042 b on a.t$orno = b.t$orno and a.t$pono = b.t$pono
where b.t$pono = 0
and b.t$ckor = 0
y el el where filtras que pono = 0 y ckor = 0
Tu select quedaría así:
SELECT R.t$orno AS Orden , R.t$pono AS Linea, R.t$srnb AS Secuencia,
R.t$oqua AS \"Q pedida\", R.t$dqua AS \"Q entregada\", R.t$bqua AS \"Q retroorden\",
R.t$dino AS ClaveII, C.t$cuno AS Referencia, CL.t$nama AS DescRef, R.t$item AS Item,
D.t$namc || ' ' || D.t$namd || ' ' || D.t$name || ' ' || D.t$pstc || ' (' || D.t$namf || ') ' AS ClaveI,
C.t$odat AS Fecha, A.t$dsca AS DescArtic
FROM baan.ttdsls045900 R
INNER JOIN baan.ttccom010900 CL ON R.t$cuno=CL.t$cuno
INNER JOIN baan.ttdsls040900 C ON R.t$orno=C.t$orno
INNER JOIN baan.ttiitm001900 A ON R.t$item=A.t$item
LEFT JOIN baan.ttdsls042900 D ON R.t$orno=D.t$orno
and R.t$pono = D.t$pono
WHERE R.t$orno BETWEEN 0 AND 999999
AND D.t$pono = 0
AND D.t$ckor = 0
AND (R.t$ssls = 3 OR R.t$ssls = 4)
AND C.t$odat BETWEEN '2006-7-26' AND '2006-7-26'
En oracle puedes poner más de una condición en left join...;)