Comment enregistrer dans une liste que les éléments non vide

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment enregistrer dans une liste que les éléments non

Message par Ar-S »

les questionnaires sont anonymes
Il te suffit de virer NOM et de, par exemple, utiliser UTILISATEUR1, UTILISATEUR2 etc ;)
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment enregistrer dans une liste que les éléments non

Message par Micoute »

Bonjour Ar-s,

je crois plutôt que je vais mettre Compteur.i et l'incrémenter et faire:

Code : Tout sélectionner

Prospect\Compteur = Compteur
Ou alors mettre une Map.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment enregistrer dans une liste que les éléments non

Message par Micoute »

Bonjour à tous,

Toujours sur le même programme et toujours à l'adresse : https://www.dropbox.com/sh/qvyo6b8v218c ... oFKpa?dl=0, Je n'arrive pas à indiquer les valeurs moyennes des différents Indices de masse corporelle avec certains critères, alors j'ai ajouter un petit fichier bidon pour l'exercice, j'ai aussi ajouter un bouton "Suivant" qui ajoute un élément dans la Map que ajoutée également, tant que je suis dans le programme, ça va à peu près, car ma mémoire à court terme est défaillante, je me souvent de mon époque scolaire, mais pas de ce que j'ai mangé hier midi.

Le problème c'est que quand je reviens sur l'ouvrage, il me faut quelque temps pour m'y replonger et je prend souvent les mêmes notes que la veille, mais sinon ça avance doucement mais sûrement.

Je vous remercie tous pour l'aide que vous allez m'apporter.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Comment enregistrer dans une liste que les éléments non

Message par Marc56 »

Micoute a écrit : je crois plutôt que je vais mettre Compteur.i et l'incrémenter
Plutôt qu'un compteur, je ferais un identifiant unique composé par exemple de la Date + Heure + Nom du PC
Ainsi tu peux même effectuer des saisies sur plusieurs PC et fusionner tous les fichiers ensembles pour faire des statistiques.

Pour créer un identifiant unique (sauf si plusieurs PC ont le même nom)

Code : Tout sélectionner

ID$ = FormatDate("%yyyy/%mm/%dd_%hh:%ii:%ss", Date()) + "_" + ComputerName()
Comme la date est au format ISO tu peux ensuite classer par date en utilisant le classement alphabétique.

PS. Perso je stockerais dans un fichier CSV plutôt que JSON ou une base SQLite, cela rend plus simple les statistiques.
Avec un fichier CSV tu peux ensuite utiliser tes données directement dans un tableur.

:wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment enregistrer dans une liste que les éléments non

Message par Micoute »

Merci Marc56, c'est une bonne idée un fichier CVS, ça fera un fichier plus court, par compte comme j'utilise une Map, le compteur me paraissait plus pratique, déjà que je suis très embrouillé, je ne sais même pas si je vais réussir à terminer ce programme, car je suis à cours d'idée, si tout pouvait être aussi facile que le questionnaire, ça irait vite, mais déjà je me demande si je suis parti dans le bon sens.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Comment enregistrer dans une liste que les éléments non

Message par Marc56 »

Bonjour Micoute,

Voici un moyen un peu vite fait pour sauvegarder en plus des données en CSV tout en conservant ta méthode actuelle.
J'ai juste ajouté quelques lignes à ta procédure de sauvegarde.

(À adapter)(par exemple concaténer la chaine à l'avance pour n'envoyer qu'un seul WriteString plutôt que 10)

Code : Tout sélectionner

Procedure Sauvegarde()
  ;Création d'un objet JSON
  CreateJSON(#FichierJSON)
  
  ;Insertion de la liste chaînée structurée "Prospect()" dans l'objet JSON
  InsertJSONMap(JSONValue(#FichierJSON), Prospect())
  
  ;Sauvegarder du fichier des prospects en JSON
  SaveJSON(#FichierJSON, Fichier_prospects, #PB_JSON_PrettyPrint)
  
  ;Sauvegarder du fichier des prospects en CSV
  Protected CSV_File$ = Rep$ + "Prospects.csv"
  Protected ID_CSV_File
  If OpenFile(ID_CSV_File, CSV_File$, #PB_File_Append)
      ForEach Prospect()
          With Prospect()
              WriteString(ID_CSV_File, Str(\Genre)      + ";")
              WriteString(ID_CSV_File, Str(\TrancheAge) + ";")
              WriteString(ID_CSV_File, Str(\DiabFam)    + ";")
              WriteString(ID_CSV_File, Str(\ActPhys)    + ";")
              WriteString(ID_CSV_File, Str(\FruitLeg)   + ";")
              WriteString(ID_CSV_File, Str(\TourTaille) + ";")
              WriteString(ID_CSV_File, Str(\Tension)    + ";")
              WriteString(ID_CSV_File, Str(\SangSucre)  + ";")
              WriteString(ID_CSV_File, Str(\IMC)        + ";")
              WriteString(ID_CSV_File, Str(\Compteur)   + ";")
          EndWith
      Next
      CloseFile(ID_CSV_File)
  Else
      MessageRequester("Attention", "Problème pour écrire le fichier CSV")
  EndIf

EndProcedure
:wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment enregistrer dans une liste que les éléments non

Message par Micoute »

Merci beaucoup Marc56 pour cet exemple,

tu n'aurais pas dans tes tiroirs une procédure qui fasse l'inverse, c'est à dire qui charge la Map avec les données du fichier.CSV ? Ca me serait d'un grand secours et j'apprendrais vraiment un truc que je ne connais pas du tout, et je t'en remercierai jamais assez.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Marc56
Messages : 2197
Inscription : sam. 08/févr./2014 15:19

Re: Comment enregistrer dans une liste que les éléments non

Message par Marc56 »

Bonsoir Micoute,

Voila un code autonome qui charge un CSV dans une map
(les clés sont ici un numéro)

Code : Tout sélectionner

Structure sProspect
    Genre.b
    TrancheAge.b
    DiabFam.b
    ActPhys.b
    FruitLeg.b
    TourTaille.c
    Tension.b
    SangSucre.b
    IMC.i
    Compteur.i
EndStructure

Global NewMap Prospect.sProspect()

CSV_File$ = Rep$ + "Prospects.csv"

If ReadFile(ID_CSV_File, CSV_File$)
    While Not Eof(ID_CSV_File)
        Read_Line$ = ReadString(ID_CSV_File)
        i + 1
        AddMapElement(Prospect(), Str(i))
        With Prospect()
            \Genre      = Val(StringField(Read_Line$,  1, ";"))
            \TrancheAge = Val(StringField(Read_Line$,  2, ";"))
            \DiabFam    = Val(StringField(Read_Line$,  3, ";"))
            \ActPhys    = Val(StringField(Read_Line$,  4, ";"))
            \FruitLeg   = Val(StringField(Read_Line$,  5, ";"))
            \TourTaille = Val(StringField(Read_Line$,  6, ";"))
            \Tension    = Val(StringField(Read_Line$,  7, ";"))
            \SangSucre  = Val(StringField(Read_Line$,  8, ";"))
            \IMC        = Val(StringField(Read_Line$,  9, ";"))
            \Compteur   = Val(StringField(Read_Line$, 10, ";"))
        EndWith
    Wend    
    CloseFile(ID_CSV_File)
Else
    MessageRequester("Erreur", "Ne peut lire le fichier de statistiques")
EndIf

ForEach Prospect()
    j + 1
    Debug "--- " + j
    With Prospect()
        Debug "Genre        " + \Genre
        Debug "TrancheAge   " + \TrancheAge
        Debug "DiabFam      " + \DiabFam
        Debug " etc..."
    EndWith
Next
PS. Dans mon code précédent, je me suis trompé: il faut mettre un saut de ligne entre chaque nouvel utilisateur. Donc un CRLF après le dernier

Code : Tout sélectionner

          With Prospect()
              WriteString(ID_CSV_File, Str(\Genre)      + ";")
              WriteString(ID_CSV_File, Str(\TrancheAge) + ";")
              WriteString(ID_CSV_File, Str(\DiabFam)    + ";")
              WriteString(ID_CSV_File, Str(\ActPhys)    + ";")
              WriteString(ID_CSV_File, Str(\FruitLeg)   + ";")
              WriteString(ID_CSV_File, Str(\TourTaille) + ";")
              WriteString(ID_CSV_File, Str(\Tension)    + ";")
              WriteString(ID_CSV_File, Str(\SangSucre)  + ";")
              WriteString(ID_CSV_File, Str(\IMC)        + ";")
              WriteString(ID_CSV_File, Str(\Compteur)   + #CRLF$) ; <--- Ajouter un saut de ligne après chaque enregistrement
          EndWith
À noter que comme tes valeurs sont toujours des chiffres et que seul l'IMC est un nombre, tu pourrais même optimiser en ne mettant pas de séparateur et en utilisant Mid() pour couper la chaine. (Un peu comme pour un numéro de sécu où chaque chiffre est significatif par sa position dans la chaine).

:wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment enregistrer dans une liste que les éléments non

Message par Micoute »

Mais c'est merveilleux, un vrai grand merci Merc56, c'est franchement génial, mon programme a bien avancer du coup.

Il ne manque plus que 2 procédure principales : une pour créer un site et l'autre pour ouvrir un site déjà enregistré.

Nouvelle mise à jour, toujours à l'adresse:
https://www.dropbox.com/sh/qvyo6b8v218c ... oFKpa?dl=0
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment enregistrer dans une liste que les éléments non

Message par Ar-S »

une pour créer un site et l'autre pour ouvrir un site déjà enregistré
Qu'entends tu par site ?
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment enregistrer dans une liste que les éléments non

Message par Micoute »

Bonjour Ar-s,

un site est un lieu de sensibilisation au diabète, ce sont principalement les foires et les marchés, donc pour créer un site, qui se compose ainsi "jjmmaa_ville_endroitn°ordinateur". ex:280720_Coutances_marché3

c'est comme tu l'as compris : la date de la campagne + la ville + le lieu (foire ou marché, etc...) + le numéro du thinkpad qui a servi à créé le fichier de campagne, j'entends par campagne, le site de sensibilisation, je pense que c'est clair.

Merci beaucoup pour l'aide qui m'est apportée et je m'aperçois que ça commence à être collégial et ça me fait avancer beaucoup, alors merci encore.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Comment enregistrer dans une liste que les éléments non

Message par Ar-S »

Tu n'as qu'a, lors de la sauvegarde, créer ton fichier dans un dossier "jjmmaa_ville_endroit_ordinateur"
(Je t'invite à ne pas mettre d'accents dans tes noms de fichiers.)
Pour t'y retrouver par la suite, j'ai mis la date au format %YYYY%MM%DD (a l'anglaise), c'est plus facile à classer ainsi.
Pour une histoire de conformité, j'ai remplacé les espaces par des "_" pour les lieux ou ville en ayant :
ex :
Ville : LYON
LIEUX : CROIX ROUSSE

donnera chez moi P:\PROG\PB\PB5.7x_x64\2020_07_28_LYON_CROIX_ROUSSE_NOMPC\fichierpref.ini comme chemin du fichier pref.


Au 1er lancement du soft :

Code : Tout sélectionner

Procedure.s InitComputer ()
  
  Date$ = FormatDate("%yyyy_%mm_%dd", Date()) + "_"
  C$ = ComputerName()
  Ville$  = InputRequester("Ville","Indiquer la ville","")
  Lieu$   =  InputRequester("Lieu","Indiquer le lieu","")
  
  
  If Ville$ = "" Or Lieu$ = ""
    MessageRequester("Erreur","Vous devez indiquer la vile ET le lieu",0)
    End
  Else
    
    Dossier$ = Date$+Ville$+"_"+Lieu$+"_"+C$
    Dossier$ = ReplaceString(Dossier$," ","_")
    
    ProcedureReturn Dossier$
  EndIf
  
  EndProcedure




PATHPERSO$ = InitComputer()
PATH$ = GetCurrentDirectory()+PATHPERSO$+"\fichierpref.ini"

Debug Path$

C'est un exemple qui peut te mettre sur la voie.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment enregistrer dans une liste que les éléments non

Message par Micoute »

Merci Ar_s, j'ai trouvé une autre solution que j'avais dans l'ancien logiciel et que j'ai adaptée.

Nouvelle mise à jour toujours à la même adresse

Il ne reste plus qu'à régler la clé automatique de la Map, je ne vois pas où j'oublie d'incrémenter le compteur.

Et merci encore à tous ceux qui me donne de l'aide bien appréciée.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Comment enregistrer dans une liste que les éléments non

Message par falsam »

Micoute a écrit :Il ne reste plus qu'à régler la clé automatique de la Map
J'espére que tu n'envisages pas un tri de map. Une map ne peut pas être triée.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Comment enregistrer dans une liste que les éléments non

Message par falsam »

Micoute a écrit :Il ne reste plus qu'à régler la clé automatique de la Map
J'espére que tu n'envisages pas un tri de map. Une map ne peut pas être triée.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre