När jag vill backa i mitt rcordset Hej Antar att du har öppnat Recordset adOpenForwardOnly. Ändra till adOpenStatic så bör det fungera. I så fall är det inte något jag medvetet gjort. Jag har varken den ena eller den andra koden någonstans. Är det nåt ställe med inställningar man bockar i? conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=//101.0.0.3/databaser/Fastighet.mdb;uid=Admin" Njaej, jag är intresserad av att veta hur din kod ser ut från att du deklarerar ditt recordset (inte connection alltså) tills du öppnar det. Om du t.ex öppnar den med execute. Ex: Detta var mycket interessant. Jag hade ingen aning om att det fanns olika cursertyper och jag har inte i min kod satt tillexempel ForwardOnly. Är det så att om man inte sätter något alls att denna typ blir default? Jag inte tillgång till koden här men först deklarer jag en ADODB.Connection och en ADODB.Recordset Har gjort ett litet exempel som kanske hjälper: Att använda tabell i Word är alldeles säker bättre, bara jag visste hur man får över data från mitt recordset på rätt plats i tabellen. Jag vill ha namn och adress utskrivet på på samma sätt som när man gör etiketter. Det är nog lättare att göra en MailMerge. Men om du vill fortsätta med vb varianten så har jag gjort om exemplet till att använda en tabell: Detta var mycket intressant och är nog vad jag behöver. När jag lagt in koden i mitt program får jag ett felmeddelande "Object required" på radSet Table = Doc.Tables.Add(Doc.Range, 1, 2)MoveLast
rsSokning.MoveLast
får jag meddelandet att "Raduppsättningen stöder inte hämtning bakåt"
Vad kan jag göra åt detta?Sv: MoveLast
Det var "lurigt".
Du kan inte göra MoveLast om det är ett tomt recordset.
Men annars vet i fae.........
mvh
SvenSv: MoveLast
Sv: MoveLast
Sv: MoveLast
Sv: MoveLast
Sv: MoveLast
Set rsTemp = conn.Execute("SELECT * FROM Customers")
Har för mig att ADO har som standard att öppna recordsetet som
Så använder sig ADO av den effektiva recordset typen forwardonly-readonly. Har för mig att dena typ av cursor även kallas firehoose...
Jag rekommendrerar dig att sätta dig i i det olika typerna av cursors som finns.
Liten snabb summering av ADO(Klippt det ur MSDN):
CursorType:
adOpenForwardOnly
(Default) Opens a forward-only–type cursor.
Resurs snålaste varianten av cursor eftersom cursor information för navigering behövs.
adOpenKeyset
Opens a keyset-type cursor.
Håller reda på dina förändringar och de förändringar som är gjorda på poster som existerar i recordsetet.
adOpenDynamic
Opens a dynamic-type cursor.
Kan även se poster som andra användare laggt till. Kräver mest resurser.
adOpenStatic
Opens a static-type cursor.
Hämtar informationen som en polaroid bild ungefär. Ser inga förändringar.
LockType:
adLockReadOnly
(Default) Read-only—you cannot alter the data.
adLockPessimistic
Pessimistic locking, record by record—the provider does what is necessary to ensure successful editing of the records,
usually by locking records at the data source immediately upon editing.
adLockOptimistic
Optimistic locking, record by record—the provider uses optimistic locking, locking records only when you call the Update method.
adLockBatchOptimistic
Optimistic batch updates—required for batch update mode as opposed to immediate update mode.
Om du inte ska updaterar recordsettet utan bara navigera kan du använda följande sats:
rsTemp.Open "SELECT * FROM Customers", conn, adOpenStatic, adLockReadOnly
Skall du även redigera:
rsTemp.Open "SELECT * FROM Customers", conn, adOpenKeyset, adLockOptimistic
Finns ofta många sätt för att slippa navigera genom ett recordset efter som det inte är så effektivt.
Om du ändå väljer att navigera genom ditt recordset. Kan det i vissa fall vara effektivare att hämta hela recordsetet eller åtminstonde hela cursor informationen. Eller helt enkelt använda ett Disconnected recordset. Detta gör du med CursorLocation egenskapen.
rsTemp.CursorLocation = adUseClient
rsTemp.Open "SELECT * FROM Customers", conn, adOpenStatic, adLockReadOnly
För att göra det Disconnected lägger du även till:
Set rsTemp.ActiveConnection = Nothing
Finns mycket att sätta sig in i. Men förhoppningsvis har du fått en lite mer information om ADO.Sv: MoveLast
Sv: MoveLast
I en subrutin öppnar jag Connection och sedan kommer en SQL som exekceras med
Set rs = conn.Execute(SQL)
Därefter
rs.MoveFirst
Jag skriver så ut data till Word som jag deklareat i subrutinen
Dim D As Word.Document
Set W = CreateObject("Word.Application")
Set D = W.Documents.Add
While Not rs.EOF
If Not IsNull(rs.Fields("NAMN").Value) Then
W.Selection.TypeText rs.Fields("NAMN").Value
End If
W.Selection.TypeText (" ")
rs.MoveNext
If Not IsNull(rs.Fields("NAMN").Value) Then
W.Selection.TypeText rs.Fields("NAMN").Value
End If
W.Selection.TypeText (vbCrLf)
rs.MoveLast
If Not IsNull(rs.Fields("ADRESS").Value) Then
W.Selection.TypeText rs.Fields("ADRESS").Value
End If
W.Selection.TypeText (" ")
rs.MoveNext
If Not IsNull(rs.Fields("ADRESS").Value) Then
W.Selection.TypeText rs.Fields("ADRESS").Value
End If
rs.MoveNext
Wend
Jag önskar (med min kanske dåliga lösning) skriva första postens NAMN, ett mellanrum, andra postens NAMN, ny rad, första postens ADRESS, mellanslag, anrdra postens ADRESS, ny rad, tredje postens NAMN osv...
Men det funkar alltså inte med MoveLastSv: MoveLast
Form: Form1
* Lägg till en CommandButton
--------------------------------------------------------
Option Explicit
Private Sub Command1_Click()
Dim W As Word.Application
Dim Doc As Word.Document
Dim sTemp As String
Dim BreakRow As Boolean
Dim rs As ADODB.Recordset
Dim fldNAMN As ADODB.Field
Dim fldADRESS As ADODB.Field
Set W = CreateObject("Word.Application")
Set Doc = W.Documents.Add
Set rs = GetRecordset()
Set fldNAMN = rs("NAMN")
Set fldADRESS = rs("ADRESS")
Do Until rs.EOF
If BreakRow Then
Doc.Range.InsertAfter " " & fldNAMN.Value & vbCrLf & _
sTemp & " " & fldADRESS.Value & vbCrLf
sTemp = ""
Else
Doc.Range.InsertAfter fldNAMN.Value
sTemp = "" & fldADRESS.Value
End If
BreakRow = Not BreakRow
rs.MoveNext
Loop
If Len(sTemp) Then
Doc.Range.InsertAfter vbCrLf & _
sTemp & vbCrLf
End If
W.Visible = True
End Sub
Private Function GetRecordset() As ADODB.Recordset
Set GetRecordset = New ADODB.Recordset
With GetRecordset
With .Fields
.Append "NAMN", adVarChar, 20
.Append "ADRESS", adVarChar, 20
End With
.Open
.AddNew Array("NAMN", "ADRESS"), Array("Adam", "Norrlandsvägen 5")
.AddNew Array("NAMN", "ADRESS"), Array("Bengt", "Storavägen 15")
.AddNew Array("NAMN", "ADRESS"), Array("Charlie", "Hamngatan 13")
.MoveFirst
End With
End Function
--------------------------------------------------------
Vore det inte lättare att använda sig av en tabell i word dokumentet?Sv: MoveLast
Sv: MoveLast
Private Sub Command2_Click()
Dim W As Word.Application
Dim Doc As Word.Document
Dim Table As Word.Table
Dim Row As Long
Dim Column As Long
Const Columns = 2
Dim rs As ADODB.Recordset
Dim fldNAMN As ADODB.Field
Dim fldADRESS As ADODB.Field
Set W = CreateObject("Word.Application")
Set Doc = W.Documents.Add
Set rs = GetRecordset()
If rs.BOF And rs.EOF Then
MsgBox "Data saknas"
Else
Set fldNAMN = rs("NAMN")
Set fldADRESS = rs("ADRESS")
Set Table = Doc.Tables.Add(Doc.Range, 1, 2)
Row = 1
Do Until rs.EOF
Column = Column + 1
If Column > Columns Then
Column = 1
Row = Row + 1
Table.Rows.Add
End If
Table.Cell(Row, Column).Range.InsertAfter fldNAMN.Value & vbCrLf & fldADRESS
rs.MoveNext
Loop
W.Visible = True
End If
End SubSv: MoveLast
Kan man styra var på pappret den högra kolumnen skal börja?