Select complicado con like

Esta es la Primera vez que realizo una pregunta aquí, espero que me se seáis de ayuda ya que no se como hacer-lo.
Tengo una base de datos de este estilo:
Factura Articulo Linea Cliente Descripción
   1 23 1 565 Albaran N º 233
   1 24 2 565 cuadre 25 x 25
   2 21 1 700 Albaran N º 445
Es un programa que ponen el numero de albarán, entro en la base de datos de Facturas y a partir de Ahí he de rehacer el Albarán, el problema que tengo es que solo me devuelve un registro. Y me gustaría que devolviera todas las lineas de la factura.
En fin me gustaría un select del estilo: " Seleccioname la factura que en la Descripción contenga el Numero de albarán Indicado Hasta que encuentre Otra descripción que Contenga Albarán Nº.
Aquí os dejo el Select que tengo, pero os repito que solo me saca una Linea.
strAlbaran =" Albaran Nº 233"
SELECT Facturas_Cabecera.Factura, Facturas_Cabecera.Cliente, Facturas_Detalle.Descripcion, Facturas_Detalle.Line, Facturas_Detalle.Articulo
FROM Facturas_Cabecera INNER JOIN Facturas_Detalle ON Facturas_Cabecera.Factura = Facturas_Detalle.Factura
WHERE Facturas_Detalle.Descripcion LIKE '%" & strAlbaran & "%'"
El Select lo Lanzo desde Visual Basic
OS agradeceria mUCHO UNA solucion ya que llevo dias dandole vueltas.

1 Respuesta

Respuesta
1
Bien, te está devolviendo una sola fila porque estás pidiendo las filas que cumplan con el Join y que además cumplan con Facturas_Detalle. Descripción LIKE '%" & strAlbaran & "%'", a esto último lo cumple una sola fila.
Lo que puedes hacer es un select anidado y esplazas ese LIKE dentro de un subselect que devuelva el código de la factura, para luego mostrar todas las filas de la factura. Quedaría algo así:
SELECT Facturas_Cabecera.Factura, Facturas_Cabecera.Cliente, Facturas_Detalle.Descripcion, Facturas_Detalle.Line, Facturas_Detalle.Articulo
FROM Facturas_Cabecera INNER JOIN Facturas_Detalle ON Facturas_Cabecera.Factura = Facturas_Detalle.Factura
WHERE facturas_cabecera.factura in
(select factura
from factura_detalle
where Descripcion LIKE '%" & strAlbaran & "%'" )
Fíjate si algo así anda, sino me avisás.
He estado probando y me da error de SQL.
Haber si me puedes dejar más claro el SELECT en la parte del IN
No se si estoy resolviendo bien tu consulta, porque la verdad que el join con notación estándar me pierde siempre.
Si te parece puedes cambiar la notación estándar por una más sencilla que es igual al inner join y queda más legible, y ademas si agregas alias a las tablas el código queda más compacto:
SELECT FC.Factura, FC.Cliente, F_Det.Descripcion, F_Det.Line, F_D.Articulo
FROM Facturas_Cabecera FC,Facturas_Detalle F_Det
WHERE FC.Factura = FDet.Factura
Esto es similar al INNer JOIN que tenías, pero hasta acá solo estoy mostrando todas las facturas con sus respectivos detalles (es igual a lo que escribiste vos perosin el LIKE), bien resta ponerle un filtro para que sólo se muestre las que tienen un determinado Albarán en el detalle.
------ Podría pensar en ponerle una condición más al Where (Descripción LIKE '%" & strAlbaran & "%'"), pero eso lo que va a hacer es dejar afuera filas de datos de la factura donde la descripción no tenga el Albarán que busco (es lo que pasaba con tu consulta)
-- La solución es una subconsulta:
SELECT FC.Factura, FC.Cliente, F_Det.Descripcion, F_Det.Line, F_D.Articulo
FROM Facturas_Cabecera FC,Facturas_Detalle F_Det
WHERE FC.Factura = FDet.Factura
AND FC.Factura in
(SELECT F_Det2.factura
FROM Facturas_detalle F_Det2
WHERE Descripcion LIKE '%" & strAlbaran & "%'" )
La parte de adentro genera una lista de todos los nros de factura que tienen la información de albarán buscada y la parte de afuera muestra la información de las facturas que aparecen en la lista (es decir las que tienen esa descripción).
La parte de afuera es igual (con otra notación) a lo que vos hiciste y lo que cambia es la condición del where con el LIKE, que ya no se aplica directamente a las filas de resultado, sino que se usa indirectamente para armar un alista de las facturas que cumplen (facturas y no filas detalles que cumplen).
Buenas Al final lo he solucionado de la SIguiente manera
"SELECT Factura, Linea FROM Facturas_Detalle WHERE Descripcion LIKE '%" & "Albaran Nº " & Trim(strAlbaran) & "%'"
Con este select cojo el numero de factura que contiene el numero de albarán que indica el usuario i me lo guardo en una variable.
Y con este select recojo todas las lineas de dicha factura.
"SELECT Facturas_Cabecera.Nombre AS Nombre, Facturas_Detalle.Factura AS FFACTURA, Facturas_Detalle.Cantidad AS Cantidad, Facturas_Detalle.Precio AS Precio, Facturas_Detalle.Descripcion AS FDescripcion ,Facturas_Detalle.Linea AS Linea, Facturas_Detalle.Articulo AS Articulo, Facturas_Cabecera.Cliente AS Cliente " & _
"FROM Facturas_Detalle INNER JOIN Facturas_Cabecera ON Facturas_Detalle.Factura = Facturas_Cabecera.Factura " & _
"WHERE Facturas_Detalle.Factura = '" & Trim(strFactura) & "' ORDER BY CAST(Linea AS int)"
Gracias por la Ayuda

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas