oskarj.wordpress.com blog

lipiec 21, 2007

Access i makra

Kategoria wpisu: Access, Bazy danych, Kod, VBA — oskarj @ 7:43 pm

Kumpel, pracujący i zdobywający doświadczenie w USA, zwrócił się do mnie z prośbą o pomoc w sprawie tabelki w Accessie. Problem polegał na tym, że istniała kolumna, która zawierała dane w postaci tekstowej – nazwy kategorii oddzielone przecinkami. Należało rozdzielić te nazwy na oddzielne rekordy, zachowując ten sam model encji.

 

Access - before

 

Czyli jeżeli jedna pozycja zawierała w kolumnie ‘Category’ : CN, CoI, RU

To powinny być w miejsce tego rekordu 3 rekordy, a w kategorii wpisane : CN , poniżej CoI, a trzecie RU

 

Access - after

Problem mógłby rozwiązać jakiś prosty skrypcik. Znalazłem na forach dyskusje na temat obiektów klasy Recordset w VBA, więc napisałem procedurę:

 

Option Compare Database

Sub reproduce()

Dim db As DAO.Database, rs As DAO.Recordset, dest As DAO.Recordset, table As String

Set db = CurrentDb

table = InputBox(”Please insert table name, e.g. like: ” & vbNewLine & “[Table no 2]“)

Set rs = db.OpenRecordset(”SELECT * FROM ” & table)

Set dest = db.OpenRecordset(”SELECT * FROM ” & table)

While Not rs.EOF

Dim txt As String

Dim x As Variant

Dim i As Long

txt = rs.Fields(6)

x = Split(txt, “,”)

For i = 0 To UBound(x)

dest.AddNew

For j = 0 To rs.Fields.Count - 1

dest.Fields(j) = rs.Fields(j)

Next j

dest.Fields(6) = Trim(x(i))

dest.Update

Next i

rs.Delete

rs.MoveNext

Wend

rs.Close

Set rs = Nothing

End Sub

 

Druga sprawa – nazwa choroby bez myślników, a z przecinkami.

Jeżeli w rekordzie jest wpisane w kolumnie ‘choroba’:

Arthritis-Rheumatoid Arthritis

To powinno to wyglądać tak:

Arthritis, Rheumatoid Arthritis

 

Problem rozwiązuje następujący kodzik:

 

Option Compare Database

Sub reproduceDisease()

Dim db As DAO.Database, rs As DAO.Recordset, table As String, line As String

Set db = CurrentDb

table = InputBox(”Please insert table name, e.g. like: ” & vbNewLine &

“[Table No 2]“)

Set rs = db.OpenRecordset(”SELECT * FROM ” & table)

While Not rs.EOF

Dim txt As String

Dim x As Variant

Dim i As Long

txt = rs.Fields(7)

x = Split(txt, “-”)

line = “”

For i = 0 To UBound(x) - 1

line = line & x(i) & “, “

Next i

rs.Edit

rs(”Disease/disorder”).Value = line & x(UBound(x))

rs.Update

rs.MoveNext

Wend

rs.Close

Set rs = Nothing

End Sub

 

Miłe zaskoczenie - Visual Basic for Access zawiera funkcję Split() pozwalajaca na rozdzielenie Stringów, tak jak java za pomocą klasy StringTokenizer. I nie tylko spacje, ale również dowolne znaki.

Brak komentarzy »

Do tego wpisu nie dodano żadnych komentarzy.

Wątek RSS dla komentarzy do tego wpisu. Adres TrackBack

Dodaj komentarz

Musisz być Zalogowany aby dodać komentarz.

Blog at WordPress.com.