Seite 1 von 3

Architect SQL zu Programm SQL

Verfasst: Mi, 04. Nov 2020 10:57
von Manfred
Ich haue jetzt erstmal was ganz pauschal hier raus. Mir ist jetzt mehrfach aufgefallen, das ein SQL Script im Architecten funktioniert, aber im Programm untergebracht ein NIL Ergebnis zurückliefert. Was ist das denn jetzt schon wieder?

Re: Architect SQL zu Programm SQL

Verfasst: Mi, 04. Nov 2020 11:41
von nightcrawler
Muss ein Fehler auf Deiner Seite sein ... evtl auf eine andere Verbindung o.ä.?
Fragst Du die Rückgabewerte ab (LastError)?

Re: Architect SQL zu Programm SQL

Verfasst: Mi, 04. Nov 2020 11:42
von Manfred
nein, mache ich nicht. Aber danke für den Kopfschlag werde ich mal sofort einbauen. Ich bin immer davon ausgegangen, das es klappen muß :roll:

Re: Architect SQL zu Programm SQL

Verfasst: Mi, 04. Nov 2020 11:52
von Manfred
ich habe an beiden letzten Zeilen eine Abfrage oADsServer:osession:getlasterror() gemacht
hm, es wird immer 0 zurückgeliefert.

Code: Alles auswählen

TEXT INTO cSqlStmt WRAP Chr(13) Trimmed
               SELECT rg.uid,
                      rg.datumvon,
                      rg.zeitvon,
                      rg.datumbis,
                      rg.zeitbis,
                      fz.kfznr,
                      fz.kennzeich,
                      infra.bez Infrastruktur,
                      ra.bez Reinigungsvorgang,
                      fa.nummer,
                      fa.vorname,
                      fa.name
               FROM reinigung rg
               left join fahrzeuge fz ON rg.idfahrzeug=fz.id
               left join infrastruktur infra ON rg.idinfra=infra.id
               left join reinigungsvorgaenge rvg ON rg.uid=rvg.reinigung
               left join reinigungsarten ra ON rvg.idart=ra.id
               left join fahrer fa ON rg.nummer = fa.nummer
               ORDER BY rg.datumvon DESC, fa.nummer
          ENDTEXT
          oSqlStmt := DC_AdsStatement():new(cSQLStmt,oAdsServer:oSession)
          cAlias   := oSqlStmt:execute()
dieses Script klappt im Architekten problemlos. Wenn ich , fa.nummer wegnehme läuft es auch im Programm. Egal, was ich als 2. Order angebe, es klappt nicht.

Re: Architect SQL zu Programm SQL

Verfasst: Mi, 04. Nov 2020 23:36
von UliTs
Ich kenne die Klasse nicht. Ist die von Roger Donnay?
Vielleicht ist die Execute-Methode die Falsche.
Gibt es auch so etwas wie :Open() ?

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 8:40
von Manfred
der Name ist doch egal. Dahiner steckt ein DbUseArea() Und danach ist Query nicht offen. Und einen Fehler gibt es auch nicht.

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 9:04
von UliTs
?
Ich kenne es so, das die Methode :Open zum öffnen von Datenmengen wie select benutzt wird und Exec zum ausführen von Befehlen wie Update.
Was ist mit meiner ersten Frage bzgl. Roger?

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 9:16
von Bertram Hansen
Uli,

ja die DC_AdsStatement() ist von Roger.
Die ist vergleichbar mit der Methode von Friedhelms ADS Klasse oConnect:OpenSQL(cSQL)

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 10:11
von UliTs
Bzw. :ExecSql( cSql ) :D

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 10:12
von Bertram Hansen
Genau

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 11:07
von UliTs
Dann könnte es bei Manfreds Problem doch genau daran liegen, nämlich Aufruf der falschen Methode :) .

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 11:08
von Manfred
dafür hätte ich jezt gerne mal eine genaue Erklärung....

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 11:27
von UliTs
Manfred hat geschrieben: Do, 05. Nov 2020 11:08 dafür hätte ich jezt gerne mal eine genaue Erklärung....
Ich habe es so gut wie möglich versucht, zu erklären. In der AceServer-Klasse von Friedhelm gibt es die beiden Methoden :OpenSql( cSql ) und :ExecSql( cSql ). Nur die Erste gibt einen Handle auf die geöffnete Tabelle zurück.
Ich habe mir gerade noch die ADS-API angeschaut. Da gibt es nur die Funktion AdsExecuteSql(), die in beiden Fällen aufgerufen wird. Diese gibt ein Handle auf die geöffnete Sql-Tabelle zurück bzw. der Handle ist = 0, wenn keine Tabelle geöffnet wurde.

Die Frage ist halt, wie Roger das gemacht hat.
Bertram: wenn ich Dich richtig verstanden habe, gibt es zwei entsprechende Methoden zu OpenSql/ExecSql bei Roger. Wie lauten diese?

Uli

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 11:30
von Manfred
Roger endet im prinzip bei einem DbUSeArea(). Das öffnet aber nicht und gibt auch derzeit keine Fehlernummer zurück (prüfe ich aber noch). Es befindet sich in einem Begin Sequence und springt direkt nach dem Aufruf da raus, was nicht richtig ist an der Stelle und zu dem zeitpunkt. Wenn ich aber dann ein neterr() anfrage, kommt "0" zurück.

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 11:43
von nightcrawler
Zumindest gibt es ja bei anderem SQL ein Handle zurück, von daher vermute ich nicht den Fehler in den Klassen.

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 11:58
von Manfred
es gibt überall ein handle zurück und keine fehlermeldung. Nur DbUseArea() liefert kein query zurück.

Re: Architect SQL zu Programm SQL

Verfasst: Do, 05. Nov 2020 12:31
von Bertram Hansen
UliTs hat geschrieben: Do, 05. Nov 2020 11:27 Bertram: wenn ich Dich richtig verstanden habe, gibt es zwei entsprechende Methoden zu OpenSql/ExecSql bei Roger. Wie lauten diese?
Uli
Uli, das kann ich dir erst heute Abend mitteilen.

Re: Architect SQL zu Programm SQL

Verfasst: Mo, 09. Nov 2020 12:05
von UliTs
Bertram Hansen hat geschrieben: Do, 05. Nov 2020 12:31 Uli, das kann ich dir erst heute Abend mitteilen.
Und?

Re: Architect SQL zu Programm SQL

Verfasst: Mo, 09. Nov 2020 14:43
von Bertram Hansen
Sorry Uli, mein Kurzzeitgedächtnis. #-o

Re: Architect SQL zu Programm SQL

Verfasst: Mo, 09. Nov 2020 21:19
von Bertram Hansen
Uli,

hier kommt mal ein wenig Quellcode:

Code: Alles auswählen

oSession := DacSession():New( cConnect )
oSessionRoger := DC_AdsSession( oSession )
oStmtRoger := DC_AdsStatement():New("SELECT * FROM tabellexyz", oSessionRoger )
cAlias := oStmtRoger:execute()
(cAlias)->(DBGOTOP())
... Mach irgendwas
(cAlias)->(DBCLOSEAREA())
oStmtRoger:close()
oSession:disconnect()

Re: Architect SQL zu Programm SQL

Verfasst: Mo, 09. Nov 2020 22:54
von UliTs
Das sieht für mich recht gut aus!
Wenn ich es richtig sehe, ersetzt Roger dass DbUseArea(). D.h., du hast es etwas anders als von Manfred ursprünglich geplant umgesetzt. Funktioniert es?

Edit: überflüssiges Komma entfernt

Re: Architect SQL zu Programm SQL

Verfasst: Di, 10. Nov 2020 9:11
von Bertram Hansen
Meines Wissens setzt Manfred das so oder so ähnlich ein. Roger "ersetzt" nicht nur das DbUseArea(), da passieren noch andere Sachen. Und es funktioniert auch.

Re: Architect SQL zu Programm SQL

Verfasst: Di, 10. Nov 2020 9:13
von Manfred
Roger ersetzt weder DbUSeArea() noch DbCloseArea(). Er ergänzt es durch eigenen Code.

Re: Architect SQL zu Programm SQL

Verfasst: Di, 10. Nov 2020 16:53
von Manfred
das hier zeigt die WB an, anstatt ein Query zurückzuliefern
oerror.PNG
oerror.PNG (13.17 KiB) 8682 mal betrachtet

Re: Architect SQL zu Programm SQL

Verfasst: Di, 10. Nov 2020 21:00
von UliTs
Zeig doch bitte mal den Quellcode so ähnlich wie Bertram das gemacht hat.