Page 1 sur 1

Question Lotus Designer

MessagePublié: 01 Oct 2012 à 16:45
par Eric SIVOA
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 ?

Re: Question Lotus Designer

MessagePublié: 01 Oct 2012 à 20:31
par roubech
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

Re: Question Lotus Designer

MessagePublié: 02 Oct 2012 à 09:03
par Eric SIVOA
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)

Re: Question Lotus Designer

MessagePublié: 02 Oct 2012 à 09:12
par Michael DELIQUE
salut

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

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

Re: Question Lotus Designer

MessagePublié: 02 Oct 2012 à 17:30
par Eric SIVOA
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 ?

Re: Question Lotus Designer

MessagePublié: 03 Oct 2012 à 13:17
par roubech
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)

Re: Question Lotus Designer

MessagePublié: 05 Oct 2012 à 09:45
par Eric SIVOA
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é ?

Re: Question Lotus Designer

MessagePublié: 05 Oct 2012 à 10:04
par Michael DELIQUE
si possible, mais la comme ça sans la base, j'ai un peu de mal

Re: Question Lotus Designer

MessagePublié: 05 Oct 2012 à 11:21
par Eric SIVOA
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.

Re: Question Lotus Designer

MessagePublié: 05 Oct 2012 à 12:49
par roubech
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" ...

Re: Question Lotus Designer

MessagePublié: 05 Oct 2012 à 13:29
par Eric SIVOA
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.