Estimados,
Junto con saludar les dejo los pasos de un pequeño ejemplo sobre como importar desde excel usando la DI API mediante una simple macro.
1.- El primer paso consiste en abrir una hoja de calculo excel
2.- Luego abrimos la ventana de edicion de visual basic que trae excel para programar macros
3.- Agregamos las referencias de la DI API de SAP al trabajo actual
4.- Insertamos el código, cambian los parámetros de conexión que corresponden a su servidor y ejecutan el código
Public Sub Imp_Items()
Dim oCompany As SAPbobsCOM.Company
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 = "********"
oCompany.Server = "localhost"
oCompany.CompanyDB = "SBODemoCL"
oCompany.UserName = "manager"
oCompany.Password = "manager"
oCompany.UseTrusted = False
lRetCode = oCompany.Connect()
Dim Retval As Long
Dim vItem As SAPbobsCOM.Items
Set vItem = oCompany.GetBusinessObject(oItems)
Row = 2
Do While ActiveSheet.Cells(Row, 1) <> ""
vItem.ItemCode = ActiveSheet.Cells(Row, 1)
vItem.ItemName = ActiveSheet.Cells(Row, 2)
If vItem.ItemCode <> "" Then
Retval = vItem.Add
End If
Row = Row + 1
Loop
oCompany.Disconnect
End Sub
Luego en SAP buscamos los articulos
Saludos y espero les haya gustado.
Felipe
Felipe, muy buen aporte, muy útil, gracias por tomarte el tiempo y compartirlo ya lo probé y funciona.
Es conveniente para crear plantillas mas personalizadas sin necesidad de usar el DTW 😀
Excelente aporte! gracias por compartir.
Es posible utilizar esta misma para importar información de bancos para el tema de conciliaciones bancarias?
Saludos
¿Te refieres a importar extractos bancarios?
Exacto!
Si, los extractos bancarios (bank statements) si se pueden cargar por el mismo método ya que el objeto esta en el SDK.
Pero el template del DTW es bastante simple, ¿nunca lo has probado?
Si por supuesto, en este caso se me ocurre dar este archivo a un usuario de contabilidad para que sean ellos quienes suban los datos del extracto bancario y así de simple cómo he visto que funciona. Gracias por tus aclaraciones, saludos
Importar extractos bancarios a SAP B1 desde excel usando la DI API
Hi Felipe,
I would like your could help with the error that I get when i try to uplode data from excel journal entry into SAP b1 i recvie an error -5010?
Thanks in advance
Ran
Hi, what is your code?
Excelente! No había visto este tuto 😛
Buenas gente , necesito su ayuda en la siguiente linea
Set vItem = oCompany.GetBusinessObject(oItems)
No veo donde se crea la variable ó objeto llamado oItems podrían ayudarme a entender por que en mi codigo es el único error que me marca, sera que me hace falta importar algo o alguna referencia adicional no se
oItems, es el objeto de negocio que está dentro de la DI API de SAP B1.
Lo que se está realizando es seteando la variable vItem = oItems(SAPbobsCOM)
Saludos
FLR
Buenas Felipe como haces para indicarle a la orden de venta o pedido de cliente que su estado es abierto? ya que cuando creo la orden desde .net mediante la funcion que pusiste me pone el estado como impreso lo cual no es correcto , desde .net puse la siguiente linea
oOrder.Printed = PrintStatusEnum.psNo
pero sigue igual , me podrías ayudar con este tema
Bom dia Felipe.
Recebo o mesmo erro que nosso colega Luis Roberto na linha :
Set vItem = oCompany.GetBusinessObject(oItems)
Ocorre erro de automação.
Utilizo SAP B1 9.1 PL 11
Abraços.
Augustus Otávio
hola Felipe disculpa trate de hacer tu ejemplo pero me manda un error 429 no se puede crear el objeto si me puedes ayudar te lo agradeceré muchoo
saludos cordiales
Blog genial !!!!
Gracias Felipe por compartir estos conocimientos
Agustín Marcos Cividanes
Una pregunta Felipe, si quisiera utilizarlo a subir Ordenes de Venta, o Asiento Contables,
donde especifico el tipo de objeto? en el Query, no me queda claro como sabe a que objeto debe subirse.
En espera de tu apreciable ayuda.
Donde dice
Dim vItem As SAPbobsCOM.Items
Set vItem = oCompany.GetBusinessObject(oItems)
En este caso de ejemplo estoy usando el objeto Items.
Saludos
Para todos a los que le ha gustado este tutorial, les dejo uno que acabo de escribir para cargar documentos.
Importar orden compra excel DI API | Quality Info Solutions
Saludos chicos
Felipe me dice que fallo la conexion con el servidor de licencias?
que puede estar fallando.
Agrega:
oCompany.LicenseServer = "tuservidor:30000"
Saludos
EXCELENTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MUCHAS GRACIAS!!!!!!! TENGO UNA ULTIMA PREGUNTA.......
COMO SE LLAMA EL OBJETO DE LOS ASIENTOS CONTABLES?
oJournalEntry?
Correcto, se llama oJournalEntry
Pero ademas de colocarlo en el Set, debes cambiar el Dim, ya que oJournalEntry no forma parte del objeto SAPbobsCOM.Documents si no que forma parte del Objeto SAPbobsCOM.JournalEntries
Saludos
Hermano sos el capo de los capos. muchas gracias por compartir tus conocimientos. siempre sigo tus post.
Saludos, y gracias otra vez.
Felipe, puse este codigo y no me funciona me mando un error que dice MEMORIA INSUFICIENTE.
Cambie Datos de login por seguridad....
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 = "*********"
oCompany.Server = "emcdc01"
oCompany.LicenseServer = "localhost:30000"
oCompany.CompanyDB = "localhost"
oCompany.UserName = "manager"
oCompany.Password = "*********"
oCompany.UseTrusted = False
oCompany.Language = ln_Spanish_La
lRetCode = oCompany.Connect()
If lRetCode <> 0 Then
MsgBox (oCompany.GetLastErrorDescription())
Else
Imp_OC
End If
End Sub
Public Sub Imp_OC()
Dim Retval As Long
Dim vDoc As SAPbobsCOM.JournalEntries
Set vDoc = oCompany.GetBusinessObject(oJournalEntry)
RowC = 2
RowD = 5
If ActiveSheet.Cells(RowC, 1) <> "" Then
vDoc.RefDate = ActiveSheet.Cells(RowC, 1)
vDoc.TaxDate = ActiveSheet.Cells(RowC, 2)
vDoc.VatDate = ActiveSheet.Cells(RowC, 3)
vDoc.Memo = ActiveSheet.Cells(RowC, 4)
vDoc.Lines.Account = ActiveSheet.Cells(RowD, 1)
vDoc.Lines.Debit = ActiveSheet.Cells(RowD, 2)
vDoc.Lines.Credit = ActiveSheet.Cells(RowD, 3)
vDoc.Lines.ProfitCode = ActiveSheet.Cells(RowD, 4)
vDoc.Lines.OcrCode2 = ActiveSheet.Cells(RowD, 5)
RowD = RowD + 1
Do While ActiveSheet.Cells(RowD, 1) <> ""
vDoc.Lines.Add
vDoc.Lines.Account = ActiveSheet.Cells(RowD, 1)
vDoc.Lines.Debit = ActiveSheet.Cells(RowD, 2)
vDoc.Lines.Credit = ActiveSheet.Cells(RowD, 3)
vDoc.Lines.ProfitCode = ActiveSheet.Cells(RowD, 4)
vDoc.Lines.OcrCode2 = ActiveSheet.Cells(RowD, 5)
RowD = RowD + 1
Loop
Retval = vDoc.Add
If Retval <> 0 Then
MsgBox (oCompany.GetLastErrorDescription())
Else
MsgBox ("Asiento Contable Cargado con Exito")
End If
Else
MsgBox ("Nada que cargar")
End If
oCompany.Disconnect
End Sub
Ese error no es lo que piensas, es como un error generico y las veces que me ha pasado es cuando estas asignando un valor muy largo o grande dentro de un campo que tiene menos caracteres definidos.
Ejemplo.
declare @var char(1)
set @var='dos'
eso dará error.
Otra posibilidad es que estes asignando un valor a un campo read-only, verifica en la sdk que los campos que estas utilizando tengan la propiedad write.
Atte.
Ya revise y solo deje 3 campos, Cuenta, Debito y Credito, y ni aun asi funciona, talvez cuando tengas tiempo me hechas una mano, para migrar el asiento.
Revisa el vDoc.Memo, apuesto a que el comentario es muy largo.
Saludos
En el memo solo dice prueba, inserto imagen de excel y codigo utilizado en macro.
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 = "++++++"
oCompany.Server = "emcdc01"
oCompany.LicenseServer = "emcdc01:30000"
oCompany.CompanyDB = "PRUEBAS"
oCompany.UserName = "manager"
oCompany.Password = "++++++"
oCompany.UseTrusted = False
oCompany.Language = ln_Spanish_La
lRetCode = oCompany.Connect()
If lRetCode <> 0 Then
MsgBox (oCompany.GetLastErrorDescription())
Else
Imp_OC
End If
End Sub
Public Sub Imp_OC()
Dim Retval As Long
Dim vDoc As SAPbobsCOM.JournalEntries
Set vDoc = oCompany.GetBusinessObject(oJournalEntry)
RowC = 2
RowD = 5
If ActiveSheet.Cells(RowC, 1) <> "" Then
vDoc.RefDate = ActiveSheet.Cells(RowC, 1)
vDoc.DueDate = ActiveSheet.Cells(RowC, 2)
vDoc.Memo = ActiveSheet.Cells(RowC, 3)
vDoc.Lines.Account = ActiveSheet.Cells(RowD, 1)
vDoc.Lines.Debit = ActiveSheet.Cells(RowD, 2)
vDoc.Lines.Credit = ActiveSheet.Cells(RowD, 3)
RowD = RowD + 1
Do While ActiveSheet.Cells(RowD, 1) <> ""
vDoc.Lines.Add
vDoc.Lines.Account = ActiveSheet.Cells(RowD, 1)
vDoc.Lines.Debit = ActiveSheet.Cells(RowD, 2)
vDoc.Lines.Credit = ActiveSheet.Cells(RowD, 3)
RowD = RowD + 1
Loop
Retval = vDoc.Add
If Retval <> 0 Then
MsgBox (oCompany.GetLastErrorDescription())
Else
MsgBox ("Asiento Contable Cargado con Exito")
End If
Else
MsgBox ("Nada que cargar")
End If
oCompany.Disconnect
End Sub
Coloca el año completo
01-01-2015
usas cuentas segmentadas?
Atte.
Pues no me deja poner el año completo, no uso cuentas segmentadas.
en el formato de fecha solo sale ese formato, no sale uno con guiones que me permita poner el año completo, solo con /. osea tengo 2 opciones:
01-01-15 o
01/01/2015
Pues, haz la prueba con el 01/01/2015
Ya lo hice y nada, no se mas bien, que tiene que ver con algo del cuadre del asiento, que no puede ir subiendo linea tras lineas, porque debe comprabar que esta cuadrado, algo asi debe ser, porque la Orden de compra y Orden de Venta subio barbaro.
Douglas ya encontre tu error.
Los campos en la DI API no se llaman igual que en la base de datos
vDoc.RefDate no existe
vDoc.ReferenceDate es el correcto
vDoc.Lines.Account no exite
vDoc.Lines.AccountCode es el correcto
Saludos
PD: Cambiando esos campos el asiento cargó con exito
Felipe hice lo que me dijiste y sigue mostrando error, te muestro el 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 = "******"
oCompany.Server = "emcdc01"
oCompany.LicenseServer = "emcdc01:30000"
oCompany.CompanyDB = "PRUEBAS"
oCompany.UserName = "manager"
oCompany.Password = "******"
oCompany.UseTrusted = False
oCompany.Language = ln_Spanish_La
lRetCode = oCompany.Connect()
If lRetCode <> 0 Then
MsgBox (oCompany.GetLastErrorDescription())
Else
Imp_OC
End If
End Sub
Public Sub Imp_OC()
Dim Retval As Long
Dim vDoc As SAPbobsCOM.JournalEntries
Set vDoc = oCompany.GetBusinessObject(oJournalEntry)
RowC = 2
RowD = 5
If ActiveSheet.Cells(RowC, 1) <> "" Then
vDoc.ReferenceDate = ActiveSheet.Cells(RowC, 1)
vDoc.Memo = ActiveSheet.Cells(RowC, 2)
vDoc.Lines.AccountCode = ActiveSheet.Cells(RowD, 1)
vDoc.Lines.Debit = ActiveSheet.Cells(RowD, 2)
vDoc.Lines.Credit = ActiveSheet.Cells(RowD, 3)
RowD = RowD + 1
Do While ActiveSheet.Cells(RowD, 1) <> ""
vDoc.Lines.Add
vDoc.Lines.AccountCode = ActiveSheet.Cells(RowD, 1)
vDoc.Lines.Debit = ActiveSheet.Cells(RowD, 2)
vDoc.Lines.Credit = ActiveSheet.Cells(RowD, 3)
RowD = RowD + 1
Loop
Retval = vDoc.Add
If Retval <> 0 Then
MsgBox (oCompany.GetLastErrorDescription())
Else
MsgBox ("Asiento Contable Cargado con Exito")
End If
Else
MsgBox ("Nada que cargar")
End If
oCompany.Disconnect
End Sub
A mi me funcionó
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.LicenseServer = "sap9:30000"
oCompany.CompanyDB = "SBO_MerSud"
oCompany.UserName = "manager"
oCompany.Password = "b*******"
oCompany.UseTrusted = False
oCompany.Language = ln_Spanish_La
lRetCode = oCompany.Connect()
If lRetCode <> 0 Then
MsgBox (oCompany.GetLastErrorDescription())
Else
Imp_OC
End If
End Sub
Public Sub Imp_OC()
Dim Retval As Long
Dim vDoc As SAPbobsCOM.JournalEntries
Set vDoc = oCompany.GetBusinessObject(oJournalEntries)
RowC = 2
RowD = 5
If ActiveSheet.Cells(RowC, 1) <> "" Then
vDoc.ReferenceDate = ActiveSheet.Cells(RowC, 1)
vDoc.Memo = ActiveSheet.Cells(RowC, 3)
vDoc.Lines.AccountCode = ActiveSheet.Cells(RowD, 1)
vDoc.Lines.Debit = ActiveSheet.Cells(RowD, 2)
vDoc.Lines.Credit = ActiveSheet.Cells(RowD, 3)
RowD = RowD + 1
Do While ActiveSheet.Cells(RowD, 1) <> ""
vDoc.Lines.Add
vDoc.Lines.AccountCode = ActiveSheet.Cells(RowD, 1)
vDoc.Lines.Debit = ActiveSheet.Cells(RowD, 2)
vDoc.Lines.Credit = ActiveSheet.Cells(RowD, 3)
RowD = RowD + 1
Loop
Retval = vDoc.Add
If Retval <> 0 Then
MsgBox (oCompany.GetLastErrorDescription())
Else
MsgBox ("Asiento Contable Cargado con Exito")
End If
Else
MsgBox ("Nada que cargar")
End If
oCompany.Disconnect
End Sub
Atte.
ya encontré el Error, en las 2 ocasiones tenes JournalEntries y yo tengo JournalEntry.
Hola Felipe, intente hacer lo mismo pero me manda un mensaje , de que
"No se encontró la información de licencia apropiada para utilizar esta función en el entorno de diseño"
Alguna sugerencia?
Felipe, excelente aporte, gracias por compartir, y si quisiera consultar un asiento? como sería?
Buenas tardes
Ese error puede suceder porque estas utilizando excel 64 bits y SAP B1 32 bits o viceversa.
Saludos
Felipe, Excelente aporte, gracias por compartir.
Hola.
Alguno tendrá un ejemplo para generar Asiento con Cuentas Asociadas!!. y/o que objetos usar.
saludos
Estimado en las respuestas está el ejemplo de asientos contables.
Saludos
Buen Día.
Existe la opción de poder agregar mediante la DI API la "posición del formulario principal" que tiene relación con flujo de caja al asiento. Lo demás me funciona al 100%.
Saludos
Dentro del JournalEntries_Lines
Tran.Lines.PrimaryFormItems.AmountLC = "monto en moneda local"
Saludos
Thanks.
Saludos
Buenas tardes, he buscado como solucionar un problema que me arroja en el visual, pero no encuentro como. A alguien le ha pasado..
Luis puede ser un tema de seguridad de Excel, revisa que tienes habilitado el ActiveX en las seguridad de Excel.
Atte.
Felipe, al parecer hay algo extraño con excel, probe en otro equipo y no da el error de activex. Pero al correr el codigo paso a paso, me arroja otro error. Podrias explicarme de que se trata por favor.
No es un error de Excel, es un error de que no te has conectado a SAP, el lRetCode = oCompany.Connect() no conecta por alguna excepción que no estás capturando, debes colocar un "If" en ese lugar para poder controlar la excepción, mira los códigos que están escritos en los comentarios y en link a la parte 2.
Antiguamente en SAP 8, era mucho mas fácil conectarse, en SAP 9 es mejor tomar precauciones para cuando la DI API no se conecta.
Atte.
Muchas gracias Felipe, hice el if y con eso ya puedo ingresar. No se si te pueda preguntar por aca o es mejor crear un tema nuevo, pero en el caso de la importacion de la orden de compra, como puedo rescatar el numero interno que esta genera..
Agrega
if retval<>0 then
MsgBox(Cstr(oCompany.GetNewObjectKey))
End if
Atte.
Muchas gracias, ya con eso me arroja el numero que genera, solo que no se porque mi seria tiene numeros como 20026540 y con el codigo me arroja solo el 26540, le agregue esto
Retval = vDoc.Add
If Retval <> 0 Then
MsgBox (oCompany.GetLastErrorDescription())
Else
MsgBox ("Oc de Compra Generada Nº 200" + CStr(oCompany.GetNewObjectKey - 1))
End If
PD: Es lo mas facil, pero para otras series con otro correlativo no me sirve..
De todos Modos Muchas gracias, ya con esto puedo empezar a meterme mas en el SDK.
Eso es porque la API siempre retorna el único número que no se repite (DocEntry) o el campo llave del objeto
Atte,
Disculpen, donde puedo conseguir el listado con los objetos de sap, en el sdk al ver el indice de boObject types no me muestra, es como si no encontrara la info dentro de la carpeta sdk.
La lista completa la puedes encontrar en la ayuda el B1if
Atte.
Buen Dia.
soy nuevo en SAP B1 y necesito una ayuda, alguien tiene algun ejemplo como subir articulos pero con los campos de usuarios.
si alguien me puede ayudar, se los agradeceria.
Excelente tutorial, para mi que soy novato, Una duda, quiero agregar con mi campo de usuario
documento.Lines.UserFields.Fields.Item("u_odometro").value = ActiveSheet.Cells(fila,columna).value
Pero al ejecutar mi macro en excel 2016, me marca error ( illegal value entered )
este es el valor de la celda en excel.
El campo de usuario es Númerico, y con espacio para 10 caracteres.
p.d se puede pegar la imagen?