MS Access 2000 / Visual Basic (lang)

Hallo

Ich habe einige Probleme mit einem Access-Projekt. Es geht um ein Projektmanagement. Dabei soll es für jedes Projekt eine eigene Datenbank geben. Die Datenbank enthällt drei Tabellen:
Tabelle ‚Schubladen‘ enthällt Personen oder Institutionen, mit denen bezüglich des Projekts Zusammenarbeit erfolgt.
Tabelle ‚Informationen‘ enthällt Umstände oder Merkmale, die mit verschiedenen Personen abgesprochen werden müssen.
Tabelle ‚Zuordnung‘ verknüpft die ersten beiden Tabellen und enthällt einen Kommentar, wie Information und Schublade in Bezug stehen.

Die Tabellen Schubladen und Informationen haben je eine Autoincrement-ID als Primärschlüssel, über diese IDs sind sie 1:n mit der Zuordnungstabelle verknüpft. Tabelle Zuordnung hat einen kombinierten Primärschlüssel aus den beiden IDs, um doppelte Zuordnungen zu verhindern (jede Information jeder Schublade nur einmal zugeordnet).

Die Schubladen-ID in der Zuordnungstabelle ist dabei ein zweispaltiges Kombinationsfeld und zeigt neben der Id noch den Schubladennamen an. Durch 0-Breite ist die ID unsichtbar gemacht.

Zur Verwendung existiert ein Formular mit den Informationen-Daten (1 Datensatz pro Seite) und den Zuordnung-Daten (Informations-ID ausgenommen) als Unterformular. So können die Informationen durchgeblättert werden, jeder Information können Schubladen mit Kommentar zugeordnet werden.

Problem 1: Nun kann durch den Primärschlüssel jeder Information jede Schublade nur einmal zugeordnet werden, aber im Schubladen-Dropdownfeld sind immer alle Schubladen zu sehen. Es sollen aber die bei dieser Information schon verwendeten Schubladen ausgeblendet werden.

Problem 2: Wenn ich mit Visual Basic ein Dropdownfeld dieses Formulars auslese, erhalte ich nicht den Schubladenname, sondern die Schubladen-Id. Um an den Name zu kommen, müsste ich eine Abfrage

SELECT name FROM Schubladen WHERE id=1

oder so durchführen. Wie geht das mit Visual Basic?

Problem 3: Einen Bericht kann ich mit

DoCmd.OpenReport Berichtsname, acViewPreview, , Filterbedingung

gefiltert öffnen. Bei DoCmd.OpenQuery fehlt das Argument für eine Filterbedingung. Wie kann ich eine Abfrage dennoch gefiltert öffnen?

Danke im Vorraus, ich hoffe ihr wisst weiter

Johannes Matschke

Hallo Johannes,

Problem 1: Nun kann durch den Primärschlüssel jeder
Information jede Schublade nur einmal zugeordnet werden, aber
im Schubladen-Dropdownfeld sind immer alle Schubladen zu
sehen. Es sollen aber die bei dieser Information schon
verwendeten Schubladen ausgeblendet werden.

bei Datenherkunft auf die drei kleinen … klicken und deine Abfrage entsprechend anpassen.

Problem 2: Wenn ich mit Visual Basic ein Dropdownfeld dieses
Formulars auslese, erhalte ich nicht den Schubladenname,
sondern die Schubladen-Id. Um an den Name zu kommen, müsste
ich eine Abfrage

SELECT name FROM Schubladen WHERE
id=1

oder so durchführen. Wie geht das mit Visual Basic?

nö, es reicht die Zweite SPALTE des Dropdownfeldes zu bekommen:

Info = me.dropdown.column(1)

Wichtig: gezählt wird ab 0
In deinem Fall:
Spalte 0 = ID (ausgeblendet)
Splate 1 = Information

Problem 3: Einen Bericht kann ich mit

DoCmd.OpenReport
Berichtsname, acViewPreview, , Filterbedingung

gefiltert
öffnen. Bei DoCmd.OpenQuery fehlt das Argument für eine
Filterbedingung. Wie kann ich eine Abfrage dennoch gefiltert
öffnen?

sorry, aber eine Abfrage IST DIE FILTERBEDINGUNG
D.h. du mußt IN DER ABFRAGE deine Bedingungen definieren.

Grüße aus Essen
Wolfgang

Hallo,

zu deinem Problem no3:
diesen Effekt kann man erreichen indem man dynamisch einer Query das SQL Statement zuweist.

Dazu legt man eine Abfrage in Access an (z.B. myQuery), egal wie die aussieht und auf welche Tabelle die sich bezieht.

Im VB(A) Code kann man dann mittels
db.QueryDefs(„myQuery“).SQL = "select * from myTable WHERE myOption = " & myValue
das SQL-Statement der Abfrage zuweisen, und anschliessend mit DoCmd.OpenQuery das Teil oeffnen, oder sogar noch weitergehen und diese Abfrage einem Formular oder Bericht als Recordsource setzten.

Hope this helps
Peter

Problem 3: Einen Bericht kann ich mit

DoCmd.OpenReport
Berichtsname, acViewPreview, , Filterbedingung

gefiltert
öffnen. Bei DoCmd.OpenQuery fehlt das Argument für eine
Filterbedingung. Wie kann ich eine Abfrage dennoch gefiltert
öffnen?

Danke im Vorraus, ich hoffe ihr wisst weiter

Johannes Matschke

Hallo

Problem 2 ist gelöst, Problem 3 werde ich demnächst probieren. Aber Nummer 1 macht mir immer noch Sorgen:

Tabelle Schubladen
 Nummer (Autoincrement)
 Schublade (Text)

Tabelle Zuordnung
 SNummer (Zahl, Kombinationsfeld)
 INummer (Zahl)

Die Datenherkunft des Kombinationsfeldes heißt zur Zeit

SELECT [Schubladen].[Nummer], [Schubladen].[Schublade] FROM Schubladen;

Das ist soweit ja auch richtig.
Wenn aber in einem Datensatz der Tabelle Zuordnung das Feld INummer schon ausgefüllt ist und das Dropdownmenu von SNummer aufgeklappt wird, dann sollen da nur die Schubladen angezeigt werden, die in keinem der anderen Datensätze gemeinsam mit der INummer des aktuellen Datensatzes auftauchen.

Also ungefähr so:

SELECT DISTICT [Schubladen].[Nummer], [Schubladen].[Schublade]
 FROM Schubladen, Zuordnung
 WHERE NOT ([Schubladen].[Nummer]=[Zuordnung].[SNummer]
 AND [Zuordnung].[INummer]=);

Wie muss die Datenherkunft richtig heißen? Ich bin in SQL nicht so bewandert.

Hallo Johannes,

Problem 2 ist gelöst,

sehr gut :smile:

Problem 3 werde ich demnächst probieren.

na dann mal ran … :smile:

Aber Nummer 1 macht mir immer noch Sorgen:

Tabelle

das Kombinationsfeldes heißt zur Zeit

SELECT
[Schubladen].[Nummer], [Schubladen].[Schublade] FROM
Schubladen;

Das ist soweit ja auch richtig.

ja, nur WO ist das Kombi-Feld? Auf einem Formular! Ok, und die Datenherkunft des Formulars ist was? Eine Tabelle! Welche?

Wenn aber in einem Datensatz der Tabelle Zuordnung das Feld
INummer schon ausgefüllt ist und das Dropdownmenu von SNummer
aufgeklappt wird, dann sollen da nur die Schubladen angezeigt
werden, die in keinem der anderen Datensätze gemeinsam mit der
INummer des aktuellen Datensatzes auftauchen.

also holst du dir erst mal die ID des Datensatzes des Formulars damit du weißt, welche Zuordnung du eigentlich brauchst. Wie haeißt denn dein Formular?

Also ungefähr so:

SELECT DISTICT [Schubladen].[Nummer], [Schubladen].[Schublade]
FROM Schubladen, Zuordnung
WHERE NOT ([Schubladen].[Nummer]=[Zuordnung].[SNummer]
AND [Zuordnung].[INummer]=);

schön, aber wo ist der Bezug zum geöffnenten Datensatz im Formular? Wie steht denn die Tabelle „Zuordnung“ in Bezug zur im Formular genutzten Tabelle?
Mit der jetztigen Abfrage fragst du Daten ab, die gar nicht vorhanden sein können!! Da du noch keine Schublade für den neuen Datensatz definiert hast, ist in der Tabelle „ZUORDNUNG“ logischer Weise auch KEIN Eintrag vorhanden!! Überdenke das noch mal!

Ich bin in SQL nicht so bewandert.

du mußt keinen einzigen SQL Befehl kennen, da es in Access einen Assistenten dafür gibt:

klicke am Ende der Datenherkunft des Kombifeldes auf die drei kleinen Punkte […] und der Assistent wird geöffnet.

Nun kanst du deine Bedingungen eintragen, und über Ansicht ggf. dir den SQL-String anzeigen lassen (wenn’s dich interessiert).

Da du auf Felder im Formular zugreifen mußt (INummer vermute ich mal)
kannst du beim Assistenten den Zauberstab (in der Symbolleiste) einsetzen um an diese Informationen zu kommen, wenn du den Syntax für Formularfelder nicht kennen solltest.

Grüße aus Essen
Wolfgang

Hallo

Also noch mal… :smile:
Ich habe zwei Tabellen:

Tabelle Schubladen
 Nummer (Autoincrement)
 Schublade (Text)

Tabelle Zuordnung
 SNummer (Zahl, Kombinationsfeld)
 INummer (Zahl)

Schzbladen.Nummer und Zuordnung.SNummer sind 1:n-verknüpft. Die Datenherkunft des Kombinationsfeldes Zuordnung.SNummer heißt zur Zeit

SELECT [Schubladen].[Nummer], [Schubladen].[Schublade] FROM Schubladen;

Das ist soweit ja auch richtig.

Die Tabelle Zuodnung wird für ein Unterformular verwendet, dass über Zuordnung.INummer (n:1 mit der ID des Hauptformulars verknüpft) an das Hauptformular angebunden ist. Deshalb ist davon auszugehen, dass Zuordnung.INummer immer ausgefüllt ist.

Wenn aber in einem Datensatz das Dropdownmenu von Zuordnung.SNummer aufgeklappt wird, dann sollen da nur die Schubladen angezeigt werden, die in keinem der anderen Datensätze von Zuordnung gemeinsam mit der INummer des Datensatzes, in dem das Dropdownmenu aufgeklappt ist, auftauchen.

Also ungefähr so:

SELECT DISTICT [Schubladen].[Nummer], [Schubladen].[Schublade]
 FROM Schubladen, Zuordnung
 WHERE NOT ([Schubladen].[Nummer]=[Zuordnung].[SNummer]
 AND [Zuordnung].[INummer]=);