French Utilisation de deux fichiers csv, pb de sauvegarde

wolf

Member
Licensed User
Longtime User
Bonjour,

Je fais afficher le contenu d'un fichier 1 de type csv dans un tableau (une scrolwiew dans un panel) et je le sauve après modifications des cellules. Pour cela j'utilise les procedures tirées de "tableexemple" telle que LoadTableFromCSV ou SaveTableToCSV.

Au passage, je remercie vraiment les auteurs de ces exemples qui font gagner un sacré temps.

Pour modifier si besoin les contenus des cellules, j'utilise les datedialog, timedialog, input diialog et si je me contente de cela, tout se passe bien en particulier la sauvegarde fonctionne.

Par contre cela se gate si j'utilise un spinner pour proposer des valeurs :
Après un clic dans la cellule :
- Je rempli le spinner par la lecture d'un deuxiéme ficher csv (Ok sans probleme)
- Je selectionne une valeur du spinner et le fais recopier dans la cellule du tableau aprés confirmation (Ok sans probléme)
- Mais lorsque je veux enregistrer et sauver la tableau, c'est le contenu du spinner qui est sauvé dans le fichier 1 lequel est alors écrasé.​

Je bute sur cette difficulté. J'ai essayé plusieurs solutions, dont celle d'ajouter un parametre qui designerai la table à traiter à SaveTableToCSV.

Y a t'il un moyen simple de designer la table sur laquelle travailler ?

Merci

If rc.Col= 5 OR rc.Col=7 Then 'Code OACI

'XXXXX Initialisation du spinner LR1 XXXXXXXXXXXXXXXXXXXXXXXX
'lecture du fichier
Dim List1 As List
Dim H() As String
Dim headers As List
List1 = StringUtils1.LoadCSV2(File.DirRootExternal, "fic2.csv", ";", headers)
Dim H(headers.Size) As String
For I = 0 To headers.Size - 1
H(I) = headers.Get(I)
Next
List1 = StringUtils1.LoadCSV(File.DirRootExternal, "fic2.csv", ";")
Dim firstRow() As String
firstRow = List1.Get(0)
Dim H(firstRow.Length)
For I = 0 To firstRow.Length - 1
H(I) = "Col" & (I + 1)
Next

'recopie dans le spinner
NumberOfColumns = H.Length
ColumnWidth = sv.Width / NumberOfColumns 'update the columns widths
ColumnWidth_1 = ColumnWidth-ColLineWidth
'SetHeader(h,numPanel)
LR1.Initialize("LR1")
LR1.Add("Choix :")
For I = 1 To List1.Size - 1
Dim row() As String
row =List1.Get(I)
LR1.Add(row(3)&row(4)&" "&row(2))
Next

'Affichage du spinner
panels(3).AddView(LR1, 20dip, 30dip,120dip, 40dip)

'XXXX Récupération de la valeur et recopie dans la tableau
Do While LR1.SelectedIndex<=0
Delay(1000)
Loop

txt = "Do you want change the oaci code ?"
answ=Msgbox2(txt,"Warning","Yes","","No",Null)
If answ=DialogResponse.POSITIVE Then
l.Text=LR1.SelectedItem.SubString2(0,7)
SaveTableToCSV(table, File.DirRootExternal, "fic1.csv")
LR1.RemoveView
End If

Else
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Pouvez-vous poster votre projet sous la forme d'un fichier zip (éditeur menu Files / Export As Zip avec les 2 fichiers cvs.
Ce serait plus facile de voir dans le détail ce qui se passe et de pouvoir tester dans les mêmes conditions que vous.
Je ne comprends pas bien votre logique. A quoi sert Do While / Delay / Loop ?
Je ne vois pas où vous ne mettez pas à jour la table.

Meilleures salutations.
 

wolf

Member
Licensed User
Longtime User
Merci de votre réactivité.

Je compte proposer cette application une fois terminée sur Android Market et donc cela me géne un peu de fournir l'intégralité du source.

Pour répondre à vos questions :
- la boucle avec le delay bloque l'apparition du message de confirmation et permet de choisir une des lignes du spinner avant de voir apparaitre le message de validation
- La sauvegarde se fait bien mais ce qui est sauvé c'est non pas le contenu du tableau mais le contenu du spinner.

Initialement :
le fichier 1 contient le contenu du tableau
le fichier 2 contient la liste de valeurs possibles à afficher dans le spinner.

- J'affiche le tableau dans le panels(3).

- Si je clique dans une des cellules des colonnes 5 ou 7 ,
If rc.Col= 5 OR rc.Col=7 Then 'Code OACI
je fais afficher le spinner pour choisir la valeur.
'XXXXX Initialisation du spinner LR1 XXXXXXXXXXXXXXXXXXXXXXXX
'lecture du fichier
Dim List1 As List
Dim H() As String
Dim headers As List
List1 = StringUtils1.LoadCSV2(File.DirRootExternal, "fic2.csv", ";", headers)
Dim H(headers.Size) As String
For I = 0 To headers.Size - 1
H(I) = headers.Get(I)
Next
List1 = StringUtils1.LoadCSV(File.DirRootExternal, "fic2.csv", ";")
Dim firstRow() As String
firstRow = List1.Get(0)
Dim H(firstRow.Length)
For I = 0 To firstRow.Length - 1
H(I) = "Col" & (I + 1)
Next

'recopie dans le spinner
NumberOfColumns = H.Length
ColumnWidth = sv.Width / NumberOfColumns 'update the columns widths
ColumnWidth_1 = ColumnWidth-ColLineWidth
'SetHeader(h,numPanel)
LR1.Initialize("LR1")
LR1.Add("Choix :")
For I = 1 To List1.Size - 1
Dim row() As String
row =List1.Get(I)
LR1.Add(row(3)&row(4)&" "&row(2))
Next

'Affichage du spinner
panels(3).AddView(LR1, 20dip, 30dip,120dip, 40dip)

J'attend qu'une valeur soit selectionnée
Do While LR1.SelectedIndex<=0
Delay(1000)
Loop

- Une fois la valeur selectionnée, j'ai le message de confirmation.
txt = "Do you want change the oaci code ?"
answ=Msgbox2(txt,"Warning","Yes","","No",Null)

- En répondant oui, la valeur selectionner est recopiée dasn la cellule et j'essaye de sauver le contenu du tableau
If answ=DialogResponse.POSITIVE Then
l.Text=LR1.SelectedItem.SubString2(0,7)
SaveTableToCSV(table, File.DirRootExternal, "fic1.csv")
LR1.RemoveView
End If

IL y a bien sauvegarde mais DU CONTENU DU SPINNER dans le fichier1 et non comme je le voudrai du contenu du tableau.

Résultat des courses, à la fin non seulement le contenu du tableau n'a pas été sauvegardé mais les contenus des deux fichiers 1 et 2 sont devenus identiques.
 
Last edited:

wolf

Member
Licensed User
Longtime User
En relisant ma réponse j'ai eu une idée :

Inverser les positions du save et du remove view
l.Text=LR1.SelectedItem.SubString2(0,7)
SaveTableToCSV(table, File.DirRootExternal, "carnetdevol.csv")
LR1.RemoveView

en
l.Text=LR1.SelectedItem.SubString2(0,7)
LR1.RemoveView
SaveTableToCSV(table, File.DirRootExternal, "carnetdevol.csv")

Je teste cela et vous tient au courant.
 

klaus

Expert
Licensed User
Longtime User
Sans plus de code il est impossible d'aider.
Il y a trop de questions ouvertes.
- Est-ce que les portions de code que vous avez postés sont dans une même routine.
- Comment est défini le label l
etc.
Je vous ai envoyé un mail privé avec mon adresse e-mail. Pour le consulter clicquez sur Private Messages en haur à droite juste sous Welcome, wolf.

Meilleures salutations.
 

wolf

Member
Licensed User
Longtime User
Merci Klaus,

Je viens de vous préparer un exemple complet avec les mêmes morceaux de code.

Le fichier 1 (des noms de couleurs) est affiché dans un tableau dans le panel1 et le ficher 2(des noms d'animaux) est affiché dans le panel2.

Si on clique sur une cellule du paneau 1 : un spinner propose des valeurs du fichier 2.

Si on fait un choix et on valide :
- la modif est portée dans la cellule "correspondante" du panel 2.
- le fichier 1 est écrasé par le fichier 2.

Si on relance l'application, on n'a alors plus que deux tableaux d'animaux.
 

klaus

Expert
Licensed User
Longtime User
Voila, j'ai regardé votre programme:
- vous avez 2 fichiers, fichier1 avec des couleurs et fichier2 avec des animaux.
- dans la routine Activity_Create vous initialisez Panel1 avec fichier1 (couleurs) et Panel2 avec fichier2 (animaux).
- après lancement du programme, Panel2 est visible avec les animaux.
- en cliquant sur une cellule, vous initialisez le Spinner avec les valeurs du fichier2 (animaux).
- après sélection d'une nouvelle valeur dans le Spinner, et confirmation du changement, vous mettez à jour la table (Panel2 avec fichier2 les animaux).
- puis, après modification vous sauvez la table des animaux dans fichier1 les couleus ???
Il est donc 'normal', avec votre code que le fichier1 soit mis à jour avec les valeurs de la table animaux au lieu de celui des couleurs. La nouvelle valeur y est d'ailleurs, ce qui montre que la mise à jour fonctionne, seulement pas dans le bon fichier.

Votre problème est que dans la routine Cell_Click vous initialisez systématiquement le Spinner avec les valeurs du fichier2 et sauvez dans fichier1, quel que soit le Panel visible.
Vous devez gérer, dans la routine Cell_Click, les différents fichiers en fonction du Panel visible, donc la table affichée.

Il serait plus judicieux de définir des variables indicées pour les panels, les fichiers des tables et les fichiers des valeurs de sélection (Spinner). Puis gérer l'indice en fonction de la table visible.

Il n'est pas nécessaire de réinitialiser le Spinner LR1 et de le supprimer à chaque click sur une cellule. Il suffit de l'initialiser une fois et de le rendre visible ou invisible. Et le réinitialiser seulement s'il y a un changement des données dans le fichier correspondant.

Mais comme je n'ai toujours pas compris ce que vous voulez faire exactement je n'ai pas modifié votre programme.
Pourquoi un Panel avec des animaux et un autre avec des couleurs?
Les valeurs dans le Spinner pour la sélection sont les même que celles dans la table?
Est-ce qu'un base de données ne serait pas plus judicieuse?

Meilleures salutations.
 

wolf

Member
Licensed User
Longtime User
Bonjour Klaus,

Merci de voitre réponse.

puis, après modification vous sauvez la table des animaux dans fichier1 les couleus ???
.
C'est justement ce que je ne voudrai pas et le probléme qui je cherche à résoudre. il faudrait que après modification de la table des couleurs par la valeur choisie dans le spinner le tableau des couleurs soit f sauvé dans le fichier des couleurs.
Au passage içi cela reviendrait à mettre un animal à la place d'une couleur, c'est juste pour le test.

Votre problème est que dans la routine Cell_Click vous initialisez systématiquement le Spinner avec les valeurs du fichier2 et sauvez dans fichier1, quel que soit le Panel visible.
Vous devez gérer, dans la routine Cell_Click, les différents fichiers en fonction du Panel visible, donc la table affichée.
C'est ce que je ne reussi pas à faire.

Il serait plus judicieux de définir des variables indicées pour les panels, les fichiers des tables et les fichiers des valeurs de sélection (Spinner). Puis gérer l'indice en fonction de la table visible.

Il n'est pas nécessaire de réinitialiser le Spinner LR1 et de le supprimer à chaque click sur une cellule. Il suffit de l'initialiser une fois et de le rendre visible ou invisible. Et le réinitialiser seulement s'il y a un changement des données dans le fichier correspondant.
Dans mon vrai projet c'est fait ainsi (avec utilisation des betterslidingpannels)

Pourquoi un Panel avec des animaux et un autre avec des couleurs?
Ca c'est completement bidon pour l'exmple test que je vus ai écrit. Mon projet porte sur des données aeronautiques.
C'est aussi pour cela que je ne veux pas utiliser une base de donnée pour que l'utilisateur puissent utiliser et manipuler des fichiers excel existant.
 
Last edited:

wolf

Member
Licensed User
Longtime User
Probléme résolu !

Merci Klaus de m'avoir préciser la solution par :
Vous devez gérer, dans la routine Cell_Click, les différents fichiers en fonction du Panel visible, donc la table affichée.

Dans la soirée je mettrai le programme TEST au propre et je le mettrai dans ce forum.

Merci encore.
 

klaus

Expert
Licensed User
Longtime User
Voilà, j'ai modifié votre programme test, comme expliqué dans mon précédent post.
J'ai dû aussi définir un array de ScrollViews pour différentier les deux tables.
Maintenant on peut changer un animal en couleur et une couleur en animal :).

Meilleures salutations.
 

Attachments

  • Test1.zip
    7.7 KB · Views: 395

wolf

Member
Licensed User
Longtime User
Merci beaucoup de votre version "nette et carré".

Elle m'a permis de comprendre quelques points supplémentaires, merci pour la leçon.

Du coup il est inutile que je mette ma version en ligne.

En ce qui me concerne : fin de ce post mais ! Il y en aurra surement d'autres ! :sign0104:
 
Top