Otools
17th September 2003, 18:19
Bonjour a toutes et à tous.
A l'aide, a l'aide...Voila je souhaiterais faire des mises à jour de champs sur une tres grosse table tfacr200 (6 millions d'enregistrements).
En gros mon script est :
select tfacr200.*
from tfacr200 for update
where condition 1
selectdo
tfacr200.cuno = value1
db.update(ttfacr200, ...)
select tfacr200.*
from tfacr200 for update
where condition2
selectdo
tfacr200.cuno = value1
db.update(ttfacr200, ...)
endselect
endselect
Le probleme c'est que tous les enregistrements qui repondent Vrai à la condition 2 ne sont pas tous mis à jour... certain oui d'autres non !?!
J'ai essayé avec le script ci-dessous :
select tfacr200.*
from tfacr200 for update
where condition 1
selectdo
tfacr200.cuno = value1
db.update(ttfacr200, ...)
select alias.cuno, alias.... (les champs que je veux mettre a jour)
from tfacr200 for update
where condition2
selectdo
tfacr200.cuno = value1
db.update(ttfacr200, ...)
endselect
endselect
Mais les update sur les alias, BaaN n'apprecie pas du tout.
Est ce qqun peut m'aider ?
D'avance merci.
Otools
JJ1972
18th September 2003, 14:32
Dans les conditions, vous usez le champ tfacr200.cuno?
Otools
18th September 2003, 14:41
Oui.
En fait je lis les factures dans le premier select pour ensuite lire (dans le second select) les documents associés à ces factures.
J'update les champs cuno dans les 2 select.
Voici mon script :
select tfacr200.*
from tfacr200 for update
where tfacr200._index8 = {:tccom060.cprj}
and {tfacr200.tdoc, tfacr200.docn, tfacr200.lino} = {"", 0, 0}
selectdo
... tfacr200.cuno = valeur2
db.update(ttfacr200, db.retry)
| Sauvegarde données document
fact.ttyp = tfacr200.ttyp
fact.ninv = tfacr200.ninv
fact.line = tfacr200.line
select tfacr200.*
from tfacr200 for update
where tfacr200._index1 = {:fact.ttyp, :fact.ninv, :fact.line}
and {alias.tdoc, alias.docn, alias.lino} <> {"", 0, 0}
selectdo
...
tfacr200.cuno = valeur1
db.update(ttfacr200, db.retry)
endselect
...
endselect
Merci de vos réponses.
Otools
JJ1972
18th September 2003, 14:59
Tu peux avoir deux problems:
1. Les alias
2. Les updates subordinés ou le position des commit.transaction()
Un possible solution:
- Faire un update avec le document père.
- Faire un autre update avec les documents fils
( Pardon pour mon français, je suis espagnol et il ya quelques ans que je ne parlait pas )
Otools
18th September 2003, 15:10
Joli pays l'Espagne.
Ton français est correct car nous arrivons à nous comprendre !
Sais tu si il est possible de faire des update sur un alias ?
Si oui, comment ?
Le probleme c'est qu'a chaque document pere, il faut absolument faire un update des documents fils. Il m'est impossible de mettre à jour tous les documents pere puis ensuite tous les documents fils.
Merci de ton aide.
Otools
richard
18th September 2003, 15:40
Bonjour,
Dans le cas de très grosses tables, si un petit nombre d'enregistrements est mis à jour, il vaux mieux faire un select global et un select de mise à jour commité.
Cela accélère les temps de traitement.
Richard
Otools
18th September 2003, 15:57
Bonjour,
Mon soucis est que je suis obligé de lire le document pere (le mettre à jour) et grace aux informations du pere, je dois refaire un select pour aller chercher les documents fils que je dois mettre à jour également.
Le fait de faire un select tfacr200 for update et reselect tfacr200 for update, je perd la clé principale du pere de temps en temps.
Merci de vos reponses
Otools
JJ1972
18th September 2003, 18:14
Je voulais dire ça:
- Update documents pères:
select tfacr200.*
from tfacr200 for update
where tfacr200._index8 = {:tccom060.cprj}
and {tfacr200.tdoc, tfacr200.docn, tfacr200.lino} = {"", 0, 0}
selectdo
... tfacr200.cuno = valeur2
db.update(ttfacr200, db.retry)
commit.transaction()
endselect
- Update documents fils.
select tfacr200.*
from tfacr200
where tfacr200._index8 = {:tccom060.cprj}
and {tfacr200.tdoc, tfacr200.docn, tfacr200.lino} = {"", 0, 0}
selectdo
| Sauvegarde données document
fact.ttyp = tfacr200.ttyp
fact.ninv = tfacr200.ninv
fact.line = tfacr200.line
select tfacr200.*
from tfacr200 for update
where tfacr200._index1 = {:fact.ttyp, :fact.ninv, :fact.line}
and {tfacr200.tdoc, tfacr200.docn, tfacr200.lino} <> {"", 0, 0}
selectdo
...
tfacr200.cuno = valeur1
db.update(ttfacr200, db.retry)
commit.transaction()
endselect
...
endselect
Çest plus lent, mais c'est plu sur.
Si vous changez le client dans cette table vous devez changer d'autres tables du module tfgld (tfgld102,tfgld106,...) et probablement recalculer soldes
JJ
Otools
18th September 2003, 18:28
Merci Merci
Je n'avais pas vu cette solution.
Il est certain que cela fonctionnera lentement mais surement.
Allez pour te remercier envoie moi ton adresse postale, je t'enverrai un cadeau.
Encore merci
Otools