1

我有一个不太好的问题。我已经考虑了一个月了,并且阅读了几本书,但似乎可以找到答案或如何执行此操作。众所周知,我正在制作这个生成日期的应用程序。我有一个组合框,里面有几个月,从一月到十二月,两列表,第一列显示日期,第二列显示工作日,在选择月份组合框时,它必须在第一列和工作日显示该月的天数在第二列,按行。例子:我选择一月,第一列会显示当月的天数,第一行是1,第二行是2,以此类推,和工作日一样。我对 LN 有点陌生。你能给我一个想法吗?希望你能帮助我。

4

4 回答 4

3

这是一个基于 Notes @Formula 的解决方案。只需几行代码即可获得结果。

首先我们需要表格

在此处输入图像描述

的公式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

结果将如下所示

在此处输入图像描述

于 2013-06-19T19:24:15.333 回答
1

真正的动态表是困难的。在这种情况下,这绝对是可能的,因为您有定义的行数,但它仍然有些混乱。

我不知道有什么内置的东西可以很容易地告诉你每个月有多少天。我可能只是创建一个带有年、月和 numberOfDays 字段的配置文档,以及可用于查找的隐藏视图。您将在很多地方都需要它,并且您不想每次都进行查找,因此请在下拉列表之后但表格之前的隐藏计算字段中进行查找。(请务必设置属性,以便在更改下拉列表中的值后重新计算该字段。)将该字段称为 daysInSelectedMonth。

显然第一列很简单:只需创建表格并输入数字 1 到 31,然后将 hide-when 公式应用于第 29 到 31 行的单元格,以便它们仅在 daysInSelectedMonth 是正确的天数时显示。在其他行中时您不需要隐藏。

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

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

于 2013-06-19T18:05:01.183 回答
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
于 2013-06-19T18:50:55.660 回答
0

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

好处是它更灵活,你可以创建一个更好的布局而不需要创建大量的字段。

于 2013-06-19T18:53:23.950 回答