C# con Dinaup

Cómo consume el código de Dinaup las clases de MyDinaup: usings estáticos, constantes de campo, identificadores de sección, catálogos y nombres de variables de informe.

Las convenciones con las que play.dinaup.com consume MyDinaup: cómo se importan las clases generadas, cómo se nombran los campos y las secciones, y cómo se llaman las variables que guardan un informe.

Antes de empezar

  • Tu paquete {Empresa}.MyDinaup referenciado en el proyecto. Los ejemplos usan DemoUp.MyDinaup.
  • Un DinaupClientC conectado. En Play, la sesión inyectada (SessionPlay, de tipo PlaySesion) hereda de DinaupClientC; en tu app, pasa el cliente que devuelve DinaupClientC.ConnectAsync.

Importa con using static

SectionsD, Reports y DynamicDocuments son clases parciales. Play las importa en el .csproj una vez para todo el proyecto y añade el using static de la categoría de informes en cada fichero:

<ItemGroup>
  <Using Include="Dinaup.extensions" Static="true" />
  <Using Include="DemoUp.MyDinaup" />
</ItemGroup>
using static DemoUp.MyDinaup.SectionsD;
using static DemoUp.MyDinaup.Reports.FuncionalidadD;

Cuando una fila de informe se usa en muchos sitios, el .csproj le da un alias con sufijo DTO:

<Using Include="DemoUp.MyDinaup.Reports.FuncionalidadD.RTGProyectosProyectosC.RTGProyectosProyectos_RowC">
  <Alias>ProyectoDTO</Alias>
</Using>

Usa el sufijo ReportData

Nombra la variable que contiene un informe con el sufijo ReportData. Así distingues la consulta de la lista de filas que obtienes de ella (Rows, RowsDic).

var motivosHorasExtrasReportData = new APIMotivosDeHorasExtrasC();
await motivosHorasExtrasReportData.ExecuteQueryAsync(client, 1, 90000, "", true);
dto.MotivosHorasExtra = motivosHorasExtrasReportData.RowsDic;

El quinto argumento es adminMode: ejecuta la consulta con privilegios de administrador. Firma completa en MyDinaup.

Campos por su constante

Un campo se nombra con la constante de su clase ES, nunca con la clave pr_ en un literal. Si el campo cambia de nombre en Flex y regeneras, el compilador señala cada uso.

// Correcto
wop.DataMainRow.Add(OportunidadesCRMD.OportunidadesCRMES.ReferenciaFase, faseId.STR());

// Incorrecto
wop.DataMainRow.Add("pr_20040512046", faseId.STR());

Secciones por su identificador tipado

El GUID de una sección se pasa con {Seccion}D._SectionIDGUID, nunca copiado a mano.

var resp = await client.RunWriteOperationAsync(OportunidadesCRMD._SectionIDGUID, wop, false);

Para leer un registro concreto, {Seccion}D.GetRowByIdAsync; para escribir una fila tipada, ToWriteOperation() sobre la instancia {Seccion}C:

var venta = await VentasIngresosD.GetRowByIdAsync(client, registroId);

WriteOperation wop = asiento.ToWriteOperation();

Los estados y tipos de tu esquema están en Constants como DinaupBasicInformation. Compara y filtra con ellos, no con el GUID ni con el texto.

if (salida.EstadoID == Constants.EstadosDeSalidas.Pendiente.Id)
    Process();

Referencia vacía en QuickQuery

Para filtrar registros cuyo campo Referencia* no está asignado, el valor es Guid.Empty.STR(), que resuelve a "". Los campos booleanos van con "1" y "0".

var sinTipo = await client.QuickQuery.CountAsync(
    MovimientosBancariosD._SectionID,
    new[] { QuickQueryFilter.Equal(MovimientosBancariosD.MovimientosBancariosES.ReferenciaTipo, Guid.Empty.STR()) }
);

Ver QuickQuery.

Informes tolerantes desde el arranque

En Program.cs, antes de crear ningún informe:

Dinaup.DinaupReportSettings.TolerateMissingColumns = true;

Un informe cuyo modelo va por delante del servidor carga las columnas que existen y avisa por log de las que faltan, en vez de dejar la pantalla en error.

El resto de reglas de C# están en Guías de estilo C# y la referencia del cliente en Cliente Dinaup.

En esta página