Formular, Unterformular, Abfrage? (Anfänger)

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Passant
Beiträge: 4
Registriert: Fr, 22.05.2020 19:06

Formular, Unterformular, Abfrage? (Anfänger)

Beitrag von Passant »

Hallo zusammen, ich bin Ralf, fange gerade an, mich mit Base zu beschäftigen und hoffe, von euch ein paar Tipps zu bekommen.

Ich möchte eine Kundendatenbank aufbauen. Fernziel ist es, daraus eine Tourenplanung zu erstellen. Sie besteht zur Zeit aus einer einzigen Tabelle, in der zu jedem Kunden alle notwendigen Daten vorhanden sind. Ich habe mir ein Formular erstellt, in dem ich neue Kunden anlegen kann. Das war für mich noch einfach machbar.

Jetzt wird es aber komplizierter: Ich möchte im Prinzip genau so ein Formular, daß mir alle Daten des jeweiligen Kunden in Feldern anzeigt. Die Daten sollen hier aber nur angeschaut und nicht verändert werden. Ganz oben möchte ich eine, oder auch mehrere Kundennummern eingeben können, darunter sollte dann eine Liste mit diesen Kunden erscheinen und wenn ich auf einen dieser Kunden klicke, sollen darunter alle seine Daten (auch Bilder) in den Feldern erscheinen, so wie ich das schon bei dem vorhandenen Formular, zum Anlegen der Kunden habe.

Könntet ihr mir grob sagen, wie ich da vorgehen muß? Ich weiß, daß ich eine Abfrage erstellen muß und Unterformulare, aber welches ist das Formular und welches soll das Unterformular sein? Wie starte ich mit einem Button die Abfrage, mit den Kundennummern, die ich oben eingegeben habe, damit die darunter in der Liste angezeigt werden, und dann darunter der Kunde, den ich in der Liste angeklickt habe?

Ich hoffe, das ist halbwegs nachvollziehbar. Habe mal eine Skizze gemacht, wie das ungefähr aussehen soll. Ist das so überhaupt machbar?
Formular-Skizze.jpg
Formular-Skizze.jpg (33.75 KiB) 336 mal betrachtet

RobertG
*******
Beiträge: 1847
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Formular, Unterformular, Abfrage? (Anfänger)

Beitrag von RobertG »

Hallo Passant,

ich würde das so lösen, dass ich zuerst einmal eine Tabelle "Filter" mit einem Feld "KdNr" als einzigem Feld (Primärschlüssel).

Jetzt benötigst Du eine Abfrage, die diese Tabelle auswertet. Das geht am besten, indem Du den Editor startest, Deine Tabelle "Kunden" aussuchst und alle Felder mit dem * als ausgewählt markierst. Dann gehst Du aus dem Designmodus in den SQL-Modus über und ergänzt die Abfrage mit

Code: Alles auswählen

WHERE "ID" IN (SELECT "KdNr" FROM "Filter")
Jetzt werden über die Abfrage nur noch die Kunden angezeigt, die in der Filter-Tabelle stehen.

Das Formular geht dann so:
Lass zuerst einfach den Assistenten laufen. Wähle für das Hauptformular die Abfrage aus, wähle dann für das Unterformular die Kundentabelle aus. Im Hauptformular hast Du von Deinem Design her ein Tabellenkontrollfeld und im Unterformular Einzelfelder.
Wenn der Assistent durchgelaufen ist kannst Du das Formular weiter bearbeiten.
Verschiebe zuerst den gesamten Inhalt etwas nach unten.
Suche den Formularnavigator auf.
Erstelle ein neues Formular neben dem bestehenden Formular, das beim Assistenten immer MainForm heißt.
Wähle als Datenbasis für dieses Formular die Tabelle "Filter".
Dieses Formular braucht nur ein Eingabefeld, nämlich das Feld für "KdNr".
Das Einzige, was Du jetzt noch brauchst, ist ein Button.
Diesen Button positionierst Du zwar neben das neu erstellte Eingabefeld. Der Button selbst soll aber im Formular MainForm erstellt werden.
Bei den Aktionen für diesen Button wählst Du "Formular aktualisieren".

Wenn Du das alles geregelt bekommst, dann hast Du ein Formular, das Deinen Wünschen entspricht.
Der Inhalt des Feldes "KdNr" wird dadurch abgespeichert, dass Du das Formular "Filter" verlässt und einen Button in einem anderen Formular betätigst. Anschließend löst dieser Button die Aktualisierung des Formulars aus, das den gerade eingegebenen Filterwert zur Anzeige benötigt.

Im Unterformular werden die Daten des gerade aktiven Datensatzes des Hauptformulars angezeigt.

Das ist für den Anfang etwas viel. Du kannst aber jederzeit hier wieder nachfragen.

Die Eingabe in nur ein Feld für die verschiedenen KdNr ist leider nicht ohne Makro auswertbar. Deswegen habe ich ein Tabellenkontrollfeld zum Filtern eingebaut.

Gruß

Robert
Dateianhänge
Filter_In.odb
(12.67 KiB) 2-mal heruntergeladen

Passant
Beiträge: 4
Registriert: Fr, 22.05.2020 19:06

Re: Formular, Unterformular, Abfrage? (Anfänger)

Beitrag von Passant »

Hallo Robert,

vielen, vielen Dank, für diese super Anleitung und auch für die Beispiel-DB! Habe es damit jetzt hinbekommen und das Formular ist genau so wie ich es mir vorgestellt hatte :-)

Ein paar Details würde ich aber gerne noch ändern:
Das "Tabellen-Steuerelement", in dem ich die Kd-Nummern eingebe, zeigt hinter den Nummern 2 Dezimalstellen an. Kann man das Format dieser Felder ändern?

Ich habe einen Button hinzugefügt, mit dem ich die eingegebenen Nummern einzeln löschen kann. Vor jedem Löschen kommt aber eine Nachfrage, die ich bestätigen muß, kann man die irgendwie umgehen?

Gibt es eine Möglichkeit, das Formular automatisch zu aktualisieren, z.B. wenn ich eine Nummer eingegeben habe und dann mit der Tab-Taste zum nächsten Feld springe?

RobertG
*******
Beiträge: 1847
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Formular, Unterformular, Abfrage? (Anfänger)

Beitrag von RobertG »

Hallo Passant,
Passant hat geschrieben:
Sa, 23.05.2020 21:08
Das "Tabellen-Steuerelement", in dem ich die Kd-Nummern eingebe, zeigt hinter den Nummern 2 Dezimalstellen an. Kann man das Format dieser Felder ändern?
Öffne das Formular zum Bearbeiten, nicht zur Eingabe von Daten. Gehe mit der Maus auf den Tabellenkopf "Kd-Nummern" - rechte Maustaste → Spalte → Nachkommastellen → '0'
Passant hat geschrieben:
Sa, 23.05.2020 21:08
Ich habe einen Button hinzugefügt, mit dem ich die eingegebenen Nummern einzeln löschen kann. Vor jedem Löschen kommt aber eine Nachfrage, die ich bestätigen muß, kann man die irgendwie umgehen?
Ich weiß so keine andere Möglichkeit als das direkte Ansteuern mit einem Makro:

Code: Alles auswählen

SUB Loeschen(oEvent AS OBJECT)
	oForm = oEvent.Source.Model.Parent		
	IF oForm.getRow > 0 THEN
		oForm.deleteRow
		iRow = oForm.getRow
		oForm.Reload
		oForm.Absolute(iRow)
	END IF
END SUB
Den Button stellst Du auf Aktion → Keine und gehst dann zu den Ereignissen → Aktion ausführen. Das Makro muss damit verbunden werden.
Wie Makros prinzipiell erstellt werden weißt Du? (Extras → Makros ...)
Passant hat geschrieben:
Sa, 23.05.2020 21:08
Gibt es eine Möglichkeit, das Formular automatisch zu aktualisieren, z.B. wenn ich eine Nummer eingegeben habe und dann mit der Tab-Taste zum nächsten Feld springe?

Code: Alles auswählen

SUB Aktualisieren
	oDoc = thisComponent
	oDrawpage = oDoc.Drawpage
	oForm = oDrawpage.forms.getByName("MainForm")
	oForm.reload()
END SUB
Das ist jetzt die Möglichkeit, das Formular zu aktualisieren, das die Bezeichnung "MainForm" hat und als Hauptformular erstellt wurde. Das packst Du in die Formulareigenschaften des Formulars "Filter" - da, wo Deine Eingaben zum Filtern drin sind. Ereignisse → Nach der Datensatzaktion.
Dann kannst Du Dir natürlich den Button zum "Speichern" sparen. Das passiert ja sowieso, sobald Du den Datensatz verlässt und dann läuft das Aktualisieren automatisch.
Ich habe das einmal mit Definition der Variablen in die Beispieldatenbank eingefügt.

Gruß

Robert
Dateianhänge
Filter_In.odb
(13.84 KiB) 3-mal heruntergeladen

Passant
Beiträge: 4
Registriert: Fr, 22.05.2020 19:06

Re: Formular, Unterformular, Abfrage? (Anfänger)

Beitrag von Passant »

Hallo Robert,

vielen Dank für die Makros, die funktionieren perfekt :-)

War in den letzten Tagen unterwegs und habe die "DB" mal getestet. Das Formular, bei dem du mir geholfen hast, hat sich dabei als praxistauglich herausgestellt, das Formular zum Eingeben der Kundendaten, das ich vorher selber erstellt hatte, leider nicht. Ich kann zwar die Daten eingeben, es fehlt aber jede Suchfunktion, um z.B. Daten von bestimmten Kunden zu ändern, oder nachzutragen, was relativ häufig notwendig ist, wie ich feststellen mußte.

Das Formular besteht nur aus den Datenfeldern, die als Datenquelle die Kundentabelle haben. Kann ich hier nachträglich mit einem Unterformular eine Suche einbauen, bei der ich nach mehreren beliebigen Feldern mit "und", bzw. auch nur nach einzelnen Feldern der Kundendaten suchen kann? Also z.B. nur nach Name, oder z.B. auch nach "Name und Ort", oder "Name und Tour"? Bei der mir dann, wie in dem anderen Formular, die Ergebnisse in einer Liste angezeigt werden, die ich dann einzeln anklicken kann und im Hauptformular angezeigt bekomme?

Das könnte ich dann selber entsprechend dem anderen Formular zusammenbauen, nur bei den Makros habe ich überhaupt keine Vorstellung, wie die funktionieren und würde mich über Hilfe von dir sehr freuen.

Passant
Beiträge: 4
Registriert: Fr, 22.05.2020 19:06

Re: Formular, Unterformular, Abfrage? (Anfänger)

Beitrag von Passant »

Hallo Robert,

damit ich bei dem Formular nicht von vorne anfangen mußte, habe ich jetzt einfach mal das Formular, bei dem du mir geholfen hast, kopiert und dafür eine neue Filter-Tabelle erstellt, die jetzt neben der Kundennummer, den Nachnamen, die Postleitzahl, den Ort, das Bundesland und die Tournummer enthält.

Die Herausforderung für mich ist jetzt gar nicht die Makros zu erstellen, die Makros von dir werden hier ja genauso funktionieren, sondern die entsprechende Abfrage, bei der ich entweder nach einzelnen dieser Felder suchen kann, oder Kombinationen mehrerer Felder, also z.B. nach allen Kunden mit der Tournummer 1, oder alle Kunden in Berlin, oder aber auch z.B. nach allen Kunden mit dem Namen Müller in München.

Würde mich sehr freuen, wenn du mir bei der Abfrage helfen könntest.

EDIT2:
Komme leider nicht weiter: Mein Ziel ist es ja, daß von den 6 Suchfeldern im Formular, nur die berücksichtigt werden, die einen Inhalt haben und mit "UND" verknüpft werden. Hat z.B. nur ein Feld einen Inhalt, sollen alle anderen Felder ignoriert werden. Je mehr Felder ich eingebe, um so mehr sollen die möglichen Treffer eingeschränkt werden.

Ich glaube, daß ich dazu zuerst prüfen muß, ob ein Feld einen Inhalt hat. Im Handbuch habe ich dazu den SQL-Befehl EXISTS gefunden. Wenn ich in der Abfrage diesen Code eingebe:

Code: Alles auswählen

SELECT "Kd-Nr", "Firma", "Postleitzahl", "Ort", "Tour", "Bundesland" FROM "tbl_Kunden" WHERE EXISTS (SELECT "tempKd-Nr" FROM "tbl_KdFilter2" WHERE "tbl_KdFilter2"."tempKd-Nr" = "tbl_Kunden"."Kd-Nr")
dann macht er genau das was ich möchte: wenn eine Kundennummer im Suchfeld des Formulars eingegeben wurde, gibt er die entsprechenden Daten des Kunden aus. Wenn das Feld keinen Inhalt hat, dann wird auch nichts ausgegeben.

Wenn ich das jetzt aber z.B. mit dem Feld für den Firmennamen erweitere:

Code: Alles auswählen

AND EXISTS ( SELECT "tempFirma" FROM "tbl_KdFilter2" WHERE "tbl_KdFilter2"."tempFirma" = "tbl_Kunden"."Firma" )
dann verknüpft er die beiden Felder zwar mit UND, so wie ich es möchte, wenn aber nur eines der beiden Felder einen Inhalt hat, wird es nicht ignoriert, sondern es gibt gar keine Ergebnisse. EXIST scheint also nicht so zu funktionieren, wie ich es erhofft habe. Alle Versuche mit NULL, NOT NULL sind leider auch gescheitert. Ich bräuchte eine Bedingung, wie: Wenn das Feld leer ist, dann ignoriere es. Gibt es das in SQL nicht?

RobertG
*******
Beiträge: 1847
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Formular, Unterformular, Abfrage? (Anfänger)

Beitrag von RobertG »

Ich versuche das einmal direkt an Deinem Code:

Code: Alles auswählen

SELECT "Kd-Nr", "Firma", "Postleitzahl", "Ort", "Tour", "Bundesland" FROM "tbl_Kunden" WHERE EXISTS (SELECT "tempKd-Nr" FROM "tbl_KdFilter2" WHERE "tbl_KdFilter2"."tempKd-Nr" = "tbl_Kunden"."Kd-Nr")
Reicht da nicht:

Code: Alles auswählen

SELECT * FROM "tbl_Kunden" WHERE "Kd_Nr" = (SELECT "tempKd-Nr" FROM "tbl_KdFilter2")
... oder hat Deine Filtertabelle mehr als einen Datensatz?
Und wenn dann der Wert in der Filtertabelle leer sein sollte:

Code: Alles auswählen

SELECT * FROM "tbl_Kunden" 
WHERE "Kd_Nr" = COALESCE((SELECT "tempKd-Nr" FROM "tbl_KdFilter2"),"Kd_Nr")
Damit müsste dann alle Dateen mit Eintrag bei der "Kd_Nr" ausgegeben werden, wenn in der Filtertabelle kein Eintrag steht.
Und jetzt die Firma dazu:

Code: Alles auswählen

SELECT * FROM "tbl_Kunden" 
WHERE "Kd_Nr" = COALESCE((SELECT "tempKd-Nr" FROM "tbl_KdFilter2"),"Kd_Nr") 
AND "Firma" = COALESCE((SELECT "tempFirma" FROM "tbl_KdFilter2"),"Firma")
Es gibt also nicht einfach die Bedingung: Wenn das Feld NULL ist, dann ignoriere es, sondern wenn das Feld NULL ist, dann nimm einen anderen Wert zum Vergleich.

Schau Dir dazu einmal in dem Kapitel "Datenbank-Aufgaben" das Unterkapitel "Datenfilterung" an.

Antworten