Seite 1 von 1
Zaehler in Abfrage
Verfasst: So, 03.02.2013 14:33
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?
Re: Zaehler in Abfrage
Verfasst: So, 03.02.2013 15:24
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.
- Aktiviere den Berichts-Navigator.
- Wähle (mit Rechtsklick) innerhalb der Gruppe, die durchnummeriert werden soll, eine "Neue Funktion".
- Öffne die Eigenschaften dazu.
- Ändere den Namen, z.B. in: Zaehler_je_factory
- Trage die Formel ein (jetzt mit eckigen Klammern):
[Zaehler_je_factory] + 1
- 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.)
- Das Feld, das den Zähler anzeigen soll, erhält in den Eigenschaften den Typ "Benutzerdefinierte Funktion" mit Auswahl dieser Funktion.
Gruß Jürgen
Re: Zaehler in Abfrage
Verfasst: So, 03.02.2013 15:52
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?
Re: Zaehler in Abfrage
Verfasst: So, 03.02.2013 16:23
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:
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
Re: Zaehler in Abfrage
Verfasst: So, 03.02.2013 17:11
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
Re: Zaehler in Abfrage
Verfasst: So, 03.02.2013 18:27
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?
Re: Zaehler in Abfrage
Verfasst: So, 03.02.2013 19:25
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
Re: Zaehler in Abfrage
Verfasst: So, 03.02.2013 19:29
von Geotrans
Ganz Herzlichen Dank!!!

Re: Zaehler in Abfrage
Verfasst: Sa, 09.02.2013 12:32
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
und einmal
?
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")
Re: Zaehler in Abfrage
Verfasst: Sa, 09.02.2013 12:43
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
Re: Zaehler in Abfrage
Verfasst: Sa, 09.02.2013 14:15
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.
Re: Zaehler in Abfrage
Verfasst: Sa, 09.02.2013 17:42
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
Re: Zaehler in Abfrage
Verfasst: So, 10.02.2013 08:12
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