Procesamiento por lotes en SAP Business One Service Layer

Decía en una entrada anterior que el formador pasó por el procesamiento por lotes de puntillas, en plan «existe, pero es terriblemente complicado». Me he leído varias veces la documentación al respecto y sigo sin entender cómo montar el payload de una petición de procesamiento por lotes.

Pero con el cliente OData es otro cantar. Es tan simple como esto:

For Each Documento In Documentos
    oDocumentoSAP = New Document
    Documento.RellenarDocumento(oDocumentoSAP)
    Context.AddDocument(oDocumentoSAP, Documento.DocType)
Next
Dim responses = Await Context.SaveChangesAsync(options:=SaveChangesOptions.BatchWithSingleChangeset)

Hay dos opciones a indicar en el SaveChanges:

  • BatchWithIndependentOperations procesaría las operaciones de forma secuencial e independiente. Si se produce un error se para, pero todo lo que se haya creado o modificado antes queda hecho.
  • BatchWithSingleChangeset mete todo en una única transacción, como ocurría en Di Server. Si falla uno, falla todo.

La limitación con respecto a Di Server es que allí podíamos incluir cierres y cancelaciones dentro del lote de operaciones y aquí, no, al no ser operaciones propias de OData sino funciones específicas.