Das Notes Forum

Domino 9 und frühere Versionen => ND8: Entwicklung => Thema gestartet von: Klafu am 20.03.12 - 15:29:30

Titel: Array auf bestimmten Wert durchsuchen
Beitrag von: Klafu am 20.03.12 - 15:29:30
Hallo,

ich such gerade nach einer Möglichkeit ein Array nach einem bestimmten Wert zu durchsuchen und sobald ich den Wert hab, kann er aufhören mit suchen.
Also in etwa so:

Forall x In Array
   If x > Prüfsumme Then
    Tu das
   Else
     prüfe nächstes Element bis alle durchsucht sind oder die Bedingung Inhalt > Prüfsumme zutrifft
   End if
End forAll     

Ich hab jetzt lang überlegt, wie man solch eine Schleife am sinnvollsten zusammenbaut und würde mich über Tipps freuen  :)

Chris
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: DAU-in am 20.03.12 - 15:37:41
mit

While not
...
wend ?
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: koehlerbv am 20.03.12 - 15:41:10
While Not sollte langsamer sein.

Das "Tu das" sollte durch die "notwendigen Handlungen" und ein Exit For ersetzt werden.

Bernhard
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: pram am 20.03.12 - 15:44:14
Zitat
...ich such gerade nach einer Möglichkeit ein Array nach einem bestimmten Wert zu durchsuchen
Da hab ich sofort an ArrayGetIndex gedacht.... das passt aber auf dein Beispiel nicht da hier ein > Vergleich drin ist.

Gruß
Roland
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Peter Klett am 20.03.12 - 15:47:16
While Not sollte langsamer sein.

Das "Tu das" sollte durch die "notwendigen Handlungen" und ein Exit For ersetzt werden.

Bernhard

Exit Forall

ach, was bin ich heute wieder pingelig ...
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: koehlerbv am 20.03.12 - 15:52:42
Du hast aber wahr, Peter. Danke für die Korrektur.

Bernhard
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Klafu am 20.03.12 - 16:12:14
Danke für die Antworten!
Ihr meint also so?

Forall x In Array
   If x > Prüfsumme Then
       Tu das
       Exit Forall
   End if
End ForAll     

Hab ich das jetzt richtig begriffen?  :)
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Klafu am 20.03.12 - 16:29:06
Merci. Scheint zu klappen.  :)
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: koehlerbv am 20.03.12 - 16:32:14
Was heisst "scheint"?? Du bist hier im Bereich der Programmierung, und da gibt es nur "ja" oder "nein", 1 oder 0, funktioniert oder funktioniert nicht.

Bernhard
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Peter Klett am 20.03.12 - 17:06:31
Nun ja, "scheint" heißt, dass es in den getesteten Fällen funktioniert, was aber nicht bedeutet, dass es immer funktioniert, weil beim Testen nicht alle Eventualitäten bedacht werden können.

Für mich interpretiere ich 0 und 1 in der Programmierung so:

0 - macht das, was ich gesagt habe
1 - macht das, was ich gemeint habe

Wobei 0 und 1 auch zusammenfallen können, aber nicht müssen.

Weiterhin gibt es noch die Zustände

2 - es versteht mich nicht
3 - ich verstehe es nicht

Also, binär ist m.E. etwas zu wenig :)
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: koehlerbv am 20.03.12 - 17:13:00
 ;D ;D ;D

Sehr gut! Wir werden philosophisch  :)

Meine Sicht: 0 stimmt immer. Dem kann aber 1 entgegen stehen, weil für die Programmierer der Middleware auch 0 gilt, aber 1 nicht zutrifft.

2 und 3 liegenauf einer anderen Ebene. 3 hängt meist damit zusammen, dass 0 gilt (logisch), aber 1 nicht, weil durch die Komplexität ein Nebeneffekt auftritt, der nicht bedacht wurde. Damit kommen wir zur nächsten Ebene:

4 - es passiert immer (übel, wenn dann länger Zustand 3 gilt)
5 - es passiert sporadisch (es gilt immer noch 0, aber auch 4^übel.

Bernhard
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Peter Klett am 20.03.12 - 17:31:06
Ich sehe schon, wir verstehen uns :)

Tiefergehendes lässt sich bestimmt demnächst bei entsprechender Flüssigkeitsaufnahme erörtern ...

Bis Montag in Gelsenkirchen (oder Sonntag Abend? Wird bei mir aber sehr spät), bin ab Morgen unterwegs.
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: koehlerbv am 20.03.12 - 17:51:13
Ich sehe schon, wir verstehen uns :)

Bezweifelst Du das, Peter?

Bis Montag in Gelsenkirchen (oder Sonntag Abend? Wird bei mir aber sehr spät), bin ab Morgen unterwegs.

Okay, dann wird es bei mir eben auch spät. Ich bin am Montag eh aktiv gesehen vortragsfrei.

Bernhard
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Peter Klett am 20.03.12 - 18:00:14
Ich sehe schon, wir verstehen uns :)

Bezweifelst Du das, Peter?

NEIN !!!
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Klafu am 20.03.12 - 20:52:15
Also, um nochmal zu meinem Anliegen zurück zu kommen ;D
Peter hat Recht. Bei den mir gegebenen Gegebenheiten hat es anscheinend funktioniert. Allerdings war das Ergebnis nicht das, dass ich gerne gehabt hätte. Nun muss ich morgen nochmal genau prüfen, wie es zu dem Ergebnis kam und wie ich die Problembehebung weiter ausbreiten kwann. Aber allein von dem Sinn, also der Funktion hinter den zwei ineinander gepackten schleifen bin ich überzeugt. Nur muss das bei einem Anfänger wie mir nichts heißen ;)

Deswegen: Es scheint zu funktionieren. Die Funktion sah aus wie eine 0  - das Ergebnis aber war eine Mischung aus 0 und 1.
Und nun hab ichs sicher geschafft, dass ihr euch wieder einig seit und zwar darüber, dass ihr mich nicht versteht. ;D
Ich werd mich einfach morgen nochmal melden wenn ich wieder am Rechner bin und das Ergebnis genauer analysiert habe ;)
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: koehlerbv am 20.03.12 - 20:56:33
Hier gilt wieder 0: Es ist richtig, wir verstehen Dich nicht. Aber ganz einfach nur deswegen, weil Du von Deinem Problem kein Wort schreibst.
Nur Mut, Chris!

Bernhard
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Klafu am 26.03.12 - 11:45:05
So, nach langem hin und her hab ich nun den Mut mich dazu nochmal zu äußern.  ;D
Problematik war die, dass es bei ein paar Anwendern das Problem gibt, das Jahrestage am falschen Tag angezeigt werden. Ursache ist bekannt (BES) und wurde hier im Forum auch schon mal diskutiert.
Nur gab es scheinbar keine Lösung oder eben nur die, die Kalendereinträge zu löschen und neu anzulegen.
Ich hab mich jetzt mal hingesetzt und hab die Problematik studiert, wenn man das so nennen kann 8)

Die folgenden Felder des falsch dargestellten Kalendereintrages vom Typ Date/Time waren falsch und zeigten falsche Werte an
EndDate
EndTime
StartDate
StartTime

Die folgenden Felder des falsch dargestellten Kalendereintrages vom Typ Time / Date List or Range waren nicht richtig belegt.
CalendarDateTime
StartDateTime
EndDateTime

Das richtige Datum war im folgenden Feld zu finden
RepeatInstanceDates

Das Feld StartDateTime ist ausschlaggebend an welchen Tag der Jahrestag angezeigt wird.

Deswegen hab ich einen Agenten geschrieben, der den ersten Datumswert des Feldes RepeatInstanceDates mit dem ersten Datumswert des Feldes StartDateTime abgleicht.
Wenn die "Datums" nicht identisch sind, dann liegt das Problem, eines falsch dargestellten Kalendereintrages vor.
Dann sind die oben genannten Felder mit falschen/kaputten Inhalten befüllt und der Agent berichtigt das.
Als kleines Feature geht der Agent dann auch noch her und verlängert die wiederholung der Jahrestage auf 50 Jahre.

Hier ist der Agent. Viellecht fallen euch noch Fehler auf oder vielleicht könnt ihr den Agenten auch für euch nutzen.
Bei uns funktioniert der Agent aufjedenfall  :)
Danke für eure Hilfe!

Chris


Code
%REM
	Agent Jahrestage reparieren
	Created Mar 1, 2012 by Chris
	Description: Comments for Agent
%END REM
Option Public
Dim session As NotesSession
Dim db As NotesDatabase
Dim doc As NotesDocument
Dim view As NotesView
Dim i As Double
Dim Betreff As String
Dim Datum As Variant
Dim Start As Variant
Dim Ende As Variant
Dim Startdatum As NotesDateTime
Dim Enddatum As NotesDateTime
Dim ArrayNr As Integer
Dim StartDateTimeA(49) As Variant
Dim EndDateTimeA(49) As  Variant
Dim BedingungDatum As String
Dim Checkdatum As String

Sub Initialize	
	On Error GoTo Finish
	Set session = New NotesSession
	Set db = session.CurrentDatabase
	Set view = db.Getview("($MeetingsOnMyCalendar)")
	Set doc = view.Getfirstdocument()
	i = 0
	Set ende = session.CreateDateTime("20:00:00")
	Set start = Session.CreateDateTime("04:00:00")
	BedingungDatum = "26.03.2011"
	While Not doc Is Nothing
		If doc.form(0) = "Appointment" Then       			' Wenn die Maske des Dokuments "Appointment" ist
			If doc.Appointmenttype(0) = "1" Then			' Wenn der Typ des "Appointments" = 1  - sprich "Jahrestag" ist
				Betreff = doc.Subject(0)
				If (InStr(Betreff,"(Deutschland)")) =0 Then			' Wenn der Titel des Dokuments nicht "(Deutschland)" enthält - hier werden importierte Feiertage aussortiert
					Set Datum = session.CreateDateTime(Left(doc.RepeatInstanceDates(0), 10))
					If Cstr(Left(doc.Startdatetime(0),10)) <> CStr(Datum.Dateonly) Then     ' Wenn der erste DatumsWert des Feldes Startdatetime nicht dem ersten DatumsWert des Feldes RepeatInstanceDates entspricht
						ArrayNr = 0
						Set Startdatum = New NotesDateTime(Datum.Dateonly + " " + start.timeonly)
						Set Enddatum = New NotesDateTime (Datum.Dateonly + " " + ende.timeonly)
						Print "-----------------" + Betreff + "-----------------"
						Call doc.replaceItemvalue("EndDate",datum)
						Call doc.replaceItemvalue("EndTime",ende)
						Call doc.ReplaceItemvalue("StartDate",datum)
						Call doc.ReplaceItemValue("StartTime",start)
						ForAll z In doc.RepeatInstanceDates 		' Wenn einer der Datumswerte im Feld RepeatInstanceDates Jünger ist, als ein Jahr, dann wird der Jahrestag um 50 Jahre lang wiederholt
							Checkdatum = Left(z,10)
							If DateValue(Checkdatum) > DateValue(BedingungDatum) then
								ForAll z1 In StartDateTimeA
									z1 = Startdatum.LSLocalTime
									Call Startdatum.Adjustyear(1)
								End ForAll
								ForAll z2 In EndDateTimeA
									z2 = Enddatum.LSLocalTime
									Call Enddatum.Adjustyear(1)
								End ForAll
								Call doc.Replaceitemvalue("CalendarDateTime", StartDateTimeA)
								Call doc.Replaceitemvalue("RepeatInstanceDates", StartDateTimeA)
								Call doc.Replaceitemvalue("StartDateTime", StartDateTimeA)
								Call doc.Replaceitemvalue("EndDateTime", EndDateTimeA)
								Exit Forall
							End if
						End ForAll
						Call doc.save(True,False)
						Betreff = ""
						Datum = ""
						i = i+1
					End If
				End if
			End If
		End If
		Set doc = view.Getnextdocument(doc)
	Wend
	Print i " Dokumente bearbeitet"	
Exit Sub
Finish:
	Print "Ein unvorhergesehener Fehler ist aufgetreten:" Betreff
	Print i " Dokumente bearbeitet"	
End Sub




Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Tode am 26.03.12 - 14:44:39
Ja, wenn Du das gleich geschrieben hättest... Ich habe ne fertige Datenbank zum Fixen des Blackberry- Kalender- Jahrestag- Bug...

Aber gut...

Nach Deinem Agenten hast Du leider in allen Deinen Datums- Feldern String- Arrays drin stehen... Ein ComputeWithForm mit erstem Parameter True würde das (auf Kosten der Laufzeit) grade ziehen, aber so ist das suboptimal...

Also im Prinzip habe ich es identisch zu Dir gelöst, nur dass ich noch ein Variables Repeat drin habe (die 50 sind nicht hardcodiert, sondern werden aus dem Dokument ausgelesen) und eben ECHTE NotesDate- Time- Werte ins Dokument schreibe...
Code
	Dim arrDtStart() As NotesDateTime
	Dim arrDtEnd() As NotesDateTime
...
					For i = 0 To (intRepeat - 1)
						Set arrDtStart(i) = New NotesDateTime( dtStart.Localtime )
						Set arrDtEnd(i) = New NotesDateTime( dtEnd.Localtime )
						Call dtStart.Adjustyear(1, True)
						Call dtEnd.Adjustyear(1, True)
					Next		
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Klafu am 26.03.12 - 15:44:39
Danke für die Antwort, Torsten :)

gut zu wissen. Nun hab ichs ja eh schon. Aber trotzdem vielen Dank für das Angebot!
Ich hab laut Dokumenteigenschaften überall Time / Date oder Time / Date Ranges als Datentyp stehen. Hab ich mich da dennoch vertan?

Die 50 Jahre ist ein kleiner Bonus, da es bei uns öfter mal die Aussagen gibt, dass Jahrestage fehlen. Der Grund dafür ist allerdings, dass die Standardwiederholung von Notes (10 Jahre) eingestelt worden war.


Chris
Titel: Re: Array auf bestimmten Wert durchsuchen
Beitrag von: Tode am 26.03.12 - 16:17:53
Hmmm... das sieht sauber aus... Ich hatte überlesen, dass Du LSLocalTime verwendest, und das liefert ja tatsächlich (im Gegensatz zu LocalTime) einen Date- / Time- Variant... Also gilt, was ich geschrieben habe, natürlich nicht...