Seite 1 von 1
Formularfelder miteinander verknüpfen
Verfasst: Fr, 03.01.2014 20:55
von Cyklista
Hallo!
Ich bin gerade dabei, eine Datenbank für die Erfassung der Übersetzungsaufträge zu erstelen.
Ich möchte das Formular für die Eingabge von Aufträgen so einrichten, dass der Inhalt eines Feldes von zwei anderen Feldern abhängt. Konkret geht es darum, dass wenn ich die Felder "Kunde" und "Leistung" ausfülle, dann sollen die Felder "Preis" und "PreisKopie" automatisch ausgefüllt werden. Dabei soll auch die entsprechnde Preisstufe(1,2, oder 3) berücksichtigt werden.
z.B. Kunde A hat die Preisstufe 1, dann gelten für ihn in der Preisliste die Spalten "Preis1Original" "und Preis1Kopie"
Bei der Auswahl der Leistung "Schriftl. Übers. DE>PL" sollte in dem Feld "Preis" 20,00 und in dem Feld "PreisKopie" 5,00 automatisch erscheinen.
Ich weiß, dass dafür ein Makro notwendig ist. Den Anfang vermute ich, aber was weiter kommt, weiß ich nicht.
Code: Alles auswählen
SUB Preis_einfuegen
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
DIM oFeld1 AS OBJECT
DIM oFeld2 AS OBJECT
DIM oFeld3 AS OBJECT
DIM oFeld4 AS OBJECT
DIM dePreis AS DECIMAL ' ???
DIM dePreisKopie AS DECIMAL ' ???
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("MainForm")
oFeld1 = oForm.getByName("txtKunde")
oFeld2 = oForm.getByName("txtLeistung")
oFeld3 = oForm.getByName("fmtPreis")
oFeld4 = oForm.getByName("fmtPreisKopie")
' Weiter weiß ich nicht.
END SUB
Ich schicke die Datai mit, damit man sich besser vorstwlln kann, worum es sich handelt.
Für jeglich Hilfe bin ich sehr dankbar.
Przemek
Re: Formularfelder miteinander verknüpfen
Verfasst: Sa, 04.01.2014 01:28
von F3K Total
Hallo Przemek,
ich möchte dir den Tipp geben, dir zunächst einmal mehr Gedanken zur Aufteilung deiner Tabellen zu machen.
Schau mal hier nach, da steht was zur
Normalisierung.
Man schreibt z.B. in Datenbanken keine Preise (Preis1, Preis2, Preis3) nebeneinander, sondern in einer Tabelle immer schön untereinander.
Dann ordnet man sie über eine Verknüpfungstabelle z.B. Kunden, besser Aufträgen zu.
Erst, wenn die Struktur der Datenbank sauber organisiert ist, solltest Du anfangen die Formulare aufzubauen.
Nach meiner Einschätzung benötigst du
kein einziges Makro, um deine Daten schnell und sinnvoll zu erfassen und auch später auszuwerten.
Gruß R
Re: Formularfelder miteinander verknüpfen
Verfasst: Sa, 04.01.2014 11:10
von RobertG
Hallo Przemek,
wie R schon schrieb: der Datenbank fehlt irgendwie noch die Struktur. Bevor Du ein Formular zusammenbaust solltest Du zuerst einmal die Beziehungen zwischen den Tabellen klären. Mir ist der Ansatz klar, nach dem Du Preise in diesem Fall auch nebeneinander schreibst. Logischer wäre noch einfach eine Tabelle "Preisnachlass", damit Du nicht für alle möglichen verschiedenen Kombinationen die unterschiedlichen Wertigkeiten neu eingaben musst.
Unklar ist mir, was die Preisangabe bei der Tabelle "Aufträge" soll. Die Preise werden doch über die Preisstufe des jeweiligen Kunden berechnet, oder?
Hier einmal ein kurzes SQL-Beispiel, wie die Preise nach Preisstufe ermittelt werden könnten:
Code: Alles auswählen
SELECT "Leistung", CASE WHEN :Preisstufe = 1 THEN "Preis1Original" WHEN :Preisstufe = 2 THEN "Preis2Original" ELSE "Preis3Original" END AS "PreisOriginal" FROM "Preisliste"
Das ist eine zu Deiner bisherigen Struktur passende Parameterabfrage. Die Preisstufe wird hier von Dir zum Start der Abfrage eingegeben. Den Parameter kannst Du dann auch über die Kundentabelle ersetzen:
Code: Alles auswählen
SELECT "Kunden"."Id", "Preisliste"."Leistung", CASE WHEN "Kunden"."Preisstufe" = 1 THEN "Preisliste"."Preis1Original" WHEN "Kunden"."Preisstufe" = 2 THEN "Preisliste"."Preis2Original" ELSE "Preisliste"."Preis3Original" END AS "PreisOriginal" FROM "Preisliste", "Kunden"
Ein Makro ist hier jedenfalls nicht notwendig.
Gruß
Robert
Re: Formularfelder miteinander verknüpfen
Verfasst: Sa, 04.01.2014 13:59
von Cyklista
Vielen Dank für die Hinweise. Was die Datenbanken betrifft, bin ich ich ein totaler Anfänger. Den Artikel über die Normalisierung war sehr hilfreich, trotzdem sind für mich noch viele Sachen unklar. Ich weiß, dass meine Beispieldatenbank nicht vollkommen ist (einige Spalten in der Tabelle "Aufträge" sind bestimmt überflüssig), aber ich will mich an die Regel halten "einTema=eine Frage", deswegen konzentriere ich mich hier nur auf die Preise.
Mit dem Nachlass ist es (wahrscheinlich) nicht so richtig, weil die Prerisdifferenz bei verschiedenen Leistungen unterschiedlich ist. Im Prinzip ist es so, dass die Preisstufe 1 für Privatkunden und Firmen gelten sollte und die Preisstunfe 2 für Behörden (es können aber Ausnahmen vorkommen), Die Preisstufe 3 wird erstmal nicht benutzt und gilt nur als "Reserve".
Der Entgelt für den Auftrag wird nach folgendem Prinzip kalkuliert:
PreisXOriginal * SeitenAnz + PreisXKopie * SeitenAnz *("AnzDerExemp"-1)=Gesamt (d.h. der Preis für die erste Ausfertigung mal Seitenanzahl + Preis für die Kopie mal Seitenanzahl mal Anzahl der Zusatzexemplare).
Ich will aber die Möglichkeit behalten, bei der Auftragseingabe den Preis von Hand zu ändern, deswegen möchte ich, dass die Preise aus der Preisliste in dem Formular nach Eingabe des Kunden und der Leistung automatisch erscheinen.
EDIT:
Eigentlich brauche ich die Preise in der Tabelle "Auftraege" nicht abzuspeichern. Ich brauche sie nur für die Berechnung des Gesamtpreises.
Gruß
Przemek
Re: Formularfelder miteinander verknüpfen
Verfasst: Sa, 04.01.2014 15:43
von RobertG
Hallo Przemek,
in dem Fall musst Du dann auf jeden Fall eine entsprechende Abfrage machen.
Das entsprechende Abfrageergebnis musst Du dann in das entsprechende Feld des Formulars übertragen.
Als Feldtyp kannst Du SINGLE, DOUBLE oder CURRENCY nehmen - das sind in Basic die Bezeichnungen für Felder mit Nachkommastellen. Der Eintrag geht dann über oFeld.BoundField.upadteDouble(Abfrageergebnis). Damit wird das entsprechende Feld auf den Wert eingestellt, den Du aus der Abfrage ermittelt hast.
Wie Abfragen gehen kannst Du gegebenenfalls aus den Beispielen zum Handbuch ersehen. Formuliere aber zuerst einmal sicher die Abfrage, die Du auch brauchst, um wirklich nur den einen Datensatz zu erhalten.
Die aktuellen Beispieldatenbanken findest Du hier:
http://robert.familiegrosskopf.de/base_ ... /index.php
Das Beispiel "Fortlaufende_Nummer_Jahr.odb" dürfte zum Umbauen recht gut geeignet sein.
Wie willst Du das Makro einbinden? Wenn der Feldwert auch geändert werden soll, dann darfst Du es nur ausführen, wenn der Datensatz neu geschrieben wird. Du musst also an irgendeiner Eigenschaft des Formulars fest machen, dass der Datensatz neu ist. (IF oForm.rowInserted = TRUE THEN ...)
Gruß
Robert
Re: Formularfelder miteinander verknüpfen
Verfasst: Sa, 04.01.2014 23:17
von Cyklista
Noch mal vielen Dank!
Formuliere aber zuerst einmal sicher die Abfrage, die Du auch brauchst, um wirklich nur den einen Datensatz zu erhalten.
Das habe ich bereits geschafft!

:
Code: Alles auswählen
SELECT "PreisOriginal" FROM ( SELECT "Kunden"."Id", "Preisliste"."Leistung", CASE WHEN "Kunden"."Preisstufe" = 1 THEN "Preisliste"."Preis1Original" WHEN "Kunden"."Preisstufe" = 2 THEN "Preisliste"."Preis2Original" ELSE "Preisliste"."Preis3Original" END AS "PreisOriginal" FROM "Preisliste", "Kunden" WHERE "Kunden"."Id" = 'Krause' AND "Preisliste"."Leistung" = 'schriftl. Übers PL>DE' )
Jetzt muss ich noch die Abfrage in das Makro einfügen und die Werte 'Krause' und 'schriftl. Übers PL>DE' durch entsprechende Variabelen ("oFeld1" und "oFeld2", odetr?) ersetzen. Ich melde mich wieder, wenn ich soweit bin.
Das Beispiel "Fortlaufende_Nummer_Jahr.odb" dürfte zum Umbauen recht gut geeignet sein.
Diess Makro kenne ich, es wurde doch für mich ausgefertigt

Gruß
Przemek
Re: Formularfelder miteinander verknüpfen
Verfasst: Sa, 04.01.2014 23:50
von F3K Total
Hallo,
ich wollte es wissen, es geht,
ohne Makro, habe es ausprobiert.
Anbei eine Beispieldatei.
Im Formular
Kunden_Preisliste werden die Kunden und die Preise eingegeben
Das Formular
Auftragsverwaltung hat es in sich:

- Formularstruktur.png (56.6 KiB) 2530 mal betrachtet
Vorgehen zur Eingabe:
- Kunden wählen
- aktualisieren drücken
- Leistung wählen
- übernehmen drücken
- Beschreibung eingeben, ganz wichtig, mindestens einen Buchstaben!!!
- Datensatz neu anlegen drücken
Durch dieses Vorgehen, wird in der Tabelle
Auftraege ein neuer Datensatz angelegt, der den Kunden, die Leistung, die Preise, sowie das
aktuelle Datum enthält!
Ab jetzt geht es im zweiten Teil des Formulares,
Datensätze bearbeiten, weiter. Hier können die Stückzahlen usw. eingetragen werden,
sowie die Preise geändert werden. Am Ende Datensatz speichern drücken.
Ein weiteres nettes Ding: Wenn du im Listenfeld oben links
keinen Kunden wählst und auf
aktualisieren klickst, werden
alle Kunden angezeigt.
EDIT: war noch ein Fehler drin, musste noch einen Button
übernehmen einfügen, Datei ausgetauscht.
So viel Spaß damit
Gruß R
Re: Formularfelder miteinander verknüpfen
Verfasst: Mo, 06.01.2014 15:26
von Cyklista
Danke sehr! Ihr seid wirklich klasse!
Ich mus jetzt das alles ausprobieren und an meine Bedürfnisse anpassen.
EDIT:
Ich habe es noch mal mit dem Makro versucht. Das Makro scheint zu funktionieren (es wird jedenfalls keine Fehlermeldung ausgelöst), aber es trägt nur "0,00" ein.
Code: Alles auswählen
SUB Preis_einfuegen
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
DIM oFeld1 AS OBJECT
DIM oFeld2 AS OBJECT
DIM oFeld3 AS OBJECT
DIM doPreis AS DOUBLE ' ???
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("MainForm")
oFeld1 = oForm.getByName("txtKunde")
oFeld2 = oForm.getByName("txtLeistung")
oFeld3 = oForm.getByName("fmtPreis")
IF IsEmpty(oFeld3.getCurrentValue()) THEN
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
stSql = "SELECT ""PreisOriginal"" FROM ( SELECT ""Kunden"".""Id"", ""Preisliste"".""Leistung"", CASE WHEN ""Kunden"".""Preisstufe"" = 1 THEN ""Preisliste"".""Preis1Original"" WHEN ""Kunden"".""Preisstufe"" = 2 THEN ""Preisliste"".""Preis2Original"" ELSE ""Preisliste"".""Preis3Original"" END AS ""PreisOriginal"" FROM ""Preisliste"", ""Kunden"" WHERE ""Kunden"".""Id"" = (' + oFeld1 + ') AND ""Preisliste"".""Leistung"" = (' + oFeld2 + '))"
oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
WHILE oAbfrageergebnis.next
doPreis = oAbfrageergebnis.getDouble(1)
WEND
oFeld3.BoundField.updateDouble(doPreis)
END IF
END SUB
Kann mir jemand bitte sagen, wo der Fehler steckt?
Gruß
Przemek
Re: Formularfelder miteinander verknüpfen
Verfasst: Di, 07.01.2014 19:04
von Cyklista
Ich habe das Makro korrigiert, aber das Ergebnis ha sich nicht geändert: Es werden nur Nullen eingetragen.
Code: Alles auswählen
SUB Preis_einfuegen
DIM oDoc AS OBJECT
DIM oDrawpage AS OBJECT
DIM oForm AS OBJECT
DIM oFeld1 AS OBJECT
DIM oFeld2 AS OBJECT
DIM oFeld3 AS OBJECT
DIM doPreis AS DOUBLE ' ???
DIM stKunde AS STRING
DIM stLeist AS STRING
oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("MainForm")
oFeld1 = oForm.getByName("txtKunde")
oFeld2 = oForm.getByName("txtLeistung")
oFeld3 = oForm.getByName("fmtPreis")
stKunde = oFeld1.getCurrentValue()
stLeist = oFeld2.getCurrentValue()
IF IsEmpty(oFeld3.getCurrentValue()) THEN
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
stSql = "SELECT ""PreisOriginal"" FROM ( SELECT ""Kunden"".""Id"", ""Preisliste"".""Leistung"", CASE WHEN ""Kunden"".""Preisstufe"" = 1 THEN ""Preisliste"".""Preis1Original"" WHEN ""Kunden"".""Preisstufe"" = 2 THEN ""Preisliste"".""Preis2Original"" ELSE ""Preisliste"".""Preis3Original"" END AS ""PreisOriginal"" FROM ""Preisliste"", ""Kunden"" WHERE ""Kunden"".""Id"" = (' +stKunde+ ') AND ""Preisliste"".""Leistung"" = (' +stLeist+ ') )"
oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
WHILE oAbfrageergebnis.next
doPreis = oAbfrageergebnis.getDouble(1)
WEND
oFeld3.BoundField.updateDouble(doPreis)
END IF
END SUB
Re: Formularfelder miteinander verknüpfen
Verfasst: Di, 07.01.2014 19:19
von F3K Total
Obwohl ich dir den "Makro-Weg" nicht empfehle -> so gehts:
Code: Alles auswählen
stSql = "SELECT ""PreisOriginal"" FROM ( SELECT ""Kunden"".""Id"", ""Preisliste"".""Leistung"", CASE WHEN ""Kunden"".""Preisstufe"" = 1 THEN ""Preisliste"".""Preis1Original"" WHEN ""Kunden"".""Preisstufe"" = 2 THEN ""Preisliste"".""Preis2Original"" ELSE ""Preisliste"".""Preis3Original"" END AS ""PreisOriginal"" FROM ""Preisliste"", ""Kunden"" WHERE ""Kunden"".""Id"" = '" +stKunde+ "' AND ""Preisliste"".""Leistung"" = '" +stLeist+ "' )"
Gruß R
Re: Formularfelder miteinander verknüpfen
Verfasst: Di, 07.01.2014 20:19
von Cyklista
Danke für die schnelle Antwort!

Diese Schreibweise habe ich auch ausprobiert und es hat nicht geklappt, aber ich habe den Fehler gefunden: Bei Listenfeldern wird nicht unbedingt das gleiche in die Tabelle geschrieben, was angezeigt wird. In diesem Fall angezeigt wurde die Leistungsbeschreibung (Text) und geschrieben wurde die Id (Integer) .
Die Abfrage muss also so lauten:
Code: Alles auswählen
stSql = "SELECT ""PreisOriginal"" FROM ( SELECT ""Kunden"".""Id"" AS ""KId"", ""Preisliste"".""Id"", CASE WHEN ""Kunden"".""Preisstufe"" = 1 THEN ""Preisliste"".""Preis1Original"" WHEN ""Kunden"".""Preisstufe"" = 2 THEN ""Preisliste"".""Preis2Original"" ELSE ""Preisliste"".""Preis3Original"" END AS ""PreisOriginal"" FROM ""Preisliste"", ""Kunden"" WHERE ""Kunden"".""Id"" = '" +stKunde+ "' AND ""Preisliste"".""Id"" = '" +stLeist+ "' )"
Obwohl ich dir den "Makro-Weg" nicht empfehle
OK. Ich verstehe . Ich versuche erst und möchte auch dabei was lernen.
Gruß
Przemek