PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → Mémorisation et récupération d'une variable
Mémorisation et récupération d'une variable
Débuté par Calimero, 27 mai 2023 20:42 - 25 réponses
Membre enregistré
84 messages
Posté le 27 mai 2023 - 20:42
Bonjour,

Je suis sous windev 25 et je cherche à incrémenter des numéros de facture FA001, FA002 etc...

Ma fenêtre principale comporte 2 champs table ( commandes et détails des commandes )
Je voudrais qu'un numéro de commande s'autoincrémente dans le champ table commandes quand je choisis la valeur "Expédié" depuis une colonne Combo "Statut". Avec ce que j'ai fait ça fonctionne mais si je ferme ma fenêtre pour l'ouvrir ensuite, ça repart à la valeur initiale. Je voudrais donc juste retrouver la dernière valeur de ma variable. ça me semble simple mais je plante et je tourne en rond là dessus.

Pour faire ça, j'ai initialisé une variable dans ma fenêtre gnUmfact est un entier et une chaine gsTextefacture est une chaine = "FA000"

SI COL_Statut = "3" ALORS

gnUmfact++
//info("la valeur de N°Facture est de : " + gsTextefacture + NumériqueVersChaîne(gnUmfact))
//info("La valeur de gnUmfact est " + gnUmfact)

TABLE_Commandes.COL_NoFacture = gsTextefacture + NumériqueVersChaîne(gnUmfact)

FIN

Commandes.NoFacture = TABLE_Commandes.COL_NoFacture


Comment puis je faire pour récupérer la dernière valeur de ma variable gnUmfact ? Je précise que je suis un véritable novice sur windev

Merci d'avance
Membre enregistré
121 messages
Popularité : +8 (14 votes)
Posté le 27 mai 2023 - 22:19
Bonsoir,

Pour ma part:

Sauvegarder le dernier numéro de facture et le rappeler ensuite (base de données, registre)

--
Bon dev

Thibault
Membre enregistré
84 messages
Posté le 28 mai 2023 - 00:29
Bonsoir,

Merci pour la réponse mais le numéro de facture est une concaténation de FA000 + variable. Ce qu'il me faut en fait la sauvegarde de la variable puisque la racine de la facture ne bouge pas.
Membre enregistré
3 887 messages
Popularité : +227 (347 votes)
Posté le 28 mai 2023 - 10:33
Bonjour,
Regarde du côté des variables persistantes (SauveParamètre, ChargeParamètre ...)
Par ailleurs la fonction ChaineIncrémente existe.

--
Il y a peut être plus simple, mais, ça tourne
Posté le 28 mai 2023 - 13:59
Calimero a écrit :
Bonsoir,

le numéro de facture est une concaténation de FA000


Bonjour,

C'est pour une toute petite entreprise éphémère ?
Parce que 999 factures possibles c'est pas beaucoup.
Membre enregistré
84 messages
Posté le 21 juin 2023 - 01:04
Bonsoir,

J'ai trouvé une solution à mon problème pour ceux que ça peut intéresser. Sûrement y a t-il d'autres solutions.

Pour ma part, j'ai crée un fichier ini où je donne une valeur de départ
J'ai crée un champ saisie SAI_Resultat = SAI_Resultat + 1
Je relie l'indice de mon fichier ini au nouveau résultat de SAI_Resultat.

Donc quand je sélectionne "expédié" dans ma combo, le numéro de facture se crée automatiquement. Ce que je cherche maintenant à faire, c'est que le sélecteur de cette ligne qui a été validée ne soit plus opérationnel, parce que si je refais "expédié" par inadvertance, la facture se modifie de nouveau.
Membre enregistré
3 887 messages
Popularité : +227 (347 votes)
Posté le 22 juin 2023 - 12:35
Bonjour,
Il suffit d'ajouter une colonne de type booléen (e.g. Expédié).
Dans ton traitement d'expédition :
SI PAS Commande.Expédié ALORS
Commande.Expédié=Vrai
HModifie(Commande)
TraiterExpédition(Commande.PK_Commande)
FIN


--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 22 juin 2023 - 12:36
Membre enregistré
1 144 messages
Popularité : +50 (142 votes)
Posté le 22 juin 2023 - 18:14
Bonjour,

Utiliser un fichier ini pour enregistrer un numéro de facture n'est pas la meilleure option.
Comme Thibault, j'enregistre le dernier numéro dans un fichier de ma base de données que je viens lire au moment de la création de la facture (en utilisant les transactions en cas de problème)

--
Thierry TILLIER
Développeur WINDEV -WEBDEV
Formation WINDEV : https://coursdinfo-video.teachizy.fr/
Livre WINDEV : https://amzn.eu/d/6xTow1z
Tuto WINDEV sur ma chaîne Youtube
Message modifié, 22 juin 2023 - 18:18
Posté le 23 juin 2023 - 09:28
Le plus simple c'est de lire le dernier enregistrement (La dernière facture enregistrée) et faire +1 pour la nouvelle.
(ne pas oublier de bloquer le fichier le temps de la lecture)
Membre enregistré
3 887 messages
Popularité : +227 (347 votes)
Posté le 23 juin 2023 - 16:14
Le plus simple c'est de lire le dernier enregistrement (La dernière facture enregistrée) et faire +1 pour la nouvelle.
(ne pas oublier de bloquer le fichier le temps de la lecture)

Et éviter d'utiliser HLitDernier dans ce cas

--
Il y a peut être plus simple, mais, ça tourne
Posté le 23 juin 2023 - 16:19
Voroltinquo a écrit :
r le temps de la lecture)

Et éviter d'utiliser HLitDernier dans ce cas


--
Il y a peut être plus simple, mais, ça tourne


Bonsoir Voroltinquo,

et pourquoi ?
Membre enregistré
3 887 messages
Popularité : +227 (347 votes)
Posté le 23 juin 2023 - 18:38
HLitDernier pointe sur le dernier enregistrement, mais pas nécessairement sur le dernier enregistrement ajouté.
C'est une question de rééquilibrage du BTree d'index. Pendant la durée de vie de la table, l'ordre des enregistrements n'est plus celui d'ajout.
cf BTree : https://moodle.insa-rouen.fr/pluginfile.php/43973/mod_folder/content/0/13-ArbreB.pdf

--
Il y a peut être plus simple, mais, ça tourne
Posté le 24 juin 2023 - 08:55
HLitDernier(NomFicFac,"FACTURE")
SI H.EnDehors=Vrai
NumFacEnCours=1 //Il n'y a pas de facture pour la période demandée
SINON
NumFacEnCours=FACTURE+1
FIN


Je n'ai jamais rencontré de problème.
Membre enregistré
3 887 messages
Popularité : +227 (347 votes)
Posté le 26 juin 2023 - 11:55
Christine a écrit :
Je n'ai jamais rencontré de problème.

Je n'ai jamais croisé de poissons volants (qui, il faut le reconnaître ne constituent pas la majorité de l'espèce,) toutefois, ils existent

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 26 juin 2023 - 11:56
Posté le 26 juin 2023 - 17:46
J'ai beaucoup de respect pour toi Vorol (alias Clémenceau, alias Michel Audiard) mais faudrait arrêter le délire là.
Mon appli tourne depuis une vingtaine d'années chez une centaine de Clients
et jamais HLitDernier n'a retourné autre chose que le dernier N° de facture.
Evidemment on peut rencontrer une chauve-souris dans un ascenceur mais ...
Membre enregistré
286 messages
Popularité : +24 (28 votes)
Posté le 27 juin 2023 - 08:25
Bonjour à Toutes et Tous
Sans entrer dans la discussion et sans viser personne,
je me demande si il n'y aurait pas une confusion avec la fonction HNumEnr()
https://doc.pcsoft.fr/fr-FR/?3044063&name=HNumEnr
Bien Cordialement
Message modifié, 27 juin 2023 - 08:28
Membre enregistré
3 887 messages
Popularité : +227 (347 votes)
Posté le 27 juin 2023 - 09:55
Gemini1961 a écrit :
je me demande si il n'y aurait pas une confusion avec la fonction HNumEnr()

Les deux problèmes sont liés.
Si la lecture se fait sur une colonne non indexé (on en arrive à mon exocet,) je cite :
la fonction HLitDernier lit le dernier enregistrement actif. En cas de parcours du fichier de données, les enregistrements seront triés selon leur numéro d'enregistrement.

Dans le cas de figure qui nous intéresse, le n° de facture est au pire une AK donc le dernier enregistrement correspond bien à la dernière facture, mais, comme précisé plus haut, le dernier enregistrement n'est pas toujours le dernier ajouté, surtout si la rubrique de parcours n'est pas précisée

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 27 juin 2023 - 10:10
Membre enregistré
84 messages
Posté le 27 juin 2023 - 10:18
Christine a écrit :
HLitDernier(NomFicFac,"FACTURE")
SI H.EnDehors=Vrai
NumFacEnCours=1 //Il n'y a pas de facture pour la période demandée
SINON
NumFacEnCours=FACTURE+1
FIN


Je n'ai jamais rencontré de problème.


Bonjour Christine,

Merci pour ce bout de code, je vais essayer ça.
Ce sera peut être mieux qu'un fichier ini
Membre enregistré
84 messages
Posté le 27 juin 2023 - 10:21
Bonjour,

J'ai un autre problème mais je n'arrive pas à mettre un nouveau sujet, ça me dit "message inexistant", je vais donc le mettre ici : désolé. Je ne sais pas si c'est un bug du forum mais ça fait plusieurs jours que ça dure.

Donc voici,

Voilà ce que je veux faire : importer mes commandes depuis des fichiers excel.
Dans l'exemple que je donne, je suis sur 3 sites que j'appellerai A, B et C pour des raisons de confidentialités.
Tous mes codes sont les mêmes sauf l'ouverture des fichiers Excel qui sont A.xlsx, B.xlsx et C.xlsx

Le but est d'importer les commandes plusieurs fois par jour. Si des commandes existent déjà, ça passe à la suivante et l'ajoute si elle n'existe pas et s'il y a plusieurs lignes de commandes dans une seule commande, le code lit la commande, et ensuite la ligne de commande et ajoute la ligne de commande si elle n'existe pas. Le code ci-dessous sera peut être plus explicite.

Le problème que je rencontre est que si j'importe les commandes dans un certain ordre ça fonctionne mais je ne sais pas pourquoi, ça plante dans d'autres ordres.

Si j'importe

A,B,C = C plante
A,C,B = C plante
B,A,C = A plante
B,C,A = C plante
C,A,B = Fonctionne
C,B,A = A plante

Quand je fais A,B,C par exemple, j'ai un message d'erreur au moment d'importer C qui me dit doublon dans les données mais ça affiche une commande du fichier A alors que j'ai passé B entretemps.

Voilà le code.

Nocommande est la clé unique dans le fichier commandes et en clé doublon dans le fichier lignes de commandes.
Je n'ai gardé que les variables et correspondances nécessaires pour le test afin que le code soit le plus court, le moins chargé et le plus lisible possible.

Si quelqu'un pouvait me trouver le problème parce que je bataille depuis plusieurs jours, j'ai essayé plein d'autres choses mais c'est ce code qui me parait le mieux et pourtant...

I est un entier

ImportXXX est un xlsDocument = xlsOuvre("C:\Mes Projets\Gestion\Exe\IMPORT_COMMANDES\A.xlsx")

sNocommande est une chaîne
sNomlivraison est une chaîne
sLignedecommande est une chaîne
sSKU est une chaîne


xlsFeuilleEnCours(ImportXXX,1)// fichier commande 1ère feuille

POUR I = 2 À xlsNbLigne(ImportXXX)

//Lecture fichier Excel
sNocommande = xlsDonnée(ImportXXX,I,2)
sSKU = xlsDonnée(ImportXXX,I,11)
sLignedecommande = xlsDonnée(ImportXXX,I,16)
sNomlivraison = xlsDonnée(ImportXXX,I,36)


//Import des lignes
Commandes.Nocommande = sNocommande
Commandes.NomLivraison = sNomlivraison

LignesDeCommandes.Nocommande = sNocommande
LignesDeCommandes.SKU = sSKU
LignesDeCommandes.Lignesdecommandes = sLignedecommande




HLitRecherche(Commandes,Nocommande,sNocommande)

SI HTrouve(Commandes) ALORS
HRecherche(LignesDeCommandes,Lignesdecommandes,sLignedecommande)
SI HTrouve(LignesDeCommandes) ALORS
SINON
HAjoute(LignesDeCommandes)
FIN
SINON

HAjoute(Commandes)

HRecherche(LignesDeCommandes,Lignesdecommandes,sLignedecommande)
SI HTrouve(LignesDeCommandes) ALORS
SINON
HAjoute(LignesDeCommandes)
FIN
FIN

FIN

TableAffiche('FEN_Gestion des commandes'.TABLE_Commandes)
TableAffiche('FEN_Gestion des commandes'.TABLE_LignesDeCommandes)
xlsFerme(ImportXXX)
Ferme(FEN_ChoixduSite)
Membre enregistré
286 messages
Popularité : +24 (28 votes)
Posté le 27 juin 2023 - 10:58
Calimero a écrit :

// Bonjour,
// J'ai un autre problème mais je n'arrive pas à mettre un nouveau sujet, ça me dit "message inexistant", je vais donc le mettre ici : désolé.

Bonjour Calimero
Si c'est un autre problème, ne serait-il pas préférable de créer une autre fiche ?
Bien cordialement
Membre enregistré
84 messages
Posté le 27 juin 2023 - 11:18
Gemini1961 a écrit :
Calimero a écrit :

// Bonjour,
// J'ai un autre problème mais je n'arrive pas à mettre un nouveau sujet, ça me dit "message inexistant", je vais donc le mettre ici : désolé.

Bonjour Calimero
Si c'est un autre problème, ne serait-il pas préférable de créer une autre fiche ?
Bien cordialement


J'aimerais bien mais quand je fais "nouveau sujet" et que je fais "envoyer", j'ai un message qui me dit "message inexistant". Et ça depuis la semaine dernière.
Vu que je vis en Espagne, je pensais que c'était peut être dû à ma localisation : j'ai mis un VPN France mais ça ne change rien. Et il n'y a pas de raison puisque ça fonctionnait avant.
Le titre est bien dans mon profil et quand je veux l'ouvrir, ça me dit toujours "message inexistant".
J'ai essayé des dizaines de fois. ça fonctionne en prévisualisation mais pas en envoi
Membre enregistré
546 messages
Posté le 27 juin 2023 - 12:17
Bonjour Calimero,
As tu essayé de mettre des points d'arrêt pour connaître la valeur des variables en cours d'exécution.
Une chose m'interpelle dans ton code : Ferme(FEN_ChoixduSite)
De quoi s'agit-il ?
Tu fermes une fenêtre mais quel est son code, cette fenêtre passe t-elle des variables, et si oui, sont elles correctement transmises ?

Cdlt
Message modifié, 27 juin 2023 - 12:30
Membre enregistré
84 messages
Posté le 27 juin 2023 - 14:26
Bonjour Cédric_34 et merci pour ton intervention,

Oui, j'ai mis des points d'arrêt depuis le début
Tout va bien jusqu'à

//Import des lignes
Commandes.Nocommande = sNocommande : le sNocommande est juste mais Commandes.Nocommande me note la 1ère commande du site A
Commandes.NomLivraison = sNomlivraison : Là, tout est bon

LignesDeCommandes.Nocommande = sNocommande : le sNocommande est juste mais Lignes DeCommandes.Nocommande me note la 1ère commande du site A

LignesDeCommandes.SKU = sSKU : OK
LignesDeCommandes.Lignesdecommandes = sLignedecommande : OK

HLitRecherche(Commandes,Nocommande,sNocommande) : OK

SI HTrouve(Commandes) ALORS : De nouveau Commades.Nocommande deu site A mais sNocommande OK
HAjoute(Commandes) : commande du site A

et plante

Mais pourquoi ça fonctionne dans le sens CAB alors que ce sont les mêmes codes ???

Depuis la fenêtre de gestion de mes commandes, j'ouvre une fenêtre fille FEN_ChoixduSite où sont les boutons pour importer les commandes.
Parce que là, je ne parle que de 3 sites mais j'en ai bien plus, d'où la fermeture de cette fenêtre après un import pour me retrouver sur ma fenêtre de gestion.
Membre enregistré
84 messages
Posté le 28 juin 2023 - 02:22
Bonjour,

Pas de réponse à mes douleurs de crânes ? ;-)

Si ça peut aider à la réflexion, J'ai fait d'autres tests.

Si la commande n'est pas trouvée, j'ai mis une info

SINON
// alors rien
Info("j'ajoute la commande : ",sNocommande)
HAjoute(Commandes)

L'info me donne la bonne commande à importer mais Hajoute met une autre commande

J'ai donc fait un Hajoute(Commandes,ignoredoublon) et il ajoute les numéros de commandes du site A au lieu du site C

Pourquoi, il trouve la commande mais ne l'ajoute pas et surtout pourquoi ça marche dans d'autres ordres d'importation...this is the question

Enfin merci, si une "tête" en windev veut bien se pencher sur le problème
Membre enregistré
286 messages
Popularité : +24 (28 votes)
Posté le 28 juin 2023 - 09:37
Bonjour Calimero
Continue à débuguer, tu es sur la bonne voie :-)
Ceci dit, évites d'envoyer des messages sans fondement ;-)
Pour tes douleurs de crâne, il existe aussi le Support, il se penchera sur ton "problème"
Bien Cordialement
Message modifié, 28 juin 2023 - 09:37
Membre enregistré
84 messages
Posté le 29 juin 2023 - 00:37
Bonjour Gemini,

Je vais arrêter ici ce sujet, mes précédents nouveaux messages qui me disaient "message inexistant" et qui étaient vraiment vides quand je vérifiais sont finalement apparus par miracle.