B1TCH para SAP B1
El B1TCH es una herramienta (shell) que permite ejecutar scripts python usando la DI API de SAP B1, nació por ahí en el 2007 en el siguiente post: Get Your Kicks with DI Commander, donde tambien encontrarán una guía pero en ingles.
Descubrí el potencial de este shell hace año y medio aproximadamente y me ha facilitado las tareas de consultoría enormemente.
Mediante unas cuantas lineas de código es posible:
– Copiar documentos a otros
– Copiar datos maestros de una empresa a otra.
– Borrar masivamente datos maestros.
– Actualizar campos de usuario masivamente.
– Y cualquier cosa que permita la DI API.
Para usar esta herramienta, es necesario tener conocimientos previos de:
– SDK de SAP B1, específicamente como funcionan los objetos.
– Python a nivel básico.
A pesar de que la herramientas fue construida para SAP 2007, en algún momento el creador dejó el fuente de la aplicación para descarga, lo que permitió seguir dándole mantenimiento para las nuevas versiones.
Bueno, basta de texto y les muestro como funciona. Esta es la pantalla de bienvenida.
Lo primero que debemos hacer para toda aplicación de SAP, es conectarnos, por lo que debemos llenar los datos necesario para esto.
Una vez completado todos los datos necesarios, presionamos “Open session” y esperamos unos segundos
En la casilla “Active B1 Sessions” está el listado de compañías a las cuales el B1TCH esta conectado (pueden tener mas de 1 session conectada).
Para desconectarse, basta con cerrar la aplicación o hacer clic en “Drop session”.
Una vez conectado a la o las compañias, vamos a la pestaña “Code”, donde le diremos que debe hacer.
La consola superior es la que muestra los mensajes de salida, los errores y todo lo que use la función “print” (vease python).
Les dejaré el siguiente código para borrar 1 item.
for item in browse(ITEM,query("select top 1 ItemCode from OITM")):
if item.Remove()!=0:
print session1.GetLastErrorDescription()
else:
print 'Item borrado'
El código que ven ahí, ejecuta la query “select top 1 ItemCode from OITM” y traerá el primer item del maestro, acto seguido el método “Remove()”, tratará de removerlo, si la eliminacion es satisfactoria aparecerá el mensaje “Item Borrado” de lo contrario aparecerá el error que devuelva SAP mediante el llamado de la funcion “GetLastErrorDescription()”-
Luego de escribir el código, presionamos el boton “Execute” y veamos que sucede.
Al tratar de eliminar el item, SAP me dice que no puede porque pertenece a una lista de materiales, por lo que es imposible borrarlo por el momento (ese mismo error les aparecerá si tratan de borrarlo desde el cliente).
El método “browse” que se está utilizando ahí, es un método propio de esta aplicacion que permite ejecutar un query para obtener los items (en este caso) que se desean trabajar, es como mandar el ParentKey en el DTW.
La descripcion de la syntax es algo así
for <variable> in browse (<Objeto SAP>, query(” select …. “)):
<Variables> es el nombre que le van a dar al objeto, puede ser cualquier nombre
<Objeto SAP> es tipo de objeto que van a actualizar, hay 2 maneras de colocarlo.
En la siguiente pestaña “Cheat sheet” está el diccionario de objetos:
Ahí vemos que el “ITEM” es el objeto “SAPBobsCOM.BoObjectTypes.oItems” el cual corresponde a los artículos de SAP, y como mas arriba les dije que pueden llamarlo de 2 maneras es porque pueden colocar ITEM, o el nombre completo del objeto “SAPBobsCOM.BoObjectTypes.oItems”
for item in browse(SAPbobsCOM.BoObjectTypes.oItems,query("select top 1 ItemCode from OITM")):
if item.Remove()!=0:
print session1.GetLastErrorDescription()
else:
print 'Item borrado'
Y con esto termina la explicación básica, ahora les dejaré algunos ejemplos que he realizado:
Actualizar campos de una entrega
for o in browse(DELIVERYNOTE, query("select DocEntry from ODLN where DocEntry = 18")):
o.FolioNumber = 12345
o.FolioPrefixString = 'FC'
o.Indicator = '33'
if o.Update()!= 0:
print session1.GetLastErrorDescription()
Anular facturas de proveedores desde un archivo (para este caso, los DocEntry están en el txt)
orpc = get(PURCHASECREDITNOTE)
for DocEntry in open("c:\\AnularFacturas.txt"):
o = get(PURCHASEINVOICE,DocEntry)
if o.DocumentStatus == bost_Open:
orpc.CardCode = o.CardCode
orpc.DocDate = o.DocDate
orpc.DocDueDate = o.DocDueDate
orpc.TaxDate = o.TaxDate
orpc.DocType = o.DocType
orpc.Indicator = '60'
for olines in browse(o.Lines):
if olines.LineStatus == SAPbobsCOM.BoStatus.bost_Open:
orpc.Lines.BaseEntry = o.DocEntry
orpc.Lines.BaseLine = olines.LineNum
orpc.Lines.BaseType = 18
if o.Lines.Count > o.Lines.LineNum:
orpc.Lines.Add()
if orpc.Add()!= 0:
print session1.GetLastErrorDescription()
else:
print "|"
Cerrar todas las notas de venta abiertas
for oNV in browse(ORDER, query("SELECT DOCENTRY FROM ORDR WHERE DocStatus='O'")):
if oNV.Close()!= 0:
print session1.GetLastErrorDescription()
Y así, según su necesidad pueden crear y compartir sus código para distintas necesidades.
Ah, me olvidaba de dejarles el link de descarga:
Saludos
Hola ! Habra una version para SBO 9.1 y SQL 2012 ? El enlace de Dropbox no funciona