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

Développement SQL Server Discussion :

Requête sur une Vue multi Bases [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut Requête sur une Vue multi Bases
    Bonjour,

    J'ai créé une vue qui me permet de récupérer une série d'information via une requête SQL.
    Cette vue a été créée sur toutes mes bases (au sein de la même instance SQL Serveur)avec le même nom Transaction_RepView

    J'arrive à l'exécuter sur les bases distinctes nom de mes base 004 à 011

    Mon soucis est que je ne sais pas configurer une requête multi bases.

    Quelqu'un pour m'aider.

    Par avance merci.

    Philippe

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour,

    Vous pouvez appeler la vue d'une base différente du contexte d'exécution en spécifiant un nom en trois parties : [base].[schéma].[Vue]

    donc par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT ...
    FROM [004].dbo.Transaction_RepView
    UNION ALL
    SELECT ...
    FROM [005].dbo.Transaction_RepView
    ...
    sinon, en fonction du besoin, vous pouvez aussi utiliser la procédure non documentée Sp_MSForEachDB

  3. #3
    Invité
    Invité(e)
    Par défaut
    J'ai ceci dans mes notes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    EXECUTE sp_msforeachdb 'use [?]; IF EXISTS ( SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ''UneTable'' )
    SELECT ''?'' as DatabaseName, * FROM dbo.UnTable'
    Dernière modification par al1_24 ; 11/03/2020 à 15h19. Motif: Balises CODE

  4. #4
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut La requête ne fonctionne pas.
    Citation Envoyé par aieeeuuuuu Voir le message
    bonjour,

    Vous pouvez appeler la vue d'une base différente du contexte d'exécution en spécifiant un nom en trois parties : [base].[schéma].[Vue]

    donc par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT ...
    FROM [004].dbo.Transaction_RepView
    UNION ALL
    SELECT ...
    FROM [005].dbo.Transaction_RepView
    ...
    sinon, en fonction du besoin, vous pouvez aussi utiliser la procédure non documentée Sp_MSForEachDB

    J'ai testé votre réponse, mais j'ai un message d'erreur :

    Voici la requête que j'ai exécutée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM  [004].[dbo].[GbkmutViewTransaction_RepView]
    UNION ALL
    SELECT *
    FROM  [005].[dbo].[GbkmutViewTransaction_RepView]
    Msg 457, Level 16, State 1, Line 2
    La conversion implicite de la valeur char vers char ne peut pas être effectuée, car le classement de la valeur n'est pas résolu en raison d'un conflit de classement.

    Je vous ajoute la requête qui est faite sur ma vue qui elle fonctionne base par base :

    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
     
    SELECT     TOP (100) PERCENT dbo.gbkmut.CompanyCode AS Company, ISNULL(dbo.gbkmut.freefield2, ' ') AS CompanyOrigine, dbo.gbkmut.bkjrcode AS Year, 
                          dbo.gbkmut.periode AS Period, dbo.gbkmut.datum AS date, dbo.gbkmut.dagbknr AS Journal, dbo.gbkmut.reknr, dbo.grtbk.Class_07 AS CostCatReel, 
                          dbo.grtbk.Class_09 AS CostCatBud, dbo.kstpl.Class_01 AS MFMUGF, dbo.kstpl.Class_02, dbo.kstpl.Class_03 AS Donor, dbo.gbkmut.kstplcode AS CostCenter, 
                          dbo.gbkmut.kstdrcode AS CostUnit, dbo.gbkmut.oms25 AS Description, ROUND(dbo.gbkmut.bdr_val, 2) AS Amountcurr, dbo.gbkmut.valcode AS CurrencyTransaction, 
                          dbo.gbkmut.koers AS RateTransaction, ROUND(dbo.gbkmut.bdr_hfl, 2) AS Amount, dbo.gbkmut.CurrencyCode AS CurrencyCompany, 
                          dbo.gbkmut.faktuurnr AS Reference, dbo.gbkmut.syscreated AS CreationDate, dbo.gbkmut.syscreator AS Creatorcode, dbo.humres.fullname AS Creator, 
                          dbo.gbkmut.sysmodified AS ModificationDate, dbo.gbkmut.sysmodifier AS Modifier, dbo.gbkmut.Rate, dbo.gbkmut.warehouse, dbo.gbkmut.bud_vers, 
                          dbo.gbkmut.transtype, dbo.gbkmut.transsubtype
    FROM         dbo.gbkmut INNER JOIN
                          dbo.grtbk ON dbo.gbkmut.reknr = dbo.grtbk.reknr INNER JOIN
                          dbo.kstpl ON dbo.gbkmut.kstplcode = dbo.kstpl.kstplcode INNER JOIN
                          dbo.kstdr ON dbo.gbkmut.kstdrcode = dbo.kstdr.kstdrcode INNER JOIN
                          dbo.humres ON dbo.gbkmut.syscreator = dbo.humres.res_id
    WHERE     (dbo.gbkmut.reknr > 599999) AND (dbo.gbkmut.bkjrcode = 2020) AND (dbo.gbkmut.transsubtype NOT IN ('R', 'S')) AND (dbo.gbkmut.bud_vers IS NULL) AND 
                          (dbo.gbkmut.periode BETWEEN 1 AND 12) AND (dbo.gbkmut.dagbknr NOT IN ('903', '909', '915', 'NULL'))
    ORDER BY dbo.humres.costcenter, CostUnit, Period, date, dbo.gbkmut.reknr, dbo.gbkmut.bdr_hfl
    Pouvez-vous m'aider ?

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    vous avez un classement différent entre les deux vues pour au moins une colonne.

    vous avez probablement un classement par défaut différent au niveau des bases.

    Vous pouvez spécifier le classement à utiliser, avec la clause COLLATE par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT 
        LaColonne COLLATE FRENCH_CI_AI
    ,...

  6. #6
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut
    J'ai enlevé tous les Order by, donc plus de classement, et j'ai toujours la même erreur.
    Donc çà doit venir d'autre chose.

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    1/ les ORDER BY n’ont aucun sens dans une vue, donc oui, enlevez les; Faites si besoin un ORDER BY dans la requête finale. Profitez-en pour enlever les TOP 100 PERCENT.

    2/ c'est bien le classement (Collation) qui est en cause. chaque colonne de type caractère à un classement de défini (explicitement, ou classement par défaut de la base de données, ou à défaut du serveur)
    que vous renvoie cette requête ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT name, collation_name
    FROM sys.databases

  8. #8
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut Retour de 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
     
    name	collation_name
    master	SQL_Latin1_General_CP1_CI_AS
    tempdb	SQL_Latin1_General_CP1_CI_AS
    model	SQL_Latin1_General_CP1_CI_AS
    msdb	SQL_Latin1_General_CP1_CI_AS
    004	French_CI_AS
    005	Latin1_General_CI_AS
    006	Latin1_General_CI_AS
    007	Latin1_General_CI_AS
    008	Latin1_General_CI_AS
    009	Latin1_General_CI_AS
    010	Latin1_General_CI_AS
    011	Latin1_General_CI_AS
    Voici ce que j'ai en retour de la requête.

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    il y a donc bien un classement différent entre la base 004 et les autres. il faut donc choisir le classement qui convient pour l'UNION ALL

  10. #10
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut Union All
    Je comprends, mais que dois-je mettre dans le UNION ALL ???
    Là je coince...

    En fait, ce que je souhaite, c'est obtenir le résultat global de toutes mes requêtes individuelles en une seule passe.

    Donc quels sont les critères à citer dans le UNION ALL ?
    Dois-je citer tous les champs de ma requête avec l'indication de "LaColonne" COLLATE FRENCH_CI_AI and, ...

    Désolé de vous ennuyer, mais là, c'est hors de ma compétence SQL.

    Merci de votre réponse.

  11. #11
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par PhilouBilou59 Voir le message
    Dois-je citer tous les champs de ma requête avec l'indication de "LaColonne" COLLATE FRENCH_CI_AI and, ...
    C'est une solution. à faire uniquement pour les colonnes de types caractère. et uniquement pour la requête sur la vue de la base 004 devrait suffire, si vous spécifiez le même classement que dans les autres bases (Latin1_General_CI_AS)

    sinon, vous pouvez aussi modifier la vue dans la base [004] et faire de même pour que le classement corresponde à ceux des autres vues.

  12. #12
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut Le Collate me renvoie Unsupporter Data type
    Bonjour,

    J'ai tenté de la faire sur ma vue de la société 004
    en indiquant le collate, mais çà me renvoie <Unsupported Data Type>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [004].[dbo].[gbkmut].[CompanyCode] COLLATE FRENCH_CI_AI  AS Company,
    Du coup je l'ai fait dans la société 005 avec le collate de la société 004 mais çà me renvoie également <Unsupported Data Type>

    SELECT [005].[dbo].[gbkmut].[CompanyCode] COLLATE FRENCH_CI_AI AS Company,

    Que manque-t-il pour que çà fonctionne ?

  13. #13
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    c'est un message de SQL Server ??? quel est le message complet ?

    et quel est le type de la colonne ?

  14. #14
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut Finalement c'est bon
    Merci, finalement c'est bon, j'ai réussi, il fallait mettre également le COLLATE sur les zones en varchar.

    Il me reste un dernier problème.

    J'ai la zone 'dbo.grtbk.Class_07' et 'dbo.grtbk.Class_09' qui ont leur description dans une table AccountClasses

    Pour trouver la bonne information il faut que dans le premier cas la zone ClassID soit égale à 7 et dans ce cas
    le AccountClassCode doit être égale au 'dbo.grtbk.Class_07' pour que je trouve la Description.

    Dans le second cas la zone ClassID soit égale à 9 et dans ce cas
    le AccountClassCode doit être égale au 'dbo.grtbk.Class_09' pour que je trouve la zone Description.

    J'ai tenté de faire un truc du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select
          , Class_07 as CostCatReel
          , C1.Description_0 as CostCatReel_designation
          , Class_09 as CostCatBud
          , C2.Description_0 as CostCatBud_Designation
    from gbkmut
    full outer join AccountClasses C1
       on C1.ClassID = 7 and Class_07 = C1.AccountClassCode
    full outer join AccountClasses C2
       on C2.ClassID = 9 and Class_09 = C2.AccountClassCode
    Mais çà me renvoie des milliers de résultats.

    Or je ne veux de résultat que si j'ai une valeur dans gbkmut pour ces deux zones.

    En tous cas, merci pour votre aide, car çà m'a permis d'avancer à grands pas.

    Philippe

  15. #15
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 465
    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 465
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Du coup remplacez les deux jointures FULL OUTER par une jointure INNER ou LEFT OUTER selon le résultat souhaité
    INNER JOIN si vous ne voulez que les cas où il existe à la fois une valeur avec ClassID = 7 et une valeur avec ClassID = 9
    LEFT OUTER si vous voulez les éléments de la table gbkmut quoi qu'il arrive et les éléments pour ClassID = 7 et/ou ClassID = 9 facultativement si présents

  16. #16
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut La requête me renvoie 73304 ligne au lieu de 1600
    Je ne m'en sort pas.

    Voici la requête que j'ai créée :

    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
     
    SELECT     dbo.gbkmut.CompanyCode AS Company, ISNULL(dbo.gbkmut.freefield2, ' ') AS 'Company Origine', dbo.gbkmut.bkjrcode AS Year, dbo.gbkmut.periode AS Period, 
                          dbo.gbkmut.datum AS 'Date', dbo.gbkmut.dagbknr AS Journal, dbo.gbkmut.reknr AS Account, dbo.grtbk.Class_09 AS 'Cost Category Budget', 
                          C1.Description_0 AS 'Cost Category Budget Desrciption', dbo.grtbk.Class_07 AS 'Cost Category Reel', C2.Description_0 AS 'Cost Category Reel Description', 
                          dbo.kstpl.Class_01 AS 'MF / MU/ GF', C3.Description AS 'MF / MU / GD description', dbo.kstpl.Class_02 AS Project, C4.Description AS 'Project Description', 
                          dbo.kstpl.Class_03 AS Donor, C5.Description AS 'Donor Description', dbo.gbkmut.kstplcode AS 'Cost Center', dbo.gbkmut.kstdrcode AS 'CostUnit', 
                          dbo.gbkmut.oms25 AS 'Transaction Description', ROUND(dbo.gbkmut.bdr_val, 2) AS 'Currency Amount', dbo.gbkmut.valcode AS 'Currency Transaction', 
                          dbo.gbkmut.koers AS 'Rate Transaction', ROUND(dbo.gbkmut.bdr_hfl, 2) AS 'Amount in Currency Company', dbo.gbkmut.CurrencyCode AS 'Currency Company', 
                          dbo.gbkmut.faktuurnr AS Reference, dbo.gbkmut.syscreated AS 'Creation Date', dbo.gbkmut.syscreator AS 'Creator code', dbo.humres.fullname AS 'Creator Name', 
                          dbo.gbkmut.sysmodified AS 'Modification Date', dbo.gbkmut.sysmodifier AS Modifier, dbo.humres.fullname AS 'Modifier Name', dbo.gbkmut.Rate AS 'Rate Company', 
                          dbo.gbkmut.warehouse AS 'Warehouse', dbo.gbkmut.bud_vers AS 'Budget Version', dbo.gbkmut.transtype AS 'Transaction Type', 
                          dbo.gbkmut.transsubtype AS 'Sub Transaction type'
    FROM         dbo.gbkmut INNER JOIN
                          dbo.grtbk ON dbo.gbkmut.reknr = dbo.grtbk.reknr INNER JOIN
                          dbo.kstpl ON dbo.gbkmut.kstplcode = dbo.kstpl.kstplcode INNER JOIN
                          dbo.kstdr ON dbo.gbkmut.kstdrcode = dbo.kstdr.kstdrcode INNER JOIN
                          dbo.humres ON dbo.gbkmut.syscreator = dbo.humres.res_id INNER JOIN
                          dbo.humres AS humres_1 ON dbo.gbkmut.sysmodifier = dbo.humres.res_id LEFT OUTER JOIN
                          dbo.AccountClasses AS C1 ON C1.ClassID = 9 AND dbo.grtbk.Class_09 = C1.AccountClassCode LEFT OUTER JOIN
                          dbo.AccountClasses AS C2 ON C2.ClassID = 7 AND dbo.grtbk.Class_07 = C2.AccountClassCode LEFT OUTER JOIN
                          dbo.CostcenterClasses AS C3 ON C3.ClassID = 1 AND dbo.grtbk.Class_01 = C3.CostcenterClassCode LEFT OUTER JOIN
                          dbo.CostcenterClasses AS C4 ON C4.ClassID = 2 AND dbo.grtbk.Class_02 = C4.CostcenterClassCode LEFT OUTER JOIN
                          dbo.CostcenterClasses AS C5 ON C5.ClassID = 1 AND dbo.grtbk.Class_03 = C5.CostcenterClassCode
    WHERE     (dbo.gbkmut.reknr > 599999) AND (dbo.gbkmut.bkjrcode = 2020) AND (dbo.gbkmut.transsubtype NOT IN ('R', 'S')) AND (dbo.gbkmut.bud_vers IS NULL) AND 
                          (dbo.gbkmut.periode BETWEEN 1 AND 12) AND (dbo.gbkmut.dagbknr NOT IN ('903', '909', '915', 'NULL'))
    La requête s'exécute correctement, mais au lieu de me retourner environ 1600 ligne elle me retourne 73000 ligne
    j'ai à peu près 50 ligne dédoublées pour une ligne...

    J'ai essayé avec LEFT JOIN, FULL OUTER JOIN, LEFT OUTER JOIN, RIGHT JOIN cela ne change rien.
    Je pense que j'ai du faire une connerie au niveau de ma rechercher des descriptions C1 à C5 ou dans la jointure finale...
    C'est dommage, il ne me manque que ça pour finir ma requête.

    Merci d'avance de votre aide.

    Philippe

  17. #17
    Invité
    Invité(e)
    Par défaut
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbo.gbkmut.dagbknr NOT IN ('903', '909', '915', 'NULL')
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbo.gbkmut.dagbknr NOT IN ('903', '909', '915') AND dbo.gbkmut.dagbknr IS NOT NULL

  18. #18
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut Toujour le même résultat
    J'ai ajouté le IS NOT NULL, mais j'ai toujours le même résultat.

    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
     
    SELECT     dbo.gbkmut.CompanyCode AS Company, ISNULL(dbo.gbkmut.freefield2, ' ') AS 'Company Origine', dbo.gbkmut.bkjrcode AS Year, dbo.gbkmut.periode AS Period, 
                          dbo.gbkmut.datum AS 'Date', dbo.gbkmut.dagbknr AS Journal, dbo.gbkmut.reknr AS Account, dbo.grtbk.Class_09 AS 'Cost Category Budget', 
                          C1.Description_0 AS 'Cost Category Budget Desrciption', dbo.grtbk.Class_07 AS 'Cost Category Reel', C2.Description_0 AS 'Cost Category Reel Description', 
                          dbo.kstpl.Class_01 AS 'MF / MU/ GF', C3.Description AS 'MF / MU / GD description', dbo.kstpl.Class_02 AS Project, C4.Description AS 'Project Description', 
                          dbo.kstpl.Class_03 AS Donor, C5.Description AS 'Donor Description', dbo.gbkmut.kstplcode AS 'Cost Center', dbo.gbkmut.kstdrcode AS CostUnit, 
                          dbo.gbkmut.oms25 AS 'Transaction Description', ROUND(dbo.gbkmut.bdr_val, 2) AS 'Currency Amount', dbo.gbkmut.valcode AS 'Currency Transaction', 
                          dbo.gbkmut.koers AS 'Rate Transaction', ROUND(dbo.gbkmut.bdr_hfl, 2) AS 'Amount in Currency Company', dbo.gbkmut.CurrencyCode AS 'Currency Company', 
                          dbo.gbkmut.faktuurnr AS Reference, dbo.gbkmut.syscreated AS 'Creation Date', dbo.gbkmut.syscreator AS 'Creator code', dbo.humres.fullname AS 'Creator Name', 
                          dbo.gbkmut.sysmodified AS 'Modification Date', dbo.gbkmut.sysmodifier AS Modifier, dbo.humres.fullname AS 'Modifier Name', dbo.gbkmut.Rate AS 'Rate Company', 
                          dbo.gbkmut.warehouse AS 'Warehouse', dbo.gbkmut.bud_vers AS 'Budget Version', dbo.gbkmut.transtype AS 'Transaction Type', 
                          dbo.gbkmut.transsubtype AS 'Sub Transaction type'
    FROM         dbo.gbkmut INNER JOIN
                          dbo.grtbk ON dbo.gbkmut.reknr = dbo.grtbk.reknr INNER JOIN
                          dbo.kstpl ON dbo.gbkmut.kstplcode = dbo.kstpl.kstplcode INNER JOIN
                          dbo.kstdr ON dbo.gbkmut.kstdrcode = dbo.kstdr.kstdrcode INNER JOIN
                          dbo.humres ON dbo.gbkmut.syscreator = dbo.humres.res_id INNER JOIN
                          dbo.humres AS humres_1 ON dbo.gbkmut.sysmodifier = dbo.humres.res_id LEFT OUTER JOIN
                          dbo.AccountClasses AS C1 ON C1.ClassID = 9 AND dbo.grtbk.Class_09 = C1.AccountClassCode LEFT OUTER JOIN
                          dbo.AccountClasses AS C2 ON C2.ClassID = 7 AND dbo.grtbk.Class_07 = C2.AccountClassCode LEFT OUTER JOIN
                          dbo.CostcenterClasses AS C3 ON C3.ClassID = 1 AND dbo.grtbk.Class_01 = C3.CostcenterClassCode LEFT OUTER JOIN
                          dbo.CostcenterClasses AS C4 ON C4.ClassID = 2 AND dbo.grtbk.Class_02 = C4.CostcenterClassCode LEFT OUTER JOIN
                          dbo.CostcenterClasses AS C5 ON C5.ClassID = 1 AND dbo.grtbk.Class_03 = C5.CostcenterClassCode
    WHERE     (dbo.gbkmut.reknr > 599999) AND (dbo.gbkmut.bkjrcode = 2020) AND (dbo.gbkmut.transsubtype NOT IN ('R', 'S')) AND (dbo.gbkmut.bud_vers IS NULL) AND 
                          (dbo.gbkmut.periode BETWEEN 1 AND 12) AND (dbo.gbkmut.dagbknr NOT IN ('903', '909', '915')) AND (dbo.gbkmut.dagbknr IS NOT NULL)
    A priori le problème se situe sur les zones ci-dessous, car la requête me retourne des valeurs NULL ou Unknown, alors que dans la table
    dbo.CostcenterClasses j'ai bien des description en face de chaque code.
    Je dois donc avoir une erreur. Mais là je suis crux

    MF/MU/GF MF/MU/GF Description Project Project Description Donor Donor Description

    GF NULL THEUNION NULL THEUNION Unknown
    GF NULL THEUNION NULL THEUNION Unknown
    Merci de votre aide.

    Philippe

  19. #19
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2020
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Février 2020
    Messages : 18
    Par défaut Problème de valeurs null ou unknon résolu, reste le nombre de lignes
    Bon, j'ai trouvé pourquoi j'avais des valeurs null ou unknown, je n'avais pas correctement spécifié la zone

    Il ne me reste plus à trouve pourquoi la requête me retourne 80000 lignes au lieu de 1600 environ.

    Voici la dernière requête lancée

    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     dbo.gbkmut.CompanyCode AS Company, ISNULL(dbo.gbkmut.freefield2, ' ') AS 'Company Origine', dbo.gbkmut.bkjrcode AS Year, dbo.gbkmut.periode AS Period, 
                          dbo.gbkmut.datum AS 'Date', dbo.gbkmut.dagbknr AS Journal, dbo.gbkmut.reknr AS Account, dbo.grtbk.Class_09 AS 'Cost Category Budget', 
                          C1.Description_0 AS 'Cost Category Budget Description', dbo.grtbk.Class_07 AS 'Cost Category Reel', C2.Description_0 AS 'Cost Category Reel Description', 
                          dbo.kstpl.Class_01 AS 'MF / MU/ GF', C3.Description AS 'MF / MU / GD description', dbo.kstpl.Class_02 AS Project, C4.Description AS 'Project Description', 
                          dbo.kstpl.Class_03 AS Donor, C5.Description AS 'Donor Description', dbo.gbkmut.kstplcode AS 'Cost Center', dbo.gbkmut.kstdrcode AS CostUnit, 
                          dbo.gbkmut.oms25 AS 'Transaction Description', ROUND(dbo.gbkmut.bdr_val, 2) AS 'Currency Amount', dbo.gbkmut.valcode AS 'Currency Transaction', 
                          dbo.gbkmut.koers AS 'Rate Transaction', ROUND(dbo.gbkmut.bdr_hfl, 2) AS 'Amount in Currency Company', dbo.gbkmut.CurrencyCode AS 'Currency Company', 
                          dbo.gbkmut.faktuurnr AS Reference, dbo.gbkmut.syscreated AS 'Creation Date', dbo.gbkmut.syscreator AS 'Creator code', dbo.humres.fullname AS 'Creator Name', 
                          dbo.gbkmut.sysmodified AS 'Modification Date', dbo.gbkmut.sysmodifier AS Modifier, dbo.humres.fullname AS 'Modifier Name', dbo.gbkmut.Rate AS 'Rate Company', 
                          dbo.gbkmut.warehouse AS 'Warehouse', dbo.gbkmut.transtype AS 'Transaction Type', dbo.gbkmut.transsubtype AS 'Sub Transaction type'
    FROM         dbo.gbkmut INNER JOIN
                          dbo.grtbk ON dbo.gbkmut.reknr = dbo.grtbk.reknr INNER JOIN
                          dbo.kstpl ON dbo.gbkmut.kstplcode = dbo.kstpl.kstplcode INNER JOIN
                          dbo.kstdr ON dbo.gbkmut.kstdrcode = dbo.kstdr.kstdrcode INNER JOIN
                          dbo.humres ON dbo.gbkmut.syscreator = dbo.humres.res_id INNER JOIN
                          dbo.humres AS humres_1 ON dbo.gbkmut.sysmodifier = dbo.humres.res_id LEFT OUTER JOIN
                          dbo.AccountClasses AS C1 ON C1.ClassID = 9 AND dbo.grtbk.Class_09 = C1.AccountClassCode LEFT OUTER JOIN
                          dbo.AccountClasses AS C2 ON C2.ClassID = 7 AND dbo.grtbk.Class_07 = C2.AccountClassCode LEFT OUTER JOIN
                          dbo.CostcenterClasses AS C3 ON C3.ClassID = 1 AND dbo.kstpl.Class_01 = C3.CostcenterClassCode LEFT OUTER JOIN
                          dbo.CostcenterClasses AS C4 ON C4.ClassID = 2 AND dbo.kstpl.Class_02 = C4.CostcenterClassCode LEFT OUTER JOIN
                          dbo.CostcenterClasses AS C5 ON C5.ClassID = 3 AND dbo.kstpl.Class_03 = C5.CostcenterClassCode
    WHERE     (dbo.gbkmut.reknr > 599999) AND (dbo.gbkmut.bkjrcode = 2020) AND (dbo.gbkmut.transsubtype NOT IN ('R', 'S')) AND (dbo.gbkmut.bud_vers IS NULL) AND 
                          (dbo.gbkmut.periode BETWEEN 1 AND 12) AND (dbo.gbkmut.dagbknr NOT IN ('903', '909', '915')) AND (dbo.gbkmut.dagbknr IS NOT NULL)
    Merci de votre aide.

    Philippe

  20. #20
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Sans connaissance du modele, difficile de vous aider.

    Cette multiplication du nombre de ligne provient certainement d'une jointure mal faite, où il manquerait des conditions.

    je trouve par exemple cette double jointure sur la même table suspecte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dbo.humres ON dbo.gbkmut.syscreator = dbo.humres.res_id INNER JOIN
                          dbo.humres AS humres_1 ON dbo.gbkmut.sysmodifier = dbo.humres.res_id
    vous pouvez emplacer les colonnes du select par un COUNT(*) et commenter/ puis décommenter les jointures au fur et à mesure pour voir celle(s) qui pose(nt) problème

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

Discussions similaires

  1. Requête sur une vue et temps de réponse
    Par shaun_the_sheep dans le forum SQL
    Réponses: 47
    Dernier message: 20/02/2012, 14h21
  2. Requête sur une vue indexée
    Par VladTepes dans le forum Développement
    Réponses: 0
    Dernier message: 10/08/2010, 18h37
  3. [WD15] Requête sur une vue.
    Par thierrybatlle dans le forum WinDev
    Réponses: 19
    Dernier message: 03/06/2010, 10h14
  4. Problème de requête sur une vue Hibernate
    Par littlebear dans le forum Hibernate
    Réponses: 16
    Dernier message: 05/01/2009, 15h48
  5. Requête sur une base access dans excel
    Par adrien.gendre dans le forum Excel
    Réponses: 3
    Dernier message: 23/07/2007, 13h06

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