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

SQL Firebird Discussion :

Intégrer un champ calculé dans une requête


Sujet :

SQL Firebird

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut Intégrer un champ calculé dans une requête
    Bonjour à tous,

    Je voudrais intégrer un champs calculé dans cette requette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with c as (select dat,fac,fou,sec,pro,mar,cho,far,coi,qta,null as bon,null as clt,null as qtv from ach a 
              where (num=1)    Union all
           select dat,null as fac,null as fou,sec,pro,mar,cho,far,coi,null as qta,bon,clt,qte as qtv from ven 
            where (num=1))
            select * from c where (qta is not null)or(qtv is not null)
    qui calcul le cumul du solde de qta-qtv.

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Vous vous embêtez avec l'utilisation de NULL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with c as (select dat,fac,fou,sec,pro,mar,cho,far,coi,qta,null as bon, as clt,0 as qtv from ach a 
              where (num=1)    Union all
           select dat,null as fac,null as fou,sec,pro,mar,cho,far,coi,0 as qta,bon,clt,qte as qtv from ven 
            where (num=1))
            select qta-qtv ecart from c
    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

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Je suppose qu'il faut effectuer ce calcul pour un certain critère, et donc rapprocher certaines lignes de ventes de certaines lignes d'achat ?
    Sinon on va cumuler des navets et des carottes...
    Auquel cas une simple UNION ne convient pas, il faut effectuer une jointure.

    Besoin à préciser

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    Je me suis peut être pas bien expliqué, moi je veux récupérer toutes les lignes avec une colonne en plus "solstk" qui contient le cumul de "solstk=solstk+qta-qtv"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with c as (select dat,fac,fou,sec,pro,mar,cho,far,coi,qta,null as bon,null as clt,null as qtv from ach a 
              where (num=1)    Union all
           select dat,null as fac,null as fou,sec,pro,mar,cho,far,coi,null as qta,bon,clt,qte as qtv from ven 
            where (num=1))
            select */*,solstk*/ from c where (qta is not null)or(qtv is not null)

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Rien ne vous empêche de modifier le select de la CTE de ma proposition.

    Je vous rappelle que mettre NULL au lieu de 0 va vous poser des problèmes
    Comme d'habitude, vous n'êtes jamais assez précis dans vos questions, une description des tables impliquées, une liste des colonnes souhaitées en sorties aurait été un minimum souhaitable
    J'imagine également qu'il faudrait un GROUP BY quelque part

    "solstk" qui contient le cumul de "solstk=solstk+qta-qtv"
    et cette colonne solstk qui vient d'on ne sait où elle vient de quelle table ? Quelle relation ? Je présume que c'est num parce que j'ai une bonne boule de cristal.

    Je me suis peut être pas bien expliqué,
    pas peut-être, surement, d'où la nécessité de description des tables impliquées. En fait, je doute même du bien fondé de votre CTE actuelle
    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
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    et cette colonne solstk qui vient d'on ne sait où elle vient de quelle table ? Quelle relation ? Je présume que c'est num parce que j'ai une bonne boule de cristal.
    c'est une colonne calculé comme je l'ai expliqué solstk=(solde précédent)+qta-qtv
    voila un exple du résultat souhaité
    Nom : Sans titre.png
Affichages : 128
Taille : 12,2 Ko

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour, quand j'écris que vous n'êtes pas clair dans vos demandes, je réitère, car non seulement vous ne nous avez toujours pas fourni la structure des tables, mais en plus la version de Firebird risque d'être déterminante.

    Quelques réflexions tout d'abord
    - la sortie semble être une sortie imprimée, en ce cas la plupart des générateurs d'état (non renseigné) permettent de cumuler au fur et à mesure de l'édition des bandes détails.
    c'est une colonne calculée, comme je l'ai expliqué solstk=(solde précédent)+qta-qtv
    - ce n'est pas ainsi que vous l'avez exprimé, relisez-vous, pour moi, il pouvait s'agir d'une colonne provenant d'une table différente permettant de connaitre le stock disponible rapidement, j'imagine difficilement une gestion de stock ou pour obtenir le disponible, je serais obligé de balayer l'ensemble des mouvements !
    - à la lecture de la sortie souhaitée le terme colonne calculée est mal choisi

    Maintenant quelques pistes de solutions SQL
    - Si vous avez Firebird 3 alors, vous pourrez utiliser les fonctions de fenêtrage dites aussi fonctions analytiques
    - une version Firebird 2.1 + une CTE Recursive serait peut-être envisageable
    - dans tous les cas, si vous êtes fâché avec ce genre de choses, une procédure est toujours envisageable

    Je redemande donc, la description des tables impliquées avant toutes choses (c'est quand même pas difficile à faire !) , la version de Firebird et l'objectif de la demande, sortie imprimée ou affichée à l'écran, cela fera une grosse différence ! un champ calculé (notez bien le terme champ Delphi et non colonne Firebird) en ce qui concerne ce deuxième point pourrait suffire
    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
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    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 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Pour votre information, voilà ce à quoi l'on pourrait s'attendre de votre part : un script de création de table avec jeu d'essai
    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
    CREATE TABLE ENTREES
    (
      ID INTEGER GENERATED BY DEFAULT AS IDENTITY  NOT NULL,
      DATE_ENTREE DATE NOT NULL,
      IDARTICLE INTEGER NOT NULL,
      FACTURE VARCHAR(10) NOT NULL,
      QTE INTEGER DEFAULT 0,
      CONSTRAINT PK_ENTREES PRIMARY KEY (ID)
    );
     
    INSERT INTO ENTREES (DATE_ENTREE, IDARTICLE, FACTURE, QTE) VALUES ('10.04.2023', '1', 'FACT1', '500');
    INSERT INTO ENTREES (DATE_ENTREE, IDARTICLE, FACTURE, QTE) VALUES ('10.10.2023', '1', 'FACT2', '200');
     
    CREATE TABLE SORTIES
    (
      ID INTEGER GENERATED BY DEFAULT AS IDENTITY  NOT NULL,
      DATE_SORTIE DATE NOT NULL,
      IDARTICLE INTEGER NOT NULL,
      BON VARCHAR(10) NOT NULL,
      QTE INTEGER DEFAULT 0,
      CONSTRAINT PK_SORTIES PRIMARY KEY (ID)
    );
     
     
    INSERT INTO SORTIES (DATE_SORTIE, IDARTICLE, BON, QTE) VALUES ('10.04.2023', '1', 'BON001', '100');
    INSERT INTO SORTIES (DATE_SORTIE, IDARTICLE, BON, QTE) VALUES ('11.04.2023', '1', 'BON002', '200');
    INSERT INTO SORTIES (DATE_SORTIE, IDARTICLE, BON, QTE) VALUES ('12.10.2023', '1', 'BON002', '100');
    et voici une proposition (FB3) qui semble répondre à ce que vous souhaitez

    Nom : Capture.PNG
Affichages : 110
Taille : 27,9 Ko

    J'avoue que je ne suis pas suffisamment à l'aise pour utiliser correctement les fonctions analytiques, il y a certainement mieux que l'utilisation de ROW_NUMBER. D'un autre côté ROW_NUMBER peut-être "simulé" pour des versions inférieures à FB3 (voir FAQ https://firebird.developpez.com/faq/...ble-de-donnees)
    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

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Comme je le disais précédemment, il semble qu'avec une première ligne de +500 pièces de type "FACT01" puis une deuxième ligne de -100 pièces de type "BON001", on calcule ici un solde de 400...
    Ça signifie qu'on cumule des pièces de différents types, est-ce vraiment ce qui est souhaité, j'en doute. Plus probablement, on veut calculer la quantité disponible par type de pièce.

    Par ailleurs, pour la première ligne, on achète 500, très bien, mais pour autant la quantité disponible n'est pas forcément 500, tout dépend du stock initial qu'on n'a pas ici.

    Bref, je rejoins SergioMaster, l'expression de besoins est incomplète, à partir de là, difficile de donner une réponse précise.

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut à tous.

    Je ne sais pas pourquoi, mais je n'ai plus les alertes concernant les nouveaux sujets dans le forum "firebird". Ce n'est pas la première fois que cela m'arrive.

    Je viens de jeter un coup d'œil à votre requête, Chekkal.

    a) comme l'a indiqué SergioMaster, pour traiter correctement une demande, il nous faut :
    --> le descriptif des tables.
    --> un jeu d'essai
    --> la requête que vous avez essayé de faire
    --> le résultat attendu
    --> et des explications sur ce que vous n'arrivez à traiter.

    Je confirme après les remarques de SergioMaster et d'Escartefigue, que vos explications ne sont pas claires !!!

    b) il y a une ambiguïté au sujet de la gestion de vos NULL dans votre requête.
    Votre clause where est la suivante :
    Code firebird : Sélectionner tout - Visualiser dans une fenêtre à part
    where qte is not null or qtv is not null
    En lisant, je ne sais pas à quelle table se rapporte les colonnes de votre teste. Le mieux aurait été d'indiquer ceci :
    Code firebird : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
        from ach as a
    ...
        from ven as v
    ...
       where a.qtea is not null or v.qtv is not null
    Une meilleure précision ne saurait nuire à la lisibilité de votre requête.

    c) je suppose que vous désirez faire la distinction entre le zéro pour absence de valeur, du zéro pour signifier un montant achat ou vente à zéro.
    L'absence de valeur se codifie bien NULL. Je n'ai rien à redire à ce sujet.

    d) je ne suis pas d'accord avec SergioMaster sur la suppression du teste. Cela permet de réduire le nombre de lignes à l'affichage.
    Mais comme je l'ai indiqué au paragraphe b), il aurait été plus judicieux de préfixer par l'alias de la table, les colonnes que l'on teste.

    e) les parenthèses dans votre requête ne servent strictement à rien.
    Vous alourdissez l'écriture de votre requête sans que cela apporte une meilleure compréhension.

    f) en ce qui me concerne, j'aime bien que l'on présente les requêtes sus forme lisible, de ce genre :
    Code firebird : 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
    with cte as (
      select dat,
             fac,
             fou,
             sec,
             pro,
             mar,
             cho,
             far,
             coi,
             qta,
             null as bon,
             null as clt,
             null as qtv
        from ach
       where num=1
     
       Union all
     
      select dat,
             null as fac,
             null as fou,
             sec,
             pro,
             mar,
             cho,
             far,
             coi,
             null as qta,
             bon,
             clt,
             qte as qtv
        from ven
       where num=1
    )
    select *
      from cte
     where  qta is not null
        or  qtv is not null
    ;

    g) je suis d'accord avec la première remarque d'Escartefigue.
    Vous devez effectuer une jointure entre vos achats et vos ventes afin de ne pas cumuler "des navets avec des carottes".

    h) je veux bien que l'on stocke le solde précédent, à la seule condition que celui-ci concerne une période sur laquelle vous ne reviendrez plus jamais. Par exemple, le solde du client pour la période comptable de l'année précédente.
    Comme l'année comptable a été traitée, et quelle a été validée, cette information sert de base pour vos calculs de l'année courante.
    Dans ce cas, vous n'aurez aucun problème dans l'intégrité de vos données.
    Mais si à chaque lancement de votre requête, vous venez modifier ce solde précédent, celui-ci sera faux !

    Comme il a déjà été indiqué dans d'autres sujets, si vous avez besoin de recalculer le solde, faites le avec une View.

    z) En résumé, nous ne sommes pas capable de répondre à votre demande car nous n'avons pas tous les justificatifs à notre disposition.

    Cordialement.
    Artemus24.
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. [AC-2007] Champ calculé dans une requête
    Par Chris 81 dans le forum Requêtes et SQL.
    Réponses: 16
    Dernier message: 02/09/2011, 14h40
  2. Ré utiliser des champs calculés dans une requête
    Par boby62423 dans le forum Développement
    Réponses: 6
    Dernier message: 11/03/2011, 16h43
  3. Champs calculés dans une requête
    Par fmu74 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 03/12/2008, 15h29
  4. Récupérer la valeur des champs calculés dans une requète SQL dans vba
    Par FrédéricCM dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 28/06/2006, 16h29
  5. Champ calculé dans une requête
    Par HUÏEZ Fabienne dans le forum Access
    Réponses: 3
    Dernier message: 08/12/2005, 12h31

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