BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

SELECT COUNT im Makro, um Feldwert zu setzen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von pschulze59 » Do 8. Aug 2019, 16:01

Hallo,
ich habe schon andere Posts im Forum gelesen, finde aber trotzdem keine Lösung:
Ich möchte über ein Makro mit einer SQL-Anweisung SELECT COUNT eine Anzahl an Datensätzen ermitteln und dann in ein Feld eines Datensatzes einer anderen Tabelle einsetzen. Derzeit scheitere ich schon am Ermitteln der Anzahl.
Ich vermute, dass mein SQL-Statement falsch ist: Ich bilde den String des Statements und lasse ihn mir zur Kontrolle über eine MsgBox ausgeben. Das sieht hier so aus:
SELECT COUNT ("TN"."ID") as "iAnzahl" FROM "TN", "idueb", "MN", "RB" WHERE "TN"."RBID" = "idueb"."uebid" AND ( ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M1ID" ) LIKE '% 19%' OR ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M2ID" ) LIKE '% 19%')
(Anmerkung: Es wird nicht nach 19 Prozent gesucht, sondern wirklich nach dem Text " 19" und das ist die Ausgabe in der MsgBox - die doppelten Anführungszeichen wurden im string gedoppelt, um die Anweisung dann so hinzubekommen. Diesbezüglich spollte sie also syntaktisch richtig sein.)

Zum Zeitpunkt des Aufrufs des Aufrufs des Makros stehe ich in einem Formular "RB" mit zwei Unterformularen von "TN" und "Kont" (letzteres spielt hier wohl keine Rolle).
Ich vermute, dass im SQL-Statement das "AS ..." falsch ist. Aber wie bekomme ich die ermittelte Datensatzanzahl in eine integer-Variable "iAnzahl"?

Peter

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von gogo » Do 8. Aug 2019, 17:23

snytaktisch richtig aber sinnbefreit ;)
"MN" und "RB" hängen nicht in der Where-Klausel, damit kriegst Du für jeden like-Treffer ("TN"="idueb" * "MN" * "RB" ) Datensätze - vermutlich nicht das was Du wolltest.

Schuss ins Blaue:

Code: Alles auswählen

SELECT COUNT(1) as "iAnzahl" 
    FROM "TN", 
         "idueb", 
         "MN"
    WHERE     "TN"."RBID" = "idueb"."uebid" 
          AND "MN"."ID" in ( "TN"."M1ID", "TN"."M2ID")
          AND "MN"."KBez" LIKE '% 19%'
"RB" hab' ich weggelassen - wusste nicht wozu Du die brauchst :roll:
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von pschulze59 » Do 8. Aug 2019, 19:29

Danke, gogo,

aber so sinnbefreit ist die ganze Sache nicht. Die SQL-Anweisung basiert auf einer Abfrage, die wunderbar mir genau die richtigen Ergebnisse liefert. Auf Basis der Abfrage habe ich einen Bericht, der am Ende die Count-Funktion macht und mir die Anzahl anzeigt. Ziel war es, die Anzahl nun automatisch zu ermitteln und in ein Feld der Tabelle zu speichern, um nicht immer erst einen Bericht zu erzeugen und händisch die Anzahl einzutragen.

Wenn man deinen Vorschlag - der übrigens auch nicht funktioniert - noch weiter runterbricht, müsste doch wenigstens
oSQL_Anweisung = oCon.createStatement()
stSQL="SELECT COUNT(1) as ""iAnzahl"" FROM ""RB"""
MsgBox(stSQL)
oSQL_Anweisung.executeQuery(stSQL)
MsgBox(iAnzahl)
mir die Anzahl der Datensätze in "RB" liefern - macht es aber nicht. Irgendwas mache ich hier also prinzipiell falsch.

Hmmm......????
Ähmm, kann das daran liegen, dass ich die interne Firebird-DB verwende????

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

Re: SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von RobertG » Do 8. Aug 2019, 20:37

Hallo Peter,

Code: Alles auswählen

oResult = oSQL_Anweisung.executeQuery(stSql)
WHILE oResult.Next
inAnzahl = oResult.getInt(1)
WEND
Das Ergebnis wird in ein Objekt eingelesen, aus dem nach und nach die Zeilen einzeln abgefragt werden. Du musst mit .Next auf den Ausgabedatensatz navigieren. Du brauchst dafür übrigens in der SQL-Anweisung keinen Alias. Der Wert wird aus der Spalte ausgelesen. Bei Deiner Variante ist iAnzahl, die Du mit der msgbox ausgeben willst, überhaupt nicht definiert. Das ist doch für Basic einfach nur Text.

Was mich an Deiner Abfrage erst einmal irritiert ist, dass es keine Beziehung zwischen den Tabellen MN, TN und den anderen beiden Tabellen gibt. Damit erzeugst Du einen sehr großen Datenbestand, aus dem Du die Anzahl ermitteln willst. Nicht in den Beziehungen vorkommende Tabellen werden so behandelt, dass alle darin enthaltenen Datensätze mit allen Datensätze der restlichen Tabelle ausgegeben werden. Macht bei 5 Datensätzen in der einen und 3 Datensätzen in der anderen Tabelle 15 Datensätze.

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

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von gogo » Do 8. Aug 2019, 21:40

Ohne zu wissen was Du möchtest:

Code: Alles auswählen

...FROM "TN", "idueb", "MN", "RB"...
ohne Verknüpfung zu "MN" und "RB" liefert niemals das Ergebnis das Du möchtest ... so weit lehn' ich mich aus dem Fenster ;)
Wenn Du eine Abfrage testen willst, dann gib den Code doch einfach im Abfragen-Editor ein (Datenbankfenster > Abfragen > Abfrage in SQL-Ansicht erstellen...) und drück' F5. Syntaxfehler werden Dir dann angezeigt, und ggf. das Ergebnis auch.

Dein Statement gibt Dir 0 aus, da beide like-Klauseln "False" ergeben und ein SQL-Statement das ein False im Where-Bereich hat immer leer ist. (kannst Du ganz einfach testen: "Select * from TN Where 1=2" ... sollte keinen Datensatz zurückliefern

Wenn Du die Like-Klauseln gerichtet hast, dann ergibt die Count-Anweisung die Anzahl aller Datensätze der Tabellen TN und idueb in denen "TN"."RBID" = "idueb"."uebid" ist, mal der Zahl aller Datensätze in MN, mal die Zahl aller Datensätze in RB
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von pschulze59 » Do 8. Aug 2019, 22:19

Leute, ich bin Euch so dankbar, dass Ihr mir helfen wollt!

Ich muss mir selber erst mal klar werden, was ich brauche: Roberts Weg scheint mir klar zu sein - allerdings muss ich mit while - wend einige tausend Datensätze durchsuchen, ob in 9 Feldern die Zahl ' 19' vorkommt (analog in anderen Jahren andere Zahlen) und das dauert ziemlich "lange". (Aus Vereinfachungsgründen hatte ich das erst mal nur mit zwei Maßnahmen probiert) Und dabei steht die Zahl nicht direkt als Text in den neun Feldern, sondern ist jeweils über eine ID (aus den neun Feldern) aus einer anderen Tabelle "MN" im Feld "KBez" zu ermitteln.

Um das Problem zu lösen, muss erst mal das DB-Gesamtkonstrukt bekannt sein:
Die Berater aus "RB" (ansprechbar über deren ID oder die Hilfstabelle "idueb"."uebid") entsenden Teilnehmer aus "TN" in Maßnahmen "MN", die in ihren Kurzbezeichnungen "KBez" die Jahreszahl tragen. Das Doofe ist nun, dass im Datensatz des TN maximal 9 MN (M1ID,M2ID,...,M9ID) über die MN-ID verankert sein können (mit anderen Worten: Ein TN kann max. an 9 MN - verknüpft über deren ID - teilnehmen). Die Aufgabe lautet nun: Ermittle, wie viele TN ein Berater (RB) im Jahr 19 entsendet hat.
select count sollte bei dem Durchlauf der Tabelle "TN" bei 9 Feldern über den ID-Bezug auf "MN"."KBez" ermitteln, ob "% 19%" drin vorkommt und wenn ja, den Zähler erhöhen. Dabei dürfen aus der Tabelle "TN" nur die berücksichtigt werden, bei denen die "TN"."RBID" der "idueb"."uebid" entspricht.
(Ich hoffe, Ihr könnt mir noch folgen?)
Wie schon beschrieben, funktioniert eine Abfrage super:
SELECT "TN"."ID" "ID", "TN"."MDID" "MDID", "TN"."M1ID" || '-' || ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M1ID" ) "M1", "TN"."M2ID" || '-' || ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M2ID" ) "M2", "TN"."M3ID" || '-' || ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M3ID" ) "M3", "TN"."M4ID" || '-' || ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M4ID" ) "M4", "TN"."M5ID" || '-' || ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M5ID" ) "M5", "TN"."M6ID" || '-' || ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M6ID" ) "M6", "TN"."M7ID" || '-' || ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M7ID" ) "M7", "TN"."M8ID" || '-' || ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M8ID" ) "M8", "TN"."M9ID" || '-' || ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M9ID" ) "M9", ( SELECT "RB"."Name" FROM "RB" WHERE "RB"."ID" = "idueb"."uebid" ) "RBID", ( SELECT "KT"."Bez1" FROM "KT" WHERE "TN"."KTID" = "KT"."ID" ) "KTID", "TN"."geb" "geb", "TN"."Vorn" "Vorn", "TN"."Name" "Name", "TN"."VnM" "VnM", "TN"."AStat" "AStat", "TN"."Bem" "Bem", "TN"."VNr" "VNr", ( SELECT "BZ"."KBez" FROM "BZ" WHERE "TN"."BZID" = "BZ"."ID" ) "BZID", "TN"."aktiv" FROM "TN", "idueb", "MN", "RB" WHERE "TN"."RBID" = "idueb"."uebid" AND "TN"."M1ID" = "MN"."ID" AND "RB"."ID" = "idueb"."uebid" AND ( ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M1ID" ) LIKE '% 19%' OR ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M2ID" ) LIKE '% 19%' OR ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M3ID" ) LIKE '% 19%' OR ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M4ID" ) LIKE '% 19%' OR ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M5ID" ) LIKE '% 19%' OR ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M6ID" ) LIKE '% 19%' OR ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M7ID" ) LIKE '% 19%' OR ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M8ID" ) LIKE '% 19%' OR ( SELECT "MN"."KBez" FROM "MN" WHERE "MN"."ID" = "TN"."M9ID" ) LIKE '% 19%' ) ORDER BY "MDID" DESC
(ungekürzt)

Ich wollte diese Abfrage im Makro verwenden, um den ermittelten Wert dann in ein Datenfeld des RB eintragen zu können - das Makro hätte ich im Formular an den Datensatzwechsel gebunden, so dass bei jedem Wechsel der Wert im Formular aktualisiert wird.
Bisher zeige ich den Bericht, basierend auf der o.a. Abfrage, an und trage händisch die ermittelte Anzahl in das entsprechende Feld des RB ein, was natürlich blöd ist.

Das ist der Stand der Dinge....

Danke für Eure Vorschläge.
Peter

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

Re: SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von RobertG » Fr 9. Aug 2019, 07:38

Hallo Peter,

zuerst einmal: Wenn diese Umfangreiche und mit vielen Subselects versehene Abfrage so funktioniert, dann mach' daraus eine Ansicht. Die wird anschließend als Ausgangs"tabelle" für den Bericht genommen. Da brauchst Du kein Makro, weil der Bericht auch nach Gruppen zusammenzählen kann. Da ist die Funktion "Zähler" vorhanden.

Allerdings setzt Du bereits auf die interne Firebird-Datenbank. Die hat zur Zeit leider noch den Bug, dass sich da Ansichten über die GUI nicht speichern lassen: https://bugs.documentfoundation.org/sho ... ?id=126588. Der Bug ist zur 6.3.1 behoben.

Wenn Du, wie in Deiner ersten Abfrage, nur ein COUNT("TN"."ID") in der Abfrage hast, dann müsste diese Abfrage, normal gestellt, nur eine Datenzeile ergeben. Schließlich wird die Abfrage nicht abhängig von einem anderen Wert gruppiert. Und da die Abfrage immer den gleichen Wert ergibt reicht statt

Code: Alles auswählen

oResult = oSQL_Anweisung.executeQuery(stSql)
WHILE oResult.Next
inAnzahl = oResult.getInt(1)
WEND
auch

Code: Alles auswählen

oResult = oSQL_Anweisung.executeQuery(stSql)
oResult.Next
inAnzahl = oResult.getInt(1)
ohne die Schleife.

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

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von gogo » Fr 9. Aug 2019, 07:47

kleiner Tipp bei komplexen Abfragen:
zuerst mit einer Tabelle testweise arbeiten und das Ergebnis dann immer mehr einschränken bis das angezeigt wird was Du möchtest.

Allerdings glaube ich, dass Du ein prinzipielles Strukturproblem hast. Wenn ein TN an x Maßnahmen teilnimmt, dann sollten diese Maßnahmen nicht als Felder ("nebeneinander"), sondern als Datensätze ("untereinander") strukturiert werden:
MN hat dann z.B. folgende Struktur:

Code: Alles auswählen

ID_MN | ID_TN | KurzBezMN |      Datum | Anmerkung | erledigt ...
-----------------------------------------------------------------
    0 |    20 |   MN01 19 | 2019-06-12 |           |          ...
    1 |    20 |   MN02 19 | 2019-06-12 |           |          ...
    2 |    33 |   MN01 19 | 2019-06-12 |           |          ...
    3 |    45 |   MN01 17 | 2017-03-25 |           |          ...
    4 |    45 |   MN02 17 | 2017-03-25 |           |          ...
    5 |    45 |   MN03 17 | 2017-03-25 |           |          ...
    6 |    20 |   MN01 19 | 2019-07-03 |           |          ...
    7 |    20 |   MN02 19 | 2019-07-03 |           |          ...
ein einfaches select count(1) as n from TN where KurzBezMN like '% 19' ergibt dann die Zahl aller Maßnahmen. Mit select ID_TN, count(1) as n from TN where KurzBezMN like '% 19' grup by ID_TN würde die Zahl der Maßnahmen pro Mitarbeiter-ID ergeben ...
Iterieren über tausende Datensätze ist keine gute Idee - diese Funktionalität sollte Dir eine Datenbank schon über die Sprache SQL bieten
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

pschulze59
Beiträge: 51
Registriert: Di 16. Okt 2018, 12:48

Re: SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von pschulze59 » Fr 9. Aug 2019, 10:39

... an Robert: den Ansatz werde ich mal weiter verfolgen. Wie schon bemerkt, wollte ich auch über Ansichten gehen, konnte aber leider keine erstellen. Den verlinkten Text werde ich mal lesen, um vielleicht doch damit arbeiten zu können.

... an gogo: Mit dem Strukturproblem an der Stelle hast Du recht - werde ich aber nicht mehr ändern.

Mal sehen, ob ich am Wochenende dazu komme, was auszuprobieren.

Vielen Dank!
Schönes WE!

gogo
Beiträge: 1072
Registriert: Sa 5. Feb 2011, 19:07

Re: SELECT COUNT im Makro, um Feldwert zu setzen

Beitrag von gogo » Fr 9. Aug 2019, 11:09

als kleine Entscheidungshilfe:
1. gröbere Strukturprobleme die nicht behoben werden verursachen täglich Probleme
2. gröbere Strukturprobleme die nicht behoben werden verursachen massiven Unmut des Chefs und mitleidiges Lächeln der Kollegen falls man mal professionelle Hilfe braucht und diese behauptet, dass das so ja gar nicht gehe...
3. gröbere Strukturprobleme die behoben werden verursachen bei jedem Mal drüber nachdenken Freude
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten