Sýnir færslur með efnisorðinu Dynamics AX 2009. Sýna allar færslur
Sýnir færslur með efnisorðinu Dynamics AX 2009. Sýna allar færslur

föstudagur, 14. október 2011

CLR error when deleting email attachment file


User was prompted with CLR error when sending PDF email.
The email attachment file could not be deleted after the email was sent.  The file was locked as the mailMessage.Dispose() command was missing.

    //move attachment file to Temp folder
    System.IO.File::Move(p1.fileName(), fileNameforEmail);

    attachementCollection   = mailMessage.get_Attachments();
    attachment              = new System.Net.Mail.Attachment(fileNameforEmail);
    attachementCollection.Add(attachment);

    smtpClient                  = new System.Net.Mail.SmtpClient(smtpServer);
    smtpClient.Send(mailmessage);

    mailMessage.Dispose();

    System.IO.File::Delete(fileNameforEmail);

    CodeAccessPermission::revertAssert();

Dynamics AX batch, permission rights

Dynamics AX 2009 - file and email right permissions in batch job.  Files to be read, written and deleted.  Email to be sent.

First step was to give the AOS service user rights to the file folder to be written.

As these were multiple files, permission sets were used.

void importFromWorkstation(MPSWorkstation _tWorkstation)
{
    int               iNumberOfFiles;
    FileName          sFileName,fileNamePerm, inFile;
    InteropPermission interopPerm;
    Set               permissionSet, permSetFiles;
    System.Array      files;
    int               i, j;
    container         fList;
    #File
    ;

    permissionSet = new Set(Types::Class);
    permissionSet.add(new InterOpPermission(InteropKind::ClrInterop));

    CodeAccessPermission::assertMultiple(permissionSet);

    files = System.IO.Directory::GetFiles(_tWorkstation.InDir, "*.ut");
    for( i=0; i<ClrInterop::getAnyTypeForObject(files.get_Length()); i++ )
    {
         fList = conins(fList, conlen(fList)+1, ClrInterop::getAnyTypeForObject(files.GetValue(i)));
     }

    CodeAccessPermission::revertAssert();

    permSetfiles = new Set(Types::Class);

    for(j=1;j<=conlen(fList); j++)
    {
        sFileName = conpeek(fList, j);

        //Read files
        permSetFiles.add(new FileIOPermission(sFileName, #IO_Read));


        //Written files
        fileNamePerm = strrem(sFileName, _tWorkstation.InDir) + 'ut';
        fileNamePerm = _tWorkstation.MarelOut + 'po'+ fileNamePerm;
        permSetFiles.add(new FileIOPermission(fileNamePerm, #io_Write));

        fileNamePerm = strrem(sFileName, _tWorkstation.InDir) + 'ut';
        fileNamePerm = _tWorkstation.MarelOut + 'dilkur' + fileNamePerm;
        permSetFiles.add(new FileIOPermission(fileNamePerm, #io_Write));
    }

    //Email
    permSetFiles.add(new InteropPermission(InteropKind::ComInterop));


    // Sys.Io.File.Delete below
    permSetFiles.add(new InteropPermission(InteropKind::ClrInterop));

    CodeAccessPermission::assertMultiple(permSetFiles);

    for(j=1;j<=conlen(fList); j++)
     {
         sFileName = conpeek(fList, j);
         inFile = sFileName;
         sFileName = strrem(sFileName, _tWorkstation.InDir) + 'ut';


         ttsbegin;

         this.parseFileForMarelPO(sFileName, _tWorkstation);
         this.parseFile(sFileName, _tWorkstation);

         System.IO.File::Delete(inFile);

         ttscommit;
     }
    CodeAccessPermission::revertAssert();
}

miðvikudagur, 12. október 2011

Dynamic range in query for AOS batch report

Had to run a daily report in batch, with data from the day before.

Solved by creating a function in SysQueryRangeUtil, currentSessionYesterdayDate() returning SystemDateGet() - 1.

This function was then entered into the report's range: (currentSessionYesterdayDate())