Formular, Unterformular, Abfrage? (Anfänger)

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Passant
Beiträge: 2
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) 117 mal betrachtet

RobertG
*******
Beiträge: 1844
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) 1-mal heruntergeladen

Passant
Beiträge: 2
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: 1844
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) 2-mal heruntergeladen

Antworten