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

 Firebird Discussion :

comment créer une jointure


Sujet :

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 comment créer une jointure
    Bonjour à tous,

    j'ai 2 tables "ACH" et "VEN" qui ont un champ commun "PRO". j'ai une autre table STK contenant les champs suivant (pro,des, qta,qtv,qtr,pua,mon) qui recoit le résultat de la jointure des 2 tables précédente dans cet ordre :

    PRO: champs de référence qui doit être commun au 2 table
    pua: correspondant à la valeur du champ "pua" de "ACH"
    QTA: correspondant à la valeur du champ "QTA" de "ACH"
    QTV: correspondant à la valeur du champ "QTV" de "VEN"
    QTR:égale à la valeur de QTA-QTA (j'ai oublie de le définir comme champs calculé)
    mon:égale à la valeur de QTR-PUA (j'ai oublie de le définir comme champs calculé)
    merci à tous

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    comme description de tables , on fait mieux !

    il s'agit non pas d'une jointure mais d'une union des 2 Tables , bien qu'on ne sache pas vraiment d'où vienne la désignation !
    encore une fois parce que j'ai suivi les différents sujets , je sais que cette dernière vient d'une table PRO , seule désignation serait obtenu par JOIN
    je vous ai déjà donné le code SQL suivant


    Tout est flou dans votre BDD exemple :
    -PUA mais lequel choisir quand vous avez fait plusieurs achats !! parce que si l'on a bien lu vos différents posts et pas que ce dernier on s'aperçoit qu'il peut y avoir plusieurs achats d'un même produits (ceci étant suggéré par la DATE)

    pour vous donner un exemple plus précis , voici une base (perfectible) qui permettrait une gestion de stock simple , et également un mode de présentation des tables avant de poser une question

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
     
    CREATE GENERATOR GEN_ACHATS_ID;
    CREATE GENERATOR GEN_PRODUITS_ID;
    CREATE GENERATOR GEN_VENTES_ID;
    /******************** DOMAINS *********************/
     
     
    /******************** TABLES **********************/
    // je pense que cela se passe de commentaires 
    CREATE TABLE ACHATS
    (
      ID_ACHAT Bigint NOT NULL, // Clé unique géré par trigger
      DATE_ACHAT Date NOT NULL,
      NUM_PRODUIT Bigint NOT NULL,
      QUANTITE Integer DEFAULT 0,
      PRIX_UNITAIRE Numeric(15,2),
      CONSTRAINT PK_ACHATS_1 PRIMARY KEY (ID_ACHAT)
    );
     
    CREATE TABLE PRODUITS
    (
      NUM_PRODUIT Bigint NOT NULL, // Clé unique géré par trigger
      CODE_PRODUIT Varchar(30) NOT NULL,
      DESIGNATION Varchar(80),
      INITIAL Integer DEFAULT 0,
      ENTREES Integer DEFAULT 0,
      SORTIES Integer DEFAULT 0,
      DERNIER_PUA Numeric(15,2),  // utile ?
      CONSTRAINT PK_PRODUITS_1 PRIMARY KEY (NUM_PRODUIT)
    );
    CREATE TABLE VENTES
    (
      ID_VENTE Bigint NOT NULL, // Clé unique géré par trigger
      DATE_VENTE Date NOT NULL,  // on préférera peut être un TimeStamp ?
      NUM_PRODUIT Bigint NOT NULL,
      QUANTITE Integer DEFAULT 0,
      PRIX_VENTE Numeric(15,2),
      CONSTRAINT PK_VENTES_1 PRIMARY KEY (ID_VENTE)
    );
     
     
    /******************** TRIGGERS ********************/
    // Génération de la clé unique Achats
    SET TERM ^ ;
    CREATE TRIGGER ACHATS_BI FOR ACHATS ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.ID_ACHAT IS NULL) THEN
        NEW.ID_ACHAT = GEN_ID(GEN_ACHATS_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_ACHATS_ID, 0);
        if (tmp < new.ID_ACHAT) then
          tmp = GEN_ID(GEN_ACHATS_ID, new.ID_ACHAT-tmp);
      END
    END^
    SET TERM ; ^
     
    // Mise à jour de la table PRODUITS lors d''un nouvel achat validé (entrées)
     SET TERM ^ ;
    CREATE TRIGGER ACHAT_AI0 FOR ACHATS ACTIVE
    AFTER INSERT POSITION 0
    AS 
    BEGIN 
    	UPDATE PRODUITS SET ENTREES=ENTREES+NEW.QUANTITE,DERNIER_PUA=NEW.PRIX_UNITAIRE
    	WHERE NUM_PRODUIT=NEW.NUM_PRODUIT;
    END^
    SET TERM ; ^
     
    //Génération de la clé unique Produits
    SET TERM ^ ;
    CREATE TRIGGER PRODUITS_BI FOR PRODUITS ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.NUM_PRODUIT IS NULL) THEN
        NEW.NUM_PRODUIT = GEN_ID(GEN_PRODUITS_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_PRODUITS_ID, 0);
        if (tmp < new.NUM_PRODUIT) then
          tmp = GEN_ID(GEN_PRODUITS_ID, new.NUM_PRODUIT-tmp);
      END
    END^
    SET TERM ; ^
     
    // Mise à jour de la Tables Produits pour une vente Validée (Sortie)
    SET TERM ^ ;
    CREATE TRIGGER VENTES_AI0 FOR VENTES ACTIVE
    AFTER INSERT POSITION 0
    AS 
    BEGIN 
    	UPDATE PRODUITS SET SORTIES=SORTIES-NEW.QUANTITE
    	WHERE NUM_PRODUIT=NEW.NUM_PRODUIT;	 
    END^
    SET TERM ; ^
     
    // génération clé Unique VENTES
    SET TERM ^ ;
    CREATE TRIGGER VENTES_BI FOR VENTES ACTIVE
    BEFORE INSERT POSITION 0
    AS
    DECLARE VARIABLE tmp DECIMAL(18,0);
    BEGIN
      IF (NEW.ID_VENTE IS NULL) THEN
        NEW.ID_VENTE = GEN_ID(GEN_VENTES_ID, 1);
      ELSE
      BEGIN
        tmp = GEN_ID(GEN_VENTES_ID, 0);
        if (tmp < new.ID_VENTE) then
          tmp = GEN_ID(GEN_VENTES_ID, new.ID_VENTE-tmp);
      END
    END^
    SET TERM ; ^
     
    // Ajout de contraintes
    ALTER TABLE ACHATS ADD CONSTRAINT FK_ACHATS_1
      FOREIGN KEY (NUM_PRODUIT) REFERENCES PRODUITS (NUM_PRODUIT) ON UPDATE NO ACTION ON DELETE NO ACTION;
    CREATE UNIQUE INDEX IDX_ACHATS1 ON ACHATS (NUM_PRODUIT,DATE_ACHAT);
    ALTER TABLE PRODUITS ADD STOCK COMPUTED BY (INITIAL+ENTREES-SORTIES);
    ALTER TABLE PRODUITS ADD MONTANT COMPUTED BY (STOCK*DERNIER_PUA);
     
    // Création des Index
    CREATE UNIQUE INDEX IDX_PRODUITS1 ON PRODUITS (CODE_PRODUIT);
    CREATE UNIQUE INDEX IDX_VENTES1 ON VENTES (NUM_PRODUIT,DATE_VENTE);
    CREATE UNIQUE INDEX IDX_VENTES2 ON VENTES (DATE_VENTE,NUM_PRODUIT);
    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
    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
    j'ai suivi les conseils, mais le code n'est pas accépté, il me signale toujours des erreurs.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        with c as
       (select pro,des,pua,sum(qte) as qto,0 as qta,0 as qtv from ACH where  fac='00000' 
    union
    select pro,des,pua,0 as qto,sum(qte) as qta,0 as qtv from ACH where  fac<>'00000'   
    union
    select pro,des,pua,0 as qto,0 as qta,sum(qte) as qtv from ven
    group by 1,2,3) 
    insert into STK (pro,des,pua,qto,qta,qtv) values (:pro,:des,:pua,:qto,:qta,:qtv)
    les erreurs:
    tocken unknow 'insert' ligne 7
    not agregate...clause group by

    aussi je voudrais intégrer un indexe supplémentaire que j'ai crée 'indexe1' pour accéléré la recherche j'ai essaye la commande "plan" pareil ça marche pas

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Dans le code , j'ai peut être fait des erreurs au niveau des GROUP BY
    nul n'est parfait
    mais vous n'avez pas suivi mon code non plus
    en reprenant raison pour laquelle j'ai râler sur le fait que vous ouvriez plusieurs sujets pour la même problèmatique


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       WITH c AS
       (SELECT pro,des,pua,sum(qte) AS qto,SUM(0) AS qta,SUM(0) AS qtv FROM ACH WHERE  fac='00000'
    GROUP BY 1,2,3  // besoin ???
    union
    SELECT pro,des,pua,SUM(0) AS qto,sum(qte) AS qta,SUM(0) AS qtv FROM ACH WHERE  fac<>'00000' 
    GROUP BY 1,2,3 // besoin ???
     
    union
    SELECT pro,des,pua,SUM(0) AS qto,SUM(0) AS qta,sum(qte) AS qtv FROM ven
    GROUP BY 1,2,3 // besoin ???
    )
    d'ailleurs je ne sais pas si la CTE a besoin d'un group by puisqu'on en utilise un ensuite , cela demanderai une étude de performances

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       WITH c AS
       (SELECT pro,des,pua,qte AS qto,0 AS qta,0 AS qtv FROM ACH WHERE  fac='00000'
    union
    SELECT pro,des,pua,0,qte,0 FROM ACH WHERE  fac<>'00000' 
    union
    SELECT pro,des,pua,0 AS qto,0 AS qta,qte AS qtv FROM VEN WHERE  fac<>'00000')
    devrait être aussi efficace ?


    Mais vous , vous n'avez pas suivi pour le insert
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO STK (pro,des,pua,qto,qta,qtv)  SELECT pro,des,0.00,sum(qto),sum(qta),sum(qtv) FROM C GROUP BY 1,2,3;
    sinon a quoi servirai la CTE ?

    RESTE le problème de DES et PUA dans ce nouveau cas !!
    encore une nouveauté par rapport aux autres sujets que vous avez postés , enfin en partie .
    Après vous avoir dit que mettre la table PRO(duit) hors de la SGBD était une erreur , si celle -ci était dans la même SGBD que les 'mouvements' cela ne poserait aucun problèmes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO STK (pro,des,pua,qto,qta,qtv)  SELECT pro,Pro.des,pro.pua,sum(qto),sum(qta),sum(qtv) FROM C JOIN PRO ON c.pro=PRO.code GROUP BY 1,2,3;
    [/CODE]

    je vous avais indiqué d'essayer en utilisant une vue sur la table externe

    de plus vous remarquerez , avec la structure de BDD que j'ai mise dans ce trend , que ceci n'aurait plus aucune utilité
    Vous persistez à ne pas nous fournir votre DESCRIPTION des Tables (voir DDL) et écouter nos conseils . Personnellement je pense que je ne suivrais plus vos posts , ma patience a des limites
    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

  5. #5
    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
    Execuse moi si je suis pas aussi intélligent que toi, mais de quelle description tu parle ç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
    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
    CREATE TABLE "VEN" 
    (
      "DAT"	DATE NOT NULL,
      "BON"	VARCHAR(20) CHARACTER SET ISO8859_1 not null,
      "ORD"	integer NOT NULL,
      "ANA"	VARCHAR(20) CHARACTER SET ISO8859_1,
      "PRO"	VARCHAR(20) CHARACTER SET ISO8859_1,
      "DES"	VARCHAR(255) CHARACTER SET ISO8859_1,
      "QTE"	NUMERIC(14, 5),
      "PUV"	NUMERIC(14, 2), 
      "MHT"	NUMERIC(14, 2),
      "COI"	SMALLinteger,
      "CDR"	NUMERIC(14, 5),
      "BEN"	NUMERIC(14, 2),
      "FAC"	VARCHAR(20) CHARACTER SET ISO8859_1,
      "HEU"	TIMESTAMP,
      "DEN"	NUMERIC(14, 5),
      "OBS"	VARCHAR(255) CHARACTER SET ISO8859_1,
      "UME"	VARCHAR(30),
      "ED1"	NUMERIC(14, 4),
      "ED2"	NUMERIC(14, 4),
      "ED3"	NUMERIC(14, 4),
      "QTP"	NUMERIC(14, 5),
      "PUA"	NUMERIC(14, 5),
      "QTD"	NUMERIC(14, 5),
      "QTR"	NUMERIC(14, 5),
      "DAP"	DATE,
     PRIMARY KEY ("DAT", "BON", "ORD")
    );
     
     
     
    CREATE TABLE "STK" 
    (
      "DAT"	DATE NOT NULL,
      "PRO"	VARCHAR(10) CHARACTER SET ISO8859_1 not null,
      "PUA"	NUMERIC(14, 5) not null,
      "DES"	VARCHAR(255) CHARACTER SET ISO8859_1,
      "QTO"	NUMERIC(14,5),
      "QTA"	NUMERIC(14,5),
      "QTV"	NUMERIC(14,5),
      "QTR"	NUMERIC(14,5),
      "MON"	NUMERIC(14,2),
     PRIMARY KEY ("DAT", "PRO","PUA")
    );


    je ne cherche nullement à exquiver les questionns, j'ai pas compris c'est tout.

    vous me donnez trop d'informations à la fois et je me retrouve plus, comme par exemple la commande "PLAN" que j'arrive pas à intégré dans la recherche.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    [quote=chekkal;7560959]Execuse moi si je suis pas aussi intélligent que toi, mais de quelle description tu parle ça:[/QUOTE ]
    Oui
    je cherche nullement à exquiver les questionns, j'ai pas compris c'est tout.
    ce n'est pas répondre à mes questions qui me gène (ce n'est pas moi le demandeur) , c'est remettre en question votre structure de base de données

    par exemple : je trouve bizarre d'avoir des renseignements inhérent au produit dans une table VENTE (seul le code produit devrait faire un lien a une table PRODUIT voir le DDL proposé)


    vous me donnez trop d'informations à la fois et je me retrouve plus, comme par exemple la commande "PLAN" que j'arrive pas à intégré dans la recherche.
    je vous donne des pistes , la commande PLAN ne peut s'appliquer que s'il y a des index autre que Primaire
    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

  7. #7
    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
    j'ai crée un index supplementaire "index1"

    j'ai utilisé le code que tu m'a donné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with C as
    (select pro,des,pua, sum(qte) as qte, 0 as qta, 0 as qtv from ACH where (fac='00000')and(dat between datd and data)
    union
    select pro,des,pua, 0 as qte, sum(qte) as qta, 0 as qtv from ACH where (fac<>'00000')and(dat between datd and data)
    union
    select pro,des,pua, 0 as qte, 0 as qta,sum(qte) as qtv from VEN where (dat between datd and data) 
    )
     
    insert into STK (pro,des,pua,qto,qta,qtv) select pro,des,pua,qto,qta,qtv from C  group by 1,2,3
    il signale erreur
    insert unkown
    je suis pas encore arrivé à tester
    PLAN

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    ne serait-ce pas plutôt à cause des BETWEEN ?
    1 - DATA est un mot réservé
    2- il manque les : devant les noms des paramètres

    faites au moins l'effort de recopier correctement !!
    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
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par chekkal Voir le message
    j'ai crée un index supplementaire "index1"
    je ne suis pas encore arrivé à tester
    PLAN
    sans indiquer la description de l'index , difficile montrer comment PLAN fonctionne
    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

  10. #10
    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
    j'ai appliqué ce
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH C AS
    (SELECT pro,des,pua, sum(qte) AS qte, 0 AS qta, 0 AS qtv FROM ACH WHERE (fac='00000')AND(dat BETWEEN :datd AND :datr)
    union
    SELECT pro,des,pua, 0 AS qte, sum(qte) AS qta, 0 AS qtv FROM ACH WHERE (fac<>'00000')AND(dat BETWEEN :datd AND :datr)
    union
    SELECT pro,des,pua, 0 AS qte, 0 AS qta,sum(qte) AS qtv FROM VEN WHERE (dat BETWEEN :datd AND :datr) 
    )
     ///à partir d'ici il accepte aucun code en plus
    INSERT INTO STK (pro,des,pua,qto,qta,qtv) SELECT pro,des,pua,qto,qta,qtv FROM C  GROUP BY 1,2,3
    il me signale toujours les même erreurs.
    "unknow insert "..ect

    pour l'index suplementaire
    "index1" sur ACH on "pro,pua,des"
    "index2" sur VEN on "pro,pua,des"

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    il semblerai que le INSERT INTO n'accepte pas la CTE ainsi autant pour moi la syntaxe où l'on déclare la CTE avant n'est valable que pour un
    SELECT * FROM CTE
    http://stackoverflow.com/questions/1...sert-statement

    donc la syntaxe serait alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    INSERT INTO STK (pro,des,pua,qto,qta,qtv) 
    WITH C AS
    (SELECT pro,des,pua, sum(qte) AS qte, 0 AS qta, 0 AS qtv FROM ACH WHERE (fac='00000')AND(dat BETWEEN :datd AND :datr)
    union
    SELECT pro,des,pua, 0 AS qte, sum(qte) AS qta, 0 AS qtv FROM ACH WHERE (fac<>'00000')AND(dat BETWEEN :datd AND :datr)
    union
    SELECT pro,des,pua, 0 AS qte, 0 AS qta,sum(qte) AS qtv FROM VEN WHERE (dat BETWEEN :datd AND :datr) 
    )
     
    SELECT pro,des,pua,qto,qta,qtv FROM C  GROUP BY 1,2,3
    cependant ces colonnes des et pua me gênent toujours de même que la double requête sur ACH , au risque de me répéter votre structure de BDD
    est très exotique , je n'ai jamais rencontré une gestion de stock de ce genre !
    (et pourtant j'en connais un rayon à ce sujet)

    à lire votre description de fichier ,la désignation d'un produit peut changer à chaque achat, chaque vente etc... Je conçois que l'on puisse gérer un stock en fonction des dates d'entrées (FIFO) mais là votre structure me dépasse

    NOTE :
    les requêtes sur ACH peuvent certainement être changées en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pro,des,pua,SUM(IIF(fac='0000',qte,0)) as qte,SUM(IIF(fac='0000',0,qte)) as qta,0 as qtv FROM ACH WHERE dat BETWEEN :datd AND :datr
    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
    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
    j'ai réessayé avec le code que tu m'as donné et ça marche bien je te remercie
    maitenant reste le problème de "PLAN" comment l'intégrer dans la recherche sachant que j'ai crée un index supplementaire pour la table ACH "index1" et table VEN "index2"

    pour
    cependant ces colonnes des et pua me gênent toujours de même que la double requête sur ACH , au risque de me répéter votre structure de BDD
    est très exotique , je n'ai jamais rencontré une gestion de stock de ce genre !
    (et pourtant j'en connais un rayon à ce sujet)

    à lire votre description de fichier ,la désignation d'un produit peut changer à chaque achat, chaque vente etc... Je conçois que l'on puisse gérer un stock en fonction des dates d'entrées (FIFO) mais là votre structure me dépasse
    une explication s'impose:
    mon application est multidossier qui veut dire quelle est destinée aussi bien à des entreprises qu'a des bureau de service financiers (comme des bureau de comptabilité).

    - pour le "DES" il désigne le libelle d'un produit correspondant un dossier spécifique

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par chekkal Voir le message
    une explication s'impose:
    mon application est multidossier qui veut dire quelle est destinée aussi bien à des entreprises qu'a des bureau de service financiers (comme des bureau de comptabilité).
    - pour le "DES" il désigne le libelle d'un produit correspondant un dossier spécifique
    il n'empêche , j'ai des gestions de stocks multi-dépôts avec gestion de l'emplacement physique des casiers , jamais il me serait venu à l'idée d'utiliser la désignation pour distinguer le crayon bleu de l'entreprise A du crayon bleu de l'entreprise B ! pour moi crayon bleu est un produit unique , stocké dans deux endroits et même si par le plus grand des hasards ces entreprises avaient deux désignation/prix j'aurais fait un fichier codeproduit/depot/désignation/prix

    pour ce qui est du plan c'est pourtant simple

    faites un SELECT pro,des,pua FROM ACH ORDER by 1,2,3
    et vous verrez que le plan n'est pas sur le primary index mais sur index1
    (merci firebird de l'avoir fait automatiquement et de , en général, utiliser le meilleur )
    Alors que si vous faites un simple SELECT pro,des,pua FROM ACH d'après vous ?
    Bref faites des tests,par exemple ,avec des SELECT ... WHERE pour vous rendre compte
    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
    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
    je te remércie pour l'astuce.

    cependant, j'ai un probleme avec la procedure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      insert into STK (pro,des,qto,qta,qtv) 
    with C as
    (
    select pro,des,SUM(iif (fac='00000',qte,0)) as qto,SUM(iif (fac='00000',0,qte)) as qta from ACH  where (pro is not null)and(dat between :DATD and :DATR) 
    union
    select pro,des,0 as qto,0 as qta, sum(qte) as qtv from VEN where (pro is not null)and(dat between :DATD and :DATR) )
    select pro,des,sum(qto) as qto,sum(qta) as qta,sum(qtv) as qtv from C group by 1,2,3
    au niveau de la table VEN, tout les enregistrements avec la valeur (qte=1) n'est pas ajouté à QTV

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    au niveau de la table VEN, tout les enregistrements avec la valeur (qte=1) n'est pas ajouté
    avez vous vérifié vraiment votre code ?
    l'union est bancale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pro,des,SUM(iif (fac='00000',qte,0)) AS qto,SUM(iif (fac='00000',0,qte)) AS qta FROM ACH
    4 colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pro,des,0 AS qto,0 AS qta, sum(qte) AS qtv FROM VEN WHERE (pro IS NOT NULL)AND(dat BETWEEN :DATD AND :DATR)
    5 colonnes
    je vous laisse deviner la suite

    au niveau de la table VEN, tout les enregistrements avec la valeur (qte=1) n'est pas ajouté à QTV
    avez vous seulement essayé de faire chaque select séparément ?

    seul vous, avez un jeu d'essai

    [EDIT] après avoir dormi dessus , il y a aussi autre chose qui peut clocher , je suis parti du principe qu'il ne pouvait y avoir de ventes sans achats , mais ce peut ne pas être le cas il faut donc faire une UNION 'totale'
    soit UNION ALL au lieu de UNION
    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

  16. #16
    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
    voilà tu commence à comprendre mon but.
    les différent possibilité:
    un stock ouverture "QTO" (avec ou sans) achat, (avec ou sans) vente
    un achat "QTA" (avec ou sans) ouverture, (avec ou sans) vente
    une vente "QTV" (avec ou sans) ouverture, (avec ou sans) achat

    quoique en modifiant le code de cette manière ça marche aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     INSERT INTO STK (pro,des,qto,qta,qtv) 
    WITH C AS
    (
    SELECT pro,des,SUM(iif (fac='00000',qte,0)) AS qto,SUM(iif (fac='00000',0,qte)) AS qta, 0 as qtv FROM ACH  WHERE (pro IS NOT NULL)AND(dat BETWEEN :DATD AND :DATR)  group by 1,2
    union
    SELECT pro,des,0 AS qto,0 AS qta, sum(qte) AS qtv FROM VEN WHERE (pro IS NOT NULL)AND(dat BETWEEN :DATD AND :DATR) group by 1,2)
    SELECT pro,des,sum(qto) AS qto,sum(qta) AS qta,sum(qtv) AS qtv FROM C GROUP BY 1,2
    ça marche aussi.

  17. #17
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    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 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    voilà tu commence à comprendre mon but.
    après maints efforts de ma part et lecture de tous les posts ce qui indique une question mal posée !

    quoique en modifiant le code de cette manière ça marche aussi
    Ce qui prouve que vous n'aviez pas lu ou mal mes propositions du 07/11/2013, 10h47
    Citation Envoyé par SergioMaster
    d'ailleurs je ne sais pas si la CTE a besoin d'un group by puisqu'on en utilise un ensuite , cela demanderai une étude de performances
    concernant la CTE

    Je suis "presque" sûr que le group by n'est pas nécessaire pour les SELECT de l'union (contrairement peut être au UNION ALL)

    et qu'est-ce que cela change à cette constatation ?
    Citation Envoyé par chekkal
    au niveau de la table VEN, tout les enregistrements avec la valeur (qte=1) n'est pas ajouté à QTV
    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

Discussions similaires

  1. [ABAP] Comment créer une requête avec jointure
    Par roadster62 dans le forum SAP
    Réponses: 1
    Dernier message: 21/02/2006, 16h04
  2. comment créer une image sous forme d'eclipse(ronde)
    Par unix27 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 15/05/2005, 22h16
  3. [débutant] Comment créer une base ?
    Par laffreuxthomas dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 14/12/2004, 22h12
  4. Comment optimiser une jointure ?
    Par seb_asm dans le forum Administration
    Réponses: 21
    Dernier message: 25/06/2004, 16h42
  5. Comment créer une Table dans 1 Bdd ACCESS avec Builder??
    Par makandja dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/03/2004, 20h21

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