Bonjour,
Pour reprendre tbc92, après ton halias, et avant/après ton hchangerep, fais un info(tache166.Repertoire, Tache166.NomPhysique).
Bonjour,
Pour reprendre tbc92, après ton halias, et avant/après ton hchangerep, fais un info(tache166.Repertoire, Tache166.NomPhysique).
Il me bloque avant le HAlias avec ce message:
Le fichier, la vue ou la requête '_SOURCE_TACHE166_1' n'est pas connu.
Quand je fais en pas à pas, je vois que avec après avoir déclarer TACHE166, j'ai TACHE166 = _SOURCE_TACHE166_1
Après le HAlias c'est pareil et après le HChangeRep aussi...
Pour le TACHE166 à l'air bien, j'arrive a le lire avec le Centre de controle
J'avais zappé que tu étais en Serveur, et pas en classique.
Je répète quand même : info(tache166.Repertoire, Tache166.NomPhysique , tache166.nbenr).
Après le hOuvre, avant la première instruction de type hitPremier, tu ajoutes :info(tache166.Repertoire, Tache166.NomPhysique , tache166.nbenr).
Tant que cette instruction n'envoie pas les résultats voulus, c'est que ce n'est pas bon.
Et tu sauras ce qui n'est pas bon.
Accessoirement, les fonctions hOuvre, hChangeNom etc etc renvoient des booléens. C'est pas uniquement pour le plaisir, c'est pour que le programmeur puisse sécuriser son programme.
Peut-être que ces tests vont te donner des informations. Je ne pense pas ... mais ce serait dommage de passer tout ce temps, alors que la doc nous dit que hErreurInfo peut donner la réponse.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Si hChangeConnexion(... ) = faux alors erreur (herreurinfo() ) retour fin Si hOuvre (... ) = faux alors erreur (herreurinfo() ) retour fin
Les HErreurInfo() ne donnent rien car il détécte pas d'erreur avec HChangeConnexion ou HOuvre.
Les info() me donnent _SOURCE_TACHE166_1 et ceci tout le temps à partir de la première ligne de commande qui est: TACHE166 est une Source de Données <description=TACHE>
Normalement, info() te donne 3 informations : le nom physique du fichier, son répertoire, et le nombre de'enregistrements.
Ici, tu ne le dis pas, mais je suppose que _SOURCE_TACHE166_1 , c'est pour le nom physique.
Du coup, tu ajoutes avant cette instruction info() ... tache166.nomPhysique = "Tache166"
Ou bien hChangeNom("Tache166","Tache166")
Et tu retestes.
En répertoire il me met: .\Bases_Terrain\166
En nom physique j'ai: _SOURCE_TACHE166_1
.nomPhysique ne marche pas car c'est que en lecture et HChangeNom() n'a pas marché non plus.
J'ai essaye de mettre TACHE166 dans la racine de la base, mais c'est pareil, il me créé _SOURCE_TACHE166_1 et ne veut pas récupérer le TACHE166
Bonjour,
Cette partie de code m'intrigue ,si tu préfixais, cela éviterais des problèmes.
Dans la ligne 1 Tache166 est une source de données
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 (1) Si HAlias(TACHE, TACHE166) = Vrai ALORS (2) HChangeRep(TACHE166, "Bases_Terrain\166") (3) HOuvre(TACHE166)
Dans la ligne 2 Tache166 doit être un le nom d'un fichier de données
Dans la ligne 3 Tache166 est un le nom d'un fichier de données (qui par ailleurs est ouvert sans un HCréationSiInexistant préalable)
D'où vient la table TACHE166. Pour les ligne 2 et 3 Windev ne reconnaît que les tables décrites dans le MLD
Une solution pour faire ce que tu désires est de
1-Copier les données de TACHE dans un tableau de structure/classe via FichierVersTableau
2-Changer de répertoire HChangeRep(TACHE,"Bases_Terrain\166")
3-Créer le fichier
4-Effectuer la copie du tableau dans le fichier nouvellement créé
Un truc du style
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 tabMesTaches est MTaches clTache est MTache saRepInitial est chaine saRepInitial=TACHE..Répertoire //On récupère les données dans le tableau FichierVersMémoire(tabMesTaches,TACHE) //On change de répertoire HChangeRep(TACHE,"Bases_Terrain\166") //A partir de maintenant, quand on utilise TACHE, c'est dans ce répertoire que les données seront copiées HCréationSiInexistant(TACHE) //Copie des données POUR TOUT clTACHE de tabMesTaches MemoireVersFichier(clTache,TACHE) HEnregistre(TACHE) FIN //On revient au répertoire d'origine HChangeREP(TACHE,saRepInitial)
Bonjour,
J'ai enfin réussis.
Voici le code:
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 TACHE166 est une Source de Données <description=TACHE> SI HAlias(TACHE, TACHE166) = Vrai ALORS HFerme(TACHE) HChangeNom(TACHE166, "TACHE166") HChangeRep(TACHE166, "Bases_Terrain\166") HLitPremier(TACHE166, "IDTACHE") TANTQUE PAS HEnDehors(TACHE166) SI HCopieEnreg(TACHE, TACHE166) = Vrai ALORS HAjoute(TACHE) SI HErreurDoublon() = Vrai OU ... HErreurIntégrité() = Vrai ALORS SI OuiNon("Erreur de doublon ou d'intégrité pendant l'ajout. Continuer?") = Faux ALORS SORTIR FIN FIN SINON Erreur("Copie d'enregistrement impossible") SORTIR FIN HLitSuivant(TACHE166, "IDTACHE") FIN SINON Erreur("Détail du Problème" + HErreurInfo()) FIN
Merci beaucoup à tous ceux qui se sont penchés sur son problème
Juste un point de détail, sans vrai rapport avec la question.
Tu fais :
Tu te retrouves avec un gros bloc de 20 ou 30 lignes (et souvent plus dans des traitements plus complexes) et à la fin, le SINON correspondant au traitement d'erreur .... mais quand tu relis le code 2 mois plus tard... tu dois naviquer pour savoir d'où vient ce pu{*%£n de SINON
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 si halias(...) = vrai alors // gros traitement de 30 lignes sinon erreur ( ....) fin
Je te conseille :
Si tu enchaines plusieurs controles de bon fonctionnement, tu vas avoir plein de SI imbriqués, alors qu'en quittant la procédure aussitôt dès qu'il y a un plantage, tu as un code beaucoup plus facile à relire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 si halias(...) = faux alors erreur ( ....) RETOUR // ou encore mieux RENVOYER -1 ou RENVOYER FAUX fin // gros traitement de 30 lignes
Merci beaucoup pour l'astuce
Partager