Discussion:
Recordset auf Endlosformular
(zu alt für eine Antwort)
Harald Buchner
2006-04-25 08:59:01 UTC
Permalink
Hallo NG,

ich habe ein problem mit dem Einbau einer Schleife bei einem Recordset auf
ein Endlosformular (ungebunden) - Access 2000 -
Im - gekürtzten- Beispiel wird nur der erste gefundene Datensatz angezeigt,
weil die Schleife fehlt.
Wäre nett von euch, wenn mir jemand beim einbau der Schleife helfen kann.


Dim SQL As String
Dim dao As dao.Database
Dim rst As dao.Recordset

SQL_1 = "SELECT tbl_lager.id, tbl_lager.pos1, tbl_lager.pos2,
tbl_lager.pos3, " _
& " tbl_lager.pos4 " _
& " FROM tbl_lager "

Set dao = CurrentDb
Set rst = dao.OpenRecordset(SQL)

With rst_1
If .EOF Then
Else
Me.id = .Fields(0)
Me.pos1 = .Fields(1)
Me.pos2 = .Fields(2)
Me.pos3 = .Fields(3)
Me.pos4 = .Fields(4)
End If
.Close
End With

Set rst = Nothing
Set dao = Nothing


Danke im vorraus, Harald
Stefan Dase
2006-04-25 09:32:39 UTC
Permalink
Hallo Harald,
Post by Harald Buchner
ich habe ein problem mit dem Einbau einer Schleife bei einem Recordset auf
ein Endlosformular (ungebunden) - Access 2000 -
Wenn du einem Endlosformular ein Recordset zuweisen willst, kannst du ab
Access 2000 die Recordseteigenschaft des Formulars verwenden:

Set Me.Recordset = rst

oder von außerhalb:

Set Forms("Formname").Recordset = rst

AFAIK kannst du die Werte nicht in einer Schleife durchlaufen und
einzeln den Controls zuweisen.

Unter Access 97 oder älter bleibt dir nur, eine SQL-Anweisung oder
Abfrage zu verwenden.

HTH,
Stefan
Harald Buchner
2006-04-25 10:58:01 UTC
Permalink
Hallo Stefan,
Post by Stefan Dase
Wenn du einem Endlosformular ein Recordset zuweisen willst, kannst du ab
Set Me.Recordset = rst
Set Forms("Formname").Recordset = rst
Ein Recordset habe ich schon zugewiesen.
Post by Stefan Dase
AFAIK kannst du die Werte nicht in einer Schleife durchlaufen und
einzeln den Controls zuweisen.
Ich werde versuchen noch etwas darüber herauszufinden, damit ich es hier
anhängen kann.
Gut wäre es schon, ein Endlosfrm per Recordset zu füllen.
Denn dann können einfach beliebige Spalten gefiltert,sortiert und geändert
werden.

Auf jeden Fall vielen Dank, für deinen Beitrag


Harald
Stefan Dase
2006-04-25 11:50:35 UTC
Permalink
Hallo Harald,
Post by Harald Buchner
Post by Stefan Dase
Wenn du einem Endlosformular ein Recordset zuweisen willst, kannst du ab
(...)
Ein Recordset habe ich schon zugewiesen.
(...)
Gut wäre es schon, ein Endlosfrm per Recordset zu füllen.
Denn dann können einfach beliebige Spalten gefiltert,sortiert und geändert
werden.
Was möchtest du denn erreichen? Wenn es nur um einen variablen Filter
geht, denn kannst du dem UF jederzeit per

Me![NameDesUF].Form.Filter = "..."
Me![NameDesUF].Form.FilterOn = True

zuweisen. Wenn es darum geht, Daten in einem Recordset spezifisch
aufzubereiten und dann anzuzeigen, kannst du meinen ersten Tipp nutzen.
Denn das Zuweisen eines Recordset kann ab Access 2000 auch zur Laufzeit
erfolgen!

Ansonsten schildere doch einmal dein Szenario.

Viele Grüße,
Stefan
Harald Buchner
2006-04-25 14:43:02 UTC
Permalink
Hallo Stefan,
Post by Stefan Dase
Was möchtest du denn erreichen?
Es geht darum, FormularA aus FormularB zu starten.
Beide haben lediglich die selbe Tabelle als Grundlage, ansonsten keine
weitere abhängigkeit.
Beide Formulare sind ungebunden und werden per Recordset nach dem Muster,
wie ich es im ersten Beitrag aufgeführt habe bedient.
Entweder per Select, insert oder update.
Das ist der entscheidende Punkt, denn mit so einem Recordset konnte ich bisher
immer alle Daten beliebig zusammensetzen.
Mit einer anderen Methode fehlt mir das wissen dazu.
Post by Stefan Dase
Wenn es nur um einen variablen Filter
geht, denn kannst du dem UF jederzeit per
Me![NameDesUF].Form.Filter = "..."
Me![NameDesUF].Form.FilterOn = True
zuweisen. Wenn es darum geht, Daten in einem Recordset spezifisch
aufzubereiten und dann anzuzeigen, kannst du meinen ersten Tipp nutzen.
Denn das Zuweisen eines Recordset kann ab Access 2000 auch zur Laufzeit
erfolgen!
Jetzt möchte ich mal vorsichtig nachfragen, was anders ist als mit meinem
Recordset, mit ich natürlich auch zur Laufzeit meine Datenherkunft wechseln
kann. Eben nur nicht in einem Endlos Formular.
Post by Stefan Dase
Ansonsten schildere doch einmal dein Szenario.
Es geht darum, dass beide Formulare geöffnet angezeigt werden.
Das darüberliegende Formular ist kleiner als das darunterliegende, damit
im darunterliegenden Formular per verschiedene Buttons zur Laufzeit die
Daten nach unterschiedlichen Kriterien angezeigt oder geändert werden können.
Dann gibt es im den Formularen zu jeder Spalte einen Button mit dem das
Formular nach der entsprechenden Spalte zur Laufzeit sortiert werden kann.

Funktioniert alles, ausser bei einem Endlosformular!

Vom Prinzip her ist mir gleich wie ich die Daten ändere.
Ich gehe mal davon aus dass es mit deiner Methode funktioniert.
Und versuche mal mir das ganze vorzustellen:
Mein Formular ist also an Tabelle oder Abfrage gebunden....
Post by Stefan Dase
Post by Stefan Dase
Set Forms("Formname").Recordset = rst
setze ich bei Form_load.... ?
und wo stehe ich dann? ich muß doch noch meine Daten zusammsetzen, filtern
oder updaten.

Vielleicht kannst du mir noch ein paar Tipps geben in diese Richtung.


Grüße Harald
Ekkehard Böhme
2006-04-25 18:49:28 UTC
Permalink
Hallo Harald,
Post by Harald Buchner
Hallo Stefan,
Post by Stefan Dase
Was möchtest du denn erreichen?
Es geht darum, FormularA aus FormularB zu starten.
Beide haben lediglich die selbe Tabelle als Grundlage, ansonsten keine
weitere abhängigkeit.
Beide Formulare sind ungebunden und werden per Recordset nach dem Muster,
wie ich es im ersten Beitrag aufgeführt habe bedient.
Entweder per Select, insert oder update.
Das ist der entscheidende Punkt, denn mit so einem Recordset konnte ich bisher
immer alle Daten beliebig zusammensetzen.
Mit einer anderen Methode fehlt mir das wissen dazu.
Post by Stefan Dase
Wenn es nur um einen variablen Filter
geht, denn kannst du dem UF jederzeit per
Me![NameDesUF].Form.Filter = "..."
Me![NameDesUF].Form.FilterOn = True
zuweisen. Wenn es darum geht, Daten in einem Recordset spezifisch
aufzubereiten und dann anzuzeigen, kannst du meinen ersten Tipp nutzen.
Denn das Zuweisen eines Recordset kann ab Access 2000 auch zur Laufzeit
erfolgen!
Jetzt möchte ich mal vorsichtig nachfragen, was anders ist als mit meinem
Recordset, mit ich natürlich auch zur Laufzeit meine Datenherkunft wechseln
kann. Eben nur nicht in einem Endlos Formular.
Post by Stefan Dase
Ansonsten schildere doch einmal dein Szenario.
Es geht darum, dass beide Formulare geöffnet angezeigt werden.
Das darüberliegende Formular ist kleiner als das darunterliegende, damit
im darunterliegenden Formular per verschiedene Buttons zur Laufzeit die
Daten nach unterschiedlichen Kriterien angezeigt oder geändert werden können.
Dann gibt es im den Formularen zu jeder Spalte einen Button mit dem das
Formular nach der entsprechenden Spalte zur Laufzeit sortiert werden kann.
Funktioniert alles, ausser bei einem Endlosformular!
Ich bin mir nicht sicher, aber ich glaube, dass es daran liegt, dass es im
Endlosform jedes Control (hier wohl Textfeld) nur einmal gibt, auch wenn es
für jeden Datensatz angezeigt wird.
Wenn Du z.B. Me.id = rst..Fields(1) schreibst, setzt Du den Wert von Me.id,
also die Value-Eigenschaft (Standard). Ich glaube, was Du brauchst ist die
Eigenschaft ControlSource. Da brauchst Du dann auch keine Schleife mehr, da
das Feld ja an die Spalte des RS gebunden wird, und somit für jeden DS den
Wert anzeigt (und geändert werden kann, wenn das RS aktualisierbar ist).
Du bindest das Formular bzw. Felder also zur Laufzeit an die Tabelle bzw.
RS.
Bitte an die Profis: Falls ich damit völlig daneben liege, bitte korrigiert
mich (lerne gerne was dazu).
gruss
ekkehard böhme
Post by Harald Buchner
Vom Prinzip her ist mir gleich wie ich die Daten ändere.
Ich gehe mal davon aus dass es mit deiner Methode funktioniert.
Mein Formular ist also an Tabelle oder Abfrage gebunden....
Post by Stefan Dase
Post by Stefan Dase
Set Forms("Formname").Recordset = rst
setze ich bei Form_load.... ?
und wo stehe ich dann? ich muß doch noch meine Daten zusammsetzen, filtern
oder updaten.
Vielleicht kannst du mir noch ein paar Tipps geben in diese Richtung.
Grüße Harald
Stefan Dase
2006-04-26 08:37:00 UTC
Permalink
Hallo Harald,
Post by Harald Buchner
Beide Formulare sind ungebunden und werden per Recordset nach dem Muster,
wie ich es im ersten Beitrag aufgeführt habe bedient.
Wie Ekkehard schon angemerkt hat, funktioniert dieses Vorgehen nur bei
einem Formular, dass einen einzelnen Datensatz anzeigt. Ein
Endlosformular wird dir genau soviele Zeilen anzeigen, wie es Datensätze
in seiner Datenquelle findet, in deinem Fall also keinen (bzw. nur einen
leeren).

Auch das Zuweisen von Inhalten wird nicht funktionieren, da du dann in
allen Zeilen dieselben Werte stehen hast. Um solch ein Vorgehen
umzusetzen, benötigst du ein Grid-Control. Allerdings habe ich so etwas
noch nie in Access implementiert.
Post by Harald Buchner
Entweder per Select, insert oder update.
Wie kann man mittels eines INSERT- oder UPDATE-Ausdrucks Daten anzeigen?
Post by Harald Buchner
Post by Stefan Dase
Wenn es nur um einen variablen Filter
geht, denn kannst du dem UF jederzeit per
Me![NameDesUF].Form.Filter = "..."
Me![NameDesUF].Form.FilterOn = True
(...)
Jetzt möchte ich mal vorsichtig nachfragen, was anders ist als mit meinem
Recordset, mit ich natürlich auch zur Laufzeit meine Datenherkunft wechseln
kann. Eben nur nicht in einem Endlos Formular.
Das angezeigte Ergebnis wird in beiden Fällen analog sein. Allerdings
bin ich bei dem Tipp davon ausgegangen, dass deine Daten aus einer
Tabelle oder Abfrage zu beziehen sind.
Post by Harald Buchner
Vom Prinzip her ist mir gleich wie ich die Daten ändere.
Das Updaten erledigt Access in gebundenen Formularen selbstätig. Und
Endlosformulare können wie oben beschrieben nicht ungebunden funktionieren.
Post by Harald Buchner
Post by Stefan Dase
Post by Stefan Dase
Set Forms("Formname").Recordset = rst
setze ich bei Form_load.... ?
Ist im Prinzip egal, wo du das Recordset lädst. Durch eine Zuweisung
wird in jedem Fall die Datenherkunft neu abgefragt und angezeigt. Du
kannst das Recordset auch neu erzeugen und laden, wenn du andere Werte
anzeigen willst. Alternativ funktioniert es auch durch Zuweisung einer
SQL-Anweisung an die RecordSource-Eigenschaft, wie Ulrich schon anmerkte.

Generell habe ich auch nicht verstanden, wozu du nun zwei Formulare
verwendest, wenn alle Schaltflächen u.ä. eh auf dem unteren (ich vermute
mal, das andere ist als Pop-Up formatiert?) hast. Ich gehe meistens so
vor, dass ich in einem Formular in Datenblattansicht alle Datensätze
anzeige, ggf. auch schon vorgefiltert. Diese "Liste" kann der Anwender
dann frei sortieren, filtern oder kopieren, z.B. nach Excel. In der
Datenblattansicht kann nicht geändert, gelöscht oder neu hinzugefügt
werden. Für Änderungen und neue Daten habe ich ein zweites Formular,
dass als Pop-Up jeweils den aktuellen bzw. leeren Datensatz mit allen
zugehörigen Informationen anzeigt. Geöffnet wird dieses Pop-Up z.B. per
Doppelklick auf eine Zeile der "Liste" oder durch einen
Kontextmenübefhel "Details anzeigen".

Viele Grüße,
Stefan

Ulrich Haarmeyer
2006-04-26 08:11:37 UTC
Permalink
Harald Buchner schrieb
Post by Harald Buchner
ich habe ein problem mit dem Einbau einer Schleife bei einem Recordset auf
ein Endlosformular (ungebunden) - Access 2000 -
Im - gekürtzten- Beispiel wird nur der erste gefundene Datensatz angezeigt,
weil die Schleife fehlt.
Wäre nett von euch, wenn mir jemand beim einbau der Schleife helfen kann.
Dim SQL As String
Dim dao As dao.Database
Dim rst As dao.Recordset
SQL_1 = "SELECT tbl_lager.id, tbl_lager.pos1, tbl_lager.pos2,
tbl_lager.pos3, " _
& " tbl_lager.pos4 " _
& " FROM tbl_lager "
Set dao = CurrentDb
Set rst = dao.OpenRecordset(SQL)
With rst_1
If .EOF Then
Else
Me.id = .Fields(0)
Me.pos1 = .Fields(1)
Me.pos2 = .Fields(2)
Me.pos3 = .Fields(3)
Me.pos4 = .Fields(4)
End If
.Close
End With
Set rst = Nothing
Set dao = Nothing
Hallo Harald

zum ersten mal würde ich auf einen Variablenname wie dao verzichten
und statt dessen db oder ähnliches nehmen.

Wenn ich deinen Code richtig verstehe, möchtest du jeden Datensatz
deines Recordsets an einen Datensatz deines Endlosformulars übergeben.
Du kannst in einem ungebundenen Endlosformular nicht mehrere
Datensätze angeben.
Du kannst aber statt des ganzen Aufwands einfach den Inhalt der
Variable SQL an die Recordsource-Eigenschaft deines Endlosformulars
übergeben, denn dann enthält dein Endlosformular genau die gleichen Daten
wie dein Rekordset.
Nachträglich sortieren und filtern kannst du über die Formulareigenschaften
SortBy und Filter einstellen.

Da die meisten Endlosformulare die Bezeichnungsfelder als
Spaltenüberschriften haben,
möchte ich dich an dieser Stelle darauf hinweisen, das diese
Bezeichnungsfelder
ebenfalls ein Klick-Ereignis haben, über die man hervoragend
Sortierkriterien
festlegen kann. Es sind also keine zusätzlichen Befehlsschaltflächen dafür
notwendig.

Gruß
Uli
Loading...