Skip to Content

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

To report this post you need to login first.

60 Comments

You must be Logged on to comment or reply to a post.

  1. Marco Ramirez

    Excelente aporte! gracias por compartir.

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

    Saludos

    (0) 
        1. Felipe Loyola Post author

          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?

          (0) 
          1. Marco Ramirez

            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

            (0) 
              1. ran avital

                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

                (0) 
  2. Luis Roberto

    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

    (0) 
    1. Felipe Loyola Post author

      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

      (0) 
      1. Luis Roberto

        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

        (0) 
      2. Augustus Pinto

        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

        (0) 
  3. cinthia garcia

    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

    (0) 
    1. Douglas Reyes

      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.

      (0) 
      1. Felipe Loyola Post author

        Donde dice

        Dim vItem As SAPbobsCOM.Items 

        Set vItem = oCompany.GetBusinessObject(oItems) 

        En este caso de ejemplo estoy usando el objeto Items.

        Saludos

        (0) 
        1. Douglas Reyes

          EXCELENTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

          MUCHAS GRACIAS!!!!!!! TENGO UNA ULTIMA PREGUNTA…….

          COMO SE LLAMA EL OBJETO DE LOS ASIENTOS CONTABLES?

          oJournalEntry?

          (0) 
          1. Felipe Loyola Post author

            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

            (0) 
            1. Douglas Reyes

              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

              (0) 
              1. Felipe Loyola Post author

                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.

                (0) 
                1. Douglas Reyes

                  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.

                  (0) 
                    1. Douglas Reyes

                      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

                      (0) 
                        1. Douglas Reyes

                          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

                          (0) 
                            1. Douglas Reyes

                              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.

                              (0) 
      1. Felipe Loyola Post author

        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

        (0) 
        1. Douglas Reyes

          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

          (0) 
          1. Felipe Loyola Post author

            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.

            (0) 
            1. Palacios Alejandro

              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?

              (0) 
      1. Boris Fierro

        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

        (0) 
        1. Felipe Loyola Post author

          Dentro del JournalEntries_Lines

                  Tran.Lines.PrimaryFormItems.CashFlowLineItemID = “mi valor”
                  Tran.Lines.PrimaryFormItems.JDTLineId = “linea del asiento”
                 

          Tran.Lines.PrimaryFormItems.AmountLC = “monto en moneda local”

          Saludos

          (0) 
      1. Luis Diaz

        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

        (0) 
        1. Felipe Loyola Post author

          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.

          (0) 
          1. Luis Diaz

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

            (0) 
              1. Luis Diaz

                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.

                (0) 
  4. Luis Diaz

    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.

    (0) 
  5. Sergio perez

    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.

    (0) 
  6. Oscar Martin Rodriguez Lopez

    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?

    (0) 

Leave a Reply