Data validation in the SalesTable Form

I have a need to validate the sales line data entered in the SalesTable form. So far I have entered the following code in the canClose() method

public boolean canClose()
{
    InventDim     salesLineInvDimensions;
    SalesLine     thisSalesOrderLines;
    date          salesLineModifiedDate;

    //STEVOYDEV385 03/10/2018 PaulF -Begin
    //If the current sales order status is not "Invoiced" then check if any of the new lines
    //contain references to the Credit/Billings warehouse. If so, then ensure a reason
    //code has been specified.
    if (salesTable.SalesStatus == SalesStatus::Backorder ||
        salesTable.SalesStatus == SalesStatus::Delivered)
    {
        while select thisSalesOrderLines
            join salesLineInvDimensions
            where thisSalesOrderLines.SalesId == salesTable.SalesId
                && salesLineInvDimensions.inventDimId == thisSalesOrderLines.InventDimId
        {
            salesLineModifiedDate = DateTimeUtil::date(thisSalesOrderLines.modifiedDateTime);
            if (salesLineInvDimensions.InventLocationId == "Cred_Bill"
                && salesLineModifiedDate == systemDateGet()
                && !salesTable.ReturnReasonCodeId)
            {
                warning("A credit reason code must be specified when sales lines reference the Credit/Billings warehouse");
                this.doRefresh(true);
                return false;
            }
        }
    }
    //STEVOYDEV385 03/10/2018 PaulF -End

    if (!salesLine.PBAItemLine::checkMandatory() )
    {
        return false;
    }

    ret = super();

    // The user needs to be able to modify an exchange order associated to a return and
    // go back to returns without completing the exchange order (this order).  The returns
    // logic will prevent the order from remaining open.  A return must always be completed
    // therefore, the exchange order will never be left open.
    ret = ret && element.mcrCheckOpenOrder();

    if (element.closedCancel() && ret)
    {
        ret = salesTableForm.canClose(salesTable);
    }
    return ret;
}

Whilst this works perfectly if data is saved within the form, when the data is entered and the user immediately clicks “Close”, the code doesn’t identify the new data (Because it hasn’t been saved at this point) and the check doesn’t validate the data as I expect.

Putting my code block after the call to the super() method, simply results in the sales header information being lost all together.

Can anyone please advise where I should place my code to correctly validate the entered data, but also stop the form from closing if it doesn’t satisfy the check?

Thanks,

Paul

Hi Paul,

Can I know which fields are you trying to validate in this scenario?

Try to put your whole code in the active method of your form.

You are trying to validate the sales status field of the sales table if so you try to add your code in the modified method of that field.

Please check and let me know any queries.

Regards,

John

Do I understand correctly that you validate the current order, therefore users can easily skip the validation by switching to another record?

I would probably validate the order later in the process, e.g. when user confirming it.

Hi Martin, Thanks for your message. It seems that our users do not always generate a sales confirmation, or maybe only the first occurrence, so no future changes are confirmed. I was looking to validate the data at the stage the form was closed. If there was a reference to a particular warehouse on the SalesLine and no ReturnReasonCodeId on the SalesTable then the user is to be alerted before being able to progress

Hi John, Thanks for your message. I am trying to validate the warehouse recorded on the SalesLine. If a particular value has been entered then a reason code is required on the SalesTable. Do you have any suggestions?