Merci Mikell pour ta réponse sur quote.
Quand on fait un _SQLite_Query suivi d'un ou plusieurs _SQLite_FetchData, il faut impérativement finaliser la requête avec _SQLite_QueryFinalize sinon la requête reste ouverte et SQLite ne peut pas fermer le fichier de la BD. Si des modifications ont été faites, elles seront perdues et la BD peut devenir incohérente.
OK. j'ai ajouté
_SQLite_QueryFinalize.
j'ai amélioré mon code mais j'ai un comportement que je n'arrive pas à comprendre.
voici mon code pour le programme dont j'ai besoin.
ça ne doit pas être très joli à voir, mais il fait le job.
d'abord, explication.
le but est de récupérer un fichier texte d'un programme de facturation comprenant un code, un libellé, un montant et un montant total par catégorie depuis le fichier
20190711.txt (par exemple)
je traite chaque ligne du fichier pour créer un 2e fichier
"winfic_import_opera-"&@YEAR&@MON&@MDAY&".txt"
ce fichier contient les lignes pour importer en compta dans le logiciel compta winfic.
le fichier se créé correctement, de la façon dont j'ai besoin.
La bdd sqlite va chercher le code comptable correspondant au code opera.
je le met à la colonne du fichier CSV en fonction du montant s'il est négatif ou positif.
* Pour terminer mon programme, il me manque un montant total que je doit calculer à partir du fichier.
dans le fichier
20190711.txt, il y a 3 montants en fin de ligne à additionner.
pour bien montrer de quoi il s'agit, ce sont les montants 3572,71 468,27 et -9226,29
avec ça j'obtient -5185,31.
j'aurai une dernière ligne à créer avec ce montant dans le fichier, une fois toutes les lignes traitées.
J'ai ajouté
MsgBox(0,"total general",$total_general) après le Next du For.
* problème :
rien n'apparaît.
si je met une commande pour créer une ligne dans mon fichier, je n'ai rien.
si je met avec le Next, ça fonctionne mais je n'en ai pas besoin là.
Je ne comprend pas pourquoi rien ne se passe après le Next.
merci
Code : Tout sélectionner
#include <File.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>
; ** Initialisation des variables
Local $compte_winfic ; compte winfic correspondant au code opera dans la bdd SQLite
Local $requete
dim $line[10] ; Variable tableau qui contient chaque élément de la ligne du fichier opera à traiter
local $ligne_total_general_ecrit ; variable pour contrôler si la ligne avec le total général est écrite car je ne comprend pas pourquoi apres la boucle for / next rien ne se passe
Local $total_general,$compteur_total, $compteur_total_ligne ; Le total général est à calculer à partir des données du fichier
$total_general = 0
$compteur_total = 0 ; utile pour comparer la valeur avec celle de la ligne précédente
$compteur_total_ligne = 0
$ligne_total_general_ecrit = 0
; nom du fichier créé par ce programme pour importer dans winfic
$file_prepa_import_winfic="winfic_import_opera-"&@MDAY&@MON&@YEAR&".txt"
; Chargement de la DLL sqlite
_SQLite_Startup(@ScriptDir & "\config\sqlite3.dll", False, 1)
If @error Then
MsgBox($MB_SYSTEMMODAL, "SQLite Erreur", "Le fichier SQLite.dll ne peut pas être chargé.")
Exit -1
Else
EndIf
ConsoleWrite("_SQLite_LibVersion=" & _SQLite_LibVersion() & @CRLF) ; si besoin de débugguer, affichage d'information dans la console.
ConsoleWrite("_SQLite_statup=" & _SQLite_Startup() & @CRLF)
$file = "20190711.txt" ; fichier exemple à traiter
; On récupère la partie date du nom du fichier sous la forme JJMMAAAA, car le fichier sera enregistré sous la formme JJMMAAAA.TXT
$winfic_date_piece=StringLeft($file,8)
; on contrôle qu'il n'y ai bien que des valeurs numériques.
if IsNumber(Number($winfic_date_piece))=0 Then
MsgBox(0,"nom du fichier incorrect","Merci de mettre le nom du fichier sous la forme JJMMAAAA.txt"&@CRLF&@CRLF&"Exemple : "&@MDAY&@MON&@YEAR&".txt")
Exit
EndIf
; on ouvre les fichiers à traiter et créer
FileOpen($file, 0)
FileOpen($file_prepa_import_winfic,2)
; // on démarre le traitement du fichier Opéra
; le traitement du fichier sera ainsi
; voir dans la colonne 5 si le montant est positif ou négatif
; positif : le montant sera en DEBIT
; négatif : le montant sera en CREDIT
; notes :
; les montants sont adaptés pour winfic : suppression de la virgule dans les séparateurs de miliers,
; remplacement . par , dans les décimaux au moment de crééer la ligne compta car sinon, avec les chiffres 0,91 par exemple aucun compte comptable dans l'écriture de la ligne du fichier import opera winfic
;~ On parcours chaque ligne
; $line prend la ligne en cours
For $i = 1 to _FileCountLines($file)-1
$line = StringSplit (FileReadLine($file, $i),@TAB) ; on récupère la ligne en cours
; on ouvre la bdd sqlite3
$handle_db=_SQLite_Open("code_opera_winfic.db") ; chargement de la base de donnée
_SQLite_Query($handle_db, "SELECT compte_winfic FROM code WHERE code_opera = "& $line[3] & "",$requete)
_SQLite_FetchData($requete,$compte_winfic)
; On vérifie que le compte comptable winfic n'est pas vide dans la base de données
if $compte_winfic[0]="" Then
;~ MsgBox(0,"Compte vide", "le code opera "&$line[3]&" n'a pas de compte comptable winfic dans la base de données.")
Exit
EndIf
; On adapte la valeur du montant
$montant=StringReplace(StringReplace($line[5],",","")," ","") ; on supprime les virgules et les espace, on remplace les . par ,
;~ vérification des montants pour calculer la ligne "total général"
$compteur_total_ligne = StringReplace(StringReplace($line[6],",","")," ","")
if $compteur_total_ligne <> $compteur_total Then
$total_general=$total_general+$compteur_total_ligne
$compteur_total=$compteur_total_ligne
EndIf
; On vérifie la valeur du montant. Il faut démarrer en controlant que la valeur est bien positive ou négative pour le bon déroulement du programme
if $montant<>0 Then
; si le montant est positif, on écrit une ligne avec le montant dans crédit
if $montant>0 Then
;~ MsgBox(0,"info","positif")
FileWriteLine($file_prepa_import_winfic,"VE;"&$winfic_date_piece&";"&$compte_winfic[0]&";"&$line[4]&";"&StringReplace($montant,".",",")&";")
ElseIf $montant<0 Then
;~ MsgBox(0,"info","négatif")
FileWriteLine($file_prepa_import_winfic,"VE;"&$winfic_date_piece&";"&$compte_winfic[0]&";"&$line[4]&";"&";"&StringReplace($montant,".",","))
EndIf
;~ le montant est forcément égale à 0 car ni suppérieur, ni inférieur à 0
Else
;~ FileWriteLine($file_prepa_import_winfic,"VEEEEEE;"&$winfic_date_piece&";"&$compte_winfic&";"&";"&$montant)
MsgBox(0,"montant", $total_general)
EndIf
; Il reste les montant = 0, alors on est sur la 2e partie du document. Inutile pour cette partie de traitement
_SQLite_QueryFinalize($handle_db)
Next
MsgBox(0,"total general",$total_general)
; Fermeture des fichiers et de la bdd SQLite
FileClose($file_prepa_import_winfic)
FileClose($file)
_SQLite_Close($handle_db)
_SQLite_Shutdown()