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}.MyDinaupreferenciado en el proyecto. Los ejemplos usanDemoUp.MyDinaup. - Un
DinaupClientCconectado. En Play, la sesión inyectada (SessionPlay, de tipoPlaySesion) hereda deDinaupClientC; en tu app, pasa el cliente que devuelveDinaupClientC.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();Estados por su catálogo
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.