PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → Traitement sur 2 enregistrements sélectionnés
Traitement sur 2 enregistrements sélectionnés
Débuté par BrunoPqs, 19 mai 2024 19:11 - 24 réponses
Membre enregistré
64 messages
Posté le 19 mai 2024 - 19:11
Bonjour,

J'ai mis en place dans mon logiciel, des cases de sélection devant les enregistrements de la table. Il y a la possibilité de filtrer les enregistrements avec les champs de saisie au-dessus.

Comment puis-je en cochant 2, 3 ou plus enregistrement, affecter par exemple la valeur AAA par exemple dans la colonne Lettrage. La personne aveugle après avoir s"électionnés les enregistrements au clavier, lancera une fenêtre pour affecter une valeur comme AAA, puis AAB, AAC, etc.






Merci,

Bruno
Membre enregistré
1 020 messages
Posté le 20 mai 2024 - 00:49
Bonjour Bruno,
Je n'ai pas compris le principe.

Si vous souhaitez un incrément Alphabétique automatique (AAA puis AAB, AAC), inutile de réinventer la roue, la solution a déjà été apportée :
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/182705-incrementation-alphabetique-resolu/read.awp

L'origine de ce code est ici :
https://www.developpez.net/forums/d1258075/environnements-developpement/windev/incrementer-lettres-l-alphabet/

Si la réponse n'est pas celle attendue, merci de nous expliquer.
Vous cochez les cases, mais il faut incrémenter un existant dans la table?
Vous dites ensuite que la personne lancera une fenêtre pour affecter une valeur (AAA, etc...)

Cdlt
Membre enregistré
64 messages
Posté le 20 mai 2024 - 06:47
Bonjour,

Voici la fenêtre attendu :





Lorsque ma stagiaire appuie sur CTRL + L après avoir coché les lignes, cela ouvre la petite fenêtre. Dans cele-ci, elle tape par exemple AAA ; valide avec le bouton Ajouter.
Cette donnée se met en colonne Lettrage pour les 2 éléments sélectionnés.

Cordialement,

Bruno
Membre enregistré
4 325 messages
Posté le 20 mai 2024 - 07:45
Bonjour,
As-tu tenté de boucler via un TableSelect éventuellement associé à un TableEnregistre en fonction des réglages.
Regarde le chapitre "Fonction de gestion des champs table", il y a de nombreuses infos utiles.

--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué, utilise l'option RTFM
Message modifié, 20 mai 2024 - 07:51
Membre enregistré
64 messages
Posté le 20 mai 2024 - 07:56
Bonjour Voro,
Quand tu dis Regarde le chapitre... Où cela se trouve ? C'est bon j'ai trouvé le chapitre dans l'aide.
Message modifié, 20 mai 2024 - 08:18
Membre enregistré
64 messages
Posté le 20 mai 2024 - 10:48
Re,

J'ai déjà mis ce bout de code sur la colonne où se trouve les coches :

Ind est un entier
POUR Ind = 1 _À_ TableOccurrence(Table_Ecritures2)
SI Col_sel[Ind] = Vrai ALORS
TableSelectPlus(Table_Ecritures2, Ind)
SINON
TableSelectMoins(Table_Ecritures2,Ind)
FIN
FIN


Puis ce bout de code sur la table :

ExécuteTraitement(Col_sel,trtModification)
Membre enregistré
4 325 messages
Posté le 20 mai 2024 - 12:25
Dans un premier temps, pourquoi utiliser des coches et pas simplement la sélection de ligne ?

ExécuteTraitement : Quelle horreur

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
64 messages
Posté le 20 mai 2024 - 13:25
Re,

Car le logiciel est à destination d'une de mes stagiaires qui est aveugle et cela est plus pratique de sélectionner des lignes avec la case à cocher.
Membre enregistré
4 325 messages
Posté le 20 mai 2024 - 16:07
Dans ce cas, les TableSelectPlus/Moins sont inutile, il suffit de boucler sur les lignes est de vérifier l'état de la colonne

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
64 messages
Posté le 20 mai 2024 - 18:03
Voroltinquo,
Peux-tu être plus concret avec du code ?
Membre enregistré
1 020 messages
Posté le 20 mai 2024 - 18:45
Bonjour Bruno,

Quelque chose comme ça :

i est un entier
POUR i = 1 _À_ MaTable..Occurrence
SI MaTable.MonSélecteur[i] = Vrai ALORS
//Traitement
FIN
FIN


Cdlt
Membre enregistré
64 messages
Posté le 20 mai 2024 - 18:55
Merci Cédric,
Et je peux ensuite ouvrir la fenêtre et modifier les 2 enregistrements en même temps ?
Membre enregistré
4 325 messages
Posté le 20 mai 2024 - 19:05
A la volée:
FONCTION LettrerOpération(saLettrage est chaîne) :booléen
nNoLigne est un entier

POUR nNoLigne=1 _À_ TableOccurrence(TABLE_Lettrage)
SI COL_Select[nNoLigne] ALORS
COL_Lettrage[nNoLigne]=saLettrage
TableEnregistre(TABLE_Lettrage)
FIN
FIN
RENVOYER Vrai

CAS ERREUR:
SELON ErreurInfo(errCode)

AUTRE CAS
ErreurConstruit("L'application a déclenché l'erreur %1%2%3",ErreurInfo(errCode),CRLF,ErreurInfo(errMessage))
RENVOYER Faux
FIN

CAS EXCEPTION:
SELON ExceptionInfo(errCode)

AUTRE CAS
ErreurConstruit("L'application a déclenché l'exception %1%2%3",ExceptionInfo(errCode),CRLF,ExceptionInfo(errMessage))
RENVOYER Faux
FIN


Utilisation :
saLettrage est une chaîne

Saisie("Entrez le lettrage",saLettrage)
LettrerOpération(saLettrage)

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 20 mai 2024 - 19:23
Membre enregistré
64 messages
Posté le 21 mai 2024 - 18:14
Bonjour Voroltinquo,

Ces 2 codes, je les collent où ?

Cdlmt,

Bruno
Membre enregistré
1 020 messages
Posté le 21 mai 2024 - 19:22
Bonjour Bruno,
Dans windev, une fonction est comme une procédure mais la fonction renvoie une valeur.
Vous créer donc une procédure, mais le mot Fonction remplace le mot Procédure.

Ensuite vous déclenchez le code (la partie "utilisation") avec votre raccourci clavier.

PS: je n'avais pas vu votre code #6, vous y étiez presque, il restait à appeler le Dialogue Saisie
Cdlt
Membre enregistré
64 messages
Posté le 22 mai 2024 - 19:20
Bonsoir,

Help, j'ai une partie du code en rouge....






Cdlmt,

Bruno
Membre enregistré
291 messages
Posté le 22 mai 2024 - 19:57
Bonsoir,





SI COL_Select[nNoLigne] ALORS

Fabrice
Message modifié, 22 mai 2024 - 19:59
Membre enregistré
64 messages
Posté le 22 mai 2024 - 20:27
Sur la ligne nNoLigne=1 _À_ nNoLigne est rouge et j'ai ce message d'erreur "Impossible d'utiliser une syntaxe de boucle optimisée à cause du compteur : utilisez plutôt comme compteur de boucle un compteur local ou une variable locale de type entier ou réel.
Membre enregistré
291 messages
Posté le 22 mai 2024 - 21:35
Bonsoir
Je ne vois pas ce qu'il y a au dessus de la FONCTION LettrerOpération, mais il semblerait qu'il y ait du code !?!?!

Je pense que vous n'avez pas "réellement" créé de procédure comme l'avait indiqué Cédric plus haut

Normalement vous devriez avoir ceci pour une procédure locale :






Ou ceci pour une procédure interne :





Cordialement,
Fabrice
Membre enregistré
1 020 messages
Posté le 23 mai 2024 - 00:50
Bonjour,
Je pense que Fabrice N a raison, une procédure interne aurait simplifié les choses.
De plus, il me semble qu'il y a une confusion totale dans tous les codes ci-dessus.

J'ai volontairement fait le ménage (plus de procédure ni de fonction), essayez le code ci-dessous :

saLettrage est une chaîne
nNoLigne est un entier
POUR nNoLigne=1 _À_ TableOccurrence(Table_Ecritures2) // Vérifiez que "Table_Ecritures2" est bien le nom de votre table
SI Col_sel[nNoLigne] ALORS // Vérifiez que "Col_sel" est bien le nom de la colonne contenant la case à cocher
Saisie("Entrez le lettrage",saLettrage)
COL_Lettrage[nNoLigne]=saLettrage // Vérifiez que "COL_Lettrage" est bien le nom de la colonne recevant le Lettrage
TableEnregistre(Table_Ecritures2)
FIN
FIN


Dites nous si le résultat correspond à peu près à vos attentes.
Cdlt
Membre enregistré
64 messages
Posté le 23 mai 2024 - 06:05
Bonjour Cédric,

Merci bcp de votre aide, il y a-t-il moyen d'automatiser les lettres sans que la personne aveugle est à chercher où elle en ai. Exemple : AAA puis AAB, AAC. Arrivé à AAZ, on passe à ABA puis ABB, puis ABC, etc.

Cordialement,

Bruno
Membre enregistré
1 020 messages
Posté le 23 mai 2024 - 09:49
Pour le lettrage automatique, oui il y a moyen comme je vous le disais sur le post #2, inutile de réinventer la roue.
Le code sur cette page fonctionne très bien :
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/182705-incrementation-alphabetique-resolu/read.awp

Comment allez-vous débuter, la personne saisit le premier lettrage (et comment le choisit-elle) ou faut-il aller chercher la dernière valeur dans la table ?

Edit : la saisie par la personne est-elle bien nécessaire, une fois la première valeur déterminée, le programme peut très bien faire le travail ?
Message modifié, 23 mai 2024 - 10:04
Membre enregistré
4 325 messages
Posté le 23 mai 2024 - 14:01
UneCédric_34 a écrit :
Comment allez-vous débuter, la personne saisit le premier lettrage (et comment le choisit-elle) ou faut-il aller chercher la dernière valeur dans la table ?

Une solution consiste à utiliser CHargeParamètre/SauveParamètre

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
64 messages
Posté le 23 mai 2024 - 19:12
Bonjour,

Le lettrage commence à AAA, puis AAB. la personne n'est pas obligé de taper la valeur, cela peut être automatique.

Cdlmt,

Bruno
Membre enregistré
1 020 messages
Posté le 23 mai 2024 - 20:56
La difficulté pour un tri sur une rubrique alphabétique réside dans le fait que pour les valeurs AA, ZZ, AAA, la dernière valeur pour un ordre croissant sera ZZ alors que dans le cas qui vous intéresse, la dernière valeur devrait être AAA.
Pour contrer, il faut créer dans la table une colonne invisible nommée : TailleLettrage (inutile de créer une liaison au fichier HFSQL)
Le code ci dessous commencera par remplir cette colonne avec la taille de chaque chaîne.
Ainsi, le tri par ordre décroissant sortira d'abord 3 pour AAA, puis sortira l'ordre alphabétique décroissant pour les chaines de 3 caractères.

saLettrage est une chaîne
nNoLigne est un entier
VarIndice est un booléen

POUR nNoLigne= 1 _À_ TableOccurrence(Table_catalogues_fournisseurs)
TailleLettrage[nNoLigne] = Taille(COL_Lettrage[nNoLigne])
FIN

TableTrie(Table_catalogues_fournisseurs, "-TailleLettrage", "-COL_Lettrage") // Tri décroissant sur la colonne TailleLettrage puis sur Lettrage
saLettrage = COL_Lettrage[1] // récupération de la plus grande valeur qui est donc la première dans la table
TableTrie(Table_catalogues_fournisseurs, "reference") // restaure le tri sur la rubrique "reference"

POUR nNoLigne= 1 _À_ TableOccurrence(Table_catalogues_fournisseurs)
SI Ligne_Select[nNoLigne] ET COL_Lettrage[nNoLigne] = "" ALORS
SI saLettrage <> "" ALORS
IncrementLettrage(saLettrage)
SINON
saLettrage = "AAA" // On débute à AAA si aucune valeur n'est trouvée
FIN

VarIndice = HLitRecherchePremier(catalogues_fournisseurs, IDcatalogue_fournisseurs, IDcatalogue_fournisseurs[nNoLigne])
SI HTrouve(catalogues_fournisseurs) = Vrai ALORS
catalogues_fournisseurs.Lettrage[VarIndice] = saLettrage
HEnregistre(catalogues_fournisseurs)
Ligne_Select[nNoLigne] = Faux
FIN

FIN
FIN
TableAffiche(Table_catalogues_fournisseurs)

PROCEDURE INTERNE IncrementLettrage(sTexte est une chaîne)

nTaille est un entier = Taille(sTexte)
i est un entier = nTaille
nbDeA est un entier = 0

POUR i = nTaille À 1 PAS -1
SI sTexte[[i]] = "Z" ALORS
sTexte[[i]] = "A"
nbDeA++
SINON
sTexte[[i]] = Caract(Asc(sTexte[[i]]) + 1)
SORTIR
FIN
FIN

SI nbDeA = nTaille ALORS sTexte = sTexte + "A"

RENVOYER sTexte
FIN


Attention, ne prenez pas ce code pour argent comptant car je n'ai pas fait les essais nécessaires pour prétendre que tout est OK.
Donc faites des essais, tout le monde peut se tromper.

Il existe d'autres solutions comme l'a précisé Voroltinquo (sauvegarde de la dernière valeur).
Dites-nous si ça fonctionne pour vous.
Cdlt
Message modifié, 23 mai 2024 - 20:58