Question Lotus Designer

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

Question Lotus Designer

Messagepar Eric SIVOA » 01 Oct 2012 à 16:45

Bonjour,

J'ai constitué une vue avec les champs suivants :

- le mois (donnée catégorisée):
@If(nomagentrepas = @Name([CN];@UserName); @Middle(@Text(daterepas); 3;2); false)
- le nom de l'agent :
@If(nomagentrepas = @Name([CN];@UserName); nomagentrepas; false)
- la date du repas
@If(nomagentrepas = @Name([CN];@UserName); @Left(@Text(daterepas); 10); false)

A fin de tests, j'ai les repas de Novembre, Décembre et Janvier d'un utilisateur donné
J'ai catégorisé la vue avec la colonne mois
Il y a d'autres agents qui consomment des repas à ces mêmes périodes, dans cette vue je ne veux pas voir ces repas et ces autres agents apparaître

Dans un masque de consultation / validation, je souhaite faire appel à cette vue (créer une vue intégrée)

L'utilisateur sélectionne le mois et l'année souhaitée :

- le mois (langage de formules)
RESULT := @Month(@Today)+2 ;
@If (RESULT > 12; RESULT := RESULT - 12;@Nothing);
@Select ( RESULT ; "Janvier" ;"Février" ; "Mars" ; "Avril" ;"Mai" ; "Juin" ; "Juillet"; "Août" ; "Septembre" ; "Octobre" ; "Novembre" ; "Décembre")

- l'année (langage de formules)
@Text(@Year(@Adjust(@Today;0;2;0;0;0;0)))

En fonction de ces deux données je souhaite n'afficher que les repas du mois souhaité par l'utilisateur.

Je peux intégrer dans le masque la vue précédente, mais à ce moment là j'ai tous les repas (ici de Novembre, de Décembre et de Janvier), ce que je ne souhaite pas.

Comment faire, si l'utilisateur sélectionne par exemple "Décembre" et "2012" ne faire apparaître que les repas de Décembre 2012 et non ceux de Novembre 2012 et de Janvier 2013 ?


Comment faire le filtre pour que ça marche bien ?
Est-ce que c'est possible ?
Eric SIVOA
Premier posts
Premier posts
 
Message(s) : 17
Inscrit(e) le : 09 Juil 2012 à 10:52

Re: Question Lotus Designer

Messagepar roubech » 01 Oct 2012 à 20:31

Bonjour,

1° éviter d'utiliser @UserName dans une formule de colonne
2° si tu veux restreindre une vue intégrer, tu ne peux le faire que sur la 1ère colonne

Donc pour ton histoire, en partant du principe que tes docs contiennent un champ NomAgentRepas de type Nom avec le nom au format complet et un champ DateRepas de type Date, je ferai une vue spécifique catégorisée sur une colonne contenant ce qui servira de filtre :
NomAgentRepas + "@" + @Year(DateRepas) + "-" + @Month(DateRepas)
et dans le masque, tu as un champ ChoixMois et un champ ChoixAnnee, tu intègres la vue en ajoutant en formule pour l'option restrict to single catégorie :
@UserName + "@" + ChoixAnnee + "-" ChoixMois
Si au lieu d'afficher les numéro de mois, tu veux afficher les libellés, pense à mettre en alias les nombre correspondant pour coller à la vue
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Re: Question Lotus Designer

Messagepar Eric SIVOA » 02 Oct 2012 à 09:03

Bonjour,

Merci pour la réponse

Voici comment je génère les repas, dans une vue : une simple action manuelle générant les repas de chacun pour le mois courant.
C'est une génération manuelle de repas, je planifie de la passer en tâche automatique mensuelle une fois que tout sera bon en manuel.

Code : Tout sélectionner
Sub Click(Source As Button)
   Dim session As New NotesSession
   
   ' vue
   'Dim uiVue As NotesUIView
   Dim mVue As NotesView
   Dim mVue2 As NotesView
   Dim mVueferie As NotesView
   
   'document
   Dim doc As NotesDocument
   Dim nDoc As NotesDocument
   Dim mDocProfil As NotesDocument
   
   'database
   'Dim uiBase As NotesUIDatabase
   Dim mBase As NotesDatabase
   Dim mBase2 As NotesDatabase
   Dim mjourferie As NotesDatabase
   Dim index As Variant
   
   ' variables de travail
   Dim jourTraite As Variant
   Dim wMois As Variant ' mois en cours puis mois suivant
   Dim wAn As Variant 'année en cours puis année suivante
   Dim wDate As String ' premier jour du mois suivant
   Dim presence As Variant
   Dim i As Variant
   Dim j As Integer
   Dim vari As Variant
   Dim tbJour(12) As Integer
   tbJour(0) = 31
   tbJour(1) = 28
   tbJour(2) = 31
   tbJour(3) = 30
   tbJour(4) = 31
   tbJour(5) = 30
   tbJour(6) = 31
   tbJour(7) = 31
   tbJour(8) = 30
   tbJour(9) = 31
   tbJour(10) = 30
   tbJour(11) = 31
   
   Dim ferie(31) As Variant
   Dim datetravail As Variant
   Dim yeartravail As Variant
   Dim nomagent As Variant
   
   '=====================
   ' Corps du programme
   '=====================
   Set mBase = session.CurrentDatabase
   Set mVue = mBase.GetView("vagentcantine")
   
   ' Constitution du mois prochain
   wMois = Month(Today())
   wAn = Year(Today())
   If wMois <> 12 Then
      wMois = wMois + 1
   Else
      wMois = 1
      wAn = wAn+ 1
   End If
   
   If (wAn Mod 4) = 0 Then
      tbjour(1) = 29
   End If
   
   wMois = wMois + 1
   
   'recuperation de tous les jours fériés de l'année
   Set mjourferie = session.CurrentDatabase
   Set mVueferie = mjourferie.GetView("jourferie")
   
   Set doc = mVueferie.GetFirstDocument
   j=0
   
   Do While(Not doc Is Nothing)
      
      datetravail = doc.GetItemValue("AllHolidays")
      yeartravail = Year(datetravail(0))
      moistravail = Month(datetravail(0))
      
      If yeartravail = wAn And moistravail = wMois Then
         index = Day(datetravail(0))
         ferie(index) = index
      End If
      j = j+1
      Set doc = mVueferie.GetNextDocument(doc)
      
   Loop
   
   ' Création du premier jour du mois suivant
   wDate = "01/" &  wMois  & "/" & wAn
   
   Set doc = mVue.GetFirstDocument
   nomagent = doc.GetItemValue("nomagent")
   
   'génération des repas
   
      'Set mBase2 = session.CurrentDatabase
   'Set mVue2 = mBase2.GetView("vagentrepas")
   
   'Set mVue2 = mBase.GetView("vaffectagent")
   Do While(Not doc Is Nothing And nomagent(0) <> "")
      
      presence = doc.GetItemValue("joursPresence")
      
      For i = 0 To tbJour(wMois-1) -1
         
         index = ferie(i+1) - 1
         
         'test samedi dimanche jour férié
         If Weekday(Cvdate(wDate) + i) <> 1 And  Weekday(Cvdate(wDate) + i) <> 7 And i <> index Then
            vari =  Arraygetindex(presence, Cstr(Weekday(Cvdate(wDate) + i)))
            If Isnull(vari) = False Then
               
               Set ndoc = New NotesDocument(mBase)
               Call ndoc.AppendItemValue("Form", "vagentrepas")
               Call ndoc.AppendItemValue("nomagentrepas", doc.GetItemValue("nomagent"))
[b]               Call ndoc.AppendItemValue("daterepas", Cvdate(wDate) + i)[/b]
               Call ndoc.Save(True,False)
            End If
         End If
         
'      End If
'      Next
         
      Next
      
      Set doc = mVue.GetNextDocument(doc)   
      nomagent = doc.GetItemValue("nomagent")
      
   Loop
End Sub


Sur une autre vue,

je tape donc le filtre :
nomagentrepas + "@" + @Year(daterepas)) + "-" + @Month(daterepas)

Il m'indique une erreur : données textuelles requises pour l'opérateur ou la fonction @

Merci pour l'aide pour la correction du filtre, car je ne m'en sors pas (j'ai cherché avant de répondre)
Eric SIVOA
Premier posts
Premier posts
 
Message(s) : 17
Inscrit(e) le : 09 Juil 2012 à 10:52

Re: Question Lotus Designer

Messagepar Michael DELIQUE » 02 Oct 2012 à 09:12

salut

simple, @year et @month renvoient des numérique, essais ça

nomagentrepas + "@" + @text(@Year(daterepas))) + "-" + @text(@Month(daterepas))
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

Re: Question Lotus Designer

Messagepar Eric SIVOA » 02 Oct 2012 à 17:30

Michael DELIQUE a écrit:salut

simple, @year et @month renvoient des numérique, essais ça

nomagentrepas + "@" + @text(@Year(daterepas))) + "-" + @text(@Month(daterepas))


Merci, ça marche !
Du coup, j'ai été un peu plus loin.

J'ai pu mettre la bonne formule dans l'option restrict to single catégorie pour faire apparaître les repas de Décembre 2012 :
@ProperCase(@Trim(NOM_AGENT)) + "@2012-12"

(j'ai été voir comment apparaissait NOM_AGENT dans le masque où le champ est créé : @ProperCase(@Trim(NOM_AGENT)) )

Maintenant, mon souci c'est dans le "2012-12" je veux faire appel à mes variables ANNEE et MOIS.

MOIS est une zone de liste déroulante avec pour choix
Code : Tout sélectionner
Janvier | 01
Février | 02
Mars | 03
Avril | 04
Mai | 05
Juin | 06
Juillet | 07
Août | 08
Septembre | 09
Octobre | 10
Novembre | 11
Décembre | 12


ANNEE est aussi une zone de liste déroulante qui se calcule via formule :

RESULT := @Year(@Adjust(@Today;0;2;0;0;0;0));
@Text(RESULT-1):@Text(RESULT):@Text(RESULT+1)

Je sais qu'il me faut du texte à la fin, annee et mois ne sont probablement pas du texte.

Après, j'aurai à calculer le nombre de repas par mois (j'ai déjà le nombre de repas total de calculé)

Est ce qu'il y a un moyen de voir via le langage de formules ce que l'on rentre comme saisie ou on est totalement en aveugle ?
Eric SIVOA
Premier posts
Premier posts
 
Message(s) : 17
Inscrit(e) le : 09 Juil 2012 à 10:52

Re: Question Lotus Designer

Messagepar roubech » 03 Oct 2012 à 13:17

Ca me choque de voir un Trim et un PropperCase
Ton champ NOM_AGENT n'est pas de type Nom ? il ne contient pas le nom complet de l'utilisateur ?
si tu ne crains pas les homonymes et que tu préfère travailler sur les noms commun, tu peux utiliser dans ta colonne de vue et dans ta restriction de catégorie un @Name([CN]; NOM_AGENT)

Si tes champs ANNEE et MOIS sont typés liste de dialogue ou combobox, tu va manipuler une chaine de texte en formule
Donc NOM_AGENT + "@" + ANNEE + "-" + MOIS devrait faire l'affaire
sinon, tu peux toujours ajouter des @Text
NOM_AGENT + "@" + @Text(ANNEE) + "-" + @Text(MOIS)
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Re: Question Lotus Designer

Messagepar Eric SIVOA » 05 Oct 2012 à 09:45

roubech a écrit:Ca me choque de voir un Trim et un PropperCase
Ton champ NOM_AGENT n'est pas de type Nom ? il ne contient pas le nom complet de l'utilisateur ?
si tu ne crains pas les homonymes et que tu préfère travailler sur les noms commun, tu peux utiliser dans ta colonne de vue et dans ta restriction de catégorie un @Name([CN]; NOM_AGENT)

Si tes champs ANNEE et MOIS sont typés liste de dialogue ou combobox, tu va manipuler une chaine de texte en formule
Donc NOM_AGENT + "@" + ANNEE + "-" + MOIS devrait faire l'affaire
sinon, tu peux toujours ajouter des @Text
NOM_AGENT + "@" + @Text(ANNEE) + "-" + @Text(MOIS)


Le champ NOM_AGENT n"était pas effectivement de type NOM.

Pour la suite, je me suis construit une vue catégorisée par la date des repas.
Pour chaque date, j'ai ainsi la liste des agents qui prennent un repas.
Je voudrais ajouter à cette vue une nouvelle info, le nombre de repas pris par jour.

J'aurais ainsi ceci :

Dates Nombre de repas Agents
2012-11-12 5
Agent 1
Agent 2
Agent 3
Agent 4
Agent 5

2012-11-13 2
Agent 3
Agent 4

(et ainsi de suite pour les autres dates)

Ce serait possible de construire une vue comme cela, avec le champ nombre de repas catégorisé ?
Eric SIVOA
Premier posts
Premier posts
 
Message(s) : 17
Inscrit(e) le : 09 Juil 2012 à 10:52

Re: Question Lotus Designer

Messagepar Michael DELIQUE » 05 Oct 2012 à 10:04

si possible, mais la comme ça sans la base, j'ai un peu de mal
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

Re: Question Lotus Designer

Messagepar Eric SIVOA » 05 Oct 2012 à 11:21

Voici ce que j'ai actuellement dans la vue :

date du repas Nombre de repas par jour nom agent
2012-11-13 5
5
Agent 1
Agent 2
Agent 3
Agent 4
Agent 5

2012-11-14 3
3
Agent 3
Agent 4
Agent 5

Datedurepas est catégorisé et contient la formule :
@Text(@Year(daterepas)) + "-" + @Text(@Month(daterepas)) + "-" + @Text(@Day(daterepas))

Nombre de repas par jour est catégorisé et contient la formule :
1

Nomagent contient le champ :
nomagentrepas

dans la sélection de vue, j'ai inséré la restriction suivante (pour éviter d'avoir dans la vue d'autres documents) :
SELECT (@IsAvailable(daterepas) & @IsAvailable(nomagentrepas))

Est-ce que je peux faire mieux que cela ?

Ensuite, j'aurai besoin d'avoir les informations de présence mois par mois. Je suppose que je pourrai filtrer la vue pour ne voir que les informations qui m'intéressent.
Eric SIVOA
Premier posts
Premier posts
 
Message(s) : 17
Inscrit(e) le : 09 Juil 2012 à 10:52

Re: Question Lotus Designer

Messagepar roubech » 05 Oct 2012 à 12:49

en général, pour filtrer les documents, on se base sur le masque (champ Form)
pour le nombre de repas, tu n'as pas de champ dans ton doc, ce que tu veux c'est compter le nbre de docs pour chaque date ?
si c'est ça, pas besoin de catégoriser la colonne avec le 1 dedans. Tu vas dans le 2eme onglet des propriétés de la colonne et tu coches "total" ...
Avatar de l’utilisateur
roubech
Modérateur
Modérateur
 
Message(s) : 4976
Inscrit(e) le : 01 Fév 2007 à 20:22
Localisation : Lille

Re: Question Lotus Designer

Messagepar Eric SIVOA » 05 Oct 2012 à 13:29

roubech a écrit:en général, pour filtrer les documents, on se base sur le masque (champ Form)
pour le nombre de repas, tu n'as pas de champ dans ton doc, ce que tu veux c'est compter le nbre de docs pour chaque date ?
si c'est ça, pas besoin de catégoriser la colonne avec le 1 dedans. Tu vas dans le 2eme onglet des propriétés de la colonne et tu coches "total" ...


En fait, ces repas sont générés en automatique dans une action d'une vue. cf routine qui suit (lorsque tout sera développé, je transformerai cette routine dans un agent lotus de manière à ce que cela s'exécute une fois par mois) :

Code : Tout sélectionner
Sub Click(Source As Button)
   Dim session As New NotesSession
   
   ' vue
   'Dim uiVue As NotesUIView
   Dim mVue As NotesView
   Dim mVue2 As NotesView
   Dim mVueferie As NotesView
   
   'document
   Dim doc As NotesDocument
   Dim nDoc As NotesDocument
   Dim mDocProfil As NotesDocument
   
   'database
   'Dim uiBase As NotesUIDatabase
   Dim mBase As NotesDatabase
   Dim mBase2 As NotesDatabase
   Dim mjourferie As NotesDatabase
   Dim index As Variant
   
   ' variables de travail
   Dim jourTraite As Variant
   Dim wMois As Variant ' mois en cours puis mois suivant
   Dim wAn As Variant 'année en cours puis année suivante
   Dim wDate As String ' premier jour du mois suivant
   Dim presence As Variant
   Dim i As Variant
   Dim j As Integer
   Dim vari As Variant
   Dim tbJour(12) As Integer
   tbJour(0) = 31
   tbJour(1) = 28
   tbJour(2) = 31
   tbJour(3) = 30
   tbJour(4) = 31
   tbJour(5) = 30
   tbJour(6) = 31
   tbJour(7) = 31
   tbJour(8) = 30
   tbJour(9) = 31
   tbJour(10) = 30
   tbJour(11) = 31
   
   Dim ferie(31) As Variant
   Dim datetravail As Variant
   Dim yeartravail As Variant
   Dim nomagent As Variant
   
   '=====================
   ' Corps du programme
   '=====================
   Set mBase = session.CurrentDatabase
   Set mVue = mBase.GetView("vagentcantine")
   
   ' Constitution du mois prochain
   wMois = Month(Today())
   wAn = Year(Today())
   If wMois <> 12 Then
      wMois = wMois + 1
   Else
      wMois = 1
      wAn = wAn+ 1
   End If
   
   If (wAn Mod 4) = 0 Then
      tbjour(1) = 29
   End If
   
   'wMois = wMois + 1
   
   'recuperation de tous les jours fériés de l'année
   Set mjourferie = session.CurrentDatabase
   Set mVueferie = mjourferie.GetView("jourferie")
   
   Set doc = mVueferie.GetFirstDocument
   j=0
   
   'wMois = wMois - 1
   'wAn = wAn + 1
   'wMois = 10
   
   Do While(Not doc Is Nothing)
      
      datetravail = doc.GetItemValue("AllHolidays")
      yeartravail = Year(datetravail(0))
      moistravail = Month(datetravail(0))
      
      If yeartravail = wAn And moistravail = wMois Then
         index = Day(datetravail(0))
         ferie(index) = index
      End If
      j = j+1
      Set doc = mVueferie.GetNextDocument(doc)
      
   Loop
   
   ' Création du premier jour du mois suivant
   wDate = "01/" &  wMois  & "/" & wAn
   
   Set doc = mVue.GetFirstDocument
   nomagent = doc.GetItemValue("NOM_AGENT")
   
   'génération des repas
   
      'Set mBase2 = session.CurrentDatabase
   'Set mVue2 = mBase2.GetView("vagentrepas")
   
   'Set mVue2 = mBase.GetView("vaffectagent")
   Do While(Not doc Is Nothing And nomagent(0) <> "")
      
      presence = doc.GetItemValue("PLANNING_CANTINE")
      nomagent = doc.GetItemValue("NOM_AGENT")
      
      For i = 0 To tbJour(wMois-1) -1
         
         index = ferie(i+1) - 1
         
         'test samedi dimanche jour férié
         If Weekday(Cvdate(wDate) + i) <> 1 And  Weekday(Cvdate(wDate) + i) <> 7 And i <> index Then
            vari =  Arraygetindex(presence, Cstr(Weekday(Cvdate(wDate) + i)))
            If Isnull(vari) = False Then
               
               Set ndoc = New NotesDocument(mBase)
               Call ndoc.AppendItemValue("Form", "vrepasdumois")
               Call ndoc.AppendItemValue("nomagentrepas", doc.GetItemValue("NOM_AGENT"))
               Call ndoc.AppendItemValue("daterepas", Cvdate(wDate) + i)
               Call ndoc.Save(True,False)
            End If
         End If
         
'      End If
'      Next
         
      Next
      
      Set doc = mVue.GetNextDocument(doc)   
      'nomagent = doc.GetItemValue("NOM_AGENT")
      
   Loop
End Sub


L'utilisateur - agent n'a qu'un rôle de consultation dans le masque pour visualiser les repas qu'il prend.
il faut ainsi que je récupère le nombre de repas par mois par agent, et que je donne pour chaque agent le prix total.

C'est plus complexe que le système actuel où l'utilisateur saisit dans un masque tous ses repas.
Eric SIVOA
Premier posts
Premier posts
 
Message(s) : 17
Inscrit(e) le : 09 Juil 2012 à 10:52


Retour vers Développement

cron