Tror felet kan bero på att du har flera poster med samma Dagbok_ID. Vad är det för typ av fält? Du bör använda dig av en räknare. Vilket du sedan kan använda för att identifiera posten när du redigera eller tarbort poster. Hej igenTabel till Listview igen
I min databas fil har jag 4st tabeller men alla heter olika, likaså alla "fields" men får följande fel meddelande:
Key is not unique in collection.
?????
En fråga, om man inte vet sökvägen utan vill bläddra efter databas filen hur skulle man kunna fixa det?
Min kod:
Option Explicit
Private Const DBFileName = "C:\Karlssons Data och Webdesign\Dagbok.mdb"
Private Sub InitializeListView()
With ListView1
.View = lvwReport
.ColumnHeaders.Add , , "Datum"
.ColumnHeaders.Add , , "Kund"
.ColumnHeaders.Add , , "Arbete"
.ColumnHeaders.Add , , "Start"
.ColumnHeaders.Add , , "Slut"
.ColumnHeaders.Add , , "Timmar"
.ColumnHeaders.Add , , "Hardware"
.ColumnHeaders.Add , , "ProjNummer"
.ColumnHeaders.Add , , "Fakt"
.ColumnHeaders.Add , , "Other"
End With
End Sub
Private Sub Form_Load()
Dim conn As ADODB.Connection
Dim rsTemp As ADODB.Recordset
On Error GoTo Form_Load_Err
Set conn = New ADODB.Connection
Set rsTemp = New ADODB.Recordset
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Persist Security Info=False;" & _
"Data Source=" & DBFileName
rsTemp.Open "TBL_Dagbok", conn, adOpenForwardOnly, adLockReadOnly, adCmdTableDirect
InitializeListView
LoadListView ListView1, rsTemp, "C", rsTemp("Dagbok_ID"), rsTemp("Dagbok_ID"), rsTemp("Dagb_Datum"), rsTemp("Dagb_Kund"), rsTemp("Dagb_Arbete"), rsTemp("Start"), rsTemp("Slut"), rsTemp("Timmar"), rsTemp("Hardware"), rsTemp("ProjNummer"), rsTemp("Fakt"), rsTemp("Other")
rsTemp.Close
conn.Close
Form_Load_Exit:
Set rsTemp = Nothing
Set conn = Nothing
Exit Sub
Form_Load_Err:
MsgBox Err.Description, vbCritical
Resume Form_Load_Exit
End Sub
Private Sub LoadListView(ListView As MSComctlLib.ListView, Recordset As ADODB.Recordset, KeyPrefix As String, KeyField As ADODB.Field, TextField As ADODB.Field, ParamArray Fields() As Variant)
Dim I As Long
Dim Count As Long
Dim fldField As ADODB.Field
Dim Item As MSComctlLib.ListItem
Dim ListItems As MSComctlLib.ListItems
Count = UBound(Fields)
Set ListItems = ListView.ListItems
Do Until Recordset.EOF
Set Item = ListItems.Add(, KeyPrefix & KeyField, "" & TextField)
For I = 1 To Count
Set fldField = Fields(I)
Item.SubItems(I) = "" & fldField
Next
Recordset.MoveNext
Loop
End Sub
Private Sub Form_Resize()
ListView1.Move ScaleLeft, ScaleTop, ScaleWidth, ScaleHeight
End Sub
Jätte bussigt om du/nån kan hjälpa mej
/TomasSv: Tabel till Listview igen
InitializeListView var bara en funktion för att skapa kolumnerna. Vilket du egentligen kan gär direkt i kontrollen i vb och spara.
Jag använde mig av en konstant för sökvägen men för dig är det nog bättre att använda dig av registret:
Istället för
Private Const DBFileName = "C:\Karlssons Data och Webdesign\Dagbok.mdb"
kan du kapsla anrop till GetSetting och SaveSetting i PRoperty Procedure.
Public Property Get DBFileName() As String
DBFileName = GetSetting(App.Title, "Settings", "DBFileName")
End Property
Public Property Let DBFileName(vData As String)
SaveSetting App.Title, "Settings", "DBFileName", vData
End Property
Sedan bör du kontrollera om databasen finns.
Public Function FileExists(FileName As String) As Boolean
Dim lReturn As Long
On Error Resume Next
lReturn = GetAttr(FileName)
FileExists = (Err.Number = 0)
End Function
Private Sub Form_Load()
Dim conn As adodb.Connection
Dim rsTemp As adodb.Recordset
Dim FileName As String
On Error GoTo Form_Load_Err
FileName = DBFileName
Do Until FileExists(FileName)
FileName = InputBox("Var vänlig ange en databas!", "Databas", FileName)
Loop
Set conn = New adodb.Connection
Set rsTemp = New adodb.Recordset
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Persist Security Info=False;" & _
"Data Source=" & DBFileName
DBFileName = DBFileName
rsTemp.Open "TBL_Dagbok", conn, adOpenForwardOnly, adLockReadOnly, adCmdTableDirect
LoadListView ListView1, rsTemp, "C", rsTemp("Dagbok_ID"), rsTemp("Dagbok_ID"), rsTemp("Dagb_Datum"), rsTemp("Dagb_Kund"), rsTemp("Dagb_Arbete"), rsTemp("Start"), rsTemp("Slut"), rsTemp("Timmar"), rsTemp("Hardware"), rsTemp("ProjNummer"), rsTemp("Fakt"), rsTemp("Other")
rsTemp.Close
conn.Close
Form_Load_Exit:
Set rsTemp = Nothing
Set conn = Nothing
Exit Sub
Form_Load_Err:
MsgBox Err.Description, vbCritical
Resume Form_Load_Exit
End SubSv: Tabel till Listview igen
Jag testade att använda Common Dialog kontrollen för att kunna "bläddra" efter filen men får det inte att funka.
Hur gör man?
/Tomas