Zaehler in Abfrage

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Geotrans
**
Beiträge: 42
Registriert: Fr, 01.02.2013 20:40

Zaehler in Abfrage

Beitrag von Geotrans »

hier viewtopic.php?f=8&t=16160&hilit=abfrage+z%C3%A4hlerist schon mal das Thema mit einem Zähler in einer Abfrage behandelt worden, leider bekomme ich es nicht auf meinen Fall angewendet. Ich hoffe es ist richtig das ich ein neues Thema begonnen habe und meine Frage nicht dort angehängt habe?
Ich möchte in einer Abfrage für das Feld "factory_ID" aus meiner Tabelle eine Nummerierung erzeugen die bei jeder neuen "factory_ID" mit 0 beginnt. Das Ergebnis sollte so wie in dem Screenshot unter Input_Good_Nr in rot dargestellt aussehen. Geht so etwas überhaupt? und wenn ja wie?
Dateianhänge
Nummerierung.png
Nummerierung.png (11.3 KiB) 3458 mal betrachtet
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Zaehler in Abfrage

Beitrag von juetho »

Ich nehme an, dass du den Zähler nicht innerhalb der Abfrage, sondern innerhalb des Berichts haben möchtest. (Innerhalb einer Abfrage ist das - wenn überhaupt - nur mit sehr großen Verrenkungen möglich.) Im Bericht geht das über Funktionen, wobei die folgende Kurzanleitung sich auf den Oracle Report Builder bezieht.
  1. Aktiviere den Berichts-Navigator.
  2. Wähle (mit Rechtsklick) innerhalb der Gruppe, die durchnummeriert werden soll, eine "Neue Funktion".
  3. Öffne die Eigenschaften dazu.
  4. Ändere den Namen, z.B. in: Zaehler_je_factory
  5. Trage die Formel ein (jetzt mit eckigen Klammern):
    [Zaehler_je_factory] + 1
  6. Lege den Anfangswert fest als 0 oder -1. (Ich vergesse immer wieder, ob die Formel bereits beim ersten Datensatz ausgewertet wird oder erst beim zweiten.)
  7. Das Feld, das den Zähler anzeigen soll, erhält in den Eigenschaften den Typ "Benutzerdefinierte Funktion" mit Auswahl dieser Funktion.
Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Geotrans
**
Beiträge: 42
Registriert: Fr, 01.02.2013 20:40

Re: Zaehler in Abfrage

Beitrag von Geotrans »

Hallo Jürgen,
leider brauche ich den Zähler schon vor dem Bericht. Geht es vielleicht auch im Formular und einer neuen Spalte in der Tabelle InputGood, so das ich jedes mal wenn ich ein zusätzliche InputGood auswähle NR. um eins hochgesetzt wird?
Dateianhänge
Tabelle.png
Tabelle.png (12.06 KiB) 3449 mal betrachtet
Formular.png
Formular.png (85.32 KiB) 3449 mal betrachtet
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Zaehler in Abfrage

Beitrag von juetho »

Geotrans hat geschrieben:leider brauche ich den Zähler schon vor dem Bericht.
Wirklich? Geht das nicht auch durch ein geeignetes ORDER BY? Das vermeidet Klimmzüge und Umwege sowie doppelte Berechnungen.
Geotrans hat geschrieben:Geht es vielleicht auch im Formular und einer neuen Spalte in der Tabelle InputGood, so das ich jedes mal wenn ich ein zusätzliche InputGood auswähle NR. um eins hochgesetzt wird?
Ja, es geht über ein Makro. Hole die letzte laufende Nummer durch:

Code: Alles auswählen

SELECT MAX("NR") 
  FROM "factory" 
 WHERE /* mit den passenden Bedingungen, welcher Bereich gezählt werden soll */
Baue diesen SQL-Befehl in ein Makro ein. Das Makro selbst sieht (mit deinem SQL-Befehl) etwa so aus wie der Anfang des Makros im vollständigen Handbuch Seite 252 Mitte (bis zum ersten WEND). Das Ergebnis, das dort in der Variablen inZaehler landet, ist dein Wert; der wird dann in das "richtige" Unterformular übernommen, etwa so:

Code: Alles auswählen

oForm.updateInt(6, inZaehler + 1)
Dabei gilt: oForm ist das Teilformular zu der Tabelle, in der die NR registriert werden soll; 6 ist die Position der Spalte NR innerhalb dieser Tabelle.

Ich bin zurzeit dabei, das Kapitel "Makros" im Handbuch um einleitende Abschnitte zu erweitern, wo diese Schritte (SQL-Befehl einbauen, Werte abfragen, Werte eintragen) erläutert werden. Wenn es nötig ist, dann melde dich per PN (vorzugsweise mit einer Email-Adresse) bei mir, damit ich dir den aktuellen Entwurf der odt-Datei (ca. 360 kB) schicken kann.

Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Zaehler in Abfrage

Beitrag von RobertG »

Hallo Georg,

sieh Dir einmal im Handbuch das Kapitel "Zeilennummerierung" an. Das erstellt eine Nummerierung, gegebenenfalls auch eben gruppiert nach weiteren Begriffen.
Geht nach folgendem Schema:

Code: Alles auswählen

SELECT "ID", 
( SELECT COUNT( "ID" ) FROM "Tabelle" WHERE "ID" <=
"a"."ID" AND "factory_ID" = "a"."factory_ID" ) AS "Nr." 
FROM
"Tabelle" AS "a"
Gruß

Robert
Geotrans
**
Beiträge: 42
Registriert: Fr, 01.02.2013 20:40

Re: Zaehler in Abfrage

Beitrag von Geotrans »

Hallo Robert,
funktioniert super! Hatte übrigens bei dem Absatz Zeilennummerierung im Handbuch auch schon den Verdacht, das hier die Lösung für mein Problem liegt. Hatte es aber nicht umgesetzt bekommen, bin halt noch ein totaler Anfänger! (Ich finde es im Handbuch übrigens immer eine große Hilfe wenn ich solche Beispiele dann auch in der Beispieldatenbank anschauen kann.)
Bei der Nummerierung ist der kleinste Wert 1. Ich brauche aber 0. Mache ich einfach über eine Berechnung?
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Zaehler in Abfrage

Beitrag von RobertG »

Hallo Georg,

0 erhältst Du durch eine einfache Korrektur:

Code: Alles auswählen

SELECT "ID",
( SELECT COUNT( "ID" )-1 FROM "Tabelle" WHERE "ID" <=
"a"."ID" AND "factory_ID" = "a"."factory_ID" ) AS "Nr."
FROM
"Tabelle" AS "a"
Gruß

Robert
Geotrans
**
Beiträge: 42
Registriert: Fr, 01.02.2013 20:40

Re: Zaehler in Abfrage

Beitrag von Geotrans »

Ganz Herzlichen Dank!!! :D
Geotrans
**
Beiträge: 42
Registriert: Fr, 01.02.2013 20:40

Re: Zaehler in Abfrage

Beitrag von Geotrans »

RobertG hat geschrieben:

Code: Alles auswählen

SELECT "ID",
( SELECT COUNT( "ID" )-1 FROM "Tabelle" WHERE "ID" <=
"a"."ID" AND "factory_ID" = "a"."factory_ID" ) AS "Nr."
FROM
"Tabelle" AS "a"
Ist es möglich für diese Abfrage (siehe Screenshot) zwei Nummerierung zu erstellen, einmal

Code: Alles auswählen

ID=ID_I
und einmal

Code: Alles auswählen

 ID=ID_O
?
Habe auch schon probiert die Abfragen einzeln zu nummerieren und dann mit UNION zusammenzufügen. Die Nummerierten Abfragen als View abspeichern geht nicht.
Die Abfragen wie hier viewtopic.php?f=8&t=61120#p228060 beschrieben zusammenzufügen bekomme ich mit Nummerierung auch nicht hin!
Mein Versuch:

Code: Alles auswählen

SELECT * FROM (SELECT "ID", "Good_ID", "InputFactor", "InputCapacity", "InputSupplier", "factory_ID", ( SELECT COUNT( "ID" ) - 1 FROM "InputGood" WHERE "ID" <= "a"."ID" AND "factory_ID" = "a"."factory_ID" ) AS "NR" FROM "InputGood" AS "a") UNION SELECT * FROM  (SELECT "ID", "Good_ID", "OutputFactor", "OutputCapacity", "factory_ID",  ( SELECT COUNT( "ID" ) - 1 FROM "OutputGood" WHERE "ID" <= "a"."ID" AND "factory_ID" = "a"."factory_ID" ) AS "NR" FROM "OutputGood" AS "a")
Dateianhänge
Nummerierung2.png
Nummerierung2.png (20.23 KiB) 3308 mal betrachtet
juetho
******
Beiträge: 617
Registriert: Di, 20.04.2010 15:46
Wohnort: Berlin

Re: Zaehler in Abfrage

Beitrag von juetho »

Bitte entschuldige, dass ich nicht mehr durchblicke (und mich deshalb weitgehend raushalte). Aber dein Screenshot für das Auswahlergebnis deutet auf folgende Möglichkeit hin: Trage für jede Spalte aus allen UNION-Teilen einen Spalten-Alias ein, z.B.

Code: Alles auswählen

SELECT "ID",    /* ersetzen durch */
SELECT "ID" AS "ID",
Ich hatte bei einer eigenen UNION innerhalb von Base schon einmal den Verdacht, dass der SQL-Parser von Base hier vom SQL-Standard abweicht. Normalerweise werden bei UNIONs die Spaltennamen des ersten SELECT auch für die weiteren SELECTs übernommen. Base oder HSQL setzt unterschiedliche Spaltennamen ein: ID_1 gegenüber ID_0.

Vielleicht hilft's. Gruß Jürgen
Situation: LibO 3.6 auf Win 7 Home Premium (64-bit) mit MySQL (localhost) über JDBC
Geotrans
**
Beiträge: 42
Registriert: Fr, 01.02.2013 20:40

Re: Zaehler in Abfrage

Beitrag von Geotrans »

Hallo Jürgen,
leider steige ich überhaupt noch nicht durch, deshalb fällt es mir auch sehr schwer meine Fragen einigermaßen verständlich zu formulieren. ID_I und ID_O müssen zwei verschiedene Felder sein, ist also gewollt. Mein Problem ist, glaube ich zumindest, das ich jetzt keinen Primärschlüssel mehr habe.
RobertG
********
Beiträge: 2068
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Zaehler in Abfrage

Beitrag von RobertG »

Hallo Geotrans,

wenn Du zwei Tabellen mit "Union" verbinden willst, dann müssen die abgefragten Felder die gleichen Bezeichnungen und vor allem die gleichen Feldeigenschaften haben. Sonst passiert das, was bei deiner Zusammenstellung passiert: Die Tabellen werden aneinandergehängt und die jeweils fehlenden Felder erhalten den Wert "NULL".
Du kannst Źähler unabhängig voneinander laufen lassen. Das hängt damit zusammen, dass Du bestimmte Felder zu den Bedingungsfeldern des Zählers machst.
Beispiel: Kontoauszüge. Die Kontoauszüge sind für ein jahr komplett durchnummeriert. Die Nummerierung wird bei jedem Druck erhöht. Eine zweite Nummerierung zählt nur die Blätter innerhalb eines Druckes. Ähnliches geht auch in Abfragen.
Für Deine Konstruktion aber gilt: Du fragst in dem ersten Teil die Tabelle "InputGood" ab, im zweiten Teil die Tabelle "OutputGood". Und da funktioniert ein ordentliches "Union" gar nicht, weil es sich um völlig verschiedene Felder handelt.

Gruß

Robert
Geotrans
**
Beiträge: 42
Registriert: Fr, 01.02.2013 20:40

Re: Zaehler in Abfrage

Beitrag von Geotrans »

RobertG hat geschrieben: wenn Du zwei Tabellen mit "Union" verbinden willst, dann müssen die abgefragten Felder die gleichen Bezeichnungen und vor allem die gleichen Feldeigenschaften haben. Sonst passiert das, was bei deiner Zusammenstellung passiert: Die Tabellen werden aneinandergehängt und die jeweils fehlenden Felder erhalten den Wert "NULL".
Du kannst Źähler unabhängig voneinander laufen lassen. Das hängt damit zusammen, dass Du bestimmte Felder zu den Bedingungsfeldern des Zählers machst.
Beispiel: Kontoauszüge. Die Kontoauszüge sind für ein jahr komplett durchnummeriert. Die Nummerierung wird bei jedem Druck erhöht. Eine zweite Nummerierung zählt nur die Blätter innerhalb eines Druckes. Ähnliches geht auch in Abfragen.
Für Deine Konstruktion aber gilt: Du fragst in dem ersten Teil die Tabelle "InputGood" ab, im zweiten Teil die Tabelle "OutputGood". Und da funktioniert ein ordentliches "Union" gar nicht, weil es sich um völlig verschiedene Felder handelt.
Hallo Robert,
das in die Felder Null enthalten ist beabsichtigt. Was ich in dem Beispiel noch nicht hatte, war ein gemeinsames Feld über das ich nachher für die Zuordnung nutzen kann. Nach mehren Unions sieht meine Abfrage jetzt so aus wie bei Union1.png.
Das sind die IDs aller Unterformulare.Über diese kann ich jetzt die anderen Felder der Unterformulare zuordnen (Union2.png). Wenn ich daraus einen Bericht erstelle bekomme ich ein einigermaßen brauchbares Ergebniss mit ein paar kleinen Schönheitsfehlern. Mehr dazu in diesem neuen Thread:viewtopic.php?f=8&t=61134#p228117
Dateianhänge
union2.png
union2.png (65.36 KiB) 3248 mal betrachtet
union1.png
union1.png (13.4 KiB) 3248 mal betrachtet
Antworten