PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2024 → [WD24] Problème modification champ table par programmation
[WD24] Problème modification champ table par programmation
Iniciado por Valentin, 19,dic. 2018 15:00 - 11 respuestas
Miembro registrado
25 mensajes
Publicado el 19,diciembre 2018 - 15:00
Bonjour à tous !

Étant passé de la version 18 à la version 24, je recréais donc un topic ici pour mon problème. Je vous remets le lien de l'ancien topic étant non résolu ainsi que mon dernier post :

-------------

https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev.old/25844-wd18-probleme-modification-champ-table-par-programmation/read.awp

-------------

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_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)


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

Merci beaucoup par avance !
Miembro registrado
1.304 mensajes
Popularité : +47 (51 votes)
Publicado el 20,diciembre 2018 - 11:52
Salut Valentin,

Ton problème vient notament du fait que tu n'utilises pas l'indice de la table.

Essaye avec ce code ci

sNomcol est une chaîne = COMBO_Combo..ValeurAffichée
nRang est un entier = 1
nLigne est un entier = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)
sNomTable est une chaîne = "TABLE_Matierepremiere"

TANTQUE nLigne <> -1
SI SEL_OPERATION..Valeur = 1 ALORS
{sNomTable + "." + sNomcol, indChamp}[nLigne] += SAI_SansNom1
SINON
{sNomTable + "." + sNomcol, indChamp}[nLigne] = SAI_SansNom1
FIN
TableEnregistre(TABLE_Matierepremiere)
nRang++
nLigne = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)


Bon Dev.
Daryl

--
http://www.concept4u2.com
Miembro registrado
25 mensajes
Publicado el 20,diciembre 2018 - 15:39
Bonjour Daryl,

Merci pour ta réponse.

Je viens d'essayer ton code, ça ne marche pas correctement non plus. Seule la dernière ligne est modifiée.

J'ai essayé quelque chose de plus concluant : J'ai rempli la table par programmation pour éviter d'avoir un lien permanent avec la BDD, et le code en bas du premier post fonctionne correctement, sauf qu'évidemment le TableEnregistre provoque une erreur. Il faut que je trouve maintenant un moyen d'enregistrer ma table modifiée dans ma BDD.

Donc c'est la liaison table-bdd qui provoque ce "bug"...
Miembro registrado
1.304 mensajes
Popularité : +47 (51 votes)
Publicado el 25,diciembre 2018 - 14:56
Salut Valentin,

Lorsque tu lie une table à un fichier, il faut impérativement te déplacer dans le fichier avant de modifier ton enregistrement, sinon tu modifie toujours le même enregistrement.
Donc à toi de faire un hlitrecherche() qui doit se faire juste après le TANTQUE nLigne <> -1
Ensuite la fonction TableEnregistre() fonctionnera très bien. :)

PS: Ce n'est pas un bug, c'est ton fichier qui prime sur ta table et non l'inverse.

A+
Daryl

--
http://www.concept4u2.com
Miembro registrado
25 mensajes
Publicado el 02,enero 2019 - 11:13
Bonjour Daryl, bonne année,

Merci pour le conseil ! je vais voir comment mettre cela en œuvre.

J'ai très peu d'expérience sous Windev, je dois encore apprendre :merci:

@+
Miembro registrado
25 mensajes
Publicado el 10,enero 2019 - 16:00
Daryl a écrit :
Salut Valentin,

Lorsque tu lie une table à un fichier, il faut impérativement te déplacer dans le fichier avant de modifier ton enregistrement, sinon tu modifie toujours le même enregistrement.
Donc à toi de faire un hlitrecherche() qui doit se faire juste après le TANTQUE nLigne <> -1
Ensuite la fonction TableEnregistre() fonctionnera très bien.

PS: Ce n'est pas un bug, c'est ton fichier qui prime sur ta table et non l'inverse.

A+
Daryl

--
http://www.concept4u2.com


Salut Daryl,

Alors j'ai tenté quelque chose mais sans résultat, je dois mal maitriser le hlitrecherche :

sNomcol est une chaîne = COMBO_Combo..ValeurAffichée
nRang est un entier = 1
nLigne est un entier = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)
sNomTable est une chaîne = "TABLE_Matierepremiere"
nID est un entier

TANTQUE nLigne <> -1
nID = TABLE_Matierepremiere.COL_IDmatierepremiere[indChamp]
Info(nID)
HLitRecherche(matierepremiere,IDmatierepremiere,nID)
SI SEL_OPERATION..Valeur = 1 ALORS
{sNomTable + "." + sNomcol, indChamp}[nLigne] += SAI_SansNom1
SINON
{sNomTable + "." + sNomcol, indChamp}[nLigne] = SAI_SansNom1
FIN
TableEnregistre(TABLE_Matierepremiere)
nRang++
nLigne = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)


Ça ne modifie que la première ligne sélectionnée, et ma ligne de code pour retourner l'ID de l'enregistrement m'affiche toujours l'ID de la première ligne sélectionnée X le nombre de lignes sélectionnées.

Une idée ?

Merci !
Mensaje modificado, 10,enero 2019 - 16:00
Miembro registrado
1.304 mensajes
Popularité : +47 (51 votes)
Publicado el 11,enero 2019 - 17:25
Salut Valentin,

Remplace

nID = TABLE_Matierepremiere.COL_IDmatierepremiere[indChamp]


Par

nID = TABLE_Matierepremiere.COL_IDmatierepremiere[nLigne]


A+
Daryl

--
http://www.concept4u2.com
Miembro registrado
25 mensajes
Publicado el 15,enero 2019 - 16:47
Daryl a écrit :
Salut Valentin,
Remplace
nID = TABLE_Matierepremiere.COL_IDmatierepremiere[indChamp]
Par
nID = TABLE_Matierepremiere.COL_IDmatierepremiere[nLigne]
A+
Daryl
--
http://www.concept4u2.com


Salut Daryl,

Effectivement, cela fonctionne avec cette correction. Sauf qu'il y a encore un "mais" ;(

Les lignes des colonnes à gauche de la colonne sélectionnée reprennent la valeur de la première ligne sélectionnée. Ok c'est compliqué expliqué comme cela, alors j'ai fait une vidéo :



Je remets le code :

sNomcol est une chaîne = COMBO_Combo..ValeurAffichée
nRang est un entier = 1
nLigne est un entier = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)
sNomTable est une chaîne = "TABLE_Matierepremiere"
nID est un entier

TANTQUE nLigne <> -1
nID = TABLE_Matierepremiere.COL_IDmatierepremiere[nLigne]
Info("ID enregistrement modifié :" + nID)
HLitRecherche(matierepremiere,IDmatierepremiere,nID)
SI SEL_OPERATION..Valeur = 1 ALORS
{sNomTable + "." + sNomcol, indChamp}[nLigne] += SAI_SansNom1
SINON
{sNomTable + "." + sNomcol, indChamp}[nLigne] = SAI_SansNom1
FIN
TableEnregistre(TABLE_Matierepremiere)
nRang++
nLigne = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)


Je deviens fou }:(

Une idée ? Parce que là ça devient carrément dingue !

Merci d'avance !
Publicado el 15,enero 2019 - 19:20
Bonjour,
La fonction TableEnregistre est limitée en multiselection !!!
Voir les Conditions d'utilisation :
La fonction TableEnregistre peut être utilisée indifféremment sur :
un champ Table fichier ou un champ Table hiérarchique fichier.
un champ mono-sélection ou multi-sélection. Dans le cas d'un champ multi-sélection, seul le dernier enregistrement sélectionné est modifié (l'enregistrement correspondant à la dernière ligne en cours).

Pourquoi ne pas ignorer la table et aller directement mettre à jour le fichier ? De toutes façons tout se termine par un tableaffiche + tainit
Miembro registrado
25 mensajes
Publicado el 22,enero 2019 - 10:21
Math a écrit :
Bonjour,
La fonction TableEnregistre est limitée en multiselection !!!
Voir les Conditions d'utilisation :
La fonction TableEnregistre peut être utilisée indifféremment sur :
un champ Table fichier ou un champ Table hiérarchique fichier.
un champ mono-sélection ou multi-sélection. Dans le cas d'un champ multi-sélection, seul le dernier enregistrement sélectionné est modifié (l'enregistrement correspondant à la dernière ligne en cours).

Pourquoi ne pas ignorer la table et aller directement mettre à jour le fichier ? De toutes façons tout se termine par un tableaffiche + tainit


Bonjour Math,

D'accord.. ! Bon du coup je vais voir pour modifier ça à coup de requêtes SQL.

Merci !
Miembro registrado
25 mensajes
Publicado el 22,enero 2019 - 13:34
Re,

Alors je pense qu'on va pouvoir faire quelque chose en requête SQL. Voici ce que j'ai fait :

paramRubrique est une chaîne = COMBO_Combo..ValeurAffichée
paramTexte est une chaîne = SAI_SansNom1
paramID est un entier
nRang est un entier = 1
nLigne est un entier = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)

TANTQUE nLigne <> -1
paramID = TABLE_Matierepremiere.COL_IDmatierepremiere[nLigne]
Info("ID enregistrement modifié : " + paramID)
HExécuteRequête(REQ_modifenmasse,hRequêteDéfaut,paramTexte,paramID)
nRang++
nLigne = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)


Vous remarquerez que je n'utilise pas encore "paramRubrique" car je l'ai codé en "dur" dans la requête SQL :

UPDATE
matierepremiere
SET
matierepremiere.NomArticle = {paramTexte}
WHERE
matierepremiere.IDmatierepremiere = {paramID}


Alors ça marche très bien sur les lignes sélectionnée pour la rubrique NomArticle, sauf que l'idée c'est de passer la rubrique en paramètre sauf que :

UPDATE
matierepremiere
SET
matierepremiere.{paramRubrique} = {paramTexte}
WHERE
matierepremiere.IDmatierepremiere = {paramID}


Ca ne marche pas. matierepremiere.{paramRubrique} n'est pas correct, sauf que je ne trouve pas la bonne façon de passer la rubrique en paramètre.

Une idée ?

Merci !
Miembro registrado
25 mensajes
Publicado el 25,enero 2019 - 16:41
Bonjour,

Solution trouvée, merci encore pour votre aide !

paramRubrique est une chaîne = COMBO_Combo..ValeurAffichée
paramTexte est une chaîne = SAI_SansNom1
ParamID est un chaîne
nRang est un entier = 1
nLigne est un entier = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)
REQ est une Source dede Données

TANTQUE nLigne <> -1
ParamID = TABLE_Matierepremiere.COL_IDmatierepremiere[nLigne]
MaReq est une chaîne = [
UPDATE matierepremiere
SET %1 = '%2'
WHERE IDmatierepremiere = %3
]
MaReq = ChaîneConstruit(MaReq,paramRubrique,paramTexte,ParamID)
HExécuteRequêteSQL(REQ,hRequêteDéfaut,MaReq)
nRang++
nLigne = TableSelect(TABLE_Matierepremiere, nRang, tsLigne)
FIN
TableAffiche(TABLE_Matierepremiere, taInit)