Enterprise Resource Planning Blogs by Members
Gain new perspectives and knowledge about enterprise resource planning in blog posts from community members. Share your own comments and ERP insights today!
cancel
Showing results for 
Search instead for 
Did you mean: 
felipe_loyolarodriguez
Active Contributor

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:

Dropbox - Publico

Saludos

1 Comment
Labels in this area