Avatar billede HenrikNielsen06 Nybegynder
24. maj 2012 - 15:05 Der er 12 kommentarer og
1 løsning

Hvordan får jeg mit recordset læst ind i et array?

Jeg har en sql til en access db som retunere mig et recordset rst, men hvordan får jeg læst mit recordset ind i et array? 

----------------------------------------
Dim con As New ADODB.Connection
Dim rst As New ADODB.Recordset
With rst
      Src = "SELECT [NIIDSNo] & ' ' & [name] AS NiidsName......
     
      rst.Open Src, con, adOpenForwardOnly, adLockReadOnly
End With

iTal = 0
Do While Not rst.EOF
  iTal = iTal + 1
  xArray(iTal) = ??????????
  rst.MoveNext
Loop
Avatar billede anlu Nybegynder
24. maj 2012 - 15:14 #1
Det letteste er vel at bruge
rst.GetRows()
Avatar billede Panen Nybegynder
24. maj 2012 - 15:14 #2
Jeg er ikke en haj til VBA, men tror det er noget i retning af dette.

iTal = 0
Dim xArray(1 to rst.RecordCount) as Integer
Do While Not rst.EOF
  iTal = iTal + 1
  xArray(iTal) = ??????????
  rst.MoveNext
Loop
Avatar billede claes57 Ekspert
24. maj 2012 - 15:19 #3
drop dit
--------
iTal = 0
Do While Not rst.EOF
  iTal = iTal + 1
  xArray(iTal) = ??????????
  rst.MoveNext
Loop
--------
brug dette:
--------
if rst.eof then
  rst.close
  response.write "Intet fundet."
else
  arr=rst.getrows()
  rst.close
  antal=ubound(arr,2)
' behandl de enkelte linjer i et loop
  for i = 0 to antal
    response.write arr(0,i)    'det første felt i sql-sætningen
    response.write "<br>"
    response.write arr(1,i)    'det andet felt i sql-sætningen
    response.write "<hr>"
  next
end if
Avatar billede HenrikNielsen06 Nybegynder
24. maj 2012 - 15:48 #4
hvad er response.write?
Avatar billede claes57 Ekspert
24. maj 2012 - 16:44 #5
det er, at teksten efterfølgende bliver sendt til hjemmesiden.
Loopet vil udskrive felt et, linjeskift, felt2, en streg og så videre til næste port.
Avatar billede HenrikNielsen06 Nybegynder
24. maj 2012 - 18:00 #6
Hm... det løser ikke het min udfordring idet jeg skal have arr (går ud fra at dette er et Array)ind i en "ComboBox1.List"

P.t. får jeg at antal er 146 men ved ikke helt hvordan jeg skal loop igennem arr for at få data ud?
Avatar billede terry Ekspert
24. maj 2012 - 19:26 #7
if you want the data in a combo box then all you need to do is put the SQL in the RowSource property of the combo

http://office.microsoft.com/en-us/access-help/create-a-list-of-choices-by-using-a-list-box-or-combo-box-HA010113052.aspx
Avatar billede claes57 Ekspert
24. maj 2012 - 20:58 #8
mit var til udtræk til en hjemmeside - men den andet kan da tilrettes. Hvilket felt (nummer i rækkefølgen i udtrækket) skal du have i combo.
før loop skal du tømme combo for evt gamle data
ComboBox1.Clear
og i loop er det så
  for i = 0 to antal
    ComboBox1.Add arr(0,i)    'det første felt i sql-sætningen
  next
Avatar billede claes57 Ekspert
24. maj 2012 - 20:59 #9
obs - tidligere i koden er
response.write "Intet fundet."
det skal bare være
  ComboBox1.Add "Fejl i dataudtræk"
i stedet.
Avatar billede terry Ekspert
24. maj 2012 - 21:40 #10
arent we in Microsoft Access category here??
Avatar billede Slettet bruger
24. maj 2012 - 23:08 #11
Blander mig lige med min løsningsmåde i tillæg til de udmærkede svar.

For at isolere sig fra, i forskellige kodestumper, VBA's lavnivea indeks gymnastik, er det bekvemt med en 'put i array' subrutine:

Sub add2list(V, i)
    On Error Resume Next
    ReDim Preserve V(UBound(V) + 1)
    If err.Number = 13 Then ReDim V(0)
    If IsObject(i) Then Set V(UBound(V)) = i Else V(UBound(V)) = i
End Sub

Det anvendes således, idet jeg kun fokusere på array tildelingen.

dim arr
with rsi(<sql>): while not .eof
  add2list arr,!fldname
wend: end with


Man kan putte hvad som helst i arrayet - også andre arrays og objekter.

Med forkærlighed for generelle løsninger, ud over hvad spørgsmålet går på:
Skulle man have den ambition at det resulterende array skal være 'flat', at tilsætning af arrays der potentielt indeholder arrays og så videre i recursiv forstand, skal bliver til et array der ikke indeholder arrays, løser følgende subrutine det:

'add simple types to list
Sub addS2list(V, i)
    Dim ai
    On Error Resume Next
    If IsArray(i) Then
        For Each ai In i
            addS2list V, ai: Next
    Else
        ReDim Preserve V(UBound(V) + 1)
        If err.Number = 13 Then ReDim V(0)
        If IsObject(i) Then Set V(UBound(V)) = i Else V(UBound(V)) = i
    End If
End Sub
Avatar billede HenrikNielsen06 Nybegynder
24. maj 2012 - 23:09 #12
Hej Claes57
Så er den i skabet...... takker. Hvordan er det nu med point hvordan får jeg givet dig dem? mangler en "guk" box med "svar" i dit indlæg

---
If rst.EOF Then
  rst.Close
  Choice_UserForm.ComboBox2.AddItem "Error in connection"
Else
  recArray = rst.GetRows()
' Behandl de enkelte linjer i et loop
  For i = 0 To UBound(recArray, 2)
'  Det første felt i sql-sætningen
    Choice_UserForm.ComboBox2.AddItem recArray(0, i) 
  Next
End If
--------
Avatar billede claes57 Ekspert
25. maj 2012 - 07:12 #13
et svar kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester