Access-o-Mania

Datenbanken (Deutsch/German) => MS SQL-Server => Thema gestartet von: datekk am Februar 05, 2019, 18:35:40

Titel: ADODB Recordset bearbeitungsfähig machen
Beitrag von: datekk am Februar 05, 2019, 18:35:40
Hallo,

ich hole mir vom SQL Server via ADODB ein Recordset, um dieses an ein Formular zu übergeben (set me.recordset = rcs).

Leider sind nach meinem bisherigen Kenntnisstand ADO Recordsets nicht updatefähig / bearbeitungsfähig, wenn die Grundlage dieses Recordsets eine Abfrage, basierend auf mehr als einer Tabelle ist.

Dies ist aber ein Problem. Ich möchte die Daten gern bearbeiten.

So habe ich eine Tabelle tbl1 mit den Spalten ID(int), KundenIdRef(int), Auswahl(bit/bool).
In einem Formular möchte ich nun den Kundennamen anzeigen und die Möglichkeit haben, ein Häkchen zu setzen.

Also sieht mein Recordset so aus:

dim rcs as adodb.recordset
set rcs = new adodb.recordset
rcs.source "SELECT k.name, s.auswahl FROM Kundenliste as k INNER JOIN tbl1 as s ON k.IdKunde = s.KundenIdRef"
rcs.ActiveConnection = con
rcs.CursorType = adOpenDynamic
rcs.LockType = adLockOptimistic
rcs.Open

Dann Übergabe an Formular mit set me.recordset = rcs

Problem wie oben geschildert: ich kann keine Häkchen setzen, da der Recordset nicht aktualisierbar ist.

Nun, wie macht Ihr das Ganze? Kann man das Recordset von seiner Datenquelle "entbinden", sodass es sozusagen ein Recordset (Rcs) ist, welches im Speicher liegt und dort bearbeitet werden kann? Somit könnte ich dann wenigstens mit einer For Each Schleife die Häkchen in die DB bringen... Aber wie "entbinde" ich das Rcs? Ein Set rcs.datasource = nothing macht das Rcs dann für das Formular auch nicht bearbeitbar.

LG

Titel: Re: ADODB Recordset bearbeitungsfähig machen
Beitrag von: Josef P. am Februar 05, 2019, 18:46:52
Hallo!

Falls die Auswahldaten nicht direkt in der Datenbank landen müssen, könntest du die Connection vom Recordset kappen. Dann sollte es änderbar werden.

Bedingung zum Binden an das Formular: clientseitiger cursor, cursortyp: keyset oder static
Zuerst die Verbindung mit set rcs.ActiveConnection = nothing kappen und dann an das Formular binden.

mfg
Josef
Titel: Re: ADODB Recordset bearbeitungsfähig machen
Beitrag von: datekk am Februar 05, 2019, 19:05:07
Habe ich versucht, jedoch ist das Formular immer noch nicht bearbeitbar. Es erscheint unten in der Access Zeile eine Meldung: "Feld kann nicht bearbeitet werden, es ist an das unbekannte Steuerelement Auswahl gebunden."

Zudem stürzt Access wenige Sekunden danach ohne Fehlermeldung völlig ab. Das hab ich öfter. Leere Recordsets oder Recordsets ohne Connection scheint Access zu hassen.
Titel: Re: ADODB Recordset bearbeitungsfähig machen
Beitrag von: Josef P. am Februar 05, 2019, 20:02:49
Hast du es so probiert:
dim rcs as adodb.recordset
set rcs = new adodb.recordset
rcs.source "SELECT k.name, s.auswahl FROM Kundenliste as k INNER JOIN tbl1 as s ON k.IdKunde = s.KundenIdRef"
rcs.ActiveConnection = con
rcs.CursorLocation = adUseClient
rcs.CursorType = adOpenKeyset
rcs.LockType = adLockOptimistic
rcs.Open
set rcs.ActiveConnection  = nothing
set DeineFormRef.Recordset = rcs
' .... und natürlich an dieser Stelle rcs nicht mit rcs.Close schließen


Ansonsten: kannst du eine Beispielanwendung erstellen, in der das Problem zu sehen ist?

mfg
Josef
Titel: Re: ADODB Recordset bearbeitungsfähig machen
Beitrag von: PhilS am Februar 05, 2019, 21:01:30
Zitat von: datekk am Februar 05, 2019, 18:35:40
So habe ich eine Tabelle tbl1 mit den Spalten ID(int), KundenIdRef(int), Auswahl(bit/bool).
In einem Formular möchte ich nun den Kundennamen anzeigen und die Möglichkeit haben, ein Häkchen zu setzen.
Zwei Schüsse aus der Hüfte:
Die Tabelle hat einen Primärschlüssel?
Kannst du probeweise das bit-Feld ändern zu smallint und probieren, ob das einen Unterschied macht?
Titel: Re: ADODB Recordset bearbeitungsfähig machen
Beitrag von: datekk am Februar 05, 2019, 21:34:25
Lieben Dank Euch. Ich bastel morgen mal eine Beispiel DB mit realem SQL Server Zugriff... Da schauen wir uns das mal zusammen an.

Bis morgen.
LG
Titel: Re: ADODB Recordset bearbeitungsfähig machen
Beitrag von: datekk am Februar 06, 2019, 09:51:39
Problem: Sobald ich die Active Connection auf nothing setze, bricht mein Access zusammen. Auf einem anderen Rechner läuft es jetzt.

Hier die Datei. Vielleicht lassen sich noch elegantere Lösungen finden um die Daten bearbeiten zu können und um ggf. auch einen neuen DS anfügen zu können.
Titel: Re: ADODB Recordset bearbeitungsfähig machen
Beitrag von: PhilS am Februar 06, 2019, 11:51:07
1.) Das unveränderte Beispiel mit Set FrmRcs.ActiveConnection = Nothing funktioniert bei mir fehlerfrei.

2.) Wer lesen kann, ist im Vorteil. ;-)
Wenn ich Set ... = Nothing auskommentiere, kommt bei dem Versuch der Änderung folgende Fehlermeldung: Form is read-only, because the Unique Table property is not set.

Konsequenz:
In Form-Open, nach zuweisen des Recordsets, Folgendes ergänzen:
Me.UniqueTable = "Auswahl"

-> Funktioniert!

(Alles getestet mit Access 2010)
Titel: Re: ADODB Recordset bearbeitungsfähig machen
Beitrag von: datekk am Februar 06, 2019, 12:42:24
Lieber PhiS,

ich weiß gar nicht, wie ich Dir danken soll  ::) ::) ::)

Me.UniqueTable bringt die Lösung auf die ich schon so lang gewartet habe.

1000 Dank.
Titel: Re: ADODB Recordset bearbeitungsfähig machen
Beitrag von: datekk am Februar 06, 2019, 12:50:00
Übrigens.. Ich konnte in diesem Zusammenhang auch rausbekommen, wie das Recordset vor Set me.Recordset = rcs mit dieser Eigenschaft belegt werden kann:

rcs.Properties("Unique Table").Value = "Auswahl"
Set me.Recordset = rcs