❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱


❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[gelöst] Formular zur Dateneingabe: Feld mit Wert des letzten Datensatztes vorbelegen - Makro? & Fokus setzen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
EinsamerBaumWald
Beiträge: 31
Registriert: Fr 28. Nov 2014, 20:41

[gelöst] Formular zur Dateneingabe: Feld mit Wert des letzten Datensatztes vorbelegen - Makro? & Fokus setzen

Beitrag von EinsamerBaumWald » Sa 27. Aug 2016, 01:56

Hallo,

ich würde gerne das Feld eines Formulars zur Dateneingabe mit dem Wert dieses Feldes des letzten Datensatzes vorbelegen. Wie geht das? Hat jemand entsprechenden Makro-Code parat?

Ich baue an einem Lagerbuch und inventarisiere Säcke, die Chargennummer bleibt dabei für die Säcke eines Tages gleich. Die möchte ich nicht jedes Mal wieder eingeben müssen, sondern nur wenn sie sich geändert hat.

War das verständlich?

Vielen Dank!
Zuletzt geändert von EinsamerBaumWald am Di 30. Aug 2016, 21:58, insgesamt 1-mal geändert.

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Formular zur Dateneingabe: Feld mit Wert des letzten Datensatztes vorbelegen - Makro?

Beitrag von RobertG » Sa 27. Aug 2016, 09:38

Hallo EinsamerBaumWald,

Du brauchst mindestens zwei Tabellen. Wenn nämlich häufig Datum und Chargennummer gleich sind, dann sollte das in einer anderen Tabelle gespeichert werden und nur die laufenden Änderungen in der Ursprungstabelle. In der Ursprungstabelle wird dann ein Fremdschlüsselfeld für die Tabelle erstellt, die Datum und Chargennummer enthält. Die Tabelle für Datum und Chargennummer gehört ins Hauptformular, die andere Tabelle ins Unterformular. So werden alle Datensätze, die Du im Unterformular eingibst, der Chargennummer und dem Datum des Hauptformulars zugeordnet. Gibst Du im Hauptformular einen neuen Datensatz ein, so ist das Unterformular leer und alle folgenden Datensätze werden eben dem neuen Datensatz zugeordnet.

Schau Dir einmal das Kapitel zu Beziehungen zwischen Tabellen im Handbuch an.

Gruß

Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

EinsamerBaumWald
Beiträge: 31
Registriert: Fr 28. Nov 2014, 20:41

Re: Formular zur Dateneingabe: Feld mit Wert des letzten Datensatztes vorbelegen - Makro?

Beitrag von EinsamerBaumWald » Sa 27. Aug 2016, 12:49

Hallo Robert,

vielen Dank für den Tipp, werde ich mir anschauen.
Aber ich würde es doch gerne erst mal nur mit einer Tabelle lösen, weil ich dann leichter einen einfachen Export der Daten vornehmen kann, sonst braucht es doch wieder eine Abfrage dafür. (Bis gestern hab ich das alles mit einer Calc Tabelle verwaltet, hab also noch nicht übermäßig viel Datenbankerfahrung.)
Und vor allem: Die Chargennummer besteht aus dem Datum, in der Form YYTTMM. Habe die Spalte auch als so formatiertes Datumsformat angelegt. Ich sehe nicht, was ich gewinne, wenn ich das auslagern würde in eine Extra-Tabelle.

Außerdem brauche ich den Makrocode, weil ich mit anderen Feldern noch anderes vorhabe. :) Ok, hab ich vorher nicht geschrieben, ich wollte Stück für Stück vorgehen. Habe ein anderes Thema gefunden, das aber leider auch keine Lösung kannte.

Ich hänge die Datenbank an, dann wird es hoffentlich verständlicher.
Im Eingabeformular sollen die Felder Kraut, Datum und Lagerort mit dem zuletzt eingegebenen Wert vorbelegt werden: An einem Tag werden für gewöhnlich 8 bis 15 Säcke einer Krautart abgesackt, gewogen und sollen im Lagerbuch erfasst werden.
Am nächsten Tag kommt dann eine andere Chargennummer, evtl. auch eine andere Krautart.
Die Sacknummer gilt pro Krautart und Jahr. Das Feld Sacknummer sollte automatisch hochgezählt werden um eins - aber im Formular, nicht in der Tabelle.
Ich habe die Spalte Sack in der Tabelle als Text und nicht als Zahl angelegt, da es in der Vergangenheit leider zu doppelt vergebenen Sacknummern kam - wenn dies bemerkt wurde, wurde diese mit einem Punkt gekennzeichnet. Durch die Datenbanklösung will ich doppelte Sacknummern zukünftig vermeiden, da die Daten direkt beim Etikettieren der Säcke digital erfasst werden sollen und nicht mehr wie bisher auf Papier.
Außerdem sehe ich nicht, wie es mit Auto-Increment ginge, da die Sacknummer ja pro Krautart hochgezählt wird.


Was ist zuletzt eingegeben? Der Datensatz mit der höchsten ID (Primarschlüssel).

Vielen Dank!
Dateianhänge
Lagerbuch_Beispiel.odb.zip
(17.78 KiB) 249-mal heruntergeladen

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Formular zur Dateneingabe: Feld mit Wert des letzten Datensatztes vorbelegen - Makro?

Beitrag von RobertG » Sa 27. Aug 2016, 19:45

Hallo EinsamerBaumWald,

ich habe das jetzt trotzdem einmal mit den Grundlagen der Datenbank auf einen Nenner gebracht: Eine Filtertabelle hinzugefügt, in der jeweils der gewünschte Inhalt des letzten Datensatzes abgespeichert ist, und ein Formular, das mit diesen Werten entsprechend arbeiten: Hauptformular Filtertabelle, Unterformular Deine Eingabetabelle (in der noch einige Felder fehlen). Die entsprechenden Felder für die Chargennummer, das Kraut und den Lagerort können in dem Unterformular natürlich gelöscht werden, sollten ansonsten schreibgeschützt und ohne Tabstop versehen sein.

Die Sacknummer kannst Du gegebenenfalls auch mit dem Filter berechnen. Eine entsprechende Abfrage habe ich beigefügt. Sobald Du aber diese Abfrage einbaust musst Du nach jedem Datensatz die Eingabe aktualisieren, damit das Maximum neu berechnet wird. Einfacher ist es, das Ganze ohne Nummerierung der Säcke im Formular einer Abfrage zu überlassen, die automatisch die entsprechende Zeilennummerierung raus gibt.

Wenn Du unbedingt Makros dazu einsetzen willst, dann schau Dir die Beispieldatenbanken mit Beschreibung an, die Du bei den Kapiteln zum Handbuch finden kannst. Hier der direkte Link: https://wiki.documentfoundation.org/ima ... ng_V51.zip. Da habe ich das Duplizieren von Daten beschrieben.

Du wirst ansonsten in Datenbankforen immer den Rat finden: Schmeiß alle Daten aus einer Tabelle raus, die deutlich mehr als einmal in einer Spalte vorkommen. Schau nach, welche Daten sich laufend verändern. Arbeite mit den Relationen. Deswegen wirst Du eben auch Schwierigkeiten haben, irgendwo eine Anleitung zu finden, die genau in die entgegengesetzte Richtung arbeitet: Vervielfachung der Daten statt Vereinfachung.

Gruß

Robert
Dateianhänge
Lagerbuch_Beispiel.odb.zip
Zweites Formular mit Vorgaben aus Filtertabelle
(23.74 KiB) 215-mal heruntergeladen
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

EinsamerBaumWald
Beiträge: 31
Registriert: Fr 28. Nov 2014, 20:41

Re: Formular zur Dateneingabe: Feld mit Wert des letzten Datensatztes vorbelegen - Makro?

Beitrag von EinsamerBaumWald » Di 30. Aug 2016, 15:23

Hallo Robert,

ganz herzlichen Dank, das hat mir sehr weitergeholfen!
Habe das Makro von Deinem Eingabeformular entfernt, sonst wurden am Anfang keine Daten geladen. (Weil das Makro, das mit dem Öffnen des Formulars verknüpft war, im Hauptformular kein Feld Chargennummer mehr gefunden hat, da Du das ins Unterformular verschoben hast.)

Ich habe das Unterformular außerdem wieder auf "Nur Daten-Eingabe" gestellt. Deshalb fehlen (bis auf das Kommentar-Feld, das hopps gegangen war) auch keine Felder in dem Formular: Beim Abfüllen der Ware und Eintragen ins Lagerbuch sind die Säcke ja noch nicht verkauft. Um diese Felder zu befüllen, werde ich ein Extra-Formular verwenden.

Die Abfrage für die Sacknummer habe ich folgendermaßen ergänzt, damit sie funktioniert - die Spalte Sacknummer hat den Typ VARCHAR und kann Punkte enthalten:

Code: Alles auswählen

SELECT "a".*, ( SELECT IFNULL( MAX( CAST( REPLACE( "Sacknummer", '.', '' ) AS INTEGER ) ), 0 ) + 1 FROM "Kräuter" WHERE "Kraut" = "a"."Kraut" AND YEAR( "Chargennummer" ) = YEAR( "a"."Datum" ) ) AS "Sacknummer_Neu" FROM "Filter" AS "a"
Habe ein bisschen gebraucht, bis ich verstanden habe, was die Tabelle a sein soll, bis ich das Ende der Abfrage gesehen habe. :D

Ich bekomme es nicht hin, die Sacknummer_neu aus der Abfrage im Formular anzuzeigen, wo liegt mein Fehler? Habe schon probiert das Feld Sacknummer_neu sowohl in einem Unterformular von Filter und als auch von Eingabe zu verwenden, aber beides funktioniert nicht.
Siehe Anhang.

Vielen Dank!
Dateianhänge
Lagerbuch_Beispiel.odb.zip
Eingabeformular_neu bearbeitet, Abfrage Filter_Sacknummer angepasst
(24.11 KiB) 222-mal heruntergeladen

RobertG
* LO-Experte *
Beiträge: 2888
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Formular zur Dateneingabe: Feld mit Wert des letzten Datensatztes vorbelegen - Makro?

Beitrag von RobertG » Di 30. Aug 2016, 16:27

Hallo EinsamerBaumWald,

die gesuchte neue Sachnummer steht ja in der Abfrage "Filter_Sacknummer". Als Basis für das Formular "Filter" muss jetzt die Abfrage eingebaut werden. Dabei ist auch noch einmal die Bedingung neu einzustellen, dass nur der eine Datensatz mit "ID" = TRUE angezeigt wird.

Dann kannst Du die Sacknummer in dem Unterformular automatisch schreiben lassen. Dann sind im Unterformular noch lediglich 2 Felder, die einer Eingabe bedürfen. Danach muss das Unterformular abgespeichert werden und die Abfrage erneuert werden.

Ich habe einmal die Änderung so weit eingebaut, dass das Feld jetzt entsprechend gefüllt wird. Allerdings lässt sich so die Sacknummer nicht mehr ändern, die von der Filterabfrage vorgegeben wurde. Wie Du dann da wieder ein Textfeld draus machen willst ist mir unklar.

Gruß

Robert
Dateianhänge
Lagerbuch_Beispiel.odb.zip
Abfrage in Hauptformular bestimmt Inhalt im Subformular
(24.26 KiB) 184-mal heruntergeladen
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

EinsamerBaumWald
Beiträge: 31
Registriert: Fr 28. Nov 2014, 20:41

Re: Formular zur Dateneingabe: Feld mit Wert des letzten Datensatztes vorbelegen - Makro?

Beitrag von EinsamerBaumWald » Di 30. Aug 2016, 21:56

Hallo Robert, vielen Dank.

Wäre nett, wenn Du die Bezeichnung des Feldes Sacknummer neu (Unterformular Eingabe) geändert hättest, nachdem Du es nicht mehr einem Unterformular, sondern dem Hauptformular zugeordnet hast und da die Datengrundlage geändert.
So habe ich eine ganze Weile versucht, das in meinem Dokument nachzustellen, bis ich den Unterschied festgestellt habe…

Ich habe dank http://de.openoffice.info/viewtopic.php ... 88#p228688 das automatische Aktualisieren gelöst:

Code: Alles auswählen

Sub Aktualisieren 
   oForm1=thisComponent.Drawpage.Forms.getByName("Filter")
' ob es die If-Abfrage wirklich braucht, weiß ich nicht
If oForm1.isNew Then
   0
   ElseIf oForm1.isModified Then
      oForm1.updateRow
   End if
   
oForm1.reload()

Fokus()
End Sub
Das Makro ist verknüpft mit dem Ereignis "Nach der Datensatzaktion" des Unterformulars Eingabe.

Wenn ich das Feld Sacknummer des Unterformulars Eingabe drin lasse, dann kann ich dort sogar noch eine abweichende Sacknummer eingeben. Will ich aber gar nicht, die Sacknummer soll ja hochgezählt werden und wenn die Mitarbeiter nix von Hand eintragen können, kann es auch keine doppelten Sacknummern mehr geben. :)

Beim Öffnen des Formulars ist der Fokus dank automatischem Steuerelement-Fokus im Feld Kraut, so dass diese Daten angepasst werden können.
Nach dem Eintragen des ersten Datensatzes wird der Fokus auf das Gewichtsfeld mit einem Makro gesetzt, so dass man schön hintereinander weg die Sackgewichte eintragen kann. Möchte man einen Kommentar hinzufügen, geht es mit Umschalt+Tab ins Kommentarfeld, das in der Aktivierungsreihenfolge vor dem Feld Gewicht ist.
So kann mit Enter der Datensatz abgespeichert werden.
Das Makro ist nötig, weil sich LO nicht wie erwartet verhalten hat: Tab: Nächstes Feld, Enter: Formular Abschicken
Befindet man sich nämlich nicht im letzten Formularfeld, dann setzt Enter den Cursor in das nächste Feld, anstatt das Formular abzuschicken.

Beim Fokus-Setzen habe ich mich an diesem Code orientiert:

Code: Alles auswählen

Sub Fokus()

   oForm=thisComponent.Drawpage.Forms.getByName("Filter").getByName("Eingabe")
   oFeld=oForm.getByName("fmtGewicht")
   oDocView = thisComponent.getCurrentController()
   oDocView.getControl(oFeld).setFocus
end sub
Vielen Dank für die super Unterstützung!
Dateianhänge
Lagerbuch_Beispiel.odb.zip
Endfassung
(24.51 KiB) 216-mal heruntergeladen


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten