Antwort schreiben...
 
Themen-Optionen Thema durchsuchen
Alt 07.01.2009, 13:25   #1
Hans Jürgen
Registrierter Benutzer
Abfrage mit Abfrage verknüpfen

Hallo zusammen,

ein schönes neues Jahr zuerst einmal!

Ich stehe derzeit wie der "Ochs vorm Berg vor einem Problem" und komme nicht dahinter:

Ich habe eine Abfrage RE1, in der aus einer Verknüpfung von rechnung.df, kunden.df und fakt.df eine Teilmenge ausgewählt wird (zu jeder Rechnung gibt es dadurch mehrere Zeilen).

Im weiteren Verlauf benötige ich eine Abfrage, in der ich nur die dazugehörigen einzelnen Rechnungen habe.

Hatte mir einfach vorgestellt, mich auf RE1 zu beziehen:
FROM rechnung WHERE rech_nr IN SELECT rech_nr FROM RE1
Das funktioniert aber nicht bei mir (vielleicht geht es auch nicht). Muss man dem Compiler vielleicht irgendwie mitteilen, dass es sich bei RE1 nicht um eine Datenbank, sondern um eine Abfrage handelt?

Dann habe ich die komplette Abfrage von RE1 in das IN SELECT gesetzt, funktioniert aber auch nicht richtig (Ende der RAM-Disk und andere unerklärliche Fehler, Fehlermeldung VI2REOP Zeile 164: Dateiende RAMD:&4 - wobei auf dem Laufwerk, auf dem ich RAMD liegen habe, noch beliebig Platz ist und die &4 nur 120kb groß ist. Die Fehlermeldung kommt, wenn ich das Programm ein paar mal hintereinander laufen lasse. Availmem liegt die ganze Zeit bei 11000 und reduziert sich nicht weiter).

Ich könnte natürlich RE1 in eine temporäre Datenbank zwischenspeichern und dann diese in das IN SELECT nehmen, halte ich aber für nicht geschickt.

Hat jemand auf die Schnelle eine andere Idee?

Gruß
Hans Jürgen (hjlint#)

P.S.: Hier die Abfragen im Original:

PHP-Code:
LOCAL VIEW RE1=FROM FAKT,KUNDEN,RECHNUNG 
       SELECT kdnr
,name1,vname,vertragsnr,fällig_von,fällig_bis,
              
betrag,offen,rech_nr,datum,einzug  
       WHERE KDNR
=KUNDEN.KDNR 
        
AND RECH_NR=RECHNUNG.RECH_NR AND RECH_NR>990000 
        
AND (KDNR=reopkdnr OR GVNR=reopgvnr OR NAME IN (reopn1:reopn2))
        AND 
kdnr<>reopkdnra 
        
AND GVNR<>reopngvnr 
        
AND NOT name IN (reopna1:reopna2)  
        AND 
vu_code IN (reopvuc1:reopvuc2)  
        AND 
NOT vu_code IN (reopvun1:reopvun2)  
        AND (
rechnung.einzug=reoplevb1 OR rechnung.einzug=reoplevb2
        AND 
OFFEN<>
       ORDER NAME
,KDNR,VERTRAGSNR,FÄLLIG_VON 
Das war die erste Idee:

PHP-Code:
LOCAL VIEW RE2=FROM rechnung WHERE einzug=TRUE AND rech_nr IN SELECT rech_nr FROM RE1 ORDER name,konto (funktioniert bei mir nichtwäre natürlich die einfachste Lösung
Andere Idee (ist aber teilweise leer oder führt zu Abstürzen):

PHP-Code:
LOCAL VIEW RE2=FROM rechnung WHERE einzug=TRUE AND rech_nr IN SELECT rech_nr 
       FROM FAKT
,KUNDEN,RECHNUNG 
       WHERE KDNR
=KUNDEN.KDNR 
        
AND RECH_NR=RECHNUNG.RECH_NR AND RECH_NR>990000 
        
AND (KDNR=reopkdnr OR GVNR=reopgvnr OR NAME IN (reopn1:reopn2))
        AND 
kdnr<>reopkdnra 
        
AND GVNR<>reopngvnr 
        
AND NOT name IN (reopna1:reopna2)  
        AND 
vu_code IN (reopvuc1:reopvuc2)  
        AND 
NOT vu_code IN (reopvun1:reopvun2)  
        AND (
rechnung.einzug=reoplevb1 OR rechnung.einzug=reoplevb2
        AND 
OFFEN<>
       ORDER NAME
,KONTO 
Hans Jürgen ist offline   Mit Zitat antworten
Alt 07.01.2009, 15:18   #2
waldbauer.com
Entwickler
Ich habe diese IN SELECTS nie begriffen :-) aber eine Lösung die eventuell klappt ist diese hier:

PHP-Code:
LOCAL VIEW RE2=FROM rechnung WHERE rech_nr IN SELECT rech_nr FROM RE1 WHERE einzug="JA" ORDER name,konto 
waldbauer.com ist offline   Mit Zitat antworten
Alt 07.01.2009, 17:56   #3
Hans Jürgen
Registrierter Benutzer
Das IN SELECT-Abfragen kann ich eigentlich ganz gut, nur heute will es irgendwie nicht. Liegt aber sicher an den Parametern.

Die Variante mit dem "JA" habe ich auch schon probiert. In der Abfrage geht nur "JA", nicht TRUE und im Compiler ist es anscheinend genau anders herum, da führt das "JA" zu einer Fehlermeldung.

Gruß
Hans Jürgen
Hans Jürgen ist offline   Mit Zitat antworten
Alt 07.01.2009, 18:05   #4
waldbauer.com
Entwickler
Hallo !

Du hast natürlich recht , es heiß TRUE (ich habe schon ewig keine g'scheiten Programme mehr geschrieben). Trotzdem glaube ich beim IN SELECT gehört das WHERE einzug TRUE hinten und nicht in der Mitte.

Übrigens benutze bitte wenn möglich die PHP Code Funktion im Editor, daß sieht besser aus auch wenn es kein PHP ist :-) Danke
waldbauer.com ist offline   Mit Zitat antworten
Alt 07.01.2009, 18:11   #5
Hans Jürgen
Registrierter Benutzer
Ich hatte mich schon gewundert, wieso das plötzlich so gut ausgesehen hat. Hast Du umgesetzt, richtig?

Kannte ich noch nicht - mache ich natürlich in Zukunft.
Hans Jürgen ist offline   Mit Zitat antworten
Alt 07.01.2009, 18:14   #6
waldbauer.com
Entwickler
Ja - ich hab deinen Beitrag editiert; das mache ich aber eh nicht oft :-)
waldbauer.com ist offline   Mit Zitat antworten
Alt 08.01.2009, 18:03   #7
Schuffenhauer
Registrierter Benutzer
Ein SQL Befehl auf ein View geht im OAIII nicht nur auf Datenbanken

rekursive Abfragen müssten eigentlich so gehen:

PHP-Code:
LOCAL VIEW RE2=FROM rechnung 
                WHERE einzug
=TRUE 
       
AND (rech_nr IN SELECT rech_nr  FROM FAKT
                 Where Bedingungsfeld auf Fakt 
Bedingung
       
AND kdnr in SELECT kdnr FROM KUNDEN
                 WHERE BEdingungsfeld auf Kunden 
Bedingung)
        AND 
RECH_NR>990000 
        
AND (KDNR=reopkdnr OR GVNR=reopgvnr OR NAME IN (reopn1:reopn2))
        AND 
kdnr<>reopkdnra 
        
AND GVNR<>reopngvnr 
        
AND NOT name IN (reopna1:reopna2)  
        AND 
vu_code IN (reopvuc1:reopvuc2)  
        AND 
NOT vu_code IN (reopvun1:reopvun2)  
        AND (
rechnung.einzug=reoplevb1 OR rechnung.einzug=reoplevb2
        AND 
OFFEN<>
       ORDER NAME
,KONTO 
Wichtig die Klammern zwischen dem Beginn der Rekursion und Ende

Gruß
Frank Schuffenhauer
Schuffenhauer ist offline   Mit Zitat antworten
Alt 08.01.2009, 18:17   #8
Hans Jürgen
Registrierter Benutzer
Die Klammer könnte es gewesen sein, die den Fehler verursacht hat. Teste ich mal morgen, danke!

Aber wo ist denn in Deiner Formel eine Rekursion auf eine Nicht-Datenbank, also einen vorher definierten View?

VIEW re=FROM...

VIEW re1=FROM ... in SELECT...FROM re

Gruß
Hans Jürgen
Hans Jürgen ist offline   Mit Zitat antworten
Alt 09.01.2009, 13:58   #9
Schuffenhauer
Registrierter Benutzer
nein

bei mir nicht,

stand aber in Deiner ersten Angabe

"ich habe eine Abfrage RE1, in der aus einer Verknüpfung von rechnung.df, kunden.df und fakt.df ..."

Leider kann ich nicht ersehen, welche Felder aus welcher Datei stammen,
sonst hätte ich Dir die meiner Ansicht nach richtige Abfrage hingeschrieben

Gruß

Frank Schuffenhauer
Schuffenhauer ist offline   Mit Zitat antworten
Alt 09.01.2009, 14:19   #10
Hans Jürgen
Registrierter Benutzer
Hallo Frank,

dann noch mal von vorne, falls es wirklich möglich ist, beim IN SELECT nicht nur Datenbanken, sondern auch VIEWs zunutzen (vereinfacht dargestellt hätte ich gerne Folgendes):

PHP-Code:
VIEW re=FROM fakt WHERE einzug=TRUE 
PHP-Code:
VIEW re1=FROM rechnung WHERE rech_nr IN SELECT rech_nr FROM re 
wobei re der erste VIEW ist.

Danke für die Hilfe!

Gruß
Hans Jürgen
Hans Jürgen ist offline   Mit Zitat antworten


Antwort schreiben...

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Variable für Abfrage und Druckmaske RKabis SPI OA4 Open Access II/III/IV (2,3,4) Anwender Forum 17 28.07.2008 11:28
Abfrage bringt HEAP Error waldbauer.com SPI OA4 Open Access II/III/IV (2,3,4) Anwender Forum 7 03.04.2008 18:24
OA4 Tabellen mit EXTERN Feld verknüpfen Thomas Brunner SPI OA4 Open Access II/III/IV (2,3,4) Anwender Forum 1 06.01.2008 18:17
Nach Abfrage mit Formel eine Zufallszahl einfügen waldbauer.com SPI OA4 Open Access II/III/IV (2,3,4) Anwender Forum 8 28.11.2007 16:24
Abfrage in Programmierer RKabis SPI OA4 Open Access II/III/IV (2,3,4) Anwender Forum 5 12.07.2007 16:24