Wednesday, December 20, 2017

Execute SQL in x++

server static void main(Args _args)
{
   Connection      connection;
    Statement       statement;
    str             query;
    Resultset       resultSet;
    Str1260         test = "delay";
    ;

    // create connection object
    connection = new Connection();

    // create statement
    statement = connection.createStatement();

    // Set the SQL statement
    query = "select recid from LANGUAGETXT where LANGUAGETXT.txt = '" + test +"'";

    // assert SQL statement execute permission
    new SqlStatementExecutePermission(query).assert();

    // when the query returns result,
    // loop all results for processing
    //BP Deviation documented
    resultSet = statement.executeQuery(query);

    while(resultSet.next())
    {
        // do something with the result
        info(strFmt("%1",resultSet.getInt64(1)));
    }

    // limit the scope of the assert call
    CodeAccessPermission::revertAssert();
}

Monday, December 4, 2017

Clear Master and release variant which has no transaction and barcode

Clear Release variant first and them master variant.
static void ClearReleaseVarient(Args _args)
{

    EcoResDistinctProductVariant                EcoResDistinctProductVariant, variant;
    EcoResProductVariantDimensionValue          EcoResProductVariantDimensionValue;
    EcoResProductTranslation                    ecoResProductTranslation_Variant;
    EcoResProductVariantColor                   ecoResProductVariantColor;
    EcoResProductVariantStyle                   ecoResProductVariantStyle;
    EcoResProductVariantSize                    ecoResProductVariantSize;
    EcoResProductVariantConfiguration           ecoResProductVariantConfiguration;
   
    InventDimCombination                        InventDimCombination,InventDimCombination1,InventDimCombination2;
    InventItemBarcode                           inventBarcode;
    InventTrans                                 InventTrans;
    InventDimCombination                        InventDimCombinationCheckother;
    DataArea                                    dataArea;
    boolean                                     checkdelete;
   /* EcoResSize                                  size;
    EcoResColor                                 color;
    EcoResStyle                                 style;
    EcoResProductMaster                         productmaster;
    , dimFromCombination;
    EcoResConfiguration                         config;
    InventTable                                 inventTable;
    ,ecoResProducttest;
    container                                   con;
    int                                         conin;*/
    InventDim                                   inventDim,inventDimcheck;
    EcoResProduct                               ecoResProduct;
    FromTime    startTime;
    int seconds = 1,counts;
    CommaIo file;
    container line;
    #define.ExampleFile(FileNameSave)
    FileIoPermission perm;
    CompanyInfo CompanyInfo;
    #File
    str   elapsed;
    ;
    startTime = timeNow();

 while select crossCompany InventDimCombination order by ItemId asc
                            where InventDimCombination.ItemId =="A01112Y07521"
                    notexists join inventBarcode
                           where inventBarcode.RetailVariantId == InventDimCombination.RetailVariantId
                    notexists join InventTrans
                            where InventTrans.ItemId == InventDimCombination.ItemId
                                && InventTrans.inventDimId == InventDimCombination.InventDimId
            {
                counts++;
                select ecoResProduct
                        where ecoResProduct.DisplayProductNumber == InventDimCombination.ItemId
                            && (ecoResProduct.Division == ProductTypeSetup::findByDivision("20").RecId
                            || ecoResProduct.Division == ProductTypeSetup::findByDivision("29").RecId)
                            && EcoResProduct.ProductCreationType == ProductCreationType::GlobalProduct;

                if(ecoResProduct)
                {
                    if(InventDimCombination.validateDelete())
                    {
                         select forUpdate * from InventDimCombination1 where InventDimCombination1.RecId == InventDimCombination.RecId;
                        InventDimCombination1.delete();
                    }
                }
                else
                    {
                        inventDim       = inventDim::find(InventDimCombination.InventDimId);
                        info(strFmt("Item %1, Size %2, Color %3, Config %4, Season %5 has transactions", InventDimCombination.ItemId, inventDim.InventSizeId, inventDim.InventColorId, inventDim.configId, inventDim.InventStyleId));
                    }
    }




        elapsed = timeConsumed(startTime, timeNow());
         info(strFmt("Time elapsed: %1 and number of records deleted %2", elapsed,counts));


}

-------------------------------------------------------------------------------------------------------------------
static void ClearProductMastervarient(Args _args)
{
     EcoResDistinctProductVariant                EcoResDistinctProductVariant, variant;
    EcoResProductVariantDimensionValue          EcoResProductVariantDimensionValue;
    EcoResProductTranslation                    ecoResProductTranslation_Variant;
    EcoResProductVariantColor                   ecoResProductVariantColor;
    EcoResProductVariantStyle                   ecoResProductVariantStyle;
    EcoResProductVariantSize                    ecoResProductVariantSize;
    EcoResProductVariantConfiguration           ecoResProductVariantConfiguration;
     DimensionAttributeValues                 DimensionAttributeValues;
    InventDimCombination                        InventDimCombination,InventDimCombination1,InventDimCombination2;
    InventItemBarcode                           inventBarcode;
    InventTrans                                 InventTrans;
    InventDimCombination                        InventDimCombinationCheckother;
    DataArea                                    dataArea;
    boolean                                     checkdelete;
   /* EcoResSize                                  size;
    EcoResColor                                 color;
    EcoResStyle                                 style;
    EcoResProductMaster                         productmaster;
    , dimFromCombination;
    EcoResConfiguration                         config;
    InventTable                                 inventTable;
    ,ecoResProducttest;
    container                                   con;
    int                                         conin;*/
    InventDim                                   inventDim,inventDimcheck;
    EcoResProduct                               ecoResProduct;
    FromTime    startTime;
    int seconds = 1,counts;
    CommaIo file;
    container line;
    #define.ExampleFile(FileNameSave)
    FileIoPermission perm;
    CompanyInfo CompanyInfo;
    #File
    str   elapsed;
    ;
    startTime = timeNow();

      while   select  ecoResProduct
                        where
                         ecoResProduct.DisplayProductNumber == "A01112Y07521"
                            && (ecoResProduct.Division == ProductTypeSetup::findByDivision("20").RecId
                            || ecoResProduct.Division == ProductTypeSetup::findByDivision("29").RecId)
                            && EcoResProduct.ProductCreationType == ProductCreationType::GlobalProduct
    {
     while select EcoResDistinctProductVariant order by RecId asc
     where EcoResDistinctProductVariant.DisplayProductNumber like ecoResProduct.DisplayProductNumber +"*"
        {
        select crossCompany InventDimCombination
        where InventDimCombination.DistinctProductVariant == EcoResDistinctProductVariant.RecId
        && InventDimCombination.ItemId == ecoResProduct.DisplayProductNumber;


                if(!InventDimCombination)
                {
                    ttsBegin;

                   // select forUpdate * from ecoResProductTranslation_Variant where ecoResProductTranslation_Variant.Product ==ecoResProduct.RecId;
                   // ecoResProductTranslation_Variant.delete();
                        select forUpdate * from EcoResProductVariantColor where EcoResProductVariantColor.DistinctProductVariant == EcoResDistinctProductVariant.RecId;
                    EcoResProductVariantColor.delete();
                        select forUpdate * from EcoResProductVariantStyle where EcoResProductVariantStyle.DistinctProductVariant == EcoResDistinctProductVariant.RecId;
                    EcoResProductVariantStyle.delete();
                        select forUpdate * from EcoResProductVariantSize where EcoResProductVariantSize.DistinctProductVariant == EcoResDistinctProductVariant.RecId;
                    EcoResProductVariantSize.delete();
                        select forUpdate * from EcoResProductVariantConfiguration where EcoResProductVariantConfiguration.DistinctProductVariant == EcoResDistinctProductVariant.RecId;
                    EcoResProductVariantConfiguration.delete();
                        select forUpdate * from DimensionAttributeValues where DimensionAttributeValues.EcoResDistinctProductVariant == EcoResDistinctProductVariant.RecId;
                     DimensionAttributeValues.delete();
                    InventDimCombination1=null;
                    select forUpdate * from variant where variant.RecId == EcoResDistinctProductVariant.RecId;
                    variant.delete();
                    ttsCommit;
                }
        }
    }
     elapsed = timeConsumed(startTime, timeNow());
         info(strFmt("Time elapsed: %1 and number of records deleted %2", elapsed,counts));

}

Sunday, December 3, 2017

Update All table id and Field Id on SQL dict based on AOT property

Dictionary      dictionary = new Dictionary();
    DictTable    dictTable;
    DictField       dictField;
    TableId         tableId,tableIdbuffer,NewtableId;
    FieldId         fieldId,fieldIdbuffer,newfieldId,fieldIdmin,fieldIdmax;
    SqlDictionary   sqlDictionaryTable;
    SqlDictionary   sqlDictionaryField;
    SqlDictionary   SqlDictionaryupdate,SqlDictionaryupdaterecordset;
    PS_Table        PS_Table;
    int             i;

    setPrefix("Update of data dictionary IDs");
    tableId = dictionary.tableNext(0);
    ttsbegin;
    select maxof(tabid) from SqlDictionaryupdate;
    tableIdbuffer = SqlDictionaryupdate.tabId + 1000;

    ttsBegin;
    delete_from PS_Table;
    ttsCommit;

    while (tableId > 0)
    {

        dictTable = new SysDictTable(tableId);
        setPrefix(dictTable.name());

        if (!dictTable.isSystemTable())
        {
            //Finds table in SqlDictionary by name in AOT, if ID was changed.
            //Empty field ID represents a table.
            select sqlDictionaryTable
                where sqlDictionaryTable.name == dictTable.name()
                && sqlDictionaryTable.fieldId == 0
                && sqlDictionaryTable.tabId != dictTable.id();

            if (sqlDictionaryTable)
            {
                //Updates table ID in SqlDictionary
                NewtableId = dictTable.id();
                select * from SqlDictionaryupdate
                where SqlDictionaryupdate.tabId == NewtableId;
                if(SqlDictionaryupdate)
                {

                    update_recordset SqlDictionaryupdaterecordset
                    setting TabId = tableIdbuffer
                    where SqlDictionaryupdaterecordset.TabId == SqlDictionaryupdate.tabId;
                    tableIdbuffer--;

                }

                if (ReleaseUpdateDB::changeTableId(
                    sqlDictionaryTable.tabId,
                    dictTable.id(),
                    dictTable.name()))
                {
                    info(strFmt("Table ID changed (%1 -> %2)", sqlDictionaryTable.tabId, dictTable.id()));
                }
            }

            fieldId = dictTable.fieldNext(0);
            select maxof(fieldId) from SqlDictionaryupdate;
            fieldIdbuffer = SqlDictionaryupdate.fieldId + 1000;
            select minOf(fieldId) from SqlDictionaryupdate;
            fieldIdmin = SqlDictionaryupdate.fieldId;
            //For all fields in table
            while (fieldId)
            {

                info(strFmt("%1",fieldId));
                dictField = dictTable.fieldObject(fieldId);
                //    info(dictField.name());
                if (dictField.isSql() && !dictField.isSystem())
                {
                    //Finds fields in SqlDictionary by name and compares IDs



                    select sqlDictionaryField
                        where sqlDictionaryField.tabId == dictTable.id()
                        && sqlDictionaryField.name == dictField.name()
                        && sqlDictionaryField.fieldId != 0
                        && sqlDictionaryField.fieldId != dictField.id();

                    if (sqlDictionaryField)
                    {
                        Newfieldid = dictField.id();
                        NewtableId = dictTable.id();

                        ttsBegin;
                        PS_Table.TabId = NewtableId;
                        PS_Table.Tablename = dictTable.name();
                        PS_Table.FieldName = dictField.name();
                        PS_Table.FieldId = Newfieldid;
                        PS_Table.insert();
                        ttsCommit;

                        select * from SqlDictionaryupdate
                        where SqlDictionaryupdate.tabId == NewtableId
                        && SqlDictionaryupdate.fieldId == Newfieldid;
                        if(SqlDictionaryupdate)
                        {

                             update_recordset SqlDictionaryupdaterecordset
                                setting FieldId = fieldIdbuffer
                                where SqlDictionaryupdaterecordset.TabId    == NewtableId
                                   && SqlDictionaryupdaterecordset.FieldId  == Newfieldid;
                            fieldIdbuffer--;

                        }

                        //Updates field ID in SqlDictionary
                        if (ReleaseUpdateDB::changeFieldId(
                            dictTable.id(),
                            sqlDictionaryField.fieldId,
                            dictField.id(),
                            dictTable.name(),
                            dictField.name()))
                        {
                            info(strFmt("Field %1 - ID changed (%2 -> %3)",
                            dictField.name(),
                            sqlDictionaryField.fieldId,
                            dictField.id()));
                        }
                    }
                }
                fieldId = dictTable.fieldNext(fieldId);
            }
        }
        tableId = dictionary.tableNext(tableId);
    }
    ttscommit;

How to identify the user that was used to change an object from AOT in AX2012

Get the object name for which we need to track these (user and date&time) information's. Login to SQL Server Management Studio an...