PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → [WD18] Problème modification champ table par programmation
[WD18] Problème modification champ table par programmation
Débuté par Valentin, 28 aoû. 2018 15:06 - 9 réponses
Membre enregistré
25 messages
Posté le 28 août 2018 - 15:06
Bonjour à tous,

J'ai un problème, ou plutôt un espèce de bug lors de l’exécution d'un petit code pour modifier les champs d'une table avec une sélection, une valeur et un bouton. Je m'explique :

Voici ma table avec quelques fonctions utiles autour :





C'est la fonction de modification rapide en masse qui me pose problème. En fait, elle permet de modifier rapidement les champs d'une colonne sur les lignes que je sélectionne sauf que ça bug. Quand je sélectionne une ligne ça marche, mais quand j'en sélectionne plusieurs, seule la dernière sélection est mise à jour (ajout ou remplacement). Voici mon code :

nNomcol est une entier = COMBO_Combo..Valeur

POUR t=1 A TableOccurrence(TABLE_Matierepremiere,toTotal)
SI TABLE_Matierepremiere[t]..Sélectionnée=Vrai ALORS
SI SEL_OPERATION..Valeur=1 ALORS
TABLE_Matierepremiere[t][nNomcol] = TABLE_Matierepremiere[t][nNomcol] + SAI_SansNom1
TableEnregistre(TABLE_Matierepremiere)
SINON
TABLE_Matierepremiere[t][nNomcol] = SAI_SansNom1
TableEnregistre(TABLE_Matierepremiere)
FIN
FIN
FIN
TableAffiche(TABLE_Matierepremiere)


COMBO_Combo étant la sélection de la colonne par son nom
SEL_OPERATION étant le selecteur Ajouter ou Remplacer

J'ai l'impression que c'est TableEnregistre qui produit ce bug, car sans, tous les champs sélectionnés se mettent à jour, mais évidemment au prochain rafraichissement je perds tout car ce n'est pas enregistré.

Avez-vous une idée du problème ?

Je vous remercie d'avance. Cordialement.
Message modifié, 28 août 2018 - 15:08
Membre enregistré
25 messages
Posté le 31 août 2018 - 10:01
UP :) Merci
Membre enregistré
25 messages
Posté le 02 octobre 2018 - 08:35
up ?
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 02 octobre 2018 - 09:36
Bonjour Valentin,

De tête, je ferais un truc comme ça:
nNomcol est un entier = COMBO_Combo..Valeur

POUR TOUTE LIGNE SELECTIONNEE de TABLE_Matierepremiere
SI SEL_OPERATION..Valeur=1 ALORS
{"TABLE_Matierepremiere." + nNomCol, indChamp} += SAI_SansNom1
SINON
{"TABLE_Matierepremiere." + nNomCol, indChamp} = SAI_SansNom1
FIN
TableEnregistre(TABLE_Matierepremiere)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)


Après, est-ce que ta table est bien liée à ton fichier? Est-ce que la liaison des colonnes sont bonnes?

--
(\ _ /)
(='.'=)
(")-(")
Message modifié, 02 octobre 2018 - 09:42
Membre enregistré
25 messages
Posté le 03 octobre 2018 - 09:15
Geoffrey ZIMMERMANN a écrit :
Bonjour Valentin,

De tête, je ferais un truc comme ça:
nNomcol est un entier = COMBO_Combo..Valeur

POUR TOUTE LIGNE SELECTIONNEE de TABLE_Matierepremiere
SI SEL_OPERATION..Valeur=1 ALORS
{"TABLE_Matierepremiere." + nNomCol, indChamp} += SAI_SansNom1
SINON
{"TABLE_Matierepremiere." + nNomCol, indChamp} = SAI_SansNom1
FIN
TableEnregistre(TABLE_Matierepremiere)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)


Après, est-ce que ta table est bien liée à ton fichier? Est-ce que la liaison des colonnes sont bonnes?

--
(\ _ /)
(='.'=)
(")-(")
Message modifié, 02 octobre 2018 - 09:42



Merci pour ta réponse !

Le problème c'est que je suis en version 18 et qu'il ne digère pas ces lignes de code :(

Sinon oui, ma table et mes colonnes sont bien liées.
Membre enregistré
28 messages
Popularité : +1 (1 vote)
Posté le 03 octobre 2018 - 10:10
Un truc tout bête, as tu essayé avec l'indice (Je doute que cela fonctionne) :
TableEnregistre(TABLE_Matierepremiere[t])


Y a aussi l'histoire de la saisie en cascade. Aide de windev sur TableEnregistre https://doc.pcsoft.fr/fr-FR/?3074008&name=TableEnregistre :

Saisie en cascade et mise à jour du fichier de données lié

Si la saisie en cascade est activée, le fichier de données lié au champ Table ou Table Hiérarchique est automatiquement modifié lorsque l'utilisateur passe à la ligne suivante (utilisation des fonctions TableAjoute, TableAjouteLigne, TableInsère, TableInsèreLigne, TableModifie et TableModifieLigne). La fonction TableEnregistre est inutile.
Si la saisie en cascade n'est pas activée, le fichier de données lié champ Table ou Table Hiérarchique n'est pas modifié. Pour écrire la ligne ajoutée ou modifiée dans le fichier de données lié, il est nécessaire d'utiliser la fonction TableEnregistre après la fonction d'ajout ou de modification.

Remarques :

La propriété ..Nouveau permet de savoir si la ligne en cours vient d'être créée par les fonctions TableAjoute, TableAjouteLigne, TableInsère et TableInsèreLigne (..Nouveau = Vrai).
La propriété ..Modifié permet de savoir si une ligne a été modifiée par saisie directe de l'utilisateur dans le champ (..Modifié = Vrai).

--
(\ _ /)
(='.'=)
(")-(")
Message modifié, 03 octobre 2018 - 10:10
Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 03 octobre 2018 - 12:56
Bonjour,

la même sans le POUR TOUT
nNomcol est un entier = COMBO_Combo..Valeur

POUR i = 1 À TABLE_Matierepremiere..Occurrence
SI SEL_OPERATION..Valeur=1 ALORS
{"TABLE_Matierepremiere." + nNomcol, indChamp}[i] += SAI_SansNom1
SINON
{"TABLE_Matierepremiere." + nNomcol, indChamp}[i] = SAI_SansNom1
FIN
TableEnregistre(TABLE_Matierepremiere)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)


--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
25 messages
Posté le 03 octobre 2018 - 15:15
Geoffrey ZIMMERMANN a écrit :
Un truc tout bête, as tu essayé avec l'indice (Je doute que cela fonctionne) :
TableEnregistre(TABLE_Matierepremiere[t])


Y a aussi l'histoire de la saisie en cascade. Aide de windev sur TableEnregistre https://doc.pcsoft.fr/fr-FR/?3074008&name=TableEnregistre :

Saisie en cascade et mise à jour du fichier de données lié

Si la saisie en cascade est activée, le fichier de données lié au champ Table ou Table Hiérarchique est automatiquement modifié lorsque l'utilisateur passe à la ligne suivante (utilisation des fonctions TableAjoute, TableAjouteLigne, TableInsère, TableInsèreLigne, TableModifie et TableModifieLigne). La fonction TableEnregistre est inutile.
Si la saisie en cascade n'est pas activée, le fichier de données lié champ Table ou Table Hiérarchique n'est pas modifié. Pour écrire la ligne ajoutée ou modifiée dans le fichier de données lié, il est nécessaire d'utiliser la fonction TableEnregistre après la fonction d'ajout ou de modification.

Remarques :

La propriété ..Nouveau permet de savoir si la ligne en cours vient d'être créée par les fonctions TableAjoute, TableAjouteLigne, TableInsère et TableInsèreLigne (..Nouveau = Vrai).
La propriété ..Modifié permet de savoir si une ligne a été modifiée par saisie directe de l'utilisateur dans le champ (..Modifié = Vrai).

--
(\ _ /)
(='.'=)
(")-(")
Message modifié, 03 octobre 2018 - 10:10


Bonjour,

Alors avec l'ajout de l'indice ça ne fonctionne pas, message d'erreur.

J'ai activé la saisie en cascade dans ma table, ça ne fonctionne toujours pas non plus.

C'est vraiment un code tout bête mais j'ai l'impression que windev est contre moi :@

Philippe SB a écrit :
Bonjour,

la même sans le POUR TOUT
nNomcol est un entier = COMBO_Combo..Valeur

POUR i = 1 À TABLE_Matierepremiere..Occurrence
SI SEL_OPERATION..Valeur=1 ALORS
{"TABLE_Matierepremiere." + nNomcol, indChamp}[i] += SAI_SansNom1
SINON
{"TABLE_Matierepremiere." + nNomcol, indChamp}[i] = SAI_SansNom1
FIN
TableEnregistre(TABLE_Matierepremiere)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)


--
Cordialement,

Philippe SAINT-BERTIN


Bonjour, et merci.

J'ai repris le code tel quel, et j'ai un message d'erreur :




Membre enregistré
2 566 messages
Popularité : +222 (260 votes)
Posté le 03 octobre 2018 - 17:28
Je ne connais pas la structure de ta table, ni comment est remplie ta combo, tout ce que je peux te dire c'est que ta combo doit renvoyer le nom exact de la colonne de ta table pour que cela fonctionne.

Pour le reste il y a le debugger. ;)

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
25 messages
Posté le 18 décembre 2018 - 10:58
Philippe SB a écrit :
Je ne connais pas la structure de ta table, ni comment est remplie ta combo, tout ce que je peux te dire c'est que ta combo doit renvoyer le nom exact de la colonne de ta table pour que cela fonctionne.

Pour le reste il y a le debugger.

--
Cordialement,

Philippe SAINT-BERTIN


Bonjour Philippe,

Quelques news après avoir laisse de côté ce projet :

- Achat de Windev 24 pour être à niveau
- Création d'une nouvelle fenêtre avec la même table et liaison pour être sur que le problème ne vient pas d'ailleurs
- Modification d'une ligne qui posait problème (voir erreur au dessus)

nNomcol est un entier = COMBO_Combo..Valeur

Devient :

nNomcol est une chaîne = COMBO_Combo..ValeurAffichée

- Remplissage du COMBO avec le nom réel de chaque colonne et non pas son nom affiché dans la table





Résultat :

Cela fonctionne à moitié. Je m'explique : La modification fonctionne correctement sur les lignes sélectionnées et la colonne indiquée, mais il y a un effet de bord, les lignes sélectionnées s'inversent. J'ai fait une vidéo pour mieux comprendre :



Je vous remets le code entier également

nNomcol est une chaîne = COMBO_Combo..ValeurAffichée

POUR TOUTE LIGNE SELECTIONNEE DE TABLE_Matierepremiere
SI SEL_Sélecteur..Valeur=1 ALORS
{"TABLE_Matierepremiere." + nNomcol, indChamp} += SAI_Texte
SINON
{"TABLE_Matierepremiere." + nNomcol, indChamp} = SAI_Texte
FIN
TableEnregistre(TABLE_Matierepremiere)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)


Là je ne comprends pas du tout, le code n'est pas censé tout inverser. Une idée ?

Merci beaucoup par avance !