waldbauer.com

waldbauer.com (http://www.waldbauer.com/vb/index.php)
-   SPI OA4 Open Access II/III/IV (2,3,4) Anwender Forum (http://www.waldbauer.com/vb/forumdisplay.php?f=57)
-   -   OA III Abfrage mit Abfrage verknüpfen (http://www.waldbauer.com/vb/showthread.php?t=2106)

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 


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 


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

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

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.

Ja - ich hab deinen Beitrag editiert; das mache ich aber eh nicht oft :-)

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

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

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

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:04 Uhr.

Powered by vBulletin® Version 3.8.7 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.