WriteOperations por lotes

Inserta o actualiza hasta 25 registros de una sección en una sola llamada a RunWriteOperationAsync, con las mismas columnas en todas las operaciones.

Una lista de WriteOperation viaja en una sola llamada a RunWriteOperationAsync y reduce las peticiones contra la API. Este ejemplo crea cinco tareas de proyecto en una llamada.

Antes de empezar

  • Un DinaupClientC conectado y las bases de la escritura: Cliente Dinaup.
  • Tu biblioteca MyDinaup con la clase TareasDeProyectosD. El ejemplo usa DemoUp.MyDinaup.

Crea la lista de operaciones

using Dinaup;
using static DemoUp.MyDinaup.SectionsD;

var bulkOperations = new List<WriteOperation>();

for (int i = 1; i <= 5; i++)
{
    var itemData = new Dictionary<string, string>
    {
        { TareasDeProyectosD.TareasDeProyectosES.Resumen, $"Tarea #{i}" },
        { TareasDeProyectosD.TareasDeProyectosES.TextoPrincipal, $"Contenido para la tarea {i}" },
        { TareasDeProyectosD.TareasDeProyectosES.Prioridad, (i % 3).ToString() }
    };

    bulkOperations.Add(new WriteOperation("", itemData));   // "" => alta
}

Todas las operaciones con las mismas columnas

Un lote exige que todas las operaciones lleven el mismo juego de campos. Si una lleva un campo que otra no, el SDK lanza ArgumentException y no se escribe ninguna.

Cuando un campo no aplica a todas las filas, tienes dos opciones:

OpciónA favorEn contra
Añadir el campo vacío en las filas donde no aplicaUna sola llamada para todo el loteEl vacío es un valor: en una edición borra lo guardado. En un alta con scripts sobrescribe el autorrellenado del servidor
Agrupar las filas por columnas y hacer una llamada por grupoCada fila escribe solo sus camposUna llamada por grupo, sin deshacer entre ellas: si la segunda falla, la primera ya está escrita

Agrupa cuando edites registros que ya existen o cuando ese campo lo rellene el servidor. El vacío es seguro en los campos que nadie calcula por ti.

Ejecuta el lote

var sectionId = TareasDeProyectosD._SectionIDGUID;

var result = await dinaupClient.RunWriteOperationAsync(sectionId, bulkOperations, true);
result.EnsureSuccess();   // lanza si alguna operación falló

var ids = bulkOperations
    .Where(o => o.WriteOperationResult?.Confirmed == true)
    .Select(o => o.WriteOperationResult.RowID)
    .ToList();

result es un WriteOperationResponse: IsSuccess, UserError (los errores de todas las filas), Results (por token de operación), los contadores Cantidad_NuevosEnSeccionPrincipal y Cantidad_ActualizadosEnSeccionPrincipal, y TiempoTotal en milisegundos. Cada WriteOperation recibe su WriteOperationResult con Confirmed, RowID y AError.

Límites y reintentos

Máximo 25 operaciones por llamada (DinaupClientC.MaxItemsPerWriteOperation) y 2.500 elementos contando líneas (MaxTotalItemsPerWriteOperation). Para más, divide la lista con .Chunk(25).

Por defecto no se deshace nada: si una operación falla, las demás se escriben igual. EnsureSuccess() lanza, pero parte del lote ya está en la base de datos. Al reintentar, envía solo las operaciones cuyo WriteOperationResult no vino con Confirmed. Con allOrNone: true el servidor deshace el lote entero si alguna falla, pero solo sin scripts: con el tercer parámetro en true rechaza la llamada (E-6191).

El tercer parámetro (true) ejecuta los scripts de la sección en cada operación. Cuándo activarlos y qué cambia en las líneas, en Escribir en secciones.

En esta página