SAP BO. SAP Business One. Usando el DI API para un caso especial Parte III

       Hola de nuevo a todos, pues aquí estamos y en esta última parte vamos a terminar con el trabajo rudo. Vamos a refrescarnos un poco; en la primer parte de esta entrega vimos el cómo conectarnos, en la segunda entrega vimos un proceso para conectarnos a la instancia de SQL y un método para sacar un articulo en base a su código.

     Ahora vamos ha realizar la transmisión de información de un lado a otro que a final de cuentas ese ha sido el objetivo de estos últimos post. La manera en la que lo vamos a realizar será mediante la toma del articulo y su transformación a un  XML. Y después de tener el XML del artículo de origen ese mismo XML lo vamos a cargar al artículo destino. Pero antes de una carga exitosa habra que hacer unas modificaciones al XML del artículo origen.

     Ahora vayamos directo al grano y veamos el método a continuación


public int SetNewItem(SAPbobsCOM.Company SboCompany, SAPbobsCOM.Items Oitem)

        {

            int Errornum;
            string ErrorDes = "";
            string XMLItem = Oitem.GetAsXML();
            SAPbobsCOM.Items DestItem;
            int Result;
            string[] CamposDel = new string[20];
            CamposDel[0] = "SHght1Unit";
            CamposDel[1] = "SHght2Unit";
             CamposDel[2] = "SWdth1Unit";
            CamposDel[3] = "SWdth2Unit";
            CamposDel[4] = "SLen1Unit";
            CamposDel[5] = "SLen2Unit";
            CamposDel[6] = "SWght1Unit";
            CamposDel[7] = "SWght2Unit";
            CamposDel[8] = "BHght1Unit";
            CamposDel[9] = "BHght2Unit";
            CamposDel[10] = "BWdth1Unit";
            CamposDel[11] = "BWdth2Unit";
            CamposDel[12] = "BLen1Unit";
            CamposDel[13] = "BLen2Unit";
            CamposDel[14] = "BVolUnit";
            CamposDel[15] = "BWght1Unit";
            CamposDel[16] = "BWght2Unit";
            CamposDel[17] = "ShipType";
            CamposDel[18] = "OrdrIntrvl";
            XMLItem = DeleteXML(XMLItem, CamposDel);
               
            SboCompany.XMLAsString = true;
            DestItem = (SAPbobsCOM.Items)(SboCompany.GetBusinessObjectFromXML(XMLItem, 0));
            Console.WriteLine(Oitem.ItemCode);
        
            string Consulta;
            ManagerBD ManBD = new ManagerBD();
            Result = DestItem.Add();
            if (Result == 0)
            {
                return 1;
            }
            return -1;
        }
     Como pueden ver en la línea de código  string XMLItem = Oitem.GetAsXML(); tomamos el XML de nuestro articulo origen y un poco más abajo hice un arreglo con muchos nombres que si los miran con atención son campos de la tabla OTIM de SAP BO. Estos campos los vamos a borrar ya que son valores que no se pueden copiar mediante este método de copiado. Ahora otra línea de suma importancia es esta DestItem=(SAPbobsCOM.Items)(SboCompany.GetBusinessObjectFromXML(XMLItem, 0));  la cual se encarga de hacer la carga de nuestro XML a un nuevo objeto del tipo OITM. Una vez que nuestro nuevo objeto ha sido cargado con la información necesaria podemos guardarlo sin ningún problema.

     Ahora les dejo el proceso que hago para quitar los nodos dentro del XML. Lo hice mediante manipulación de string porque no quería meterme en el problema de crearle un esquema y ese tipo de cosas al XML así que ahí esta.

        public string  DeleteXML( string Source, string[] Campos)
        {
             int posini, posfin;
            string Campofin;
            for (int i = 0; i <= 20;i++)
            {
                if (Campos[i] == null )
                    return Source;
                Campofin = " + Campos[i].ToString().Trim() + ">";
                posini = Source.IndexOf("<" + Campos[i].ToString().Trim() + ">");
                posfin = Source.IndexOf(Campofin) + Campofin.Length;
                posfin = posfin - posini;
                string Borra =  Source.Substring(posini, posfin) ;
                Source = Source.Replace(Borra,"") ;
            }
            return Source;
        }
     Ahora que ya tenemos todos los métodos para empezar un clonado de artículos de una compañía a otra vamos a ver como sería un ejemplo del funcionamiento general.

try
    {
       SenderCompany = Connectto.ConnectSAPSystem("Sender", "SQL 2008");
           if (SenderCompany != null)
       {
               Console.WriteLine("Connect succesfull");
               Queries = "select t1.itemcode From OITM t1 where t1.ItemCode not in(Select t0.ItemCode From "ParamConexion.GetInstance().GetInfo(XMLConstantes.RecSAPCompanyDB)+  ".dbo.OITM t0)";
               GetItems = ManBD.getDataSet(Queries, "ITEMS");
               foreach (DataRow Row in GetItems.Tables["ITEMS"].Rows)
               {
                  Item = SAPFun.GetByItem(SenderCompany, Row["ItemCode"].ToString().Trim());
                  if (Item != null)
                  {
                     Console.WriteLine("Find Item");
                     Console.WriteLine(Item.ItemCode.ToString());
                     if (RecCompany == null)
                        RecCompany = Connectto.ConnectSAPSystem("Rec", "SQL 2008");
                     if (RecCompany != null)
                     {
                        if (SAPFun.SetNewItem(RecCompany, Item) == 1)
                        {
                           Console.WriteLine("Add item to SAP system");
                        }
                        else
                        {
                           Console.WriteLine("Fail add");
                        }                     
                     }
   
                 }
                 else
                 {
                      Console.WriteLine("Not found item");
                 }   
             }
            
       }
       else
           Console.WriteLine("Unable to connect to SAP");
      Console.ReadLine();
  }
  
     En este ejemplo de funcionabilidad lo primero que hacemos es sacar las diferencia a nivel base de datos mediante un select, Y por cada artículo diferente tomamos toda la información del articulo mediante el método  GetByItem como lo vemos en esta línea Item = SAPFun.GetByItem(SenderCompany, Row["ItemCode"].ToString().Trim()); una vez ya con el articulo nos conectamos al SAP BO destino y mandamos la solicitud de inserción con el método SetNewItem como lo mostramos aqui SAPFun.SetNewItem(RecCompany, Item) y por ultimo solo mando mensaje informativos en el camino para saber que está pasando.

     Espero no estarlos o haberlos enredado mucho, igual cualquier duda estoy para apoyarlos y si quieren el ejemplo completo pues me lo hacen saber y nos ponemos de acuerdo. Saludos y estamos en contacto.


2 comentarios:

  1. Anónimo Says:

    Buen aporte, tengo que hacer una aplicacion la cual me traslade por ejemplo una orden de compra de un sistema X hacia SAP BO, como puedo manejar ese, que necesito, ya existe los objetos creados, puedo utilizar el SDK de SAP??

    gracias y espero tus comentarios

  2. Jairo Vides Says:

    Buenos Dias,
    Excelente blog y excelente informacion tengo la siguiente con sulta: en el codigo se creea una instancia suiente:
    ManagerBD ManBD = new ManagerBD()
    me podiras ayudar que es donde esta su implementacion?

Related Posts with Thumbnails