Bonsoir tout le monde,

Voilà, je suis en train de finaliser une petite application qui permet à partir d'un fichier texte en entrée de récupérer certaines informations, et de génération un fichier texte en sortie mais qui a une structure bien différente, celle ci Structure de fichier AFB120.

Ma méthodologie :

Consiste à parcourir chaque ligne du fichier en input, et à chaque fois que je rencontre une occurrence d'un motif souhaité, je la récupère dans une table.

Problème :

Mon code me génère des informations qui ne sont même pas contenu dans la base, et je n'arrive pas à comprendre pourquoi. Les traces et infos m'indiquent clairement que tout est correct

Je peux vous joindre un exemple de fichier en input ici ORANGE 16.txt, et l'Output correspondant souhaité ORANGE_MALI_160118.TXT. Et les bouts de codes :

Intégration du fichier :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
sFichier est une chaîne
//On récupère le fichier sur le disque
sFichier = fSélecteur("C:\","Sélectionner un fichier","Fichier Texte (*.TXT)" + TAB + "*.txt" + RC + "Tous" + TAB + "*.*", "txt")
 
nIDFichier est un entier
sMdebit est une chaîne
sMcredit est une chaîne
Mtcredit est une chaîne
sdAteVal est une chaîne
sDebit est une chaîne
sCredit est une chaîne
Mtdebit est une chaîne
sNcompte est une chaîne
sDevise est une chaîne
sOldSoldeDate est une chaîne
sNewSoldeDate est une chaîne
sLigne est une chaîne= ""
 
//On ouvre le fichier en Lecture/Ecriture
nIDFichier = fOuvre(sFichier, foLectureEcriture)
 
SI nIDFichier = -1 ALORS
	Erreur(ErreurInfo(errMessage))
SINON
 
	//On vide la table
	HSupprimeTout(AFB120)
 
	sLigne = fLitLigne(nIDFichier)
 
	TANTQUE nIDFichier<>-1 
 
		sLigne = fLitLigne(nIDFichier)
		sPos2 est une chaîne = sLigne[[1 sur 93]]
		//Si Fin de fichier on sors
 
		SI Milieu(sPos2,19,1) = "*" ALORS
			SORTIR
		FIN
 
		SI Milieu(sPos2,2,6) = "Compte" ALORS
 
			//On récupère le compte et la dévise
			sNcompte = Milieu(sPos2,14,12)
			AFB120.NCompte=sNcompte
			sDevise = Milieu(sPos2,35,3)
			AFB120.Devise=sDevise	
		FIN
 
		SI Milieu(sPos2,5,20) = "SOLDE PRECEDENT AU :" ALORS
 
			sOldSoldeDate = Milieu(sPos2,26,8)
 
			//Recupération du montant au débit de l'ancien solde
 
			sDebit = Remplace(SansEspace(Milieu(sPos2,61,16))," ","")
 
			SI sDebit <> "" ALORS
				sDebit = "-"+sDebit
				SOCIETE.MontantAncienSolde = sDebit
			FIN
 
			//Recupération du montant au crédit de l'ancien solde
 
			sCredit = Remplace(SansEspace(Milieu(sPos2,78,16))," ","")
 
			SI sCredit <> "" ALORS
				sCredit = "+"+sCredit
				SOCIETE.MontantAncienSolde = sCredit
 
			FIN
 
		FIN
 
		//Test si DateVal est présent
 
		SI EstNumérique(Milieu(sPos2,54,6)) > 0 ALORS
 
			//Trace(Milieu(sPos2,54,6))
			//Récupère la date val
			sdAteVal = Remplace(Milieu(sPos2,54,6)," ","")
 
			SI sdAteVal="" ALORS
				AFB120.DateValeur=""
			SINON
 
				SI Taille(sdAteVal) = 6 ALORS
					AFB120.DateValeur = sdAteVal
				FIN
 
			FIN
 
 
		SI 	sdAteVal <> "" 
			//Récupère le libéllé
			Lib est une chaîne = Milieu(sPos2,3,56)
			AFB120.Libelle = Lib
 
			//Montant Débit/Crédit du mouvement
 
			Mtdebit = SansEspace(Milieu(sPos2,61,16))
			Mtcredit = SansEspace(Milieu(sPos2,78,16))
 
			SI Mtdebit = "" ALORS
				AFB120.MontantDebit = ""
				AFB120.MontantCredit = "+" + Mtcredit
			SINON
				AFB120.MontantDebit = "-" + Mtdebit
				AFB120.MontantCredit = ""
			FIN
 
		FIN
		HAjoute(AFB120)	
 
		SI Milieu(sPos2,8,18) = "NOUVEAU SOLDE AU :" ALORS
 
			//On récupère la date
			sNewSoldeDate = Milieu(sPos2,27,8)
 
			//On récupère le montant du solde soit en débit soit en crédit
 
			sMdebit = "-" + SansEspace(Milieu(sPos2,61,16))
			sMcredit = "+" + SansEspace(Milieu(sPos2,78,16))
 
		FIN		
		//Ligne suivante
		sLigne = fLitLigne(nIDFichier)
	FIN
	//**
 
	//Ecriture dans les tables
	SI COMBO_Choisissez_une_société.COL_Nom_SOCIETE = "" ALORS
		Info("Merci de choisir une société !!!")
	FIN
 
	HLitRecherchePremier(SOCIETE,SOCIETE.Nom_SOCIETE,COMBO_Choisissez_une_société)
 
	SI HTrouve(SOCIETE) ALORS
 
		SOCIETE.DateAncienSolde = Remplace(sOldSoldeDate,".","")
 
		SI sMdebit = "" ALORS
 
			SOCIETE.MontantAncienSolde = sCredit
 
		SINON
 
			SOCIETE.MontantAncienSolde = sDebit
		FIN
 
		//FIN
 
		SOCIETE.DateNouveauSolde = Remplace(sNewSoldeDate,".","")
 
		SI sMdebit = "" ALORS
			SOCIETE.MontantNouveauSolde = sMcredit
 
		SINON
			SOCIETE.MontantNouveauSolde = sMdebit
 
		FIN
		HModifie(SOCIETE)
	FIN
 
 
 
FIN	// **		
FIN
 
 
Info("Importation terminée avec succès !!!!")

Génération de l'AFB120 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
// Déclaration et initialisation des variables
 
IDFichier est un entier
ResEcrit est un booléen = Vrai
ResFermeFichier est un entier
dDancienSolde est une Date
dDnouveauSolde est une Date
sOldMontantSolde est une chaîne
sNewMontantSolde est une chaîne
sCodeguichet est une chaîne = "01001"
sDevise est une chaîne = "XOF"
sNumCompte est une chaîne = ""
sLastLettre est une chaîne = ""
 
 
//Variables Communes pour chaque type d'opération dans le rélévé
//On fixe les codes Enregistrements de l'ancien solde, libéllé et du nouveau solde
//Ancien Solde
 
sCodeReg1 est une chaîne ="01"
//Libellé
 
sCodeReg2 est une chaîne ="04"
 
//Nouveau Solde
sCodeReg3 est une chaîne ="07"
sNbreDecimale est une chaîne = "0"
 
//Pour 04 et 05
 
sCodeope est une chaîne = "  "
 
//Variables pour le type 01 (Ancien Solde)
 
sCodeEnregAncienSolde est une chaîne = "01"
 
 
//Variables pour le type 04 (Mouvement)
 
sCodeopeinterne est une chaîne = "    "
sZonereserve4 est une chaîne = " "
sCoderejet est une chaîne = "  "
sZonereserve7 est une chaîne = "  "
sNumEcriture est une chaîne = "       "
sExo est une chaîne = " "
sIndisponibilite est une chaîne = " "
sZref est une chaîne = "                "
 
 
//Variables pour le type 05 (Complement)
 
sZonereserve5 est une chaîne = "     "
sInfcomp est une chaîne = "   "
sZonereserve6 est une chaîne = "  "
 
//Récupération du numéro de compte sans le chiffre 2
HLitRecherche(SOCIETE,IDSOCIETE,COMBO_Choisissez_une_société)
SI HTrouve(SOCIETE) ALORS
 
 
		// Sélection du nom et du chemin du fichier en fonction du client
		// On récupère le nom du fichier en sortie et les autres informations Date (ancien/nouveau solde) montant (ancien/nouveau solde)
		NomCheminFichier est une chaîne = "D:\AF120"
		dDate est une Date = Droite(DateSys(),6)
 
		NomCheminFichier = NomCheminFichier + "\" + SOCIETE.Nom_Fichier + "_" + dDate + ".TXT"
 
		dDancienSolde = SOCIETE.DateAncienSolde
		dDnouveauSolde = SOCIETE.DateNouveauSolde
		sOldMontantSolde = Remplace(SansEspace(SOCIETE.MontantAncienSolde)," ","")
		sNewMontantSolde = Remplace(SansEspace(SOCIETE.MontantNouveauSolde)," ","")
 
// Ouverture du fichier
IDFichier = fOuvre(NomCheminFichier, foCréation)
 
// Affichage du message d'erreur si l'ouverture n'a pas été effectuée
SI IDFichier = -1 ALORS
 
	Erreur(ErreurInfo(errFichier))
 
SINON
		sNumCompte = SansEspace(AFB120.NCompte)
		sNumCompte = Milieu(sNumCompte,1,6) + Milieu(sNumCompte,8,12)
 
		//Signe de l'ancien solde 
		sIgneS est une chaîne = Gauche(sOldMontantSolde,1)
 
		//Si positif alors on prend son dernier chiffre
		sLastChiffreP est une chaîne = Droite(sOldMontantSolde,1)
 
		sOldMontantSolde = ChaîneSupprime(sOldMontantSolde,sIgneS)
		sOldMontantSolde = Gauche(sOldMontantSolde, Taille(sOldMontantSolde)-1)
		sIgneS=sIgneS+sLastChiffreP
 
		HLitPremier(FormatAFB)
 
		HLitRecherche(FormatAFB,FormatAFB.Chiffre,sIgneS)
 
		SI HTrouve(FormatAFB) = Vrai ALORS
				//info("Le record "+sIgnes+" a été trouvé !!")
				sLastLettre = SansEspace(FormatAFB.Lettre)
				//info(FormatAFB.Lettre)
		FIN
 
 
	//Ecriture de la 1ère 01 ligne du fichier avec l'ancien solde et la date
	//On affecte la nouvelle lettre au montant
	sOldMontantSolde = sOldMontantSolde+sLastLettre
	sOldMontantSolde = "00000000000000"+ sOldMontantSolde
	sOldMontantSolde = Droite(sOldMontantSolde,14)
 
 
	HLitPremier(AFB120, IDAFB120)
	//LI est un entier = HLitPremier(AFB120,IDAFB120)
 
	SI Val(Gauche(dDancienSolde,2)) < 10 ALORS
 
		Trace(Val(Gauche(dDancienSolde,2)))
		dDancienSolde = "0"+dDancienSolde
 
	FIN
 
	ResEcrit = fEcritLigne(IDFichier,"01" + "ML043" + "    " + sCodeguichet + sDevise + sNbreDecimale + " " + sNumCompte + "  " +dDancienSolde + "                                                  " + sOldMontantSolde + "                ")
 
		TANTQUE HEnDehors = Faux //ET ResEcrit = Vrai
 
			// Écriture des enregistrements ligne par ligne dans le fichier texte
			//Formatage des champs en format AFB210
			DateValeur est une chaîne = AFB120.DateValeur
			sLibelle est une chaîne = Gauche(AFB120.Libelle,36)
			sCodeinterne est une chaîne = Milieu(AFB120.Libelle,39,4)
 
			sMontantC est une chaîne = AFB120.MontantCredit
			sMontantD est une chaîne = AFB120.MontantDebit
 
			//sNumCompte =  AFB120.NCompte
			//Récupération du montant Débit/Crédit de la transaction et caste pour faire 14 caractères
			montant est une chaîne = ""
			sDernierChiffre est une chaîne =""
			sIgneM est une chaîne = ""
 
			SI sMontantC = "" ALORS
				montant = sMontantD
				sIgneM = Gauche(montant,1)
				montant = ChaîneSupprime(montant,sIgneM)
				sDernierChiffre = Droite(montant,1)
				sIgneM = sIgneM+sDernierChiffre
			SINON
				montant = sMontantC
				sIgneM = Gauche(montant,1)
				montant = ChaîneSupprime(montant,sIgneM)
				sDernierChiffre = Droite(montant,1)
				sIgneM = sIgneM+sDernierChiffre
			FIN
 
 
 
			HLitRecherche(FormatAFB,FormatAFB.Chiffre,sIgneM)
 
 
				SI HTrouve() = Vrai ALORS
 
					sLastLettre = FormatAFB.Lettre
 
				FIN
 
			//On enlève le dernier chiffre
 
			montant = Gauche(montant,Taille(montant)-1)	
 
			//Trace(sLastLettre)
			//HLitSuivant(AFB120, IDAFB120)
 
			montant = montant+sLastLettre
 
 
			//On récupère le montant sur 14 Digits
			montant =  "00000000000000" + montant		
			montant = Droite(montant,14)
 
			ResEcrit = fEcritLigne(IDFichier,"04" + "ML043" + sCodeinterne + sCodeguichet + sDevise + sNbreDecimale + " " + sNumCompte + "911" + DateValeur + "  " + sLibelle +"  " + "       " + " " + " " + montant + "                ")
			HLitSuivant(AFB120, IDAFB120)
 
		FIN
 
		sIgneN est une chaîne = Milieu(sNewMontantSolde,1,1)
		sLastChiffreN est une chaîne = Droite(sNewMontantSolde,1)
		sNewMontantSolde = ChaîneSupprime(sNewMontantSolde,sIgneN)
		//On les concatènes
		sIgneN = SansEspace(sIgneN+sLastChiffreN)
 
		//On enlève le signe et le dernier chiffre
		sNewMontantSolde = ChaîneSupprime(sNewMontantSolde,sIgneN)
		sNewMontantSolde = Gauche(sNewMontantSolde,Taille(sNewMontantSolde)-1)
 
		//sNewMontantSolde = ChaîneSupprime(sNewMontantSolde,sLastChiffreN)
 
		//Recherche du signe concaténé au dernier chiffre dans la table FormatAFB
		HLitPremier(FormatAFB)
		HLitRecherche(FormatAFB,FormatAFB.Chiffre, sIgneN,hIdentique)
 
				SI HTrouve(FormatAFB) = Vrai ALORS
 
					sLastLettre = FormatAFB.Lettre
 
				FIN
 
		//On affecte la nouvelle lettre au montant
		sNewMontantSolde = sNewMontantSolde+sLastLettre
		sNewMontantSolde = "00000000000000"+sNewMontantSolde
		sNewMontantSolde = Droite(sNewMontantSolde,14)
 
 
		SI Val(Gauche(dDnouveauSolde,2)) < 10 ALORS
			dDnouveauSolde = "0"+dDnouveauSolde
		FIN
		//Ecriture de la dernière ligne du rélévé 07 le nouveau Solde
		ResEcrit = fEcritLigne(IDFichier,"07" + "ML043" + "    " + sCodeguichet + sDevise + sNbreDecimale + " " + sNumCompte + "  " +dDnouveauSolde + "                                                  " + sNewMontantSolde + "                ")
 
		// Affichage du message d'erreur si l'écriture n'a pas été effectuée
		SI ResFermeFichier = -1 ALORS
			// Affichage du message d'erreur si la fermeture n'a pas été effectuée
			Erreur(ErreurInfo(errMessage))
		FIN
FIN
FIN
 
//RAZ(vrai)
 
Info("Exportation terminée avec succès !!!!")
Merci de votre coup de main.

Cordialement,
_shuriken_