WAA und DbSetFilter() Error Unbekannte Funktion

Vom Front-End bis SOAP.

Moderator: Moderatoren

Antworten
DelUser01

WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von DelUser01 »

Hallo

ein seltsames Problem tritt bei einer Applikation auf dem WAA in Verbindung mit DbSetFilter() auf:

WAA mit registriertem Package (GSP1).
(Das Programm GSP1 macht Auswertungen die per lokaler EXE oder WAA abrufbar sind).
Jetzt will ich DbSetFilter() verwenden um die Ergebnissätze einzugrenzen.
Mache ich einen Filterblock mit einer Funktion meldet der WAA "Unbekannte Funktion".
z.B.:
GEHT: DbSetFilter( { | | MEMVAR->A == MEMVAR->B } )
GEHT NICHT: DbSetFilter( { | | GsTest() } )

Das Problem ist nicht DbSetFilter() ! ! !
Erst wenn nach dem Setzen des Filters folgendes gemacht wird
DbGoTop() oder DbGoBottom() kommt die Fehlermeldung!

Gehe ich aber mit DbGoTo( 10 ) zu einem Record kommt kein Fehler.

Es sieht also so aus, als würden die XBase++-Funktionen DbGoTop() die Funktion GsTest() nicht kennen. Die steht aber im selben PRG direkt neben der Filterfunktion welche DbSetFilter() ausführt. Und damit in der selben DLL in welcher alle gerade verwendeten Funktionen stehen.
Dasselbe Modul ausgeführt per lokaler EXE wird der Filter ohne Fehler richtig ausgeführt!

Hat das schon Mal jemand gehabt - oder Vorschläge was zu testen wäre?

Muss ich eventuell die DLLs irgendwo im WAA zusätzlich angeben?
So viel habe ich mit dem WAA noch nicht gemacht...
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von ramses »

Hi
versuche mal alles in eine EXE zu linken. Wenns dann geht liegt es an der Defination deiner Dll, deine Funktion im Codeblock ist nicht public, bezw. sichtbar für alles. Grundsätzlich würde ich auf eigene Funktionen und Variablen in Filter-Codeblöcken sowie DLL's konsequent verzichten und nur mit einer EXE arbeiten.



Cu Carlo
Valar Morghulis

Gruss Carlo
DelUser01

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von DelUser01 »

Hallo Carlo

Deinen Vorschlag eigene Funktionen nicht in DbSetFilter() einzusetzen kann ich nicht nachvollziehen. Das ist ein mächtiger Faktor insbesondere bei notwendigen Relationen oder komplizierten Vergleichen.
Funktioniert lokal ja alles seit Jahrzehnten - nur eben jetzt nicht mit dem WAA.
Für die gerade benötigten Filterfunktionen habe ich einen Workarround erstellt. Habe aber schon wieder eine Anforderung bei der ich noch nicht weiß wie ich das ohne Funktion in DbSetFilter() hinbekommen soll.

Du musst einen anderen Arbeitsansatz haben um nur mit EXEs auszukommen.
Das geht beim WAA schon gar nicht. Der brauch DLLs.
In meinem (End-) Programmverzeichnis befinden sich z.Zt. 79 DLLs.
Der Kunde der alle Programm-Module benützt hat auch alle diese DLLs.
Dazu kommen noch die von Windows usw.
Die EXE die das alles beinhalten würde wäre ganz schön groß...

Vermutlich ist das nur ein ganz blöder Fehler beim Linken warum die Funktionen an bestimmten Stellen im WAA nicht erkannt werden. Ich bin sicher dass wir den Stolperstein auch noch finden und aus dem Weg räumen werden - wie schon so viele in der Vergangenheit...

Gruß
Roland
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von brandelh »

Ich kenne bei EXE Dateien das Problem, dass diese Funktionen die nur in einem Macro hinterlegt sind nicht erreichbar sind.
Diese muss man dann in "totem Code" aufrufen:

Code: Alles auswählen

Procedure MAIN
...
if .f. // dies wird nie ausgeführt, aber der LINKER lädt die Funktion
   IchBinEineFunktion()
endif
eventuell ist das bei dir auch so ?
Gruß
Hubert
DelUser01

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von DelUser01 »

Hallo Hubert

das habe ich auch schon ausprobiert, direkt vor dem DbSetfilter() die Funktion aufgerufen:

xDummy := MeineFunktion()
DbSetFilter( {|| MeineFunktion() } )

...auch erfolglos.

Gruß
Roland
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von ramses »

@ Roland
ich habe natürlich nicht gemeint auf alle DLLs zu verzichten sondern den gesamten Xbase Code in einer EXE bezw. bei WAA in EINE Dll zu verpacken.

Nach einigem Ärger und fehlenden Möglichkeiten mit WAA habe ich diesen vor Jahren geschrottet und das ganze Projekt nochmals neu mit xb2net erstellt. Mir hat dieser Schritt viele Probleme beseitigt welche mich und den Kunden sehr nervten. Mit xb2net kannst du (Sourcecode version vorausgesetzt) einen kompleten Webserver inkl SSL in einer EXE Datei und den Xbase Runtime DLL's aufbauen der sich sogar als Dienst auf einem PC ohne Zusatzprogramme wie Apache installieren lässt.

Wenn dein Projekt noch nicht allzuweit vorgeschritten ist würde ich mir diesen Schritt zu xb2net unbedingt überlegen!

Funktionen in DbSetFilter funktionieren soweit ich mich noch an WAA errinnere nicht da Dbsetfilter aus waa1srv.exe ausgeführt wird und diese, deine Funktionen aus deiner DLL NICHT importiert also nicht sieht, nicht kennt und daher nicht ausführen kann.

Zudem wenn du künftig einmal noch ADS-Server verwenden willst kannst du auch keine Funktionen und Variablen in Filterausdrücken verwenden.
ADS würde ich dir sowieso für die Webapp empfehlen.

Cu Carlo
Valar Morghulis

Gruss Carlo
DelUser01

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von DelUser01 »

Hallo Carlo

ADS setze ich schon seit ewigen Zeiten ein. Auch mit dem WAA und in Kombination mehrerer Server. Klappt soweit. Ob mit ADS DbSetFilter() nicht geht kann ich gerade nicht sagen. Habe aber einiges mit DbSetFilter() programmiert - kann sein dass das alles lokale DBs sind (so wie im jetzigen Problemfall auch).
xb2.net pro habe ich auch seit einigen Monaten für spezielle Funktionen im Einsatz.

In den nächsten Tagen untersuche ich das Problem mit DbSetFilter() nochmal genauer...

Gruß
Roland
DelUser01

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von DelUser01 »

Hallo

Habe die Problemstelle gefunden!
(eigentlich ganz einfach):

GEHT NICHT:
1)
Local cFilter
cFilter := „{ | | P1Hx1UeHasTitlesL() .Or. P1Hx1UeHasLitHinwL() }"
DbSetFilter( &( cFilter ) , cFilter )
2)
DbSetFilter( &( cFilter ) )

GEHT!:
3)
DbSetFilter( { | | P1Hx1UeHasTitlesL() .Or. P1Hx1UeHasLitHinwL() })
4)
DbSetFilter( { | | P1Hx1UeHasTitlesL() .Or. P1Hx1UeHasLitHinwL() } , "{ | | P1Hx1UeHasTitlesL() .Or. P1Hx1UeHasLitHinwL() }" )

Man muss also den Block direkt in die DbSetFilter()-Funktion schreiben!!!

Gruß
Roland
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von brandelh »

Das macht Sinn, der CodeBlock der zur compilerzeit erstellt wird landet als Referenz direkt in der DLL.
Der zur Laufzeit generierte wird aber in der EXE erzeugt, da ja die DLL zu diesem Zeitpunkt readonly für die EXE ist.
Gruß
Hubert
DelUser01

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von DelUser01 »

Hallo

Alles auf Anfang... leider - es geht doch nicht!

Weiß nicht wie ich da getestet habe aber DbSetFilter() über WAA bringt an der entsprechenden Stelle immer noch den Fehler dass die Funktion nicht vorhanden ist.

Damit es überhaupt weiterging hatte ich einen Workaround eingebaut. Die Lösung ist aber im Live-Betrieb nicht rationell.

Falls doch noch jemand eine Idee hätte...

Gruß
Roland
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von ramses »

Hallo Roland

da du waa1srv.exe nicht selbst compilieren kannst bist du schutzlos dem Konzept und den Problemen/Fehlern von WAA ausgeliefert. Ich kann dir nur nochmals empfehlen zu xb2net zu wechseln bevor du mit WAA allzuviel Zeit verbraten hast ...... Oder dich eine Zertifizierungsstelle dazu zwingt. ..

Cu Carlo
Valar Morghulis

Gruss Carlo
DelUser01

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von DelUser01 »

Hallo

das Problem hatte mir jetzt keine Ruhe gelassen, jetzt habe ich die Lösung.
Die Herren vom Alaska-Support haben mir geholfen das mit der Änderung der Funktionsnamen im WAA zu verstehen. Es kann Gründe dafür geben das man das so gelöst hat.

Vor DbSetFilter() schaue ich nach, ob das Programm unter WAA läuft.
Wenn nein wird der Block für DbSetFilter direkt mit der benötigten Funktion (1) erstellt.
Wenn ja, dann wird vor den Funktionsnamen im Block der Name des WAA-Packets gesetzt.
Über diesen Zusatz (Umweg) geht es also.

Code: Alles auswählen

Local cFilter
If MainWaa1Mode()
   cFilter := "{ | | " + MEMVAR->cWaaPackage + "P1Hx1UeFilter() }"
Else
   cFilter := "{ | | P1Hx1UeFilter() }"
EndIf
DbSelectArea( "P1Hx1" )
DbSetFilter( &( cFilter ) , cFilter )
Gruß
Roland
DelUser01

Re: WAA und DbSetFilter() Error Unbekannte Funktion

Beitrag von DelUser01 »

Und noch ein Nachtrag:

Der WAA findet jetzt die Funktionen im DbSetFilter() wieder.
Der Fehler war, dass ich für die WAA-Packet-DLL keine eigene DLL erstellt habe in welcher nur die wenigen vom WAA direkt aufgerufenen Functions stehen sondern die WAA-Funktionen einfach in andere DLLs mit aufgenommen habe.

Jetzt ist es je WAA-Packet eine DLL mehr und es geht wieder "normal" ohne den Umweg mit der Function-Indizierung.

Gruß
Roland
Antworten