Utilisation du pointeur LIST
Utilisation du pointeur LIST
Bonjour,
Je fais appel à votre aide, je suis débutant dans la programmation, je bloque depuis quelques jours sur ce problème, je vous explique:
J'ai un DB où je reçois un code en DINT ( DB4.DBD0 "RECU"),
un DB où des codes (150 codes) sont enregistrés (DB5 "STOCK"),
un DB ou sont stocké des numéro de recettes INT (DB6 "RECETTE"),
Et un DB ou je voudrai copier le code reçu, et le numéro de recette correspondant (DB8 "COPIE").
Je voudrais maintenant comparer le code reçu (DB4.DBD0) avec les codes disponible dans le DB5,
et si un code match je voudrais, copier le code reçu et le numéro de recette correspondant à la même adresse que le code trouvé, dans le DB8.
Je ne sais pas si c'est clair.
Voici ce que j'ai fais mais évidement ça ne fonctionne pas.
LAR1 P#0.0
Next: AUF "STOCK"
L DBD [AR1,P#0.0]
L "RECU".CODE_recu
==D
SPBNB saut // saut si résultat non vrai
T "COPIE".COPIE_code
AUF "RECETTE"
L DBD [AR1,P#0.0]
T "COPIE".COPIE_num_recette
saut: +AR1 P#4.0
LOOP Next
Je m'excuse d'avance pour vos yeux.
Pouvez vous me pointer ce qui ne va pas, comment ça pourrai fonctionner.
Merci d'avance
Je fais appel à votre aide, je suis débutant dans la programmation, je bloque depuis quelques jours sur ce problème, je vous explique:
J'ai un DB où je reçois un code en DINT ( DB4.DBD0 "RECU"),
un DB où des codes (150 codes) sont enregistrés (DB5 "STOCK"),
un DB ou sont stocké des numéro de recettes INT (DB6 "RECETTE"),
Et un DB ou je voudrai copier le code reçu, et le numéro de recette correspondant (DB8 "COPIE").
Je voudrais maintenant comparer le code reçu (DB4.DBD0) avec les codes disponible dans le DB5,
et si un code match je voudrais, copier le code reçu et le numéro de recette correspondant à la même adresse que le code trouvé, dans le DB8.
Je ne sais pas si c'est clair.
Voici ce que j'ai fais mais évidement ça ne fonctionne pas.
LAR1 P#0.0
Next: AUF "STOCK"
L DBD [AR1,P#0.0]
L "RECU".CODE_recu
==D
SPBNB saut // saut si résultat non vrai
T "COPIE".COPIE_code
AUF "RECETTE"
L DBD [AR1,P#0.0]
T "COPIE".COPIE_num_recette
saut: +AR1 P#4.0
LOOP Next
Je m'excuse d'avance pour vos yeux.
Pouvez vous me pointer ce qui ne va pas, comment ça pourrai fonctionner.
Merci d'avance
-
philou77
- Mi homme - Mi automate

- Messages : 2142
- Enregistré le : 21 oct. 2015, 10:00
- Localisation : Ile de France
Re: Utilisation du pointeur LIST
Salut !
1 - N'ouvre pas ton DB systématiquement (AUF) mais une seule fois !!
pour faire un LOOP, il faut une variable ! NEXT est une étiquette de saut dans ton cas.
Exemple pour une boucle qui va de 9 à 0 (exécutée 10 fois donc)
L KF 9
BOUCLE : T MW10
L MW10
LOOP BOUCLE
1 - N'ouvre pas ton DB systématiquement (AUF) mais une seule fois !!
pour faire un LOOP, il faut une variable ! NEXT est une étiquette de saut dans ton cas.
Exemple pour une boucle qui va de 9 à 0 (exécutée 10 fois donc)
L KF 9
BOUCLE : T MW10
L MW10
LOOP BOUCLE
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! 
Re: Utilisation du pointeur LIST
Salut,
Merci beaucoup pour la réponse, voici ce que j'ai fais:
LAR1 P#0.0
L 30
Next: T #COMPTEUR
AUF "STOCK"
L DBD [AR1,P#0.0]
L "RECU".CODE_recu
==D
SPBNB saut // saut si résultat non vrai
T "COPIE".COPIE_code
AUF "RECETTE"
L DBD [AR1,P#0.0]
T "COPIE".COPIE_num_recette
saut: +AR1 P#4.0
L #COMPTEUR
LOOP Next
J'ai fais une simulation, je n'ai toujours rien dans le DB COPIE,
Quand vous dites d'ouvrir le db qu'une seule fois, je l'ouvre avant la boucle mais au 2ème LOOP ça risque de prendre les valeurs du DB RECETTE non ?
Merci beaucoup pour la réponse, voici ce que j'ai fais:
LAR1 P#0.0
L 30
Next: T #COMPTEUR
AUF "STOCK"
L DBD [AR1,P#0.0]
L "RECU".CODE_recu
==D
SPBNB saut // saut si résultat non vrai
T "COPIE".COPIE_code
AUF "RECETTE"
L DBD [AR1,P#0.0]
T "COPIE".COPIE_num_recette
saut: +AR1 P#4.0
L #COMPTEUR
LOOP Next
J'ai fais une simulation, je n'ai toujours rien dans le DB COPIE,
Quand vous dites d'ouvrir le db qu'une seule fois, je l'ouvre avant la boucle mais au 2ème LOOP ça risque de prendre les valeurs du DB RECETTE non ?
-
philou77
- Mi homme - Mi automate

- Messages : 2142
- Enregistré le : 21 oct. 2015, 10:00
- Localisation : Ile de France
Re: Utilisation du pointeur LIST
re !
tu n'as pas qu'un seul résultat pour ta recherche ?
et il te manque un saut après T_copie pour finir vers une fin propre..
tu n'as pas qu'un seul résultat pour ta recherche ?
et il te manque un saut après T_copie pour finir vers une fin propre..
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! 
Re: Utilisation du pointeur LIST
Re,
Voici la nouvelle version avec le saut:
LAR1 P#0.0
L 30
Next: T #COMPTEUR
AUF "STOCK" // ici je compare ce que j'ai dans le DB STOCK
L DBD [AR1,P#0.0]
L "RECU".CODE_recu // avec ce que j'ai reçu ici, est-ce que cette partie est bonne ?
==D
SPBNB saut // saut si résultat non vrai , le saut ici est approprié ?
T "COPIE".COPIE_code // ici transfère ("RECU".CODE_recu)
AUF "RECETTE" //j'ouvre le DB recette
L DBD [AR1,P#0.0] // je charge les valeur de la même adresse que la ou on a trouvé le code (en tout cas c'est ce que je pense)
T "COPIE".COPIE_num_recette //et là, je transfère les valeurs chargées.
SPA Fin
saut: +AR1 P#4.0
L #COMPTEUR
LOOP Next
Fin: NOP 0
Il y a donc 2 valeurs à copier.
Peut-être que je n'ai pas compris la question.
Voici la nouvelle version avec le saut:
LAR1 P#0.0
L 30
Next: T #COMPTEUR
AUF "STOCK" // ici je compare ce que j'ai dans le DB STOCK
L DBD [AR1,P#0.0]
L "RECU".CODE_recu // avec ce que j'ai reçu ici, est-ce que cette partie est bonne ?
==D
SPBNB saut // saut si résultat non vrai , le saut ici est approprié ?
T "COPIE".COPIE_code // ici transfère ("RECU".CODE_recu)
AUF "RECETTE" //j'ouvre le DB recette
L DBD [AR1,P#0.0] // je charge les valeur de la même adresse que la ou on a trouvé le code (en tout cas c'est ce que je pense)
T "COPIE".COPIE_num_recette //et là, je transfère les valeurs chargées.
SPA Fin
saut: +AR1 P#4.0
L #COMPTEUR
LOOP Next
Fin: NOP 0
Il y a donc 2 valeurs à copier.
Peut-être que je n'ai pas compris la question.
-
philou77
- Mi homme - Mi automate

- Messages : 2142
- Enregistré le : 21 oct. 2015, 10:00
- Localisation : Ile de France
Re: Utilisation du pointeur LIST
tu oublies de positionner AR1 à une valeur initiale de 0 je pense...
L DBD[AR1, P#0,0] ne fait que charger l'adresse "AR1" décalée de P#0.0 et en aucun cas ne met P#0.0 dans AR1 !!
il faut charger 0.0 dans AR1 avant de l'utiliser car il peut y avoir n'importe quoi dedans!
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! 
Re: Utilisation du pointeur LIST
Re,
Okey, j'ai ajouté l'initialisation de AR1 en premier, j'ai changé le type des données passant de DINT aux DWORD,
Quand je lance la simulation , j'ai le num de recette "1" qui apparait (valeur de la première adresse du DB RECETTE), mais la partie du code reste à Zéro
voici le nouveau script:
L P#0.0
LAR1 P#0.0
L 7
Next: T #COMPTEUR //ici next
L "RECU".CODE_recu
AUF "STOCK"
L DBD [AR1,P#0.0]
==D
SPBNB saut // saut si résultat non vrai
L "RECU".CODE_recu
T "COPIE".COPIE_code
AUF "RECETTE"
L DBD [AR1,P#0.0]
T "COPIE".COPIE_num_recette
SPA Fin
saut: +AR1 P#4.0
L #COMPTEUR
LOOP Next
Fin: NOP 0
Encore merci pour vos réponses, j'apprends et ça me débloque petit à petit
Okey, j'ai ajouté l'initialisation de AR1 en premier, j'ai changé le type des données passant de DINT aux DWORD,
Quand je lance la simulation , j'ai le num de recette "1" qui apparait (valeur de la première adresse du DB RECETTE), mais la partie du code reste à Zéro
voici le nouveau script:
L P#0.0
LAR1 P#0.0
L 7
Next: T #COMPTEUR //ici next
L "RECU".CODE_recu
AUF "STOCK"
L DBD [AR1,P#0.0]
==D
SPBNB saut // saut si résultat non vrai
L "RECU".CODE_recu
T "COPIE".COPIE_code
AUF "RECETTE"
L DBD [AR1,P#0.0]
T "COPIE".COPIE_num_recette
SPA Fin
saut: +AR1 P#4.0
L #COMPTEUR
LOOP Next
Fin: NOP 0
Encore merci pour vos réponses, j'apprends et ça me débloque petit à petit
-
philou77
- Mi homme - Mi automate

- Messages : 2142
- Enregistré le : 21 oct. 2015, 10:00
- Localisation : Ile de France
Re: Utilisation du pointeur LIST
Re !
Ton L P#0.0 en début de prg ne sert a rien.. tu peux le supprimer
Tu recommence à ouvrir ton db dans chaque boucle.. ça remplit une pile d'appel des blocs et tu risque d'atteindre la limite d'appel sur des boucles plus longues..
quelles sont les valeurs qui sont dans tes DB ?
Ton L P#0.0 en début de prg ne sert a rien.. tu peux le supprimer
Tu recommence à ouvrir ton db dans chaque boucle.. ça remplit une pile d'appel des blocs et tu risque d'atteindre la limite d'appel sur des boucles plus longues..
je comprend pas la phrase ??
quelles sont les valeurs qui sont dans tes DB ?
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! 
Re: Utilisation du pointeur LIST
Bonjour,
J'espère que vous allez bien,
Maintenant je comprends mieux. j'ai pu améliorer le script, et ça fonctionne sauf sur un point
Voici le nouveau script
Si la comparaison est vraie
Le DB COPIE_ La copie du CODE se fait bien , sauf pour le numero de recette qui ne devrait pas avoir les meme valeur que le code
voici une capture de la simulation:
Je vous joins également des capture des DB STOCK et DB RECETTE
DB STOCK : DB RECETTE contenant les num de recette
Pourriez vous me dire où est ce que je me trompe, pourquoi j'ai les même valeur copié deux fois.
Je vous remercie d'avance
J'espère que vous allez bien,
J'avais pas bien compris le concept de l'AR1, AR2
Maintenant je comprends mieux. j'ai pu améliorer le script, et ça fonctionne sauf sur un point
Voici le nouveau script
L "RECU".CODE_recu
T #CODE
AUF "STOCK"
LAR1 P#DBX 0.0
AUF DI 6
LAR2 P#DIX 0.0
L 108
Loop: T #COMPTEUR
U(
L D [AR1,P#0.0]
L #CODE
==D
)
SPBNB non
L D [AR1,P#0.0]
T "COPIE_".COPIE_code // copie valeur 1ere add
L D [AR2,P#0.0]
T "COPIE_".COPIE_num_recette //copie valeur 2eme add
S "recette_trouve" //recette trouvé
R "recette_non_trouve" //recette non trouvé
SPA ok
non: +AR1 P#4.0
+AR2 P#4.0
U(
L #COMPTEUR
L 0
==I
)
SPBB nont
L #COMPTEUR
LOOP Loop
nont: S "recette_non_trouve" // recette non trouvé
R "recette_trouve" //recette trouvé
ok: NOP 0
Si la comparaison est vraie
Je veux copier les valeurs d'adresse AR1 et AR2, vers mon DB10 "COPIE_"U(
L D [AR1,P#0.0]
L #CODE
==D
)
Le DB COPIE_ La copie du CODE se fait bien , sauf pour le numero de recette qui ne devrait pas avoir les meme valeur que le code
voici une capture de la simulation:
Je vous joins également des capture des DB STOCK et DB RECETTE
DB STOCK : DB RECETTE contenant les num de recette
Pourriez vous me dire où est ce que je me trompe, pourquoi j'ai les même valeur copié deux fois.
Je vous remercie d'avance
-
philou77
- Mi homme - Mi automate

- Messages : 2142
- Enregistré le : 21 oct. 2015, 10:00
- Localisation : Ile de France
Re: Utilisation du pointeur LIST
L "RECU".CODE_recu
T #CODE
AUF "STOCK" // CA C'EST BON
LAR1 P# 0.0
a supprimer ................. AUF DI 6
a supprimer ................. AR2 P# 0.0
L 108
Loop: T #COMPTEUR -> ca veut dire charger Accu 1 dans #Compteur
U(
L #CODE
L DBD [AR1,P#0.0] // tu DOIS charger un DBD (double mot dans un db à l'adresse AR1 + le décalage 0.0)
==D
)
SPBNB non
à supprimer ....L D [AR1,P#0.0] // en ayant fait l'inversion d'appel avec #CODE juste avant, tu as la bonne valeur dans ACCU 1
T "COPIE_".COPIE_code // copie valeur 1ere add
AUF DB (OUVRIR LE DB DE RECETTE QUE TU VEUX A CE MOMENT LA)
L DBD [AR1,P#0.0] // tu dois charger un DBD !!
T "COPIE_".COPIE_num_recette //copie valeur 2eme add
S "recette_trouve" //recette trouvé
R "recette_non_trouve" //recette non trouvé
SPA ok
non: +AR1 P#4.0
A supprimer …… +AR2 P#4.0
à supprimer ......................................
U( // supprime CE N'EST PAS UTILE, CAR LE LOOP FAIT D2JA CELA SUR LE CONTENU DE l'ACCU 1
L #COMPTEUR // supprime DONC A LA FIN DU LOOP, QUAND # COMPTEUR VAUDRA -1 (ou 0, je suis plus sûr) IL FERA L'INSTRUCTION SUIVANTE
L 0 // supprime
==I // supprime
) // supprime
SPBB nont // supprime
à supprimer .......................................
L #COMPTEUR -> charger #compteur dans accu 1
LOOP Loop -> ca veut dire accu1 = accu 1-1 / si >0 alors saut à l'étiquette, sinon faire ligne suivante
nont: S "recette_non_trouve" // recette non trouvé
R "recette_trouve" //recette trouvé
ok: NOP 0
T #CODE
AUF "STOCK" // CA C'EST BON
LAR1 P# 0.0
a supprimer ................. AUF DI 6
a supprimer ................. AR2 P# 0.0
L 108
Loop: T #COMPTEUR -> ca veut dire charger Accu 1 dans #Compteur
U(
L #CODE
L DBD [AR1,P#0.0] // tu DOIS charger un DBD (double mot dans un db à l'adresse AR1 + le décalage 0.0)
==D
)
SPBNB non
à supprimer ....L D [AR1,P#0.0] // en ayant fait l'inversion d'appel avec #CODE juste avant, tu as la bonne valeur dans ACCU 1
T "COPIE_".COPIE_code // copie valeur 1ere add
AUF DB (OUVRIR LE DB DE RECETTE QUE TU VEUX A CE MOMENT LA)
L DBD [AR1,P#0.0] // tu dois charger un DBD !!
T "COPIE_".COPIE_num_recette //copie valeur 2eme add
S "recette_trouve" //recette trouvé
R "recette_non_trouve" //recette non trouvé
SPA ok
non: +AR1 P#4.0
A supprimer …… +AR2 P#4.0
à supprimer ......................................
U( // supprime CE N'EST PAS UTILE, CAR LE LOOP FAIT D2JA CELA SUR LE CONTENU DE l'ACCU 1
L #COMPTEUR // supprime DONC A LA FIN DU LOOP, QUAND # COMPTEUR VAUDRA -1 (ou 0, je suis plus sûr) IL FERA L'INSTRUCTION SUIVANTE
L 0 // supprime
==I // supprime
) // supprime
SPBB nont // supprime
à supprimer .......................................
L #COMPTEUR -> charger #compteur dans accu 1
LOOP Loop -> ca veut dire accu1 = accu 1-1 / si >0 alors saut à l'étiquette, sinon faire ligne suivante
nont: S "recette_non_trouve" // recette non trouvé
R "recette_trouve" //recette trouvé
ok: NOP 0
Si vous avez compris tout ce que je viens d'écrire, c'est que j'ai dû faire une erreur quelque part ! 
