Entrada desde doc. Preliminar usando SDK y VB .net

Buen día a todos.

Ya tengo casi un año desde la ultima que escribí por un problema que al final lo pude resolver pero ya se había cerrado el tema y por eso no lo publique, era este Programa para Facturas y pagos, y el problema era que la variable Entry la tenia que definir como String y asignarle un valor vacío ("") antes de usar el comando GetNewObjctCode(Entry) haciendo eso me funciono correctamente.

Hoy vengo de nuevo por una orientación, tengo un proyecto nuevo que quiero hacer, les explico.
Cuando se crea un documento de entrada de mercancía en la empresa la persona de compras lo crea en preliminar luego la persona encargada de bodega que recibe el producto abre el documento preliminar y lo termina agregándole los números de serie a los productos, agregarlos directamente en sap es muy engorroso y tarda mucho y en ocasiones tiene que agregar 600 números de serie para una solo entrada a pesar de que usa un lector láser para los números de serie, entonces pensé que tal vez podía hacer algo con el sdk.

Mi problema que no se por donde empezar, como abrir el documento preliminar creado anteriormente, agregarle los números de serie y crear el documento “final”, no tengo problema creando los documentos, pero mi duda es como trabajarlo con los documentos preliminares, e buscado y solo e encontrado como crear el documento preliminar, pero en mi caso el documento preliminar ya estará creado, o solo debo leer la información del documento preliminar y “crear” una nueva entrada (ya no preliminar) con los datos del doc. preliminar creado y luego eliminar el doc. preliminar base?.

De antemano gracias por su ayuda.

Slds.

Veamos, después de que me cambiaron el cuento, resulta que solo se agregaran las serie y se guardara como preliminar de nuevo. Esto es lo que hice.

primero tengo un Public DocPreliminar As SAPbobsCOM.Documents
después de conectarme a la sociedad tengo

... Mas código ...
DocPreliminar = oCompany.GetBusinessObject(BoObjectTypes.oDrafts) '<-- Especifica que voy a trabajar con documentos preliminares'
oRecordSet = oCompany.GetBusinessObject(SAPbobsCOM.BoObjectTypes.BoRecordset)
oRecordSet.DoQuery("select * from ODRF t1 where t1.ObjType = 20 and t1.DocStatus = 'o'") '<--- obtengo todos los documentos preliminares de entrada de mercancia abierto
DocPreliminar.Browser.Recordset = oRecordSet 
'Esto lo meto en un datagrid
Do Until DocPreliminar.Browser.EoF
                 DocP(0) = DocPreliminar.DocEntry
                 DocP(1) = DocPreliminar.DocNum
                 DocP(2) = DocPreliminar.DocDate
                 DocP(3) = DocPreliminar.CardCode
                 DocP(4) = DocPreliminar.DocTotal

                 DocPreliminar.Browser.MoveNext()
                 dgvEntradaMercanciaOP.Rows.Add(DocP) '<--- Datagrid con el dato de todas las entradas de mercancía que cumplan con el flitro'
Loop

... mas codigo ...

'En el evento doble clic del primer datagrid (dgvEntradaMercancia) tengo esto'
... código ...
DocPreliminar = oCompany.GetBusinessObject(BoObjectTypes.oDrafts) 'oDrafts son los documentos preliminares'
DocPreliminar.GetByKey(dgvEntradaMercanciaOP.Item(0, dgvEntradaMercanciaOP.CurrentRow.Index).Value)

'-----------------------------------------------
 ' Ayuda visual para el usuario sepa con que documento esta trabajando
lblCodProveedor.Text = DocPreliminar.CardCode
lblNomProveedor.Text = DocPreliminar.CardName
lblCorrelativo.Text = DocPreliminar.NumAtCard
lblFecha.Text = DocPreliminar.DocDate
lblDocNum.Text = DocPreliminar.DocNum

'Obtengo los artículos que tiene la entrada de mercancia'
For x = 0 To DocPreliminar.Lines.Count - 1
                DocPreliminar.Lines.SetCurrentLine(x)
                LineProducto(0) = DocPreliminar.Lines.LineNum
                LineProducto(1) = DocPreliminar.Lines.ItemCode
                LineProducto(2) = DocPreliminar.Lines.ItemDescription
                LineProducto(3) = DocPreliminar.Lines.Quantity
                LineProducto(4) = DocPreliminar.Lines.Price
                LineProducto(5) = DocPreliminar.Lines.WarehouseCode
                LineProducto(6) = DocPreliminar.Lines.AccountCode
                dgvProductos.Rows.Add(LineProducto) '<--- Datagrid con detalle de los productos de la entrada'
                Application.DoEvents()
Next

... Mas código ...

' En el evento clic del data grid dgvProductos puse'

DocPreliminar.Lines.SetCurrentLine(dgvProductos.Item(0, dgvProductos.CurrentRow.Index).Value) '<-- Establezco con que linea de la entrada voy a trabajar'

Label10.Text = DocPreliminar.Lines.LineNum '<--- solo para verificacion no sirven para el proceso Problema 1'
Label11.Text = DocPreliminar.Lines.VisualOrder '<--- solo para verificacion no sirven para el proceso Problema 1a'
Label13.Text = dgvProductos.Item(0, dgvProductos.CurrentRow.Index).Value '<--- solo para verificacion no sirven para el proceso'

dgvImei.Rows.Clear()
lblCodArticulo.Text = dgvProductos.Item(1, dgvProductos.CurrentRow.Index).Value
lblDescripcion.Text = dgvProductos.Item(2, dgvProductos.CurrentRow.Index).Value
lblNecesarios.Text = dgvProductos.Item(3, dgvProductos.CurrentRow.Index).Value
lblAgregados.Text = DocPreliminar.Lines.SerialNumbers.Count '<-- Cantidad de series agregadas'

'En este for leo las series y las agrego a un datagrid para ver las que se han agregado si las hubieran'
For x1 = 0 To DocPreliminar.Lines.SerialNumbers.Count - 1
            DocPreliminar.Lines.SerialNumbers.SetCurrentLine(x1) '<-- Establezco que linea de los seriales estoy leyendo para extraer el dato que necesito'
            Imei(0) = DocPreliminar.Lines.SerialNumbers.BaseLineNumber
            Imei(1) = DocPreliminar.Lines.SerialNumbers.InternalSerialNumber
            Imei(2) = DocPreliminar.Lines.SerialNumbers.ManufacturerSerialNumber
            dgvImei.Rows.Add(Imei)  '<--- Datagrid contiene todas las series'
            Application.DoEvents()
Next x1

'y por ultimo un boton actualizar'
... mas codigo...

'Una vez terminado de agregar todas las series nuevas al datagrid se procede a actualizar la entrada de mercancia preliminar'
DocPreliminar.Lines.SetCurrentLine(dgvProductos.Item(0, dgvProductos.CurrentRow.Index).Value) '<-- Establezco que linea voy a trabajar'
For x = 0 To dgvImei.Rows.Count - 2
                DocPreliminar.Lines.SerialNumbers.SetCurrentLine(x) '<-- Como estoy actualizando utilizo esto para especificar que linea voy a actualizar'
                DocPreliminar.Lines.SerialNumbers.ReceptionDate = DocPreliminar.DocDate
                DocPreliminar.Lines.SerialNumbers.InternalSerialNumber = dgvImei.Item(1, x).Value
                DocPreliminar.Lines.SerialNumbers.ManufacturerSerialNumber = dgvImei.Item(2, x).Value
                DocPreliminar.Lines.SerialNumbers.Add() '<-- Agrego las series'
Next x
Rest = DocPreliminar.Update() '<--- Actualizo el documento preliminar Entrada de mercancía'

... mas código ...
Fin por el momento

Mis problemas por el momento son los que tengo marcados como problema 1 y problema 1a ya que ese orden no es el mismo en una de las entradas que estoy probando, ya que el VisualOrder no es el mismo que el LineNum en el caso de la entrada con la que estoy probando y eso me da problemas, si uso el linenum a la hora de actualizar me lo actualiza en otra linea.

Slds.

1 me gusta

Estimados @businessone:

Alguien nos puede dar una manito por acá. :pray:t5:

Saludos :raised_hand_with_fingers_splayed:t5:

@Walter_Castro LineNum se supone que guarda el orden en la que están tus lineas en el documento, sin embargo si estas lineas fueron manipuladas (por ejemplo borras alguna) prácticamente ya pierdes el orden cronológico de esos items, al copiarlo a otro documento así viaja, pero el visualorder si conserva ese orden cronológico.

Espero haberme explicado.

Hola @Walter_Castro

Como tal no te puedo ayudar en el código, puesto que no soy programador, soy un poco más una combinación entre funcional y técnico (más del último que del primero), pero mi experiencia actual es principalmente como Consultor de Procesos sin importarme el sistema o ERP que se necesite… Así que voy más bien a realizarte una consulta a tí de tus procesos…

Estás hablando que

Ok… no voy a discutir que algunas veces ingresar los números de serie y demás puede ser tedioso, y mencionas que ya usas un lector de Laser, por lo que comprendería que ya lo usas para capturar directo en SAP los mismos…

Vamos a tu caso de los 600 items que quieres actualizarles la serie. hagas lo que hagas en SDK sin importar lo bueno que sea el programa… Alguien va a tener que capturar los 600 números de series… Ya sea tu empleado en el almacén, que confíen en algún archivo del proveedor donde te diga que series te mandó (esperando que ellos no cometieran un error de dedo en algúna de las series), o lo que sea. Alguien va a tener que capturar esas 600 series, y siempre lo más sencillo es con la pistola laser…

en este tendría 2 preguntas:

  1. ¿Exactamente que estás intentando de realizar para agilizar el proceso con un desarrollo SDK? (esta es para conocimiento general y comprender que quieres hacer con exactitud).

  2. ¿Has pensado en capturar esas 600 series directamente primero en algún archivo de excel por ejemplo? (el excel es el que más rápido reacciona a las pistolas lasers y colocan en una celda la serie de inmediato)… Esto lo pregunto porque de ahí tendrías 2 posibilidades sin mucho rollo ni mucha programación:
    a) Puedes sencillamente copiar y pegar del excel a SAP B1: si le pones las columnas exactas, aunque las demás las dejes vacías puedes realizar las cargas de manera directa con un simple Ctrl+C - Ctrl+V.
    b) Puedes crear un miniprograma de pocas líneas (creo que en menos de 30 - 50 lo sacas) en VB donde le coloques en un campo de la ventana el número de documento preliminar que vas a actualizar, y la lógica sea la siguiente:

  • Localiza el número del documento que le pusiste en la pantalla, con una consulta Select directa a SQL
  • Rellenas un archivo Excel con los datos del Docentry, código del artículo (o artículos), y sus series.
  • Disparas en 3 líneas la carga por el DTW leyendo el archivo de configuración previamente creado, el nuevo archivo de Excel en formato CSV que creaste, y… Wuolaaaa… ya está listo…

(Los puntos 1 y 2 anteriores podrías incluso hacerlos en una Macro de Excel sin necesidad alguna de programación adicional en VB para correr la info, y eso reduciría las líneas de código del .EXE únicamente a 3 líneas lo que te da más facilidad de mantenimiento, y manejo autosustentable de la información)

La carga te la hace la herramienta de SAP B1 el DTW, tu programa lo único que hace es armar el archivo necesario para su carga y disparar la herramienta que ya te da SAP para este tipo de casos (sea por el programa o por una macro en excel).

Yo en lo particular lo haría de esa manera,

  • Sería menos invasivo,
  • No tendrías que verificar que todo esté dentro de SAP, (permisos de AddOn, licencias, usuarios que pueden verlo y usarlo…)
  • No tienes posibilidades de quejas de SAP porque la carga y movimiento de datos la realizas con el DTW y el mismo valida los archivos .CSV que le mandes. Si no cumple con alguna validación de SAP, arroja error y no realiza la carga (lo puedes configurar así)
  • El mantenimiento podría ser tan fácil o complicado como quieras, sin interrumpir actividades ni tu ambiente de producción en SAP, sacando a todo el personal cada que necesites actualizar este AddOn.
  • No necesitas manejar esquema de licencias y permisos dentro de SAP, solo podrá correrlo el equipo donde istales el .EXE y el DTW (que lo controlas con tu departamento de TI).
  • Te quitas todos los demás dolores de cabeza… :sweat_smile::sweat_smile::sweat_smile::sweat_smile:

Ya lo demás es desición tuya y de la empresa… pero como dice el meme…
" --Tu…
– Los códigos sencillos, sin dolor de cabeza por no saber que tienes que hacer con los documentos.
– Actualizaciones sencillas a un excel en caso de detectar errores a futuro o nuevos cambios en las necesidades.
– cumplir con normas sin ser invasivo y de facil manipulación…
– No se… Piensalo… :wink: "

Jajajaja… saludos.

1 me gusta

Buen día.

Cuando casi termino el proyecto me dicen que lo quieren cambiar, ahora se debe crear el documento ya no actualizar el preliminar, y luego crear automáticamente la factura de proveedor, el encargado de ingresar las series que si se pueden crear los traslados automaticamente y yo con cara de “si quieres te puedo enseñar a volar te tiro por un acantilo para que salgas volando” pero bueno cosas que pasan.

@juliancab si te explicaste bien, use el visualorder para establecer el “.Lines.SetCurrentLine” y me funciono correctamente, gracias.

@Ares17000 Con los 600 que pueden ser mas o menos estoy seguro en un 99.99% seguro que seran correctos ya que las series que usamos son los IMEI de los telefonos,

primero; en el caso de esta empresa el proceso Entrada mercancía preliminar–>ingreso serie–> crear entrada mercancia final → Factura Proveedor se podría hacer en un solo “jalon” automatico, segundo al ingresar las series se puede hacer en paralelo designar cuales van a las diferentes sucursales facilitando después la creación de los traslados en sap y tercero tengo la muy mala costumbre de entretenerme resolviendo cosas complicadas jejejeje.

Actualmente así lo hace, escanea todas las series en excel y luego copia y pega en sap, usamos la versión 8.8 pl10 (decisiones de “arriba”) y no se si en las versiones mas recientes se pueda copiar y pegar varias lineas de un vez pero en esta tiene que ir serie por serie copiando y pegando.

no se me había ocurrido lo de excel y una macro, aunque el DTW esta restringido para uso únicamente de TI o sea solo yo jejejeje, lo voy a tomar muy en cuenta.

Me gustan los retos y los problemas complicados me parecen interesantes y entretenidos de resolver creo que por eso me lance de una vez a hacer este proyecto sin tomar en cuenta otras alternativas (cosa que tengo que mejorar jajajaja).

Gracias por sus comentarios los tendré en cuenta y haré pruebas con lo de excel para ver que conviene mas tanto a la empresa como a mi jejejeje

Slds.

Este tema se cerró automáticamente 91 días después del último post. No se permiten nuevas respuestas.