jdedwards

JDEdwards XMLInterop


Wondering if anybody out there has any success in using the JDEdwards XMLInterop functionality. I've been using it for a while (with a simple PInvoke, will post code later). I'm looking to see if there's a better and/or more robust way.

Thanks.


Solution

  • As promised, here is the code for integrating with JDEdewards using XML. It's a webservice, but could be used as you see fit.

    namespace YourNameSpace
    

    {

    /// <summary>
    /// This webservice allows you to submit JDE XML CallObject requests via a c# webservice
    /// </summary>
    [WebService(Namespace = "http://WebSite.com/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class JdeBFService : System.Web.Services.WebService
    {
        private string _strServerName;
        private UInt16 _intServerPort;
        private Int16 _intServerTimeout;
    
        public JdeBFService()
        {
            // Load JDE ServerName, Port, & Connection Timeout from the Web.config file.
            _strServerName = ConfigurationManager.AppSettings["JdeServerName"];
            _intServerPort = Convert.ToUInt16(ConfigurationManager.AppSettings["JdePort"], CultureInfo.InvariantCulture);
            _intServerTimeout = Convert.ToInt16(ConfigurationManager.AppSettings["JdeTimeout"], CultureInfo.InvariantCulture);
    
        }
    
        /// <summary>
        /// This webmethod allows you to submit an XML formatted jdeRequest document
        /// that will call any Master Business Function referenced in the XML document
        /// and return a response.
        /// </summary>
        /// <param name="Xml"> The jdeRequest XML document </param>
        [WebMethod]
        public XmlDocument JdeXmlRequest(XmlDocument xmlInput)
        {
            try
            {
                string outputXml = string.Empty;
                outputXml = NativeMethods.JdeXmlRequest(xmlInput, _strServerName, _intServerPort, _intServerTimeout);
    
                XmlDocument outputXmlDoc = new XmlDocument();
                outputXmlDoc.LoadXml(outputXml);
                return outputXmlDoc;
            }
            catch (Exception ex)
            {
                ErrorReporting.SendEmail(ex);
                throw;
            }
        }
    }
    
    /// <summary>
    /// This interop class uses pinvoke to call the JDE C++ dll.  It only has one static function.
    /// </summary>
    /// <remarks>
    /// This class calls the xmlinterop.dll which can be found in the B9/system/bin32 directory.  
    /// Copy the dll to the webservice project's /bin directory before running the project.
    /// </remarks>
    internal static class NativeMethods
    {
        [DllImport("xmlinterop.dll",
            EntryPoint = "_jdeXMLRequest@20",
            CharSet = CharSet.Auto,
            ExactSpelling = false,
            CallingConvention = CallingConvention.StdCall,
            SetLastError = true)]
        private static extern IntPtr jdeXMLRequest([MarshalAs(UnmanagedType.LPWStr)] StringBuilder server, UInt16 port, Int32 timeout, [MarshalAs(UnmanagedType.LPStr)] StringBuilder buf, Int32 length);
    
        public static string JdeXmlRequest(XmlDocument xmlInput, string strServerName, UInt16 intPort, Int32 intTimeout)
        {
            StringBuilder sbServerName = new StringBuilder(strServerName);
            StringBuilder sbXML = new StringBuilder();
            XmlWriter xWriter = XmlWriter.Create(sbXML);
            xmlInput.WriteTo(xWriter);
            xWriter.Close();
    
            string result = Marshal.PtrToStringAnsi(jdeXMLRequest(sbServerName, intPort, intTimeout, sbXML, sbXML.Length));
    
            return result;
        }
    }
    

    }

    You have to send it messages like the following one:

    <jdeRequest type='callmethod' user='USER' pwd='PWD' environment='ENV'>
      <callMethod name='GetEffectiveAddress' app='JdeWebRequest' runOnError='no'>
        <params>
          <param name='mnAddressNumber'>10000</param>
        </params>
      </callMethod>
    </jdeRequest>