# Logiciels > Solutions d'entreprise > Business Intelligence > SAP Crystal Reports >  [CR XI] jointure externe

## nabnallee

Bonjour, 
Malgr plusieurs sujets sur les jointures externes, je n'arrive pas  rsoudre mon problme :
Je souhaite afficher les commandes ayant un bon de livraison qu'elles soient factures ou non, mais  partir du moment o j'intgre la table facture dans mon modle, crystal n'affiche que les commandes ayant des factures. 
J'ai tent  l'aide de l'expert base de donnes et de l'onglet option de mise en relation dans liens de mettre en place une jointure externe mais le rsultat est identique... j'ai essay jointure gauche, droite ou complete avec appliqu vers, depuis ... mais rien ne fonctionne...
Quelqu'un peut-il m'aider?
Merci d'avance
Nabnallee

----------


## say

difficile sans voir les liens...
d'aprs ce que tu dis, c'est la bonne mthode...
LEFT join sur la table facture...

cependant appliques tu un critre sur cette table?
si oui, du moment que tu appliques un critre, a revient  faire un INNER

A+

----------


## nabnallee

alors en fait j'ai deux tables : Fournisseurs_BL_Lignes et Fournisseur_Factures_Lignes. 
Elles sont lies par la cl trangre : CliFacLig_Code_CliBlLig+CliFacLig_No_Ligne_CliBlLig qui est primaire pour Fournisseurs_BL_Lignes et trangre pour Fournisseurs_Factures_lignes.

C'est sur ces deux liens que j'ai mis la jointure externe gauche avec l'expert base de donnes... mais il ne se passe rien...
Je me demande s'il n'y a pas qqchose  cocher qqpart en plus?

----------


## Aitone

Bonsoir,

Il faut une jointure externe gauche de Fournisseurs_BL_Lignes vers Fournisseurs_Factures_lignes.

----------


## nabnallee

Bah c'est ce que j'ai fait mais a ne change rien aux rsultats, que je mette la jointure ou non, je n'obtiens que les bons de livraisons qui sont dj facturs.

----------


## Antoun

As-tu vu la question de say ?



> cependant appliques tu un critre sur cette table?
> si oui, du moment que tu appliques un critre, a revient  faire un INNER


Peux-tu nous donner le SQL gnr par Crystal ?

----------


## say

bjr, 

tes liens tu les as fait toi mme ou CR s'est organis?
il m'a souvent sembl que CR prvoit des NATURAL JOIN parfois  ct de la plaque et on ne voit pas certains liens qui se retrouvent superposs.

supprimes tous les liens et cres les tiens explicitement. Encore une fois, le moindre critre sur la table de droite appliquera un INNER JOIN.

si tu peux envoyer ton report, je veux bien regarder

----------


## Aitone

> il m'a souvent sembl que CR prvoit des NATURAL JOIN parfois  ct de la plaque et on ne voit pas certains liens qui se retrouvent superposs.


parfois ?  ::roll::

----------


## say

ah...attention...a va troll si tu me lances ;-)
bah en mme temps, le natural...bah il fait ce qu'on lui dit  ::mouarf::

----------


## nabnallee

qu'est ce que vous appelez un critre?
je vais regarder le sql gnr

----------


## Antoun

> qu'est ce que vous appelez un critre?


une condition pose avec l'expert slection

----------


## nabnallee

ok, donc non je n'ai aucun critre avec l'expert slection. Par contre voici le script sql gnr : 
 ::tagcode:: 


```

```

----------


## Antoun

La jointure entre Clients BL et Clients_BL_Lignes devrait elle aussi tre externe.

----------


## Aitone

> La jointure entre Clients BL et Clients_BL_Lignes devrait elle aussi tre externe.


Pourquoi ? On a forcment un bon de livraison donc on a BL et BL_Lignes non ?

----------


## say

> La jointure entre Clients BL et Clients_BL_Lignes devrait elle aussi tre externe.


+1

[t'avais qd mme omis de nous dire qu'il y avait plus de 2 tables lies  ::aie:: ]

----------


## say

> Pourquoi ? On a forcment un bon de livraison donc on a BL et BL_Lignes non ?


j'avoue  ne pas avoir de vritable explication, c'est de manire empirique que j'ai remarqu que le LEFT doit tre propag en cascade ou encapsuler par bloc

----------


## nabnallee

oui mais meme avec uniquement les deux tables ca marche pas...
enfin je vais essayer de mettre la deuxime jointure

----------


## Antoun

> Pourquoi ? On a forcment un bon de livraison donc on a BL et BL_Lignes non ?


Pas quand il n'y a pas de BL_Lignes !

----------


## Aitone

> Pas quand il n'y a pas de BL_Lignes !


Mais il doit y en avoir toute le temps... BL (ou plutt Clients_BL) est la table en-tte de livraison... Mais on ne fait une livraison si et seulement si on livre quelque chose. Donc il y a forcment au minimum une ligne et Clients_BL_Lignes est forcment renseign  ::koi:: 
Ou alors j'ai loup quelque chose

----------


## nabnallee

oui effectivement mettre une jointure entre Client_BL et Clients_BL_Lignes n'a fait que planter crystal et effectivement  partir du moment qu'il y a un entete de BL il y a forcment au moins une ligne qui correspond

----------


## Antoun

> Mais il doit y en avoir toute le temps...


Non, puisque BL Lignes est du ct facultatif d'une jointure externe...

Autrement dit, si tu as trois tables A, B et C


```

```

La jointure A/B va gnrer des lignes o B.idB et B.idC sont NULL. Sur ces lignes, la condition B.idC = C.idC est fausse, et elles sont donc limines.

Il faut donc jouer le coup ainsi :


```

```

ou ainsi :


```

```

Mais je ne sais pas trop dans quelle mesure la deuxime syntaxe est correcte ou implmente sur les diffrents SGBD.

----------


## Aitone

> oui effectivement mettre une jointure entre Client_BL et Clients_BL_Lignes n'a fait que planter crystal


je ne pense vraiment pas qu'il y ait un rapport entre les 2  ::roll::

----------


## say

> Non, puisque BL Lignes est du ct facultatif d'une jointure externe...
> 
> Autrement dit, si tu as trois tables A, B et C
> 
> 
> ```
> 
> ```
> 
> ...


voil, c'est l'explication que je n'arrivais pas  formuler.
Le deuxime syntaxe est parfaite correcte (en tout cas sous postgresql) et a l'avantage d'tre lisible  :;):

----------


## say

> oui effectivement mettre une jointure entre Client_BL et Clients_BL_Lignes n'a fait que planter crystal et effectivement  partir du moment qu'il y a un entete de BL il y a forcment au moins une ligne qui correspond


je ne vois pas le rapport non plus...d'autant que tu n'ajoutes pas une jointure...mais que tu la transformes en LEFT

----------


## nabnallee

toujours est-il que a a plant...

----------


## say

mais a plante  chaque fois que tu fais a???

----------


## fan_de_crystal

> Bonjour, 
> Malgr plusieurs sujets sur les jointures externes, je n'arrive pas  rsoudre mon problme :


Je crois que a en fait un de plus !  ::lol::  !
Plus srieusement, j'ai une pliade de rapports en suspend  cause de ce problme et l'installation du Service pack 3 n'a rien arrang. 
En revenant un peu en arrire sur la discussion: quelqu'un peut-il expliquer pourquoi lorsque nous appliquons des contraintes sur la table de droite le outer joint se transforme en inner?

Merci

----------


## say

c'est relativement logique, si tu appliques un critre sur une table, ne vont tre renvoys que les enregistrements respectant ces critres...donc uniquement ceux en lien avec la fameuse table de droite.

un contournement possible est de placer ton critre associ  un OU ce critre EST NULL.

bon courage

----------


## Antoun

> En revenant un peu en arrire sur la discussion: quelqu'un peut-il expliquer pourquoi lorsque nous appliquons des contraintes sur la table de droite le outer joint se transforme en inner?


Dmonstration ici : http://www.developpez.net/forums/sho...7&postcount=21

----------

