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
DinaupClientCconectado y las bases de la escritura: Cliente Dinaup. - Tu biblioteca MyDinaup con la clase
TareasDeProyectosD. El ejemplo usaDemoUp.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ón | A favor | En contra |
|---|---|---|
| Añadir el campo vacío en las filas donde no aplica | Una sola llamada para todo el lote | El 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 grupo | Cada fila escribe solo sus campos | Una 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.