Monday, 9 May 2016

passing the number of records that are selected in the grid to another form control:

First of all  create  a new form "GridLinesCounter".
After that add the intedit control in that  form Design and change the property auto declaration to yes.
Create a new menu item and add this form to that menu item.

Go to the sales table list page form and add the created menu item in the ActionPane.
Then  override the clicked method in that menu item botton.

void clicked()
{
     FormDataSource fds;
    Common common;
    int counter;
    Args                args;
    FormRun             formrun;
    ;
    //super();
                     args = new Args();

    fdS = SalesTable_ds;
    for (common = fdS.getFirst(true) ? fdS.getFirst(true) : SalesTable_ds.cursor(); common; common = fdS.getNext())
    {
        counter++;
    }
    args.parm(int2str(counter));
    args.name(formstr(gridlinescounter));
    formRun = classFactory.formRunClass(Args);
    formRun.init();
    formrun.run();
    formrun.wait();
    info(int2str(counter));
}


Open the "GridLinesCounter" form and add init method.

public void init()
{
    str counter;
    counter = element.args().parm();
    super();
   intedit.value(str2int(Counter));
}
Now,go to salestablelistpage form and select some records .
Then click newmenuitem button (gridlinescounter) then a form will be opened showing the no of records selected.

-----------------------------------------------------------------
Another code to get the same result .
void clicked()
{
    int                 recordsCount;
    HcmPosition         hcmPosition1;
    container           con;
    Args                args;
    str                 multiSelectString;
    FormRun             formrun;
    args = new Args();
    // gets the total records selected
    recordsCount = HcmPosition_ds.recordsMarked().lastIndex();

    hcmPosition1= HcmPosition_ds.getFirst(1);

    while(hcmPosition1)
    {
        // storing recid of selected record in container
        con = conIns(con,1, hcmPosition1.RecId);
        // converting container to string with comma separated
        multiSelectString = con2Str(con,',');

        hcmPosition1= HcmPosition_ds.getNext(); // moves to next record
    }
    // passing string
    args.parm(multiSelectString);
    args.name(formstr(CH_RecrutmentForm));
    formRun = classFactory.formRunClass(Args);
    formRun.init();
    formrun.run();
    formrun.wait();
}

public void init()
{
    container con;
    int i;
    str multipleRecords;
    int record;
    super();
    // getting string value from caller
    multipleRecords = element.args().parm();
    // string to container
    con = str2con(multipleRecords,",");

     for(i = 1;i<= conLen(con) ;i++)
    {
           intedit.value(i);    
    }  
}

Tuesday, 26 April 2016

Import Export Model with ax 2012 R3
Models are logical group of elements like tables and classes. In AX 2012 elements can be group and store in the model file. Model files are easy to create, export and import and this can be uninstlled from system when not required.

Export an .axmodel file (Windows PowerShell)

  1. On the Start menu, point to All Programs, point to Administrative Tools, and then click Microsoft Dynamics AX Management Shell.
  2. At the Windows PowerShell command prompt, PS C:\>, type the following command, and then press ENTER.
 EXPORT Command Syntax:
      Export-AXModel –Model <name> -File <Filename.axmodel>
 Example:
    Export-AXModel -Model Ch_File -File C:\Test\Ch_File.axmodel

Import an .axmodel file (Windows PowerShell)

  1. On the Start menu, point to All Programs, point to Administrative Tools, and then click Microsoft Dynamics AX Management Shell.
  2. At the Windows PowerShell command prompt, PS C:\>, type the following command, and then press ENTER.

IMPORT Command Syntax:

Install-AXModel -File <Filename.axmodel> -Details

Example:

Install-AXModel -File C:\Test\Ch_File.axmodel -Details

Create a New Model 
Command Syntax:
New-AXModel -Model TestModel -Layer ISV
Links:

Friday, 22 April 2016

Overview

Number sequences are unique identifiers that can be associated with a master record so that they can be individually distinguished. They can be either formatted as alpha-numeric strings or simply as numbers.
Microsoft Dynamics AX 2012 provides an easy to implement framework to generate custom number sequences.

Scenario

As part of this tutorial, a custom number sequence will be generated for the Customer Groups setup form (Accounts receivable à Setup à Customers à Customer groups)

Steps

  1. First create a new Extended Data Type (EDT). Open AOT àData Dictionary à Extended Data Types
  2. Right Click on Extended Data Types and create a new EDT NumSeqDemoCustGroupNum of type String
  3. Set the properties as shown below

  4. Now go to AOT à Classes and open the NumberSeqModuleCustomer class by right clicking it and selecting View Code

  5. In the loadModule method, add the following code after the last line of code
  6. //customer group number
    //define the EDT
    datatype.parmDatatypeId(extendedTypeNum(NumSeqDemoCustGroupNum));
    //define its default propertiesdatatype.parmReferenceHelp(literalStr(“Unique number for customer group”));datatype.parmWizardIsContinuous(true);datatype.parmWizardIsManual(NoYes::No);datatype.parmWizardIsChangeDownAllowed(NoYes::No);datatype.parmWizardIsChangeUpAllowed(NoYes::No);datatype.parmWizardHighest(999999);datatype.parmSortField(27);
    //define its scope
    datatype.addParameterType(NumberSeqParameterType::DataArea, truefalse);this.create(datatype);

  7. Now, go to AOT à Jobs and create a new job loadNumSeqCustDemo
  8. Write the following code in the job and then run it
    static void loadNumSeqCustDemo(Args _args){
    //define the class variableNumberSeqModuleCustomer seqMod = new NumberSeqModuleCustomer();
    //load the number sequences that were not generatedseqMod.load();}

  9. Now, go to Organization administration à Common à Number sequences à Number sequences
  10. Click on Generate button in the New button group
  11. In the Setup number sequences wizard, Press Next
  12. In the Setup set different values for the number sequence like the format, highest value and lowest value
  13. Click Next
  14. In the last step, Click Finish to generate the number sequences
  15. The number sequence is generated and can be used on the Customer Groups form
  16. Open AOT à Data Dictionary à Tables à CustGroup
  17. Add a new String field and set the properties as follows
  18. Add the newly added field in the Overview field group
  19. Now go to Forms àCustGroup and restore the form. It will add the newly added field in the grid
  20. Write the following code on the Class declaration node
     NumberSeqFormHandler numberSeqFormHandler;

  21. Create a new method on the form and write the following code
    NumberSeqFormHandler numberSeqFormHandler(){
    if (!numberSeqFormHandler){
    //create a reference of number sequence form handler class specifying the         EDT, Data source name and the field of the table
    numberSeqFormHandler =NumberSeqFormHandler::newForm(NumberSeqReference::findReference(extendedtypenum(NumSeqDemoCustGroupNum)).NumberSequenceId, element,CustGroup_DS,fieldnum(CustGroup,CustGroupNumber));}return numberSeqFormHandler;
    }

  22. Override the close method of the form and write the following code
    public void close(){
    if (numberSeqFormHandler)
    {numberSeqFormHandler.formMethodClose();}
    super();}

  23. Override the create method on the CustGroup data source and add the following code
    public void create(boolean _append = false){
    element.numberSeqFormHandler().formMethodDataSourceCreatePre();
    super(_append);
    element.numberSeqFormHandler().formMethodDataSourceCreate(true);}

  24. Override the write method on the CustGroup data source and add the following code
    public void write(){
    super();
    element.numberSeqFormHandler().formMethodDataSourceWrite();}

  25. Override the validateWrite method on the CustGroup data source and add the following code
    public boolean validateWrite(){
    boolean ret;
    ret = super();
    ret = element.numberSeqFormHandler().formMethodDataSourceValidateWrite(ret) && ret;
    return ret;}

  26. Override the delete method on the CustGroup data source and add the following code
    public
    void delete()
    {
    element.numberSeqFormHandler().formMethodDataSourceDelete();
    super();}

  27. Override the linkActive method on the CustGroup data source and add the following code
    public
    void linkActive()
    {
    element.numberSeqFormHandler().formMethodDataSourceLinkActive();
    super();}

  28. Now go to Accounts receivable à Setup à Customers à Customer groups
  29. Create a new record. The number sequence is generated according to the format defined as shown below
 SEPTEMBER 24, 2014

    Saving AX 2009 Morphx Report in PDF Format:


    static void PrinttoPDF(Args _args)
    {
      PurchFormLetter purchFormLetterp;
      PrintJobSettings printJobSettings;
      VendInvoiceJour  vendInvoiceJour;
      PrintFormat PrintFormat;
      Args args = new Args();
      #File

        purchFormLetterp = PurchFormLetter::construct(DocumentStatus::Invoice,false);
        printJobSettings = new PrintJobSettings();
        printJobSettings.setTarget(Printmedium::File);
        //printJobSettings.getPrinter();
       // printJobSettings.deviceName("");
       // printJobSettings.unpackPrinterSettings(PurchFormLetter::getPrinterSettingsFormletter(DocumentStatus::Invoice,PrintSetupOriginalCopy::Original));
       // printJobSettings.preferredTarget(PrintMedium::Printer);
        printJobSettings.format(PrintFormat::PDF);
        printJobSettings.fileName( @'c:\TEMP\myfile2.pdf');
        printJobSettings.warnIfFileExists(false);

        purchFormLetterp.updatePrinterSettingsFormLetter(printJobSettings.packPrintJobSettings());

        select vendInvoiceJour where vendInvoiceJour.Purchid == 'PO/15-16/00443';
        vendInvoiceJour.printJournal(purchFormLetterp);
       // args.record(vendInvoiceJour);
      //  args.caller(purchFormLetterp);

      // new MenuFunction(menuitemoutputstr(Purchinvoicecopy), MenuItemType::Output).run(args);


    }

    Code to get the printout directly from a morphx report 2009:

    //directly to printer
    static void ReporttoPrint(Args _args)
    {
        Args                args;
        ReportRun           rr;
        Report              rb;
        PrintJobSettings    pjs;
        VendInvoicejour     record;
        ;

        select record where record.Purchid == 'PO/15-16/00421';

        args = new Args("Purchinvoice");
        args.record(record);
        args.parmEnum(PrintCopyOriginal::OriginalPrint);

        rr = new ReportRun(args,'');
        rr.suppressReportIsEmptyMessage(true);
        rr.query().interactive(false);

        rb = rr.report();
        rb.interactive(true);

        pjs = rr.printJobSettings();
        pjs.fileName(strfmt(@'c:\TEMP\myfile2.pdf', record.purchid));
        pjs.fitToPage(true);

        pjs.virtualPageHeight(-1);
        pjs.format(PrintFormat::PDF);
        pjs.deviceName('Canon iR2220/iR3320 PCL5e');
        pjs.setTarget(PrintMedium::Printer);
        pjs.viewerType(ReportOutputUserType::PDF);
        pjs.lockDestinationProperties(true);
        rr.prompt();
        rr.init();
        rr.run();


    }

    Tuesday, 8 March 2016

    WCF settings error on new AX 2012 AOS installation

    It is quite common to have a few different instance installed at Development machine. Sometimes developer make a duplicate copy of client's LIVE environment just to test out some hotfix. Below is one of the scenario which cause the error - "The specified client configuration does not contain valid WCF settings".
    Backup an AX 2012 database
    Restore as another database name
    Install a new AOS instance at another machine
    Configure this new AOS to point to the database restored at Step #2
    Start up AOS and login to AX
    The error "The specified client configuration does not contain valid WCF settings" pops up
    Trying to create sales order will throw error (so does a lot of other functionality).

    *During the creation of this new instance, the CIL is not recompile

    To fix this:

    Run a Full CIL generation

    On the AX Client Configuration Utility, update the config using Configure Services

    WCF error in ax2012:
    http://daxdude.blogspot.in/2011/12/error-specified-client-configuration.html

    Thursday, 18 February 2016

    "Error 1069: The service did not start due to a logon failure."



    Error -- Cannot restart AOS, Logon failure , error code 1069

    Resolution/Cause -- Goto --> services.msc --> AXService --> Properties --> Logon tab --> Re-enter the user name and password.
    Since the user with which the AX Service is running has property "password never expires" not checked and  the pwd has been reset, system throws this error. System verifies the user with AD at the time of restarting the service and finds user/pwd combinantion incorrect.



    Windows could not start AX service, AOS crashed, AOCP revision mismatch

    All of us would have faced AX service start/crash issue for one or the other reason. A couple of them has been listed below --

    Error -- at services.msc

    windows could not start the DAX AOS 5.0$01-xyz_ax on local computer.For more information,review the system event log. If this is a non-microsoft service, contact the service vemdor, and refer to service-specific error code 110.
    Log at Event viewer --
    Concurrent number of AOS' for this application exceeds the licensed number
    Resolution/cause -- Get another license for AOS.
    -- This issue comes in a scenario where multiple AOS has to connect to a single instance of DB and Application server (clusterred environment).

    Error--at services.msc

    windows could not start the DAX AOS 5.0$01-xyz_ax on local computer.For more information,review the system event log. If this is a non-microsoft service, contact the service vemdor, and refer to service-specific error code 10.
    log at eventvwr --
    The home directory for Axapta (file://sqldb/AOSFS/Program Files\Microsoft Dynamics AX\50\Application) does not match the required structure or can not be accessed. Please check installation, configuration and access rights.The directory "file://sqldb/AOSFS/Program Files\Microsoft Dynamics AX\50\Application\bin" does not exist or access to it has been denied by the operating system.

    Resolution/cause -- The directory structure should be like --

    "  file://sqldb/Program Files\Microsoft Dynamics AX\50\Application ".
    ------- The mistake I commited was that there was an additional folder structure layer above "Program Files" .

    Error -- Internal aocp revision mismatch

    At event viewer --
    Faulting application Ax32Serv.exe, version 5.0.1500.3761, time stamp 0x4cd58bba, faulting module Ax32Serv.exe, version 5.0.1500.3761, time stamp 0x4cd58bba, exception code 0xc0000005, fault offset 0x00147b3a, process id 0x%9, application start time 0x%10.
    Resolution/cause -- This error is raised due to the mismatch between client the AX server. It happens since the client machine is not patched properly. Ideally the client machine should also get patched with the same pack as AX Server.


    Error -- AOS crash 
    Cause/Resolution -- Due to change in code system was getting stuck in a deadlock and it was first hanged and then getting crashed.
    Sol :: check the code, if there is any code ambiguity, any infinite loop, memory leak, reference mismatch while passing parameter by reference. In such cases system does not throw any specific/detail error so it is difficult to find the issue sometimes.