miércoles, 11 de febrero de 2015

SAP BO9 Consulta de Existencias y precios mendiante WebService - Parte 2: WebService Consulta.asmx

Cascaron DataLayerIng Lo primero que debemos hacer es crear un proyecto web en Visual Studio y agregar un web Service agregando un nuevo elemento al proyecto "Servicio web (ASMX)"
Lo cual nos entrega un codigo como este:
Después Creamos la conexión a la base de SAP agregando un ADO.NET Entity Data Model
Seleccionamos el tipo de Modelo a crear:

Seleccionamos la conexión o la creamos si es necesario

Seleccionamos las tablas que se mencionaron en el post anterior OITM, ITM1 y OPLN

Así es como se ve el archivo edmx creado con las 3 tablas añadidas:
Como las tablas de SAP no tienen relaciones entre si el Entity Framework no crea las relaciones y para poder usar las consultas debemos crearlas a mano usando las herramientas de visual Studio
Después de esto guardaremos y compilaremos las solución para que las clases sean reconocidas por el compilador; ahora bien las funciones devuelven solo un valor y necesitamos devolver una serie de ellos por lo que se describen 2 clases para poder enviar la respuesta:
public class Parte
        {
            [Display(Name = "No. Parte")]
            public string NoParte { get; set; }

            [Display(Name = "Clave de Compañia")]
            public string ClaveCompania { get; set; }

            [Display(Name = "Descripcion")]
            public string Descripcion { get; set; }

            [Display(Name = "Existencia Fisica")]
            public decimal? ExistenciaFisica { get; set; }

            [Display(Name = "Disponible al arribo")]
            public decimal? DisponibleAlArribo { get; set; }

            [Display(Name = "X Surtir")]
            public decimal? XSurtir { get; set; }

            [Display(Name = "Ordenada a Proveedor")]
            public decimal? OrdenadoProveedor { get; set; }
            
            [Display(Name = "Precio")]
            public decimal? Precio { get; set; }
            [Display(Name = "Moneda")]
            public String Moneda { get; set; }


        }
        public class Resultado
        {
            public List Partes { get; set; }
            public String Mesanje;
            public String DetalleRespuesta;
        }

Y finalmente la funcion que trealizara la busqueda

[WebMethod]
        public Resultado GetExistencia(String NoParte, String Usuario, String Password)
        {
            using (ACDPartsSBOEntities db = new ACDPartsSBOEntities())
            {
                try
                {
                    List Auth = db.USUARIOS.Where(w => w.U_NICK == Usuario && w.U_PASS == Password).ToList(); // Validamos el Usuario en una tabla de usurio que se creo en SAP
                    if (Auth.Count > 0)
                    {
                        List _partes = db.OITM.Where(w => (string.IsNullOrEmpty(NoParte) || w.ItemCode.ToLower().Contains(NoParte.ToLower()))).ToList(); //Buscamos el no de parte envido y si es vacio se devuelve toda la tabla
                        List _result = new List(); //Creamos el arrelglo de salida
                        foreach (OITM item in _partes)
                        {
                            Parte P = new Parte(); //Creamos un objeto de nuestra clase para almacenar la informacion
                            P.NoParte = item.ItemCode;
                            P.Descripcion = item.ItemName;

                            P.ExistenciaFisica = item.OnHand;
                            P.XSurtir = item.IsCommited;
                            P.OrdenadoProveedor = item.OnOrder;
                            P.DisponibleAlArribo = (item.OnHand == null ? 0 : item.OnHand) - (item.IsCommited == null ? 0 : item.IsCommited) + (item.OnOrder == null ? 0 : item.OnOrder);

                            P.Precio = (item.ITM1.Where(w => w.PriceList == 7).ToList()[0].Price == null ? 0 : (Decimal)item.ITM1.Where(w => w.PriceList == 7).ToList()[0].Price); //Como se Menciono aqui se usala lista de precios 7 pero esto tb peude ser un valor enviado y calculado
                            P.Moneda = item.ITM1.Where(w => w.PriceList == 7).ToList()[0].Currency; //Como se Menciono aqui se usala lista de precios 7 pero esto tb peude ser un valor enviado y calculado
                            _result.Add(P);
                        }
                        Resultado _return = new Resultado();
                        _return.Partes = _result;
                        _return.Mesanje = "Busqueda realizada";
                        _return.DetalleRespuesta = "Se localizaron: " + _result.Count + " articulos";
                        return _return;
                    }
                    else
                    {
                        Resultado _return = new Resultado();
                        _return.Partes = new List();
                        _return.Mesanje = "Error";
                        _return.DetalleRespuesta = "Atenticacion de usuario fallida";
                        return _return;
                    }
                }
                catch (Exception ex)
                {
                    ERRORES_SW R = Errores_SW_B.ParseError(ex); //Estas con clases con las que controlo los errorres
                    int Id = Errores_SW_B.Insert(R);            //Estas con clases con las que almaceno los errorres
                    Resultado _return = new Resultado();
                    _return.Partes = new List();
                    _return.Mesanje = "Error";
                    _return.DetalleRespuesta = "Error generado en la aplicacion \nResporte el el Id No: " + Id;
                    return _return;
                }
            }
        }

Ala compilar lo y pobarlo prodras revisar que lo que entrega al cliente es un XML  con la informacion de nuestra base de SAP:



Espero les resulte util....

1 comentario: