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.
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 :
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 :
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
Derniers articles parBenoît RIVIERE (voir tous)
- Nouveautés de l’interpréteur de formules de calcul (v1.1) - dimanche 3 novembre 2024
- Dématérialisation de la facturation : nouvelles mentions obligatoires - lundi 28 octobre 2024
- Interpréteur de formules de calcul en Python - dimanche 13 octobre 2024
- Les données de la facturation électronique - mercredi 9 octobre 2024
- VBA/SQL vs Power Query : deux solutions complémentaires - mercredi 2 octobre 2024