PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Hier dreht es sich um den PostGre Server

Moderator: Moderatoren

Antworten
xdragon2009
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: So, 02. Mär 2014 16:36

PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von xdragon2009 »

Hallo,

PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Kann mir bitte jemand erklären, wieso DbGoTop() in Verbindung mit der PGDBE eine unzulässige Funktion sein soll?
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von Tom »

Das kann darauf verweisen, dass die Suche im Index und der Indexschlüssel nicht übereinstimmen, bezogen auf die Typisierung. Es wird mit einem alphanumerischen Wert in einem numerischen Index gesucht, sowas. DBFNTX ist da äußerst tolerant, aber alle anderen DBEs reagieren zickiger. Die Fehlermeldung selbst ist natürlich irreführend, aber, wie gesagt - ich kenne das vorwiegend im Kontext von Index-/Typenproblemen. Es könnte auch auf ein Integritätsproblem verweisen (Indexe nicht übereinstimmend).
Herzlich,
Tom
xdragon2009
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: So, 02. Mär 2014 16:36

Re: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von xdragon2009 »

Genau das war es :D. Hätte nicht gedacht, dass bei einem INDEX so eine Fehlermeldung kommen kann.
Herzlichen Dank :angel8:
xdragon2009
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: So, 02. Mär 2014 16:36

Re: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von xdragon2009 »

Interessant ist es aber schon...

SET FILTER TO TERMIN->CUSTID == 1234567890 <-- Funktioniert

n1 := 1234567890
SET FILTER TO TERMIN->CUSTID == n1 <-- Funktioniert nicht, unzulässige Funktion beim anschließenden DbGoTop()
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von Tom »

Freut mich! :)
Interessant ist es aber schon...
Es gibt da so einige Unterschiede zwischen den DBEs, wie oben skizziert. Grundsätzlich allerdings macht ein DbSetFilter nichts weiter, als dem Workarea-Objekt den Filterausdruck zuzuweisen, würde ich behaupten. Erst mit der Navigation in der Tabelle wird der Filter wirksam bzw. evaluiert. Deshalb kann man beim SET FILTER im Prinzip machen, was man will (so lange es syntaktisch korrekt ist), aber sobald man den Satzzeiger bewegt (DbGoTop(), DbGoto(), DbSkip(), DbSeek() usw.) und also geprüft werden muss, ob der Datensatz, auf den man bewegen würde, der Filterbedingung genügt oder nicht (oder halt völlig falsch ist), knallt es.
Herzlich,
Tom
xdragon2009
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: So, 02. Mär 2014 16:36

Re: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von xdragon2009 »

Das habe ich verstanden, meinte nur, weil die beiden Ausdrücke, bis auf die Variablenübergabe, identisch sind. Einmal wird der Wert direkt im Filter gesetzt und einmal per Variable übergeben :?:.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von Tom »

Ist "n1" denn wirklich an der Stelle noch sichtbar, an der der Filterausdruck möglicherweise evaluiert wird? Wenn Du z.B. in einer Funktion auf diese Weise einen Filter bestückst, aber dann woanders in der Tabelle navigierst, sind Variablen, die im Filterausdruck referenziert wurden, natürlich nicht mehr sichtbar, wenn sie funktionslokal waren.

Code: Alles auswählen

USE KUNDEN
SetMyFilter()
DboGotop() // Crash

FUNCTION SetMyFilter()
LOCAL c1 := "Hallo"
SET FILTER TO db->name == c1
RETURN .T.
Herzlich,
Tom
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: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von ramses »

Ist es hier nicht auch so wie beim ADS: Im Filterausdruck dürfen keine Speichervariablen enthalten sein.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Marcus Herz
1000 working lines a day
1000 working lines a day
Beiträge: 851
Registriert: Mo, 16. Jan 2006 8:13
Wohnort: Allgäu
Hat sich bedankt: 39 Mal
Danksagung erhalten: 192 Mal
Kontaktdaten:

Re: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von Marcus Herz »

DbSetFilter() hat als 1. Parameter einen Codeblock, dort kann mann lokale Vaiablen auswerten:
dbSetDilter({|| db->name ==c1})
Das sollte auch bei PGDBE funktionieren
Gruß Marcus

Erkenne, was du findest, dann weißt du, wonach du gesucht hast
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von Tom »

Das sollte auch bei PGDBE funktionieren
Tut es.
Herzlich,
Tom
xdragon2009
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: So, 02. Mär 2014 16:36

Re: PGDBE + DbGoTop() = Fehler (Unzulässige Funktion)

Beitrag von xdragon2009 »

Dankeschön für eure Hilfe :angel8:
Jetzt bin ich wieder ein Stück schlauer geworden :D
Antworten