IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

Problème avec HlisteRubrique [WD20]


Sujet :

WinDev

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2002
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2002
    Messages : 231
    Points : 116
    Points
    116
    Par défaut Problème avec HlisteRubrique
    Bonjour,

    Je souhaite contrôler la structure des fichiers fichiers utilisés dans une application avec ceux contenus dans un répertoire de sauvegarde pour valider la récupération de la sauvegarde.

    Je contrôle avec hlisterubrique la structure de chaque fichier programme avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    nom_fichier = ExtraitChaîne(listefichier, 1, RC)
    TANTQUE var_structure  = True 
    	// Ctrl si structure identique à analyse en cours dans programme 
    	var_rub_programme= HListeRubrique(nom_fichier,hLstDétailPlus)
    	HDéclareExterne(rep_restaure+"\"+ nom_fichier +".fic","Fic_ext")
    	var_rub_import = HListeRubrique("Fic_ext",hLstDétailPlus)
    	HAnnuleDéclaration(rep_restaure+"\"+ nom_fichier +".fic")
    	// Ctrl si erreur 
    	SI var_rub_programme <> var_rub_import THEN var_structure = False 
    	// fichier suivant 
    	var_i ++ 
    	nom_fichier = ExtraitChaîne(listefichier, var_i, RC)
    FIN

    Le problème est que la récupération de la structure du premier fichier , celui utilisé actuellement par le programme me renvoi le libellé des zones
    Pro_Proprietaire N 5 4 1 Identifiant de Proprietaire
    Pro_Titre N 3 2 1 Titre
    Pro_Nom T 2 25 1 Nom
    Pro_Prenom T 2 15 1 Prenom
    Pro_Adresse T 2 25 1 Adresse
    Pro_Ville T 2 15 1 Ville
    etc ....
    Alors que la description issu du fichier déclaré en externe ne me renvoi pas les libellés

    Pro_Proprietaire N 5 4 1
    Pro_Titre N 3 2 1
    Pro_Nom T 2 25 1
    Pro_Prenom T 2 15 1
    Pro_Adresse T 2 25 1
    Pro_Ville T 2 15 1
    etc ...
    Donc lorsque je contrôle un changement de structure de fichiers , il y a toujours une différence alors que ce n'est pas le cas ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	SI var_rub_programme <> var_rub_import THEN var_structure = False
    J'ai testé plusieurs options pour Hlisterubrique sans résultat

    Si vous avez une idée

    Philippe

  2. #2
    Rédacteur/Modérateur

    Avatar de dsr57
    Homme Profil pro
    Analyste programmeur senior
    Inscrit en
    Octobre 2003
    Messages
    1 139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Analyste programmeur senior
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 139
    Points : 4 681
    Points
    4 681
    Billets dans le blog
    22
    Par défaut
    Bonjour.

    Je pense que tu devras tester valeurs par valeurs.
    ------------------------------------------------------------------------------------------------------------------------------------------
    Mon message vous a aidé, pensez à remercier . La discussion est résolue, n'oubliez pas le tag
    ------------------------------------------------------------------------------------------------------------------------------------------
    Site perso : Formation, Expérience, Réalisations, ...
    Blog : Le Blog de DSR57 - Programmation WinDev

  3. #3
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonjour,

    Tout dépend du niveau de contrôle que vous voulez atteindre.

    Si vous ne précisez pas l'option hLstDétail, les listes ne comprendront que les noms des rubriques et seront donc comparables.
    Evidemment, vous ne détecterez alors pas d'éventuelles modifications de la structure d'une rubrique sans modification de sa désignation.

    Si vous voulez garantir une similitude jusqu'au niveau 'intime' des rubriques, je ne vois que le passage par une chaîne intermédiaire, pour le fichier de l'analyse, résultant de la concaténation de la sous-chaîne de HListeRubrique précédant le Libellé et de celles qui le suivent. A noter que si vous n'utilisez pas l'option hLstDétailPlus, le Libellé est la dernière sous-chaîne de la liste.
    Vous pourrez ensuite comparer le HListeRubrique de l'analyse (modifié) au HLIsteRubrique du fichier extérieur.

    Notez aussi que, dans tous les cas, vous avez intérêt à utilisez l'option hLstTriée, parce qu'autrement, l'ordre des rubriques pourrait ne pas être identique et votre comparaison échouerait, à tort.

    Bon travail

    Hemgé

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur indépendant
    Inscrit en
    Mai 2002
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur indépendant

    Informations forums :
    Inscription : Mai 2002
    Messages : 231
    Points : 116
    Points
    116
    Par défaut
    Merci pour vos réponses

    Voici une solution qui permet de lister l'ensemble des fichiers utilisés par l'application
    Liste des contrôles par rapport au répertoire de sauvegarde :
    - Tous les fichiers sont présents
    - Toutes les structures sont identiques

    Je prend chaque rubrique de fichier que je contrôle ensuite zone par zone
    Pour la zone du libellé en position 6 des tabulations , je ne fait pas le contrôle.

    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
     
    // Liste des fichiers de la base 
    listefichier = HListeFichier(hLstNormal)
    // rempli la table
    var_i = 1 
    var_existe = True 
    var_structure = True 
    var_traite = True 
    // Debut du controle 
    nom_fichier = ExtraitChaîne(listefichier, 1, RC)
    TANTQUE var_traite = True 
    	// Ctrl si existe 
    	SI fFichierExiste(rep_restaure+"\"+ nom_fichier +".fic") = Faux OR fFichierExiste(rep_restaure+"\"+nom_fichier+".ndx") = Faux ALORS 
    		var_existe = Faux
    		IF gliste_ini.Global_logs > 1 THEN Ecrire_Log("Fichier " + nom_fichier + "non trouvé dans le répertoire de sauvegarde " + Var_rep_sauve + " dans Sauvegarde/ Restauration de Données /65")
    	FIN
    	// Ctrl si structure identique à analyse en cours dans programme 
    	var_rub_programme= HListeRubrique(nom_fichier,"",hLstDétailPlus + hLstTriée)
    	HDéclareExterne(rep_restaure+"\"+ nom_fichier +".fic","Fic_ext")
    	var_rub_import = HListeRubrique("Fic_ext",hLstDétailPlus + hLstTriée)
    	HAnnuleDéclaration("fic_ext")
    	var_ext = 1 
    	var_ligne  = ExtraitLigne(var_rub_programme , var_ext )
    	TANTQUE var_ligne <>EOT
    		// Ctrl si pas fin de fichier 
    		var_ligne  = ExtraitLigne(var_rub_programme , var_ext )
    		IF var_ligne <> EOT THEN 
    			// Extraction lign à ligne 
    			var_ligne_programme = ExtraitLigne(var_rub_programme , var_ext )
    			var_ligne_import = ExtraitLigne(var_rub_import , var_ext )
    			// Ctrl chaque ligne en omettant position 6 avec libellé 
    			var_det_programme  = ExtraitChaîne(var_ligne_programme, rangPremier)
    			var_det_import  = ExtraitChaîne(var_ligne_import, rangPremier)
    			SI var_det_programme <> var_det_import THEN var_structure = False 	
    			var_tab = 1 
    			TANTQUE (var_det_programme  = var_det_import) AND (var_tab <= 7 )
    				var_det_programme = ExtraitChaîne(var_ligne_programme, rangSuivant)
    				var_det_import = ExtraitChaîne(var_ligne_import, rangSuivant)
    				var_tab ++ 
    				// Ctrl si erreur 
                                 SI (var_tab <> 6) AND (var_det_programme <> var_det_import) THEN var_structure = False 	
    			FIN
    			// incremente compteur de ligne 
    			var_ext ++ 
    		END 		
    	END 	
    	// fichier suivant 
    	var_i ++ 
    	nom_fichier = ExtraitChaîne(listefichier, var_i, RC)
    	IF nom_fichier = EOT THEN var_traite = False 
    	IF (var_existe = False) OR ( var_structure = False ) THEN var_traite = False 
    FIN
    Pour ceux qui serait intéresser voici le suite du traitement avec la copie si les structures des fichiers sont identiques

    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
     
    IF (var_existe = Vrai) AND (var_structure = True )  THEN
    	// dernier message avant lancement 
    	SI OuiNon("Le processus de restauration est prêt à être lancer ,  Confirmez le lancement ?") = Non ALORS RETOUR	
    	//*************************
    	// Recopie des sauvegardes 
    	//*************************
    	JAUGE_données=0
    	Var_increment= 7.0
     
    	var_i = 1 
    	var_existe = True 
    	nom_fichier = ExtraitChaîne(listefichier, 1, RC)
    	TANTQUE nom_fichier <> EOT
    		// recopie 
    		HFerme(nom_fichier)
    		fSupprime(fRepExe  + "\"+nom_fichier+".fic")
    		fSupprime(fRepExe  + "\"+nom_fichier+".ndx")
    		fCopieFichier(rep_restaure  + "\"+nom_fichier +".fic" , fRepExe +"\"+nom_fichier +".fic")
    		fCopieFichier(rep_restaure  + "\"+nom_fichier +".ndx" , fRepExe +"\"+nom_fichier +".ndx")
    		IF gliste_ini.Global_logs > 1  THEN Ecrire_Log("Restauration du fichier " + nom_fichier +" du répertoire de sauvegarde " + Var_rep_sauve + " dans Sauvegarde/ Restauration de Données /80")
    		HOuvre(nom_fichier)
    		JAUGE_données=JAUGE_données+ Var_increment
    		// fichier suivant 
    		var_i ++ 
    		nom_fichier = ExtraitChaîne(listefichier, var_i, RC)
    	FIN
     
    	//************************
    	// fin de la restauration 
    	//*************************
     
    END

    Merci pour vos conseils

    Philippe

  5. #5
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonsoir

    C'est plutôt à ceci que je pensais, qui est plus concis et probablement plus rapide :
    - les 'parcours' sont réputés plus rapides
    - on évite toutes les affectations et ExtraitChaines() intermédiaires
    - je suppose qu'il vaut mieux comparer deux chaines plus longues que l'ensemble de leurs sous-chaînes deux à deux.
    En plus, on construit une seule fois le nom complet du fichier (sauf extension).

    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
     
    sRubrAna, sRubrExt sont des chaînes 
    sFicExt,rep_restaure sont des chaînes  
    Ok est un booléen = Vrai 
     
    POUR TOUTE CHAÎNE sFichier DE HListeFichier(hLstNormal) SEPAREE PAR RC 
    	sFicExt = fConstruitChemin(rep_restaure, sFichier) //L'extension est omise 
    	SI fFichierExiste(sFicExt + ".fic") _ET_ fFichierExiste(sFicExt + ".ndx") ALORS 
    		sRubrAna = HListeRubrique(sFichier,"",hLstDétailPlus + hLstTriée) 
    		sRubrAna = sRubrAna[[A PositionOccurrence(sRubrAna, TAB, 5) - 1]] + sRubrAna[[PositionOccurrence(sRubrAna, TAB, 6) A]]
    		//extraction des 5 premiers détails et concaténation avec l'extraction des derniers détails à partir du 7e (TAB compris).
    		HDéclareExterne(sFicExt +".fic","Fic_ext")
    		sRubrExt = HListeRubrique("Fic_ext",hLstDétailPlus + hLstTriée)
    		HAnnuleDéclaration("fic_ext")
    		SI sRubrAna <> sRubrExt ALORS Ok = Faux
    		 //On va sortir dès qu'il y a inégalité, sans terminer le parcours 
    		 //On pourrait continuer et alimenter un log des fichiers modifiés
    	SINON
    		Ok = Faux
    		//On va sortir si un fichier manque dans la suavegarde 
    		//On pourrait continuer et alimenter un log des fichiers manquants
    	FIN
    	SI PAS Ok ALORS SORTIR 
    FIN
    Bon travail,

    Hemgé

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo