Archivo de la categoría: SAP B1

Andanzas y problemas con SAP Business One

B1WS: editar oferta de ventas

Una breve entrada sobre SAP Business One:

Intento editar una oferta de ventas vía B1WS. Al obtener la misma mediante el consabido método de GetByParams, me da error al procesar el xml. Un error de conversión de algún campo de fecha/hora. Empezamos bien.

Ataco directamente el DiServer para conseguir la oferta en bruto, en texto plano, y busco los campos fecha/hora a ver cuál es el causante. Verán, SAP B1 guarda el tiempo como entero corto, en forma HHMM: 935, 1250, 1800… que son devueltos por correctamente formateados como 9:35:00, etc. Pero hay un campo de la oferta de ventas (y del resto de documentos de márketing), UpdateTS, que guarda HHMMSS: 125015. Y me encuentro con que el DiServer lo devuelve formateado de la forma 1250:15:00. Ferpecto.

Imagino que al que hizo la función que formatea los campos de hora para los servicios del DiServer le dirían que todos iban en forma HHMM o que los campos UpdateTS de los documentos de márketing son posteriores a dicha función y nadie se acordó de cambiarla/comprobarla.

Como el campo es irrelevante en la actualización (no necesito su valor y es algo que rellena el propio SAP), la solución es simple: editar manualmente el wsdl generado, buscar el campo de marras y cambiar el tipo de time a string.

Imagino que para la 9.3 lo habrán corregido, pero en la 9.2 parche 10, así están las cosas.

Eficiencia alemana (II): actualizar listas de precios en SAP B1

Problema pintoresco este que menciono. Las veces anteriores, mi compañero había actualizado los precios importando a partir de una hoja Excel desde dentro de SAP, pero, ya sea por mi poca pericia, ya por la actualización a 9.0, he sido incapaz de preparar el maldito Excel. La otra opción, que en su día se dejó por imposible, es importar a través de esa bestia del averno llamada Data Transfer. Así, preparo mi plantilla para los precios, tabla ITM1, con las columnas ItemCode, LineNum, PriceList, Price y Currency. De ellas, ItemCode es el código del artículo, PriceList es el id de la lista de precios. Añadimos el importe y la moneda (EUR) y listo… Uhm, salvo LineNum, que ponemos a 0, que es lo habitual (LineNum, como regla general, es el número de línea por código de la tabla maestra, es decir, que será 0 si sólo vamos a actualizar un precio por artículo, como era el caso).

Bien, pues eso no funciona.

Después de buscar por los foros oficiales, encuentro una respuesta ante este problema que es absurda. O, por lo menos, yo no le encuentro la lógica. Decía así: quite la columna PriceList y en LineNum ponga el id de la lista de precios menos 1.

Y funciona.

Eficiencia alemana

Con la actualización a SAP Business One 9.0 se decidió cambiar la nomenclatura de los almacenes. En la práctica, esto supuso crear almacenes nuevos y mover masimavente la mercancía en el sistema (necesario, de todas formas, para aprovechar el nuevo sistema de ubicaciones). Para evitar que los usuarios metieran accidentalmente mercancía en los almacenes viejos, se marcaron como Inactivos (un bonito check en el formulario de almacenes, que se corresponde con el campo Inactive de la tabla correspondiente). Hasta ahí, sin problemas.

Como baja colateral, el enlace entre el gestor de proyectos (desarrollo propio) y SAP dejó de funcionar. El enlace permite tanto crear artículos en SAP desde el gestor como actualizarlos después y supuso un gran ahorro de trabajo en el departamento, que hasta entonces debía copiar los datos logísticos de un nuevo producto a mano desde el gestor a SAP.

El error que da al actualizar el artículo es que hay almacenes inactivos. Guay. La cosa se pone interesante porque el código del error no aparece en la documentación (he descubierto estos meses que lo raro es que aparezca). Es más, buscando en la documentación de la DI Api (la interfaz de datos que se usa para comunicarse con SAP) el dichoso campo Inactive no aparece en el objeto Almacén.

Vale, puede ser que yo sea un cegato y venga con otro nombre (no es raro), así que me voy a la documentación de la base de datos para ver si la descripción del campo me da alguna pista sobre qué nombre buscar en la DI Api.

Y no lo encuentro. En la documentación de la base de datos de la versión 9.0 no viene, para la tabla maestra de almacenes, el campo Inactive. Por más que exista y por más que tenga un bonito check en el formulario de gestión de almacenes. Con un par.

A eso se le llama «eficiencia alemana».