Lotus Notes:显示一个月的日期,在工作日之后

时间:2013-06-19 16:33:45

标签: lotus-notes lotus-domino lotusscript

我有一个不太好的问题。我一直在考虑这个问题一个月,并阅读了几本书,但似乎可以找到答案或如何执行。众所周知,我正在制作这个生成日期的应用程序。我有一个组合框,它有几个月,从1月到12月开始,两个列表,第一个列显示当天,第二个显示工作日,在选择月组合框,它必须在第一列和工作日显示该月的日期在第二列,按行。例如:我选择1月,在第一列显示当月的日期,第1行为1,第2行为2,依此类推,与工作日相同。我对LN不熟悉。你能给我一个想法吗?希望你能帮助我。

4 个答案:

答案 0 :(得分:3)

这是基于Notes @Formula的解决方案。只需几行代码即可实现结果。

首先我们需要表格

enter image description here

Days的公式是

_days :=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;
_numberDays := @Day(@Adjust(@Adjust(@Date(@ToNumber(Year); @ToNumber(Month); 1); 0; 1; 0; 0; 0; 0); 0; 0; -1; 0; 0; 0));
@Subset(_days; _numberDays)

Weekday的公式是

_weekdays := @Transform( @ToNumber(Days); "day"; 
    @Weekday(@Date(@ToNumber(Year); @ToNumber(Month); day)));
@Replace(@Text(_weekdays);
     "1":"2":"3":"4":"5":"6":"7";
    "Sunday":"Monday":"Tuesday":"Wednesday":"Thursday":"Friday":"Saturday")

就是这样。

字段MonthYear必须具有“刷新关键字更改字段”属性。

字段DaysWeekday需要“计算显示”,“允许多个值”和“新行”作为单独的值。

结果将如下所示

enter image description here

答案 1 :(得分:1)

真正的动态表很难。在这种情况下,它肯定是可能的,因为你有一个已定义的行数,但它仍然有些混乱。

我不知道内置任何内容会轻易告诉你每个月有多少天。我可能只是创建一个包含年,月和numberOfDays字段的配置文档,以及可用于查找的隐藏视图。您将在许多地方需要这个,并且您不希望每次都进行查找,因此请在您的下拉菜单之后但在您的表之前的隐藏计算字段中进行查找。 (确保设置属性,以便在更改下拉列表中的值后重新计算字段。)调用类似daysInSelectedMonth的字段。

显然,第一列很简单:只需创建表格并输入数字1到31,然后将隐藏时间公式应用于第29行到第31行的单元格,这样它们只会在daysInSelectedMonth为正确的数字时显示天。在其他行中你不需要隐藏。

对于第二列,您需要对显示字段使用computed。我强烈建议将它们命名为weekday_1,weekday_2,... weekday_31,以便您可以使用@ThisName和一些简单的字符串操作从字段名称中提取数字。这将告诉你公式在哪一行,它是你的日期编号。这样做的好处是你的公式可以在每个字段中完全相同 - 只需在你完成一次之后剪切并粘贴到其他字段中。

我建议开始在weekday_31字段中处理公式,当你做对了(显示一个月中有正确的工作日,有31天,而一个月没空),那么你可以将公式复制到其余字段。您将需要使用@If来检测月份是否具有正确的天数 - 这很容易,除了闰年。我要把那部分留给你。如果月份没有正确的天数,只需让它返回“”,然后让@f的最后一个子句使用@Date来构建您正在处理的日期的值,然后使用@Weekday函数显示值。

答案 2 :(得分:1)

这完全取决于一些事情: Web应用程序或Notes客户端应用程序 这项工作的最终结果是什么,即用于表格的是什么?仅用于显示目的?

做出一些假设(Notes客户端应用程序,以及仅用于显示的表),我看到了两种方法。

一种简单的方法是创建包含31行和2列的表。 在单元格中,您可以创建字段:Day1,Weekday1,Day2,Weekday2等。 您还需要一个年份字段,除非它始终是当前年份。 在行29-31上设置隐藏时间公式,以隐藏该行的日期字段是否为空。 在您选择月份的组合框的高级属性选项卡上,设置“值更改后运行退出/ OnChange事件”。 在组合框的退出事件中,根据选定的年份和月份,编写一些用天和工作日填充字段的Lotusscript。这样的事情(未经测试:

Sub Exiting(Source As Field)
    Dim session As New NotesSession 
    Dim ws As New NotesUIWorkspace
    Dim uidoc As NotesUIDocument
    Dim monthName As String
    Dim YYYY As String
    Dim firstDate As NotesDateTime 
    Dim lastDate As NotesDateTime 
    Dim n As Double
    Dim i As Integer
    Dim dayname(1 To 7) As String

    dayname(1) = "Sunday"
    dayname(2) = "Monday"
    dayname(3) = "Tuesday"
    dayname(4) = "Wednesday"
    dayname(5) = "Thursday"
    dayname(6) = "Friday"
    dayname(7) = "Saturday"
    Set uidoc = ws.CurrentDocument
    YYYY = uidoc.FieldGetText("Year")
    monthName = uidoc.FieldGetText("Month")
    Set firstDate = New NotesDateTime("1 " & monthName & ", " & YYYY)
    Set lastDate = New NotesDateTime(firstDate.DateOnly)
    Call lastDate.AdjustMonth(1)
    Call lastDate.AdjustDay(-1)
    i = 0
    For n = Cdbl(firstDate.LSLocalTime) To Cdbl(lastDate.LSLocalTime)
        i = i + 1
        Call uidoc.FieldSetText("Day" & i, Cstr(i))
        Call uidoc.FieldSetText("Weekday" & i, dayname(Weekday(Cdat(n))))
    Next
    Call uidoc.Refresh()
End Sub

答案 3 :(得分:0)

创建真正动态表的另一种方法是我在这里写博客的方法: http://blog.texasswede.com/dynamic-tables-in-classic-notes/

好处是它更灵活,您可以创建更好的布局而无需创建大量字段。