Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD10] SQL / HF, problème de liaison fichier

5 réponses
Avatar
mat
Bonjour,

j'ai un fichier "Mouvements"
IDMouvement
Date IDProduit Quantité Coût
01.01.07 111 1000 10.00
01.02.07 111 500 12.00
30.06.07 111 -500 10.67

et un fichier "Prix" avec les prix actuels
IDProduit Date Prix
111 01.01.07 10.00
111 01.04.07 13.00

Au 30.6., j'aimerais obtenir la quantité, le coût et le prix actuel

Pour avoir les totaux des mouvements je n'ai pas de problème. Pour
obtenir également le prix courant correspondant à la date en question,
je fais le suivant. Il n'y a pas d'erreur, mais avec cette solution la
requête ne trouve que l'enregistrement correct d'un seul produit:

SELECT IDProduit, SUM(Quantite) AS Quantite, SUM(Quantite*Cout) AS
ValCout, SUM(Quantite*PrixFiltre.Prix) AS valPrix
FROM Mouvements
LEFT OUTER JOIN
(SELECT BOTTOM 1 Date, IDProduit, Prix FROM Prix
WHERE Date <= {pDateFin}) AS PrixFiltre
ON (Journal.IDProduit = PrixFiltre.IDProduit)
Group BY IDProduit

Je n'arrive pas à trouver la bonne solution pour obtenir les derniers
prix de tous les produits.

Merci pour vos idées.

Mat

5 réponses

Avatar
mat
mat wrote:

j'ai renommé les fichiers pour l'exemple. La ligne suivante

ON (Journal.IDProduit = PrixFiltre.IDProduit)



devrait lire

ON (Mouvements.IDProduit = PrixFiltre.IDProduit)
Avatar
mat
Bonjour,

personne n'a une idée?

Merci

Mat



mat wrote:
Bonjour,

j'ai un fichier "Mouvements"
IDMouvement
Date IDProduit Quantité Coût
01.01.07 111 1000 10.00
01.02.07 111 500 12.00
30.06.07 111 -500 10.67

et un fichier "Prix" avec les prix actuels
IDProduit Date Prix
111 01.01.07 10.00
111 01.04.07 13.00

Au 30.6., j'aimerais obtenir la quantité, le coût et le prix actuel

Pour avoir les totaux des mouvements je n'ai pas de problème. Pour
obtenir également le prix courant correspondant à la date en question,
je fais le suivant. Il n'y a pas d'erreur, mais avec cette solution la
requête ne trouve que l'enregistrement correct d'un seul produit:

SELECT IDProduit, SUM(Quantite) AS Quantite, SUM(Quantite*Cout) AS
ValCout, SUM(Quantite*PrixFiltre.Prix) AS valPrix
FROM Mouvements
LEFT OUTER JOIN
(SELECT BOTTOM 1 Date, IDProduit, Prix FROM Prix
WHERE Date <= {pDateFin}) AS PrixFiltre
ON (Journal.IDProduit = PrixFiltre.IDProduit)
Group BY IDProduit

Je n'arrive pas à trouver la bonne solution pour obtenir les derniers
prix de tous les produits.

Merci pour vos idées.

Mat


Avatar
Albert
Bonjour,

Si vous ne le connaissez pas, il existe un document sur les jointures
très bien documenté avec exemples de code sur

http://sql.developpez.com/sqlaz/jointures/

Le problème ne viendrait pas d'un manque de précision dans
l'utilisation des fichiers ?
Vous avez également un fichier "Prix" qui contient une rubrique
"Prix" ?
Utilisation de < PrixFiltre > qui me parait ambigue ?

SELECT IDProduit...



SELECT Mouvements.IDProduit

Je reste perplexe également sur la syntaxe de

LEFT OUTER JOIN



Ne faudait il pas plustôt ;

LEFT OUTER JOIN Prix

La rubrique Date étant reprise dans tous les fichiers ne faudrait il
pas apporter la précision du fichier

WHERE Date <= {pDateFin}) AS PrixFiltre

Maintenant je ne comprend pas < {pDateFin}) AS PrixFiltre > alors
que au début de botre code vous avez

SUM(Quantite*PrixFiltre.Prix) AS valPrix

Cordialement

Albert
Avatar
mat
Albert wrote:
Bonjour,

Si vous ne le connaissez pas, il existe un document sur les jointures
très bien documenté avec exemples de code sur

http://sql.developpez.com/sqlaz/jointures/




Bonjour, et merci pour la réponse.

Je connais ce site excellent et l'ai revisité, malheureusement
sans trouver de solution à mon problème.

...
Maintenant je ne comprend pas < {pDateFin}) AS PrixFiltre > alors
que au début de botre code vous avez

SUM(Quantite*PrixFiltre.Prix) AS valPrix



PrixFiltre est l'alias pour un filtre sur le fichier Prix. Ca
fonctionne, mais à cause de "Top 1" uniquement pour un Produit au lieu
de tous.


***************

J'arrive maintenant à trouver ce qu'il me faut en limitant la requête à
un seul fichier:

select Value.IDProduct, Value.Date, Value.Value
FROM Value
WHERE Date IN (SELECT MAX(Date) FROM Value AS P WHERE P.Date <= {pDate}
and P.IDProduct = Value.IDProduct GROUP BY P.IDProduct)
ORDER BY IDProduct

mais je n'arrive pas à intégrer cette sous-requête lorsque d'autres
fichiers sont liés et qu'il y a des calculs sur ceux-ci:

SELECT Journal.IDProduct, Product.Name AS ProdName, SUM(Journal.Number)
AS Number, SUM(Journal.Number*Journal.Cost) AS ValCost,
SUM(Journal.Number*Value.Value) AS valPrice
FROM Journal Left OUTER JOIN Product
on (Journal.IDProduct = Product.IDProduct),
Journal Left OUTER JOIN Value
on (Journal.IDProduct = Value.IDProduct)
WHERE
Value.Date IN (SELECT Max(Value.Date) from Value AS V WHERE V.date
<={pDateTo} AND V.IDProduct = Value.IDProduct Group by V.IDProduct)
GROUP by IDProduct, ProdName
ORDER by IDProduct

Cela produit une "erreur système inattendu".

Quelqu'un sait comment résoudre, svp?

Merci

Mat
Avatar
mat
J'ai fini par trouver une solution qui marche.

Salutations
Mat



ds1,ds2 est une Source de Données
dDate est Date = "20070101"
sQuery est chaîne

//1ère requête
sQuery = "select value.idProduct, value.Date, value.Value "
sQuery += " from value "
sQuery += " where Date IN (SELECT max(Date) from Value AS V where v.date
<= '" + dDate + "' and v.IDProduct = Value.IDProduct group by v.IDProduct) "
sQuery +=" order by idProduct "

SI HExécuteRequêteSQL(ds1,hRequêteDéfaut, sQuery) ALORS
SI HLitPremier(ds1) ALORS
FOR ALL ds1
trace(ds1.idProduct, ds1.date, ds1.Value)
end
FIN
SINON
Info(HErreurInfo)
RETOUR
FIN

//2e requête
sQuery = "SELECT journal.IdSecurity, Security.Name AS ProdName,
SUM(Journal.Number) AS Number, SUM(Journal.number * Journal.Cost) AS
ValCost, SUM(Journal.Number * ds1.Value) AS valPrice "
sQuery += " FROM Journal INNER JOIN Security "
sQuery += " ON (Journal.IdSecurity = security.IdSecurity), "
sQuery += " Journal LEFT OUTER JOIN ds1 "
sQuery += " ON (Journal.IdSecurity = ds1.IdSecurity) "
sQuery += " WHERE "
sQuery += " Journal.Date <= '" + dDate + "' "
sQuery += " GROUP BY IdSecurity, ProdName "
sQuery += " ORDER BY IdSecurity "

SI HExécuteRequêteSQL(ds2,hRequêteDéfaut, sQuery) ALORS
SI HLitPremier(ds2) ALORS
Info(ds2.idsecurity, ds2.ProdName, ds2.Number, ds2.ValCost, ds2.ValPrice)
FIN
SINON
Info(HErreurInfo)
RETOUR
FIN