/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
Opdatering af tabel, man looper over
Fra : Leif Neland


Dato : 15-05-08 14:40

asp/vbscript, mssql

Vil der ske noget uønsket, hvis man opdaterer en tabel, mens man looper
over den?

sql = "select ordrelinier.id as olid,lagerantal,bestilt,tekst " &_
"from ordrelinier left join lager on " &_
"lager.varenr=ordrelinier.varenr " &_
"where ordrenr="&ordrenr&" where lagerantal<bestilt"

set rs=conn.execute(sql)

do while not rs.eof
ordrelin=rs("ordrelin)
sql="insert into ordrelinier (ordrenr,varenr,tekst,antal) values " &_
"("&ordrenr&","&rs("varenr")&","'"&rs("tekst")&" (REST)'," &_
(rs("bestilt")-rs("lagerantal"))&")"
conn.execute(sql)

sql = "update ordrelinier set bestilt=lagerantal where id=" &_
rs("olid")
conn.execute(sql)
rs.movenext
loop

Altså, jeg looper over de records på denne ordre, hvor der er bestilt
mere end der er på lager, og retter bestilt til antal, og tilføjer en
record med resten af bestillingen til restordre.

Vil de ændringer kunne påvirke de records, den øverste select valgte ud?
Eller er de allerede "hentet frem"?

(Dette er et eksempel, jeg lige har skrevet her i newsreaderen, for at
eksemplificere problemstillingen. Det er ikke nødvendigvis således, jeg
vil implementere det )

Leif




 
 
Jens Gyldenkærne Cla~ (16-05-2008)
Kommentar
Fra : Jens Gyldenkærne Cla~


Dato : 16-05-08 01:08

Leif Neland skrev:

> Vil der ske noget uønsket, hvis man opdaterer en tabel, mens
> man looper over den?

Det kan man vist slå op - men i stedet for at bekymre dig om det,
skulle du hellere undgå at opdatere i en løkke når det ikke er
nødvendigt. Du får mangedoblet din performance ved at køre det som
en transaktion på sqlserveren:

BEGIN TRAN
-- Indæst nye ordrelinjer
insert into ordrelinier (ordrenr,varenr,tekst,antal)
select ordrelinier.id,lager.varenr,tekst + '(REST)', bestilt-
lagerantal
from ordrelinier left join lager on
lager.varenr=ordrelinier.varenr
where ordrenr=300 AND
lagerantal<bestilt

-- Opdater de gamle poster
UPDATE ordrelinier
SET bestilt=lagerantal
where ordrenr=300 AND
lagerantal<bestilt

COMMIT TRAN


Hvis du vil have lidt mere kontrol over de poster du har fat i, kan
du kigge på en Table-variabel.

--
Jens Gyldenkærne Clausen
»Diplomatiet består netop i, at de gamle kommatister kan få lov til
at tro, at de har vundet. Men i virkeligheden har de tabt.«
Ole Togeby i Information

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste