Thursday, July 4, 2019

Insert Record level security with query value in ax 2012 by code (X++)

static void AXCopyUsergroupRLSBytableWithVlaue(Args _args)
{

    SysRecordLevelSecurity  SysRecordLevelSecurity,insertRLS,copyvalue,updatevalues;
    dialogfield srcdf,destdf;
    dialog dialog;
    userGroupid dest;

    sysQueryRun queryRun;
    Query query = new Query() ;

    QueryRun        rlsqueryRun;
    int             dataSourceNo;
    queryBuildDataSource queryBuildDataSource;
    queryBuildRange queryBuildRange;
    int i;





    ;
    dialog = new dialog("copying user group's Record Level security ");

    destdf = dialog.addField(typeid(userGroupid),"Destination");

    if(dialog.run())
    {
     
        dest = destdf.value();
     
      if( dest !="")
        {
          ttsbegin;
       //insert new table in RLS table to destination user group;       
   
            insertRLS.tabId   = 18174;
            insertRLS.groupId = dest;
            insertRLS.companyId = curext();
            insertRLS.insert();     


          //fetch same query values from another table;

            select * from copyvalue
            where copyvalue.groupId == dest
            && copyvalue.tabId == 624;//example project table

            rlsqueryRun = new QueryRun(copyvalue.Restriction);
            dataSourceNo = rlsqueryRun .query().dataSourceCount();
            queryBuildDataSource          = rlsqueryRun .query().dataSourceNo(dataSourceNo);

               for(i = 1;i <= queryBuildDataSource.rangeCount();i++)
               {
                     queryBuildRange      = queryBuildDataSource.range(i);

                   
               }


          select forupdate  updatevalues  where updatevalues.groupId == dest 
           && updatevalues.tabId == 18174;
            if (updatevalues.Restriction)
            {
                queryRun = new SysQueryRun(updatevalues.Restriction);
            }

            else
            {
                query.addDataSource(updatevalues.TabId);
                queryRun = new SysQueryRun(query);
            }

            queryRun.query().dataSourceTable(updatevalues.tabId).addRange(fieldnum(PAYFDocumentMoveTracking,PROJID)).value(queryBuildRange.value());
            updatevalues.restriction = queryRun.pack();
            updatevalues.doUpdate();

            ttscommit;
            info("User groups RLS has been copied!");
        }
    }
    else
    {
        info("Canceled by user");
    }


}

Tuesday, January 8, 2019

Create weekly periods between two dates











Method:

void GenerateOneYearWeekPeriods()
{
    date d1,d2,d3,d4,wkst,wkend,i,k;
    integer                 lineNum = 0;

    int findlastrecid()
    {

        select * from  FAHWeeklyTimeSheetPeriods order by Recid Desc;
        return FAHWeeklyTimeSheetPeriods.LineNum;


    }






    ;
    d1 = Stratdate.dateValue();
    d2 = Enddate.dateValue();
    lineNum = findlastrecid();


    if(!FAHWeeklyTimeSheetPeriods::exist(d1))
    {
        for(i = d1 ; i <= d2 ; i++)
        {
           if(mthofyr(i) == 1)
           {
               if(dayofwk(i) == 6 || i == d1 )//sat && start of the month
               {
               wkst = i;
               }

               if(dayofwk(i) == 5  || i == endmth(i))//fri && end of the month
               {
               wkend  = i;

                     lineNum++;

                     FAHWeeklyTimeSheetPeriods.LineNum = lineNum;
                     FAHWeeklyTimeSheetPeriods.Weekcode = NumberSeq::newGetNum(ProjParameters::numRefFAHWeekCode(),true).num();
                     FAHWeeklyTimeSheetPeriods.PeriodId = mthofyr(i);
                     FAHWeeklyTimeSheetPeriods.Month = global::dateStartMth(i);
                     FAHWeeklyTimeSheetPeriods.Year  = year(FAHWeeklyTimeSheetPeriods.Month);

                     FAHWeeklyTimeSheetPeriods.StratDate = wkst;
                     FAHWeeklyTimeSheetPeriods.StratDay = dayName(dayofwk(wkst));
                     FAHWeeklyTimeSheetPeriods.EndDate  = wkend;
                     FAHWeeklyTimeSheetPeriods.EndDay   = dayName(dayofwk(wkend));
                     FAHWeeklyTimeSheetPeriods.Status  = WeekPeriodStatus::open;
                     FAHWeeklyTimeSheetPeriods.insert();
               }
            }

            if(mthofyr(k) != mthofyr(i))
            {
             d3 = i ; d4 = endmth(i);

               for( k = d3 ; k <= d4; k++)
               {
                   if(dayofwk(k) == 6 || k == d3 )//sat && start of the month
                   {
                   wkst = k;
                   }

                   if(dayofwk(k) == 5  || k == d4 )//fri && end of the month
                   {
                   wkend  = k;

                     lineNum++;

                     FAHWeeklyTimeSheetPeriods.LineNum = lineNum;
                     FAHWeeklyTimeSheetPeriods.Weekcode = NumberSeq::newGetNum(ProjParameters::numRefFAHWeekCode(),true).num();
                     FAHWeeklyTimeSheetPeriods.PeriodId = mthofyr(i);
                     FAHWeeklyTimeSheetPeriods.Month = global::dateStartMth(i);
                     FAHWeeklyTimeSheetPeriods.Year  = year(FAHWeeklyTimeSheetPeriods.Month);
                     FAHWeeklyTimeSheetPeriods.StratDate = wkst;
                     FAHWeeklyTimeSheetPeriods.StratDay = dayName(dayofwk(wkst));
                     FAHWeeklyTimeSheetPeriods.EndDate  = wkend;
                     FAHWeeklyTimeSheetPeriods.EndDay   = dayName(dayofwk(wkend));
                     FAHWeeklyTimeSheetPeriods.Status  = WeekPeriodStatus::open;
                     FAHWeeklyTimeSheetPeriods.insert();
                   }
               }
              k = i ;
            }
        }
      }

    FAHWeeklyTimeSheetPeriods_ds.executeQuery();

}






Workflow Mass Reassign users

static void AXworkflowMassReassign(Args _args)
{
    userid src,dest;
    name comment;
    WorkflowWorkItemSubject subject;
    WorkflowConfigurationName confignme;
    WorkflowSequenceNumberActive congifId;
    dialogfield srcdf,destdf,comtdf,subjectDf,congifIdDf,confignamedf;
    dialog dialog;
    WorkflowWorkItemTable workitems;
    WorkflowTrackingStatusTable WorkflowTrackingStatusTable;

    WorkflowConfigurationTable WorkflowConfigurationTable;
    boolean isFieldModified;





    int i;
    ;
    dialog = new dialog("Mass Re-assign workflow ");
    srcdf = dialog.addField(typeid(userid),"Source");
    destdf = dialog.addField(typeid(userid),"Destination");
    comtdf = dialog.addField(typeid(name),"Comments");
    congifIdDf = dialog.addField(typeid(WorkflowSequenceNumberActive),"Configuration Id");
   // confignamedf = dialog.addFieldValue(typeid(name),"","Configuration name");
    subjectDf = dialog.addField(typeid(WorkflowWorkItemSubject),"Subject");
    comtdf.displayLength(50);
  //  confignamedf.allowEdit(false);




     if(dialog.run())
    {
        src = srcdf.value();
        dest = destdf.value();
        comment =comtdf.value();
        congifId = congifIdDf.value();
        subject = subjectdf.value();
        WorkflowConfigurationTable = WorkflowConfigurationTable::findSequenceNumber(congifId,false);

        if(src!="" && dest !="")
        {

            if(subject == "" && congifId == "" )
            {
            while select workitems where workitems.Status == WorkflowWorkItemStatus::Pending
            && workitems.UserId == src

                {
                    WorkflowWorkItem::delegateWorkItem(workitems.Id, dest, comment);
                    i++;
                }
            }


            if(congifId != "" && subject == "")
            {
              while select workitems where
              workitems.Status == WorkflowWorkItemStatus::Pending &&
               workitems.UserId == src
              && workitems.ConfigurationId == WorkflowConfigurationTable.ConfigurationId
                {
                    WorkflowWorkItem::delegateWorkItem(workitems.Id, dest, comment);
                    i++;
                }
            }




            if(subject != "" && congifId == "" )
            {
                while select workitems where workitems.Status == WorkflowWorkItemStatus::Pending && workitems.UserId == src
                 && workitems.subject == subject
                {
                    WorkflowWorkItem::delegateWorkItem(workitems.Id, dest, comment);
                    i++;
                }
             }



            info(strFmt("Pending workflow workitems  re-assigned: %1",i));
        }
    }
    else
    {
        info("Canceled by user");
    }


}

Progress bar for lengthy operation on data source execute query in ax



Write this following method any on class:

Public static client SysOperationProgress showWaitDialog(str _text = "Extracting record for you, please wait...")
{
    #AviFiles
    SysOperationProgress waitDialog;

    waitDialog = new SysOperationProgress(1, true, strLen(_text));

    waitDialog.setCaption("Processing...");
  //  waitDialog.setTotal(100);
    waitDialog.setCount(1);
    waitDialog.setAnimation(#AviStopWatch);
    waitDialog.setText(_text);

    return waitDialog;
}



Call from datasource executequery() method:

public void executeQuery()
{
   SysOperationProgress waitdialog;
   ;
   waitdialog = global::showWaitDialog();  // startLengthyOperation();
   super();
   waitdialog.hide();  //  endLengthyOperation();
}

Tuesday, May 24, 2016

Copy Usergroup Record level security By table

static void AXCopyUsergroupRLSBytable(Args _args)
{
    SysRecordLevelSecurity  SysRecordLevelSecurity,insertRLS;
    dialogfield srcdf,destdf;
    dialog dialog;
    userGroupid src,dest;
    ;
    dialog = new dialog("copying user group's Record Level security ");
    srcdf = dialog.addField(typeid(userGroupid),"Source");
    destdf = dialog.addField(typeid(userGroupid),"Destination");

     if(dialog.run())
    {
        src = srcdf.value();
        dest = destdf.value();
        if(src!="" && dest !="")
        {
          ttsbegin;
          info("Copying RLS to destination user group");
            select * from SysRecordLevelSecurity
            where SysRecordLevelSecurity.groupId == src
            && SysRecordLevelSecurity.tabId == 40017;//PAYFGOSIItemCodeInfo table id
            {

            insertRLS.data(SysRecordLevelSecurity);
            insertRLS.groupId = dest;

            insertRLS.insert();

            }
             ttscommit;
            info("User groups RLS has been copied!");
        }
     }
     else
    {
        info("Canceled by user");
    }



}

Sunday, May 15, 2016

Replace Assigned workflow user In AX 2009 without changing Configuration Id

static void AXReplaceAssignedworkflowuser(Args _args)
{
    userid src,dest;
    dialogfield srcdf,destdf;
    dialog dialog;
    WorkflowStepTable   WorkflowStepTable;
    container               con;

    ;
    dialog = new dialog("Replace workflow assigned Approval user");
    srcdf = dialog.addField(typeid(userid),"Source");
    destdf = dialog.addField(typeid(userid),"Destination");
    if(dialog.run())
    {
        src = srcdf.value();
        dest = destdf.value();
        if(src!="" && dest !="")
        {
        ttsbegin;
        while select forupdate WorkflowStepTable
        {
             con = WorkflowStepTable.AssignTo;
             if(conpeek(con,4) == src)
             {
                info(strfmt("Before update userid  %1 ",conpeek(con,4)));

                con = conpoke(con,4,dest);

                WorkflowStepTable.AssignTo = con;
                WorkflowStepTable.doUpdate();


                info(strfmt("after update userid  %1 ",conpeek(con,4)));
             }
        }
         info("Workflow approval user has been replaced !.");
        ttscommit;
        }
    }
    else
    {
        info("Canceled by user");
    }


}

Thursday, May 5, 2016

Send mail alert to user group lists in HTML format using AX

void sendmailtousers()
{
    SysMailer                           mail ;
    SysEmailParameters                  parameters ;
    userGroupList                       userGroupListTO,userGroupListBCC;
    BatchJob                            batchJob;
    SysCompanyUserInfo                  sysCompanyUserInfo;

    projtable                           projtable;

    InteropPermission                   permission = new InteropPermission(InteropKind::ClrInterop);
    emplid                              emplid ;
    date                                scheduledate,dueenddate;
    str                                 header,mainbody,footer;
    PAYFPrintPayrollBankFile                   PAYFPrintPayrollBankFile;
    Counter                             linenum;

    System.Net.Mail.MailMessage             mailMessage;
    System.Net.Mail.SmtpClient              smtpClient;
    System.Net.Mail.MailAddress             mailAddressFrom;
    System.Net.Mail.MailAddress             mailAddressTo;

    str                                     strBody;
    str                                     strSMTPServer;
    str                                     strFileName,email;
    FileIOPermission                        perm;

    projid projid;



    str sender,mailAddressTos;

      void htmlbody()
      {
       date subdate;
       str comp,event;
       ;
       header = "" ;
       mainbody = "";
       footer = "";

       comp    = "Company AND SON'S LTD.";
       event   = "PAYROLL ALERTS";


       header = strfmt("<p><strong><font color=#003399 face=Tahoma>PAYROLL  REPORTS </font></strong> </p></br>"+
          "<TABLE cellSpacing=0 cellPadding=1 width='100%' border=3>"+
       "<tr bgColor=gray> "+
       "<td align=center><font  size=2 face=Tahoma>الرقم التسلسلي</td>"+//sn
       "<td align=center><font  size=2 face=Tahoma>الرقم العام</td>"+//emplid
       "<td align=center><font  size=2 face=Tahoma>‏‏الاسم</td>"+//name
       "<td align=center><font  size=2 face=Tahoma>الجنسية</td>"+//Nationality
       "<td align=center><font  size=2 face=Tahoma>العنوان</td>"+ //title
       "<td align=center><font  size=2 face=Tahoma>المشروع</td>"+//project
       "<td align=center><font  size=2 face=Tahoma>المنطقة</td>"+//region
       "<td align=center><font  size=2 face=Tahoma>الشهر</td>"+//Month
       "<td align=center><font  size=2 face=Tahoma>‏‏الحالة</td>"+//status
       "</tr>");

       while select PAYFPrintPayrollBankFile order by PAYFPrintPayrollBankFile.Dimension[2] ,PAYFPrintPayrollBankFile.EmplId where
       PAYFPrintPayrollBankFile.TransferStatus == BankFileTransferStaus::NotTransfer
      //  && PAYFPrintPayrollBankFile.PAYFPeriodNumber == "PERD000005035"
       {
            linenum++;

            if(linenum != 1 && projid != PAYFPrintPayrollBankFile.Dimension[2])
            {
            mainbody  += strfmt("<tr bgColor=gray> <td  height=10 colspan=9> "+" " +"</td></tr>" );
            }

            mainbody  += strfmt("<TR ALIGN='CENTER'>"+
            "<TD><font color=#003399 size=2 face=Tahoma>" +  num2str(linenum,3,0,0,0) + "</TD>"+
            "<TD><font color=#003399 size=2 face=Tahoma>" +  PAYFPrintPayrollBankFile.EmplId + "</TD>"+
            "<TD><font color=#003399 size=2 face=Tahoma>" +  PAYFPrintPayrollBankFile.name()+"</TD>"+
            "<TD><font color=#003399 size=2 face=Tahoma>" +  PAYFPrintPayrollBankFile.addressCountryRegionNationality()+ "</TD>"+
            "<TD><font color=#003399 size=2 face=Tahoma>" +  PAYFPrintPayrollBankFile.titleDescdription()+"</TD>"+

            "<TD><font color=#003399 size=2 face=Tahoma>" +  PAYFPrintPayrollBankFile.DescDim2()+ "</TD>"+
            "<TD><font color=#003399 size=2 face=Tahoma>" +  PAYFPrintPayrollBankFile.DescDim3()+"</TD>"+
            "<TD><font color=#003399 size=2 face=Tahoma>" +  date2str(PAYFCalculationPeriods::find(PAYFPrintPayrollBankFile.PAYFPeriodNumber,false).PAYFPeriodStartDate,123,0,4,2,4,4) +"</TD>"+
            "<TD><font color=#003399 size=2 face=Tahoma>" +  enum2str(PAYFPrintPayrollBankFile.TransferStatus) +"</TD>"+
            "</TR>" );

            projid = PAYFPrintPayrollBankFile.Dimension[2];
       }

       footer = strfmt( "</TABLE></br><font color=#cccccc size=2 face=Tahoma><p>_______________________________________________________________________ </p>"+
       "</font><b><font color=#003399 face=Tahoma><p>Alert details<font color=#003399 size=2 face=Tahoma></font></p>"+
       "</font></b><font color=#003399 size=2 face=Tahoma></font><font color=#cccccc size=2><p>"+
       "<table border= 5 cellSpacing=1 cellPadding=3>"+
       "<tbody>"+
       "<tr> <td><p align=left><b><font  size=2 face=Tahoma>Date:</font></p></td> <td><p><font face=Tahoma><font color=#003399 size=2>"+date2str(today(),123,2,4,3,4,4)+"</font></font></p></td></tr>"+
       "<tr> <td><p align=left><b><font size=2><font  face=Tahoma>Company:</font></font></p></td><td><font face=Tahoma><font color=#003399><font size=2> "+comp+" </font> </font></font></td></tr>"+
       "<tr> <td><font face=Tahoma><b><font size=2 face=Tahoma>Event:</font></font></td><td><font face=Tahoma><font color=#003399 size=2 face=Tahoma>"+event+"</font></font></td></tr>"+
       "</tbody> </table>") ;
     }

     void sendmail(str to)
     {
         mailMessage = new System.Net.Mail.MailMessage("ax.alertsender@alfahhad.com.sa",to);
         mailmessage.set_Subject(strfmt("PAYROLL BANKFILE NOT TRANSFER ALERTS"));
         strBody =header+mainbody+footer;
         mailmessage.set_IsBodyHtml(true);
         mailmessage.set_Body(strBody);
         smtpClient.Send(mailmessage);
     }

    ;
     permission.assert();

     parameters      = SysEmailParameters::find();
     mailAddressFrom = new  System.Net.Mail.MailAddress("ax.alertsender@alfahhad.com.sa","@FAH878");
     strSMTPServer   = parameters.SMTPRelayServerName;
     sender          = "ax.alertsender@alfahhad.com.sa";
     smtpClient      = new System.Net.Mail.SmtpClient(strSMTPServer);

     select * from BatchJob where BatchJob.Caption == "Bankfilealerts";

     htmlbody();

        /* Send Emails to user*/

       if(linenum != 0)
       {
        while
        select userGroupListTO
        where userGroupListTO.GroupId == "Bnkfilalrt"
        {
               Email = "";
               Email =SysUserInfo::find(userGroupListTO.UserId).Email;
               sendmail(Email);
        }
       }
}

Download .xpo file

https://drive.google.com/file/d/0ByF76Avzw0r1TnlJUW9ZWm5WYkk/view?usp=sharing

Sending Email using X++ Code in D365 F&O/ AX 7 in HTML fomat

  I was just researching on the emailing capabilities in D365 and found that SysINetMail, SysMailer and some of the smmOutlook classes are d...