Skip to main content

How to send Emails to users in batch processing by using X++ code in Ax2009



Create the class with below methods
public class OnhandQty extends RunBaseBatch
{
     SysMailer   mailer;
     boolean check;
     SysEmailParameters parameters;
    #define.CurrentVersion(1)
    #localmacro.CurrentList
    //onhandQty
   // methodVariable2
    #endmacro
}

public static void main(Args args)
{
    OnhandQty onhandQty;
    ;
    onhandQty = new OnhandQty();
    onhandQty.run();
}

void run()
{
    this.WriteCSV();
    if(check == true)
    {
        this.EmailCheck();
    }
}
// This method is used to bring the data and Save it into CSV file

void WriteCSV()
{
    Commaio file;
    container line,line1;
    FileIOPermission   permission;
    InventTable inventTable;
    MinimumQty  minimumQty;
   // #define.filename("C:\\Report\\On-Hand.csv")
    #File

    ;
    check = false;
    permission = new FileIOPermission(#filename,#io_write);
    permission.assert();
    file = new Commaio(#filename , #io_write);
    file = new Commaio(#filename , 'W');
if( !file || file.status() != IO_Status::Ok)
{
throw error("File Cannot be opened");
}
line1 = ["Item Id","Description","On Hand","Min-ReOrder Qty"];
file.writeExp(line1);
while select minimumQty
{
if(minimumQty.MinQty  > minimumQty.Onhand && minimumQty.MinQty !=0)
{

line = [minimumQty.ItemID,InventTable::find(minimumQty.ItemID).ItemName
,minimumQty.Onhand,minimumQty.MinQty];
file.writeExp(line);
check = true;
}

}

}
// By using this method we can send this CSV file to users in the List..

void EmailCheck()
{
//Set                     permissionSet2 = new Set(Types::Class);
InteropPermission permission = new InteropPermission(InteropKind::ComInterop);

;

CodeAccessPermission::revertAssert();
// permissionSet2.add(new InteropPermission(InteropKind::ClrInterop));
// permission = new InteropPermission(InteropKind::ComInterop);
// permissionSet2.add(new FileIOPermission(_attachmentFilename, 'r'));

permission.assert();
mailer = new SysMailer();
parameters = SysEmailParameters::find();

if (parameters.SMTPRelayServerName)
{
mailer.SMTPRelayServer(parameters.SMTPRelayServerName,
parameters.SMTPPortNumber,
parameters.SMTPUserName,
SysEmailParameters::password(),
parameters.NTLM);
}
else
{
mailer.SMTPRelayServer(parameters.SMTPServerIPAddress,
parameters.SMTPPortNumber,
parameters.SMTPUserName,
SysEmailParameters::password(),
parameters.NTLM);
}

mailer.fromAddress('ABC@XYZ.com,');
mailer.tos().appendAddress('xyx@abc.com’);
mailer.tos().appendAddress('abc@abc.com);

mailer.htmlBody('Find the attachment and update the on hand quantiy. <Br>\n NOTE:This is a System                            Generated Email. Please do not Reply.');
mailer.subject('Inventory On Hand Status');
//mailer.attachments().add("C:\\Report\\On-Hand.csv");
CodeAccessPermission::revertAssert();
}

// Save the values

public container pack()
{
    return [#CurrentVersion];
}

// Retrieve those values

public boolean unpack(container packedClass)
{
Version version = RunBase::getVersion(packedClass);
switch (version)
{
case #CurrentVersion:
[version] = packedClass;
break;
default:
return false;
}
return true;
}

You Know friends here one more issue is there, in this process we need to assign the email ids for the users manually, but that is not the correct process for technical peoples.

Avoid those process, create one form like parameter form there users can add /remove the email id. System will automatically take the ids from that form and emails every day.


After completing above process we need to configure the batch in Batch server.

Go to ->Administration Module->set Up->Batch Group
Here we need to select the batch  server

Over view tab


Batch Server Tab




















Administration -> set Up -> Server configuration->
Here we need to select the server for sending mails to users..





















Next Basic Module-> Common Forms-> Batch Job List
























Create the new job with description and go to View Task->















Select the class what we wrote for sending Emails to users , choose the class and save it .
Go to Functions ->change status->  change the status to waiting






















Final Step is Go to Recurrences -> Here we can give the timings based on the time give below.

Thanks
DAX..


Comments

Post a Comment

Popular posts from this blog

Using File path on a form getting Error in Axapta

Hi Folks, After a long time am coming  back to posting few new things here for AX Developer... When we want to select the file path in form level. Normally what we will do create one EDT and extends with filepath (EDT), but that time when you are trying to select the path we will get error like stack-trace/Error message .Don’t worry there is no problem with your ax application. Simple we need to provide the method to the form like filepathLookUpTitle (). Below method we need to add it into form level methods, i.e. str filePathLookupTitle() {     return "Select document folder"; } Thanks Happy Daxing....

How to add Filter functionality to Display method in dynamics AXAPTA

Hi Friends, Normally filters will work only in table fields but we can't do filters to display method. This below code will work for filters to display method also. Step 1: Go to the form design right click on particular control properties Auto Declaration No to Yes. Step 2: Override the context() method on the display method  . public void context() {     int             selectedMenu;     formrun         fr;     Args            ag;     Name            strtext;     querybuilddataSource qb1;     queryrun    qr;     query       q;     PopupMenu menu = new PopupMenu(element.hWnd());     int a = menu.insertItem('Filter By Field');     int b = menu.insertItem('Filter By Selection');     i...

Split string useing List in AX2009

static void Job277(Args _args) {     List _list = new List(Types::String);     Container packedList;     ListIterator iterator;     str cade = "Jhon*,smt*,and*,caro*";     ;     _list = Global::strSplit(cade,",");     iterator = new ListIterator(_list);     while(iterator.more())     {         packedList += iterator.value();         iterator.next();     }     info(conpeek(packedList,2));     info(strfmt("%1",conlen(packedList)));   }