2.4.La clase contract


Seguiremos con nuestro ejemplo.
A continuación vamos a meterle al dialogo un rango de fechas para que nos muestre las facturas de ese periodo.

Debemos crear una clase de tipo contract

Class CustInvoiceJourReportContract implements SysOperationValidatable
{
        FromDate      fromDate;
        ToDate          toDate;
}

Nota: Implementamos de la clase SysOperationValidatable porque queremos realizar una validación de los parámetros en el dialogo, en caso que no quisiéramos realizar ninguna validación no haría falta hacer la implementación.

Crearemos dos métodos parm para nuestra variables.

[DataMemberAttribute]
FromDate  parmFromDate(FromDate  _fromDate = fromDate)
{
       fromDate = _fromDate;

       return fromDate;
}

[DataMemberAttribute]
ToDate  parmToDate(ToDate  _ToDate = toDate)
{
       toDate = _toDate;

       return toDate;
}
Los métodos parm de la clase contract admiten algunos parámetros para modificar el parámetro.
Alguno de los más comunes son los que se utilizan para cambiar la etiqueta del campo o el orden en que se deben mostrar los parámetros.


En caso de quererlo cambiar la parte superior del método quedaría así..
[
    DataMemberAttribute,
    SysOperationLabelAttribute(literalStr("Fecha final del período")),
    SysOperationHelpTextAttribute(literalStr("Fecha final del período"))
]


Pos supuesto podemos utilizar etiquetas, lo he dejado así para que lo entendáis.
Hay cientos de ejemplos en Ax.



Como hemos implementado nuestra clase de la SysOperationValidatable esto nos obligará a crear el método validate.

public boolean validate()
{
      boolean ret = true;
      ;
     
      if (fromDate > toDate)
      {
           ret = checkFailed("La fecha desde no puede ser superior a la fecha hasta.");
      }
     
      return ret;
}

Atención

En nuestra clase DP deberemos indicarle que tiene una contract, con lo que el método classDeclaration de nuestra clase DP quedaría así.

[
      SRSReportQueryAttribute(queryStr(CustInvoiceJourReport)),
      SRSReportParameterAttribute(classStr(CustinvoiceJourReportContract))
]
class CustInvoiceJourReportDP extends SRSReportDataProviderBase
{
     CustInvoiceJourReportTmp   tmp;
}

Recordad de hacerle una compilación CIL.

Ahora, si lanzamos nuestro informe aparecerán nuestros parámetros en el dialogo.



Por último, nos faltará modificar el método processReport para recuperar los valores de los parámetros de la contract para asignárselos a nuestra query.

[SysEntryPointAttribute]
Public void processReport()
{
     CustInvoiceJourReportContract contract = this.parmDataContract() as CustInvoicejourReportContract;
     QueryRun                                   qr = new QueryRun(this.parmQuery()); 
     QueryBuildDataSource              qbds;
     CustInvoiceJour                         custInvoiceJour;
     
     FromDate                                   fromDate;
     ToDate                                       toDate;
     ;
     fromDate  = contract.parmFromDate();
     toDate       = contract.parmToDate();
     qbds = qr.query().dataSourceTable(tablenum(CustinvoiceJour));
     qbds.addRange(fieldnum(CustinvoiceJour, DueDate)).value(queryRange(fromDate, toDate));
     While (qr.next())
     {
             custInvoiceJour = qr.get(tablenum(CustInvoiceJour));

 tmp.clear();
             tmp.CustGroup          = custInvoiceJour.custGroup;
             tmp.DueDate              = custInvoiceJour.DueDate;
             tmp.invoiceAccount  = custInvoiceJour.invoiceAccount;
             tmp.InvoiceDate        = custInvoiceJour.invoiceDate;
             tmp.InvoiceId             = custInvoiceJour.InvoiceId;
             tmp.salesId                 = custInvoicejour.salesId;
             tmp.insert()
    }
}

Con todo esto ahora nuestro informe tendrá unos parámetros para filtrar por fecha de vecimiento las facturas.

Comentarios