Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: Milvus am November 14, 2018, 12:56:07

Titel: Temporäre Datenquelle an Formular
Beitrag von: Milvus am November 14, 2018, 12:56:07
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)
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: ch.B. am November 14, 2018, 13:42:19
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
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: MzKlMu am November 14, 2018, 17:38:25
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.
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: ebs17 am November 14, 2018, 18:50:57
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.
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: Lachtaube am November 15, 2018, 07:45:49
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.
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: markusxy am November 15, 2018, 08:50:38
@Lachtaube,
warum nicht gleich direkt ins ADO Recordset einlesen?


Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: Lachtaube am November 15, 2018, 09:04:33
@Markus,

berechtigte Frage.  Meine Hirnwindungen waren wohl zum Zeitpunkt des Schreibens noch nicht ganz wach.:)
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: markusxy am November 15, 2018, 09:54:21
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.
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: Milvus am November 16, 2018, 15:49:44
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)
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: Milvus am November 18, 2018, 09:56:52
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?)?
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: Lachtaube am November 18, 2018, 10:25:29
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.
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: markusxy am November 18, 2018, 14:01:42
@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?
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: Milvus am November 18, 2018, 14:49:10
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)
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: Lachtaube am November 18, 2018, 15:17:22
@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.
Titel: Re: Temporäre Datenquelle an Formular
Beitrag von: markusxy am November 20, 2018, 08:01:18
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