SQL : détecter les achats comptabilisés en double

La supervision des comptabilités d’un groupe vise à répondre à plusieurs objectifs dont la prévention des risques des erreurs et des fraudes.

Une des erreurs communes est la double comptabilisation de factures fournisseurs. Si les procédures sont chargées de limiter ce risque, la systémisation du contrôle complète plus efficacement le dispositif de prévention.

SELECT Requête1.CompteDeCodeEntité AS NbOccurrences, ECRITURES.CodeEntité, ECRITURES.JournalCode, ECRITURES.JournalLib, ECRITURES.EcritureNum, ECRITURES.EcritureDate, ECRITURES.CompteNum, ECRITURES.CompteLib, ECRITURES.CompteAuxNum, ECRITURES.CompteAuxLib, ECRITURES.PièceRéf, ECRITURES.PièceDate, ECRITURES.EcritureLib, ECRITURES.Débit, ECRITURES.Crédit, ECRITURES.ValidDate, ECRITURES.Solde, ECRITURES.AAAAMM
INTO ACHATS_DOUBLONS IN 'C:\ANA-FEC.accdb'
FROM (SELECT ECRITURES.CodeEntité, ECRITURES.CompteAuxNum, ECRITURES.PièceRéf, ECRITURES.Solde, ECRITURES.TypeJournal, Count(ECRITURES.CodeEntité) AS CompteDeCodeEntité FROM ECRITURES
WHERE ((Not (ECRITURES.CompteAuxNum) Is Null) AND ((ECRITURES.TypeJournal)="ACHATS"))
GROUP BY ECRITURES.CodeEntité, ECRITURES.CompteAuxNum, ECRITURES.PièceRéf, ECRITURES.Solde, ECRITURES.TypeJournal
HAVING ((Count(ECRITURES.CodeEntité))<>1)) AS Requête1 INNER JOIN ECRITURES ON (Requête1.TypeJournal = ECRITURES.TypeJournal) AND (Requête1.Solde = ECRITURES.Solde) AND (Requête1.PièceRéf = ECRITURES.PièceRéf) AND (Requête1.CompteAuxNum = ECRITURES.CompteAuxNum) AND (Requête1.CodeEntité = ECRITURES.CodeEntité)
ORDER BY Requête1.CodeEntité, Requête1.CompteAuxNum, Requête1.PièceRéf, Requête1.Solde;

Cette automatisation peut efficacement être mise en œuvre à l’aide d’une requête SQL.

La requête se décompose ainsi :

Une sous-requête (Requête1) recherche les lignes d’écriture d’achats ((ECRITURES.TypeJournal)=”ACHATS”) contenant un code tiers (Not (ECRITURES.CompteAuxNum) Is Null) et compte (Count) le nombre de lignes regroupant (GROUP BY) chaque champ Code entité / Code tiers / Référence pièce / Solde (ce contrôle étant opéré simultanément pour l’ensemble des entités du groupe) (est donc identifié comme doublon un achat opéré sur un même fournisseur, justifié par un document comptable portant la même référence et le même montant) : GROUP BY ECRITURES.CodeEntité, ECRITURES.CompteAuxNum, ECRITURES.PièceRéf, ECRITURES.Solde, ECRITURES.TypeJournal. Seuls les résultats en doublon (ou plus) sont repris par la requête (HAVING ((Count(ECRITURES.CodeEntité))<>1)).

SELECT ECRITURES.CodeEntité, ECRITURES.CompteAuxNum, ECRITURES.PièceRéf, ECRITURES.Solde, ECRITURES.TypeJournal, Count(ECRITURES.CodeEntité) AS CompteDeCodeEntité FROM ECRITURES WHERE ((Not (ECRITURES.CompteAuxNum) Is Null) AND ((ECRITURES.TypeJournal)="ACHATS"))
GROUP BY ECRITURES.CodeEntité, ECRITURES.CompteAuxNum, ECRITURES.PièceRéf, ECRITURES.Solde, ECRITURES.TypeJournal
HAVING ((Count(ECRITURES.CodeEntité))<>1)) AS Requête1

Puis, à partir de cette sous-requête, sont extraites l’ensemble des lignes d’écritures qui apparaissent en doublon (INNER JOIN ECRITURES ON (Requête1.TypeJournal = ECRITURES.TypeJournal) AND (Requête1.Solde = ECRITURES.Solde) AND (Requête1.PièceRéf = ECRITURES.PièceRéf) AND (Requête1.CompteAuxNum = ECRITURES.CompteAuxNum) AND (Requête1.CodeEntité = ECRITURES.CodeEntité)) ; ce résultat étant trié dans l’ordre des entités, des comptes auxiliaires… (ORDER BY Requête1.CodeEntité, Requête1.CompteAuxNum, Requête1.PièceRéf, Requête1.Solde).

La clause INTO ACHATS_DOUBLONS IN ‘C:\ANA-FEC.accdb’ va stocker le résultat de cette requête dans la table nommée ACHATS_DOUBLONS. Ne reste plus qu’à exploiter le contenu de cette table.

Appliquée à plusieurs millions de lignes d’écritures, cette requête ne met que quelques instants à s’exécuter.

Approfondir le sujet : Maîtriser ACCESSMaîtriser le langage de requête SQL / Analyse de données

Share Button
The following two tabs change content below.
Benoît RIVIERE
Après seize années passées en cabinet d’expertise-comptable et de commissariat aux comptes (où j’ai exercé comme expert-comptable et chef de mission audit), j’ai pris le poste de directeur comptable d’un groupe de distribution automobile en novembre 2014. Au cours de ma carrière, j’ai acquis une expérience significative en audit et en exploitation des systèmes d’information (analyse de données, automatisation des tâches, programmation informatique) au service de la production des comptes annuels et consolidés. C’est cette expérience personnelle et ma passion pour l’informatique que je partage sur ce blog. Mon CV / Réalisations personnelles et projets informatiques / Ma collection / Me contacter

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.