Listenfeld Eintrag als Abfrage nutzen

Hallo liebe Experten,

ich habe ein Problem mit der SQL Programmierung in Access.

Zuerst das Problem:
Ich habe in Access eine Tabelle (Firma) die sieht etwa so aus

Monat Abteilung Wert
Januar A 2,5
Januar T 4,3
Februar D 5
Februar E 1,1
März H 3
März B 2,0

Usw.

Dann habe ich dazu ein Formular (Firma), welches ein Kombinationsfeld (Monat), ein Button und ein Listenfeld (Abteilung) beinhaltet.

In dem Kombinationsfeld sind die Monate aufgelistet, woraus man einen Monat auswählen kann. In dem darunterliegenden Listenfeld sollen dann die Daten aufgezeigt werden. D.h. wenn ich den Monat „Januar“ auswähle soll unten im Listenfeld es so aussehen:

Abteilung Wert
A 2,5
T 4,3

Die Tabelle hat zwar mehrere Einträge für jeden Monat, aber das ist ja trivial.

Ich habe auch schon einen Code gefunden, der dies filtert und in eine Tabelle (Zwischenwerte_Firma) ablegt. Das untere Listenfeld übernimmt dann die Daten aus dieser Tabelle. Der Button ist nur dazu da, um das Formular zu schließen und wieder zu öffnen, damit die Daten aktualisiert werden. Dadurch ist zwar der Eintrag des ausgewählten Monats „Januar“ im Kombinationsfeld nicht mehr da, aber das ich ein kleineres Problem. Mein Problem ist es, dass wenn ich einen Zeitpunkt ausgewählt habe, dass dann eine Massage-Box mich auffordert, noch einmal den Monat einzugeben, und dies soll nicht vorkommen.

Hier erst mal der Code:

Private Sub Monat_AfterUpdate()
DoCmd.SetWarnings (0)

Dim SQL_löschen As String
Dim SQL_anfügen As String

SQL_löschen = „DELETE*FROM Zwischenwerte_Firma;“
SQL_anfügen = „INSERT INTO Zwischenwerte_Firma (Abteilung, Wert )SELECT Firma.Abteilung, Firma.Wert FROM Firma WHERE(((Firma.Monat)=[Formular]![Firma].[Monat]));“

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

Monat.Requery

DoCmd.SetWarnings (-1)

End Sub

Weil in der Massage-Box folgendes angezeigt wird “ Formular!Firma.Monat“ gehe ich davon aus, dass der Fehler bzw. die Ursache an der WHERE Bedingung liegen muss.

Aber ich kenne mich mit SQL nicht aus, und ich habe es nicht hinbekommen den Code so zu verändern, dass die Box weg ist und, dass die Funktion auch noch funktioniert.

Falls jemand eine Antwort oder Hilfestellung hat, wäre ich sehr dankbar. Ich suche schon lange und verzweifele langsam.

Danke im voraus.

Hallo Sabrina,

  1. Funktioniert das mit dem DELETE ? Ich kenne SQLs die verlangen bei DELETE ein WHERE …
    Aber Du hast ein Problem mit Deinem INSERT … die korrekte Syntax lautet:
    INSERT INTO tabellenname (feldname1, feldname2 …) VALUES (wert1, wert2 …)
    Du möchtest aber wahrscheinlich aus einer Tabelle Werte lesen und sie in die neue Tabelle übertragen …
    Dies geht so:
    SELECT * INTO tabelle_schreiben FROM tabelle_lesen

Gruß
Klaus

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Klaus,
ersteinmal danke dass du mir hilfst.

Aber was meinst du denn mit wert1, wert2,… ?
Die Feldnamen sind klar in meinem Fall (Abteilung, Wert).

Außerdem Wert aus einer Tabelle zu lesen oder in eine andere einzufügen funktioniert, das ist nicht das Problem, sondern wegen der Abfrage des Listenfeldes. Es sollen ja alle Daten die zum ausgewählten Monat gehören in die neue Tabelle gespeichert werden.

Ich weiß leider nicht wie man in SQL folgende Anweisung schreibt:
suche in der Tabelle Firma im Feldnamen Monat nach dem Monat, den man im Listenfeld ausgesucht hat und schreibe alle dazugehörigen Datensätze mit den Feldnamen Abteilung und Wert in die Tabelle Zwischenwerte_Firma.

Dies ist mein eigentliches Problem, aber vielleicht habe ich deine Antwort auch falsch verstanden oder wir reden aneinander vorbei.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Sabrina,
nein glaube ich nicht dass wir aneinander vorbeireden, ich habe nur die Allgemeinsyntax hingeschrieben …
In Deinem Fall müsste es heissen:

SELECT INTO zwischenwerte\_firma
 FROM firma 
 WHERE monat = listfeldmonat (wobei ich nicht weiss wie das Feld im Listbild heisst)

Ich hoffe dass die Syntax so korrekt ist.
Hat denn das Tabelleleeren vorher geklappt ?
Viel Erfolg
Klaus

Hallo,
sorry das ich mich erst so spät melde, aber ich habe diese Aufgabe erst einmal verworfen und hatte andere Sachen zu tun.

Ich habe es mal ausprobiert aber leider klappt es nicht. Alles was ich hinter dem „=“ in der WHERE Bedingung einfüge kommt als Text in der Parameterabfrage in der Massagebox.

Was meinst du denn mit „Hat denn das Tabelleleeren vorher geklappt?“?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,
sorry das ich mich erst so spät melde, aber ich habe diese
Aufgabe erst einmal verworfen und hatte andere Sachen zu tun.

Ich habe es mal ausprobiert aber leider klappt es nicht. Alles
was ich hinter dem „=“ in der WHERE Bedingung einfüge kommt
als Text in der Parameterabfrage in der Massagebox.

Was meinst du denn mit „Hat denn das Tabelleleeren vorher
geklappt?“?

Ei Sabrina,
Du musst den SELECT auch so zusammensetzen, dass er später - je nachdem was in der Auswahlbox „Monat“ steht - passt.
Wie das Listfeld heisst weiss ich nicht.
Also etwa so:
SQL = "SELECT INTO zwischenwerte_firma
FROM firma
WHERE monat = " & Listbox.Text
und diesen SQL-String dann auf die Datenbank loslassen …

Und Du hattest zu Beginn was von Tabelleleeren geschrieben glaube ich mich zu erinnern …

Gruß
Klaus

Hallöchen,
ich weiß ich bin ein schwerer Fall.

Ich habe deinen Code übernommen, aber jetzt bekomme ich die Fehlermeldung, dass ein INSERT oder DELETE erwartet wird.

Meine Listenbox heißt Monat, also wenn das Listenfeld damit gemeint ist. Und mit Text meinst du doch Januar oder Februar oder so?

Ich habe den Code eingefügt, war dies richtig? Oder mal wieder komplett falsch?
SQL = „SELECT INTO Zwischenwerte_Firma FROM Firma WHERE Monat = Monat.Oktober 05;“

Sorry aber ich steh wohl gehörig auf dem Schlauch.
Danke dass du so eine Geduld mit mir hast.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ei Sabrina,
Du hast ja das Listenfeld, das heisst monat.
Und Du hast eine Datenbank die bereits eine Tabelle enthält, die heisst Firma.
Und Du willst einige Werte von Firma in eine Tabelle Zwischenwerte_firma schreiben.
Welche das sind möchtest Du über ein Extra-Fenster auswählen können (Feld Monat).
Ich glaube das war die Aufgabenstellung.
Jetzt ist ja so, dass in dieser Tabelle Zwischenwerte_firma bereits Datensätze enthalten sein können.
Also musst Du diese ggf. leeren, wenn Du nur Werte dieses einen Monats nach dem ominösen SELECT INTO haben möchtest.
Du hast also 2 SQL-Statements.
Aber das mit dem Leeren scheint ja bereits zu funktionieren, kommen wir zum zweiten.
Der SQL-Befehl zum Einfügen lautet:
„SELECT * INTO Zwischenwerte_firma FROM firma WHERE monat = 11“
oder
„SELECT * INTO Zwischenwerte_firma FROM firma WHERE monat = 2“
oder
„SELECT * INTO Zwischenwerte_firma FROM firma WHERE monat = 7“
oder oder oder …
Du siehst: Du musst den Inhalt Deiner Auswahlbox (monat.text) in Deinen SQL bringen.
Wie machst Du das ?
Du definierst ein Textfeld sSQL:
DIM sSQL as STRING
Du füllst das Feld sSQL:
sSQL = "SELECT * INTO Zwischenwerte_firma FROM firma WHERE monat = " & monat.text
Wenn Du Dir nun - wenn das geht - im Debugger den Wert für sSQL ansiehst, wird er so aussehen wie oben beschrieben.
Nun musst Du den SQL-Befehl auf die Datenbank loslassen:
Vielleicht geht das so:
DoCmd.RunSQL sSQL

Vielleicht kann es Probleme geben, wenn die Tabelle zwischenwerte_firma bereits existiert, denn dies ist eine Tabellenerstellungsabfrage, aber nur vielleicht - ausprobieren.
Dann müsstest Du mit dem Befehl/den Befehlen „IF EXISTS DROP TABLE zwischenwerte_firma“ die Tabelle ganz löschen, die Tabellenerstellungsabfrage legt die Tabelle neu an mit der Struktur von firma.
Ich hoffe ich schreibe nicht zu kompliziert oder zu einfach …
Schreib mir bitte obs geklappt hat …

Hallo erst einmal frohes neues Jahr.

Leider klappt es noch nicht so ganz. Es wird mir ein Fehler angezeigt, dass „Delete“, „Insert“, „Select“ oder „Update“ erwartet wird.

Dabei habe ich eine Zeile mit sSQL =„DELETE*FROM Zwischenwerte_firma:“
und eine zweite mit sSQL=„SELECT*INTO Zwischenwerte_firma FROM firma WHERE monat = & monat.text;“

Ich habe auch mal statt text Januar eingetragen, aber das ergibt die selbe Fehlermeldung.

Außerdem hast du geschrieben "Welche Werte das sind möchtest Du über ein Extra-Fenster auswählen

können (Feld Monat)."

Das ist aber nicht korrekt. Bisher ist es ja so, dass ich die Eingabe des gewünschten Monats nochmal in einer Box eingeben muss, also ein extra Fenster, welches sich öffnet. Aber ich will die Auswahl nur in dem Kombinationsfeld „monat“ im Formular haben. Falls du als Box das Kombinationsfeld meintest, dann vergess diesen Absatz einfach.

Vielleicht gehen meine Anforderungen auch nicht ohne Box, wo die Abfrage stattfindet!?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]