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 :

table CTE et update or insert


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut table CTE et update or insert
    Bonsoir,
    J'essai de faire une mise à jour via update or insert utilisant des CTE (si j'ai bien compris ^^) seulement j'ai une parsing error sur mon "update"

    voici ma requete :
    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
    begin
    with
    /**************************************************************************/
    /* fournit la date de la derniere facture du mois passé en paramètre */
    date_facture as (
      select  t_entetefacture.datecreation as datefacture, t_entetefacture.numclifour as numclifour
        from t_entetefacture inner join t_clifour on (t_entetefacture.numclifour = t_clifour.numclifour)
        where extract(month from t_entetefacture.datecreation) = :mois and t_clifour.reglement = 'T')
        ,
    /***************************************************************************/
    /* fournit la somme des montants des factures du mois fournit en paramètre */
        somme_factures as (
      select sum(t_entetefacture.mtpayablettc) as montant, t_clifour.numclifour from t_entetefacture
        inner join t_clifour on (t_entetefacture.numclifour = t_clifour.numclifour)
        where extract(month from t_entetefacture.datecreation) = :mois and t_clifour.reglement = 'T' group by t_clifour.numclifour)
    /***************************************************************************/
    update or insert into t_reglement ( t_reglement.numclifour,t_reglement.moderegle, t_reglement.dateecheance,
                                        t_reglement.montant, T_reglement.banque, t_reglement.codbanque, t_reglement.codguichet,
                                        t_reglement.numcompte,t_reglement.clerib, t_reglement.typecriture)
    values(
        select  t_clifour.numclifour, t_clifour.reglement, dateadd(day, -1,
                dateadd(month, t_clifour.echeance + 1, '01.' || :mois ||'.'|| extract(year from (
                 select first 1 date_facture.datefacture from date_facture order by date_facture.datefacture desc)))) as dateecheance,
                somme_factures.montant, t_banques.banque, t_banques.codebanque, t_banques.codeguichet, t_banques.numcompte,t_banques.cle,
                'G'
                from t_clifour  inner join t_banques on (t_clifour.numclifour = t_banques.numclifour)
                            inner join somme_factures on (t_clifour.numclifour = t_somme_factures.numclifour)
                            inner join date_facture on (t_clifour.numclifour = date_facture.numclifour)
                where t_banques.modregleactif = 'O')
    matching (t_reglement.numclifour,  t_reglement.dateecheance);
    end
    est ce possible ? est ce que je m'y prend mal (surement ) ?

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    Citation Envoyé par eldrad95 Voir le message
    est ce possible ?
    normalement oui
    as tu essayé ta requete hors procédure d'abord
    peut être est ce l'outil que tu utilise qui fait "parsing error"
    pas Firebird, car ce n'est pas un message d'erreur Firebird ça
    essaie via un script dans isql

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    alors,
    j'ai utilisé isql comme vous me l'avez indiqué et j'ai cette erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    -SQL error code = -104
    -Token unknown - line 20, column 1
    -update
    edit :
    j'ai contourné mon problème en ajoutant des variables, et en les utilisant ensuite dans le update or insert

    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
    CREATE PROCEDURE PST_AJOUT_REGLEMENTS (
        mois integer)
    as
    declare variable numclifour bigint;
    declare variable reglement integer;
    declare variable dateecheance date;
    declare variable montant decimal(15,2);
    declare variable banque varchar(30);
    declare variable codebanque varchar(10);
    declare variable codeguichet varchar(10);
    declare variable numcompte varchar(20);
    declare variable cle varchar(10);
    declare variable typecriture integer;
    begin
    with
    /**************************************************************************/
    /* fournit la date de la derniere facture du mois passé en paramètre */
    date_facture as (
      select  t_entetefacture.datecreation as datefacture, t_entetefacture.numclifour as numclifour
        from t_entetefacture inner join t_clifour on (t_entetefacture.numclifour = t_clifour.numclifour)
        where extract(month from t_entetefacture.datecreation) = :mois and t_clifour.reglement = 'T')
        ,
    /***************************************************************************/
    /* fournit la somme des montants des factures du mois fournit en paramètre */
        somme_factures as (
      select sum(t_entetefacture.mtpayablettc) as montant, t_clifour.numclifour as numclifour from t_entetefacture
        inner join t_clifour on (t_entetefacture.numclifour = t_clifour.numclifour)
        where extract(month from t_entetefacture.datecreation) = :mois and t_clifour.reglement = 'T' group by t_clifour.numclifour)
    /***************************************************************************/
     
        select  t_clifour.numclifour, t_clifour.reglement, dateadd(day, -1,
                dateadd(month, t_clifour.echeance + 1, '01.' || :mois ||'.'|| extract(year from (
                 select first 1 date_facture.datefacture from date_facture order by date_facture.datefacture desc)))) as dateecheance,
                somme_factures.montant, t_banques.banque, t_banques.codebanque, t_banques.codeguichet, t_banques.numcompte,t_banques.cle,
                'G'
                from t_clifour  inner join t_banques on (t_clifour.numclifour = t_banques.numclifour)
                            inner join somme_factures on (t_clifour.numclifour = somme_factures.numclifour)
                            inner join date_facture on (t_clifour.numclifour = date_facture.numclifour)
                where t_banques.modregleactif = 'O'
                into
                :numclifour,
                :reglement,
                :dateecheance,
                :montant,
                :banque,
                :codebanque,
                :codeguichet,
                :numcompte,
                :cle,
                :typecriture;
     
    update or insert into t_reglement ( t_reglement.numclifour,t_reglement.moderegle, t_reglement.dateecheance,
                                        t_reglement.montant, T_reglement.banque, t_reglement.codbanque, t_reglement.codguichet,
                                        t_reglement.numcompte,t_reglement.clerib, t_reglement.typecriture)
    values(:numclifour, :reglement,  :dateecheance,  :montant, :banque, :codebanque,  :codeguichet, :numcompte, :cle,  :typecriture)
    matching (t_reglement.numclifour,  t_reglement.dateecheance);
    end
    voilà ce que j'ai fait. encore merci .
    edit 2 :

    je viens de remarqué que j'ai tout faut, dans mon script je ne vais avoir qu'une seule ligne de prise en compte. je vais donc voir pour modifier ça .

  4. #4
    Membre Expert

    Homme Profil pro
    Consultant spécialité Firebird
    Inscrit en
    Mai 2002
    Messages
    2 342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 342
    Par défaut
    Citation Envoyé par makowski Voir le message
    normalement oui
    Pardon j'avais mal lu

    Non ce n'est pas possible d'utiliser les CTE comme ça
    Les CTE ne font que des SELECT

    par contre tu peux utiliser des CTE au sein d'un update,insert ou delete

    pour être clair :
    ça ce n'est pas permis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WITH CTE1 (F1) AS (SELECT F1 FROM T1)
    UPDATE T2 SET F1=(SELECT F1 FROM CTE1 WHERE CTE1.F1=T2.F1)
    mais ça oui c'est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T2 SET F1=(WITH CTE1 (F1) AS (SELECT F1 FROM T1) SELECT F1 FROM CTE1 WHERE CTE1.F1=T2.F1)

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    j'ai pondu un truc que firebird accepte mais je suis vraiment pas sur de moi est ce correct comme code ? :

    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
    CREATE PROCEDURE PST_AJOUT_REGLEMENTS (
        mois integer)
    as
    declare variable numclifour bigint;
    declare variable reglement integer;
    declare variable dateecheance date;
    declare variable montant decimal(15,2);
    declare variable banque varchar(30);
    declare variable codebanque varchar(10);
    declare variable codeguichet varchar(10);
    declare variable numcompte varchar(20);
    declare variable cle varchar(10);
    declare variable typecriture integer;
    begin
    FOR
     
    with
    /**************************************************************************/
    /* fournit la date de la derniere facture du mois passé en paramètre */
    date_facture as (
      select  t_entetefacture.datecreation as datefacture, t_entetefacture.numclifour as numclifour
        from t_entetefacture inner join t_clifour on (t_entetefacture.numclifour = t_clifour.numclifour)
        where extract(month from t_entetefacture.datecreation) = :mois and t_clifour.reglement = 'T')
        ,
    /***************************************************************************/
    /* fournit la somme des montants des factures du mois fournit en paramètre */
        somme_factures as (
      select sum(t_entetefacture.mtpayablettc) as montant, t_clifour.numclifour as numclifour from t_entetefacture
        inner join t_clifour on (t_entetefacture.numclifour = t_clifour.numclifour)
        where extract(month from t_entetefacture.datecreation) = :mois and t_clifour.reglement = 'T' group by t_clifour.numclifour)
    /***************************************************************************/
     
        select  t_clifour.numclifour, t_clifour.reglement, dateadd(day, -1,
                dateadd(month, t_clifour.echeance + 1, '01.' || :mois ||'.'|| extract(year from (
                 select first 1 date_facture.datefacture from date_facture order by date_facture.datefacture desc)))) as dateecheance,
                somme_factures.montant, t_banques.banque, t_banques.codebanque, t_banques.codeguichet, t_banques.numcompte,t_banques.cle,
                'G'
                from t_clifour  inner join t_banques on (t_clifour.numclifour = t_banques.numclifour)
                            inner join somme_factures on (t_clifour.numclifour = somme_factures.numclifour)
                            inner join date_facture on (t_clifour.numclifour = date_facture.numclifour)
                where t_banques.modregleactif = 'O'
                into
                :numclifour,
                :reglement,
                :dateecheance,
                :montant, 
                :banque,
                :codebanque,
                :codeguichet,
                :numcompte,
                :cle,
                :typecriture
    do
    begin
    update or insert into t_reglement ( t_reglement.numclifour,t_reglement.moderegle, t_reglement.dateecheance,
                                        t_reglement.montant, T_reglement.banque, t_reglement.codbanque, t_reglement.codguichet,
                                        t_reglement.numcompte,t_reglement.clerib, t_reglement.typecriture)
    values(:numclifour, :reglement,  :dateecheance,  :montant, :banque, :codebanque,  :codeguichet, :numcompte, :cle,  :typecriture)
    matching (t_reglement.numclifour,  t_reglement.dateecheance);
    end
    end
    j'ai cru comprendre qu'avec le for chaque ligne de resultat allait etre passées dans le update ou insert.
    est ce correct ?

  6. #6
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    Citation Envoyé par makowski Voir le message
    Pardon j'avais mal lu

    Non ce n'est pas possible d'utiliser les CTE comme ça
    Les CTE ne font que des SELECT

    par contre tu peux utiliser des CTE au sein d'un update,insert ou delete

    pour être clair :
    ça ce n'est pas permis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WITH CTE1 (F1) AS (SELECT F1 FROM T1)
    UPDATE T2 SET F1=(SELECT F1 FROM CTE1 WHERE CTE1.F1=T2.F1)
    mais ça oui c'est possible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE T2 SET F1=(WITH CTE1 (F1) AS (SELECT F1 FROM T1) SELECT F1 FROM CTE1 WHERE CTE1.F1=T2.F1)
    je n'arrive pas a transposer cet exemple avec un "update or insert".
    quelqu'un saurait me dire comme faire ?

  7. #7
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    246
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 246
    Par défaut
    bon, j'ai trouvé d'ou venait mon problème, de l'architecture de ma base qui ne garantissait pas l'unicité du compte par defaut, une fois que j'ai corrigé ça (avec une table de reférencement plutôt qu'un champs oui/non ) tout à fonctionné.

    Encore merci .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] requete update et insert dans table de liaison
    Par rollingboy dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 21/06/2014, 18h34
  2. Update or Insert dans plusieurs tables
    Par Linio dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 18/08/2010, 12h54
  3. Réponses: 1
    Dernier message: 09/10/2008, 11h58
  4. Update et insert dans une table de backup
    Par PunkMetal dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/08/2008, 05h41
  5. requete update et insertion dans 2 tables
    Par croke dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 28/05/2008, 12h45

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