Alias in Dbsetfilter()

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Alias in Dbsetfilter()

Beitrag von Manfred »

Ich bin vorhin auf folgendes problem gestossen:

wenn ich das mache:

Code: Alles auswählen

(oJsal:nArea)->(DbSetFilter( {||;
                                 ( (oJsal:nArea)->b_soll + (oJsal:nArea)->b_haben + (oJsal:nArea)->sb_soll + (oJsal:nArea)->sb_haben + (oJsal:nArea)->k_soll  + (oJsal:nArea)->k_haben  + (oJsal:nArea)->sk_soll + (oJsal:nArea)->sk_haben + ;
                                   (oJsal:nArea)->o_soll + (oJsal:nArea)->o_haben + (oJsal:nArea)->so_soll + (oJsal:nArea)->so_haben + (oJsal:nArea)->sp_soll + (oJsal:nArea)->sp_haben +;
                                   Abs((oJsal:nArea)->vb_betr_vj) + Abs((oJsal:nArea)->vb_betr_aj) + Abs((oJsal:nArea)->hh_vor_vj)  + Abs((oJsal:nArea)->hh_vor) + ;
                                   Abs((oJsal:nArea)->FINA)       + (oJsal:nArea)->h_soll + (oJsal:nArea)->h_haben )  # 0     } ,;
                                   " ( (oJsal:nArea)->b_soll   +   (oJsal:nArea)->b_haben   +  " +;
                                   "(oJsal:nArea)->sb_soll   +  (oJsal:nArea)->sb_haben     +  " +;
                                   " (oJsal:nArea)->k_soll   +   (oJsal:nArea)->k_haben     +  " +;
                                   "(oJsal:nArea)->sk_soll   +  (oJsal:nArea)->sk_haben     +  " +;
                                   " (oJsal:nArea)->o_soll   +   (oJsal:nArea)->o_haben     +  " +;
                                   "(oJsal:nArea)->so_soll   +  (oJsal:nArea)->so_haben     +  " +;
                                   "(oJsal:nArea)->sp_soll   +  (oJsal:nArea)->sp_haben     +  " +;
                                   "Abs((oJsal:nArea)->vb_betr_vj)           +  " +;
                                   "Abs((oJsal:nArea)->vb_betr_aj)           +  " +;
                                   "Abs((oJsal:nArea)->hh_vor_vj )           +  " +;
                                   "Abs((oJsal:nArea)->hh_vor    )           +  " +;
                                   "(oJsal:nArea)->fina                      +  " +;
                                   " (oJsal:nArea)->h_soll   +   (oJsal:nArea)->h_haben )  # 0 " ))
gibt es eine Fehlermeldung bei (oJsal:nArea)->(DbGoTop()) und zwar wird gemeckert das es oJsal nicht gibt.

wenn ich das mache:

Code: Alles auswählen

(oJsal:nArea)->(DbSetFilter( {||;
                                 ( (oJsal:nArea)->b_soll + (oJsal:nArea)->b_haben + (oJsal:nArea)->sb_soll + (oJsal:nArea)->sb_haben + (oJsal:nArea)->k_soll  + (oJsal:nArea)->k_haben  + (oJsal:nArea)->sk_soll + (oJsal:nArea)->sk_haben + ;
                                   (oJsal:nArea)->o_soll + (oJsal:nArea)->o_haben + (oJsal:nArea)->so_soll + (oJsal:nArea)->so_haben + (oJsal:nArea)->sp_soll + (oJsal:nArea)->sp_haben +;
                                   Abs((oJsal:nArea)->vb_betr_vj) + Abs((oJsal:nArea)->vb_betr_aj) + Abs((oJsal:nArea)->hh_vor_vj)  + Abs((oJsal:nArea)->hh_vor) + ;
                                   Abs((oJsal:nArea)->FINA)       + (oJsal:nArea)->h_soll + (oJsal:nArea)->h_haben )  # 0     } ,;
                                   "((oJsal:nArea)->b_soll   +  b_haben   +  " +;
                                   "sb_soll   +  sb_haben     +  " +;
                                   "k_soll   +   k_haben     +  " +;
                                   "sk_soll   +  sk_haben     +  " +;
                                   "o_soll   +   o_haben     +  " +;
                                   "so_soll   +  so_haben     +  " +;
                                   "sp_soll   +  sp_haben     +  " +;
                                   "Abs(vb_betr_vj)           +  " +;
                                   "Abs(vb_betr_aj)           +  " +;
                                   "Abs(hh_vor_vj )           +  " +;
                                   "Abs(hh_vor    )           +  " +;
                                   "fina                      +  " +;
                                   "h_soll   +   h_haben )  # 0 " ))
gibt es keine Fehlermeldung.
Es scheint wohl nur für den cFilter zu gelten, nicht für den bFilter.
Hat jemand eine Erklärung dafür?
Wenn man (oJsal:nArea)->(DbFilter()) aufruft wird auch nur der Wert angezeigt, der unter cFilter steht.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
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: Alias in Dbsetfilter()

Beitrag von Tom »

Codeblöcke werden im Moment des Zugriffs evaluiert. Ein Filter-Codeblock wird also bei jeder Datensatzbewegung (Skip, GoTop usw.) evaluiert - in diesem Moment kommt es darauf an, dass die Daten sichtbar sind und stimmen. Der Textfilter ist ein Makro und wird im Moment der Erzeugung evaluiert. Aber den braucht man doch überhaupt nicht, oder?
Herzlich,
Tom
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: Alias in Dbsetfilter()

Beitrag von brandelh »

wenn die Felder in dem Codeblock der Datei entsprechen, die vorne angegeben wird, kann man entweder nur das Feld verwenden (und die Feldnamen über FIELD bestimmen),
oder aber field-> angeben, nur wenn es sich auf eine andere Datei bezieht, muss man den Alias / Workarea voranstellen. In dem Macro-Text-Filter dürften dann aber auch nur private variablen vorkommen.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Alias in Dbsetfilter()

Beitrag von Manfred »

das komische an der Sache ist, es knallt nur in diesem einen Programm. Ich habe diese Art in allen anderen Programmen auch. Zunächst dachte ich auch weil es LOCALe Variablen sind das sie unbekannt wären. Aber warum klappt es dann woanders?
@Tom,
Du hast recht, man muß den cFilter nicht angeben, aber dann wird er aus dem bFilter erzeugt und dann steht wieder das drin, was es knallen läßt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
komnick
UDF-Programmierer
UDF-Programmierer
Beiträge: 75
Registriert: Mi, 04. Jun 2014 9:56
Wohnort: Berlin
Hat sich bedankt: 1 Mal
Danksagung erhalten: 5 Mal

Re: Alias in Dbsetfilter()

Beitrag von komnick »

Vielleicht ist die Fehlermeldung irreführend und es gibt eine maximal zulässige Länge für cFilter, die du überschreitest?
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: Alias in Dbsetfilter()

Beitrag von Tom »

Nicht mit diesem bisschen Code, Kommick. Bist Du einen XBT0523 beim Kompilieren bekommst ("Length of input line excees input buffer lenght"), musst Du schon einige Semikola verwenden. :wink:

Manfred, <cFilter> ist nur dafür da, eine Antwort für DbFilter() zu definieren, und das benötigt man nur, wenn man den Filterausdruck abholen will (und, vermutlich, im Fehlersystem). Ich denke, Dein Fehler liegt im (oJsal:nArea)->(DbSetFilter ..) selbst, also im Versuch, den Filter über einen Alias zuzuweisen. SET FILTER TO arbeitet nur auf der aktuellen Workarea, und der <cFilter> soll, wenn ich das richtig verstehe, da irgendwie die Kompatiblität gewährleisten. Du verwendest doch im Filterausdruck selbst den Alias. Lass ihn einfach mal außenrum weg. Und mach vor der ersten Ausführung ein DbSelectArea(oJsal:nArea).
Herzlich,
Tom
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21165
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 206 Mal
Danksagung erhalten: 67 Mal

Re: Alias in Dbsetfilter()

Beitrag von Manfred »

Hi Tom,
es ist nur die 1 Tabelle auf und die ist aktiv.
solange ich den Alias im cFilter weg lasse klappt es, wie das obige Beispiel zeigt.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten