Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

ADODB Recordset bearbeitungsfähig machen

Begonnen von datekk, Februar 05, 2019, 18:35:40

⏪ vorheriges - nächstes ⏩

datekk

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

Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

Josef P.

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

datekk

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.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

Josef P.

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

PhilS

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?
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

datekk

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
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

datekk

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.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

PhilS

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)
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

datekk

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.
Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps

datekk

Ü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

Access 2016 mit SQL Server Backend. Bereits umgesetzt: Access mit MS SQL Backend,  ADODB Formularbindung, Streamen von Dateien zum SQL Server und zurück (Filestream), Drag&Drop Dateiupload zum Server, CTI / TAPI Integrierung in Access Anwendung - Nutzung auch über Remote Desktop, selbst aktualisierendes Access Frontend auf entfernten Rechnern (Upgrade). Berichte / Kreuztabellen mit SQL Server Backend, Mail Tagging, Outlook Steuerung über Access und umgekehrt // Grundwissen in .Net Core & Blazor Apps