2012-03-28 14 views
0

Ich habe keine Ahnung, was der offizielle Name dafür ist, vielleicht deshalb kann ich nichts online finden. Grundsätzlich, wenn Sie sql in vfp verwenden, führt es einen ersten Durchlauf durch (manchmal 2?), Ohne den Datensatzcursor zu verschieben oder die Ergebnisse zu speichern. Leider habe ich Subroutinen in meinem SQL, die während dieses ersten Durchlaufs laufen und Dinge ändern.VFP sql prepass

Warum verwende ich Subroutinen in SQL-Abfragen? Weil vfp das Referenzieren außerhalb einer Unterabfrage innerhalb der ausgewählten Elemente nicht unterstützt (ich kenne den offiziellen Namen nicht mehr).

Beispiel: select id, (select detail.name from detail where master.id == detail.id) name from master

Dies funktioniert zwar: select id, getname(id) from master

wo getname() ist eine Unterroutine die SQL von dem ersten Beispiel enthält.

Sie könnten auch einen Join verwenden, aber das obige ist nur ein Beispiel und ein Join funktioniert in meinem Fall nicht.

Gibt es eine Möglichkeit mit Anstich Durch umgehen? Erzeugt vfp einen booleschen Wert wie firstpass oder so? Ich nehme an, ich könnte meiner Unterroutine eine Zählung hinzufügen, aber das scheint unordentlicher zu sein, als es bereits ist.

Alternativ kann mir jemand eine Erklärung zu vfps Initial Pass erklären oder verlinken? Ich glaube, es war nur ein erster Durchlauf vorher, aber jetzt macht es zwei, nachdem ich einen Code geändert habe.

Edit: ok, ich habe mich geirrt. Das obige Beispiel funktioniert. Was nicht funktioniert, ist die folgende:
SELECT d2.id, (SELECT TOP 1 d1.lname l FROM dpadd d1 WHERE d1.id== d2.id ORDER BY l) FROM dpadd d2
Es gibt mir ein „SQL: Anfragen dieser Art werden nicht unterstützt“ Fehler.
Seltsamer funktioniert es, wenn ich folgendes tun:
SELECT d2.id, (SELECT COUNT(d1.lname) FROM dpadd d1 WHERE d1.id == d2.id) FROM dpadd d2

Über die Subroutinen, sie sind Methoden meiner Form. Die Datenbanken sind lokale DBF-Dateien. Ich interagiere nicht mit irgendwelchen Servern, führe gerade sql Befehle mit into cursor Klauseln aus und erzeuge dann Berichte (normalerweise).

Ich werde mit einer tatsächlich nützlich select-Anweisung in ein paar Minuten nach zurück, dass „nicht unterstützt“. Ich bin sicher, dass Sie bemerkt haben, dass das top 1 Beispiel völlig nutzlos ist.

+0

Erläuterung ... Ist die Funktion GetName() eine Funktion auf der lokalen VFP-Seite? oder ist es eine gespeicherte Prozedur in dem SQL-Server, zu dem Sie eine Verbindung herstellen. Könnten Sie auch zeigen, was Sie eigentlich tun möchten? VFP Deos unterstützen komplexe Unter Abfrage callss zu SQL Server, auch parametrisierte Abfragen mit lokalen Variablen ohne die SQL-Zeichenfolge zu ändern über SQLPrepare ausgeführt werden() oder SQLExec(). – DRapp

Antwort

0

Es scheint, dass TOP in Projektionen nicht zulässig ist. In diesem Beispiel können Sie stattdessen Folgendes tun:

SELECT d2.id, (SELECT MAX(d1.lname) l FROM dpadd d1 WHERE d1.id== d2.id) FROM dpadd d2 

Was gibt Ihnen sonst ein Problem?

Tamar