Importar ordenes de compra desde excel via DI API

Bueno, continuando con la programacion en vba, hoy quiero mostrarles como se puede importar un documento (en este caso orden de compra) a SAP usando una hoja de excel y unas pocas lineas de codigo.

Para ver los pasos previos (necesarios para que funcione el codigo), deben mirar el primer post;

Programar una macro para importar desde excel usando la DI API

Vamos a comenzar abriendo MS Excel y a llenar los datos como se muestra en esta imagen (los titulos los pueden colocar a su gusto). El boton no es necesario que lo agreguen aun.

instantánea22

Una vez colocado esos datos (obviamente con los codigos de su compañia), vamos a la ventana de macros y pegamos 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 = "********"
        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.Documents
        
        Set vDoc = oCompany.GetBusinessObject(oPurchaseOrders)
        
        RowC = 2
        RowD = 5
        
        If ActiveSheet.Cells(RowC, 1) <> "" Then
        
            vDoc.CardCode = ActiveSheet.Cells(RowC, 1)
            vDoc.CardName = ActiveSheet.Cells(RowC, 2)
            vDoc.DocDate = ActiveSheet.Cells(RowC, 3)
            vDoc.DocDueDate = ActiveSheet.Cells(RowC, 4)
            
            vDoc.Lines.ItemCode = ActiveSheet.Cells(RowD, 1)
            vDoc.Lines.Quantity = ActiveSheet.Cells(RowD, 2)
            vDoc.Lines.Price = ActiveSheet.Cells(RowD, 3)
            vDoc.Lines.WarehouseCode = ActiveSheet.Cells(RowD, 4)
            vDoc.Lines.TaxCode = ActiveSheet.Cells(RowD, 5)
            
            RowD = RowD + 1

            Do While ActiveSheet.Cells(RowD, 1) <> ""
            
                vDoc.Lines.Add
                                
                vDoc.Lines.ItemCode = ActiveSheet.Cells(RowD, 1)
                vDoc.Lines.Quantity = ActiveSheet.Cells(RowD, 2)
                vDoc.Lines.Price = ActiveSheet.Cells(RowD, 3)
                vDoc.Lines.WarehouseCode = ActiveSheet.Cells(RowD, 4)
                vDoc.Lines.TaxCode = ActiveSheet.Cells(RowD, 5)
            
                RowD = RowD + 1
                
            Loop
            
            Retval = vDoc.Add
            If Retval <> 0 Then
                MsgBox (oCompany.GetLastErrorDescription())
            Else
                MsgBox ("OK")
            End If
        Else
            MsgBox ("Nada que cargar")
        End If
        
        oCompany.Disconnect
End Sub

Acto seguido, volvemos a excel y agregamos un boton de formulario en la hoja desde la pestaña programador –> insertar –> controles de formulario

instantánea23

Una vez agregado el boton, debemos asignarle la macro para que ejecute el codigo que acabamos de escribir.

instantánea24

instantánea25

Y eso es todo, ahora solo basta con presionar el boton que agregamos y asignamos a la macro, esperar e ir a visualizar a SAP si se creo nuestra OC (Si tienen algun transaction validando campos obligatorios no funcionará al 100% ya que no están incluidos sus campos…ojo con eso.).

instantánea26

Si les aparece el mensaje «OK», quiere decir que se cargó correctamente el documento, de lo contrario aparecerá el mensaje de error correspondiente. Ahora solo basta ir a SAP B1 y revisar el documento.

instantánea27

Y con eso, termina esta publicacion.

Saludos a todos los lectores.

También te podría gustar...

49 Respuestas

  1. Allen dice:

    me aparece un error 1250000107- Falta el RFC; al crear un socio de negocios para una empresa nacional, debe indicar el RFC

    tengo sap business one 9.2

    • Allen dice:

      esto es tratando de hacer el ingreso de una orden de compra el socio que estoy utilizando ya existe y al parecer trata de crearlo.

      que debo hacer?

  2. Leo Perez dice:

    Buenas tardes a todos,

    Me está apareciendo un mensaje que tiene que ver con el servidor de licencias: -131- Conexión fallida al servidor de licencias, si la dirección del servidor de licencias es inválida, corríjala; si el servicio de TAO NT Naming Service esta detenido, actívelo y reinicie el servidor de licencias.

    Por favor, cómo se repara ya que me impide avanzar con el requerimiento.

  3. Silvana Mauriel dice:

    Hola Felipe….
    Muchas Gracias por compartir tu conocimiento.

    Necesito hacer lo mismo pero para crear una SOLICITUD DE TRASLADO PRELIMINAR… CONOCES EL OMBRE DEL OBJECT??

    Esta linea es la que cambia, cierto?
    Set vDoc = oCompany.GetBusinessObject(oPurchaseOrders)

    gracias por tu ayuda.
    Dios te siga dando inteligencia.

  4. Luis Roberto dice:

    Felipe, estoy haciendo una remision, no un pedido, pero tengo problemas con los lotes, como puedo agregar un lote.

    Saludos

  5. Maria Monte dice:

    Estimado Felipe,

    Al ejecutar el código estoy teniendo un error relacionado al RFC y me aparece que es una empresa mexicana.

    Agradezco si me pudiera indicar a que se debe este error o que puedo hacer para solucionarlo.

    Muchas gracias!

  6. Ricardo Uribe dice:

    Estimado Felipe,

    Estoy utilizando tu ejemplo para migrar una Oferta desde VB6, pero al momento de probar la conexión me aparece el mensaje «Database server type not supported».

    Estos son mis datos de conexion
    oCompany.DbUserName = «sa»
    oCompany.DbPassword = «*****»
    oCompany.Server = «Servidor»
    oCompany.CompanyDB = «SBO_Demo»
    oCompany.UserName = «manager»
    oCompany.Password = «*******»
    oCompany.DbServerType = SAPbobsCOM.BoDataServerTypes.dst_MSSQL2012
    oCompany.UseTrusted = False

    La version de SAP que utilizo es SAP Business One 9.1 (9.10.190) PL: 09 (32-bit).

    Estoy usando SAP Business One DI API Version 9.0

    Espero me puedas ayudar a saber a que se debe.

    Gracias

  7. Jesus dice:

    Buenas Felipe,
    Excelente tutorial, me gustaria saber si existe alguna forma de hacer lo mismo pero para impresiones en PDF de las ordenes de compras que son liberadas. Me podrias echar una mano ?

    Quedo atento a comentarios.

    Saludos,

  8. Hector Diaz dice:

    Que tal Felipe
    No he podido poner el descento en la linea de un pedido de venta, todo lo demas ya le he solucionado gracias a esta pagina, me marca error «el objeto no admite esta propiedad o metodo» cuando llega a esta linea

    vDoc.Lines.DiscPrcnt = descuento

    buscando en la ayuda, efectivamente la propiedad DiscPrcnt no aparece como tal, pero entonces de que manera puedo ponerle un descuento a mi Pedido?

    Saludos

    y gracias de antemano

  9. Jaime dice:

    Srea su apoyo:
    Yo agregue la siguiente linea para insertar un valor al campo de usuario «U_TipoOpT12»:
    vDoc.Lines.UserFields.Fields.Item(«U_TipoOpT12»).Value = ActiveSheet.Cells(RowD, 6).value

    y al ejecutar el macros el mensaje de error que me sales es «memoria insuficiente».

    • Buenas tardes

      Ese error ocurre (solo en excel), cuando el valor que le estas tratando de dar al campo es mas largo de lo que permite.

      Ejemplo, campo varchar(3) y le colocas «Felipe» como valor.

      Saludos

  10. Renato Baez dice:

    Hola Felipe, gracias por tu aporte me funciona perfecto. Pero tengo un problema… Cuando crea la orden de compra, en el precio unitario coloca el precio de venta que tiene el articulo y no el precio que yo le estoy dando y lo otro es como controlar si la orden de compra va hacer en pesos o en dolares?

    Gracias y Saludos

    • Buenas tardes

      Para el precio, utiliza la propiedad «UnitPrice» en vez de Price.
      Para el caso de la moneda, si es a nivel de documento «vDoc.DocCurrency» y si es a nivel de linea «vDoc.Lines.Currency» con el código de la moneda, ejemplo «USD».

      Saludos

  11. Hector Diaz dice:

    por cierto, estupendo aporte Felipe

    Saludos

  12. Fredy Lino dice:

    Excelente aporte, tengo una consulta, para actualizar un campo de usuario, pero que de igual forma lo tengo en columnas de Excel, como sería la sintaxis ???

    Gracias de antemano.

    Fredy

    • Estimado, en el comentario de arriba aparece.

      Saludos

      • Fredy Lino dice:

        Hola Amigo, en el comentario de arriba, se le escribe exactamente lo que quiere que se le actualice, pero si quiero que lo extraiga de una de las columnas de Excel, Yo lo he hecho de la siguiente forma y me da error:

        vItem.UserFields.Fields.Item(«U_Cod_Art_Base»).Value = ActiveSheet.Cells(Row, 4)

        Saludos

        Fredy

        • Hector Diaz dice:

          Yo lo solucione asi
          vItem.UserFields.Fields.Item(“U_Cod_Art_Base”).Value = ActiveSheet.Cells(Row, 4).value

          con un «punto value al final» ojala y te sirva

          ademas en la celda de excel si se trata de un numero en mi caso tuve que poner el apostrofe ‘ para que lo tomara como cadena y no como numero

        • Estimado, mis post y comentarios son a nivel de ejemplo para que uds apliquen la solución que desean.

          Saludos

  13. Luis dice:

    Funciona perfecto ,pero debo agregar un valor en un campo definido por usuario , como lo puedo hacer.

    • Buenas tardes

      Así.

      Cabecera:
      vDoc.UserFields.Fields.Item(«U_TUCAMPO»).Value = «Mi valor»

      Detalle:
      vDoc.Lines.UserFields.Fields.Item(«U_TUCAMPO»).Value = «Mi valor»

      Saludos

  14. William dice:

    Gran Aporte. Muchas Gracias

  1. marzo 18, 2015

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