Szóval. Adatmódosítás Access-ben, DAO objektumokon keresztül.
Tegyük fel, hogy van a 'D:\db1.mdb' adatbázisban az 'állatok' nevű, alábbi táblád. (Az első sorban mezőnevek, alatta a rekordok vannak.)
ID - Név---------- B - C - D
1 -- 'maci' ------- 2 - 0 - 1
2 -- 'paci' ------- 2 - 0 - 0
3 -- 'nyuszika' - 1 - 2 - 4
4 -- 'róka' -------7 - 4 - 5
Tegyük fel, hogy a nyuszika C értékét akarod növelni 2-vel, a D értékét pedig nullára állítani. Rekordmódosításhoz, jól gondoltad, először meg kell keresni azt a bizonyos rekordot, amit módosítani akarsz.
Egyik lehetőség a Seek metódus és az index mezők felhasználása. Legyenek az [ID] és a [Név] mezők megadva indexként. Ekkor:
Sub ModifyRecord()
Dim DB As DAO.Database, Rst As DAO.Recordset
Set DB = OpenDatabase("D:\db1.mdb")
Set Rst = DB.OpenRecordset("állatok")
With Rst
.Index = "Név"
.Seek "=", "nyuszika"
.Edit
![C] = ![C] + 2
![D] = 0
.Update
.Close
End With
DB.Close
End Sub
Másik lehetőség, hogy már eleve szűrt rekordhalmazt nyitsz meg, SQL lekérdezés segítségével.
Sub ModifyRecord()
Dim DB As DAO.Database, Rst As DAO.Recordset, mySQL as String
Set DB = OpenDatabase("D:\db1.mdb")
mySQL = "SELECT * FROM [állatok] WHERE [Név] = 'nyuszika'"
Set Rst = DB.OpenRecordset(mySQL)
With Rst
.Edit
![C] = ![C] + 2
![D] = 0
.Update
.Close
End With
DB.Close
End Sub
A Seek metódus egyetlen rekordot ad vissza, az SQL lekérdezés a szűrési feltételektől függően akár többet is. Ha több rekordot akarsz módosítani, akkor az utóbbit javaslom. Pl ha az a feladat, hogy minden olyan rekordban, ahol C=0, legyen C = B + D, akkor:
Sub ModifyRecord()
Dim DB As DAO.Database, Rst As DAO.Recordset, mySQL as String
Set DB = OpenDatabase("D:\db1.mdb")
mySQL = "SELECT * FROM [állatok] WHERE [C] = 0"
Set Rst = DB.OpenRecordset(mySQL)
While Not Rst.EOF
With Rst
.Edit
![C] = !
+ ![D]
.Update
.MoveNext
End With
Wend
Rst.Close
DB.Close
End Sub
Itt tehát végig kell lépkedni az összes visszaadott rekordon, erre való a MoveNext. És ezt addig, amíg EOF nem igaz, ami akkor válik igazzá, ha nincs több rekord. Ha az SQL kiválasztási feltételeknek egyetlen rekord sem felel meg, akkor EOF alapból igaz, tehát a ciklus nem fut le.
Ugyanezt egyetlen sima SQL UPDATE utasítással is el lehet végezni:
Sub ModifyRecord()
Dim DB As DAO.Database, mySQL as String
Set DB = OpenDatabase("D:\db1.mdb")
mySQL = "UPDATE [állatok] SET [C] = + [D] WHERE [C] = 0"
DB.Execute mySQL
End Sub
Az SQL Update akkor jó, ha az új érték, amit be akarsz írni, konstansok és sajátrekord mezőértékek kombinációjaként megadható. A fenti példánál a [C] mező új értékét az ugyanabban a rekordban lévő és [D] összegeként állítjuk elő, tehát az SQL UPDATE használható.
De ha a [C] mező új értéke bonyolult módon áll elő, pl. egy bizonyos excel munkalap -edik sorában és [D]-edik oszlopában lévő értéket olvassuk ki, akkor az SQL UPDATE nem jó, és a DAO.Recordset a nyerő.
A tábla- és mezőneveket nem kell feltétlenül szögletes zárójelbe tenni, de melegen ajánlott. Egyrészt rögtön látszik belőle, hogy az ott a kódban (tábla-, vagy) mezőnév. Másrészt, ha a név szóközt, kötőjelet, ékezetes karaktert, stb. tartalmaz, akkor a szögletes zárójelek elhagyása hibás működéshez, vagy nem működéshez vezethet.