[gelöst] Werteberechnung per Formular?

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

obrigada2000
Beiträge: 8
Registriert: Mi, 27.06.2012 13:49

[gelöst] Werteberechnung per Formular?

Beitrag von obrigada2000 »

Hallo zusammen!

Ich bin gerade dabei, eine Datenbank mit Nährwerten von Lebensmitteln zu erstellen.

Ziele dieser Datenbank:

1. Referenzprodukte mit Kalorien-, Kohlenhydraten-, Fettwerten eingeben (so wie man sie von den handelsüblichen Verpackungen ablesen kann, z.B. "100g enthalten 375 kcal, 52,9g Kohlenhydrate, 10,3g Fett,...".

- Erledigt durch das Erstellen einer Tabelle mit dem folgenden Inhalt:

ID [INTEGER] - Primärschlüssel
Produktname [VARCHAR]
Ref-Portion [FLOAT]
Ref-Einheit [VACHAR] - z.B. Gramm, Milliliter,...
Ref-Kalorien [FLOAT]
Ref-Kohlenhydrate [FLOAT]
Ref-Fett [FLOAT]

2. Eigene Portionswerte mithilfe der Daten der Referenzprodukte berechnen und im Formular anzeigen.

- Die Tabelle wurde erweitert um die folgenden Spalten:

WunschPort-Einheit [VARCHAR] - z.B. 1 Stück, Gramm, Milliliter, Scheibe,...
Wunsch-Ref-Port [FLOAT] - z.B. 1 Stück der Wunschportion entspricht so und so viel der Einheit der Referenzportion


- In einem Formular soll es letztendlich möglich werden, ein bestimmtes Produkt zu suchen, dort die eigene Wunschportion (z.B. 4 Stück) einzugeben und die Nährwerte unter Einbeziehung der Referenzwerte aus der Tabelle durch Base berechnen zu lassen. Wie lässt sich das bewerkstelligen?

- Berechnungen in einer Abfrage kommen als Möglichkeit offensichtlich nicht in Frage, da dort als Rechengrundlage bereits vorhandene Felder verwendet werden. Hier wird jedoch eine Variable, nämlich die Anzahl der Wunschportionen, erst von mir im Formular angegeben und soll nicht in der Tabelle gespeichert werden. Bleiben die Berechnungen via Formular. Ist das der richtige Ansatz? Wie funktioniert die Berechnung per Formular genau?

3. Portionswerte in Symbole, Broteinheiten und Fettkalorienprozente umrechnen.

- Hier sollen dann die errechneten Portionswerte aus Punkt 2 in Symbole (Kreise, Vierecke, Dreiecke), Broteinheiten und Fettkalorienprozente umgerechnet werden und im Formular angezeigt werden. Dem liegen natürlich bestimmte Umrechnungsverhältnisse zugrunde. Zunächst würde ich allerdings Punkt 2 abarbeiten wollen und wäre über Denkanstöße, Hinweise und Tipps dankbar.

Viele Grüße!

obrigada2000
Zuletzt geändert von obrigada2000 am Sa, 02.03.2013 11:57, insgesamt 1-mal geändert.
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Werteberechnung per Formular?

Beitrag von RobertG »

Hallo obrigada2000,

Berechnungen im Formular gehen nur über Makros. Da würde ich erst einmal die einfache Abfrage vorziehen.
Eine Abfrage kannst Du doch mit Werten au einer anderen Tabelle (in die Du Deinen Vorgabewert eingibst) speisen.
Beispiel:
Tabelle "Menge", Feld "ID" (Ja/Nein, Primärschlüssel), Feld "Menge" (Integer)
Tabelle "Referenz", Feld "ID", "Ref-Kalorien" usw, wie beschrieben.
Abfrage "Referenz_Menge": SELECT "Referenz"."Ref-Kalorien" * IFNULL("Menge"."Menge",0) AS "Kalorien" FROM "Referenz", "Menge" WHERE "Menge"."ID" = 1
Die Tabelle "Menge" hat in Deinem Formular ein Eingabefeld. Die Abfrage liegt in einem Subformular oder in einem Nebenformular. In dem gleichen Formular liegt ein Button, der die Abfrage aktualisiert (Eigenschaft des Buttons einstellen). Dieser Button sorgt gleichzeitig dafür, dass nach der Eingabe in das Eingabefeld der Wert in "Menge" geschrieben wird.
So hast Du keine Eingabe in Dein Formular, nur eine laufend wechselnde Eingabe in eine zusätzliche Tabelle und alles läuft.

Gruß

Robert
obrigada2000
Beiträge: 8
Registriert: Mi, 27.06.2012 13:49

Re: Werteberechnung per Formular?

Beitrag von obrigada2000 »

Hallo Robert!

Vielen Dank für deine Lösung! Es geht also doch per Berechnung innerhalb einer Abfrage. Auf die Idee, ein Boolean-Feld mit einem Primärschlüssel zu versehen, wäre ich nicht gekommen. Aber es reduziert die Eingabe in die Tabelle "Menge" auf eine einzige, nämlich die jeweilige Menge der Wunschportion. Prima! :D

Ich habe zunächst einmal die von dir vorgeschlagene zweite Tabelle angelegt, statt Integer im Feld "Menge" jedoch Float gewählt zwecks Eingabe von z.B. 0,5 Portionen. Dann habe ich mich an die Übersetzung des SQL-Befehls für die Abfrage gesetzt und noch Literatur gewälzt. Die Abfrage steht jetzt auch und wurde neben den eigentlichen Berechnungen für die Nährwerte der Wunschportionen noch um die Berechnungen für die Symbole usw. erweitert. Schließlich habe ich noch das Formular mit einem Hauptformular (Produktname, WunschPortEinheit) und zwei Subformularen (1. Menge; 2. Abfragefelder und Button) erstellt.

Im Probedurchlauf gab's dann allerdings kurzzeitig Probleme, da die Abfrage immer die Nährwerte für das erste Produkt berechnete, egal welchen Produktnamen ich eingab. Ich habe daher bei der Abfrage noch ein Feld "PRODUKTNAME" hinzugefügt und in den Eigenschaften des Abfrage-Subformulars dieses Abfragefeld mit dem gleichlautenden Feld der Tabelle "Referenz" verknüpft. Seither funktioniert es. Ich weiß nicht, ob das die sauberste Lösung für das Problem ist. Wenn nicht, gibt es dafür eine bessere Lösung?

Es ist nicht obligatorisch, aber gibt es eventuell ein Minimalmakro, mit dem ich die Menge der Wunschportion eingeben kann und durch die Betätigung der Return-Taste sofort das gewünschte Ergebnis erhalte, d.h. ohne den Zwischenschritt über den Auswerten-Button?

Vielen Dank nochmals und viele Grüße!

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

Re: Werteberechnung per Formular?

Beitrag von RobertG »

Hallo obrigada2000,

schau Dir einfach einmal den Einstieg zu Makros in dem entsprechenden Kapitel des Base-Handbuchs an. Da steht

Code: Alles auswählen

Automatisches Aktualisieren von Formularen
Oft wird in einem Formular etwas geändert und in einem zweiten, auf der gleichen Seite liegenden
Formular, soll die Änderung anschließend erscheinen. Hier hilft bereits ein kleiner Codeschnipsel
um das betreffende Anzeigeformular zu aktualisieren.
SUB Aktualisieren
Zuerst wird einmal das Makro benannt. Die Standardbezeichnung für ein Makro ist 'SUB'. Dies
kann groß oder klein geschrieben sein, Mit 'SUB' wird eine Prozedur ablaufen gelassen, die nach
außen keinen Wert weitergibt. Weiter unten wird im Gegensatz dazu einmal eine Funktion
beschrieben, die im Unterschied dazu Rückgabewerte erzeugt.
Das Makro hat jetzt den Namen "Aktualisieren". Um sicher zu gehen, dass keine Variablen von
außen eingeschleust werden gehen viele Programmierer so weit, dass sie Basic über 'Option
Explicit' gleich zu Beginn mitteilen: Erzeuge nicht automatisch irgendwelche Variablen
sondern nutze nur die, die ich auch vorher definiert habe.
Deshalb werden jetzt standardgemäß erst einmal die Variablen deklariert. Bei allen hier
deklarierten Variablen handelt es sich um Objekte (nicht z.B. Zahlen oder Texte), so dass der
Zusatz 'AS OBJECT' hinter der Deklaration steht. Um später noch zu erkennen, welchen Typ
eine Variable hat, ist vor die Variablenbezeichnung ein "o" gesetzt worden. Prinzipiell ist aber die
Variablenbezeichnung nahezu völlig frei wählbar.
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
Das Formular liegt in dem momentan aktiven Dokument. Der Behälter, in dem alle Formulare
aufbewahrt werden, wird als 'drawpage' bezeichnet. Im Formularnavigator ist dies sozusagen
der oberste Begriff, an den dann sämtliche Formulare angehängt werden.
Das Formular, auf das zugegriffen werden soll, ist hier mit den Namen "Anzeige" versehen. Dies ist
der Name, der auch im Formularnavigator sichtbar ist. So hat z.B. das erste Formular
standardmäßig erst einmal den Namen "MainForm".
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("Anzeige")
Nachdem das Formular jetzt ansprechbar gemacht wurde und der Punkt, an dem es
angesprochen wurde, in der Variablen 'oForm' gespeichert wurde, wird es jetzt mit dem Befehl
'reload()' neu geladen.
oForm.reload()
END SUB
Die Prozedur hat mit 'SUB' begonnen. Sie wird mit 'END SUB' beendet.
Dieses Makro kann jetzt z.B. ausgelöst werden, wenn die Abspeicherung in einem anderen
Formular erfolgt. Wird z.B. in einem Kassenformular an einer Stelle die Anzahl der Gegenstände
und (über Barcodescanner) die Nummer eingegeben, so kann in einem anderen Formular im
gleichen geöffneten Fenster hierdurch der Kassenstand, die Bezeichnung der Ware usw. nach
dem Abspeichern sichtbar gemacht werden.
In Dein Unterformular kommst Du, indem Du
oForm = oDrawpage.forms.getByName("Anzeige")
oSubForm = oForm.getByName("Unterformular")
schreibst. Das Unterformular musst Du aktualisieren.

Ich weiß jetzt nicht, ab das reicht, da mit dem Button gleichzeitig der Wert aus dem Eingabefeld abgespeichert wird. Dieser Schritt dürfte also noch fehlen - aber das steht entsprechend auch im Handbuch ...

Gruß

Robert
obrigada2000
Beiträge: 8
Registriert: Mi, 27.06.2012 13:49

Re: Werteberechnung per Formular?

Beitrag von obrigada2000 »

Hallo Robert!

Handbuch gefunden, Makro zusammengestellt, angewendet und es funktioniert. Wunderbar! :D
Hier das Ergebnis:

Sub Aktualisieren

DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
DIM SubForm1 AS OBJECT
DIM SubForm2 AS OBJECT

oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("MainForm")
SubForm1 = oForm.getByName("SubForm_1") - SubForm_1, das das Feld "Menge" enthält, wird angesprochen.
SubForm1.updateRow() - Die Eingabe in SubForm_1 wird nach Änderung gespeichert.
SubForm2 = oForm.getByName("SubForm_2") - SubForm_2, das alle Felder mit den Berechnungen der Abfrage enthält, wird angesprochen.
SubForm2.reload() - Alle Felder im Unterformular SubForm_2 werden aktualisiert.

End Sub

Ich hoffe, dass ich das Makro sauber angepasst und zusammengestellt habe. Ich muss gestehen, dass der Button eigentlich ausreichend gewesen wäre, wenn ich das Ergebnis vergleiche. Denn es ist eigentlich egal, ob ich mit der Maus den Button anklicke oder mit dem aktivierten Makro die Tab-Taste betätige. Ist also wohl reine Geschmackssache, denke ich. Aber so habe ich wieder eine Menge dazugelernt.

Vielen Dank auf jeden Fall für die Tipps und Hinweise!

obrigada2000
Antworten