Search your query

Wednesday, December 24, 2025

Add Custom Query Range with standard HCMWorkerLookup Form (HcmWorker name filter will work in this logic)

 > Copy Event Handler class method:


[FormControlEventHandler(formControlStr(PurchRFQCaseTable, PurchRFQCaseLine_NewlyCreatedWorkerRecReferenceField), FormControlEventType::Lookup)]

public static void PurchRFQCaseLine_NewlyCreatedWorkerRecReferenceField_OnLookup(FormControl sender, FormControlEventArgs e)

{

    HcmWorkerLookup         hcmWorkerLookup;

    Query                               query;

    QueryBuildDataSource    dsHcmWorkerTableDS;


    hcmWorkerLookup = HcmWorkerLookup::newOnlyActiveEmployeesWithinCompany();

    query                       = hcmWorkerLookup.updateQuery();


    dsHcmWorkerTableDS = query.dataSourceTable(tableNum(HcmWorker));

    dsHcmWorkerTableDS.addRange(fieldNum(HcmWorker,                   

            NewlyCreatedBooleanFieldInHcmWorkerToFilter)).value(queryValue(NoYes::Yes));


    hcmWorkerLookup.lookupWorker(sender);


}



>> If it is normal lookup method then replace sender by that field name. for example:

private void newlyCreatedWorkerFieldLookup(FormStringControl _newlycreatedFieldForLookup)

{

    HcmWorkerLookup         hcmWorkerLookup;

    Query                               query;

    QueryBuildDataSource    dsHcmWorkerTableDS;


    hcmWorkerLookup = HcmWorkerLookup::newOnlyActiveEmployeesWithinCompany();

    query                       = hcmWorkerLookup.updateQuery();


    dsHcmWorkerTableDS = query.dataSourceTable(tableNum(HcmWorker));

    dsHcmWorkerTableDS.addRange(fieldNum(HcmWorker,                   

            NewlyCreatedBooleanFieldInHcmWorkerToFilter)).value(queryValue(NoYes::Yes));


    hcmWorkerLookup.lookupWorker(_newlycreatedFieldForLookup);

}

Wednesday, November 5, 2025

Amount to Amount in Words (ARABIC) || GLOBAL Class Extension || Numerals To Text in Arabic

X++ Code for Numeral to Text in Arabic Language.


[ExtensionOf(classStr(Global))]

static class Global_OurModelName_Extension

{

    static TempStr numeralsToArabicTxt(real _num)

    {

        int     numOfPennies = any2int(decRound(frac(_num), 2) * 100) mod 100;

        real    test         = _num - frac(_num);


        int64   numOfTenths;

        str 20  ones[19], tenths[9], hundreds, thousands, millions, billions, trillions;


        int64   temp;

        str 200 returntxt;

        int64   testLoc;

        int     fils;


        str     zero;

        str     comma;

        str     and;

        str     cent;


        real modOperator(real a1, real a2)

        {

            int tmpi;

            real tmp1, tmp2;


            tmp1 = a1 / a2;

            tmpi = real2int(tmp1);

            tmp2 = tmpi;

            return (tmp1 - tmp2)*a2;

        }


        str doubleDigit2ARTxt(real doubledigit,boolean _pennies = false)

        {

            str     txt;

            int     firstDigit;

            real    tempdigit;


            //if (_pennies)

            //{

            //    firstDigit = doubledigit * 10;

            //    doubledigit = doubledigit * 100;


            //    if (!firstDigit)

            //    {

            //        doubledigit = doubledigit mod 10;

            //        //txt = zero + " " + ones[doubledigit];

            //        txt = ones[doubledigit];

            //        return txt;

            //    }

            //}


            tempdigit = doubledigit;

            

            if (tempdigit >= 20)

            {

                tempdigit = tempdigit div 10;

                txt = tenths[tempdigit];

                doubledigit = doubledigit mod 10;

            }

            

            if (doubledigit >= 1)

            {

                txt = txt ?  (ones[doubledigit] + and + txt) : ones[doubledigit];

            }


            return txt;

        }


        real checkPower(real  _test,int64 _power)

        {

            int64   numOfPower;


            if (_test >= _power)

            {

                numOfPower = _test div _power;


                if (numOfPower >= 100)

                {

                    temp = numOfPower div 100;


                    if(temp > 9)// The validation was previously on 2

                    {

                        returntxt = returntxt ? (returntxt + and + ones[temp] + ' ' + hundreds) :(returntxt + ' ' + ones[temp] + ' ' + hundreds);

                    }

                    else

                    {

                        switch(temp)

                        {


                            Case 1:

                                returntxt = returntxt ? (returntxt + and + hundreds) : (returntxt + ' ' + hundreds);

                                break;

                            Case 2:

                                // TO DO need to insert a label for two hundred in Arabic

                                returntxt = returntxt ? (returntxt + and + "مائتين") :   returntxt + ' ' + "مائتين";

                                break;

                            Case 3:

                                // TO DO need to insert a label for three hundred in Arabic

                                returntxt = returntxt ? (returntxt + and + "ثلاثمائة") :   returntxt + ' ' + 'ثلاثمائة';

                                break;

                            Case 4:

                                // TO DO need to insert a label for four hundred in Arabic

                                returntxt = returntxt ? (returntxt + and + "اربعمائة") :   returntxt + ' ' + "اربعمائة";

                                break;

                            Case 5:

                                // TO DO need to insert a label for five hundred in Arabic

                                returntxt = returntxt ? (returntxt + and + "خمسمائة") :   returntxt + ' ' + "خمسمائة";

                                break;

                            Case 6:

                                // TO DO need to insert a label for six hundred in Arabic

                                returntxt = returntxt ? (returntxt + and + "ستمائة") :   returntxt + ' ' + "ستمائة";

                                break;

                            Case 7:

                                // TO DO need to insert a label for seven hundred in Arabic

                                returntxt = returntxt ? (returntxt + and + "سبعمائة") :   returntxt + ' ' + "سبعمائة";

                                break;

                            Case 8:

                                // TO DO need to insert a label for eight hundred in Arabic

                                returntxt = returntxt ? (returntxt + and + "ثمانمائة") :   returntxt + ' ' + "ثمانمائة";

                                break;

                            Case 9:

                                // TO DO need to insert a label for nine hundred in Arabic

                                returntxt = returntxt ? (returntxt + and + "تسعمائة") :   returntxt + ' ' + "تسعمائة";

                                break;


                        }

                    }

                    numOfPower = numOfPower mod 100;

                }


                if (numOfPower > 2 && _power > 100)

                {

                    returntxt = returntxt ?  (returntxt + and + doubleDigit2ARTxt(real2int(numOfPower))) : (returntxt  + ' ' + doubleDigit2ARTxt(real2int(numOfPower)));

                }

                else

                {

                    if(returntxt && numOfPower)

                    {

                        returntxt = returntxt + and + ' ';

                    }

                }


                switch(_power)

                {

                    case 1000000000000 :

                    {

                        if( numOfPower == 2)

                        {

                            // TO DO need to insert a label for two trillions in Arabic

                            returntxt = returntxt + "تريليونين ";

                        }

                        else

                        {

                            returntxt = numOfPower > 10 ||  numOfPower == 1 || numOfPower == 0 ? (returntxt + ' ' + trillions) : (returntxt + ' ' + "تريليونات");

                        }

                        _test = modOperator(_test, 1000000000000.00);

                        break;

                    }

                    case 1000000000 :

                    {

                        if( numOfPower == 2)

                        {

                            // TO DO need to insert a label for two billions in Arabic

                            returntxt = returntxt + "مليارين";

                        }

                        else

                        {

                            returntxt = numOfPower > 10 ||  numOfPower == 1 || numOfPower == 0 ? (returntxt + ' ' + billions) : (returntxt + ' ' + "مليارات");

                        }

                        _test = modOperator(_test, 1000000000);

                        break;

                    }

                    case 1000000 :

                    {

                        if( numOfPower == 2)

                        {

                            // TO DO need to insert a label for two Millions in Arabic

                            returntxt = returntxt + "مليونين";

                        }

                        else

                        {


                            returntxt = numOfPower > 10 || numOfPower == 1 || numOfPower == 0 ? (returntxt + ' ' + millions) : (returntxt + ' ' + "ملايين");


                        }

                        _test = modOperator(_test, 1000000);

                        break;

                    }

                    case 1000 :

                    {

                        if( numOfPower == 2)

                        {

                            // TO DO need to insert a label for two Thousands' in Arabic

                            returntxt = returntxt + "ألفين";

                        }

                        else

                        {

                            returntxt = numOfPower > 10 ||  numOfPower == 1 || numOfPower == 0  ? (returntxt + ' ' + thousands) : (returntxt + ' ' + "الاف");

                        }

                        _test = modOperator(_test, 1000);

                        break;

                    }

                    case 100 :

                    {

                        switch (numOfPower)

                        {

                            case 2:

                                returntxt = returntxt + "مائتين";

                                break;


                            case 3:

                                returntxt = returntxt +"ثلاثمائة";

                                break;


                            case 4:

                                returntxt = returntxt + "اربعمائة";

                                break;


                            case 5:

                                returntxt = returntxt + "خمسمائة";

                                break;


                            case 6:

                                returntxt = returntxt + "ستمائة";

                                break;


                            case 7:

                                returntxt = returntxt + "سبعمائة";

                                break;


                            case 8:

                                returntxt = returntxt + "ثمانمائة";

                                break;


                            case 9:

                                returntxt = returntxt + "تسعمائة";

                                break;


                            default:

                                returntxt = returntxt + ' ' + hundreds;

                        }


                        _test = modOperator(_test, 100);

                        break;

                    }

                }


            }

            return _test;


        }


        infolog.language("AR");


        and     = ' ' + "@SYS5534" + ' ';

        comma   = "درهم"; // United Arab Emirates

        comma =  "ريـال"; // Saudi Arabia

        

        //comma = "@SYS80142";

        

        zero    = "@SYS2068";

        cent    = "فلس";    // United Arab Emirates

        cent    = "هللــه"; // Saudi Arabia


        ones[1]     = "@SYS26620";

        ones[2]     = "@SYS26621";

        ones[3]     = "@SYS26622";

        ones[4]     = "@SYS26626";

        ones[5]     = "@SYS26627";

        ones[6]     = "@SYS26628";

        ones[7]     = "@SYS26629";

        ones[8]     = "@SYS26630";

        ones[9]     = "@SYS26631";

        ones[10]    = "@SYS26632";

        ones[11]    = "@SYS26633";

        ones[12]    = "@SYS26634";

        ones[13]    = "@SYS26635";

        ones[14]    = "@SYS26636";

        ones[15]    = "@SYS26637";

        ones[16]    = "@SYS26638";

        ones[17]    = "@SYS26639";

        ones[18]    = "@SYS26640";

        ones[19]    = "@SYS26641";


        tenths[1]   = 'Not used';

        tenths[2]   = "@SYS26643";

        tenths[3]   = "@SYS26644";

        tenths[4]   = "@SYS26645";

        tenths[5]   = "@SYS26646";

        tenths[6]   = "@SYS26647";

        tenths[7]   = "@SYS26648";

        tenths[8]   = "@SYS26649";

        tenths[9]   = "@SYS26650";


        hundreds    = "@SYS26651";

        thousands   = "@SYS26652";

        millions    = "@SYS26653";

        billions    = "@SYS26654";

        trillions   = "@SYS101697";



        test        = checkPower(test, 1000000000000);

        test        = checkPower(test, 1000000000);

        test        = checkPower(test, 1000000);

        test        = checkPower(test, 1000);

        test        = checkPower(test, 100);


        if(returntxt && test)

        {

            returntxt = returntxt + and + doubleDigit2ARTxt(real2int(test));

        }

        else

        {

            returntxt = returntxt + ' ' + doubleDigit2ARTxt(real2int(test));

        }


        if(numOfPennies)

        {

            //Removing the stars and addin the pound and cent wording to fullfil the Egyptian requierment

            returntxt = ' فقط ' + returntxt + ' ' + comma + ' ' + and + doubleDigit2ARTxt(numOfPennies,true) + ' ' + cent + ' لاغير ';

            //returntxt = '***' + returntxt + ' ' + comma + ' ' + doubleDigit2ARTxt(numOfPennies,true);


        }

        else

        {

            //Removing the stars and the zeros if no cents to fullfil the Egyptian requierment

            returntxt = ' فقط ' + returntxt + ' ' + comma + ' لاغير ';


            //returntxt = '***' + returntxt + ' ' + comma + ' ' + zero + ' ' + zero;

        }


      

        return returntxt;

    }

}

Thursday, July 24, 2025

Rename SQL Database (AxDB) to other name after bacpac file import (After Restoring UAT DB to Development Server)

 > Some cases, we might have issue with renaming Database once we import from UAT server to DEV server. In order to rectify this, we need to execute the following commands in SQL SERVER.


-- RENAME DATABASE ONE TO ANOTHER IN SQL SERVER.


-- Set Database in Single User Mode:

ALTER DATABASE AxDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE


-- Try to Rename the Database:

ALTER DATABASE AxDB MODIFY NAME = AxDB_Initial_Backup_15072025


-- Set the Database to Multi User Mode:

ALTER DATABASE AxDB_Initial_Backup_15072025 SET MULTI_USER WITH ROLLBACK IMMEDIATE


Tuesday, July 1, 2025

X++ code to fetch the Project total cost value from Project WBS based on Project ID

 X++ code to fetch Project total cost value from Project WBS based on Project ID


public static AmountMST findProjectWBSTotalCostValue(ProjTable _projTable)

{

    ProjTable                                       projTableLocal;

    AmountMST                                   totalWBSCost;

    PSAActivityEstimates                    projectActivityEstimates;

    SmmActivityParentLinkTable         activityParentLinkTable;

    SmmActivities                              smmActivities;


    if  (_projTable)

    {

        while select activityNumber from smmActivities

            exists join activityParentLinkTable

            where activityParentLinkTable.ActivityNumber == smmActivities.ActivityNumber

            exists join projTableLocal

            where projTableLocal.RecId == activityParentLinkTable.refRecId &&

                  activityParentLinkTable.parentType == smmActivityParentType::Project &&

                  projTableLocal.ProjId == _projTable.ProjId

        {

            while select projectActivityEstimates

            where projectActivityEstimates.ActivityNumber == smmActivities.ActivityNumber

            {

                    totalWBSCost += projectActivityEstimates.TotalCostPrice;

            }

        }

    }

    return totalWBSCost;

}

Friday, March 28, 2025

Create a Multiselect Lookup Control on a Simple Form & Dialog Form

Create a Multiselect Lookup Control on a Simple Form & Dialog Form


Example: Company Info (Legal Entity) list selection on Purchase order.

ON FORM:

 Steps:

1. Create a New String field (String size: based on your requirement) in PurchTable - Table Extension

2. Drag and Drop this field into PurchTable - Form Extension from PurchTable Data source.

3. Create one Simple Query for Company Info Table. (Ex: LegalEntityQueryForFilter)

3. Create a new Extension class for PurchTable form and write some user defined class and add 2 extra - event handler methods (On Initialized the form and On Modified the PurchTable Data Source > Newly created string field): Sample codes on below:


[ExtensionOf(formstr(PurchTable))]

final class PurchTable_YourModelName_Extension

{

    public static SysLookupMultiSelectCtrl legalEntityListMultiSelectCtrl;

    public Query buildDocuTypeQuery()

    {

        Query  legalEntityQry = new Query(queryStr(LegalEntityQueryForFilter));

        return legalEntityQry;

    }

    public SysLookupMultiSelectCtrl parmSysLookupMultiSelectCtrl(SysLookupMultiSelectCtrl  _legalEntityListMultiSelectCtrl = legalEntityListMultiSelectCtrl)
    {
        legalEntityListMultiSelectCtrl = _legalEntityListMultiSelectCtrl;
        return legalEntityListMultiSelectCtrl;
    }

    container getSelectedLegalEntities(str _legalEntitiesStr)
    {
        CompanyInfo     companyInfoTable;
        container       tmpValues, conIds, conName;
        int             idx;
 
        if (_legalEntitiesStr)
        {
            tmpValues = str2con(_legalEntitiesStr, ';');
        }
 
        for (idx = 1; idx <= conLen(tmpValues); idx++)
        {
            companyInfoTable    =  CompanyInfo::findDataArea(conPeek(tmpValues, idx));
            conIds             +=  companyInfoTable.RecId;
            conName            +=  companyInfoTable.DataArea;
        }
 
        return [conIds, conName, conIds];
    }

    // copy OnModified Event handler form PurchTableForm Extension  > Data source > select the newly created field.

    [FormDataFieldEventHandler(formDataFieldStr(IPurchTable, PurchTable,    NewStringField), FormDataFieldEventType::Modified)]

    public static void PurchTable_OnModified(FormDataObject sender, FormDataFieldEventArgs e)
    {
            FormRun                     formRun                 = sender.datasource().formRun();

            SysLookupMultiSelectCtrl    companyMultiSelectCtrl  = formRun.parmSysLookupMultiSelectCtrl();

            PurchTable           PurchTableLocal  = formRun.dataSource(FormDataSourceStr(PurchTable, PurchTable )).cursor() as PurchTable;
    
            PurchTableLocal.NewStringField        = con2Str(companyMultiSelectCtrl.getSelectedFieldValues(), ';');
    }

    [FormEventHandler(formStr(PurchTable), FormEventType::Initialized)]
public static void PurchTable_OnInitialized(xFormRun sender, FormEventArgs e)
{
       FormRun             formRun                 = sender.datasource().formRun();
        Query               legalEntityQry          = formRun.buildDocuTypeQuery();
        FormStringControl   newFilednameObject     = formRun.design().controlName('PurchTable_NewfieldForLegalEntityList');
        PurchTable  PurchTableLocal  = formRun.dataSource(FormDataSourceStr(PurchTable, PurchTable )).cursor() as PurchTable;
 
    legalEntityListMultiSelectCtrl              = SysLookupMultiSelectCtrl::construct(formRun,
                                                                                        newFilednameObject ,
                                                                                        querystr(legalEntityQry ),
                                                                                        false,
                                                                                        [tableNum(PurchTable), fieldNum(PurchTable, NewfieldForLegalEntityList)]);
 
    legalEntityListMultiSelectCtrl.refreshQuery(legalEntityQry);
    legalEntityListMultiSelectCtrl.set(formRun.getSelectedLegalEntities(PurchTable.NewfieldForLegalEntityList));
    formRun.parmSysLookupMultiSelectCtrl(legalEntityListMultiSelectCtrl);
}
----------------------------------

ON DIALOG FORM:

Steps:

1. Create Contract Class or Extension of standard contract class and add this mehod - Parm List of legal entities.

    public  List  selectedEntities;

        [ DataMemberAttribute('selectedEntities'),
            SysOperationDisplayOrderAttribute('101'),
             SysOperationGroupMemberAttribute('ProcessIdentifierGroup'),
             AifCollectionTypeAttribute('selectedEntities', Types::String),
             SysOperationLabelAttribute(literalStr("@SYS303247"))
      ]

    public List parmSelectedLegalEntities(List _selectedEntities = selectedEntities)
    {
        selectedEntities = _selectedEntities;

        return selectedEntities;
    }


2. Create UI Builder Class or Extension of standard UI Builder class and Register lookup method.

    Example:

    [ExtensionOf(classStr(StandardClassUIBuilder))]
    final class StandardClassUIBuilder_OurModel_Extension
    {
          public  DialogField          availableCompanies;
          public  DialogField          exchangeRateType;
          public  StandardContract contract; // above created contract or base contract class name

        public void postBuild()
        {
            boolean mustSkipNext = true;

            //DialogField reportIdFieldloc = this.reportIdField;
            //DialogField runInBundleloc = this.runInBundle;

            try
            {
                if (mustSkipNext)
                {
                    throw Exception::UpdateConflict;
               }
                next postBuild();
            }
 
            catch (Exception::UpdateConflict)
             {
                    //standardcode
           
                    // if require check with company info table buffer find method and set empty value.
                reportIdField.value('');

                    runInBundle.visible(true);
        
                    contract     = this.dataContractObject() as aboveContractClassName;
                    availableCompanies = this.bindInfo().getDialogField(contract, methodStr(aboveContractClassName, parmSelectedLegalEntities));

                    availableCompanies.lookupButton(FormLookupButton::Always);

            }


         }

        public void postRun()
        {
                boolean mustSkipNext = true;
                try
                {
                    if (mustSkipNext)
                    {
                            throw Exception::UpdateConflict;
                    }
                    next postRun();
                }
 
                catch (Exception::UpdateConflict)
                {
                        Query             query     = new Query();
                        QueryBuildDataSource    qbdsLegalEntity     = query.addDataSource(tablenum(CompanyInfo));

                        qbdsLegalEntity.fields().addField(fieldNum(CompanyInfo, DataArea));
                        qbdsLegalEntity.fields().addField(fieldNum(CompanyInfo, Name));

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

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

        }       
    
  }