champs dates multivalué + arrayapend

Forum destiné aux questions sur le développement : Formules, LotusScript, Java ...

champs dates multivalué + arrayapend

Messagepar Gillou13 » 05 Nov 2009 à 16:02

Bonjour à tous,

context : dans un modèle de document j'ai un champs date multivalué 'couplé' avec d'autre champs multivalués. ils forment un tableau 'd'historique d'étape'

Dans un scripte, je crée un nouveau tableau 'historique' (donc d'autre champs de même type que les 1er) mais juste avec les étapes importantes. se dernier fonctionne correctement quand le 1er tableau n'a pas plus de 2 valeurs.
si il à plus, j'obtien le message d'erreur : "NSD is running" et toutes mes applis lotus se ferment (même mon debugeur).

mon scripte 'simplifié':
(j'ai virer la sélection des étapes à copier)

Code : Tout sélectionner
Sub Click(Source As Button)
   
   Set Session = New NotesSession
   Dim db          As New NotesDatabase( "", "" )
   Dim doc       As NotesDocument
   Dim item      As NotesItem
   Dim i          As Integer
   Dim his(4)      As String
   
   his(0) ="date"
   his(1) ="etape"
   his(2) ="comm"
   his(3) ="inter"
   his(4) ="etat"
   
'   ouverture de la base en prod
   Call db.Open( "xxx", "yyy.nsf" )
   
   Set COLL1 = DB.search({form = "Dossier"},Nothing,0)
   
   If COLL1.count = 0 Then
      Msgbox "Erreur collection"
      Exit Sub
   Else
      Msgbox "nb dossier traité : " & Cstr(COLL1.Count)
   End If
   
   Set doc = COLL1.GetFirstDocument
   Do Until doc Is Nothing 'boucle des documents
      
      'Création du tableau d'historique B
      Forall Y In his
         If doc.HasItem("his_" & Y & "_B") Then
            Call doc.RemoveItem("his_" & Y & "_B")
         End If
         Set item = doc.GetFirstItem("his_" & Y)
         Call doc.CopyItem(item,"his_" & Y & "_B")   
      End Forall
      
      
' intégration de la 1er ligne de l'historique B :
      doc.his_date_B = doc.his_date(0)
      doc.his_etape_B = "Arrivé dossier"
      doc.his_comm_B = doc.his_comm(0)
      doc.his_inter_B = doc.his_inter(0)
      doc.his_etat_B = doc.his_etat(0)
      
      'Récupération de l'historique B :
      For i = 1 To Ubound(doc.his_etape)
         
         If doc.his_etape(i) = "x" Or ... Then
            
            doc.his_etape_B = Arrayappend(doc.his_etape_B,doc.his_etape(i))
            doc.his_comm_BPI = Arrayappend(doc.his_comm_B,doc.his_comm(i))
            doc.his_inter_B = Arrayappend(doc.his_inter_B,doc.his_inter(i))
            doc.his_etat_B = Arrayappend(doc.his_etat_B,doc.his_etat(i))
            doc.his_date_B = Arrayappend(doc.his_date_B,doc.his_date(i))
         End If
      Next
      
      Call doc.Save(True, False, False)
      
      'Call doc.Remove(True)
      Set doc = COLL1.GetNextDocument(doc)
   Loop
   Exit Sub
   
   Msgbox "fin de traitement"
   
End Sub


il plante à la ligne : doc.his_date_B = Arrayappend(doc.his_date_B,doc.his_date(i))

Si vous avez une idée sur ce problème...

Merci d'avance
Dernière édition par Gillou13 le 05 Nov 2009 à 16:05, édité 1 fois.
Gillou13
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 368
Inscrit(e) le : 15 Avr 2005 à 09:49
Localisation : lyon

Messagepar Michael DELIQUE » 05 Nov 2009 à 16:04

salut

ça plante a quelle ligne ?
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar Gillou13 » 05 Nov 2009 à 16:06

je vien de le rajouter dans mon 1er message. (après relecture)
Gillou13
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 368
Inscrit(e) le : 15 Avr 2005 à 09:49
Localisation : lyon

Messagepar stloje » 05 Nov 2009 à 16:19

Vérifie le nombre d'éléments qu'il y a dans ton champ comparé aux autres. S'il en manque, tu auras une erreur parce que "i" pointe à l'extérieur du tableau.
Avatar de l’utilisateur
stloje
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 335
Inscrit(e) le : 09 Sep 2008 à 13:18
Localisation : Orléans

Messagepar Gillou13 » 05 Nov 2009 à 16:23

Normalement les tableau doivent être de même taille.

Je vais quand même faire une verif avant le lancer la boucle.
Histoire d'être sur.
Gillou13
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 368
Inscrit(e) le : 15 Avr 2005 à 09:49
Localisation : lyon

Messagepar Gillou13 » 05 Nov 2009 à 16:37

bon c'est pas ça.
les tableaux sont bien de même longeurs.

se qui m'étonne dans cette affaire, c'est que tous lotus plante.

Si il aurai vu une erreur dans la dimensionnement des mes tableaux, un msg d'erreur aurai été visible et aurai stoppé le scripte (et ouvert le debug aussi).

La il me sort un long message (ou pas des fois) et me parle d'un fichier log dans mon rep lotus.
et dans ce fichier log (734Ko) j'ai plein d'information sur le serveur citrix qui heberge mon client comme par exemple la liste de tous les process (comme dans le gestionnaire des taches de windows).
Gillou13
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 368
Inscrit(e) le : 15 Avr 2005 à 09:49
Localisation : lyon

Messagepar Gillou13 » 05 Nov 2009 à 16:49

Autre information que je vien de constater.

pour les 2 3 dossiers pour les quel le scripte fonctionne :

Si dans 1er champs j'ai :

17/03/2008
01/04/2008

il me retourne dans le 2ème :
17/03/2008 00:00:00 CET

Peu t'on 'convertir' sans surplus ces dates?
Gillou13
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 368
Inscrit(e) le : 15 Avr 2005 à 09:49
Localisation : lyon

Messagepar Michael DELIQUE » 05 Nov 2009 à 16:51

salut

oui sois en passant par notesdatetime soit par la fonction format
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar stloje » 06 Nov 2009 à 09:17

Tu as sûrement déjà vérifié, mais les valeurs des champs que tu concatènes sont du même type?
Avatar de l’utilisateur
stloje
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 335
Inscrit(e) le : 09 Sep 2008 à 13:18
Localisation : Orléans

Messagepar Gillou13 » 06 Nov 2009 à 10:53

EUREKA!!!

en n'utilisant pas Arrayapend et en utilisant plutot un tableau redim en notesdatetime j'ai pu contourner le problème

Code : Tout sélectionner
   'traitement des dates :
      j = 0
      Redim temp_date(0)
      Set temp_date(0) = New NotesDateTime(doc.his_date(0))
...

...(dans la boucle de traitement des valeurs)
j = j + 1
            Redim Preserve temp_date(j)
            Set temp_date(j) = New NotesDateTime(doc.his_date(i))
...(apres la boucle)

'recup du champs date :
      doc.his_date_BPI = temp_date




Moralité ne pas utiliser arrayapend pour les champs date multivalués...

Merci à tous.
Gillou13
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 368
Inscrit(e) le : 15 Avr 2005 à 09:49
Localisation : lyon

Messagepar Michael DELIQUE » 06 Nov 2009 à 11:00

juste une remarque

les redim c'est bien pratique, mais ça consomme enormement (alros dans une boucle je te raconte pas !

dans le mesure du possible essayer de le faire en dehors de la boucle.
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar Gillou13 » 06 Nov 2009 à 11:37

je suis d'accord.
et comme tu la vue je ne pouvais pas faire autrement (quoi que). au moins avec redim le scripte va jusqu'au bout sans planter.

pour l'un de mes 1er scripte dans ce style, j' avais utilisé cette méthode (6 variable a 'redim' par boucle).
il avait mis + 1 heur pour s'exécuter.

Après j'ai découvert Arrayapend()...
Gillou13
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 368
Inscrit(e) le : 15 Avr 2005 à 09:49
Localisation : lyon

Messagepar Michael DELIQUE » 06 Nov 2009 à 11:38

tu pouvais aussi passer par un notesitem.appendtextlist ça evite de passer par un array
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar Gillou13 » 06 Nov 2009 à 12:09

C'est vrai,
Mais il ne fonctionne que pour les champs text (si j'ai compris l'aide lotus)
Gillou13
Posteur expérimenté
Posteur expérimenté
 
Message(s) : 368
Inscrit(e) le : 15 Avr 2005 à 09:49
Localisation : lyon

Messagepar Michael DELIQUE » 06 Nov 2009 à 12:28

m'étonnerais !
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy


Retour vers Développement

cron