IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lotus Notes Discussion :

Programme qui fait planter Notes aléatoirement


Sujet :

Lotus Notes

  1. #1
    Invité
    Invité(e)
    Par défaut Programme qui fait planter Notes aléatoirement
    Bonjour,

    J'ai développé un bouton qui modifie un champ des documents sélectionnés dans une vue et marque dans le champ "ETAT" le mot "Supprimé" . Cela marche bien sauf quand le document est déjà dans l'état "Supprimé", cela fait planter Notes.

    La vue est simple un simple SELECT form = "crepas". La routine aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Sub Click(Source As Button)
    	Dim s As New notessession 
    	Dim db As notesdatabase 
    	Dim col As notesdocumentcollection 
    	Dim doc As notesdocument 
    	Dim workspace As New NotesUIWorkspace	
    	Set uiview = workspace.CurrentView
    	Set db=s.CurrentDatabase 
    	Set col=db.UnprocessedDocuments
    	Set doc=col.getfirstdocument 
    	
    	If doc Is Nothing Then
    		Messagebox "Pour supprimer des repas, veuillez tout d'abord sélectionner des documents en cliquant dans la marge gauche.", MB_OK+MB_ICONINFORMATION,"C.C.F"
    		Exit Sub
    	End If
    	
    	reponse% = Msgbox ("Etes-vous sûr de vouloir supprimer " & col.Count & " repas ?", 4 + 32, "C.C.F - Supprimer des repas")
    	If reponse% = 7 Then ' Non.
    		Exit Sub		
    	End If
    	
    	While Not doc Is Nothing
    		If Doc.etat ( 0 ) <> "Supprimé" Then
    			doc.ETAT = "Supprimé"
    			Call UpdateHistory ( "Supprimé", Doc, "Bouton Supprimer repas de la vue Toutes les cantines")
    			Call Doc.Save ( True, True )
    			Set doc=col.GetNextDocument(doc)
    		End If
    	Wend	
    	
    	Call workspace.ViewRefresh
    	
    	Messagebox col.Count & " repas supprimé(s).", 0+64,"C.C.F - Supprimer des repas"
    	
    End Sub
    La petite routine UpdateHistory ne casse pas trois pattes à un canard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    Sub UpdateHistory (Etat As String, Doc As NotesDocument, Instigateur As String)
    	
    	Dim session As New NotesSession
    	Dim Field As NotesItem
    	Dim User As String
    	
    	If Doc.HasItem("Date_history") Then
    		Set Field = Doc.GetFirstItem("Date_history")
    		Call Field.AppendToTextList ( Date$ + " " + Time$ )
    	Else
    		Set Field = Doc.ReplaceItemValue( "Date_history", Date$ + " " + Time$ )
    	End If
    
    	User = session.UserName
    	If Doc.HasItem("Edit_Author") Then
    		Set Field = Doc.GetFirstItem("Edit_Author")
    		Call Field.AppendToTextList ( User )
    	Else
    		Set Field = Doc.ReplaceItemValue( "Edit_Author", User )
    	End If
    	
    	If Doc.HasItem("Edit_history") Then
    		Set Field = Doc.GetFirstItem("Edit_history")
    		Call Field.AppendToTextList ( Etat )
    	Else
    		Set Field = Doc.ReplaceItemValue( "Edit_history", Etat )
    	End If
    	
    	If Doc.HasItem("Instigateur") Then
    		Set Field = Doc.GetFirstItem("Instigateur")
    		Call Field.AppendToTextList ( Instigateur )
    	Else
    		Set Field = Doc.ReplaceItemValue( "Instigateur", Instigateur )
    	End If
    	
    End Sub
    Pourquoi Notes plante-t-il quand le champ est déjà marqué avec le texte "Supprimé" ?

    Cordialement.

    Christian
    Dernière modification par Invité ; 31/12/2015 à 15h42.

  2. #2
    Membre averti
    Homme Profil pro
    Consultant Lotus Notes/Domino
    Inscrit en
    Juin 2015
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Lotus Notes/Domino
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 312
    Points : 397
    Points
    397
    Par défaut Casse
    Salut Christian, et Joyeux 2016 à toi et à tous les Lotusmen !

    Le Lotusscript n'est pas sensible à la casse.
    Tu as deux objets "doc" et "Doc" qui se mélangent joyeusement.
    "doc" est le document traité, alors que "Doc" est un paramètre : deux objets sur le même pointeur.

    Il faut dédier un nom différent pour le paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Function UpdateHistory (Etat As String, docParam As NotesDocument, Instigateur As String)
    '...
    End Function
    J'ai remplacé "Sub" par "Function", je trouve ça plus élégant. Une Sub c'est plus pour tronçonner un long script.

    Et même si la casse ne joue pas, ce n'est pas une raison pour écrire un coup "etat" puis "ETAT", c'est brouillon.

    Il faut aussi prendre 5 min pour apprendre la portée des variables et objets.
    Tu déclares deux fois la Session.

    Voici comment il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    '(Declarations)
    	Dim s As notessession 
    	Dim workspace As NotesUIWorkspace
    
    	Dim db As notesdatabase 
    	Dim col As notesdocumentcollection 
    	Dim doc As notesdocument 
    
    Sub Click(Source As Button)
    
    	' On peut pas instancier s et ws avant
    	Set s = New NotesSession
    	Set workspace = New NotesUIWorkspace
    	'...
    
    End Sub
    
    Function UpdateHistory (Etat As String, docParam As NotesDocument, Instigateur As String)
    	'...ici tu tortures le doc passé en paramètre
    	' et tu enregistres les modifs ici, c'est plus propre
    	Call docParam.Save ( True, True )
    
    	' Tu notes que s et workspace sont quand même accessibles ici
    
    End Function
    Par facilité, j'ai souvent tendance à tout passer en Public, pour ne pas avoir à gérer le passage de paramètres.
    Et ça donnerait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    '(Declarations)
    	Dim s As notessession 
    	Dim workspace As NotesUIWorkspace
    
    	Dim db As notesdatabase 
    	Dim col As notesdocumentcollection 
    	Dim doc As notesdocument 
    	Dim Etat As String, Instigateur As String
    
    Sub Click(Source As Button)
    
    	' On peut pas instancier s et ws avant
    	Set s = New NotesSession
    	Set workspace = New NotesUIWorkspace
    	Etat = "Supprimé"
    	'...
    	Set doc=col.GetNextDocument(doc)
    	'...
    	Instigateur = "toto"
    	'...
    	UpdateHistory
    	'...
    
    End Sub
    
    Sub UpdateHistory
    	'... ici tu disposes quand même des valeurs Etat, Instigateur, s, workspace, et doc
    	'...
    	' et tu enregistres les modifs
    	Call doc.Save ( True, True )
    End Sub
    Ca marcherait aussi avec "Function" bien sûr. C'est juste un choix arbitraire de notation.

  3. #3
    Membre expérimenté
    Avatar de Jérôme Deniau
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Janvier 2015
    Messages
    804
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2015
    Messages : 804
    Points : 1 434
    Points
    1 434
    Billets dans le blog
    32
    Par défaut Juste pour info
    Fair un agent en Lotusscript
    db.unprocessedDocuments -> documents sélectionnés dans la vue si agent déclenché à partir de la vue ;-)
    faire un bouton d'action dans la vue qui fait un @command([ToolsRunMacro];"<mettre ici le nom de l'agent>");
    C'est efficace et simple, masquer l'agent pour que le zoo moyen ne l'exécute pas de n'importe ou et ne foute pas la grouille.....

    Par contre cela n'interdit pas à l'utilisateur d'avoir ouvert un document en visu et dans ce cas s'il modifie et enregistre les motifs peuvent être perdues (gérer les conflits de réplication ou mieux activer les verrous), si les verrous sont activés, vérifier si le doc est en édition (verrouillé) et dans ce cas ignorer le document verrouillé.......

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Ces déclarations je les ai mises dans la Section Déclaration de la vue :

    '(Declarations)
    Dim s As notessession
    Dim workspace As NotesUIWorkspace

    Dim db As notesdatabase
    Dim col As notesdocumentcollection
    Dim doc As notesdocument
    Dim Etat As String, Instigateur As String

    Parce que j'hésite à les mettre dans la librairie au cas où cela créerait des problèmes.

    Cordialement.

  5. #5
    Membre averti
    Homme Profil pro
    Consultant Lotus Notes/Domino
    Inscrit en
    Juin 2015
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Lotus Notes/Domino
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2015
    Messages : 312
    Points : 397
    Points
    397
    Par défaut
    Je crois que tu peux les mettre dans la bib, et sinon dans la section Declarations du bouton d'action.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. programme qui fait deviner une variable aléatoire
    Par hazaki dans le forum Débuter
    Réponses: 3
    Dernier message: 02/10/2010, 10h58
  2. fonction dans dll qui fait planter programme
    Par chris069 dans le forum C++
    Réponses: 22
    Dernier message: 28/04/2009, 16h19
  3. Réponses: 3
    Dernier message: 01/03/2009, 18h09
  4. probleme de requette qui fait planter powergres
    Par fehmitn dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 15/09/2004, 18h48
  5. Réponses: 12
    Dernier message: 16/03/2004, 14h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo