par
Cyrano » 30 août 2011, 18:19
Ben tu y étais presque.
Observe bien, les lignes qui doivent être retournées sont donc celles dont le solde vaut 0 ET celles dont le solde vaut 1 si la date de paiement est supérieure au 31/07/2011. Donc il faut que ça corresponde «
obligatoirement à une des deux conditions » : donc on va mettre ces conditions dans un AND mais séparer les deux possibilités avec un OR et utiliser des parenthèses pour regrouper correctement les deux possibilités.
En résumé, ta requête doit donc être :
SELECT
CONVERT(VARCHAR,tcPresupuesto.FechaFactura,103) AS 'datefacture',
CONVERT( VARCHAR,tcPresupuestoComisreclam.Fecha,103) AS 'DATE',
tcComisReclam.Descrip AS 'ComisDescrip',
CONVERT(VARCHAR,tcPresupuestoComisreclam.FechaCobro,103) AS 'dregl',
'' AS 'soldé',
tgMarca.Descrip AS 'MarcaDescrip',
tgModelo.Descrip AS 'ModeloDescrip',
tcVeh.Chasis AS 'Chasis',
tcVeh.NumPedidoFab AS 'NumPedidoFab',
LTRIM(RTRIM(tgcliente.Nombre)) +
' '+
LTRIM(RTRIM(tgcliente.Apellido1)) AS ClientFacture,
tcPresupuestoComisreclam.Importe AS Importe,
'' AS montant,
REPLACE(
LTRIM(
RTRIM(
REPLACE(
REPLACE(
tcPresupuestoComisreclam.Obser,
CHAR(13),
' '
),
CHAR(10),
' '
)
)
),
',',
'.'
) AS Obser,
tgPtoVenta.descrip,
YEAR(tcPresupuestoComisreclam.Fecha) AS DateCommision
FROM tcPresupuestoComisreclam
LEFT OUTER JOIN tcPresupuesto ON tcPresupuestoComisreclam.Emp = tcPresupuesto.Emp
AND tcPresupuestoComisreclam.NumInterno = tcPresupuesto.NumInterno
INNER JOIN tgcliente ON tcPresupuesto.ClienteFac = tgcliente.codigo
LEFT OUTER JOIN tgProveedor ON tcPresupuestoComisreclam.Proveedor = tgProveedor.Codigo, tcVeh
LEFT OUTER JOIN tgPtoVenta ON tcVeh.Emp = tgPtoVenta.Emp
AND tcVeh.PuntoVenta = tgPtoVenta.PuntoVenta
LEFT OUTER JOIN tcColor ON tcVeh.Marca = tcColor.Marca
AND tcVeh.Color = tcColor.Color
LEFT OUTER JOIN tcTapiz ON tcVeh.Marca = tcTapiz.Marca
AND tcVeh.Tapiz = tcTapiz.Tapiz
LEFT OUTER JOIN tgCategoria ON tcVeh.Categoria = tgCategoria.Categoria, tcComisReclam, tgMarca, tgModelo, tgVersion
WHERE tcPresupuestoComisreclam.Emp = tcComisReclam.Emp
AND tcPresupuestoComisreclam.Comision = tcComisReclam.Comision
AND tcPresupuestoComisreclam.Emp = tcVeh.Emp
AND tcPresupuestoComisreclam.NumInternoVeh = tcVeh.NumInterno
AND tcVeh.Marca = tgMarca.Marca
AND tcVeh.Modelo = tgModelo.Modelo
AND tcVeh.Marca = tgModelo.Marca
AND tcVeh.Marca = tgVersion.Marca
AND tcVeh.Modelo = tgVersion.Modelo
AND tcVeh.Version = tgVersion.Version
AND tcPresupuestoComisreclam.Emp = '002'
AND tcVeh.EsVO = 0
AND FechaFactura <> ' '
AND Importe <> .00
AND tcPresupuestoComisreclam.Fecha BETWEEN '01-01-2007' AND '31-07-2011'
AND (
CobroFinalizado = '0'
OR(
CobroFinalizado = '1'
AND tcPresupuestoComisreclam.FechaCobro >'31-07-2011'
)
);
Normalement, ça doit fonctionner.
Un petit truc cependant : pour faciliter la lecture de tes requêtes, je te recommande vivement « d'aliaser » tes tables et surtout de mettre entre guillemets les alias de colonnes lorsque tu utilises un mot réservé comme Date par exemple, et en fait pour simplifier de mettre systématiquement des guillemets, ça simplifiera, ça va couper pas mal et permettre de faire des alignements qui rendent la lecture et la compréhension autrement plus appréciable. Ça donnerait ceci :
SELECT
CONVERT(VARCHAR,pp.FechaFactura,103) AS 'datefacture',
CONVERT(VARCHAR,pc.Fecha,103) AS 'DATE',
cr.Descrip AS 'ComisDescrip',
CONVERT(VARCHAR,pc.FechaCobro,103) AS 'dregl',
'' AS 'soldé',
mc.Descrip AS 'MarcaDescrip',
md.Descrip AS 'ModeloDescrip',
vh.Chasis AS 'Chasis',
vh.NumPedidoFab AS 'NumPedidoFab',
LTRIM(RTRIM(cl.Nombre)) +
' '+
LTRIM(RTRIM(cl.Apellido1)) AS 'ClientFacture',
pc.Importe AS 'Importe',
'' AS 'montant',
REPLACE(
LTRIM(
RTRIM(
REPLACE(
REPLACE(
pc.Obser,
CHAR(13),
' '
),
CHAR(10),
' '
)
)
),
',',
'.'
) AS 'Obser',
pv.descrip AS 'descrip',
YEAR(pc.Fecha) AS 'DateCommision'
FROM tcPresupuestoComisreclam AS pc
LEFT OUTER JOIN tcPresupuesto AS pp ON pc.Emp = pp.Emp
AND pc.NumInterno = pp.NumInterno
INNER JOIN tgcliente AS cl ON pp.ClienteFac = cl.codigo
LEFT OUTER JOIN tgProveedor AS pr ON pc.Proveedor = pr.Codigo,
tcVeh AS vh
LEFT OUTER JOIN tgPtoVenta AS pv ON vh.Emp = pv.Emp
AND vh.PuntoVenta = pv.PuntoVenta
LEFT OUTER JOIN tcColor AS co ON vh.Marca = co.Marca
AND vh.Color = co.Color
LEFT OUTER JOIN tcTapiz AS tz ON vh.Marca = tz.Marca
AND vh.Tapiz = tz.Tapiz
LEFT OUTER JOIN tgCategoria AS ct ON vh.Categoria = ct.Categoria,
tcComisReclam AS cr,
tgMarca AS mc,
tgModelo AS md,
tgVersion AS vn
WHERE pc.Emp = cr.Emp
AND pc.Comision = cr.Comision
AND pc.Emp = vh.Emp
AND pc.NumInternoVeh = vh.NumInterno
AND vh.Marca = mc.Marca
AND vh.Modelo = md.Modelo
AND vh.Marca = md.Marca
AND vh.Marca = vn.Marca
AND vh.Modelo = vn.Modelo
AND vh.Version = vn.Version
AND pc.Emp = '002'
AND vh.EsVO = 0
AND FechaFactura <> ' '
AND Importe <> .00
AND pc.Fecha BETWEEN '01-01-2007' AND '31-07-2011'
AND (
CobroFinalizado = '0'
OR(
CobroFinalizado = '1'
AND pc.FechaCobro > '31-07-2011'
)
);
Mieux non ?
Ben tu y étais presque.
Observe bien, les lignes qui doivent être retournées sont donc celles dont le solde vaut 0 ET celles dont le solde vaut 1 si la date de paiement est supérieure au 31/07/2011. Donc il faut que ça corresponde « [u]obligatoirement à une des deux conditions[/u] » : donc on va mettre ces conditions dans un AND mais séparer les deux possibilités avec un OR et utiliser des parenthèses pour regrouper correctement les deux possibilités.
En résumé, ta requête doit donc être :
[sql]SELECT
CONVERT(VARCHAR,tcPresupuesto.FechaFactura,103) AS 'datefacture',
CONVERT( VARCHAR,tcPresupuestoComisreclam.Fecha,103) AS 'DATE',
tcComisReclam.Descrip AS 'ComisDescrip',
CONVERT(VARCHAR,tcPresupuestoComisreclam.FechaCobro,103) AS 'dregl',
'' AS 'soldé',
tgMarca.Descrip AS 'MarcaDescrip',
tgModelo.Descrip AS 'ModeloDescrip',
tcVeh.Chasis AS 'Chasis',
tcVeh.NumPedidoFab AS 'NumPedidoFab',
LTRIM(RTRIM(tgcliente.Nombre)) +
' '+
LTRIM(RTRIM(tgcliente.Apellido1)) AS ClientFacture,
tcPresupuestoComisreclam.Importe AS Importe,
'' AS montant,
REPLACE(
LTRIM(
RTRIM(
REPLACE(
REPLACE(
tcPresupuestoComisreclam.Obser,
CHAR(13),
' '
),
CHAR(10),
' '
)
)
),
',',
'.'
) AS Obser,
tgPtoVenta.descrip,
YEAR(tcPresupuestoComisreclam.Fecha) AS DateCommision
FROM tcPresupuestoComisreclam
LEFT OUTER JOIN tcPresupuesto ON tcPresupuestoComisreclam.Emp = tcPresupuesto.Emp
AND tcPresupuestoComisreclam.NumInterno = tcPresupuesto.NumInterno
INNER JOIN tgcliente ON tcPresupuesto.ClienteFac = tgcliente.codigo
LEFT OUTER JOIN tgProveedor ON tcPresupuestoComisreclam.Proveedor = tgProveedor.Codigo, tcVeh
LEFT OUTER JOIN tgPtoVenta ON tcVeh.Emp = tgPtoVenta.Emp
AND tcVeh.PuntoVenta = tgPtoVenta.PuntoVenta
LEFT OUTER JOIN tcColor ON tcVeh.Marca = tcColor.Marca
AND tcVeh.Color = tcColor.Color
LEFT OUTER JOIN tcTapiz ON tcVeh.Marca = tcTapiz.Marca
AND tcVeh.Tapiz = tcTapiz.Tapiz
LEFT OUTER JOIN tgCategoria ON tcVeh.Categoria = tgCategoria.Categoria, tcComisReclam, tgMarca, tgModelo, tgVersion
WHERE tcPresupuestoComisreclam.Emp = tcComisReclam.Emp
AND tcPresupuestoComisreclam.Comision = tcComisReclam.Comision
AND tcPresupuestoComisreclam.Emp = tcVeh.Emp
AND tcPresupuestoComisreclam.NumInternoVeh = tcVeh.NumInterno
AND tcVeh.Marca = tgMarca.Marca
AND tcVeh.Modelo = tgModelo.Modelo
AND tcVeh.Marca = tgModelo.Marca
AND tcVeh.Marca = tgVersion.Marca
AND tcVeh.Modelo = tgVersion.Modelo
AND tcVeh.Version = tgVersion.Version
AND tcPresupuestoComisreclam.Emp = '002'
AND tcVeh.EsVO = 0
AND FechaFactura <> ' '
AND Importe <> .00
AND tcPresupuestoComisreclam.Fecha BETWEEN '01-01-2007' AND '31-07-2011'
AND (
CobroFinalizado = '0'
OR(
CobroFinalizado = '1'
AND tcPresupuestoComisreclam.FechaCobro >'31-07-2011'
)
);[/sql]
Normalement, ça doit fonctionner.
Un petit truc cependant : pour faciliter la lecture de tes requêtes, je te recommande vivement « d'aliaser » tes tables et surtout de mettre entre guillemets les alias de colonnes lorsque tu utilises un mot réservé comme Date par exemple, et en fait pour simplifier de mettre systématiquement des guillemets, ça simplifiera, ça va couper pas mal et permettre de faire des alignements qui rendent la lecture et la compréhension autrement plus appréciable. Ça donnerait ceci :
[sql]SELECT
CONVERT(VARCHAR,pp.FechaFactura,103) AS 'datefacture',
CONVERT(VARCHAR,pc.Fecha,103) AS 'DATE',
cr.Descrip AS 'ComisDescrip',
CONVERT(VARCHAR,pc.FechaCobro,103) AS 'dregl',
'' AS 'soldé',
mc.Descrip AS 'MarcaDescrip',
md.Descrip AS 'ModeloDescrip',
vh.Chasis AS 'Chasis',
vh.NumPedidoFab AS 'NumPedidoFab',
LTRIM(RTRIM(cl.Nombre)) +
' '+
LTRIM(RTRIM(cl.Apellido1)) AS 'ClientFacture',
pc.Importe AS 'Importe',
'' AS 'montant',
REPLACE(
LTRIM(
RTRIM(
REPLACE(
REPLACE(
pc.Obser,
CHAR(13),
' '
),
CHAR(10),
' '
)
)
),
',',
'.'
) AS 'Obser',
pv.descrip AS 'descrip',
YEAR(pc.Fecha) AS 'DateCommision'
FROM tcPresupuestoComisreclam AS pc
LEFT OUTER JOIN tcPresupuesto AS pp ON pc.Emp = pp.Emp
AND pc.NumInterno = pp.NumInterno
INNER JOIN tgcliente AS cl ON pp.ClienteFac = cl.codigo
LEFT OUTER JOIN tgProveedor AS pr ON pc.Proveedor = pr.Codigo,
tcVeh AS vh
LEFT OUTER JOIN tgPtoVenta AS pv ON vh.Emp = pv.Emp
AND vh.PuntoVenta = pv.PuntoVenta
LEFT OUTER JOIN tcColor AS co ON vh.Marca = co.Marca
AND vh.Color = co.Color
LEFT OUTER JOIN tcTapiz AS tz ON vh.Marca = tz.Marca
AND vh.Tapiz = tz.Tapiz
LEFT OUTER JOIN tgCategoria AS ct ON vh.Categoria = ct.Categoria,
tcComisReclam AS cr,
tgMarca AS mc,
tgModelo AS md,
tgVersion AS vn
WHERE pc.Emp = cr.Emp
AND pc.Comision = cr.Comision
AND pc.Emp = vh.Emp
AND pc.NumInternoVeh = vh.NumInterno
AND vh.Marca = mc.Marca
AND vh.Modelo = md.Modelo
AND vh.Marca = md.Marca
AND vh.Marca = vn.Marca
AND vh.Modelo = vn.Modelo
AND vh.Version = vn.Version
AND pc.Emp = '002'
AND vh.EsVO = 0
AND FechaFactura <> ' '
AND Importe <> .00
AND pc.Fecha BETWEEN '01-01-2007' AND '31-07-2011'
AND (
CobroFinalizado = '0'
OR(
CobroFinalizado = '1'
AND pc.FechaCobro > '31-07-2011'
)
);[/sql]
Mieux non ?