IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQLite Discussion :

Affichage conditionnel dans une vue SQL


Sujet :

SQLite

  1. #1
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut Affichage conditionnel dans une vue SQL
    Bonjour la team,
    je poste ici parceque le moteur est SQLITE, mais la réponse est je pense plus SQL. Je fait un petit soft pour gérer mon entreprise.

    Le besoin de la vue : afficher TOUTES les affaires, puis les DEVIS existants (Une affaire contient ou pas des DEVIS), puis enfin les FACTURES (chaque devis contient ou pas des factures)

    Mon problème : Si une facture ne vient d'un devis (mais obligatoirement d'une affaire) j'arrive à l'afficher, mais bien sur il affiche à nouveau tous les devis de cette même affaire.

    Voici la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE VIEW "VaffairesEtat" AS  SELECT 
    					affaires.pkaffaires, affaires.numAffaire AS 'N° Dossier', affaires.designation AS 'Nom dossier' , societes.nomSociete AS 'Société' , affaires.fkaffaireStatuts AS 'Statut affaire'
                        , devis.pkdevis, devis.numDevis AS 'N° Devis', devis.designation as 'Nom devis', devis.ptHT AS 'Valeur Ht', devis.fkdevisStatuts AS 'Statut devis'
                        , factures.pkfactures, factures.numFacture AS 'N° Facture', factures.nom AS 'Désignation facture', factures.ptHt AS  'Montant Ht', factures.dateFacture AS 'Facturé le :', factures.dateReglement AS 'régler le :', factures.fkfactureStatuts AS 'Statut'
                    FROM
    				-- requéte sur affaire
    				affaires LEFT OUTER JOIN devis ON affaires.pkaffaires = devis.fkaffaires
    				JOIN societes ON societes.pksocietes = affaires.idSociete
    				-- requéte sur devis
    				LEFT OUTER JOIN factures ON 
    				CASE WHEN factures.fkdevis > 0 
    				THEN devis.pkdevis = factures.fkdevis 
    				ELSE affaires.pkaffaires = factures.fkaffaires 
    				END ORDER BY affaires.numAffaire
    Aperçu du résultat:

    Nom : Capture.PNG
Affichages : 699
Taille : 53,4 Ko

    On peut constater qu'une affaire sans devis, ni facture est bien présente (15003), mais en revanche une facture sans devis (fkdevis = -1) se place bien dans l'affaire (FA011 pour l'exemple de l'affaire 15000) mais la requête affiche les trois devis de la même affaire (DE1508000, 8002 et 9006) -_-.
    A bien lire la requete je trouve normal qu'elle le fasse, mais j'aimerai avoir la ligne devis null et qu'une ligne pour la facture (FA011)

    Comment afficher la facture sans que les devis pollues la vue ?
    J'ai essayé pas mal de structure CASE un peu dans tous les sens, mais c'est mon meilleure résultat :'(

    Si quelqu'un à une idée ? d'avance merci pour votre lecture et réflexion.
    Cordialement ADN

  2. #2
    Membre éprouvé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    Juillet 2011
    Messages
    420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2011
    Messages : 420
    Points : 1 100
    Points
    1 100
    Par défaut
    Bonjour,

    J'ai essayé de reconstruire une structure de base pour comprendre la question

    Cela me donne quelque chose comme ceci (je n'ai pas mis de type pour les colonnes car ce n'est pas obligatoire pour SQLITE et ce n'est pas le but du problème)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    create table affaires  (
     pkaffaires,
     numAffaire,
     designation,
     fkaffaireStatuts,
     idSociete);
     
     create table societes (
     pksocietes,
     nomSociete );
     
     create table  devis  (
     fkaffaires,
     pkdevis,
     numDevis,
     designation,
     ptHT,
     fkdevisStatuts  );
     
     create table factures (
     pkfactures,
     numFacture,
     nom,
     ptHt,
     dateFacture,
     dateReglement,
     fkfactureStatuts,
     fkdevis,
     fkaffaires);
    J'en déduis les règles suivantes :
    * Une facture peut être rattachée à un devis mais pas obligatoirement
    * Une facture est obligatoirement rattachée à une affaire.

    Est ce bon?

    Dans ce cas, le CASE que tu utilises dans ta jointure va te ramener la ligne de facture pour chaque devis rattaché à l'affaire. Comme tu sembles vouloir toutes les lignes de facture (avec ou sans devis) il te faut mettre en place une union pour ramener les lignes avec devis (on enlève le CASE) et ensuite les factures n'ayant pas fait l'objet d'un devis (dans ce cas tous les champs correspondant au devis seront null soit quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    CREATE VIEW "VaffairesEtat" AS
           SELECT 	affaires.pkaffaires, affaires.numAffaire AS 'N° Dossier', affaires.designation AS 'Nom dossier' , societes.nomSociete AS 'Société' , affaires.fkaffaireStatuts AS 'Statut affaire'
                        , devis.pkdevis, devis.numDevis AS 'N° Devis', devis.designation as 'Nom devis', devis.ptHT AS 'Valeur Ht', devis.fkdevisStatuts AS 'Statut devis'
                        , factures.pkfactures, factures.numFacture AS 'N° Facture', factures.nom AS 'Désignation facture', factures.ptHt AS  'Montant Ht', factures.dateFacture AS 'Facturé le :', factures.dateReglement AS 'régler le :', factures.fkfactureStatuts AS 'Statut'
                  FROM
    		-- requéte sur affaire
    		affaires LEFT OUTER JOIN devis ON affaires.pkaffaires = devis.fkaffaires
    		JOIN societes ON societes.pksocietes = affaires.idSociete
    		-- requéte sur devis
    		LEFT OUTER JOIN factures ON devis.pkdevis = factures.fkdevis
       UNION ALL
           SELECT affaires.pkaffaires, affaires.numAffaire AS 'N° Dossier', affaires.designation AS 'Nom dossier' , societes.nomSociete AS 'Société' , affaires.fkaffaireStatuts AS 'Statut affaire'
                        , null, null AS 'N° Devis', null as 'Nom devis', null AS 'Valeur Ht', null AS 'Statut devis'
                        , factures.pkfactures, factures.numFacture AS 'N° Facture', factures.nom AS 'Désignation facture', factures.ptHt AS  'Montant Ht', factures.dateFacture AS 'Facturé le :', factures.dateReglement AS 'régler le :', factures.fkfactureStatuts AS 'Statut'
                 FROM  -- requéte sur affaire
    		affaires  JOIN societes ON societes.pksocietes = affaires.idSociete
    		   -- Il n'y a plus de devis mais uniquement des factures
    		  JOIN factures ON affaires.pkaffaires = factures.fkaffaires
                    where factures.fkdevis is null -- Ne prendre que les factures sans devis
    ORDER BY affaires.numAffaire
    Cordialement

  3. #3
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    Je te remercie pour le temps que tu m'a consacré.

    Je viens de tester ta requête et elle affiche bien les devis et les factures de visées, mais pas les factures qui n'ont pas de devis. J'ai essayé aussi avec le Union mais je n'avais pas pensé à faire un Where comme toi.

    Et voila la solution ! je passe -1 dans le fkdevis (car une references est not null ) du coup il suffit de remplacer le where par : where factures.fkdevis < 1 -- Ne prendre que les factures sans devis

    Du bon boulot Sir, je cherchais à faire le tout en une requête mais il en fallait deux via un Union !
    Merci encore pour ton aide, t'es un chef
    ADN

  4. #4
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    OUPS j'ai parlé trop vite, j'ai encore une petite subtilité.
    Comme la requête1 renvoie les affaires sans devis ni facture, j'ai un autre doublon avec la requête 2

    Nom : Capture.PNG
Affichages : 574
Taille : 83,6 Ko

    je vais bosser un peu la requête pour voir si je trouve, mais si pour toi c'est évident n’hésites pas
    J'ai un peu de mal à rester concentré le soir après une journée de taff -_-

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    AMHA , je n'ai fait que survoler les requêtes, il faudrait que la requête 'numéro 1' est une clause where sur factures.fkdevis mais il ne faut pas oublier de tester le NULL (affaire sans facture ni devis)
    donc un WHERE (factures.fkdevis IS NULL OR factures.fkdevis>0)
    N.B. je suis encore newbie avec SQLite aussi ne sait pas trop comment ce SGBD se comporte avec les NULL peut être que seul factures.fkdevis>0 suffirait dans le doute j'applique ce qui me semble être la norme
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    Bonsoir Sergio,
    -le sgdb gére trés bien les NULL, mais dans mon cas les fk... sont des foreigner keys est donc sont NOT NULL.
    -J'ai bien pensé hier soir à faire ce que tu dis, il faut supprimer le LEFT OUTER du JOIN et y placer la clause WHERE.
    -Cependant cela ne gère plus le cas ou une affaire n'a ni devis, ni facture (elle ne sera plus affiché voir affaire deux lignes au dessus)

    En fait je ne penche sur un autre UNION ALL avec ne troisième requête qui n'afficherai que les affaires sans devis, ni facture. Je vais faire le test ce soir.
    Merci pour ton attention et bonne soirée, ADN.

    EdIT :
    Bon j'ai testé pas mal de chose, mais rien ne marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    _db.CreateTables(new Table("VaffairesEtat", "CREATE VIEW VaffairesEtat AS SELECT"
                        + " affaires.pkaffaires, affaires.numAffaire AS 'N° Dossier', affaires.designation AS 'Nom dossier' , societes.nomSociete AS 'Société' , affaires.fkaffaireStatuts AS 'Statut affaire'"
                        + " , devis.pkdevis, devis.numDevis AS 'N° Devis', devis.designation as 'Nom devis', devis.ptHT AS 'Valeur Ht', devis.fkdevisStatuts AS 'Statut devis'"
                        + " , factures.pkfactures, factures.numFacture AS 'N° Facture', factures.nom AS 'Désignation facture', factures.ptHt AS  'Montant Ht', factures.dateFacture AS 'Facturé le :', factures.dateReglement AS 'régler le :', factures.fkfactureStatuts AS 'Statut'"
                        + " FROM"
                        //+ " affaires LEFT OUTER JOIN devis ON affaires.pkaffaires = devis.fkaffaires"
                        + " affaires JOIN devis ON affaires.pkaffaires = devis.fkaffaires"
                        + " JOIN societes ON societes.pksocietes = affaires.idSociete"
                        + " LEFT OUTER JOIN factures ON devis.pkdevis = factures.fkdevis"
                        + " UNION ALL"
                        + " SELECT affaires.pkaffaires, affaires.numAffaire AS 'N° Dossier', affaires.designation AS 'Nom dossier' , societes.nomSociete AS 'Société' , affaires.fkaffaireStatuts AS 'Statut affaire'"
                        + " , null, null AS 'N° Devis', null as 'Nom devis', null AS 'Valeur Ht', null AS 'Statut devis'"
                        + " , factures.pkfactures, factures.numFacture AS 'N° Facture', factures.nom AS 'Désignation facture', factures.ptHt AS  'Montant Ht', factures.dateFacture AS 'Facturé le :', factures.dateReglement AS 'régler le :', factures.fkfactureStatuts AS 'Statut'"
                        + " FROM"
                        + " affaires JOIN societes ON societes.pksocietes = affaires.idSociete"
                        + " JOIN factures ON affaires.pkaffaires = factures.fkaffaires"
                        + " where factures.fkdevis < 1"
                       // + " UNION ALL"
                      //  + " SELECT affaires.pkaffaires, affaires.numAffaire AS 'N° Dossier', affaires.designation AS 'Nom dossier' , societes.nomSociete AS 'Société' , affaires.fkaffaireStatuts AS 'Statut affaire'"
                      //  + " , null, null AS 'N° Devis', null as 'Nom devis', null AS 'Valeur Ht', null AS 'Statut devis'"
                      //  + " , null, null AS 'N° Facture', null AS 'Désignation facture', null AS  'Montant Ht', null AS 'Facturé le :', null AS 'régler le :', null AS 'Statut'"
                      //  + " FROM"
                     //   + " affaires JOIN societes ON societes.pksocietes = affaires.idSociete"
                        //+ " JOIN factures JOIN devis"
                      //  + " where factures.fkdevis is null AND devis.fkaffaires is null"
                        + " ORDER BY affaires.numAffaire DESC"
                        ));
    du coup je vais finir par considérer qu'une affaire qui n'a ni de devis, ni de facture n'a rien à faire dans la view -_- pfff j'suis trop naze...mode caliméro=on ^^

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour

    -le sgdb gére trés bien les NULL, mais dans mon cas les fk... sont des foreigner keys est donc sont NOT NULL.
    oui mais non, dans le cas de la jonction le where ne se fait pas sur la foreign key mais sur le résultat obtenu.
    mon questionnement au sujet du null concerne l'ensemble résultat et non le NULL des données,
    en gros : "si dans mon ensemble résultat je doit obtenir une colonne numérique et que j'ai une valeur nulle cette valeur est-elle remplacée par 0 ou reste t-elle nulle ?" si je peux y répondre avec une SGBD que je maitrise (Firebird) la réponse est : "elle reste nulle" je ne sait pas ce qu'il en est de SQLite (à moins de faire un essai) mais il est déjà l'heure de reprendre le taf !!


    -J'ai bien pensé hier soir à faire ce que tu dis, il faut supprimer le LEFT OUTER du JOIN et y placer la clause WHERE.
    je n'ai pas dit ça, à contrario il faut le garder

    par exemple :
    SELECT a.numero,d.numerodevis,f.numerofacture,f.etat from affaires a
    left join devis d on a.numerosdevis=d.numerodevis
    left join factures f on a.numerofacture=f.numerofacture

    soit une affaire n°1 "vide" (sans devis ni facture) si tu fais une jointure (LEFT JOIN) entre affaire,devis facture tu obtiendras
    1,Null,Null,Null << c'est de dernier null qui est testé dans ma proposition
    affaire n°2 , pas de devis, une facture 200 sans devis (etat -1)
    2,null,200,-1

    En fait pour nous aider à t'aider, le principe d'un forum SQL est de fournir :
    1. la structure des tables
    2. un jeu d'essais
    3. le résultat voulu

    et ce sous forme de script SQL, tu dois bien comprendre que comme toi nous n'avons pas tous de grands temps libre (en régle générale je passe sur le forum avant "l'embauche",aux pauses disons 10h et 12h et en début de soirée, ayant la chance d'être en travail à domicile, il semblerait d'ailleurs que j'en soit un pionnier, j'ai plus de latitude que beaucoup mais ce n'est certes pas le cas de tous les intervenants)
    acaumes a été sympa de proposer une structure mais sans la tienne et sans jeu d'essais ....

    [edit] comme je ne lâche jamais le morceau pour ma tranquillité d'esprit , j'ai un peu "merdé" et utilisé facture.fkfacturesstatut au lieu de facture.fkdevis mais l'esprit est le même
    une image écran , je ne sais pas si tout les cas sont prévus (du coup mon 12h commencera à 12h30 )
    Nom : Capturetest.PNG
Affichages : 583
Taille : 59,5 Ko
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    DSL pour le manque des fichiers SQL je n'ai pas l’habitude et je pensais que lire la requête suffirai à comprendre le binsss.
    J'ai appris comme cela ! Mais promis la prochaine fois je ferais un dumb de la bdd pour que vous puissiez tester.

    Merci d'avoir pris sur ton temps pro pour tester, travaillant aussi à domicile parfois (je suis libéral en automatisme) je sais que nous nous devons à une hygiène strict pour assurer les taches.

    Je viens de rentrer et je test ta façon de faire. je te post aprés le résultat.
    Bonne fin de soirée et encore navré de vous avoir fait refaire les tables. Kenavo et à tout à l'heure.
    ADN

  9. #9
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    Bien voila le résultat, cela me donne la même chose une fois traduit avec mes champs.
    Pour ne pas refaire la même erreur que précédemment je joins le dumb de la bdd et des vues.

    Il y a deux vues qui représente mes recherches : AffaireEtat et AffaireEtats2.
    D'avance merci pour le temps que tu pourras y consacrer.

    Le résultat escompté est exactement celui qui s'affiche dans ton soft (c'est quel soft d’ailleurs, il a l'ai pas mal fichu ) sauf que les statuts dossier, devis, affaire ne sont pas des critères de recherche.
    c'est juste une info (envoyé, soldée, en cours, etc....)

    Bien cordialement ADN.
    Fichiers attachés Fichiers attachés

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par adn56 Voir le message
    Le résultat escompté est exactement celui qui s'affiche dans ton soft (c'est quel soft d’ailleurs, il a l'ai pas mal fichu )
    c'est tout simplement SQLiteStudio, comme je l'ai déjà indiqué SQlite est pour moi une alternative et non ma SGBD de prédilection
    et c'est devenu une alternative depuis le nouvel EDI d'Embarcadero RAD Studio et la possibilité de développer pour Mac IoS Androïd (surtout la partie mobile) comme base embarquée

    Si le résultat escompté est bon alors le SQL serait :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT a.numAffaire,a.designation,d.numDevis,d.ptHT,f.nom,f.ptht,f.fkdevis
    FROM affaires a left join devis d on a.pkaffaires=d.fkaffaires
                    left join factures f on a.pkaffaires=f.fkaffaires
    WHERE f.fkdevis is null or f.fkdevis=-1                
    UNION
    SELECT a.numaffaire,a.designation,d.numdevis,d.ptHT,f.numfacture,f.ptht,f.fkdevis
    FROM affaires a join devis d on a.pkaffaires=d.fkaffaires
                    left join factures f on a.pkaffaires=f.fkaffaires and d.pkdevis=f.fkdevis
    ce qui donne avec tes données
    15000 Aff 1 modif DE1508000 1371.48 FA003 1296.0 1
    15000 Aff 1 modif DE1508000 1371.48 FA004 1296.0 1
    15000 Aff 1 modif DE1508000 1371.48 FA006 1296.0 1
    15000 Aff 1 modif DE1508000 1371.48 FA010 1296.0 1
    15000 Aff 1 modif DE1508002 282.8 FA012 282.8 3
    15000 Aff 1 modif DE1509006 100.0 FA007 100.0 7
    15001 aff 3 DE1508001 2577.674 FA001 2577.674 2
    15001 aff 3 DE1508001 2577.674 FA002 2577.674 2
    15002 test 2 vue combo DE1509004 885.96 FA009 885.96 5
    15002 test 2 vue combo DE1509005 0.0
    15003 test pour devis 4
    15004 test texte long DE1508003 896.0 FA005 1089.75 4
    ne connaissant pas tes données sur le bout des doigts je ne vois pas d'affaires facturées sans devis
    c'est parce que je pense que tu n'as pas mis -1 comme tu le proposais dans un post (serait-ce 0 ?)



    sauf que les statuts dossier, devis, affaire ne sont pas des critères de recherche.c'est juste une info (envoyé, soldée, en cours, etc....)
    je m'en suis douté ,mais après coup

    Citation Envoyé par adn56
    Kenavo
    ça sent le breton du sud
    bien qu'étant dans la banlieue Nantaise je ne fait pas partie de cette classe de privilégié je reste ancré à mon caillou à regarder "le continent" << traduire par en face de la Vendée => ni breton ni vendéen

    [Edit] pas mal ce petit dump, sauf que les tables n'étant pas dans l'ordre hiérarchique (table de référence avant tables les utilisant un pur copier coller plante lamentablement
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    De retour,

    voilà ce que je propose, du coup je ne suis pas sur que l'union soit nécessaire mais je n'ai plus le temps d'investiguer après ce post
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    SELECT a.numAffaire,
           a.designation,
           CASE f.fkdevis     
             WHEN 
              0 THEN ''                -- ça se joue là facture sans devis
              ELSE d.numDevis
           END AS numdevis  ,
           Case f.fkDevis
             WHEN 
               0 THEN ''                -- et là facture sans devis
               ELSE d.ptHT
           END AS MONTANTDEVIS,    
           f.nom,
           f.ptht,
           f.fkdevis
      FROM affaires a
           LEFT JOIN
           devis d ON a.pkaffaires = d.fkaffaires
           LEFT JOIN
           factures f ON a.pkaffaires = f.fkaffaires
     WHERE f.fkdevis IS NULL OR  -- affaire sans devis ni facture 
           f.fkdevis = 0  -- pas de devis
    UNION
    SELECT a.numaffaire,
           a.designation,
           d.numdevis,
           d.ptHT,
           f.numfacture,
           f.ptht,
           f.fkdevis
      FROM affaires a
           JOIN
           devis d ON a.pkaffaires = d.fkaffaires
           LEFT JOIN
           factures f ON a.pkaffaires = f.fkaffaires AND 
                         d.pkdevis = f.fkdevis;
    je suis parti du principe que devis 0 était le "pas de devis" dans ton jeu d'essai

    15000 Aff 1 modif test facture sans devis 520.0 0
    15000 Aff 1 modif DE1508000 1371.48 FA003 1296.0 1
    15000 Aff 1 modif DE1508000 1371.48 FA004 1296.0 1
    15000 Aff 1 modif DE1508000 1371.48 FA006 1296.0 1
    15000 Aff 1 modif DE1508000 1371.48 FA010 1296.0 1
    15000 Aff 1 modif DE1508002 282.8 FA012 282.8 3
    15000 Aff 1 modif DE1509006 100.0 FA007 100.0 7
    15001 aff 3 DE1508001 2577.674 FA001 2577.674 2
    15001 aff 3 DE1508001 2577.674 FA002 2577.674 2
    15002 test 2 vue combo DE1509004 885.96 FA009 885.96 5
    15002 test 2 vue combo DE1509005 0.0
    15003 test pour devis 4
    15004 test texte long DE1508003 896.0 FA005 1089.75 4
    15005 aff 10 FA aff10 220.0 0
    désolé, le rendu en copier-coller n'est pas vraiment le top

    une question non soulevée un devis peut-il faire l'objet de plusieurs factures ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    oui bien sur un devis peut avoir plusieurs factures (acompte, solde, avenant) je regarde mais je suis parti au début avec un case/when et Acaumes avait trouvé une meilleure façon avec l'UNION.
    Les factures FA011 et FA013 n'ont pas de devis pour exemple, elles ont le fkdevis à -1 comme tu l'as deviné (le devis étant null puisqu'inéxistant)

    DSL pour le dump j'ai pas fait gaffe que SQL Browser que j'utilise (utilisais, car ton soft à l'air bien mieux) ne faisait pas les alerTable + références pk/fk aprés la création des tables. Pfff big mise à jours de prévu pour son auteur ^_^
    Je regarde de suite ton code

    PS : Oui je suis de Lorient BZH powaaa, mais bon t'es pas loin de moi ^^ 2H30 maxi

    bon sinon y'a rien qui marche je me suis inspiré de vos écrits mais j'ai encore et toujours une ligne en doublon comme le montre la photo du haut.
    En gros si une affaire a des devis, puis une facture sans devis ça marche.
    Si une affaire n'a ni devis et ni facture ça marche
    MAIS si une affaire à QU'UNE facture sans devis, ben il affiche la ligne en doublon (sans devis ni facture)
    Voici ce que j'ai essayé ce soir, blessé dans mon égo (18/20 en sql lors de ma licence l'année derniére, mais non pratiquant jusqu'a ce jour ^^ ) je déco pour ce soir je verrais cela demain (journée de repos car blessé aussi (au genou) Merci pour tous les efforts, je trouverais promis ! mais pas ce soir kenavo

    code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    drop view VaffairesEtat2;
     
    CREATE VIEW VaffairesEtat2 AS
        SELECT affaires.pkaffaires,
               affaires.numAffaire AS [N° Dossier],
               affaires.designation AS [Nom dossier],
               societes.nomSociete AS Société,
               affaires.fkaffaireStatuts AS [Statut affaire],
               devis.pkdevis,
               devis.numDevis AS [N° Devis],
               devis.designation AS [Nom devis],
               devis.ptHT AS [Valeur Ht],
               devis.fkdevisStatuts AS [Statut devis],
               factures.pkfactures,
               factures.numFacture AS [N° Facture],
               factures.nom AS [Désignation facture],
               factures.ptHt AS [Montant Ht],
               factures.dateFacture AS [Facturé le :],
               factures.dateReglement AS [régler le :],
               factures.fkfactureStatuts AS Statut
          FROM affaires
               left JOIN
               devis ON affaires.pkaffaires = devis.fkaffaires --WHERE affaires.pkaffaires not in (select factures.fkaffaires from factures)
               JOIN
    		   societes ON societes.pksocietes = affaires.idSociete
               left JOIN
               factures ON devis.pkdevis = factures.fkdevis --WHERE factures.fkdevis > 1
        UNION
        SELECT affaires.pkaffaires,
               affaires.numAffaire AS [N° Dossier],
               affaires.designation AS [Nom dossier],
               societes.nomSociete AS Société,
               affaires.fkaffaireStatuts AS [Statut affaire],
               NULL,
               NULL AS [N° Devis],
               NULL AS [Nom devis],
               NULL AS [Valeur Ht],
               NULL AS [Statut devis],
               factures.pkfactures,
               factures.numFacture AS [N° Facture],
               factures.nom AS [Désignation facture],
               factures.ptHt AS [Montant Ht],
               factures.dateFacture AS [Facturé le :],
               factures.dateReglement AS [régler le :],
               factures.fkfactureStatuts AS Statut
          FROM affaires
               JOIN
               societes ON societes.pksocietes = affaires.idSociete
               JOIN
               factures ON affaires.pkaffaires = factures.fkaffaires
         WHERE factures.fkdevis < 1
         ORDER BY affaires.numAffaire DESC;

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par adn56
    Voici ce que j'ai essayé ce soir, blessé dans mon égo .... car blessé .. au genou
    Conclusion l'égo d'un breton est dans le genou (raccourci journalistique)

    Bonjour,

    plusieurs questionnements suite à ton dernier message :
    -tout d'abord je ne trouve aucun devis à de code -1 ni 0 d'ailleurs dans le jeu d'essai fourni , j'ai donc pris 0 comme "facture sans devis" pour mes tests
    [à moins que cela soit moi lors de la transposition du jeu d'essai]
    -Ensuite s'il y a bien, dans ton jeu d'essai toujours, deux factures (FA011 et FA013) sans devis (code 0) comment cela se fait-il si la contrainte pas de facture sans devis est appliquée
    AMHA ôter la contrainte not null sur factures.pkdevis serait plus simple

    de fait je remarque que dans tes essais tu n'utilises pas mon WHERE factures.fkdevis IS NULL OR factures.fkdevis = 0c'est parce que tu es breton (et donc têtu) <= hypothèse facile, ou parce que l'essai n'a pas été concluant ?

    après avoir revu ton image écran j'ai bien fait attention et dans le résultat obtenu par mes essais il n'y a pas de doublon sur l'affaire 1505

    pour faire simple au lieu de fournir un dump (à cause des contraintes je ne suis pas sur d'arriver à récréer la base) pourquoi ne pas fournir directement la base dans un zip ? comme ça on serait à égalité

    sur ce bon rétablissement

    Serge
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  14. #14
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    Arf oui bien vu Sergio le breton est tétu, surtout lorsqu'il ne comprends pas ce qu'il fait ^^
    Donc j'ai bien testé les where sauf que je prends l'inverse >1 je test ton idée pour voir.
    Un autre point, tu as vu juste lorsque je place -1 dans un fk au niveau appli (c#) la bdd le remplace par 0 ! j'ai intérêt à faire gaffe dans mon code !
    Sinon en effet ton code à l'air de marcher il faut juste que je remplace les champs et que je comprenne pourquoi tu as fait des case au début !
    Whouhou et le tout debout devant le clavier ^^
    Merci pour ton aide Sergio, ça fait plaisir. ar wech all

  15. #15
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    TROUVé !!!!! Alléluia ^^

    Il fallait filtré la premiére reqête comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     FROM affaires
               left JOIN
               devis ON affaires.pkaffaires = devis.fkaffaires
               left JOIN
               factures ON devis.pkdevis = factures.fkdevis WHERE factures.fkdevis > 0 or devis.pkdevis > 0
        UNION
    Puis aprés allez chercher les factures sans devis comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FROM affaires
               left JOIN
               factures ON affaires.pkaffaires = factures.fkaffaires
               WHERE factures.fkdevis < 1 or factures.fkdevis is null
    Je trouve bien les 15 lignes que je souhaitais avoir Un grand merci à toi Sergio pour l'avoir apporté ton soutient et tes idées, ce soir je vous fait un belle imprim écran du résultat

  16. #16
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    TADAM ! merci pour le coup de main
    Nom : Capture.PNG
Affichages : 546
Taille : 73,1 Ko

  17. #17
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par adn56 Voir le message
    Je trouve bien les 15 lignes que je souhaitais avoir
    c'est pour cela que je demandais le résultat souhaité , pas facile d'éplucher les données
    j'y arrive d'une autre manière qui semble aussi correcte
    en modifiant uniquement la clause WHERE de la première requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     FROM affaires a
           LEFT JOIN devis d ON a.pkaffaires = d.fkaffaires
           LEFT JOIN factures f ON a.pkaffaires = f.fkaffaires
     WHERE (f.fkdevis is null or f.fkdevis=0) AND (d.pkdevis is null)
    si tu as le courage et le genou pour vérifier l'hypothèse malgré que cela soit résolu
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  18. #18
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    Je vais essayer ta requête ce soir, mais pour les 15 lignes je l'ai su qu'une fois avoir analyser le soucis -_-
    j'aurais du déja le faire à la main du coup pour avoir la réponse (j'y penserai pour les requêtes futur )
    Mais il me faudrait la requête entière pour être sur, on l'a tellement tripoté dans tous les sens ^^
    Sinon j'ai mis un imprime écran du résultat pour la vérification.
    Pour vérification rapide (ce que j'aurais dû faire depuis le début)
    On doit avoir toutes les affaires (0 à 5), tous les devis (0 à 6) et toutes les factures (1 à 12)

  19. #19
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    voilà le sql de test ,
    le premier champ me permettant de vérifier la partie de l'union qui travaille, comme je n'ai rien fait en VIEW mais tout en SQL direct je reprend le dernier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    SELECT 0, a.numAffaire,
           a.designation,
           d.pkdevis,
           CASE f.fkdevis 
             WHEN 
              0 THEN ''
              ELSE d.numDevis
           END AS numdevis  ,
           Case f.fkDevis
             WHEN 
               0 THEN 'PAS DE DEVIS'
               ELSE d.ptHT
           END AS MONTANTDEVIS,    
           f.numfacture,
           f.ptht,
           f.fkdevis
      FROM affaires a
           LEFT JOIN devis d ON a.pkaffaires = d.fkaffaires
           LEFT JOIN factures f ON a.pkaffaires = f.fkaffaires
     WHERE (f.fkdevis is null or f.fkdevis=0) AND (d.pkdevis is null)
      UNION
    SELECT 1,a.numaffaire,a.designation,d.pkdevis,d.numdevis,d.ptHT,f.numfacture,f.ptht,f.fkdevis
    FROM affaires a left join devis d on a.pkaffaires=d.fkaffaires
                    left join factures f on a.pkaffaires=f.fkaffaires and d.pkdevis=f.fkdevis
     
    ORDER by 1,numaffaire,pkdevis

    affaires 0 à 5 ok
    devis 0 à 6 ok
    factures il me manque la 8 mais étrangement une facture 13 apparaît dans ton jeu d'essai il y a 13 factures ! pas 12
    pourtant j'ai bien 15 enregistrements ! la faute à
    conclusion je me suis planté, je dois avoir un doublon, mais puisque tu as ta réponse (et qu'on est dimanche) je m'arrête là
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  20. #20
    Membre régulier
    Homme Profil pro
    Architecte technique
    Inscrit en
    Octobre 2008
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2008
    Messages : 83
    Points : 96
    Points
    96
    Par défaut
    oui j'ai pareil que toi, mais en plus j'ai fait de nouveau enregistrement hier soir, j'ai 17 lignes maintenant.
    Comme tu le dis c'est dimanche.. Reposons nous
    Bon dimanchage Sergio

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Affichage personnalisé dans une requête SQL
    Par kroma23 dans le forum Bases de données
    Réponses: 9
    Dernier message: 03/12/2012, 09h34
  2. If multiple dans une vue SQL
    Par michaeljeru dans le forum MySQL
    Réponses: 1
    Dernier message: 27/07/2009, 16h32
  3. "Affichage conditionnel" dans une page JSF
    Par Niniz dans le forum JSF
    Réponses: 2
    Dernier message: 19/07/2007, 12h14
  4. requête imbriquée dans une vue SQL
    Par captainamerica75 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/05/2007, 14h39
  5. Champ conditionnel dans une vue
    Par mfmf99 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/09/2006, 22h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo