[gelöst] Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
HansGerstenkorn
Beiträge: 137
Registriert: Sa 17. Sep 2016, 18:31

[gelöst] Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von HansGerstenkorn » Fr 1. Mär 2019, 19:55

Hallo,

ich habe eine sehr schöne DB die mir gute Dienste leistet, aber be Makros fehlt mir die Grundlage und die Übung. Es wäre nett, wenn ich ein Lösungsbeispiel oder einen Hinweis auf eine Beispieldatenbank bekommen könnte. Ich habe Roberts Anleitungen gelesen und durchforstet, aber wenn ich mir das aneignen soll, nur für eine kleine Erweiterung, dann muss ich kapitulieren. Ich verwende Makros zur Anzeige von Bildern etc, aber hier :-(

Ich möchte in Einem Formular nach Auswahl eines Listenfeldes ein Dezimalfeld/Textfeld mit einem Wert aus der gleichen Tabelle befüllen. Als Beispiel habe ich eine winzige Beispiel-DB angehängt. Dort soll in dem Formular "Stromverbraucher...." nach Auswahl des Listfeldes "Leuchtmittel" aus der Tabelle "Beleuchtungskörper" das Dezimalfeld "kWh" im Formular mit dem das dazugehörigen Wert "Leistungsaufnahme_kW/h" aus der Tabelle "Beleuchtungskörper" gefüllt werden.

Für Makro-Wissende sicher eine einfache Übung, für mich aber zu schwer. Für mich ist es schon sehr sehr mühsam, nach ein paar Jahren die DB zu erweitern, wenn man nicht dauernd mit dem Backend zu tun hat....

Vielen Dank schon jetzt für die Hilfe :-) Hans
Dateianhänge
Beispiel_Makro.odb.zip
(14.12 KiB) 18-mal heruntergeladen
Zuletzt geändert von HansGerstenkorn am Mo 4. Mär 2019, 13:28, insgesamt 1-mal geändert.
MacBook Pro = LO Version: 6.2.3.1; CPU-Threads: 8; BS: mac OS Mojave Version 10.14.4;

Lenovo T430S; Intel Core i5-3320M CPU @ 2.60 GHZ, 2601 MHz, 2 Kerne, LO Version: 6.0.2.1 (x64); Microsoft Windows 10 Pro; 10.0.16299;

RobertG
Beiträge: 1937
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von RobertG » Fr 1. Mär 2019, 21:13

Hallo Hans,

so ganz verstehe ich das nicht. Soll der Inhalt des Dezimalfeldes/Textfeldes anschließend noch angepasst werden können oder reicht die Darstellung? Wenn es nur um die Darstellung geht, dann recht doch eine entsprechende Abfrage für das Listenfeld, in dem der Inhalt nebeneinander dargestellt wird - Feldverbindungen mit ||. Wenn aber der Inhalt verändert werden soll: Welcher Inhalt soll "vorgeschlagen" werden: Der Größte, der kleinste, ein Mittelwert ...

So etwas kannst Du natürlich über Makros regeln. In dem Falle musst Du den currentValue des Listenfeldes auslesen. Da das Makro beim Ändern des Listenfeldes ausgelöst werden sollte, geht das über

Code: Alles auswählen

SUB WerteAnpassen(oEvent AS OBJECT)
oListbox = oEvent.Source.Model
oForm = oListbox.Parent
stValue = oListbox.CurrentValue
END SUB
Diesen Wert musst Du dann in die SQL-Formulierung einbauen, mit der Du die anderen Werte ermitteln willst. Wie SQL-Abfrage gestartet werden geht aus vielen Makros im Handbuch hervor. Hier ein Beispiel:

Code: Alles auswählen

stSql = "" 'String, den Du zusammenstellen musst, in dem auch stValue eingebaut wird.
oDatenquelle = ThisComponent.Parent.CurrentController
If NOT (oDatenquelle.isConnected()) THEN
oDatenquelle.connect()
END IF
oVerbindung = oDatenquelle.ActiveConnection()
oSQL_Anweisung = oVerbindung.createStatement()
oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
WHILE oAbfrageergebnis.next
stText1 = oAbfrageergebnis.getString(1)
doZahl = oAbfrageergebnis.getDouble(2)
WEND
Die so ermittelten Feldinhalte kannst Du dann den entsprechenden Feldern zuweisen.

Code: Alles auswählen

oField1 = oForm.getByName("Textfeld")
oField2 = oForm.getByName("Dezimalzahlfeld")
oField1.BoundField.UpdateString(stText1)
oField2.BoundField.UpdateDouble(doZahl)
Ist jetzt alles nicht direkt umsetzbar, da ich nicht genau weiß, was Du heraus bekommen willst.

Gruß

Robert

HansGerstenkorn
Beiträge: 137
Registriert: Sa 17. Sep 2016, 18:31

Re: Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von HansGerstenkorn » Fr 1. Mär 2019, 23:26

Hallo Robert,

vielen Dank für Deine schnelle Antwort, ich habe mich sicher nicht ganz verständlich ausgedrückt und mein Formular beinhaltet auch etwas mehr Daten. Hintergrund meiner DB ist, dass ich u.a.meinen Stromverbrauch nach "Stromverbrauchern" aufschlüssele (macht einfach Spaß und ist auch interessant). Nachdem LED ja Glühbirnen ersetzen ergibt sich auch ein anderer Verbrauch und so muss ich "nachbessern" und damit das einfacher geht, will ich einfach die kWh eines Beleuchtungskörpers (Glühbirne oder so) übernehmen um dann weitergehend je nach Einschaltzeiten pro Tag und Jahreszeiten den Jahresstromverbrauch zu schätzen (auch anhand von Messungen). Ich würde es einfach toll finden, wenn ich das Feld des ausgesuchten Beleuchtungskörpers gleich mit der hinterlegten Wattzahl füllen könnte, anstatt anhand einer eingebundenen Tabelle auslesen und "händisch" einzugeben.... Das ist der einzige Hintergrund für das Makro.

Also zurückkommend auf deine Frage: Der kWh des mit Listenfeld ausgesuchten Beleuchtungskörpers soll nur im Dezimalfeld eingesetzt werden und wird nicht mehr verändert. Im angehängten Screenshot siehst du weitere Felder, die ich (leider auch mangels Makrokenntnisse) dann berechne um zu einem Jahresstromverbrauch zu kommen....

Für dich zur Info: Ich habe meinem Formular Stromverbraucher mal einen Screenshot angehängt. Mittlerweile habe ich natürlich nicht nur die Hersteller und Lieferanten integriert, sondern auch alle Einkäufe und das nicht nur für die "Glühbirnen" sondern für alle "Verbraucher" - also Heizung inclusive. Ölkauf, Wasser und Verbrauchsprognosen etc.. etc.
MacBook Pro = LO Version: 6.2.3.1; CPU-Threads: 8; BS: mac OS Mojave Version 10.14.4;

Lenovo T430S; Intel Core i5-3320M CPU @ 2.60 GHZ, 2601 MHz, 2 Kerne, LO Version: 6.0.2.1 (x64); Microsoft Windows 10 Pro; 10.0.16299;

RobertG
Beiträge: 1937
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von RobertG » Sa 2. Mär 2019, 08:49

Hallo Hans,

die Screenshots fehlen. Wenn es nur darum geht, die elektrische Energie anzuzeigen (das ist kein "Stromverbrauch" - "Strom" wird in Ampere gemessen), dann reicht doch ein Listenfeld aus, in dem sowohl die Lampe als auch die Energie, die sie umsetzt, angezeigt werden können. Grob in SQL:

Code: Alles auswählen

SELECT "Gegenstand"||' - E:'||"Energie"||' kWh', "ID" FROM "Verbraucher"
So etwas ähnliches als Code für das Listenfeld und Du brauchst nicht irgendetwas über Makro in ein selbständiges Feld legen.

Gruß

Robert

HansGerstenkorn
Beiträge: 137
Registriert: Sa 17. Sep 2016, 18:31

Re: Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von HansGerstenkorn » Sa 2. Mär 2019, 09:49

Hallo Robert,

vielen Dank für deine schnelle Nachricht und sorry, den Screenshot konnte ich jetzt anhängen, hatte gestern den Status bei den Anhängen nicht kontrolliert und gerade erst jetzt gesehen, dass png-Dateien augenscheinlich nicht angehängt werden können, jetzt mit JPG geht das.

Nur zur Info: Ich habe die Umstellung auf das MacBook nach rund einem Jahr gut bewältigt, stolpere aber immer noch über solche Kleinigkeiten, gestern hatte ich immer wieder Probleme bei SQL-Werten zur Anzeige der Listenfeldinhalte von der Beispiel-DB, bis ich dann mühsam durch einzelnen Buchstabenvergleich herausgefunden hatte, dass beim "Zwischenkopieren" (LO-DB "copy" > paste in die MAC-Anwendung "TextEdit" > dort copy > dann paste in LO-Beispiel-DB) aus "geraden Anführungszeichen" "schräge Anführungszeichen" wurden und so einen Fehler produzierten.....
Hinzu kam dann auch noch, dass ich seit langem keine Infomobils bekam, weshalb ich meine Mailadresse hier im Account änderte, dann kam ich aber nicht mehr in's Konto, die Aktivierungsmail war weg, Schreiben an den Admin, Haber es aber heute früh geschafft und bin wieder im Account.

Wenn du jetzt etwas Zeit hast, hier ich meine Erklärung zu deiner Frage:

Ja, Physik fasziniert mich schon immer, aber im "Alltag" bringe ich immer noch Begriffe durcheinander..... Und nun zum Formular,

- der jeweilige Wert (kWh) der übernommen werden soll, ist die Grundlage für die weiterführende Verwendung um den Jahresstromverbrauch zu ermitteln.
- dieser Wert wird in eine Tabelle übernommen mit der ich dann den Jahresstromverbrauch ermittle, (Anzahl Glühbirnen/Beleuchtungskörper mal durchschnittliche Brenndauer usw. usw.) Da ich nicht jeden Stromverbraucher 12 Monate messen kann, habe ich zu unterschiedlichen Jahreszeiten jeweils ein paar Wochen gemessen und hochgerechnet.
- Bei den Stromverbrauchern wiederum sind Lampen mit 1 bis 4 "Glühbirnen" unterschiedlicher Typen...
- Jetzt habe ich auch noch die vom Hersteller angegebenen Brenndauern und das Kaufdatum sowie Kaufbelege in die DB aufgenommen, um immer gleich die Unterlagen bei Reklamationen passen zu haben - ich hatte schon nach 2 Jahren 3 LED-Reklamationen....

So, ich hoffe, du kannst jetzt nachvollziehen, weshalb ich den Wert getrennt haben möchte, vielen Dank noch einmal und ein schönes Wochenende
:-) Hans
Dateianhänge
Screenshot_Stromverbraucher.jpg
Screenshot_Stromverbraucher.jpg (701.04 KiB) 507 mal betrachtet
MacBook Pro = LO Version: 6.2.3.1; CPU-Threads: 8; BS: mac OS Mojave Version 10.14.4;

Lenovo T430S; Intel Core i5-3320M CPU @ 2.60 GHZ, 2601 MHz, 2 Kerne, LO Version: 6.0.2.1 (x64); Microsoft Windows 10 Pro; 10.0.16299;

RobertG
Beiträge: 1937
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von RobertG » Sa 2. Mär 2019, 10:34

Hallo Hans,

ich habe das einmal im Zusammenhang erstellt. Allerdings passt das nicht zu Deiner Datenbank, da ich nicht weiß, aus welcher Quelle Du die kWh auslesen willst:

Code: Alles auswählen

SUB WerteAnpassen(oEvent AS OBJECT)
	oListbox = oEvent.Source.Model
	oForm = oListbox.Parent
	inID = oListbox.CurrentValue
	stSql = "SELECT ""Leistungsaufnahme_kW/h"" FROM ""Beleuchtungskoerper"" WHERE ""ID"" = '"+inID+"'" 
	oDatenquelle = ThisComponent.Parent.CurrentController
	If NOT (oDatenquelle.isConnected()) THEN
		oDatenquelle.connect()
	END IF
	oVerbindung = oDatenquelle.ActiveConnection()
	oSQL_Anweisung = oVerbindung.createStatement()
	oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)
	WHILE oAbfrageergebnis.next
		doZahl = oAbfrageergebnis.getDouble(1)
	WEND
	oField1 = oForm.getByName("fmtkWh")
	oField1.BoundField.UpdateDouble(doZahl)
END SUB

HansGerstenkorn
Beiträge: 137
Registriert: Sa 17. Sep 2016, 18:31

Re: Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von HansGerstenkorn » Sa 2. Mär 2019, 11:10

Hallo Robert,

vielen Dank für deine schnelle Nachricht und das Makro. Du hast sicher schon erwartet, dass ich Nachfragen habe, nicht zuletzt, weil es mir einen Fehler bringt. Die Tabellen im Makro stimmen Ich habe deshalb das das Makro in die Schaltfläche "Schaltfläche" integriert und hänge die Beispiel-DB noch einmal an, vielleicht ist es für dich einfacher, einfach mal mit einem Klick das Ergebnis zu sehen....

Mich würde aber trotzdem mal interessieren, ob es irrelevant bei einem Makro ist, wo Leerzeichen stehen. Bei der Zeile

stSql = "SELECT ""Leistungsaufnahme_kW/h"" FROM ""Beleuchtungskoerper"" WHERE ""ID"" = '"+inID+"'"

ist bei SELECT hinter dem T ein Leerzeichen, ansonsten bei den Bedingungen nicht...

Und wenn du noch etwas Zeit hast, wo wird im Makro definiert, dass sich das Ergebnis aus SELECT auf den vorher im Listfeld ausgewählten Beleuchtungskörper bezieht?

Viele Grüße
:-) Hans
Dateianhänge
Beispiel_Makro.odb.zip
(15.6 KiB) 17-mal heruntergeladen
MacBook Pro = LO Version: 6.2.3.1; CPU-Threads: 8; BS: mac OS Mojave Version 10.14.4;

Lenovo T430S; Intel Core i5-3320M CPU @ 2.60 GHZ, 2601 MHz, 2 Kerne, LO Version: 6.0.2.1 (x64); Microsoft Windows 10 Pro; 10.0.16299;

F3K Total
Beiträge: 1856
Registriert: So 10. Apr 2011, 10:10

Re: Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von F3K Total » Sa 2. Mär 2019, 16:48

Hallo Hans,
habe mir deine DB angesehen, da sind doch noch zwei Kinken drin:
  • Du führst das Makro über eine Schaltfläche aus, willst aber mit SUB WerteAnpassen(oEvent AS OBJECT), das auslösende Objekt auslesen, also das Listenfeld in dem du den Beleuchtungskörper auswählst. Damit das Makro dafür geeignet ist, muss es also an das Listefeld und nicht an eine Schaltfläche gebunden sein. Ich würde das Ereignis "Status geändert" wählen.
  • In deiner Tabelle "Beleuchtungskörper" stehen die Werte für die Leistungsaufnahme in einer VARCHAR-Spalte, im Makro willst du aber mit

    Code: Alles auswählen

    oField1.BoundField.UpdateDouble(doZahl)
    eine DECIMAL-Spalte befüllen, geht nicht.
Darum:
Führe folgenden Befehl einmal über Menü Extras/SQL... aus:

Code: Alles auswählen

alter table "Beleuchtungskoerper" add "Leistungsaufnahme_kW/h2" decimal(10,2) before "Leistungsaufnahme_kW/h";
update "Beleuchtungskoerper" set "Leistungsaufnahme_kW/h2" = CAST(REPLACE("Leistungsaufnahme_kW/h",',','.') as DECIMAL(10,2));alter table "Beleuchtungskoerper" drop "Leistungsaufnahme_kW/h";
alter table "Beleuchtungskoerper" alter "Leistungsaufnahme_kW/h2" rename to "Leistungsaufnahme_kW/h";
Checkpoint defrag 
Damit erzeugst du zunächst eine DECIMAL Spalte, ließt die VARCHAR Werte in die Spalte ein, löschst die VARCHAR Spalte und gibst der DECIMAL-Spalte den "alten" Namen wieder. Dann folgt noch eine Komprimierung der Datenbank.
Jetzt kannst du das Makro ausführen, es trägt die Leistungsaufnahme_kW/h ein, danach die Zeile Speichern nicht vergessen.
Gruß R (nicht Robert)

RobertG
Beiträge: 1937
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

Re: Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von RobertG » Sa 2. Mär 2019, 17:10

Danke, F3K, dass Du Dich dazu schaltest. War gerade nicht verfügbar.

... und lustig, dass Du mittlerweile darauf hinweist, dass R. eine andere Person als Robert ist.

Gruß

Robert

F3K Total
Beiträge: 1856
Registriert: So 10. Apr 2011, 10:10

Re: Makro soll Dezimalfeld/Textfeld ja nach Listenfeldauswahl befallen

Beitrag von F3K Total » Sa 2. Mär 2019, 17:16

RobertG hat geschrieben:
Sa 2. Mär 2019, 17:10
... und lustig, dass Du mittlerweile darauf hinweist, dass R. eine andere Person als Robert ist.
Nun, nur in diesem "Übernahme-Fall", ansonsten kann der aufmerksame Leser uns sicher an unserer Signatur erkennen ... Dir noch ein schönes Wochenende ...

Antworten