PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Indice dans une table inexistant
Indice dans une table inexistant
Débuté par Gibier Antoine, 23 avr. 2018 16:17 - 5 réponses
Posté le 23 avril 2018 - 16:17
Bonjour à tous!

Je me retrouve face à un problème plus qu'étrange ;(

J'ai deux tables:
-une de 16 lignes remplis par un fichier avec 3 colonnes (Ttrk_vrai, Ttrk_grav et Ttrk_risk_id)
-une seconde remplis par fichier avec deux colonnes (Sans_Nom1 et SansNom2 (très original :D )

J'utilise ce code à la sélection d'une ligne:
nB_ligne est un entier = TABLE_MaTable..Occurrence
i est un entier = 0
BOUCLE
i = i+1
SI COL_SansNom1..ValeurAffichée = TABLE_MaTable.COL_Ttrk_vrai[i]..ValeurAffichée ALORS
SI COL_SansNom2..ValeurAffichée = TABLE_MaTable.COL_Ttrk_grav[i]..ValeurAffichée ALORS
risk_id = TABLE_MaTable.COL_Ttrk_risk_id[i]..ValeurAffichée
FIN
FIN
À FAIRE TANTQUE i < nB_ligne


Comme précisé, la table contient 16 lignes et le programme plante avec l'erreur suivante:

Erreur à la ligne 27 du traitement Sélection d'une ligne de TABLE_Scénarii.
L'indice spécifié [14] est invalide.
TABLE_MaTable utilise un fichier ou une requête comme source de données.
Seuls les éléments visibles sont disponibles en programmation.

----- Informations techniques -----

Projet : Outil d'analyse de risque

Appel WL :
Traitement de 'Sélection d'une ligne de TABLE_Scénarii' (FEN_Couverture_des_scénarii_par_les_mesures_de_sécurité.TABLE_Scénarii), ligne 27, thread 0

Que s'est-il passé ?
L'indice spécifié [14] est invalide.
TABLE_MaTable utilise un fichier ou une requête comme source de données.
Seuls les éléments visibles sont disponibles en programmation.

Code erreur : 10068
Niveau : erreur fatale

Dump de l'erreur du module 'wd230obj.dll' (23.0.407.12).
Identifiant des informations détaillées (.err) : 10068
Informations supplémentaires :
EIT_PILEWL :
Sélection d'une ligne de TABLE_Scénarii (FEN_Couverture_des_scénarii_par_les_mesures_de_sécurité.TABLE_Scénarii), ligne 27
EIT_DATEHEURE : 23/04/2018 16:15:01
EIT_TYPE_WDFILE : <2>
EIT_IDCODE : <33>

Assistance

Avez-vous une idée de la provenance de cette erreur? :(


Merci d'avance!
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 23 avril 2018 - 16:48
Ttrk_vrai, Ttrk_grav et Ttrk_risk_id sont ils tous de type conteneur ? Ca m'etonnerais
C'est ce que le code laisse penser en tout cas

Essaye plutot la synthaxe suivante :


POUR i=1 _A_ TABLE_MaTable..Occurrence
SI COL_SansNom1= TABLE_MaTable[i].COL_Ttrk_vrai _ET_ COL_SansNom2= TABLE_MaTable[i].COL_Ttrk_grav ALORS
risk_id = TABLE_MaTable[i].COL_Ttrk_vrai
FIN
FIN


Ca devrait fonctionner !

Attention, cependant, je pense qu'il faut ajouter SORTIR apres "risk_id = TABLE_MaTable[i].COL_Ttrk_vrai" afin de stopper la boucle une fois trouvé ?

PS : Evite dans tes developpements de mettre les noms par défaut
ex: COL_SansNom1

Si tu prend cette mauvaise habitude tu va vite te retrouver dans un bordel sans nom avec des gros risques d'erreurs.
Message modifié, 23 avril 2018 - 16:50
Membre enregistré
6 messages
Popularité : +1 (1 vote)
Posté le 23 avril 2018 - 17:00
En effet ils sont tous de type Texte. J'avoue ne pas avoir encore une grande connaissance en Windev, le type conteneur apporte beaucoup?
Ton code fonctionne à merveille MERCI beaucoup :D

Yep merci pour le conseil, en général les noms sont fait automatiquement en fonction du fichier du coup je m'en sors mais ceux là sont passé à la trappe ahah!
Message modifié, 23 avril 2018 - 17:03
Membre enregistré
326 messages
Popularité : +15 (19 votes)
Posté le 23 avril 2018 - 17:08
Bonjour.
Le message est explicite -> sur une table fichier tu ne peux travailler que sur les éléments visibles.
Quand tu dis 16 lignes : ce sont les lignes visibles ou le total des lignes de ton fichier ?
Attention : si tu as un fichier de 1000 lignes, tu en visualises 16 à l'écran si tu fais une boucle du premier éléments au 1000 ème : plantage !!!
Seul les 16 peuvent être vus ??? Windev ne stocke en mémoire que les éléments visibles du fichier. Les autres lui sont inconnus.
Vu que ton traitement plante à la 14 ème ligne je suppose que ton écran ne visualise que 13 lignes.
Il faut bien différencier une table fichier d'une table mémoire. Si tu passes tout en table mémoire ton traitement est OK.
J'espère que tu as compris.

Vu ce que tu as à faire, je ne ferai pas comme cela et je ferai une requête avec une jointure entre tes 2 fichiers pour récupérer risk_id
Select Ttrk_risk_id from fichier1, fichier2 where fichier1.Ttrk_vrai = fichier2.? and fichier1.trk_grav = fichier2.?

-> j'ai des doutes sur ta table fichier avec col_sansnom comme nom de colonne : cela est une table mémoire à moins que celle ci soit alimentée par programmation.

Michel.
Membre enregistré
1 623 messages
Popularité : +100 (114 votes)
Posté le 23 avril 2018 - 18:17
En fait, ton code était louche et faisait penser que tes colonne contenaient des champs de type combo et non du texte.
tu n'a pas besoin de faire ..ValeurAffichée sur chaque colone, un simple appel a celle ci te permet d'en lire le contenu.

L'indice de parcours, (ici " i ") se place généralement après le nom de la table :
Table_MaTABLE[I]
Ainsi, tu sais que tu va lire la ligne I de la table MaTABLE.

En notant :
MaTable.Col_MaColonne[i]..ValeurAffichée .. on peut croire que cette colone contien un champ combo et que tu souhaite lire la valeur affichée a l'indice i de cette combo de la ligne en cours du tableau
Message modifié, 23 avril 2018 - 18:18
Posté le 24 avril 2018 - 08:41
Bonjour,
Je vois que tu utilise i dans ta boucle.

Pour info moi aussi j'ai eu ce genre d'erreur en utilisant i ou autre plusieurs fois dans une méme procédure
exemple :

procedure toto()

Pour i 1 a 25
info(i)
fin

pour i = 1 a 20
tableaffiche(table,i)
fin

fin de la procedure

j'avais une erreur au tableaffiche car pas d'indice 25 dans ma table
le second i n'est pas initialisé à la valeur 1 de la 2ème boucle.
Ceci depuis la dernière mise à jour de Windev

pour résoudre le problème j'ai utilisé i_1 et i_2 pour chaque boucle
Plus d'erreur