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

Requêtes et SQL. Discussion :

Exclure écritures réparties sur plusieurs lignes selon groupe de taille variable


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Exclure écritures réparties sur plusieurs lignes selon groupe de taille variable
    Bonjour,

    Je vous contacte car je ne suis pas certain d'identifier la meilleure solution pour répondre à un besoin au sein de mon équipe. Pour simplifier, nous faisons des analyses de saisies manuelles en compta, et nous aimerions exclure certaines écritures en nous bassant sur les comptes utilisés. Seulement dans le Grand Livre, les différentes parties d'une écriture sont réparties sur plusieurs lignes (le total de ces lignes devant faire 0), et je dois pouvoir identifier tous les comptes d'une écriture, et les comparer avec un groupe de comptes qui peut être de 2 jusqu'à N. Autre point qui m'embête un peu, c'est que dans les paramètres d'exclusion, on ne met pas nécessairement le numéro de compte en entier, mais parfois juste la classe ou un groupe. Par exemple: 4, 41, 411, etc. Dans ce cas là, ma requête doit être assez intelligente pour prendre en considération le compte 4110011 (les comptes ne font pas plus de 6 caractères).
    Et on n'exclut les écritures (identifiées via le Numéro de Pièce) que si l'intégralité des comptes qui la composent, font partie d'une combinaison définie dans la liste d'exclusion.

    Par exemple, si j'ai dans ma liste d'exclusion la paire 411/512 et que j'ai une écriture avec les comptes 411001, 512001 et 471000, alors je ne veux pas l'exclure. Par contre le fait qu'il y ait plusieurs fois un compte 411* ou 512* dans mon écriture n'a pas d'impact, si cela répond aux critères, je l'exclus.

    Autre challenge, j'aimerais trouver une solution sans VBA, autant que faire se peut (même si j'ai déjà fait une petite entorse).

    Actuellement, mon Grand Livre est dans une table dédiée, et ma liste d'exclusion dans une autre table.

    Voici un exemple de données:

    Nom : Exemple Data.PNG
Affichages : 168
Taille : 27,4 Ko

    Et de liste d'exclusion:

    Nom : Exemple exclusion.PNG
Affichages : 186
Taille : 3,1 Ko

    Mon idée est de:

    - Identifier tous les comptes utilisés par numéro de pièce, pour ne les compter qu'une fois,
    - Les regrouper dans une table temporaire, en mettant dans un seul champ, chaque compte (e.g. 411001, 512001, 621001)

    Sauf que cela ne semble pas bien marcher, car le nombre de comptes d'une écriture est de 2 à N. Si c'était tout le temps 2, ou un nombre fixe, je ferais une comparaison valeur par valeur. Mais déjà je ne vois pas comment le faire autrement qu'en VBA.

    Mes questions sont donc:

    - Est-ce que de créer cette table temporaire, en regroupant mes comptes dans un seul champ avec un séparateur est selon vous la façon la plus adaptée de répondre à mon problème ?
    - Est-ce que c'est possible de faire ce que je cherche sans VBA ?

    A un moment j'avais cherché une autre solution qui était de garder mon Grand Journal dans sa forme initiale, de faire une jointure avec ma table d'exclusion, le soucis étant que je peux avoir un compte qui est présent dans plusieurs groupes d'exclusion (e.g. 411/512 et 411/471), donc j'aurais dû boucler en VBA pour voir si en fonction du nombre de lignes dans une écriture, je trouvais le même groupe le même nombre de fois (ce qui normalement aurait signifié que tous les comptes d'une écriture faisaient partie d'un même groupe d'exclusion).

    Merci par avance!

  2. #2
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 348
    Points : 19 593
    Points
    19 593
    Billets dans le blog
    65
    Par défaut
    Bonsoir,

    Pourquoi ne pas utiliser une requête de non correspondance pour ne conserver que les Numéros de pièces pour lesquels au moins un cas ne répond pas au critère :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT T_GrandLivre.[Numéro Pièce]
    FROM T_GrandLivre
    WHERE Not Exists (select compte from T_ListeExclusion where T_GrandLivre.Compte like T_ListeExclusion.Compte & "*";)=True;

    En gros, si une des lignes ayant le même numéro de pièce ne répond pas au critère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T_GrandLivre.Compte like T_ListeExclusion.Compte & "*"
    On conserve le (Numéro de pièce]

    Le distinct, c'est pour ne pas répéter le numéro de pièce, et les tables se nomment "T_GrandLibre" et "T_ListeExclusion".

    Cdlt,

  3. #3
    Candidat au Club
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonsoir,


    Et merci pour la réponse!
    Le soucis est que l'exclusion marche par groupe, je ne suis pas sûr d'avoir été bien clair sur mon explication du coup.
    Du imaginons que j'ai la configuration suivante:


    Pièce Compte
    VT000001 422601
    VT000001 512001
    VT000001 600001


    Et que dans ma liste d'exclusion j'ai

    Compte Groupe
    422 1
    512 1
    600 2
    512 2


    Avec cette requête, la pièce VT000001 serait exclue, alors qu'elle devrait ne pas l'être car il y a 3 comptes utilisés pour cette écriture, et ces 3 comptes ne correspondent pas à un même groupe.
    Sachant que les groupes peuvent contenir 2 comptes ou N comptes, de même que chaque pièce.

    En regardant de plus près j'ai l'impression que seule l'utilisation d'array en VBA pourra permettre de résoudre ce problème, mais je voulais voir si juste en SQL on pouvait quelque chose d'efficace (et éventuellement plus tard le porter plus facilement sur un autre moteur).

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 348
    Points : 19 593
    Points
    19 593
    Billets dans le blog
    65
    Par défaut
    Rebonsoir,

    Oui vos explications sont bien détaillées mise à part le point concernant le numéro de pièce :

    VT000001

    est-ce que le denier caractère du code de la pièce correspond au groupe ou pas ?

    Sinon, je pense que vous pouvez vous en sortir avec des requêtes :

    Voilà comment je ferais :

    Une requête "R_GrandLivre X ListeExclusion" qui réalise le produit cartésien entre le grand livre et la liste des exclusions :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT T_GrandLivre.[Numéro Pièce], T_ListeExclusion.Groupe_Compte, T_GrandLivre.Compte, T_ListeExclusion.Compte AS CompteExclusion, ([T_GrandLivre].[Compte] Like [T_ListeExclusion].[Compte] & "*") AS Exclu
    FROM T_GrandLivre, T_ListeExclusion
    WHERE (((T_GrandLivre.[Numéro Pièce]) Like "*" & [Groupe_Compte]))
    ORDER BY T_GrandLivre.[Numéro Pièce], T_ListeExclusion.Groupe_Compte, T_GrandLivre.Compte, T_ListeExclusion.Compte;

    Le champ :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    ([T_GrandLivre].[Compte] Like [T_ListeExclusion].[Compte] & "*") AS Exclu

    Renvoie vrai si le compte est exclu.

    Une requête regroupement R_PiecesCpteExclus, basée sur la 1ère qui compte les exclusions par groupe pour un numéro de pièce :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT R_GrandLivreListeExclusion.[Numéro Pièce], R_GrandLivreListeExclusion.Groupe_Compte, -Sum([Exclu]) AS CpteExclus
    FROM R_GrandLivreListeExclusion
    GROUP BY R_GrandLivreListeExclusion.[Numéro Pièce], R_GrandLivreListeExclusion.Groupe_Compte
    HAVING (((-Sum([Exclu]))>0));

    Une requête R_PiecesCpteExclu, pour compter les comptes par Numéro de pièce :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_GrandLivre.[Numéro Pièce], Count(T_GrandLivre.Compte) AS CpteComptes
    FROM T_GrandLivre
    GROUP BY T_GrandLivre.[Numéro Pièce];
    Ensuite, il suffit de comparer les décomptes des 2 dernières requêtes en les liant sur le numéro de pièce, si les décomptes sont égaux on exclu...

    Cdlt,
    Fichiers attachés Fichiers attachés

  5. #5
    Expert éminent Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 273
    Points : 6 582
    Points
    6 582
    Par défaut
    User
    Pour ma part ce n'est pas un Grand-Livre sur lequel travaille lemanique. Ou alors ce n'est pas de la compta FR. C'est plus tôt un Journal de ventes.
    Sinon l'indice 1 de VT00001 n'a pas de relation avec le 1 de Groupe_compte.
    Les indices dans Groupe_compte permettent d'indiquer quels sont les num_compte qui appartiennent à un même schéma d'exclusion. Les comptes à exclure forment des duets, triplets, quartets, quintets, sextets, etc.
    Une solution en images.
    Images attachées Images attachées    

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 348
    Points : 19 593
    Points
    19 593
    Billets dans le blog
    65
    Par défaut
    Merci pour l'info

Discussions similaires

  1. Message réparti sur plusieurs lignes dans le MessageDlg()
    Par Naga2 dans le forum Composants VCL
    Réponses: 17
    Dernier message: 26/11/2016, 13h03
  2. [XL-2010] Copier/coller selon critère existant sur plusieurs lignes sur une même ligne
    Par Frs95 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 18/12/2014, 17h32
  3. [XL-2003] Recherche de lignes sur plusieurs feuilles selon 1 ou 2 critères (au choix)
    Par khroutchev dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/07/2013, 15h39
  4. Un form HTML peut-il être réparti sur plusieurs lignes ?
    Par ruza01 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 20/07/2009, 17h38

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