65.9K
CodeProject 正在变化。 阅读更多。
Home

Biztalk 日期时间 Functoids

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2012 年 8 月 4 日

CPOL

8分钟阅读

viewsIcon

40385

downloadIcon

454

Biztalk 日期时间 Functoids

Content

引言

本文档假定您对映射有一定的基本了解。此外,本文档对正在练习日期时间 Functoids 的人员来说尤其有用。我建议您在查看附件文件之前,先阅读整篇文章。

本文档将涵盖以下主题:

  • 现有的日期时间/相关 Functoids。  
  • 使用 C# 脚本 Functoid 进行日期时间验证扩展
  • 在脚本 Functoid/映射应用程序中消耗 C# 脚本 DLL。

我们还将涵盖以下通用场景:

  1. 检查指定的输入字符串值是否为有效的日期时间,并在其有效时将结果值传递/显示在输出文件中。
  2. 将本地日期时间转换为 UTC/GMT 日期时间。
                 例如:
                 输入值: 9/1/2008 1:00:00 AM
                 输出值: 8/31/2008 7:30:00 PM (转换为本地时间)
                 注意:此处本地时间(输入值)为印度时区,即 (GMT+5:30)
  3. 传递 UTC 日期时间/任何时区的日期时间并仅提取时间。
                 例如:
                 输入值: 2012-07-23T23:10:00Z
                 输出值: 04:40 // 这是根据用户本地时区计算的
  4. 传递 UTC 日期时间/任何时区的日期时间并仅提取其中的月份(本地时区格式)
                 例如:
                 输入值: 2012-07-23T23:10:00Z
                 输出值 : 7
  5. 传递 UTC 日期时间/任何时区的日期时间并仅提取其中的年份(本地时区格式)
                 例如:
                 输入值: 2012-07-23T23:10:00Z
                 输出值 : 2012
  6. 传递 UTC 日期时间/任何时区的日期时间并以特定格式提取月份和日期。
                 例如:
                 输入值: 2012-07-23T23:10:00Z
                 输出值: July 24
  7. 查找两个日期时间之间的差值。
                 例如:
                 输入值: 09/11/1982T12:00:00-05:30
                 输出值: 29 年,10 个月,3 周,5 天。
                 注意:内部比较的是今天的系统日期时间,即 07/26/2012T14:00:00Z
  8. 比较两个日期时间。
                 例如:
                 输入值: 09/11/1982T12:00:00-05:30
                 结果值: 较小
  9. 传递 UTC 日期时间并将其转换为本地日期时间。
                 例如
                 输入值: 2012-07-23T23:10:00Z
                 结果值: 7/24/2012 10:10:00 AM
                 注意:结果以印度时区(GMT+5:30)显示。我没有特别关注日期格式,这在我们上面的示例(例如 VI)中已经看到。

应用程序开发与执行

现在,让我们开始开发。在开始之前,我假设您的机器上已安装了所需的设置。供您参考,我在开发附带的示例时使用了以下版本:

  • Microsoft Visual Studio 2008
  • Microsoft BizTalk Server 2009

您也可以迁移到更高版本。现在,让我们开始在 Biztalk 中进行架构设计,

输入架构

图 1:输入架构 1

请注意,输入和输出文件的类型均为平面文件类型,每个字段的属性更改如下所示:

子字段元素 属性
日期时间 数据类型 xs:string
  最大出现次数 *
   最小出现次数 0
   最小出现次数 0
UTCDateTime 数据类型 xs:dateTime
  最大出现次数 *
  最小出现次数 0
DateTimeOffSet 数据类型 xs:string
  最大出现次数 *
  最小出现次数 0

输出架构

图 2:输入架构 1

在上面的架构中:

子字段元素 属性
所有字段 数据类型 xs:string
  最大出现次数 *
  最小出现次数 0

现在,请下载包含用于映射测试的示例输入文件的文件夹。您也可以从源架构生成示例输入文件。在解决方案中,您会看到下面的映射文件,其中包含许多 Functoids。

图 3:示例应用程序 1 中的映射文件

我们将在以下主题中逐一介绍所有 Functoids。

I. 现有的日期时间/相关 Functoids

现在,为了实现附件文件中的所有场景,我们将从现有的 Functoids 开始。在“日期/时间 Functoids”部分中,我们有以下 Functoids。

图 1.1 日期/时间 Functoids

如果查看列表,我们会发现只有四个 Functoids,我们可以根据我们的需求和需要将它们与许多其他现有 Functoids 相关联。

  • 日期和时间可获取当前的系统日期时间。
  • 时间可返回当前的系统时间。
  • 日期可仅返回系统日期,不包含时间。
  • 添加天数,可以在现有日期上添加额外的天数。

我们还有一个 Functoid,它检查输入值是否为有效的日期时间值,这在图 1.2 中,是逻辑 Functoids 的一部分。

图 1.2 逻辑日期

现在,让我们来看下面的场景 (1):“检查指定的输入字符串值是否为有效的日期时间,并在其有效时将结果值传递/显示在输出文件中。”

为了实现这一点,首先我们将获取逻辑日期和值映射到页面上,并进行如下映射。如果值有效,则逻辑 Functoid 将将 True 作为输入值传递给值映射 Functoid,值映射 Functoid 将考虑将实际输入日期时间值传递给目标日期时间字段;如果收到 False 作为输入,则该字段不会显示在输出文件中。

图 1.3 场景 I

在映射文件 (.btm) 属性中,转到“测试映射输入实例”并在构建和测试它之前添加输入文件。由于我们在附件解决方案中传递了有效输入值,输出文件将包含日期时间值。

II. 使用 C# 脚本 Functoid 进行日期时间验证扩展

现在,让我们来看场景 (II),其中我们将输入值转换为 UTC/GMT 日期时间值。请按如下方式进行映射:

在这里,我们将使用脚本 Functoid 来扩展验证。现在,如果日期时间有效,我们将把日期时间转换为 UTC/GMT 日期时间,或者不显示任何值在目标文件中。在脚本 Functoid 中,我们将编写用于 UTC 转换的脚本。为此,请右键单击脚本 Functoid 并选择“配置脚本 Functoid”,然后首先选择脚本类型。此处我们使用 C#,因此请选择 C#,然后编写以下 C# 代码。

public string GetUTCDateTime(string param1)
{
   return Convert.ToDateTime(param1).ToUniversalTime().ToString();
}

注意:我没有遵循任何编码标准,但可以根据所需的标准/要求进行改进。

III. 在脚本 Functoid/映射应用程序中消耗 C# 脚本 DLL

现在,如果我们查看从 (3 到 9) 的场景,每个场景都需要逻辑扩展,并且我们必须在每个脚本 Functoid 中编写脚本。而且,我们必须每次都要修改映射应用程序。更好的方法是使用一个外部 DLL,其中包含所有脚本。如果需要进行任何逻辑级别的修改(数据/服务契约级别以外),我们只需要更新逻辑并部署 DLL,然后在映射应用程序中升级,而无需修改脚本 Functoid。另一部分是,使用 VS(因为它有一个编译器)很容易找到错误,但在 Biztalk 中,我们没有在脚本 Functoid 中编译脚本的选项。

现在,让我们打开 Visual Studio。

转到文件 -->
   新建项目 -->
            Visual C# -->
                 选择类库,

指定应用程序名称(例如 BiztalkDateTimeScript)、位置(例如 D:\Biztalk\Samples)并单击“确定”,现在您将看到一个包含一个默认类文件(名为 class1)的解决方案。

您可以重命名现有的文件或添加一个名为 BiztalkDateTimeScript.cs 的新类文件。如果您计划重命名,请打开该文件并更改 cs 文件内的类名。现在,添加以下方法以从输入的 dateTime 中提取时间。

public string getTime(string _inputDateTimeValue)
        {
            try
            {
                _inputDateTimeValue = validatedatetimeValue(_inputDateTimeValue);
                return Convert.ToDateTime(_inputDateTimeValue).ToString("HH:mm");
            }
            catch (Exception)
            {

                throw;
            }
        }

现在,构建解决方案并查看它是否成功构建。完成后,请为解决方案添加强名称并将程序集部署到 GAC。为此,请遵循以下链接。

创建强名称:http://msdn.microsoft.com/en-us/library/xwb8f617(v=vs.71).aspx

或者,您可以按照以下步骤操作:转到 VS Studio 命令提示符 -> 输入 CD\ -> 输入 sn –k “指定创建强名称的名称和位置”

将程序集部署到 GAC:http://msdn.microsoft.com/en-us/library/dkkx7f79.aspx

在应用程序/解决方案属性 -> 转到签名(这是 VS 2008 中的最后一个属性),在那里选择程序集并构建它。完成后,请再次返回 VS 命令提示符并键入以下命令。

Gacutil /I <give the dll with full and correct path>, it will prompt the message  "assembly successfully added to the globle catch."

现在,您已准备好在映射应用程序中使用脚本 DLL。现在,按照如下方式设计您的映射应用程序。

现在,右键单击第二个脚本 Functoid 并选择“配置 Functoid”,您将看到如下屏幕。请注意,映射器中的前三个 Functoid 是您在之前的主题中已经处理过的。

这次请选择“外部库”,因为您将使用已消耗的 DLL 脚本。

现在,选择脚本程序集,您将注意到脚本 DLL 已包含在其中,这是您在应用程序(通常在第一个位置)中包含的。然后选择“脚本类”中的类。因为我们在脚本类中有一个类,所以我们只会找到一个;否则,请选择所需的。现在,在“方法”下拉列表中选择所需的方法。这里我涵盖了场景 III 的示例代码,但所有其他场景的代码都包含在附件文件夹中。要查看和执行,请下载、构建并测试映射。

另外,对于场景 (6),以下链接可能对您有所帮助:http://www.csharp-examples.net/string-format-datetime/

预期的错误,捕获到异常:映射具有空的源和目标架构。

  • 如果您遗漏了类库的 DLL。

输出验证错误:根元素缺失。/ 输出验证错误:“任何子字段”元素无效

  • 如果您遗漏了映射的输入文件/路径无效。

好了,我几乎完成了,现在轮到您了,如果在构建过程中遇到任何问题或需要进一步的改进,请随时反馈。我将非常乐意处理您正在寻找的场景,并更新本文档供他人使用。

历史

Biztalk 日期时间 Functoids 第一版

Biztalk Date\time Functoids - CodeProject - 代码之家
© . All rights reserved.