SET SCOPE mit dem ADS

Advantage Database Server

Moderator: Moderatoren

Antworten
CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 123
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Hat sich bedankt: 10 Mal
Danksagung erhalten: 2 Mal
Kontaktdaten:

SET SCOPE mit dem ADS

Beitrag von CRT »

Funktioniert SET SCOPE mit dem ADS eigentlich unter Xpp 1.9.355?
lg
CRT
Zeiterfassung . Zutrittskontrolle
www.CRT-software.com
:wav:
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SET SCOPE mit dem ADS

Beitrag von UliTs »

Ich wüsste nicht, was dagegen spricht!
Funktioniert es bei Dir nicht? Zeig dann mal ein Codebeispiel.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 123
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Hat sich bedankt: 10 Mal
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: SET SCOPE mit dem ADS

Beitrag von CRT »

Danke für die rasche Antwort. Ich hab grad keinen ADS am Laufen und daher einfach mal nachgefragt, weil ja einige Sachen von der ADSDBE nicht unterstützt werden. Muss ohnehin mal die neue Version 11 testen, sobald es die Zeit zulässt.
lg
CRT
Zeiterfassung . Zutrittskontrolle
www.CRT-software.com
:wav:
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: SET SCOPE mit dem ADS

Beitrag von Tom »

Hallo, CRT.
weil ja einige Sachen von der ADSDBE nicht unterstützt werden
Die ADSDBE unterstützt alles, was DBF/FOX usw. auch können. Es gibt zwei halbwegs relevante Einschränkungen: 1. Je Tabelle darf es maximal 15 Indexdateien geben (im Normalfall gibt es längst nicht so viele) und 2. in den Indexausdrücken dürfen keine UDFs verwendet werden, weil die ADS diese nicht auflösen kann. Außerdem gibt es geringfügige Einschränkungen im Hinblick auf sonstige Xbase-Funktionen, die in Indexausdrücken verwendet werden können, aber die üblichen Funktionen von DtoC() über AllTrim() und PadR() bis Str() werden unterstützt.

Zu beachten ist auch, dass die ADS Filterausdrücke lokal auswertet, wenn man darin UDFs verwendet. SET FILTER TO HatGeburtstag(db->geb_dat,Date()) kann nicht vom ADS aufgelöst werden. Das spielt aber im Normal-/Migrationsfall keine Rolle, weil es ja trotzdem funktioniert. Derlei gehört dann später zum Finetuning, wenn die ADS-Unterstützung läuft.
Herzlich,
Tom
CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 123
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Hat sich bedankt: 10 Mal
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: SET SCOPE mit dem ADS

Beitrag von CRT »

Danke Tom.
lg
CRT
Zeiterfassung . Zutrittskontrolle
www.CRT-software.com
:wav:
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SET SCOPE mit dem ADS

Beitrag von UliTs »

Tom hat geschrieben:...
Zu beachten ist auch, dass die ADS Filterausdrücke lokal auswertet, wenn man darin UDFs verwendet. SET FILTER TO HatGeburtstag(db->geb_dat,Date()) kann nicht vom ADS aufgelöst werden. Das spielt aber im Normal-/Migrationsfall keine Rolle, weil es ja trotzdem funktioniert. Derlei gehört dann später zum Finetuning, wenn die ADS-Unterstützung läuft.
Ich setze oft solche Filter wie

Code: Alles auswählen

DbSetFilter( {||FIELD->ATId=nATId}
ein, wobei nATId eine LOCAL ist.
Das kann der ADS (natürlich) auch nicht auflösen und der Filter muss deshalb lokal berechnet werden (VIEL zu langsam).
Ich habe das wie folgt gelöst:

Code: Alles auswählen

UTsDbSetFilter( "ATId="+AllTrim(Str(nATId)) )

FUNCTION UTsDbSetFilter( cFilter ) // Im Gegensatz zu DbSetFilter() wird Filterbedingung nur als String
LOCAL cOldFilter:=DbFilter()       // übergeben, "" akzeptiert und der alte Filter zurückgegeben.
LOCAL cbFilter,bFilter
  IF valType(cFilter)=="C"
    IF empty( cFilter )
      DbClearFilter()
    ELSE
      cbFilter := "{||"+cFilter+"}"
      bFilter  := &cbFilter
      DbSetFilter( bFilter,cFilter )
    ENDIF
  ENDIF
RETURN( cOldFilter )
Dadurch kann der ADS den Filter auflösen und mit existierenden Indizes optimieren (RASEND schnell) :-) .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
CRT
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 123
Registriert: Mo, 18. Aug 2008 9:33
Wohnort: Kärnten / Österreich
Hat sich bedankt: 10 Mal
Danksagung erhalten: 2 Mal
Kontaktdaten:

Re: SET SCOPE mit dem ADS

Beitrag von CRT »

Hallo Uli,

ich habe das so gelöst um den Filter EIN-/AUS zu schalten:

Code: Alles auswählen

        cDbFilter:= iif(lFilter, "MsgP =="+str((select())->MsgP,6,0), "")  // SO N!CHT (Filter) --> := "NIL"
        SET FILTER TO &cDbFilter
lg
CRT
Zeiterfassung . Zutrittskontrolle
www.CRT-software.com
:wav:
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: SET SCOPE mit dem ADS

Beitrag von UliTs »

Ja, genau so. Und jetzt noch in eine schöne Funktion mit der Möglichkeit, den alten Filter wieder herzustellen, verpacken :D .
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten