Das Notes Forum

Domino 9 und frühere Versionen => ND7: Entwicklung => Thema gestartet von: Hatschi am 23.11.09 - 11:24:36

Titel: Liste mit Datum speichern
Beitrag von: Hatschi am 23.11.09 - 11:24:36
Guten Morgen,

ich habe ein Dokument das versendet wird. Jedesmal wenn es versendet wird, soll der Zeitpunkt vermerkt werden. Die Sendetermine sollen in einem Mehrfachfeld Datum/Zeitwert abgespeichert werden.

Mit folgendem Code bekomme ich das nicht hin, weil er beim zweiten Aufruf die Fehlermeldung "NotesItem cannot be set to an array of mixed data types" bringt.

Sub SendeterminMerken (Doc As notesdocument)
   Dim jetzt As NotesDateTime
   Dim item As notesitem
   Dim termine As Variant
   
   Set jetzt =New notesdatetime("")
   Call jetzt.setnow ()
   
   If doc.HasItem("WVGesendetAm") Then
      'ein weiteres Sendedatum an die Liste anhängen
      termine=doc.WVGesendetAm
      Redim Preserve termine (Ubound(termine) +1) As Variant
      Set termine(Ubound(termine))=jetzt
      Call doc.Replaceitemvalue( "WVGesendetAm", termine)            
   Else
      'Das Item gab es noch nicht, deshalb anlegen
      Redim Termine (0) As notesdatetime
      Set Termine(0)=jetzt
      Set item=New notesitem(doc, "WVGesendetAm", termine)
   End If
End Sub


Einen Screenshot aus dem Debugger habe ich beigefügt. Dort sieht man das beim zweiten Aufruf die Inhalte des Arrays nicht vom gleichen Typ sind. Das Array scheint sich nicht daran zu stören, das Item schon. Hat jemand eine Idee wie man das lösen kann, ohne das Sendedatum in Text zu wandeln?

Vielen Dank,

Bernd
Titel: Re: Liste mit Datum speichern
Beitrag von: ascabg am 23.11.09 - 11:38:51
Hallo,

Versuchs doch mal mit jetzt.localtime.

Du kannst nicht dein "gesamtes" Objekt vom Type "NotesDateTime" als Array-Item einfuegen.


Andreas
Titel: Re: Liste mit Datum speichern
Beitrag von: DerAndre am 23.11.09 - 11:44:19
Such auch mal nach History.
Titel: Re: Liste mit Datum speichern
Beitrag von: Hatschi am 23.11.09 - 11:51:15
Hallo Andreas,

wenn ich localtime verwende, dann ist es ja kein Notesdatetime mehr, sondern ein String. Dann könnte ich auch mit Appendtotextlist arbeiten. Ich wollte die Liste aber als Notesdatetime für spätere Verwendung führen.


Zitat
Du kannst nicht dein "gesamtes" Objekt vom Type "NotesDateTime" als Array-Item einfuegen.

Die Hilfe zu Replaceitemvalue habe ich aber so verstanden, dass man auch ein Array of Date zuweisen kann. Und das meine ich in dem Variant Termine zusammengebaut zu haben.

Bernd
Titel: Re: Liste mit Datum speichern
Beitrag von: ascabg am 23.11.09 - 11:57:06
Zitat
Die Hilfe zu Replaceitemvalue habe ich aber so verstanden, dass man auch ein Array of Date zuweisen kann. Und das meine ich in dem Variant Termine zusammengebaut zu haben.
Nein, kannst Du nicht.
Und ein "Objekt" der Klasse "NotesDateTime" beinhaltet ja nun nicht nur Datums- und Zeitwerte, sondern auch (siehe Dein Screenshot) Werte vom Type Variant, Integer.

Desweiteren hast Willst Du in diesem Fall ja nicht einen "eindimensionalen" Array (hierauf bezieht sich die Hilfe) in das Feld schreiben, sondern einen mindestens "zweidimensionalen" Array.

Andreas
Titel: Re: Liste mit Datum speichern
Beitrag von: Hatschi am 23.11.09 - 12:11:32
Hallo André,

Such auch mal nach History.

In einer History-Library habe ich einmal reingeschaut, aber die haben auch alles als Text gespeichert und nicht als Notes/Datetime.

Bernd
Titel: Re: Liste mit Datum speichern
Beitrag von: ascabg am 23.11.09 - 12:17:56
Noch eine Verstaendnisfrage.

Warum muessen es denn unbedingt Datums- und Zeitwerte sein?


Andreas
Titel: Re: Liste mit Datum speichern
Beitrag von: MadMetzger am 23.11.09 - 12:34:28
Weil man Datentypen mit dem richtigen Datentyp speichern sollte und nicht ein Datum als Text abspeichern sollte.
Titel: Re: Liste mit Datum speichern
Beitrag von: Hatschi am 23.11.09 - 12:37:12
Warum muessen es denn unbedingt Datums- und Zeitwerte sein?

Auslöser ist das ich ungern hin- und herkonvertiere. Im Moment wurmt mich das jetzt aber eher weil ich eine scheinbar einfache Sache nicht hinbekomme.

Vielleicht ist aber dein Hinweis mit dem mehrdimensionalen Array ein Ansatz. Muß ich das vielleicht anders deklarieren, bzw. Redimen?
Das schaue ich mir noch einmal im Debugger an.

Bernd
Titel: Re: Liste mit Datum speichern
Beitrag von: ascabg am 23.11.09 - 12:44:58
Zitat
Weil man Datentypen mit dem richtigen Datentyp speichern sollte und nicht ein Datum als Text abspeichern sollte.
Schon richtig.

Nur um eine History zu haben, wer hat wann was geaendert, ist es aus meiner Sicht absolut nebensaechlich, ob das Datum nun als Datum oder als Text abgespeichert wird.


Andreas
Titel: Re: Liste mit Datum speichern
Beitrag von: Hatschi am 23.11.09 - 12:55:45
Hallo Andreas,

ja, du hast Recht für eine Protokollfunktion würde Text auch reichen. Aber wer weiss für was das Feld noch benötigt wird.
Und wie eben schon angedeutet, möchte ich jetzt ums Prinzip wissen wo der Fehler liegt, bzw. wie ich Notes dazu bewegen kann eine Liste mit Datum in einem Item zu speichern.

Bernd
Titel: Re: Liste mit Datum speichern
Beitrag von: ascabg am 23.11.09 - 13:03:41
Kurz und buendig.

Du moechtest in Deinem Beispiel nicht einen einzelnen Datumswert speichern, sondern eine gesamte Instanz einer Klasse eines NotesObjektes (mit all seinen Properties).

Und das geht nun mal nicht.


Andreas
Titel: Re: Liste mit Datum speichern
Beitrag von: DerAndre am 23.11.09 - 13:08:03
Notes.net (http://www-10.lotus.com/ldd/nd6forum.nsf/55c38d716d632d9b8525689b005ba1c0/70731561fbbc911b852573a2002e8702?OpenDocument&Highlight=0,date,multivalue)

Es scheint lustiger zu sein als man glaubt...

A-Bär
Klappt das bei Dir? (http://www-10.lotus.com/ldd/nd6forum.nsf/55c38d716d632d9b8525689b005ba1c0/11a1a302822ec44b852573670050ec69?OpenDocument)
Titel: Re: Liste mit Datum speichern
Beitrag von: Hatschi am 23.11.09 - 13:44:36
Hallo André,

ist ja toll was für Wiedersprüche du dort ausgegraben hast. Danke dafür!


Deinem unteren Link bin ich gefolgt, und der dort gepostete Code unterscheidet sich eigentlich nur in der Weise wie das Array erweitert wird von meinem. (Der Befehl Arrayappend war mir bisher nicht bekannt!)
Trotzdem habe ich es ausprobiert, und es wird die gleiche Fehlermeldung ausgegeben wie bei meinem Versuch.

Sub SendeterminMerken (Doc As notesdocument)
   Dim jetzt As NotesDateTime
   Dim termine As Variant
   Dim dings As Variant
   
   Set jetzt =New notesdatetime("")
   Call jetzt.setnow ()
   
   termine = doc.GetItemValue ("WVGesendetAm")
   If Isdate(termine(0)) Then
      dings = Arrayappend(termine, jetzt)
   Else
      Set dings = jetzt
   End If
   doc.ReplaceItemValue "WVGesendetAm", dings
   Exit Sub


Warum das in dem Post funktioniert hat frage ich mich allerdings auch.


Bernd
Titel: Re: Liste mit Datum speichern
Beitrag von: ascabg am 23.11.09 - 14:13:59
Code
Dim doc As NotesDocument
Dim dtNew As New NotesDateTime("")
Dim varOld As Variant, varNew As Variant

Set doc = Source.Document
Call dtNew.SetNow

varOld = doc.GetItemValue("DateList")
varNew = Fulltrim(Arrayappend(varOld, dtNew.LSLocalTime))

Call doc.ReplaceItemValue("DateList", varNew)

Also dieser Code (aus einem QuerySave einer Maske) macht bei mir genau das, was Du (nach meinem Verstaendnis) erreichen moechtest.


Andreas
Titel: Re: Liste mit Datum speichern
Beitrag von: Hatschi am 23.11.09 - 14:29:01
Hallo André,

du hast recht. Dein Code macht genau das was ich will. Vielen Dank für deine Geduld.

Warum ich da jetzt so herumgeirrt bin, kann ich ich vor lauter probiererei nicht mehr nachvollziehen. Denn mit dem LSLocalTime habe ich ja auch versucht zum Ziel zu kommen.

Auf jeden Fall habt ihr mir geholfen. Mein Problem ist gelöst und ich habe noch den "neuen" Befehl ArrayAppend kennengelernt.

Bernd


P.S: Wie wird das Thema auf erledigt gesetzt?
Titel: Re: Liste mit Datum speichern
Beitrag von: ascabg am 23.11.09 - 14:33:19
Ich glaube, in dem Du Deinen 1. Post nochmal oeffnest. Hier muesste das einstellbar sein.


Andreas

P.S.:
Schade, dass ich die Lorbeeren nun doch nicht bekomme  :'(
Titel: Re: Liste mit Datum speichern
Beitrag von: Hatschi am 23.11.09 - 14:41:24
Ohhhh Entschuldigung Andreas (ascabg),

ich habe Dein Codebespiel als funktionierende Vorlage genommen!

Code
Dim doc As NotesDocument
Dim dtNew As New NotesDateTime("")
Dim varOld As Variant, varNew As Variant

Set doc = Source.Document
Call dtNew.SetNow

varOld = doc.GetItemValue("DateList")
varNew = Fulltrim(Arrayappend(varOld, dtNew.LSLocalTime))

Call doc.ReplaceItemValue("DateList", varNew)

Demnach gehören die Lorbeeren natürlich dir!
Nochmals vielen Dank.

Bernd
Titel: Re: Liste mit Datum speichern
Beitrag von: koehlerbv am 23.11.09 - 18:21:28
Warum das ganze so verkompliziert?

doc.DateList = Fulltrim (Arrayappend (doc.DateList, Now))

Bernhard
Titel: Re: Liste mit Datum speichern
Beitrag von: Hatschi am 24.11.09 - 08:35:10
Hallo Bernhard,

auf die Idee das so einfach zusammenzufassen bin ich noch nicht gekommen. 


Bernd
Titel: Re: Liste mit Datum speichern
Beitrag von: pram am 24.11.09 - 09:12:41
@Bernhard, ist zwar syntaktisch richtig, was du schreibst, aber man sollte Arrayfunktionen nicht geschachtelt verwenden:

http://atnotes.de/index.php/topic,45919.msg295415.html#msg295415

weiterhin sollte man ArrayAppend NICHT mit Datum/Zeit verwenden

http://www-01.ibm.com/support/docview.wss?uid=swg21169797

und im Code von Hatschi ein isDate() gesehen. Auch dieses sollte man mit Vorsicht verwenden:
http://www-01.ibm.com/support/docview.wss?uid=swg21304700

An dieser Stelle frage ich mich: "Was geht eigentlich"  ???

Am "Saubersten" finde ich:
Code
Set	item =  doc.getFirstItem("datumsfeld")
on error resume next
ndtArray = item.GetValueDateTimeArray()
on error goto handle
if isArray(ndtArray) then
  redim preserve ndtArray(ubound(ndtArray) + 1)
else 
  redim ndtArray(0)
end if
set ndtArray(ubound(ndtArray)) = new NotesDateTime(...)
call doc.replaceItemValue("datumsfeld", ndtArray)
hab den Code jetzt zwar nicht getestet, aber ich denke, dass es in Etwa so funktionieren könnte

Gruß
Roland
Titel: Re: Liste mit Datum speichern
Beitrag von: Nabilat am 24.11.09 - 09:22:31
Also ich verwende seit einiger Zeit nur noch Textfelder für alles (ausser richtext). Dann kann ich prima alles mit appendTotextlist("string") machen.
Sonst hat man immer diese Einschränkungen. Und mann ist auch vom Betriebssystem unabhängig.
Titel: Re: Liste mit Datum speichern
Beitrag von: pram am 24.11.09 - 09:46:04
Hallo Nabilat

Zitat
Und mann ist auch vom Betriebssystem unabhängig.

Das verstehe ich jetzt nicht ganz? Ich kann hier wenig/gar keinen Code entdecken der OS-abhängig wäre.
Und tu dir einen Gefallen. Speichere Datums/Zeit-Werte NIE(!!!) als Text  ;)

Spätestens wenn du an deinem PC die locale auf eine andere Sprache umstellst, bekommst du massive Probleme.

Bsp am Datum heute
Deutsch: 24.11.2009
Norwegisch: 11.24.2009

Gruß
Roland
Titel: Re: Liste mit Datum speichern
Beitrag von: Nabilat am 24.11.09 - 10:24:11
Warum sollte ich in Deutschland norwegisches Datumsformat verwenden  ???

In Web Datenbanken mache ich übrigens immer 3 Felder für Tag Monat Jahr. Dort gibts keine Datumspicker. Und die auswahl geht über Dialogliste.
Titel: Re: Liste mit Datum speichern
Beitrag von: pram am 24.11.09 - 10:32:21
Weil vielleicht ein norwegischer Mitarbeiter eingestellt wird, welcher seine locale anpasst.
Titel: Re: Liste mit Datum speichern
Beitrag von: koehlerbv am 24.11.09 - 15:51:48
Naja, es ist ja nicht nur das Zusammenfassen, sondern der Verzicht auf das hier unnötige NotesDateTime-Objekt. Das ist in diesem Zusammenhang kompletter Overload: Datums-Zeitwerte sind eh nur Zahlen  ;) (bis man zur Zeitzone kommt, aber das ist ein eigenes Thema)

Bernhard