Formularfelder miteinander verknüpfen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Cyklista
***
Beiträge: 50
Registriert: Mo, 04.11.2013 23:34

Formularfelder miteinander verknüpfen

Beitrag 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
Dateianhänge
Auftr.odb
(15.25 KiB) 78-mal heruntergeladen
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Formularfelder miteinander verknüpfen

Beitrag 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
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Formularfelder miteinander verknüpfen

Beitrag 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
Cyklista
***
Beiträge: 50
Registriert: Mo, 04.11.2013 23:34

Re: Formularfelder miteinander verknüpfen

Beitrag 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
Zuletzt geändert von Cyklista am Sa, 04.01.2014 16:02, insgesamt 1-mal geändert.
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Formularfelder miteinander verknüpfen

Beitrag 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
Cyklista
***
Beiträge: 50
Registriert: Mo, 04.11.2013 23:34

Re: Formularfelder miteinander verknüpfen

Beitrag 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 :D
Gruß

Przemek
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Formularfelder miteinander verknüpfen

Beitrag 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
Formularstruktur.png (56.6 KiB) 2533 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
Dateianhänge
Aufträge_Preise_kopieren_ohne_Makro.odb
(25.96 KiB) 116-mal heruntergeladen
Cyklista
***
Beiträge: 50
Registriert: Mo, 04.11.2013 23:34

Re: Formularfelder miteinander verknüpfen

Beitrag 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
Cyklista
***
Beiträge: 50
Registriert: Mo, 04.11.2013 23:34

Re: Formularfelder miteinander verknüpfen

Beitrag 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
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Formularfelder miteinander verknüpfen

Beitrag 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
Cyklista
***
Beiträge: 50
Registriert: Mo, 04.11.2013 23:34

Re: Formularfelder miteinander verknüpfen

Beitrag 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
Antworten