Skip to Content

Programar una macro para importar desde excel usando la DI API

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

ScreenShot005.jpg

2.- Luego abrimos la ventana de edicion de visual basic que trae excel para programar macros

ScreenShot006.jpg

3.- Agregamos las referencias de la DI API  de SAP al trabajo actual

ScreenShot007.jpg

ScreenShot008.jpg

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

ScreenShot009.jpg

Saludos y espero les haya gustado.

Felipe

60 Comments
You must be Logged on to comment or reply to a post.
  • Excelente aporte! gracias por compartir.

    Es posible utilizar esta misma para importar información de bancos para el tema de conciliaciones bancarias?

    Saludos

  • 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

    • 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

        • 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

          • 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.

          • En el memo solo dice prueba, inserto imagen de excel y codigo utilizado en macro.Sin título.jpg

            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

          • 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

          • 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:

          /wp-content/uploads/2015/03/excel_665650.jpg

          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ó

            instantánea1.png

            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.

          • 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”

            SAPBO.PNG

            Alguna sugerencia?

      • 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.

        /wp-content/uploads/2016/02/foto_896075.jpg

        • 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..

          • 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.

  • 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.

  • 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.

    U_Odometro
    1198844

     

    El campo de usuario es N├║merico, y con espacio para 10 caracteres.

     

    p.d se puede pegar la imagen?