BizTalk Gurus

Custom Date Functiod

rated by 0 users
Answered (Not Verified) This post has 0 verified answers | 3 Replies | 3 Followers

Not Ranked
2 Posts
MikeDoobay posted on Mon, Jan 18 2010 7:00 AM

Hi all,

 I would like to create a custom functoid for my mapping needs that would access a date value and return a Date in other format. The input element is string. This string contains the value of invoice date. Now i need to map this string value to Date element which data type is simple date.

The map should be on two elements, in source the element data type is string and in destination the element data typs is SimpleDate. I need the output in particular Date format. I am using BizTalk 2004.

Can any one guide me on this....

Thanks in advance.

Mike.

 

All Replies

Top 10 Contributor
877 Posts

The easiest place to start is probably the sample Custom Functoid:

C:\Program Files\Microsoft BizTalk Server 2006\SDK\Samples\XmlTools\CustomFunctoid

 

replied on Tue, Jan 19 2010 5:00 AM

Do you really want to buil a custom functoid? You could use the script functoid, and script .Net code.

Not Ranked
1 Posts
Suggested by greg.forsythe

The code below is for a custom functoid that I wrote to accomplish what you are asking.  It takes two parameters in, date and format.  It will use the DateTime.Parse() method to convert the date parameter to a DateTime type.  It will then convert the date back to a string based on the .NET DateTime.ToString() formatting pattern specified in the format parameter.  All of the standard .NET formatting patterns will work plus I added an extra to output Julian day by using "jjj" in the pattern.

Please let me know what you think!

 

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.BizTalk.BaseFunctoids;
using System.Reflection;
using System.Globalization;
using System.Resources;

namespace BizTalk.CustomFunctoid
{
    public class DateFormat : BaseFunctoid
    {
        static ResourceManager resmgr = new ResourceManager("Meritain.BizTalk.CustomFunctoid.CustomResource", Assembly.GetExecutingAssembly());

        public DateFormat()
            : base()
        {
                    // This has to be a number greater than 6000
            this.ID = System.Convert.ToInt32(resmgr.GetString("IDS_DATEFORMAT_ID"));
           
            this.SetupResourceAssembly("Meritain.BizTalk.CustomFunctoid.CustomResource", Assembly.GetExecutingAssembly());

                    //Set Resource strings , bitmaps
            this.SetName("IDS_DATEFORMAT_NAME");
            this.SetTooltip("IDS_DATEFORMAT_TOOLTIP");
            this.SetDescription("IDS_DATEFORMAT_DESCRIPTION");
            this.SetBitmap("IDS_DATEFORMAT_ICON");

                    // Minimum and maximum parameters that the  functoid accepts
            this.SetMinParams(2);
            this.SetMaxParams(2);

                    // Function name that needs to be called when this Functoid is invoked.
                    // Put this in GAC
            this.SetExternalFunctionName(GetType().Assembly.FullName, "Meritain.BizTalk.CustomFunctoid.DateFormat", "FormatDate");

                    //Category for this functoid
            this.Category = FunctoidCategory.DateTime;

                    //Input and output Connection type
            this.OutputConnectionType = ConnectionType.AllExceptRecord;
            this.AddInputConnectionType(ConnectionType.AllExceptRecord);
        }

        public String FormatDate(String dateIn, String formatOut)
        {
            String dateToFormat = dateIn.Trim();
            DateTime theDate;
            String dateFormatted = String.Empty;

            try
            {
                        // Try to parse the date string passed through the map.    /* .DayOfYear.ToString("000") */
                theDate = DateTime.Parse(dateToFormat);

                dateFormatted = this.ApplyFormatting(theDate, formatOut);
            }
            catch
            {
                try
                {
                            // "yyyyMMdd" cannot be parsed so try to format the date string to "MM/dd/yyyy" and reparse if parsing fails.
                    CultureInfo nfo = new CultureInfo("en-US");
                    theDate = DateTime.ParseExact(dateToFormat, "yyyyMMdd", nfo);

                    dateFormatted = this.ApplyFormatting(theDate, formatOut);
                }
                catch
                {
                    dateFormatted = String.Empty;
                }
            }           
           
            return dateFormatted;
        }

        private String ApplyFormatting(DateTime d, String f)
        {
            String s = String.Empty;

                    // Check for lonely Julian Day and assign it to return value
            if (f.Equals("jjj"))
            {
                s = d.DayOfYear.ToString("000");
            }
            else
            {
                        // Insert Julian Day where specified in date format string
                s = d.ToString(f);
                if (f.Contains("jjj"))
                    s = s.Replace("jjj", d.DayOfYear.ToString("000"));
            }

            return s;
        }
    }
}

 

-Dave

Page 1 of 1 (4 items) | RSS