Analyse des données comptables : détecter les caisses créditrices et les comptes courants d’associés débiteurs

L’analyse de données est une activité qui rend de multiples services. Appliquée au FEC, l’analyse de données permet de déceler d’éventuelles anomalies comptables comme une caisse créditrice en cours d’exercice. En effet, d’un point de vue comptable, une caisse créditrice constitue une irrégularité. Il n’est pas possible d’avoir un montant négatif en pièces et billets.

Solde progressif (résultat de la requête SQL)

Solde progressif (résultat de la requête SQL)

Une caisse créditrice (caisse dont le solde est négatif !) a généralement pour origine une omission de comptabilisation de recettes (chiffre d’affaires). A l’inverse, une situation fortement débitrice (notablement supérieure au fonds de caisse défini par exemple) doit attirer l’attention. Elle peut révéler des dépenses ou des remises bancaires non comptabilisées, voire un détournement de fonds (dans ce cas procéder à un inventaire physique des espèces et analyser les mouvements des comptes de virements internes 58x).

Dans le même esprit, un compte courant d’associé personne physique débiteur est une convention interdite dans les sociétés de capitaux.

Pour détecter de telles anomalies, il est nécessaire de calculer le solde progressif du compte à analyser.

Ce calcul peut s’opérer assez rapidement, même sur de grandes masses de données, avec deux requêtes SQL :

  • La première calcule les mouvements quotidiens des comptes à surveiller (requête regroupement : GROUP BY) ;
  • La seconde calcule le solde progressif à partir de la requête précédente à l’aide de la fonction domaine DSum.

L’exemple qui suit présente les requêtes applicables aux comptes de caisse (53x) mais est parfaitement adaptable aux comptes d’associés ou tout autre compte.

La première requête calcule (GROUP BY) la totalisation (Sum) quotidienne (ORDER BY … EcritureDateComptable) des débits, crédits et soldes de chaque compte caisse (WHERE Cpte2=”53″) contenu dans les écritures comptables (FROM _ECRITURES). Le résultat de cette requête est un calcul intermédiaire qui sera utilisé par la prochaine requête. La clause INTO transfère le résultat de la requête dans la table [CAISSE_SLDQUOTID_tempo] créée à cet effet pour y figer les données.

SELECT CodeEntité, EcritureDateComptable, CompteNum, CompteLib, Sum(Débit) As TotalDébit, Sum(Crédit) As TotalCrédit, Sum(Solde) As TotalQuotid, Secteur, Périmètre
INTO [CAISSE_SLDQUOTID_tempo]
FROM [_ECRITURES]
WHERE Cpte2="53"
GROUP BY CodeEntité, EcritureDateComptable, CompteNum, CompteLib, Secteur, Périmètre
ORDER BY CodeEntité, CompteNum, EcritureDateComptable;

La requête donne le résultat suivant :

Requête résultat intermédiaire CAISSE

La deuxième requête produit le résultat final, c’est-à-dire le solde progressif journalier (champ SoldeProgressif) ainsi qu’un indicateur en cas de solde journalier créditeur (champ SoldeProgCréditeur).

SELECT CodeEntité, CompteNum, CompteLib, EcritureDateComptable, TotalDébit, TotalCrédit, TotalQuotid, CDbl(DSum("TotalQuotid","[CAISSE_SLDQUOTID_tempo]","CompteNum=" & chr(34) & CompteNum & chr(34) & " AND EcritureDateComptable<=#" & format(EcritureDateComptable,"mm/dd/yyyy") & "#")) AS SoldeProgressif, iif(SoldeProgressif<0,"X","") As SoldeProgCréditeur, Secteur, Périmètre
INTO E258_CAISSE_SLDQUOTID
FROM [CAISSE_SLDQUOTID_tempo]
ORDER BY CompteNum, EcritureDateComptable;

Le champ SoldeProgressif est calculé à l’aide de la fonction de domaine DSum. Cette fonction additionne des données selon la réalisation ou non de critères (calculs conditionnels). Cette fonction réclame trois paramètres (chaque paramètre est encadré par des guillemets) : le champ à additionner (ici TotalQuotid), le nom de la table de données ou de la requête source (ici la table CAISSE_SLDQUOTID_tempo) et enfin les critères.

Le champ SoldeProgCréditeur renvoie un X lorsque le solde est créditeur ; Null dans le cas contraire. C’est la fonction de test conditionnel iif qui effectue ce calcul.

Après exécution, la requête sort le résultat suivant :

Résultat final CAISSE

Le champ SoldeProgressif est opérationnel. L’on peut observer que les 9 et 10 octobre le solde de la caisse est ponctuellement devenu créditeur. Ces deux occurrences doivent l’objet d’une analyse appropriée.

Une fois ce résultat obtenu, la table temporaire CAISSE_SLDQUOTID_tempo n’a plus d’utilité. Il est possible de la supprimer à l’aide d’une requête introduite par une clause DROP. Il suffit de faire suivre la clause DROP par le nom de la table à supprimer :

DROP TABLE [CAISSE_SLDQUOTID_tempo]

Pour ne lister que les lignes présentant un solde créditeur, une clause WHERE pourra entrer en scène :

SELECT CodeEntité, CompteNum, CompteLib, EcritureDateComptable, TotalDébit, TotalCrédit, TotalQuotid, SoldeProgressif, SoldeProgCréditeur, Secteur, Périmètre
FROM [E258_CAISSE_SLDQUOTID]
WHERE SoldeProgCréditeur = "X"
ORDER BY CompteNum, EcritureDateComptable;

C’est ainsi que procède le programme d’analyse de données PADoCC_Ecritures pour détecter les caisses créditrices :

'Création table CAISSE_SLDQUOTID
'---Tempo
NomReq = "ECRITUREStemp"
NomTable = "CAISSE_SLDQUOTID_tempo"
If TableExiste(CurrentDb, NomTable) Then CurrentDb.Execute "DROP TABLE " & NomTable
TexteReq = "SELECT CodeEntité, EcritureDateComptable, CompteNum, CompteLib, Sum(Débit) As TotalDébit, Sum(Crédit) As TotalCrédit, Sum(Solde) As TotalQuotid, Secteur, Périmètre"
TexteReq = TexteReq & " INTO " & NomTable
TexteReq = TexteReq & " FROM [_ECRITURES]" & " IN '" & dossier_Bases & BDD_Final & "'"
TexteReq = TexteReq & " WHERE Cpte2=""53"""
TexteReq = TexteReq & " GROUP BY CodeEntité, EcritureDateComptable, CompteNum, CompteLib, Secteur, Périmètre"
TexteReq = TexteReq & " ORDER BY CodeEntité, CompteNum, EcritureDateComptable;"
If FEC_A_Traiter Then ExéReq
'---
NomReq = "ECRITUREStemp"
NomTable = "E258_CAISSE_SLDQUOTID"
If TableExiste(DB_Groupe_SUPERVISION, NomTable) Then
    If FEC_A_Traiter And (AnciennetéFEC <> 0) Then
        TexteReq = "DELETE FROM " & NomTable & " IN '" & dossier_Bases & NomBaseDestinationEnCours & "' WHERE CodeEntité=""" & EntitéEnCours & """;"
        ExéReq
    End If
    TexteReq = ""
    TexteReq = TexteReq & "INSERT INTO " & NomTable & " IN '" & dossier_Bases & NomBaseDestinationEnCours & "' "
Else:
    TexteReq = ""
End If
TexteReq = TexteReq & "SELECT CodeEntité, CompteNum, CompteLib, EcritureDateComptable, TotalDébit, TotalCrédit, TotalQuotid, CDbl(DSum(""TotalQuotid"",""[CAISSE_SLDQUOTID_tempo]"",""CompteNum="" & chr(34) & CompteNum & chr(34) & "" AND EcritureDateComptable<=#"" & format(EcritureDateComptable,""mm/dd/yyyy"") & ""#"")) AS SoldeProgressif, iif(SoldeProgressif<0,""X"","""") As SoldeProgCréditeur, Secteur, Périmètre"
If Not (TableExiste(DB_Groupe_SUPERVISION, NomTable)) Then TexteReq = TexteReq & " INTO " & NomTable & " IN '" & dossier_Bases & NomBaseDestinationEnCours & "'"
TexteReq = TexteReq & " FROM [CAISSE_SLDQUOTID_tempo]"
TexteReq = TexteReq & " ORDER BY CompteNum, EcritureDateComptable;"
If FEC_A_Traiter Then ExéReq
'Supprime la table temporaire
If TableExiste(CurrentDb, "[CAISSE_SLDQUOTID_tempo]") Then CurrentDb.Execute "DROP TABLE " & "[CAISSE_SLDQUOTID_tempo]"

___

Approfondir le sujet : Suivre le projet PADoCC… / Voir mes autres réalisations… / En savoir plus sur l’analyse de données

Share Button
The following two tabs change content below.
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 e-mail 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.