Guten Tag in die Runde,
ich möchte in ein ungebundenes Formular ein Unterformular in der Datenblattansicht zur Verfügung stellen.
Dieses UFO soll eine Kopie aus einer Datenquelle A bekommen. Die Daten sollen im UFO bearbeitbar sein (natürlich ohne die Datenquelle A zu ändern), schließlich sollen die Daten dann bei betätigen eines Speichern-Knopfes nach B (in eine andere Datenquelle) geschrieben werden.
Geht das nur mit einer Temporärtabelle, in die ich A zur Bearbeitung zwischenspeichere?
Ich mags schlank 8)
Das funktioniert nur mit einer Tmp-Tabelle.
Mache ein Feld mehr als die Orginal-Tabelle in dem du vermerkst "Neu, Änderung, Löschen"
Beim Öffnen gesamte Tabelle löschen, dann Datensätze kopieren. >> Bearbeiten >>
Wenn du fertig bist Daten zurückschreiben in Orginaltabelle
Hallo,
ZitatIch mags schlank
dann binde das Formular an die Datenquelle und frage ob der Datensatz gespeichert werden soll. Auch bei einem gebundenen Formular kannst Du dann bei Nein den geänderten DS mit Me.Undo verwerfen.
Aber selbst wenn Du bei ungebunden bleiben willst, kannst Du mit einer Aktualisierungsabfrage die geänderten Daten in die Tabelle schreiben (oder auch nicht). Eine Temp. Tabelle braucht es da nicht.
ZitatGeht das nur mit einer Temporärtabelle
Nein.
Eine Abfrage ist eine virtuelle Tabelle und schlanker als eine Temp-Tabelle mit redundanten Daten. Die Bearbeitbarkeit der Daten kann man mit Formulareigenschaften unterbinden.
Ein Recordset wäre gleichlautend auch eine temporäre Datenquelle, mit dem Typ Snapshot verhindert man eine Bearbeitbarkeit.
Mit einem unverbundenen ADODB Recordset ließe sich eine temporäre Speicherung vermeiden, wobei jedoch das Filtern und Sortieren via Kontextmenü im Datenblatt ausgeschlossen ist.
Hier einmöglicher Aufbau Szenerie:Private Sub EinKnopf_Click()
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
With rs
With .Fields
.Append "DieId", adInteger, , adFldKeyColumn
.Append "FeldA", adVarWChar, 15, adFldMayBeNull
.Append "FeldB", adVarWChar, 20, adFldMayBeNull
.Append "FeldC", adCurrency, , adFldMayBeNull
.Append "FeldD", adDate, , adFldMayBeNull
.Append "FeldE", adBoolean, , adFldMayBeNull
End With
.CursorType = adOpenKeyset 'oder adOpenStatic
.CursorLocation = adUseClient
.LockType = adLockPessimistic
.Open
End With
'gewünschte Daten aus DAO-Recordset einladen
With DBEngine(0)(0).QueryDefs("EineKorrespoindierendeParameterabfrage")
.Parameters("EinParameter") = Me.EinTextfeld
With .OpenRecordset(dbOpenForwardOnly, dbReadOnly)
Do Until .EOF
rs.AddNew Array("DieId", "FeldA", "FeldB", _
"FeldC", "FeldD", "FeldE"), _
Array(!DieId, !FeldA, !FeldB, _
!FeldC, Null, FeldE)
.MoveNext
Loop
.Close
End With
End With
Set Me.UFOName.FormRecordset = rs
End Sub
Zum Einfügen eines neuen Datensatzes kann der Clone des Formular-Recordsets verwendet werden. Nach AddNew ist dieser dann dem Formular-Recordset zuzuweisen. Löschen und Editieren funktioniert wie gehabt. Am Ende der Sitzung können dann die Daten in die gewünschte Zieltabelle transferiert werden.
@Lachtaube,
warum nicht gleich direkt ins ADO Recordset einlesen?
@Markus,
berechtigte Frage. Meine Hirnwindungen waren wohl zum Zeitpunkt des Schreibens noch nicht ganz wach.:)
Zitat von: Lachtaube am November 15, 2018, 09:04:33
@Markus,
berechtigte Frage. Meine Hirnwindungen waren wohl zum Zeitpunkt des Schreibens noch nicht ganz wach.:)
Grundsätzlich ist das Problem - ADO ist bei Access nicht sauber implementiert.
Eine Batch Verarbeitung klappt z.B. im Formular nicht wie es sollte.
Ich verwende dafür schon lange ein Datagrid.
Dann geht das wirklich perfekt mit ADO und man kann alle Techniken nutzen.
Zitat von: Lachtaube am November 15, 2018, 09:04:33
@Markus,
berechtigte Frage. Meine Hirnwindungen waren wohl zum Zeitpunkt des Schreibens noch nicht ganz wach.:)
Erst mal danke für den Ansatz, den versuche ich dann mal. ;D
Das Laden in ein Recordset hab ich schon gemacht, auf DAO und dann das rs ans Form gekoppelt.
Damit erreiche ich aber nicht das was ich will, denn ich habe die original-Daten in dem rs, d.h. die werden dann auch bearbeitet.
Ihr meint, wenn ich das rs kopiere sind es nicht mehr die original-Daten?
Geht das nur mit ADO (nur interessehalber, wäre ja nicht schlimm)
Zitat von: markus888 am November 15, 2018, 09:54:21
Grundsätzlich ist das Problem - ADO ist bei Access nicht sauber implementiert.
Eine Batch Verarbeitung klappt z.B. im Formular nicht wie es sollte.
Ich verwende dafür schon lange ein Datagrid.
Dann geht das wirklich perfekt mit ADO und man kann alle Techniken nutzen.
Was ist ein Datagrid (Active x?)?
Ein Grid ist ein Raster. Ein Datagrid ist eine Datentabelle. Im Sinne der Verwendung unter Access dürfte es sich hierbei um ein gekauftes Steuerelement (ActiveX) handeln, das Daten tabelarisch darstellen kann, wie das Listview OCX von Microsoft auch. Das Problem bei Grids ist, dass nicht Jedes davon einen virtuellen Modus zur Verfügung stellt. was die Dinger dann bei größeren Datenmengen langsam und unbrauchbar macht.
@Milvus,
grundsätzlich gibt es viele Möglichkeiten das umzusetzen.
Da aber unklar ist, warum du das ganze machst würde ich auch keinen Vorschlag dazu unterbreiten.
ADO bietet grundsätzlich einige Möglichkeiten zusätzlich an.
Eine wäre - man holt sich die Daten - ändert diese nach Lust und Laune im Grid.
Am Schluss synchronisiert man dann mit dem Server.
@Lachtaube.
Wie beeinflusst dieser virtuelle Modus die Geschwindigkeit?
Zitat von: markus888 am November 18, 2018, 14:01:42
ADO bietet grundsätzlich einige Möglichkeiten zusätzlich an.
Eine wäre - man holt sich die Daten - ändert diese nach Lust und Laune im Grid.
Am Schluss synchronisiert man dann mit dem Server.
Was muss ich installieren, damit ich das Grid nutzen kann, ich habe es nicht bei meinen Standard-Active X dabei (Access 2013)
@Markus,
ich kann mich nur auf ein Listview beziehen, das z.B. in Object-Pascal (Lazarus oder Delphi) die Eigenschaft OwnerData offenlegt und dafür einen Event OnData zur Verfügung stellt (Dot Net bietet wohl Ähnliches für ein Listview - darüber kann Josef vermutlich Einzelheiten mitteilen). Beim OCX würde der viertuelle Modus AFAIK nur über Subclassing zu erzielen sein, das ich mir bei OCXen in Access nicht antue. Um z.B. alle Daten eines Verzeichnisses im Normalen Listview anzuzeigen, müssen zuerst alle alten Einträge (zeitintensiv) gelöscht werden und sämtliche Dateien des neuen Verzeichnisses (zeitintensiv) hinzugefügt werden, bevor etwas zur Ansicht gelangt. Im virtuellen Modus hingegen würden nur soviele Daten in OnData aus einer Speicherstruktur (was ein Recordset sein könnte) gezogen, die zur Anicht aud dem Bildschirm genügen. Im Prinzip arbeiten Datenblatt- und Endlosansicht von Access auch in einem virtuellen Modus, mit dem Unterschied, dass diese immer an ein Recordset gebunden sein müssen.
Zitat von: Milvus am November 18, 2018, 14:49:10
Was muss ich installieren, damit ich das Grid nutzen kann, ich habe es nicht bei meinen Standard-Active X dabei (Access 2013)
Das Grid ist eine Software, die man erwerben oder eben programmieren muss.
Da gibts jede Menge Anbieter. Zwei Beispiele:
http://10tec.com/articles/ms-access-grid-control.aspx
http://www.tools4vb.com/software/index.php?kat=01
Da heißt es aber nicht schnell mal installieren und verwenden.
So eine Klasse ist in der Regel weit umfangreicher wie das Access Formular.
Dann solltest du die Klassen ADO und DAO auch verstehen, damit du sie einsetzen kannst.
LG Markus