【问题标题】:Infopath Formule For Weekdate周日期的信息路径公式
【发布时间】:2013-09-10 15:59:29
【问题描述】:

我是 infopath 表单的新手。我创建了一个如下所示的信息路径表单

我在表单中的列如下

开始日期:

每周发生一次: *文本框* 下拉周(周一、周四、---周日)

截止日期:

现在当用户选择开始日期为 2013 年 7 月 2 日时,如果他在文本框中给出 3 并从下拉列表中选择星期四。

现在在截止日期它应该显示下周星期四日期,即(2013 年 7 月 9 日)。

几个月也是如此。你能帮我一个 infopath 形式的 fromule 吗

我的表单网址(http://i.stack.imgur.com/PJAze.png)

谢谢,桑迪


Dave,我的 Web 方法看起来像这样我陷入了为其分配参数。不确定如何以信息路径形式分配参数(EnteredDate、Number、DayofWeek)。如果您能提供帮助,那就太好了。

 [WebMethod]

    public String GetNthWeekdayOfMonth(DateTime EnteredDate, int Number, DayOfWeek weekday)
    {
        String error = "";

        var days = Enumerable.Range(1, DateTime.DaysInMonth(EnteredDate.Year, EnteredDate.Month)).Select(day => new DateTime(EnteredDate.Year, EnteredDate.Month, day));

        var weekdays = from day in days
                       where day.DayOfWeek == weekday
                       orderby day.Day ascending
                       select day;

        int index = Number - 1;

        if (index >= 0 && index < weekdays.Count())
            return Convert.ToString(weekdays.ElementAt(index));

        else

            error = "The specified day does not exist in this ";

        return error;
    }

【问题讨论】:

  • Erm...如果您选择每第三个星期二,肯定会晚得多,即 2013 年 7 月 9 日?他们实际上是在输入 3 还是得到一个下拉框来选择 1st、2nd、3rd 等?
  • 他们将从 dopdown 获取。附加的是图像的 url。 i.stack.imgur.com/PJAze.png)

标签: infopath infopath2010


【解决方案1】:

我相信即使对于高级 InfoPath 用户来说,您想要实现的目标实际上也相当困难,即使代码并不简单。

你有几个选择:

  1. 有人花了很长时间为您编写极其复​​杂的 XPath。您并不真正了解它是如何工作的,如果您需要更改任何内容,您将陷入困境。

  2. 有人花更少的时间编写更易读的代码,但你仍然不理解,但以后学习和更改会更容易。

  3. 你学习了一些代码或 XPath,等你有更多了解后再回来解决问题。

  4. 您重新评估此功能的需求并决定它是否真的值得,或者是否有替代或更好的方法来完成它。

现在回答:

如果您对代码有任何了解,就可以在后面添加代码来影响表单上的字段。如果我是你,我会在这个场景中学习尽可能多的内容,并在以后继续改进。

你可以这样做:

  1. Tools &gt; Form Options &gt; Programming &gt; Choose "C#" from drop down后面添加代码

  2. 将您的代码挂钩到所有三个输入(startDate、dayOfWeek 和 nth 值)的更改事件。 Right Click &gt; Programming &gt; Changed Event

这些块中的每一个都可以调用相同的代码。例如

public void StartDate_Changed(object sender, XmlEventArgs e)
{
    ChangeDueDate();
}

ChangeDueDate 代码如下:

private void ChangeDueDate()
{
    DateTime StartDate = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:StartDate", NamespaceManager).ValueAsDateTime;
    int DayOfWeek = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:DayOfWeek", NamespaceManager).ValueAsInt;
    int n = MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:n", NamespaceManager).ValueAsInt;

    // If StarDate.DayOfWeek is not the same as DayOfWeek 
    // then add the amount of days necessary.
    StartDate = StartDate.AddDays((7 - (int)StartDate.DayOfWeek + DayOfWeek) % 7);
    // Add weeks until you reach the nth value.
    while (((StartDate.Day - 1) / 7) != n - 1)
        StartDate = StartDate.AddDays(7);
    // Finally set the DueDate field to the calculated date.
    MainDataSource.CreateNavigator().SelectSingleNode("/my:myFields/my:DueDate", NamespaceManager).InnerXml = StartDate.ToString("dddd dd MMMM yyyy");
}

我已经对此进行了测试,它似乎运行良好。但是仍然会有一个问题,您目前无法知道每个月实际上是每天 4 天还是 5 天?

无论如何,如果您仍然需要帮助,请尝试上述方法并从那里开始询问更多问题。

【讨论】:

  • 嗨,戴夫,感谢您的解释,非常感谢您对此提供的帮助。但在我的场景中,它是 Listinfopath,正如您所说,以 infopath 形式进行计算非常困难。因此,我将您的方法用作网络服务并尝试从中获取值。感谢您的帮助。一如既往,您很棒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多