Actualizar registros en SAP B1 desde excel usando la DI API

He hablado ya en 3 ocaciones sobre como crear registros en SAP B1 usando la DI API desde MS Excel. Pero la DI API no es solo para crear nuevos registros, dependiendo del objeto que estemos usando podemos tambien actualizar, cancelar, eliminar o cerrar (mismas operaciones que valida el transaction).

Para saber que métodos permite un objeto, debemos ir a la documentacion (SDK help) que trae Business One, una vez ahí debemos buscar el objeto para ver que metodos permite.

SDK 1

Personalmente, al inicio, no comprendía bien para que servía el SDK, pero una vez que empece a programar algunas aplicaciones descubrí la gran utilidad e información que nos entrega.

Lo primero que debemos hacer al trabajar con la DI API, es buscar el objeto con el que vamos a trabajar.

En la pestaña index, escribimos «boo» y nos aparecerá de primera opción «BoObjecTypes Enumeration».
La columna «Member» es el nombre único del objeto, la columna «Value» contiene el número de indentificación en la base de datos y la columna «Description» contiene el objeto al cual pertenece.

SDK 2

Para los que leyeron el artculo anterior
Importar ordenes de compra desde excel via DI API

En el codigo está la siguiente sintax:

Dim vDoc As SAPbobsCOM.Documents
        
Set vDoc = oCompany.GetBusinessObject(oPurchaseOrders)

Si volvemos al SDK\BoObjecTypes Enumeration veremos que el documento «oPurchaseOrders» (orden de compra o pedido de compra), pertenece al objeto «Documents» y es por eso que se declara de esa manera. Si en vez de una orden de compra, quisieramos trabajar un pago recibido, habría que cambiar la syntax a la siguiente (siguiendo al SDK):

Dim vDoc As SAPbobsCOM.Payments
        
Set vDoc = oCompany.GetBusinessObject(oIncomingPayments)

Los métodos que tiene un objeto se pueden ver accediendo a él, haciendo clic en el nombre del objeto (de color azul y subrayado) en la lista de objetos del SDK y luego en «members».

SDK 3

Como vemos en la imagen, el objeto «items» tiene los metodos añadir, cancelar, remover, actualizar, es decir que podemos realizar esas acciones desde una aplicacion externa.

Bien, ya hemos hablado mucho de como usar la SDK (objetivo que no era de este post, pero me gusta que aprendan), ahora vamos a hablar del objeto que deseamos trabajar.

Vamos a trabajar con el objeto Items (articulos) y vamos a actualizar un campo «X» masivamente.

Lo primero que tenemos que tener es una planilla con los ItemCode de los articulos en la primera columna de excel hacia abajo

SDK 4

Ahora vamos a colocar el siguiente codigo

Public oCompany As SAPbobsCOM.Company
Public Sub ConnSAP()

        Dim lRetCode, ErrorCode As Long
        Dim ErrorMessage As String
        
        Set oCompany = New SAPbobsCOM.Company
        
        oCompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_MSSQL2008
        oCompany.DbUserName = "sa"
        oCompany.DbPassword = "SAP*****"
        oCompany.Server = "sap9"
        oCompany.CompanyDB = "SBO_DemoCL"
        oCompany.UserName = "manager"
        oCompany.Password = "bes****"
        oCompany.UseTrusted = False
        oCompany.Language = ln_Spanish_La
        
        lRetCode = oCompany.Connect()
        If lRetCode <> 0 Then
            MsgBox (oCompany.GetLastErrorDescription())
        Else
            Act_item
        End If
End Sub
Public Sub Act_item()
        
        Dim Retval As Long
        Dim oItem As SAPbobsCOM.Items
        
        Set oItem = oCompany.GetBusinessObject(oItems)
        
        Row = 2
        
        Do While ActiveSheet.Cells(Row, 1) <> ""
            If (oItem.GetByKey(ActiveSheet.Cells(Row, 1)) = True) Then
                oItem.ItemName = ActiveSheet.Cells(Row, 2)
                oItem.ForeignName = ActiveSheet.Cells(Row, 3)
                
                Retval = oItem.Update()
                If Retval <> 0 Then
                    MsgBox (oCompany.GetLastErrorDescription())
                Else
                    ActiveSheet.Cells(Row, 4) = oItem.ItemCode & " actualizado"
                End If
            End If
            
            Row = Row + 1
            
        Loop
            
        MsgBox ("Proceso terminado")
        
        oCompany.Disconnect
End Sub

En este caso, lo primero que debemos decirle a la DI API es que encuentre el producto, para eso utilizamos el método «GetByKey», al cual le debemos pasar el ItemCode (la clave unica del objeto).

Si encuentra el Item devolvera un «true» y en caso de que sea así seteamos el nombre y nombre extranjero (ustedes pueden añadir mas campos si así lo desean) con los valores en las celdas correspondientes e invocamos el metodo «Update» el cual intenta actualizar el item con los nuevos valores seteados.

Por último, agregan un boton y asignan la macro «ConnSAP» para que se ejecute el codigo y esperamos a que termine.

Con eso me despido, espero les sirva.

También te podría gustar...

13 Respuestas

  1. Daniel dice:

    Mi problema es que mi BBDD es HANA y no reconoce el string de conexion indicado.
    oCompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_MSSQL2008
    le puse oCompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_HANA
    y no logra conectar.

    Si alguien me pudiese ayudar con la conexión lo agradecería.

  2. Omar Moncada dice:

    Buenos días, Tengo una consulta, como puedo folear una factura de ventas desde Excel, es decir obtener el siguiente correlativo de una secuencia, ya que una vez obtenido, solamente actualizo el campo FolioNum.
    De antemano, muchas gracias

  3. Roberto dice:

    Buen día amigos, alguien sabrá como puedo usando esta misma macro actualizar el precio de una determinada lista ???

  4. Jordan Ordoñez dice:

    Estimado:

    Buenos dias, al realizar la cadena de conexion y ejecutarla me sale el siguiente error.

    Failed to connect or logon to SLD, please check connection parameters and configure file.

    Esto solo me sucede cuando el archivo de excel lo ejecuto desde otra maquina es decir fuera del servidor. Cuando lo ejecuto sobre el mismo servidor no me da ningun inconveniente. Si me pudiera ayudar indicandome cual podria ser el error del mismo. Le estaria muy agradecido.

  5. Uriel dice:

    Excelente articulo, en lo personal me ayudo mucho, tengo una duda si tengo que eliminar una línea intermedia ¿Como le puedo hacer?

  6. Victr Benitez dice:

    Hola Felipe,

    Si no es mucha molestía, para campos de precios que hacen referencia a una 2nda Tabla (ITM1), como se pudiera poner?
    gracias!

  7. German dice:

    Hola, quisiera saber como hacer cuando es un campo de usuario el que se va a actualizar

    • Así sería:

      oItem.UserFields.Fields.Item(«U_TU_CAMPO»).Value = Mi_valor
      Retval = oItem.Update()

      Saludos

      • luis roberto dice:

        Ese metodo funciona cuando el campo de usuario se creo como Apunte en SAP?

        yo cree 2 columnas en el detalle de las ordenes de compra de clientes las mismas columnas salen en facturas y notas de credito y debito y demas y quiero cargar por cada articulo el campo U_DescFijo pero me indica que el nombre del campo no es valido, el dato a agregar es de tipo double.y el codigo que uso es el siguiente

        Dim oOrder As SAPbobsCOM.Documents
        oOrder = oCompany.GetBusinessObject(BoObjectTypes.oOrders)
        oOrder.UserFields.Fields.Item(«U_DescFijo»).Value = 1

        alguna idea de por que no sirve?

  8. Jose dice:

    Buen Día estimado Felipe, puedes compartir nuevamente en tu blog el desarrollo para copiar desde el clipboard a SAP

  9. Adriano dice:

    Quisiera saber si para poder actualizar registros desde Excel usando DI-API hay que tener alguna licencia especial?

    • Buenas tardes

      En teoria, debes usar una licencia de acceso de terceros (indirect access) pero creo que es solo si vas a comercializar tu producto.
      Para uso local en la empresa la licencia del usuario que se logea es suficiente.

      Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada.