Access Formular: Wert aus Listenfeld für Selektion

Hallo!

Ich habe in Access ein Formular, das ein Listenfeld beinhaltet.
In diesem Listenfeld werden alle Attributswerte einer bestimmten Tabelle angezeigt.
Nun möchte ich, daß, wenn man mit der Maus einen der Werte aus dem Listenfeld selektiert und einen ‚OK‘ Button drückt, eine Selektion über den angewählten Wert ausgeführt wird und in eine neue Tabelle geschrieben wird.

Es soll also einfach eine Prozedur aufgerufen werden, welche die Selektion durchführt, allerdings braucht diese Prozedur ja den Wert, den ich im Listenfeld auswähle, damit die Selektion überhaupt stattfinden kann.

Kann mir jemand genau sagen, wie ich das hinbekomme?

Ich habe an sich keine Ahnung von VisualBasic und von Formularen in Access, wäre also sehr froh, wenn mir jemand detailliert sagen könnte, was ich zu tun habe.

Vielen Dank!

Hallo Norman!

Willkommen im Forum bei wer-weiss-was.

Ich habe in Access ein Formular, das ein Listenfeld
beinhaltet. In diesem Listenfeld werden alle Attributswerte einer
bestimmten Tabelle angezeigt.

wieviel Spalten hat das Listenfeld?
wie heißen die Spalten?
Wie heißt das Listenfeld?
Wie heißt das Formular?
Wie heißt die Tabelle aus dem die Werte kommen?
Wie heißt die Tabelle in die die Werte geschrieben werden sollen?

Nun möchte ich, daß, wenn man mit der Maus einen der Werte aus
dem Listenfeld selektiert und einen ‚OK‘ Button drückt,

den OK-Butten könntest du dir sparen, wenn du das Ereignis: bei Doppelklick nutzen würdest.

eine Selektion über den angewählten Wert ausgeführt wird und in
eine neue Tabelle geschrieben wird.

ohne VBA geht das nicht!

Es soll also einfach eine Prozedur aufgerufen werden, welche
die Selektion durchführt,

richtig, wobei ich persönlich immer eine Funktion bevorzuge, und EINFACH ist das NICHT :smile:

allerdings braucht diese Prozedur ja
den Wert, den ich im Listenfeld auswähle, damit die Selektion
überhaupt stattfinden kann.

richtig, das geht über die Parametereigenschaft Colunm des Listenfeldes

Kann mir jemand genau sagen, wie ich das hinbekomme?

du willst den fertigen Code? Dann brauchen wir mal die Bezeichnungen (s.o.) von dir.

Ich habe an sich keine Ahnung von VisualBasic und von
Formularen in Access, wäre also sehr froh, wenn mir jemand
detailliert sagen könnte, was ich zu tun habe.

wo wohnst du? sinnvoll wäre, wenn dann jemand direkt neben dir sitzten würde.

Nun ja, ganz schön mutig. Du würdest auch ein Jumbojet bauen wollen, und dann hier fragen wie das geht? Du wirst nicht darum herum kommen, dich eingehend mit VBA auseinander zu setzen. Access ohne VBA ist wie ein Auto ohne Räder, oder ein Malprogramm ohne Pinsel :smile:

Grüße aus Essen
Wolfgang

Hallo Wolfgang,

Danke für deine Antwort!

wieviel Spalten hat das Listenfeld?
wie heißen die Spalten?
Wie heißt das Listenfeld?
Wie heißt das Formular?
Wie heißt die Tabelle aus dem die Werte kommen?
Wie heißt die Tabelle in die die Werte geschrieben werden
sollen?

Das Formular heißt „MA_MAI_Product_selection“
Das Listenfeld heißt „Liste3“

Es hat eine Spalte, die Werte kommen hierher:

SELECT „dbo“.„TEMP_MA_MAI_product“.„MAI_product“ FROM „dbo“.„TEMP_MA_MAI_product“ GROUP BY MAI_product ORDER BY „MAI_product“;

Die Tabelle, in die die Werte geschrieben werden sollen, heißt
„MA_MAI_selected_product“

Ich hab es mir grob so vorgestellt:

DELETE FROM MA_MAI_selected_product

INSERT INTO MA_MAI_selected_product

SELECT * from TEMP_MA_MAI_product WHERE MAI_product=„angewaehltes_Listenelement“

richtig, wobei ich persönlich immer eine Funktion bevorzuge,
und EINFACH ist das NICHT :smile:

Naja, es klingt so trivial, konnte mir nicht wirklich vorstellen, daß das schwer ist… =)

du willst den fertigen Code? Dann brauchen wir mal die
Bezeichnungen (s.o.) von dir.

Über den fertigen Code wäre ich auch froh…

wo wohnst du? sinnvoll wäre, wenn dann jemand direkt neben dir
sitzten würde.

Wohne in München und brauche es an der Arbeit…

Nun ja, ganz schön mutig. Du würdest auch ein Jumbojet bauen
wollen, und dann hier fragen wie das geht? Du wirst nicht
darum herum kommen, dich eingehend mit VBA auseinander zu
setzen. Access ohne VBA ist wie ein Auto ohne Räder, oder ein
Malprogramm ohne Pinsel :smile:

Grüße aus Essen
Wolfgang

Danke für den Hinweis… =)
Ganz so ist es ja nicht, aber ich habe hier grade als Werkstudent neu angefangen, und hab Access und VBA im Leben halt noch nie benutzt…

Hoffe, meine Angaben reichen aus.

Nochmals Danke,
Gruß
Norman

Hallo Norman,

Das Formular heißt „MA_MAI_Product_selection“

das kannm an abkürzen mit dem Kürzel ME.

Das Listenfeld heißt „Liste3“

ok

Es hat eine Spalte, die Werte kommen hierher:

SELECT „dbo“.„TEMP_MA_MAI_product“.„MAI_product“ FROM
„dbo“.„TEMP_MA_MAI_product“ GROUP BY MAI_product ORDER BY
„MAI_product“;

  1. Möglichkeit: Auswahl = ME.Liste3
  2. Möglichkeit: Auswahl = Me.Liste3.column(0)
    das Ergebnis in Auswahl ist das selbe, bei der 2. Möglichkeit wird lediglich eine Spalte direkt angesprochen, was sinnvoll ist, wenn man mehrere Spalten hat.

Die Tabelle, in die die Werte geschrieben werden sollen, heißt
„MA_MAI_selected_product“

Ich hab es mir grob so vorgestellt:
DELETE FROM MA_MAI_selected_product

? warum das Löschen

INSERT INTO MA_MAI_selected_product

Insert WAS?

SELECT * from TEMP_MA_MAI_product WHERE
MAI_product=„angewaehltes_Listenelement“

? warum dann nochmal eine Auswahl

Wohne in München und brauche es an der Arbeit…

gibt es dort niemanden, der dir zur Seite stehen kann?

Ganz so ist es ja nicht, aber ich habe hier grade als
Werkstudent neu angefangen, und hab Access und VBA im Leben
halt noch nie benutzt…

warum schreibst du das nicht gleich? Mit solchen Informationen fallen die Antworten gleich umfangreicher aus, also keine falsche Scham, wir haben alle mal angefangen :smile:

So nun zum Problem:
Im Listenfeld (Liste3) soll per Maus eine Auswahl getroffen werden und mit Doppelklick dann der Wert dieser Auswahl in eine Tabelle geschrieben (hinzugefügt) werden.

Vorbereitung:
Rechtsklick auf das Listenfeld
Eigenschaften wählen
Reiter = Ereignis
Doppelklick auf die Wörter: Beim Doppelklicken
[Ereignisprozedur] erscheint
am Ende der Zeile auf die drei Punkte […] klicken
der VBA - Editor wird geöffnet
es ist bereits vorgegeben:

Private Sub Liste0_DblClick(Cancel As Integer)

End Sub

dazwischen kommt jetzt der VBA Code:

Wir wissen, dass ME. das Kürzel dür das gerade offene Formular ist.
Wir wissen, dass die Liste LISTE3 heißt.
Wir können also nun die Information der Liste direkt ansprechen:

ME.Liste3

„Schlau“ wie Access ist, gibt es uns direkt die Information, die wir vorher ausgewählt haben. D.h. in ME.Liste3 ist schon unser Ergebnis!

was wollen wir mit diesen Daten machen: Anfügen an eine Tabelle:
Ohne viel Aufwand (es gibt noch einen umfangreicheren Weg) können wir in VBA eine SQL-Abfrage (Anfügeabfrage) aufrufen:

DOCMD.RUNSQL xxxxxx

Wir müssen uns jetzt nur noch diese SQL-Anweisung zusammen bauen:
Da du uns/mir immer noch nicht verraten hast, wie das Feld in der Tabelle heißt, in dem du die Information speichern willst, gehe ich mal davon aus, das in der Tabelle MA_MAI_selected_product es ein Feld mit der Bezeichnung PRODUCT gibt.

Mit den nun vorhandenen Bezeichnngen können wir uns einen SQL-String zusammenbauen:

meine_SQL_Anweisung = „INSERT INTO MA_MAI_selected_product ( PRODUCT ) SELECT '“ & ME.Liste3 & „’ AS Dummy, *;“

die vollständige SUB-Prozedur sieht dann so aus:

*-----------------------------------------
Private Sub Liste0_DblClick(Cancel As Integer)
Dim xSQL As String

‚den SQL-String basteln
xSQL = „INSERT INTO MA_MAI_selected_product ( PRODUCT ) SELECT '“ & Me.Liste3 & "‘ AS Dummy, *;"

'den SQL-String ausführen
DoCmd.RunSQL xSQL

End Sub
*-----------------------------------------

ok, das ist der reine Code, ohne Fehlerkontrolle etc.

Grüße aus Essen
Wolfgang

Hallo Wolfgang,

danke für deine Antwort und Entschuldigung, daß ich mich erst jetzt wieder melde, konnte vorher nicht.

Ich hab es mir grob so vorgestellt:
DELETE FROM MA_MAI_selected_product

? warum das Löschen

Das Löschen ist schon OK, es soll immer nur ein Produkt in der Tabelle stehen.

INSERT INTO MA_MAI_selected_product

Insert WAS?

Es wird das eingefügt, was in der Select Anweisung direkt danach folgt.

SELECT * from TEMP_MA_MAI_product WHERE
MAI_product=„angewaehltes_Listenelement“

? warum dann nochmal eine Auswahl

Wohne in München und brauche es an der Arbeit…

gibt es dort niemanden, der dir zur Seite stehen kann?

Nein, leider nicht, ich bin hier in einer Abteilung, die leider von all dem gar keine Ahnung hat, aber gerne eine Datenbank hätte, mir der sie arbeiten können…

Ich habe deinen Code angewendet, allerdings geht irgendetwas noch nicht.
Die Zeile

xSQL = "INSERT INTO MA_MAI_selected_product…

macht Ärger, der Debugger wird geöffnet beim ausführen
.

Nochmal zu meinem gewünschten Ergebnis:

ich habe die Tabelle MA_MAI_Product mit folgenden Attributen:

Stueckliste
MAI_Product
MAT_RunTime
Fiscal_Month
Material

Diese Tabelle enhält mehrere 100000 Einträge. Um ein einziges Produkt (das Attribut MAI_Product) anzuzeigen, soll deswegen über ein Formular das gewünschte Produkt ausgewählt werden.
Die Ergebnis-Tabelle „MA_MAI_selected_Product“ enthält wieder als Attribute

Stueckliste
MAI_Product
MAT_RunTime
Fiscal_Month
Material

aber natürlich nur das eine ausgewählte MAI_Product.

Deswegen das Löschen der Tabelle am Anfang. Und deswegen auch meine Insert Anweisung, ich fand die richtig, um das gewünschte Ergebnis zu bekommen.

Ich möchte also quasi nur aus einer sehr großen Tabelle eine kleine machen, die nur ein einziges ausgewähltes Produkt enthält.

Hoffe, daß ich mich jetzt klar ausgedrückt habe.

Vielen Dank noch einmal für deine ausführlich Hilfe!

Grüße aus München

Carsten

Hallo Carsten,

kannst du mir mal die MDB schicken, habe das Gefühl du bist da auf dem Holzweg.

Du sprichst nun von einem Formular, aus dem du die Informationen ziehen willst, vorher war die Rede vom Listenfeld!?

Die „normale“ Vorgehensweise ist:

  • erstelle ein Formular (Ansicht: Formular) Datenbasis: deine Tabelle
  • füge Formularkopf/-Fuß ein
  • Symbolleiste: Toolbar einschalten
  • im Formularkopf erstelle mit dem Assistenten für Pulldownfelder ein Pulldownfeld, dass die Daten aus dieser Tabelle nimmt.
    (In der Toolbar auf das Symbol für Pulldownfelder klicken, dann in den Formaularkopf klicken. Den Abfragen des Assistenten folgen)

Du hast nun ein „Suchfeld“ dass bei Eingabe dir den passenden Datensatz zum ausgewählten Produkt findet und in dem Formular anzeigt.

Es ist nicht nötig, einen Wert in eine zweite Tabelle zu schreiben!
Wenn dir die Liste der Produkte zu lang ist, kannst du einen Filter setzen, um diese einzugrenzen.

Grüße aus Essen
Wolfgang

Hallo Wolfgang,

ich brauch es eigentlich genau so, wie ich es schreibe.

Ich habe ein Formular erstellt, das heißt „MA_MAI_Product_Selection“

Dieses hat ein Listenfeld, genannt „Liste3“, welches als „Datensatzherkunft“ folgende Zeile hat:

„SELECT „dbo“.„TEMP_MA_MAI_product“.„MAI_product“ FROM „dbo“.„TEMP_MA_MAI_product“ GROUP BY MAI_product ORDER BY „MAI_product“;“

Das ist genau so, wie es sein soll, es wird bis jetzt genau das gewünschte angezeigt.

In dem Listenfeld habe ich also nun alle „MAI_product“, die in meiner Tabelle vorkommen.

Bis hierher ist alles OK, da muß nichts geändert werden.

Nun möchte ich aber, wenn ich auf einen Wert des Listenfelds doppelklicke, die vorhandene leere Tabelle „MA_MAI_selected_product“ füllen, und zwar mit einer Selection auf dem angeklickten Produkt.

Beispiel:

meine Ausgangstabelle mit Attributen MAI_product, a, b, c, d:

MAI_product a b c d

prod1 1 2 3 4
prod1 1 2 4 3
prod1 1 3 2 4
prod2 1 2 3 4
prod2 1 2 4 3

im Listenfeld wird also

prod1
prod2

angezeigt.

Nun doppelklicke ich auf prod1, und somit soll die Tabelle „MA_MAI_selected_product“ mit folgenden Werten gefüllt sein:

MAI_product a b c d

prod1 1 2 3 4
prod1 1 2 4 3
prod1 1 3 2 4

Das wars auch schon.

Das Formular ist also nur da, um eine Tabelle zu füllen.

Hoffe es ist einigermaßen klar, wiegesagt, genau so soll es funktionieren.

Du hast mir ja schon gesagt, wie ich das mit VBA machen soll, mein einziges Problem ist zur Zeit, so denke ich, wie ich einfach meine Abfrage in VBA ausgeführt bekomme, ohne daß es einen Fehler gibt.

Also wie schreibe ich meine Zeile

DELETE FROM MA_MAI_selected_product

INSERT INTO MA_MAI_selected_product

SELECT * from TEMP_MA_MAI_product WHERE MAI_product=„angewaehltes_Listenelement“

in VBA als String, der dann mit „DoCmd.RunSQL“ ausgeführt wird?

Was meinst du denn mit MDB schicken? Würd ich gerne machen, aber weiß nicht was ich schicken soll…

Vielen Dank nochmal,
Grüße aus München,

Carsten

Hallo Carsten,

ich brauch es eigentlich genau so, wie ich es schreibe.

aber dann doch nicht soooo dringend?

Du hast mir ja schon gesagt, wie ich das mit VBA machen soll,
mein einziges Problem ist zur Zeit, so denke ich, wie ich
einfach meine Abfrage in VBA ausgeführt bekomme, ohne daß es
einen Fehler gibt.

du kannst natürlich eine fertige Abfrage direkt ausführen:

docmd.openquery „Abfrage“

Also wie schreibe ich meine Zeile
DELETE FROM MA_MAI_selected_product
INSERT INTO MA_MAI_selected_product
SELECT * from TEMP_MA_MAI_product WHERE
MAI_product=„angewaehltes_Listenelement“
in VBA als String, der dann mit „DoCmd.RunSQL“ ausgeführt
wird?

hier der komplette Code:

Private Sub Liste3_DblClick(Cancel As Integer)
Dim SQL_löschen As String
Dim SQL_anfügen As String

SQL_löschen = „DELETE * FROM MA_MAI_selected_product;“
SQL_anfügen = „INSERT INTO MA_MAI_selected_product ( MAI_Produkt, a, b, c, d ) SELECT TEMP_MA_MAI_product.MAI_Produkt, TEMP_MA_MAI_product.a, TEMP_MA_MAI_product.b, TEMP_MA_MAI_product.c, TEMP_MA_MAI_product.d, * FROM TEMP_MA_MAI_product WHERE (((TEMP_MA_MAI_product.MAI_Produkt)=[Formulare]![MA_MAI_Product_Selection]![Liste3]));“

DoCmd.RunSQL SQL_löschen
DoCmd.RunSQL SQL_anfügen

End Sub

Was meinst du denn mit MDB schicken? Würd ich gerne machen,
aber weiß nicht was ich schicken soll…

ach weißt du, die Datenbank, also alle Tabelle, Abfragen, Formulare, Berichte etc. sind ja irgendwo gespeichert.

Wenn du mal deinen Explorer öffnest und dir die Dateiendung (vorausgesetzt du hast das auch eingeschaltet) ansiehst, wirst du feststellen, das diese MDB (=Microsoft Daten Bank) lautet.

Mit MDB meint man immer die Datenbank, wo alles drin ist …weil wir - faul wie wir sind - Abkürzungen liebend, das gerne kürzer schreiben.

Grüße aus Essen
Wolfgang

Hallo Wolfgang,

danke erstmal für deine letzte Hilfe.

Brauche es eigentlich schon einigermaßen dringend, aber zur Zeit kann ich einfach nicht so oft arbeiten, deswegen dauert es immer ein wenig bei mir…

Also, habe deinen Code verwendet, allerdings kommt folgender Fehler:

Incorrect syntax near „!“

Scheint an der Abfrage für den Wert aus dem Listenfeld zu liegen.

Kannst du mir da nochmal weiterhelfen?

Vielen Dank,

Grüße aus München

Carsten

Hallo Carsten,

Incorrect syntax near „!“

ändere das ! in .

[Formulare]![MA_MAI_Product_Selection].[Liste3]

Grüße aus Essen
Wolfgang

Hallo Wolfgang,

danke für deine Hilfe, habe es jetzt hinbekommen so wie ich es wollte.

Es gab nach deinem letzten Tip immer noch den gleichen Fehler, hab jetzt selber rumprobiert und mit folgendem Code hat es funktioniert:

Dim test As String
test = Me!Liste3

SQL_loeschen = „DELETE FROM TEMP_MA_MAI_selected_product;“
SQL_einfuegen = „INSERT INTO TEMP_MA_MAI_selected_product SELECT * FROM TEMP_MA_MAI_product WHERE (TEMP_MA_MAI_product.MAI_product)=“ & „’“ & test & „’;“

Viele Grüße aus München,

Carsten