Question de block imbriqué
Rockyboa23-Nov-2007/4:37:18+1:00
Bonjour,

Je crois que je suis un peu perdu lorsqu'il sagit d'imbriquer des block

Soit le code

a: [
  a1 none
  a2 none
]

b: [
  b1 none
  b2 [ ]
]

bs: [ ]

a/a1: "rouge"
a/a2: "large"
append/only b/b2 copy a

b/b1: "stylo"
append/only bs copy b

a/a1: "bleu"
a/a2: "fin"
append/only b/b2 copy a

b/b1: "crayon"
append/only bs copy b



Je n'esperais pas trouver dans bs/1 et dans bs/2 les deux même block de type a.

Est-ce ma declaration du block b qui ne convient pas?

Martin
guest223-Nov-2007/18:53:19+1:00
je ne suis pas certain de comprendre le problème.

essaye avec 2 (copy/deep b)
guest223-Nov-2007/19:23:32+1:00
Si ça ne résoud pas ton problème, donne nous plutôt la structure complète que tu veux obtenir dans ton exemple.
Rockyboa26-Nov-2007/2:13:21+1:00
Ca résoud partiellement le probleme si je fait un copy/deep sur mes block b dans bs.

Pour essayer de donner un exemple plus concret, disons que le block b represente un client avec des factures, et le block est le detail facure, donc bs est le block qui contient des clients et leurs factures.

facture: [
  no_facture none
  montant_facture none
]

client: [
  no_client none
  factures_client [ ]
]

clients: [ ]


Mon probleme c'est quand j'atoute des factures elles s'ajoutent dans tous les clients.

facture/no_facture: "A000012"
facture/montant_facure: $3.30
append/only client/factures_client copy facture

client/no_client: 1234
append/only clients copy/deep client

facture/no_facture: "A000013"
facture/montant_facure: $43.40
append/only client/factures_client copy facture

client/no_client: 1235
append/only clients copy/deep client


Je me retrouve avec deux factures pour le client 1235, Je m'attendais a avoir seulement la facture "A000013"!!

On dirait bien que c'est déclaration de block ressemble a des pointeurs implicites, j'essaie juste de comprendre la méchanique en dessous de tous ca!

Une fois un copy/deep fait sur un client, est-il possible d'y ajouter des clients?

Merci

Martin
shadwolf1-Dec-2007/3:46:56+1:00
normalement tu devrais trouver les réponses a tes problèmes ici

http://www.rebol.com/docs/core-fr/fr-rebolcore-10.html

(make est ton ami ^^)
shadwolf1-Dec-2007/4:27:28+1:00
et la tu me dis je comprends rien A l'aide!!!

bon alors c tres simple en fait les données de ta liste prenne toute la forme de ta derniere modification car tu insert dans ta liste non pas un clone de l'objet! mais un pointeur vers l'object! initial .... donc toutes modificiation du contenu initial influence tout le monde

donc on a 2 object! la premiere fase consiste simplement a déclarer les "modeles" des ces objects

FAse 1: Déclaratiion des modèle des object

facture_obj: make object! [ num: none! montant: none! ]

client_obj: make object! [num: none! factures: []]


La fase 2 consite a crée tes variables clonant la structure de tes 2 object!

Fase 2: Clonage des structure d'object!

facture: make facture_obj [] ; le [] ici c pour dire que tu fourni pas d'infos dans le contenant c la structure telquelle à été crée evidement si tu met [ "F0001" "3140.00"] tu vas remplir les champs automatiquement avec les données passées.

client: make client_obj []


Fase 3 --- REmplissage des conteneur
facture/num: "F0001"
facture/montant: "12.22"
client/num: "C0001"

pour la liste des facture c'est assez simple

insert client/factures facture

on veux inserer une 2eme facture

on reprend notre variable facture on la réinitialise on la rempli avec les nouvelle valeure et on la stock dans client/factures

facture: make facture_obj []
facture/num: "F0002"
facture/montant: "134.40"

insert client/factures facture

pour vérifier le contenu de client/factures on fait:

probe client/factures

si tu veux que la nouvelle enttrée arrive en fin de la liste des factures tu fait insert tail client/factures facture

la preuve que ca marche :

>> facture_obj: make object! [ num: none! montant: none! ]
>> client_obj: make object! [num: none! factures: []]
>> client: make client_obj []
>> facture: make facture_obj []
>> facture: make facture_obj []
>> facture/num: "F0001"
== "F0001"
>> facture/montant: "12.22"
== "12.22"
>> client/num: "C0001"
== "C0001"
>> insert client/factures facture
== []
>> facture: make facture_obj []
>> facture/num: "F0002"
== "F0002"
>> facture/montant: "134.40"
== "134.40"
>> insert client/factures facture
== [make object! [
num: "F0001"
montant: "12.22"
]]
>> probe client/factures
[make object! [
num: "F0002"
montant: "134.40"
] make object! [
num: "F0001"
montant: "12.22"
]]
== [make object! [
num: "F0002"
montant: "134.40"
] make object! [
num: "F0001"
montant: "12.22...
>>

Fase 5 - la consultation des données:

foreach fact client/factures [ print fact/num print fact/montant print "^M" ]

Pour chaque object! de type fact_obj dans la liste client/factures on ecrit a l'écran de la console rebol le contenu du champ num et du champs montant

ce qui donne :

>> foreach fact client/factures [ print fact/num print fact/montant print "^M" ]
F0002
134.40

F0001
12.22

Voila pour stocker les clients c pareil tu initialise ton client tu le rempli tu le stock dans la liste clients et ainsi de suite. En oubliant pas de repasser a chaque fois par initialisation de ta variable(var: make var_obj [])... sinon tu retombe dans le problème que tu rencontre actuellement.

ne pas repasser par la réinitalisation de la variable revient à travailler sur le même secteur mémoire.
quand tu fais "var: make var_obj []" tu demandes a la VM rebol de t'allouer un nouveau secteur mémoire avec var comme pointeur.

quand tu fais "insert ma_liste var" tu stock dans ta liste le secteur mémoire qui a été attribuée a ce momment là au pointeur "var". Donc si tu repasse pas par l'etape initialisation tu vas tjrs modifier le meme secteur de mémoire et ne faire qu'ajouter encore et encore des pointeurs vers ce même segment de mémoire du coup toutes les données figurant dans ta liste contiendrons les données issues de la derniere modificiation. Si tu as voulu faire 20 entrées tu obtient donc 20 fois la dernieres entrées de données dans ta liste ...
shadwolf1-Dec-2007/4:27:40+1:00
et la tu me dis je comprends rien A l'aide!!!

bon alors c tres simple en fait les données de ta liste prenne toute la forme de ta derniere modification car tu insert dans ta liste non pas un clone de l'objet! mais un pointeur vers l'object! initial .... donc toutes modificiation du contenu initial influence tout le monde

donc on a 2 object! la premiere fase consiste simplement a déclarer les "modeles" des ces objects

FAse 1: Déclaratiion des modèle des object

facture_obj: make object! [ num: none! montant: none! ]

client_obj: make object! [num: none! factures: []]


La fase 2 consite a crée tes variables clonant la structure de tes 2 object!

Fase 2: Clonage des structure d'object!

facture: make facture_obj [] ; le [] ici c pour dire que tu fourni pas d'infos dans le contenant c la structure telquelle à été crée evidement si tu met [ "F0001" "3140.00"] tu vas remplir les champs automatiquement avec les données passées.

client: make client_obj []


Fase 3 --- REmplissage des conteneur
facture/num: "F0001"
facture/montant: "12.22"
client/num: "C0001"

pour la liste des facture c'est assez simple

insert client/factures facture

on veux inserer une 2eme facture

on reprend notre variable facture on la réinitialise on la rempli avec les nouvelle valeure et on la stock dans client/factures

facture: make facture_obj []
facture/num: "F0002"
facture/montant: "134.40"

insert client/factures facture

pour vérifier le contenu de client/factures on fait:

probe client/factures

si tu veux que la nouvelle enttrée arrive en fin de la liste des factures tu fait insert tail client/factures facture

la preuve que ca marche :

>> facture_obj: make object! [ num: none! montant: none! ]
>> client_obj: make object! [num: none! factures: []]
>> client: make client_obj []
>> facture: make facture_obj []
>> facture: make facture_obj []
>> facture/num: "F0001"
== "F0001"
>> facture/montant: "12.22"
== "12.22"
>> client/num: "C0001"
== "C0001"
>> insert client/factures facture
== []
>> facture: make facture_obj []
>> facture/num: "F0002"
== "F0002"
>> facture/montant: "134.40"
== "134.40"
>> insert client/factures facture
== [make object! [
num: "F0001"
montant: "12.22"
]]
>> probe client/factures
[make object! [
num: "F0002"
montant: "134.40"
] make object! [
num: "F0001"
montant: "12.22"
]]
== [make object! [
num: "F0002"
montant: "134.40"
] make object! [
num: "F0001"
montant: "12.22...
>>

Fase 5 - la consultation des données:

foreach fact client/factures [ print fact/num print fact/montant print "^M" ]

Pour chaque object! de type fact_obj dans la liste client/factures on ecrit a l'écran de la console rebol le contenu du champ num et du champs montant

ce qui donne :

>> foreach fact client/factures [ print fact/num print fact/montant print "^M" ]
F0002
134.40

F0001
12.22

Voila pour stocker les clients c pareil tu initialise ton client tu le rempli tu le stock dans la liste clients et ainsi de suite. En oubliant pas de repasser a chaque fois par initialisation de ta variable(var: make var_obj [])... sinon tu retombe dans le problème que tu rencontre actuellement.

ne pas repasser par la réinitalisation de la variable revient à travailler sur le même secteur mémoire.
quand tu fais "var: make var_obj []" tu demandes a la VM rebol de t'allouer un nouveau secteur mémoire avec var comme pointeur.

quand tu fais "insert ma_liste var" tu stock dans ta liste le secteur mémoire qui a été attribuée a ce momment là au pointeur "var". Donc si tu repasse pas par l'etape initialisation tu vas tjrs modifier le meme secteur de mémoire et ne faire qu'ajouter encore et encore des pointeurs vers ce même segment de mémoire du coup toutes les données figurant dans ta liste contiendrons les données issues de la derniere modificiation. Si tu as voulu faire 20 entrées tu obtient donc 20 fois la dernieres entrées de données dans ta liste ...
shadwolf1-Dec-2007/4:29:19+1:00
doube post pardon j'ai eu un message d'erreur ....
shadwolf1-Dec-2007/10:22:34+1:00
soit dit en passant :

facture: make facture_obj []
facture/num: "F0002"
facture/montant: "134.40 


peut s'optimiser par une seule ligne
 
 facture: make facture_obj [ "F0002" "134.40" ]

si tu veux rendre ca dynamique:
facture: make facture_obj compose [ var_exter1 var_exter2]


ou var_exter1 et var_exter2 peuvent par example etre les champs texte d'une fenetre de saisie vid.

Bonne méditation ^^

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2