{"id":12166,"date":"2023-12-17T11:14:05","date_gmt":"2023-12-17T10:14:05","guid":{"rendered":"https:\/\/www.auditsi.eu\/?p=12166"},"modified":"2023-12-17T11:46:52","modified_gmt":"2023-12-17T10:46:52","slug":"productivite-extraire-de-donnees-comptables-multi-societes-grace-a-python-et-au-sql","status":"publish","type":"post","link":"https:\/\/www.auditsi.eu\/?p=12166","title":{"rendered":"Productivit\u00e9 : extraire des donn\u00e9es comptables multi-soci\u00e9t\u00e9s gr\u00e2ce \u00e0 Python et au SQL"},"content":{"rendered":"<p style=\"text-align: justify;\">La <strong>r\u00e9vision des comptes d&#8217;un groupe<\/strong> se confronte g\u00e9n\u00e9ralement \u00e0 la disponibilit\u00e9 des donn\u00e9es comptables diss\u00e9min\u00e9es sur de nombreux syst\u00e8mes.<\/p>\n<p style=\"text-align: justify;\">Cette difficult\u00e9 peut \u00eatre r\u00e9solue de diverses mani\u00e8res. Un simple <strong>module d&#8217;extraction de donn\u00e9es<\/strong> peut parfaitement faire l&#8217;affaire. Gr\u00e2ce \u00e0 <strong>quelques lignes de Python<\/strong>, il est ais\u00e9 de centraliser les donn\u00e9es \u00e0 auditer dans un fichier texte ou un classeur Excel.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12163\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PROJET-REQUETE-PY-PADOCC.png\" alt=\"PROJET REQUETE PY PADOCC\" width=\"950\" height=\"629\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PROJET-REQUETE-PY-PADOCC.png 950w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PROJET-REQUETE-PY-PADOCC-300x199.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PROJET-REQUETE-PY-PADOCC-768x508.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PROJET-REQUETE-PY-PADOCC-730x483.png 730w\" sizes=\"auto, (max-width: 950px) 100vw, 950px\" \/><\/p>\n<p style=\"text-align: justify;\">A titre d&#8217;illustration, voici l&#8217;esquisse d&#8217;un module d&#8217;extraction d&#8217;\u00e9critures comptables, pour le moment exp\u00e9rimental. Ce script Python d&#8217;\u00e0 peine cent lignes <strong>extrait les lignes d&#8217;\u00e9critures comptables<\/strong> de l&#8217;ensemble des entit\u00e9s <strong>d&#8217;un groupe<\/strong> selon les <strong>crit\u00e8res d\u00e9finis dans une requ\u00eate SQL<\/strong> puis <strong>exporte le r\u00e9sultat<\/strong> obtenu dans un fichier texte et un classeur Excel. Rudimentaire mais parfaitement op\u00e9rationnel&#8230; et surtout gains de temps assur\u00e9s. Ce module s&#8217;inscrit dans la continuit\u00e9 du <strong><a href=\"https:\/\/www.auditsi.eu\/?page_id=8535\">projet PADoCC_Ecritures<\/a> (supervision des op\u00e9rations comptables d&#8217;un groupe)<\/strong>.<\/p>\n<p style=\"text-align: justify;\">Une fois l&#8217;ex\u00e9cution du script lanc\u00e9e, une fen\u00eatre attend que l&#8217;utilisateur saisisse une requ\u00eate SQL (commande <em>enterbox<\/em> de la biblioth\u00e8que <em>easygui<\/em>) :<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12168\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PYTHON-saisie-req-SQL.png\" alt=\"PYTHON saisie req SQL\" width=\"391\" height=\"162\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PYTHON-saisie-req-SQL.png 391w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PYTHON-saisie-req-SQL-300x124.png 300w\" sizes=\"auto, (max-width: 391px) 100vw, 391px\" \/><\/p>\n<p style=\"text-align: justify;\">Quelques exemples de requ\u00eates SQL :<\/p>\n<p style=\"text-align: justify;\">Requ\u00eate programm\u00e9e par d\u00e9faut dans le script (stock\u00e9e dans la variable <em>requete_sql<\/em>) :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">SELECT * FROM _ECRITURES WHERE Cpte3='613'<\/pre>\n<p style=\"text-align: justify;\">Cette requ\u00eate liste toutes les lignes d&#8217;\u00e9critures comptables dont le <strong>compte g\u00e9n\u00e9ral commence par 613x<\/strong> (comptes de locations).<\/p>\n<p style=\"text-align: justify;\">Pour restreindre ces lignes aux seules <strong>\u00e9critures d&#8217;achat<\/strong> (donc hors \u00e9critures de bilan ou de situation : CCA, FNP&#8230;) :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">SELECT * FROM _ECRITURES WHERE Cpte3='613' AND TypeJournal='ACHATS'<\/pre>\n<p style=\"text-align: justify;\">Pour encore affiner l&#8217;extraction aux seuls <strong>achats de location soumis \u00e0 la TVA au taux normal<\/strong> (20 % : <em>CodeTVA=&#8217;TN&#8217;<\/em>) :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">SELECT * FROM _ECRITURES WHERE Cpte3='613' AND TypeJournal='ACHATS' AND CodeTVA='TN'<\/pre>\n<p style=\"text-align: justify;\">Ce genre de requ\u00eates s&#8217;av\u00e8re utile par exemple pour identifier les locations de v\u00e9hicules dont la <strong>TVA<\/strong> a fait l&#8217;objet d&#8217;une <strong>r\u00e9cup\u00e9ration<\/strong>. Il s&#8217;agit ici de s&#8217;assurer que la TVA sur location de <strong>v\u00e9hicules de tourisme<\/strong> n&#8217;a pas \u00e9t\u00e9 r\u00e9cup\u00e9r\u00e9e ind\u00fbment sur le Tr\u00e9sor.<\/p>\n<p style=\"text-align: justify;\">Une autre fa\u00e7on d&#8217;obtenir le m\u00eame r\u00e9sultat est de passer par le <strong>sch\u00e9ma d&#8217;\u00e9criture<\/strong>. Cette requ\u00eate liste toutes les lignes d&#8217;\u00e9criture d&#8217;achat de location (613x) qui ont fait l&#8217;objet d&#8217;une r\u00e9cup\u00e9ration de TVA (<em>Sch\u00e9mEcrit_Nature =\u2018ACHATS_a\/TVA_6HA\u2019<\/em>) :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">SELECT * FROM _ECRITURES WHERE Cpte3='613' AND Sch\u00e9mEcrit_Nature =\u2018ACHATS_a\/TVA_6HA\u2019<\/pre>\n<p style=\"text-align: justify;\">Autre exemple : pour extraire le <strong>chiffre d&#8217;affaires HT exon\u00e9r\u00e9 de TVA<\/strong> en fonction du sch\u00e9ma d&#8217;\u00e9criture comptable, la requ\u00eate SQL pourra \u00eatre libell\u00e9e sous cette forme (les&nbsp; \u00e9critures de ventes exon\u00e9r\u00e9es de TVA sont codifi\u00e9e sous le libell\u00e9 de sch\u00e9ma suivant : <em>Sch\u00e9mEcrit_Nature =&#8217;VENTES_ssTVA_700x&#8217;<\/em>) :<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">SELECT * FROM _ECRITURES WHERE Cpte2='70' AND Sch\u00e9mEcrit_Nature ='VENTES_ssTVA_700x'<\/pre>\n<p style=\"text-align: justify;\">Les \u00e9critures de ventes sans TVA doivent faire l&#8217;objet d&#8217;une justification (exportations, livraisons intracommunautaires, ventes de d\u00e9chets, ventes de biens d&#8217;occasion&#8230;).<\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #993366;\"><em><strong>&gt;&gt;&gt;<\/strong><\/em><\/span> Plus d&#8217;informations sur l&#8217;<strong>analyse des sch\u00e9mas d&#8217;\u00e9critures<\/strong> : cf l&#8217;article <a href=\"https:\/\/www.auditsi.eu\/?p=9118\">Analyse des sch\u00e9mas d\u2019\u00e9criture<\/a>.<\/p>\n<p style=\"text-align: justify;\"><span style=\"color: #993366;\"><em><strong>&gt;&gt;&gt;<\/strong><\/em><\/span> Pour d\u00e9couvrir le <strong>langage de requ\u00eates SQL<\/strong>, lire la s\u00e9rie d&#8217;<a href=\"https:\/\/www.auditsi.eu\/?p=10986\">articles sur l&#8217;analyse de donn\u00e9es<\/a>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-11029\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/02\/Volet-9-SQL.png\" alt=\"Volet 9 SQL\" width=\"1020\" height=\"780\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/02\/Volet-9-SQL.png 1020w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/02\/Volet-9-SQL-300x229.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/02\/Volet-9-SQL-768x587.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/02\/Volet-9-SQL-730x558.png 730w\" sizes=\"auto, (max-width: 1020px) 100vw, 1020px\" \/><\/p>\n<p style=\"text-align: justify;\">Une fois la requ\u00eate valid\u00e9e par l&#8217;utilisateur, le programme Python l&#8217;ex\u00e9cute sur l&#8217;ensemble des bases de donn\u00e9es comptables du groupe.<\/p>\n<p style=\"text-align: justify;\">Le coeur du module Python : une <strong>boucle <em>for&#8230; in&#8230;<\/em><\/strong> qui <strong>ex\u00e9cute la requ\u00eate<\/strong> de l&#8217;utilisateur (<em>df = pd.read_sql(requete_sql, conn)<\/em>) sur chacune des bases de donn\u00e9es comptables. Le r\u00e9sultat de la requ\u00eate, stock\u00e9 dans la variable <em>df<\/em> (pour <em>Data Frame<\/em>), est ensuite concat\u00e9n\u00e9 avec le r\u00e9sultat des autres entit\u00e9s du groupe (<em>df_concat = pd.concat([df_concat, df], ignore_index=True)<\/em>). Les <strong>biblioth\u00e8ques <em>pyodbc<\/em> et <em>pandas<\/em><\/strong> fournissent respectivement les fonctions de connexion \u00e0 la source de donn\u00e9es et de gestion des donn\u00e9es.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"python\">for fichier_accdb in fichiers_accdb:\r\n    bdd_en_cours = os.path.join(chemin_dossier, fichier_accdb)\r\n    print(f\"Base en cours : {bdd_en_cours}\")\r\n\r\n    try:\r\n        connection_str = f\"DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};DBQ={bdd_en_cours};\"\r\n        conn = pyodbc.connect(connection_str)\r\n        cursor = conn.cursor()\r\n\r\n        # Liste des tables de la BDD\r\n        tables = [table.table_name for table in cursor.tables(tableType='TABLE')]\r\n        \r\n        # Nom de la table \u00e0 v\u00e9rifier\r\n        nom_table = \"_ECRITURES\"\r\n\r\n        # V\u00e9rifie si la table existe\r\n        if '_ECRITURES' in tables:\r\n            df = pd.read_sql(requete_sql, conn)\r\n            # Ajout du r\u00e9sultats au DataFrame global\r\n            df_concat = pd.concat([df_concat, df], ignore_index=True)\r\n\r\n        else:\r\n            print(f\"Ignor\u00e9 : {nom_table} n'est pas pr\u00e9sente dans la base de donn\u00e9es {bdd_en_cours}.\")\r\n\r\n        cursor.close()\r\n        conn.close()\r\n\r\n    except pyodbc.Error as e:\r\n        print(f\"Erreur lors de la r\u00e9cup\u00e9ration des donn\u00e9es dans {bdd_en_cours}: {e}\")\r\n<\/pre>\n<p style=\"text-align: justify;\">Une fois toutes les bases de donn\u00e9es comptables pass\u00e9es en revue, le module d&#8217;extraction <strong>g\u00e9n\u00e8re un fichier texte et un classeur Excel<\/strong> (biblioth\u00e8que de fonctions <em>openpyxl<\/em>) reprenant l&#8217;ensemble des lignes d&#8217;\u00e9critures correspondant aux crit\u00e8res d\u00e9finis par la requ\u00eate (<strong>clause SQL <em>WHERE<\/em><\/strong>).<\/p>\n<div id=\"attachment_12167\" style=\"width: 897px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-12167\" class=\"wp-image-12167 size-full\" src=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PYTHON-EXE-SQL.png\" alt=\"PYTHON EXE SQL\" width=\"887\" height=\"718\" srcset=\"https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PYTHON-EXE-SQL.png 887w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PYTHON-EXE-SQL-300x243.png 300w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PYTHON-EXE-SQL-768x622.png 768w, https:\/\/www.auditsi.eu\/wp-content\/uploads\/2023\/12\/PYTHON-EXE-SQL-730x591.png 730w\" sizes=\"auto, (max-width: 887px) 100vw, 887px\" \/><p id=\"caption-attachment-12167\" class=\"wp-caption-text\">Ecran du requ\u00eateur une fois les extractions Excel et texte termin\u00e9es&#8230;<\/p><\/div>\n<p style=\"text-align: justify;\">___<\/p>\n<p style=\"text-align: justify;\">Pour approfondir le sujet :&nbsp;<a href=\"https:\/\/www.auditsi.eu\/?p=12059\">se former \u00e0 la programmation en langage Python pour automatiser ses t\u00e2ches<\/a><\/p>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div id=\"sconnect-is-installed\" style=\"display: none;\">2.13.0.0<\/div>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img decoding=\"async\" src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Productivit%C3%A9%20%3A%20extraire%20des%20donn%C3%A9es%20comptables%20multi-soci%C3%A9t%C3%A9s%20gr%C3%A2ce%20%C3%A0%20Python%20et%20au%20SQL\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"excerpt":{"rendered":"<p>La r\u00e9vision des comptes d&#8217;un groupe se confronte g\u00e9n\u00e9ralement \u00e0 la disponibilit\u00e9 des donn\u00e9es comptables diss\u00e9min\u00e9es sur de nombreux syst\u00e8mes. Cette difficult\u00e9 peut \u00eatre r\u00e9solue de diverses mani\u00e8res. Un simple module d&#8217;extraction de donn\u00e9es peut parfaitement faire l&#8217;affaire. Gr\u00e2ce \u00e0 quelques lignes de Python, il est ais\u00e9 de centraliser les donn\u00e9es \u00e0 auditer dans un &#8230;<\/p>\n<p><a href=\"https:\/\/www.auditsi.eu\/?p=12166\" class=\"more-link\">Continue reading &lsquo;Productivit\u00e9 : extraire des donn\u00e9es comptables multi-soci\u00e9t\u00e9s gr\u00e2ce \u00e0 Python et au SQL&rsquo; &raquo;<\/a><\/p>\n<div style=\"padding-bottom:20px; padding-top:10px;\" class=\"hupso-share-buttons\"><!-- Hupso Share Buttons - https:\/\/www.hupso.com\/share\/ --><a class=\"hupso_counters\" href=\"https:\/\/www.hupso.com\/share\/\"><img src=\"https:\/\/static.hupso.com\/share\/buttons\/lang\/fr\/share-small.png\" style=\"border:0px; padding-top:2px; float:left;\" alt=\"Share Button\"\/><\/a><script type=\"text\/javascript\">var hupso_services_c=new Array(\"twitter\",\"facebook_like\",\"facebook_send\",\"email\",\"print\",\"linkedin\");var hupso_counters_lang = \"fr_FR\";var hupso_image_folder_url = \"\";var hupso_twitter_via=\"BenoitRiviere14\";var hupso_url_c=\"\";var hupso_title_c=\"Productivit%C3%A9%20%3A%20extraire%20des%20donn%C3%A9es%20comptables%20multi-soci%C3%A9t%C3%A9s%20gr%C3%A2ce%20%C3%A0%20Python%20et%20au%20SQL\";<\/script><script type=\"text\/javascript\" src=\"https:\/\/static.hupso.com\/share\/js\/counters.js\"><\/script><!-- Hupso Share Buttons --><\/div>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"ngg_post_thumbnail":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[7,800,3087,282],"tags":[2415,3106,3107,3105,1981,1914,2497,2010,1138,3104,3109,3110,3103,816,3113,2061,3112,723,3111,3088,57,2951,1005,283,1643,322,3108],"class_list":["post-12166","post","type-post","status-publish","format-standard","hentry","category-breves","category-cycle-fiscalite","category-python","category-sql","tag-accdb","tag-connect","tag-path-join","tag-read_sql","tag-audit-de-la-tva","tag-bibliotheque-de-fonctions","tag-clause-where","tag-concat","tag-criteres","tag-data-frame","tag-easygui","tag-enterbox","tag-for-in","tag-gains-de-temps","tag-openpyxl","tag-padocc","tag-pandas","tag-productivite","tag-pyodbc","tag-python","tag-requete-sql","tag-revision-comptable","tag-schema-decriture","tag-select-from-where-order-by","tag-sql","tag-supervision","tag-vehicule-de-tourisme"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12166","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=12166"}],"version-history":[{"count":8,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12166\/revisions"}],"predecessor-version":[{"id":12195,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=\/wp\/v2\/posts\/12166\/revisions\/12195"}],"wp:attachment":[{"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=12166"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=12166"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.auditsi.eu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=12166"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}