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

Autres SGBD Discussion :

[LO Base] Une requête récalcitrante


Sujet :

Autres SGBD

  1. #1
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut [LO Base] Une requête récalcitrante
    Bonjour.

    Je suis en train d'adapter une base de données Access en LibreOffice Base et je butte sur une requête MS que je n'arrive pas à "convertir" pour LO :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT R_GRAND_LIVRE.CSU_NUM, R_GRAND_LIVRE.CSU_LIB, Sum(R_GRAND_LIVRE.CSU_DBT), Sum(R_GRAND_LIVRE.CSU_CDT),
    IIf([CSU_DBT]>[CSU_CDT],[CSU_DBT]-[CSU_CDT],IIf([CSU_DBT]=0,[CSU_CDT]=0,0)),
    IIf([CSU_CDT]>[CSU_DBT],[CSU_CDT]-[CSU_DBT],IIf([CSU_DBT]=0,[CSU_DBT]=0,0))
    FROM R_GRAND_LIVRE
    GROUP BY R_GRAND_LIVRE.CSU_NUM, R_GRAND_LIVRE.CSU_LIB
    ORDER BY R_GRAND_LIVRE.CSU_NUM;
    Comme indiqué dans divers tutoriaux, j'ai utilisé les instructions CASE mais l'enregistrement de cette requête est impossible : erreur de syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT "CSU_NUM", "CSU_LIB", SUM( "CSU_DBT" ), SUM( "CSU_CDT" ),
    CASE WHEN "CSU_DBT" > "CSU_CDT" THEN "CSU_DBT" - "CSU_CDT" WHEN "CSU_DBT" = 0 THEN "CSU_CDT" = 0 ELSE 0 END,
    CASE WHEN "CSU_CDT" > "CSU_DBT" THEN "CSU_CDT" - "CSU_DBT" WHEN "CSU_DBT" = 0 THEN "CSU_DBT" = 0 ELSE 0 END
    FROM "R_GRAND_LIBRE"
    GROUP BY "CSU_NUM", "CSU_LIB"
    ORDER BY "CSU_NUM" ASC;
    Merci d'avance.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 790
    Points
    30 790
    Par défaut
    C'est un peu normal que la requête soit refusée... parce qu'elle est incompréhensible.
    L'erreur se trouve dans cette portion de code : CASE ... WHEN "CSU_DBT" = 0 THEN "CSU_CDT" = 0 ... END.
    L'expression qui suit le THEN ne peut être une expression logique.

    Il faudrait exécuter la requête originale sous Access pour savoir ce qu'elle retourne dans ce cas particulier (ou qu'un spécialiste d'Access passe par là ) et adapter la requête pour une syntaxe plus conforme.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Avec Access la requête fonctionne parfaitement, elle me donne le résultat escompté mais il n'empêche que son formatage m'intrigue puisqu'il ne correspond pas aux formules originales que j'avais faites dans Calc.

    Il s'agit d'une balance faite à partir du grand livre qui permet de calculer le solde.

    CSU_DBT = Débit
    CSU_CDT = Crédit

    Formulation tableur :

    F1 : Débit (CSU_DBT)
    G1 : Crédit (CSU_CDT)

    H1 : Solde débit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(CSU_DBT>CSU_CDT,CSU_DBT-CSU_CDT,SI(ET(CSU_DBT=0,CSU_CDT=0),"",0))
    J1 : Solde crédit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Solde CDT =SI(ET(CSU_CDT>=CSU_DBT,OU(CSU_DBT<>0,CSU_CDT<>0)),CSU_CDT-CSU_DBT,"")
    Ce sont donc ces deux formules tableur que je veux retranscrire en SQL.

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 790
    Points
    30 790
    Par défaut
    Traduction littérale des expressions de tableur :
    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
    -- SI(CSU_DBT>CSU_CDT,CSU_DBT-CSU_CDT,SI(ET(CSU_DBT=0,CSU_CDT=0),"",0))
    case when CSU_DBT > CSU_CDT
            then CSU_DBT - CSU_CDT
        when CSU_DBT = 0 and CSU_CDT = 0
            then null
        else 0
    end
     
    -- SI(ET(CSU_CDT>=CSU_DBT,OU(CSU_DBT<>0,CSU_CDT<>0)),CSU_CDT-CSU_DBT,"")
    case when CSU_CDT >= CSU_DBT
            and (   CSU_DBT <> 0
                or  CSU_CDT <> 0
                )
            then CSU_CDT - CSU_DBT
        else null
    end
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Alors ça ne fonctionne pas. Message d'erreur : impossible de charger le contenu des données. Mais ça vient déjà peut-être de moi. Comme la requête Access comprend des aliases à l'origine, je les ai ajoutés mais je ne suis pas sûr qu'ils se formulent comme je l'ai fait derrière les case.

    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
    SELECT
    PLA_NUM,
    PLA_LIB,
    SUM( CSU_DBT ),
    SUM( CSU_CDT ),
     
    case when CSU_DBT > CSU_CDT
            then CSU_DBT - CSU_CDT
        when CSU_DBT = 0 and CSU_CDT = 0
            then null
        else 0
    end AS BAL_DEBIT,
     
    case when CSU_CDT >= CSU_DBT
            and (   CSU_DBT <> 0
                or  CSU_CDT <> 0
                )
            then CSU_CDT - CSU_DBT
        else null
    end AS BAL_CREDIT
     
    FROM R_GRAND_LIVRE
    GROUP BY PLA_NUM, PLA_LIB
    ORDER BY PLA_NUM ASC;
    J'ai modifié aussi certains noms de champs car j'avais fait une erreur (en copiant-collant dans mon premier message, pas dans mes tests.

    Sinon la requête de base, sans les 2 colonnes ajoutées fonctionne normalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
    PLA_NUM,
    PLA_LIB,
    SUM( CSU_DBT ),
    SUM( CSU_CDT )
    FROM R_GRAND_LIVRE
    GROUP BY PLA_NUM, PLA_LIB
    ORDER BY PLA_NUM ASC;

  6. #6
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Alors j'ai fini par comprendre ce qui n'allait pas. Dans les champs conditionnels, contrairement à Access, il fallait définir la fonction sur Somme pour les 2 colonnes (Access lui définit le truc tout seul sur Expression). Ce qui donne :

    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
    SELECT
    PLA_NUM,
    PLA_LIB,
    SUM( CSU_DBT ),
    SUM( CSU_CDT ),
     
    SUM(case when CSU_DBT > CSU_CDT
            then CSU_DBT - CSU_CDT
        when CSU_DBT = 0 and CSU_CDT = 0
            then 0
        else 0
    end) AS BAL_DEBIT,
     
    SUM(case when CSU_CDT >= CSU_DBT
            and (   CSU_DBT <> 0
                or  CSU_CDT <> 0
                )
            then CSU_CDT - CSU_DBT
        else 0
    end) AS BAL_CREDIT
     
    FROM R_GRAND_LIVRE
    GROUP BY PLA_NUM, PLA_LIB
    ORDER BY PLA_NUM ASC;
    Techniquement elle fonctionne mais les résultats des calculs ne sont pas conformes à ce qui est attendu. Je vais regarder où j'ai commis une erreur...

  7. #7
    Membre régulier Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 94
    Points
    94
    Par défaut
    Je pense avoir trouvé la solution.

    J'ai segmenté ma requête en deux parties.

    1. La balance, sans le calcul des soldes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT
    PLA_NUM AS PLA_NUM,
    PLA_LIB AS PLA_LIB,
    SUM( CSU_DBT ) AS CSU_DBT,
    SUM( CSU_CDT ) AS CSU_CDT
    FROM R_GRAND_LIVRE
    GROUP BY PLA_NUM, PLA_LIB
    ORDER BY PLA_NUM ASC
    Néanmoins, si je crée la requête pour le calcul des soldes à partir de celle-ci, ça plante. J'ai donc enregistré cette balance sous forme de vue :

    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
    SELECT
    PLA_NUM AS PLA_NUM,
    PLA_LIB AS PLA_LIB,
    SUM( CSU_DBT ) AS CSU_DBT,
    SUM( CSU_CDT ) AS CSU_CDT
    FROM ( SELECT COM_DATE, COM_LIB, PLA_NUM, PLA_LIB, CSU_DBT, CSU_CDT
    FROM ( SELECT T_COMPTES.JTY_ID, T_JOURNAUX_TY.JTY_LIB, T_COMPTES.COM_PCE, T_COMPTES.COM_DATE, T_COMPTES.COM_REF, T_COMPTES.COM_LIB, T_PLAN.PLA_NUM, T_PLAN.PLA_LIB, T_COMPTES_SUB.CSU_DBT, T_COMPTES_SUB.CSU_CDT
    FROM T_COMPTES_SUB, T_COMPTES, T_JOURNAUX_TY, T_PLAN
    WHERE T_COMPTES_SUB.COM_ID = T_COMPTES.COM_ID
    AND T_COMPTES.JTY_ID = T_JOURNAUX_TY.JTY_ID
    AND T_COMPTES_SUB.PLA_ID = T_PLAN.PLA_ID )
    AS R_JOURNAL
    GROUP BY COM_DATE, COM_LIB, PLA_NUM, PLA_LIB, CSU_DBT, CSU_CDT )
    AS R_GRAND_LIVRE
    GROUP BY PLA_NUM, PLA_LIB
    ORDER BY PLA_NUM ASC
    2. Les soldes débiteur et créditeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
    PLA_NUM AS PLA_NUM,
    PLA_LIB AS PLA_LIB,
    CSU_DBT AS CSU_DBT,
    CSU_CDT AS CSU_CDT,
    CASE WHEN CSU_DBT > CSU_CDT THEN CSU_DBT - CSU_CDT WHEN CSU_DBT = 0 AND CSU_CDT = 0 THEN NULL ELSE 0 END AS SOLDE_DBT,
    CASE WHEN CSU_CDT >= CSU_DBT AND ( CSU_DBT <> 0 OR CSU_CDT <> 0 ) THEN CSU_CDT - CSU_DBT ELSE NULL END AS SOLDE_CDT
    FROM V_BALANCE
    ORDER BY PLA_NUM ASC
    Là tout est ok.

    Merci pour le coup de main sur les conditions.

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

Discussions similaires

  1. Problème avec une requête récalcitrante
    Par mister3957 dans le forum Développement
    Réponses: 15
    Dernier message: 03/07/2015, 14h10
  2. Une requête récalcitrante
    Par supertoms dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 14/04/2008, 20h26
  3. Comment appeler une requête d'une autre base
    Par remi59 dans le forum Access
    Réponses: 1
    Dernier message: 17/11/2005, 10h40
  4. Une requête récalcitrante...
    Par decour dans le forum Access
    Réponses: 9
    Dernier message: 18/10/2005, 19h00
  5. une requête basée sur un seul critère ?
    Par rangernoir dans le forum Access
    Réponses: 5
    Dernier message: 07/09/2005, 18h53

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