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.
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
Una vez agregado el boton, debemos asignarle la macro para que ejecute el codigo que acabamos de escribir.
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.).
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.
Y con eso, termina esta publicacion.
Saludos a todos los lectores.
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
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?
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.
Ya encontré la solución, Había que incluir la línea oCompany.LicenseServer = «SERVIDOR»
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.
Felipe, estoy haciendo una remision, no un pedido, pero tengo problemas con los lotes, como puedo agregar un lote.
Saludos
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!
Maria, comparte el error que te arroja
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
agrega la referencia del DI Api de SAP
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,
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
Buenas
La propiedad se llama DiscountPercent y es de tipo double (enteros y decimales).
Ejemplo
vDoc.Lines.DiscountPercent = 10.5
Saludos
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
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
Gracias Felipe funciona perfecto!
por cierto, estupendo aporte Felipe
Saludos
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
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
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
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
Gran Aporte. Muchas Gracias