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

WD10 - HF classic - Requete

2 réponses
Avatar
I.G.LOG
Bonjour,
Question aux spécialistes SQL (un casse-tête).

Je voudrais récupérer tous les documents commerciaux concernant un tiers
(client ou fournisseur) sélectionné qui ont été émis OU reçus par une
société sélectionnée.
Mon problème est que le document peut être émis pas le tiers et reçu par la
société OU émis par la société et reçu par le tiers !!!

Pour ceci, j'ai modélisé deux tables (en résumé),
1/ table de documents commerciaux DOCUM identifiant IDDOCUM,
2/ table T_DONNC (pas d'indentifiant unique) ayant comme champs ID_LIGNE,
ID_COL, _VALEUR

Dans T_DONNC, ID_LIGNE est le pointeur sur IDDOCUM,
ID_COL un identifiant colonne me donnant le type de colonne (type EMETTEUR
ou type DESTINATAIRE),
_VALEUR l'identifiant du tiers (donc la société OU l'identifiant du tiers)

Pour chaque document, j'ai donc deux tuples dans T_DONNC,
l'un comportant ID_COL = "Emetteur" (valeur 13) et _VALEUR = ID_Tiers ou
ID_Société
l'autre comportant ID_COL = "Destinataire" (valeur 14) et _VALEUR = ID_Tiers
ou ID_Société

Voici une requète qui fonctionne (sous WD10):
select DOCUM.IDDOCUM,DOCUM.DATE
from DOCUM,T_DONNC as EMETTEUR,T_DONNC as DESTINATAIRE
where ((EMETTEUR.ID_LIGNE = DOCUM.IDDOCUM" +...
and EMETTEUR.ID_COL = 13" +...
and EMETTEUR._VALEUR = " + gSociete:IDENT +...
and DESTINATAIRE.ID_LIGNE = DOCUM.IDDOCUM" +...
and DESTINATAIRE.ID_COL = 14" +...
and DESTINATAIRE._VALEUR = " + gTiers:IDENT + ")" +...
or (EMETTEUR.ID_LIGNE = DOCUM.IDDOCUM" +...
and EMETTEUR.ID_COL = 13" +...
and EMETTEUR._VALEUR = " + gTiers:IDENT +...
and DESTINATAIRE.ID_LIGNE = DOCUM.IDDOCUM" +...
and DESTINATAIRE.ID_COL = 14" +...
and DESTINATAIRE._VALEUR = " + gSociete:IDENT + "))"

En résumé, renvoyer tous les documents existant dans T_DONNC par
ID_LIGNE=IDDOCUM avec ID_COL = 13 ou 14 et _VALEUR = ID_Soc ou ID_Tiers
Un peu compliqué !!! Et d'après mes essais avec la nouvelle version 11, ce
type de requète ne fonctionne plus, il faut à priori utiliser les inner join
!!!!
J'ai donc essayé sous WD10 la requete suivante, mais elle ne me renvoi pas
les valeurs attendues (avec un exemple avec les valeurs de société 1 et de
tiers 1618) !

select
DOCUM.IDDOCUM,DOCUM.DATE,DOCUM.ECHEANCE,DOCUM.IDTYPE,DOCUM.REFDOC,DOCUM.CHRO
NO
from DOCUM inner join T_DONNC as EMETTEUR on (EMETTEUR.ID_LIGNE =
DOCUM.IDDOCUM and EMMETEUR.ID_COL = 13)
inner join T_DONNC as DESTINATAIRE on (DESTINATAIRE.ID_LIGNE = DOCUM.IDDOCUM
and DESTINATAIRE.ID_COL = 14)
where (EMETTEUR._VALEUR in (1,1618) or DESTINATAIRE._VALEUR in (1,1618))

Merci pour vos idées

2 réponses

Avatar
Roumegou Eric
Après mûre réflexion, I.G.LOG a écrit :
Bonjour,
Question aux spécialistes SQL (un casse-tête).

Je voudrais récupérer tous les documents commerciaux concernant un tiers
(client ou fournisseur) sélectionné qui ont été émis OU reçus par une
société sélectionnée.
Mon problème est que le document peut être émis pas le tiers et reçu par la
société OU émis par la société et reçu par le tiers !!!



rien que l'énoncé j'ai du le lire 3 fois lol

bon je ne vais pas rentrer en détail mais à ta place je tenterais de
répondre succéssivement aux deux cas par deux requetes
et qd c'est bien au point ensuite je fais un UNION avec les requetes.



Pour ceci, j'ai modélisé deux tables (en résumé),
1/ table de documents commerciaux DOCUM identifiant IDDOCUM,
2/ table T_DONNC (pas d'indentifiant unique) ayant comme champs ID_LIGNE,
ID_COL, _VALEUR

Dans T_DONNC, ID_LIGNE est le pointeur sur IDDOCUM,
ID_COL un identifiant colonne me donnant le type de colonne (type EMETTEUR
ou type DESTINATAIRE),
_VALEUR l'identifiant du tiers (donc la société OU l'identifiant du tiers)

Pour chaque document, j'ai donc deux tuples dans T_DONNC,
l'un comportant ID_COL = "Emetteur" (valeur 13) et _VALEUR = ID_Tiers ou
ID_Société
l'autre comportant ID_COL = "Destinataire" (valeur 14) et _VALEUR = ID_Tiers
ou ID_Société

Voici une requète qui fonctionne (sous WD10):
select DOCUM.IDDOCUM,DOCUM.DATE
from DOCUM,T_DONNC as EMETTEUR,T_DONNC as DESTINATAIRE
where ((EMETTEUR.ID_LIGNE = DOCUM.IDDOCUM" +...
and EMETTEUR.ID_COL = 13" +...
and EMETTEUR._VALEUR = " + gSociete:IDENT +...
and DESTINATAIRE.ID_LIGNE = DOCUM.IDDOCUM" +...
and DESTINATAIRE.ID_COL = 14" +...
and DESTINATAIRE._VALEUR = " + gTiers:IDENT + ")" +...
or (EMETTEUR.ID_LIGNE = DOCUM.IDDOCUM" +...
and EMETTEUR.ID_COL = 13" +...
and EMETTEUR._VALEUR = " + gTiers:IDENT +...
and DESTINATAIRE.ID_LIGNE = DOCUM.IDDOCUM" +...
and DESTINATAIRE.ID_COL = 14" +...
and DESTINATAIRE._VALEUR = " + gSociete:IDENT + "))"

En résumé, renvoyer tous les documents existant dans T_DONNC par
ID_LIGNE=IDDOCUM avec ID_COL = 13 ou 14 et _VALEUR = ID_Soc ou ID_Tiers
Un peu compliqué !!! Et d'après mes essais avec la nouvelle version 11, ce
type de requète ne fonctionne plus, il faut à priori utiliser les inner join
!!!!
J'ai donc essayé sous WD10 la requete suivante, mais elle ne me renvoi pas
les valeurs attendues (avec un exemple avec les valeurs de société 1 et de
tiers 1618) !

select
DOCUM.IDDOCUM,DOCUM.DATE,DOCUM.ECHEANCE,DOCUM.IDTYPE,DOCUM.REFDOC,DOCUM.CHRO
NO
from DOCUM inner join T_DONNC as EMETTEUR on (EMETTEUR.ID_LIGNE > DOCUM.IDDOCUM and EMMETEUR.ID_COL = 13)
inner join T_DONNC as DESTINATAIRE on (DESTINATAIRE.ID_LIGNE = DOCUM.IDDOCUM
and DESTINATAIRE.ID_COL = 14)
where (EMETTEUR._VALEUR in (1,1618) or DESTINATAIRE._VALEUR in (1,1618))

Merci pour vos idées



--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
I.G.LOG
Bon j'ai transmit le problème au ST (une requete avec alias multiples qui
fonctionne sous WD10 mais pas sous WD11). réponse: "nous n'avons pas pu
reproduire le problème... veuillez bosser encore plus pour nous permettre de
faire évoluer nos logiciels". Et bien pendant que leur logiciels évoluent...
les miens non !!!