Med hjälp av nedanstående rutin “ReadSoekRegister” läser ett program data ur en Access2000 .mdb. Undrar om mitt problem är för lätt ellerför svårt eftersom ingen svarar. Man brukar sätta # runt datum, prova med detta istället Personligen tycker jag koden är för kladdig. Har variabler som inte används, dålig indentering. Hej Maria och tack för ditt svar! Hej igen Hej och tack igen! Vi gör väl ett nytt försök.... Tack igen det värmer att du försöker! Hej igen! Jag undrar om du gör någon annan uppdatering eller skrivning till databasen som du vet fungerar. Om du inte gör det kanske det är så att mappen databasen ligger i är skrivskyddad?? Det har jag råkat ut för förut. Kolla det! Hej. Hej igen Maria och tack fördina goda råd! Hej JAN och tack för ditt svar! Ett stort misstag du gör i din kod är att använda On Error Resume next. Hej Andreas!Access Skrivrutin
Läsningen fungerar helt ok.
Min uppgift är att i ett visst läge skriva in ett nytt dagnamn till fält Dagnamn för rekord med Nyckeln = xy.
Har försökt på olika sätt komplettera .Open satsen för att få med parameter adLockOptimistic
så att det skall gå att skriva i rekordet.
Mha:
rsSoekar!DagNamn = blabla
rsSoekar.Update
Tyvärr har inget av mina försök varit lyckosamt.
Public Sub ReadSoekRegister()
Dim Conn As New ADODB.Connection
Dim SQL As String ' Dimensionering av söksträng
Dim SoekConn As New ADODB.Connection
Dim SoekSQL As String ' Dimensionering av söksträng
Const SoekRegister As String = "C:\SoekSoek\SoekRegister.mdb;uid=Admin;PWD=xxxx"
Dim rsSoekar As New ADODB.Recordset
On Error GoTo ErrHandler_ReadSoekRegister
SoekConn.Open "driver={Microsoft Access Driver (*.mdb)};dbq= " & SoekRegister
On Error Resume Next
SoekConn.Execute SQL
'**********************************************
SoekSQL = "Select * FROM Dagar WHERE Nyckel = xy"
Set rsSoekar = SoekConn.Execute(SoekSQL)
dMark = rsSoekar.Fields("Mark")
sDagnamn = rsSoekar.Fields("DagNamn")
ReadSoekRegister_Out:
SoekConn.Close
Exit Sub
ErrHandler_ReadSoekRegister:
' SoekConn.Close
MsgBox Err.Source & "-->" & Err.Description, , "Error"
Title = "Felmeddelande !!ReadSoekRegister"
Response = MsgBox(Err.Description, , Title)
GoTo ReadSoekRegister_Out
End Sub
Vore tacksam om någon kunde visa hur skrivrutinen skall se ut.
Mvh / RolandSv: Access Skrivrutin
Tycker att eftersom bifogad läsrutin fungerar så borde det gå att få till en skrivrutin.Sv:Access Skrivrutin
SoekSQL = "Select * FROM Dagar WHERE Nyckel =#" & xy & "#"
Värt ett försök!
Hoppas det funkar
/MariaSv:Access Skrivrutin
Det verkar mer vara en test funktion. Om du först städar upp den kan jag titta på den.Sv: Access Skrivrutin
Problemet ligger inte i Select satsen eftersom den hittar sökt rekord.
Använder för test t.ex en direkt nyckel (t.ex 1).
Problemet ligger någonstans i att det öppnade rekordet inte är tillgängligt för editering av innehållet i ett fält.
När jag försöker:
Dim test, sDagNamn as String
sDagNamn = rsSoekar.Fields("DagNamn")
så får jag in innehållet från rsSoekar.Fields("DagNamn") till fält sDagNamn
men om jag förtsätter:
test = "HEJ"
rsSoekar!DagNamn = test
så förändras inte innehållet i rsSoekar!DagNamn till "HEJ" utan förblir det som innehållit varit tidigare.
mvh/RolandSv:Access Skrivrutin
har du provat skriva så här:
test = "HEJ"
rsSoekar("DagNamn").Value = test
/MariaSv: Access Skrivrutin
Testade ditt förslag, men när jag stegar igenom instruktionerna så har jag samma egendomligheter som förut rsSoekar "sväljer" inte nya värden.
Vet snart inte vad jag skall hitta på.
Verkar som om problemet kanske beror på att rsSoekar inte ligger i samma .mdb som currentDb.
mvh/RolandSv:Access Skrivrutin
Vad händer om du öppnar recordsettet på följande sätt
rsSoekar .Open SoekSQL, SoekConn, , adLockOptimistic
Skam den som ger sig......
/MariaSv: Access Skrivrutin
Resultatet blev det samma som tidigare.
Läsningen gick bra. Innehållet i rekordet gick att plocka fram
sDagNamn = rsSoekar.Fields("DagNamn") ' helt ok
men
test = "HEJ"
rsSoekar!DagNamn = test
eller
rsSoekar("DagNamn").Value = test
förändrar inte innehållet i rsSoekar DagNamn
Ps: Har försökt varianten med adLockOptimistic tidigare. Trodde från början att det var där skon klämde och att rekordet inte annars är öppet för editering och uppdatering, men det saknas tydligen något fortfarande.
/RolandSv: Access Skrivrutin
Så här ser mitt senaste ej framgångsrika förslag ut.
SoekSQL = "Select * FROM Dagar WHERE Nyckel = 1"
rsSoekar.Open SoekSQL, "driver={Microsoft Access Driver (*.mdb)};dbq= " _
& SoekRegister, , adLockOptimistic
test = rsSoekar.Fields("DagNamn")
' Så här långt fungerar allt ok och innehållet i cell test får värdet i SoekRegister fält DagNamn
'--------------------------------
test2 = "HEJ"
rsSoekar!DagNamn = test2
' innehållet i rsSoekar!DagNamn har inte förändrats till HEJ
'-----------------------------------------------------------------
rsSoekar("DagNamn").Value = test2
' innehållet i rsSoekar!DagNamn har inte förändrats till HEJ
'----------------------------------------------------------------
rsSoekar.Update
' rsSoekar.Update gör ingen förändring
Hoppas någon ännu har nåt förslag att prova
mvh/RolandSv:Access Skrivrutin
Ett annat försök är ju att använda UPDATE
Dim strSql
Dim test
test = "hej"
strSql = "UPDATE Dagar Set Dagnamn = '" & test & "' WHERE Nyckel = 1"
SoekConn.Execute strSql
/MariaSv:Access Skrivrutin
Har du försökt att ändra cursor-typ vid öppnandet av recordsetet.
adOpenDynamic
Nu skriver du:
<code>
rsSoekar.Open SoekSQL, "driver={Microsoft Access Driver (*.mdb)};dbq= " _
& SoekRegister, , adLockOptimistic
</code>
<code>
rsSoekar.Open SoekSQL, "driver={Microsoft Access Driver (*.mdb)};dbq= " _
& SoekRegister, adOpenDynamic, adLockOptimistic
</code>
eller eventuellt
<code>
rsSoekar.Open SoekSQL, "driver={Microsoft Access Driver (*.mdb)};dbq= " _
& SoekRegister, adOpenKeyset, adLockOptimistic
</code>
Som default öppnas rs med cursortyp adOpenForwardOnly.Sv: Access Skrivrutin
Skrivskyddet kollade jag för ett bra tag sedan och konstaterade att feletinte låg där, men så kunde ju ha varit fallet.
strSql = "UPDATE Dagar Set Dagnamn = '" & test & "' WHERE Nyckel = 1"
SoekConn.Execute strSql
Ovanstående UPDATE fungerar perfekt så du har LÖST mitt problem STORT TACK!!!!
Hade tänkt kringgå problemet genom att göra en ny tabell i current DB istället för att skriva in Dagnamnet i det register där det egentligen hör hemma. Nu behöver jag inte kringgå problemet.
Kram/ RolandSv: Access Skrivrutin
Tyvärr hjälpte inte någon av alternativen, men det var definitivt värt och prova.
Skulle förstås vara intressant att fortsätta söka orsak till problemet, men eftersom Maria:s UPDATE variant fungerar så fortsätter jag mot nya problem.
Tack för att du försökte!
mvh/RolandSv:Access Skrivrutin
Som jag ser det har Jan rätt. Du saknar cursor typ. Default är forward only. Vilket för Access drivrutin inte är uppdaterbar.
Dessutom tycker jag du borde använda JET providern vilket är en OLEDB drivrutinen istället för Access ODBC.
Hårdkodade sökvägar hör inte hemma i en applikation.
Osv...
Något sånt här skulle det se ut om jag skulle skriva om det:
Option Explicit
Const RegSectionSettings As String = "Settings"
Const RegKeyDBFileName As String = "Database file name"
Public Property Let DBFileName(Value As String)
SaveSetting App.Title, RegSectionSettings, RegKeyDBFileName, Value
End Property
Public Property Get DBFileName() As String
Dim Default As String
Default = App.Path & "\SoekRegister.mdb"
DBFileName = GetSetting(App.Title, RegSectionSettings, RegKeyDBFileName, Default)
End Property
Public Function WriteSoekRegister(Nyckel As Long, NewName As String) As String
Dim rs As ADODB.Recordset
Dim Conn As ADODB.Connection
Dim SQL As String ' Dimensionering av söksträng
On Error GoTo ErrHandler_ReadSoekRegister
SQL = "SELECT *" + vbCrLf + _
"FROM Dagar" + vbCrLf + _
"WHERE Nyckel = " & Nyckel
Set Conn = New ADODB.Connection
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" + vbCrLf + _
"Persist Security Info=False;" + vbCrLf + _
"Data Source=" & DBFileName()
Set rs = New ADODB.Recordset
rs.Open SQL, Conn, adOpenKeyset, adLockOptimistic
If rs.EOF Then
MsgBox "Det finns ingen post med nyckel: " & Nyckel, vbExclamation
Else
WriteSoekRegister = rs("DagNamn")
rs("DagNamn") = NewName
rs.Update
End If
Conn.Close
ReadSoekRegister_Out:
Exit Function
ErrHandler_ReadSoekRegister:
MsgBox Err.Source & "-->" & Err.Description, , "Felmeddelande !!ReadSoekRegister"
GoTo ReadSoekRegister_Out
End Function
Private Sub Command1_Click()
WriteSoekRegister 1, Text1.Text
End Sub
Sv: Access Skrivrutin
Tack för ett bra exempel som jag kommer att använda mig utav!
mvh/ Roland