Home / Questions / Which is the best place to write validation code in D365 F&O SSRS reports?
Explanatory Question

Which is the best place to write validation code in D365 F&O SSRS reports?

👁 1 Views
📘 Detailed Answer
🕒 Easy to Read
Read the answer carefully and go through the related questions on the right side to improve your understanding of this topic.

Answer with Explanation

In D365 Finance & Operations SSRS reports, validation should be written mainly in the Data Contract class, preferably in the validate() method.

This ensures:

  • Validation runs before the report executes

  • Invalid parameters stop the report early

  • Clean and best-practice design

Data-dependent validation (like checking if records exist) can be done in the RDP class.

👉 Best practice:

  • Parameter validation → Data Contract

  • Data validation → RDP class


/// <summary>l
/// A data contract class for SSRS <c>ANSARIaDSDLoadStatusListReport</c> report.
/// </summary>
/// <remarks>
/// Developed for ANSARI_30343_RDD-LEW-005-SDShipmentList on 31-Jan-2022 by Vijay Kumar
/// </remarks>
[
    DataContractAttribute
]
class ANSARIaDSDLoadStatusListContract implements SysOperationValidatable
{
    DirPartyName                    userName;
    TransDate                       createdDateFrom, createdDateTo;
    NoYesId                         settled;    

    /// <summary>
    /// Parameter method for <c>DirPartyName</c>.
    /// </summary>
    /// <param name = "_userName">DirPartyName value</param>
    /// <returns>DirPartyName</returns>
    [
        DataMemberAttribute(identifierStr(UserName))
    ]
    public DirPartyName parmUserName(DirPartyName _userName = userName)
    {
        userName = _userName;
        return userName;
    }

    /// <summary>
    /// Parameter method for <c>Settled</c>.
    /// </summary>
    /// <param name = "_settled">Settled value</param>
    /// <returns>NoYesId</returns>
    [
        DataMemberAttribute('Settled'),
        SysOperationLabelAttribute("@ANSARI:ANSARISettled")
    ]
    public NoYesId parmSettledFlag(NoYesId _settled = settled)
    {
        settled = _settled;
        return settled;
    }

    /// <summary>
    /// Parameter method for <c>CreatedDateFrom</c>
    /// </summary>
    /// <param name = "_createdDateFrom">TransDate value</param>
    /// <returns>CreatedDateFrom</returns>
    [
        DataMemberAttribute('CreatedFromDate'),
        SysOperationLabelAttribute("@ANSARI:ANSARIFromDate")
    ]
    public TransDate parmCreatedDateFrom(TransDate _createdDateFrom = createdDateFrom)
    {
        createdDateFrom = _createdDateFrom;
        return createdDateFrom;
    }

    /// <summary>
    /// Parameter method for <c>CreatedDateTo</c>
    /// </summary>
    /// <param name = "_createdDateTo">TransDate value</param>
    /// <returns>CreatedDateTo</returns>
    [
        DataMemberAttribute('CreatedToDate'),
        SysOperationLabelAttribute("@ANSARI:ANSARIToDate")
    ]
    public TransDate parmCreatedDateTo(TransDate _createdDateTo = createdDateTo)
    {
        createdDateTo = _createdDateTo;
        return createdDateTo;
    }

    /// <summary>
    /// Validates the parameters.
    /// </summary>
    /// <returns>
    /// true if successful; otherwise, false.
    /// </returns>
    public boolean validate()
    {
        boolean ret = true;

        if (createdDateFrom && createdDateTo && createdDateFrom > createdDateTo)
        {
            ret = checkFailed("@ANSARI:ANSARICreatedDateValidate");
        }

        return ret;
    }

}

Example 2:


[DataContract]
class ANSARI_SalesReportContract
{
    FromDate fromDate;
    ToDate   toDate;

    [DataMember]
    public FromDate parmFromDate(FromDate _fromDate = fromDate)
    {
        fromDate = _fromDate;
        return fromDate;
    }

    [DataMember]
    public ToDate parmToDate(ToDate _toDate = toDate)
    {
        toDate = _toDate;
        return toDate;
    }

    public boolean validate()
    {
        boolean isValid = true;

        if (!fromDate || !toDate)
        {
            error("From date and To date are mandatory.");
            isValid = false;
        }

        if (fromDate > toDate)
        {
            error("From date cannot be greater than To date.");
            isValid = false;
        }

        return isValid;
    }
}

âš ī¸ RDP (Report Data Provider) class

Use validation here only if:

  • Validation depends on database data

  • Example: “No records exist for selected criteria”


public void processReport()
{
    if (!this.hasData())
    {
        throw error("No data found for selected criteria.");
    }

    // report logic
}