PC SOFT

FOROS PROFESIONALES
WINDEVWEBDEV y WINDEV Mobile

Inicio → WINDEV 2025 → enregistrer un chaîne de données entière
enregistrer un chaîne de données entière
Iniciado por Maxime, 23,may. 2019 14:37 - 11 respuestas
Miembro registrado
106 mensajes
Publicado el 23,mayo 2019 - 14:37
Bonjour ,

J'aimerai pouvoir enregistré une chaîne dans sa totalité .
Actuellement ma chaîne ce compose de la sorte : 256 ,512 , ... , 2048 avec un Retour chariot a chaque valeur.
lors de l'enregistrement je n'ai que 256 sur 8 lignes.

Mon programme ce connecte sur un automate et lit les valeurs toutes les 5 secondes ces valeurs change mais ne s'enregistre pas correctement .
En utilisant aucune interface graphique.
Avez vous des idées de fonction a utilisé pour mon cas ?

Cordialement M.Plouy
Miembro registrado
948 mensajes
Publicado el 23,mayo 2019 - 16:50
Bonjour,
"J'aimerai pouvoir enregistré une chaîne dans sa totalité" mais vous ne précisez pas l'endroit ou vous voulez sauver !!
Fichier à plat type txt, csv xls ou base de données ??
Miembro registrado
3.778 mensajes
Publicado el 23,mayo 2019 - 16:52
Maxime, avec un bout de code on pourra t'aider plus efficacement.
Miembro registrado
106 mensajes
Publicado el 24,mayo 2019 - 09:24
Bonjour ,

voici mon code ceci est un protocole modbus tcp/ip .
Il ce connecte a un automate et récupère une chaîne.
J'aimerai savoir comment j'enregistre la totalité de la chaîne dans une base de donnée HFSQL directement sur windev.

Cordialement M.Plouy

Procedure _ID_Etat()

//déclaration des variables utiliser en interne de la procedure
Nom_socket est une chaîne = "connexion"
Debut_registre est un entier = "1"
Nb_mots est un entier = "8"
i est un entier
Tailleréponse est un entier
nValeur est un entier
nValeur1 , nValeur2 sont des entier sans signe sur 1 octet
nNb_octet_reponse est un entier sans signe sur 1 octet
nStartLow est un entier sans signe sur 1 octet
StartHigh est un entier sans signe sur 1 octet
LengthLow est un entier sans signe sur 1 octet
LengthHigh est un entier sans signe sur 1 octet
sReponseautomate est une chaîne
Reponse_autom est un Buffer
MbusQuery est un Buffer sur 12 octet
//calcul des valeurs par rapport au numéro de mots et a son nombre a affecter
nStartLow = Modulo(Debut_registre ,256) //Modulo 256 retourne le reste de la division entière de deux nombres
StartHigh = Debut_registre / 256
LengthLow = Modulo( Nb_mots, 256)
LengthHigh = Nb_mots / 256
//confection de la trame
MbusQuery[[1]] = 0 //|
MbusQuery[[2]] = 3 //| Identification du demandeur
MbusQuery[[3]] = 0 //|
MbusQuery[[4]] = 0 //| 0 protocole MODBUS
MbusQuery[[5]] = 0 //|
MbusQuery[[6]] = 6 //|` Longueur du message qui suit 6 octets
MbusQuery[[7]] = 0 //|
MbusQuery[[8]] = 3 //| Code de la demande ,03 lecture seule, 16 écriture seule, 23 lecture écriture
MbusQuery[[9]] = StartHigh
MbusQuery[[10]] = nStartLow
MbusQuery[[11]] = LengthHigh
MbusQuery[[12]] = LengthLow
//Envoi de la demande de lecture
SI SocketEcrit(Nom_socket,MbusQuery)= Vrai ALORS
//Lecture de la réponse automate et traitement
Reponse_autom=SocketLit(Nom_socket,Faux)
Tailleréponse=Taille(Reponse_autom)
nNb_octet_reponse=Reponse_autom[[9]]
POUR i=10 À nNb_octet_reponse + 9 PAS 2
nValeur1=BufferVersEntier(Reponse_autom,i,1)
nValeur2=BufferVersEntier(Reponse_autom,i-1,1)
nValeur=(nValeur2*256) + nValeur1
sReponseautomate=sReponseautomate+NumériqueVersChaîne(nValeur)+RC

Metier.IDMachine=sReponseautomate
HAjoute(Metier,hIgnoreDoublon)


FIN
RENVOYER(sReponseautomate)

SINON
RENVOYER("Erreur lors de la demande de lecture ")
FIN
Publicado el 24,mayo 2019 - 11:01
Les deux seules lignes intéressantes là dedans sont :

Metier.IDMachine=sReponseautomate
HAjoute(Metier,hIgnoreDoublon)


et là tout semble bizarre !
Vous mettez la réponse de l'automate dans la rubrique IDMachine ? c'est un jeu de piste ?
Et, elle est déclarée comment cette rubrique ?Vu le besoin, il faut un texte au format Memo.

Quant au HAjoute avec un hIgnoreDoublon, ce n'est pas l'objet du post, mais comment dire... ce n'est pas une utilisation normale...
Miembro registrado
4.362 mensajes
Publicado el 24,mayo 2019 - 12:38
Dominique a écrit :
> Quant au HAjoute avec un hIgnoreDoublon, ce n'est pas l'objet du post, mais comment dire... ce n'est pas une utilisation normale...

Oui mais comme ça il n'y a plus d'erreur d'intrégrité :D

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
106 mensajes
Publicado el 24,mayo 2019 - 12:47
Le soucis c'est que dans ma chaîne j'ai plusieurs valeurs qui ce suivent et uniquement la premier s'enregistre .
je sais pas comment faire pour avoir la totalité de ma chaîne dans ma BDD
Miembro registrado
4.362 mensajes
Publicado el 24,mayo 2019 - 14:02
C'est ,êntre autre, une question d'affectation.
Tu affectes une chaîne à un entier (qui plus est une PK mais là, c'est un autre problème.)
La machine essaye de faire de son mieux, elle récupère la première chose qui ressemble à un entier. Elle ne sait pas que c'est une suite d'entier, pour elle, 256,.... c'est un réel. On lui a dit que Metier.IDMachine c'était un entier donc elle récupère la partie entière de ce qu'on lui envoie.

--
Il y a peut être plus simple, mais, ça tourne
Miembro registrado
948 mensajes
Publicado el 24,mayo 2019 - 14:03
Bonjour,
quel est le type exacte de la colonne : Metier.IDMachine ?
Miembro registrado
106 mensajes
Publicado el 24,mayo 2019 - 15:03
metier.IDmachine est un numerique de type entier
Miembro registrado
948 mensajes
Publicado el 24,mayo 2019 - 15:40
Bonjour
Vous essayez de mettre dans un entier, une chaine de caractère et ça ce n'est pas correct !
Vous devez mettre la chaine sReponseautomate dans une colonne de type chaine ou de type memo
Miembro registrado
1.640 mensajes
Publicado el 24,mayo 2019 - 16:54
Si le but c'est de créer autant d’enregistrements de Metier qu'il y a de lignes dans ta chaine, il faut faire :

POUR TOUTE chaîne sID de sReponseautomate SEPAREE PAR RC
Metier.IDMachine=sID
HAjoute(Metier,hIgnoreDoublon)
FIN