โ๏ธ Explanatory Question
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;
}
}
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
}