Indexausdruck für Zeitspanne

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Indexausdruck für Zeitspanne

Beitrag von Magic »

Guten Morgen,

suche eine Lösung für folgende Herausforderung:
Die in einer .DBF enthaltenen Datensätze haben ein Start- und ein Enddatum.
Die Datumsangaben sind oft identisch, können aber auch unterschiedlich(!) sein. Und das ist für mich die Stelle an der ich scheitere.
Wie müsste ein Indexausdruck lauten, um per DbSetScope() Datensätze zu bekommen, die zwischen zwei verschiedenen Daten liegen (Zeitspanne), also z.B. zwischen dem 01.01.2014 (als Startdatum) und dem 05.01.2014 (als Enddatum).

Ich meine ich brauche unbedingt beide Daten für die Auswertung eine Zeitspanne. Beschränke ich mich nur auf das Startdatum, bekomme ich evtl. zu viele DS, nehme ich nur das Enddatum, sind es evtl. zu wenige.

Als Bsp.

Code: Alles auswählen

	   Startdatum	Enddatum
DS0	31.12.2013	01.01.2014  X
DS1	01.01.2014	02.01.2014  <-
DS2	02.01.2014	02.01.2014  <-
DS3	03.01.2014	03.01.2014  <-
DS4	03.01.2014	04.01.2014  <-
DS5	04.01.2014	04.01.2014  <-
DS6	04.01.2014	05.01.2014  <-
DS7	05.01.2014	05.01.2014  <-
DS8	05.01.2014	06.01.2014  X
Für meine Auswertung hätte ich gerne die DS1 bis DS7. Start am 01.01. und das Ende am 05.01.
Setze ich ein Scope nur auf das Startdatum bekomme ich noch den DS8. Also einen zu viel, denn der Endet erst am 06.01. Ein Scope auf das Enddatum würde auch den DS0 liefern, also wider mind. einer zu viel.

Denke ich an dieser Stelle zu kompliziert? Oder ist es gar nicht möglich so einen Indexausdruck zu bekommen?
Da es mir hier nicht um Geschwindigkeit geht, werde ich schlimmstenfalls mit ´nem Filtern arbeiten müssen.
Gruß,
Magic
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Indexausdruck für Zeitspanne

Beitrag von brandelh »

du kannst mit einen scope von bis abdecken, aber nicht gleichzeitig in 2 Feldern.
Ich würde mit dem scope das startdaturm einschränken, und mit einem zusätzlichen Filter die überflüssigen rauswerfen ;-)
Gruß
Hubert
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Indexausdruck für Zeitspanne

Beitrag von Magic »

Hallo,
brandelh hat geschrieben:du kannst mit einen scope von bis abdecken, aber nicht gleichzeitig in 2 Feldern.
Ich würde mit dem scope das startdaturm einschränken, und mit einem zusätzlichen Filter die überflüssigen rauswerfen ;-)
bin gerade dabei es so zu realisieren.
Danke für die Bestätigung :wink:
Gruß,
Magic
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Indexausdruck für Zeitspanne

Beitrag von AUGE_OHR »

brandelh hat geschrieben:du kannst mit einen scope von bis abdecken, aber nicht gleichzeitig in 2 Feldern.
hm ... also mit Text Felder geht es ... DTOS() gibt ja einen String.

Code: Alles auswählen

PROCEDURE MAIN
LOCAL i,iMax
LOCAL aDate :={}

   AADD(aDate,{"31.12.2013","01.01.2014"} )
   AADD(aDate,{"01.01.2014","02.01.2014"} )
   AADD(aDate,{"02.01.2014","02.01.2014"} )
   AADD(aDate,{"03.01.2014","03.01.2014"} )
   AADD(aDate,{"03.01.2014","04.01.2014"} )
   AADD(aDate,{"04.01.2014","04.01.2014"} )
   AADD(aDate,{"04.01.2014","05.01.2014"} )
   AADD(aDate,{"05.01.2014","05.01.2014"} )
   AADD(aDate,{"05.01.2014","06.01.2014"} )

   USE SCOPDATE EXCLUSIVE
   ZAP

   iMax := LEN(aDate)
   FOR i := 1 TO iMax
      APPEND BLANK
      REPLACE SCOPDATE->DATE1 WITH CTOD( aDate[i,1] )
      REPLACE SCOPDATE->DATE2 WITH CTOD( aDate[i,2] )
   NEXT

   INDEX ON DTOS(SCOPDATE->DATE1)+DTOS(SCOPDATE->DATE2) TO MYSCOPE
   SET SCOPETOP    TO "2014010120140101"
   SET SCOPEBOTTOM TO "2014010520140105"

   BROWSE()

RETURN
gruss by OHR
Jimmy
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: Indexausdruck für Zeitspanne

Beitrag von UliTs »

Nein, Jimmy :!:
Das Anfangsdatum kann ja auch vor dem Zeitraum liegen, wenn das Endedatum innerhalb liegt.
Ebenso könnte das Endedatum nach dem Zeitraum liegen, wenn das Anfangsdatum innerhalb liegt.
Und in beiden Fällen würden bei deiner Lösung die Records nicht gefunden :( .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Indexausdruck für Zeitspanne

Beitrag von Wolfgang Ciriack »

Hallo Uli,
da liegst du m.E. falsch, denn die, die du erwähnst, will Magic ja nicht haben.
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Indexausdruck für Zeitspanne

Beitrag von brandelh »

AUGE_OHR hat geschrieben:
brandelh hat geschrieben:du kannst mit einen scope von bis abdecken, aber nicht gleichzeitig in 2 Feldern.
hm ... also mit Text Felder geht es ... DTOS() gibt ja einen String.
die Bemerkung zu DTOS() regte mich zuerst zu "na klar doch, mach ich immer ..." Gedanken an,
aber die Verkettung von den beiden Datumswerten könnte tatsächlich die gewünschte Wirkung haben.

Wenn die Bedingung gilt, dass beide Datumswerte im Zeitraum sein müssen und man ...

index on dtos(StartDatum)+dtos(EndDatum)
SET SCOPE TO "2014010120140101", "2014030120140301"
wird er zunächst alle aussortieren, bei denen das Startdatum nicht zwischen "20140101" und "20140301" passt,
danach wird er noch die aussortieren deren Enddatum nicht passt.

Ich nehme meine obige Aussage in diesem Fall zurück ;-)

PS: eine SCOPE + FILTER Kombination kann in anderen Fällen dennoch sehr nützlich sein ;-)
Gruß
Hubert
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Indexausdruck für Zeitspanne

Beitrag von nightcrawler »

brandelh hat geschrieben:PS: eine SCOPE + FILTER Kombination kann in anderen Fällen dennoch sehr nützlich sein ;-)
Oder sehr schädlich. IIRC arbeitet magic mit ADS und da sollte man SCOPES und FILTER niemals mischen (SCOPES werden clientseitig ausgeführt, FILTER serverseitig).
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Indexausdruck für Zeitspanne

Beitrag von brandelh »

meine Aussage bezog sich ausschließlich auf DBF/FOX-NTX/CDX ! ;-)
Gruß
Hubert
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: Indexausdruck für Zeitspanne

Beitrag von UliTs »

brandelh hat geschrieben:meine Aussage bezog sich ausschließlich auf DBF/FOX-NTX/CDX ! ;-)
Und genau das ist mit dem ADS ungünstig. Meines Erachtens sollte man beim ADS grundsätzlich auf Scopes verzichten.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
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: Indexausdruck für Zeitspanne

Beitrag von UliTs »

Wolfgang Ciriack hat geschrieben:Hallo Uli,
da liegst du m.E. falsch, denn die, die du erwähnst, will Magic ja nicht haben.
Du hast Recht! Wenn Teilmengen nicht gefunden werden sollen, ist es ganz einfach.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten