Autor Thema: Fehler beim Erzeugen von einem Array of DateTime  (Gelesen 4865 mal)

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Fehler beim Erzeugen von einem Array of DateTime
« am: 18.02.11 - 15:38:03 »
Hallo,

ich versuche ein Array mit Datumwerten zu füllen.
Vorgabe ist ein Von- und ein Bis-Datum. In einer Schleife soll dann das Array gefüllt werden:

Code
			Dim aDates() As NotesDateTime, vdate As NotesDateTime, bdate As NotesDateTime
			Dim i As Integer
			Set vdate = New NotesDateTime("15.03.2011")
			Set bdate = New NotesDateTime("17.03.2011")
			ReDim aDates(0)
			Set aDates(0) = vdate
			vdate.Adjustday(1)
			i = 0
			While vdate.Dateonly <= bdate.Dateonly
				If (Weekday(vdate.Dateonly) <> 7) And (Weekday(vdate.Dateonly) <> 1) Then
					i = i + 1
					ReDim Preserve aDates(UBound(aDates) + 1)
					Set aDates(UBound(aDates)) = vdate 					
				End If
				vdate.Adjustday(1)
			Wend
			Call doc.ReplaceItemValue( "CalendarDateTime", aDates)

Was aber herauskommt ist dreimal der 18.03.2011.
Als wenn er beim Eintragen in den Array nicht den tatsächlichen Wert, sondern die Referenz auf die Variable einträgt.
Beim Beenden der Schleife entspricht vdate ja dem 18.03.2011.

Muss ich hier mit einer Hilfsvariable arbeiten oder wie?
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #1 am: 18.02.11 - 15:56:56 »
Als wenn er beim Eintragen in den Array nicht den tatsächlichen Wert, sondern die Referenz auf die Variable einträgt.

Du arbeitest hier mit einer Instanz der Klasse NotesDateTime und da wird nicht der Wert im Array abgelegt sondern, wie du bereits richtig erkannt hast, nur ein Verweis.

Muss ich hier mit einer Hilfsvariable arbeiten oder wie?

Du darfst dein Array nicht auf die Klasse NotesDateTime beziehen sondern z.B. als Variant.

Axel
 
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #2 am: 18.02.11 - 16:19:12 »
Bei einem
Dim aDates() As Variant
ist jetzt CalendarDateTime ein empty String.  :-:
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #3 am: 18.02.11 - 16:26:13 »
Oder:

Code
Set aDates(UBound(aDates)) = New NotesDateTime(vdate.DateOnly)

Bei der letzten Zeile
Zitat
Call doc.ReplaceItemValue( "CalendarDateTime", aDates)
ist mir allerdings neu, dass das funktioniert, da aDates ja NotesDateTime-Objekte enthält und mir war / ist nicht klar, dass diese direkt dem Feld zugeordnet werden können ?!?

Gruß
Marco
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #4 am: 18.02.11 - 16:28:07 »
Ich habe das Ganze mal auf die Schnelle angepasst und in einen Button innerhalb der Maske gelegt und es funktioniert.

Code
	
	Dim ws As New NotesUIWorkspace
	Dim uidoc As NotesUIDocument
	Dim doc As NotesDocument
	
	Dim aDates() As Variant, vdate As NotesDateTime, bdate As NotesDateTime
	Dim i As Integer
	
	Set uidoc = ws.CurrentDocument
	Set doc = uidoc.Document
	
	Set vdate = New NotesDateTime("15.03.2011")
	Set bdate = New NotesDateTime("17.03.2011")
	Redim aDates(0)
	aDates(0) = vdate.DateOnly
	vdate.Adjustday(1)
	i = 0
	While vdate.Dateonly <= bdate.Dateonly
		If (Weekday(vdate.Dateonly) <> 7) And (Weekday(vdate.Dateonly) <> 1) Then
			i = i + 1
			Redim Preserve aDates(Ubound(aDates) + 1)
			aDates(Ubound(aDates)) = vdate.DateOnly 					
		End If
		vdate.Adjustday(1)
	Wend
	
	Call doc.ReplaceItemValue( "CalendarDateTime", aDates)
	
	Call uidoc.Refresh
	

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #5 am: 18.02.11 - 16:30:30 »
Axel, jetzt hast Du aber ein Array of Strings.

Bernhard

Offline marschul

  • Senior Mitglied
  • ****
  • Beiträge: 280
  • Geschlecht: Männlich
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #6 am: 18.02.11 - 16:36:40 »
Bernhard,

das dürfte leicht zu lösen sein über
Code
aDates(Ubound(aDates)) = vdate.LSLocalTime

Gruß
Marco
Gruß
Marco

Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß. (Sokrates)
Keiner ist unnütz, er kann immer noch als schlechtes Beispiel dienen. (unbekannt)

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #7 am: 18.02.11 - 16:36:46 »
Yoo, aber wenn ich das einem DateTime - Feld zuweise sollte es doch wieder passen.

Oder sehe ich das falsch?

Axel
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #8 am: 18.02.11 - 16:48:54 »
Dem Backend ist der Feldtyp im Frontend absolut egal. Wenn ich also ein String-Array einem Item zuweise, dann wird das auch ein String-Array - selbst, wenn es vorher schon Date/Time gewesen wäre.

Knud soll einfach mit Variants vom Typ Date/Time arbeiten. Dann kann er ganz einfach mit einer For-Next-Schleife arbeiten.

Dim vStart As Variant
Dim vEnd As Variant
Dim vLoop As Variant

For vLoop = vStart To vEnd Step 1
   'vLoop in Array schreiben
Next

HTH,
Bernhard

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #9 am: 21.02.11 - 07:33:26 »
Date/Time ist wohl wirklich nicht so mein Fall....  :-:

Wenn ich Bernhards Beispiel versuche umzusetzen, erhalte ich einen Type Mismatch in der For-Schleife:
Ich denke, dass die For-Schleife so nur für numerische Werte funktioniert?

Code
			Dim aDates() As Variant
			Dim vStart As Variant
			Dim vEnd As Variant
			Dim vLoop As Variant
			Set vdate = New NotesDateTime("15.03.2011")
			Set bdate = New NotesDateTime("18.03.2011")
			Set vStart = vdate
			Set vEnd = bdate
			For vLoop = vStart To vEnd Step 1
				ReDim Preserve aDates(UBound(aDates) + 1)
				Set aDates(UBound(aDates)) = vLoop
			Next
			Call doc.ReplaceItemValue( "CalendarDateTime", aDates)
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #10 am: 21.02.11 - 09:15:55 »
Und ich war mir soo sicher, dass folgender Code funktionieren würde (erzeugt aber auch nur einen leeren CalendarDateTime):

argvdat = "15.03.2011", argbdat = "17.03.2011"
Code
			Dim aDates() As Variant
			Set vdate = New NotesDateTime(argvdat)
			Set bdate = New NotesDateTime(argbdat)
			ReDim aDates(0)
			Set aDates(0) = New NotesDateTime(argvdat & " " & starttime)
			vdate.Adjustday(1)
			While vdate.Dateonly <= bdate.Dateonly
				If (Weekday(vdate.Dateonly) <> 7) And (Weekday(vdate.Dateonly) <> 1) Then
					ReDim Preserve aDates(UBound(aDates) + 1)
					Set aDates(UBound(aDates)) = New NotesDateTime(CStr(vdate.DateOnly) & " " & starttime) 					
				End If
				vdate.Adjustday(1)
			Wend
			Call doc.ReplaceItemValue( "CalendarDateTime", aDates)
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline pram

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.170
  • Geschlecht: Männlich
    • Foconis Object Framework
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #11 am: 21.02.11 - 09:27:04 »
Knud soll einfach mit Variants vom Typ Date/Time arbeiten. Dann kann er ganz einfach mit einer For-Next-Schleife arbeiten.
Date/Time != NotesDateTime


Date/Time Typen erzeugst du mit CDat/DateNumber/Now/... und sind skalare Gleitkommawerte (müssen aber als variant deklariert werdern)
NotesDateTime ist ein Objekt, welches man mit "set" zusweisen muss etc.

Gruß
Roland
Roland Praml

IBM Certified Application Developer - Lotus Notes and Domino 8
Ich verwende das Foconis Object Framework

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #12 am: 21.02.11 - 10:30:04 »
Ich habe jetzt doch einfach aDates(..) = vdate.DateOnly benutzt. Damit funktioniert es, auch wenn einem Original gegenüber jetzt nur das Datum und nicht noch Uhrzeit drinsteht.

Mal schauen, wie der Kalendereintrag am Ende aussieht. Momentan wird er noch nicht korrekt erzeugt.
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #13 am: 23.02.11 - 03:17:22 »
Hallo Knud,

in meinen als "Prinzipstudie" aus dem Kopf hingetippten Code mag etwas nicht passen, ich kann das während des EntwicklerCamps in Gelsenkirchen auch nicht tiefer checken (kurze Nächte hier  ;D).

Schau Dir mal mal folgenden definitiv funktionierenden Code unten an (da Dir sicherlich der "ErrorHandler" fehlt, musst Du da noch Hand anlegen. Wenn Du den Code nachvollziehen konntest, kannst Du ihn als "Blackbox" verwenden oder Deinen Gegebeneheiten anpassen.

HTH,
Bernhard

Function GetDateArray (vStartDate As Variant, vEndDate As Variant, szErrorMessage As String) As Variant
     '===================================================================================================================================
     ' Purpose:      Build from given start end and end date an array of date/time variants containing all days between start and end date
      '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ' Arguments:
   '               vStartDate - First date of the period (included) - must be variant of type "Date/Time"
   '               vLastDate - Last date of the period (included) - must be variant of type "Date/Time"
   '               szErrorMessage - A variable to return possible error messages by reference
      '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ' Returns:      An array of variants containing all days between start and end date
      '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
     ' Created by:     Bernhard Koehler on 10.04.2004                           Modified by: Bernhard Koehler on 14.10.2010
     '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   ' NOTES:      We allow a maximum of 4000 elements in the resulting array to avoid an overflow
     '------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
   ' Changes:      Enhanced error handling to avoid an overflow, new parameter szErrorMessage
     '===================================================================================================================================
   
   Dim vResult () As Variant
   Dim iLoop As Integer
   
   On Error Goto ErrorRoutine
   
   'Check for correct values:
   If (Datatype (vStartDate) <> V_DATE) Or (Datatype (vEndDate) <> V_DATE) Then
      szErrorMessage = "Wrong data types used!"
      Exit Function
   End If
   If vEndDate - vStartDate < 0 Then
      szErrorMessage = "EndDate is before StartDate!"
      Exit Function
   End If
   
   If vEndDate - vStartDate > 3999 Then
      szErrorMessage = "You tried to build a datelist between " & Cstr (vStartDate) & " and " & Cstr (vEndDate) & " which would result in an overflow!"
      Exit Function
   End If
   
   iLoop = vEndDate - vStartDate
   Redim vResult (0 To iLoop)
   
   vResult (0) = vStartDate
   For iLoop = 1 To Ubound (vResult)
      vResult (iLoop) = vStartDate + iLoop
   Next
   
   GetDateArray = vResult
   
   Exit Function
   
ErrorRoutine:
   Call ErrorHandler ("GetDateArray")
   szErrorMessage = "Run-time error " & Error$ & " in line " & Cstr (Erl) & " (vStartDate: " & Cstr (vStartDate) & "   vEndDate: " & Cstr (vEndDate)
   Exit Function   
End Function

Offline schroederk

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.924
  • Geschlecht: Männlich
  • Ich liebe dieses Forum!
Re: Fehler beim Erzeugen von einem Array of DateTime
« Antwort #14 am: 23.02.11 - 10:53:40 »
Vielen Dank für den Beispiel-Code.
Sehr anschaulich, wie einfach doch mit Datum gearbeitet werden kann.
Ich habe die entsprechenden Code-Teile gleich für mich übernommen.
Ich wäre ja gerne weniger egoistisch, aber was hab ich davon?

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz