Skip to main content Link Menu Expand (external link) Document Search Copy Copied

SysOperation framework

X++

Snippet collection

Snippets

The following example shows a SysOperation implementation featuring a multiselect company lookup, a custom lookup and a query in the dialog.

Contract

[
    DataContract,
    SysOperationContractProcessing(classStr(ExampleUIBuilder))
]
internal final class ExampleContract extends SysOperationDataContractBase
{
    List selectedEntities;
    ProjId projId;
    str packedQuery;

    [
        DataMember('selectedEntities'),
        SysOperationLabel("@SYS303247"),
        SysOperationDisplayOrderAttribute('1'),
        AifCollectionType('return', Types::String)
    ]
    public List parmSelectedLegalEntities(List _selectedEntities = selectedEntities)
    {
        selectedEntities = _selectedEntities;
        return selectedEntities;
    }

    [
        DataMember('projId'),
        SysOperationDisplayOrderAttribute('2')
    ]
    public ProjId parmProjId(ProjId _projId = projId)
    {
        projId = _projId;
        return projId;
    }

    [DataMemberAttribute, AifQueryTypeAttribute('_packedQuery', queryStr(ExampleQuery))]
    public str parmQuery(str _packedQuery = packedQuery)
    {
        packedQuery = _packedQuery;
        return packedQuery;
    }

    public Query getQuery()
    {
        return new Query(SysOperationHelper::base64Decode(packedQuery));
    }
}

UIBuilder

internal final class ExampleUIBuilder extends SysOperationAutomaticUIBuilder
{
    ExampleContract contract;
    DialogField	availableCompanies;
    DialogField	projId;

    public void postBuild()
    {
        contract = this.dataContractObject() as ExampleContract;
        availableCompanies = this.bindInfo().getDialogField(contract, methodStr(ExampleContract, parmSelectedLegalEntities));
        projId = this.bindInfo().getDialogField(contract, methodStr(ExampleContract, parmProjId));

        availableCompanies.lookupButton(FormLookupButton::Always);
        projId.registerOverrideMethod(methodStr(FormStringControl, lookup), methodStr(ExampleUIBuilder, lookupProjId), this);
    }

    public void postRun()
    {
        Query query = new Query();
        QueryBuildDataSource qbdsLegalEntity = query.addDataSource(tablenum(CompanyInfo));

        qbdsLegalEntity.addSelectionField(fieldNum(CompanyInfo, DataArea));
        qbdsLegalEntity.addSelectionField(fieldNum(CompanyInfo, Name));

        container selectedFields = [tableNum(CompanyInfo), fieldNum(CompanyInfo, DataArea)];

        SysLookupMultiSelectCtrl::constructWithQuery(this.dialog().dialogForm().formRun(), availableCompanies.control(), query, false, selectedFields);
    }

    private void lookupProjId(FormStringControl _formStringControl)
    {
        Query query = new Query();
        QueryBuildDataSource qbds;
        SysTableLookup sysTableLookup;

        sysTableLookup = SysTableLookup::newParameters(tableNum(ProjTable), _formStringControl);
        
        query.allowCrossCompany(true);
        qbds = query.addDataSource(tableNum(ProjTable));

        sysTableLookup.addLookupfield(fieldNum(ProjTable, ProjId), true);
        sysTableLookup.addLookupfield(fieldNum(ProjTable, Name));
        sysTableLookup.addLookupfield(fieldNum(ProjTable, DataAreaId));
        sysTableLookup.parmQuery(query);
        sysTableLookup.performFormLookup();
    }
}

Service

internal final class ExampleService extends SysOperationServiceBase
{
    ProjId projId;
    List companies;

    public void process(ExampleContract _contract)
    {
        companies = _contract.parmSelectedLegalEntities();
        projId = _contract.parmProjId();

        ListEnumerator companiesEnumerator = companies.getEnumerator();
        while (companiesEnumerator.moveNext())
        {
            info(companiesEnumerator.current());
        }

        info(projId);
    }
}

Controller

internal final class ExampleController extends SysOperationServiceController
{
    protected void new()
    {
        super(classStr(ExampleService), methodStr(ExampleService, process));
    }

    public ClassDescription defaultCaption()
    {
        return "Example description of the process";
    }

    public ClassDescription caption()
    {
        return this.defaultCaption();
    }

    public static ExampleController construct(SysOperationExecutionMode _executionMode = SysOperationExecutionMode::Synchronous)
    {
        ExampleController controller;

        controller = new ExampleController();
        controller.parmExecutionMode(_executionMode);

        return controller;
    }

    public static void main(Args _args)
    {
        ExampleController controller;

        controller = ExampleController::construct();
        controller.parmArgs(_args);
        controller.startOperation();
    }

}

The following snippet can be used to run a Controller class getting input from the caller menuitem passing it to the Contract class so it is accessible from the Service class.

Controller

public static void main(Args _args)
{
    ExampleController controller;

    controller = ExampleController::construct();
    ExampleContract contract = controller.getDataContractObject() as ExampleContract;

    if (_args.parmEnumType() == enumNum(ExampleEnumType))
    {
        ExampleEnumType type = _args.parmEnum();
        contract.parmExampleEnumType(type);
    }
    else
    {
        contract.parmExampleEnumType(ExampleEnumType::DefaultValue);
    }
    
    controller.parmArgs(_args);
    controller.startOperation();
}