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.
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.
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».
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
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.
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.
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
Buen día amigos, alguien sabrá como puedo usando esta misma macro actualizar el precio de una determinada lista ???
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.
Excelente articulo, en lo personal me ayudo mucho, tengo una duda si tengo que eliminar una línea intermedia ¿Como le puedo hacer?
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!
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
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?
Buen Día estimado Felipe, puedes compartir nuevamente en tu blog el desarrollo para copiar desde el clipboard a SAP
Hola, lo quité porque la 9.1 ya trae la funcionalidad.
Saludos
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