4 Nisan 2014 Cuma

AX 2012 - Generate RDP (Report Data Provider)

Data Provider class:


------------Class Declaration-------------------
[SRSReportParameterAttribute(classStr(myCustInvoicePrintContract))]
class myCustInvoicePrintDP extends SRSReportDataProviderbase
{
    CustInvoicePrintTMP      InvoicePrint;
    CustInvoicePrintTransTMP InvoicePrintTrans;
    CustInvoicePrintTaxTMP   InvoicePrintTax;
    CustInvoicePrintFootTMP  InvoicePrintFoot;

    RecId                       RecId;
}

-----------------Table methods for SSRS---------------------------
[SRSReportDataSetAttribute(tableStr(CustInvoicePrintTMP))]
public CustInvoicePrintTMP getCustInvoicePrint()
{
    select * from InvoicePrint;
    return InvoicePrint;
}

[SRSReportDataSetAttribute(tableStr(CustInvoicePrintTransTMP))]
public CustInvoicePrintTransTMP getCustInvoicePrintTrans()
{
    select * from InvoicePrintTrans;
    return InvoicePrintTrans;
}

------------------GetParameter method--------------------------------
private void getReportParameters()
{
    myCustInvoicePrintContract Contract = this.parmDataContract();

    if (Contract)
    {
        RecId   = Contract.parmRecordId();
    }
}


------------------- processReport method where data filled--------
[SysEntryPointAttribute(false)]
public void processReport()
{
    CustInvoiceJour         InvoiceJour;
    CustInvoiceTrans        InvoiceTrans;
    TaxTrans                taxTrans;
    TaxOnItem               taxOnItem;
    TaxGroupData            taxGroupData;
    AmountMST               Tax;
    this.getReportParameters();

    InvoiceJour = CustInvoiceJour::findRecId(RecId);
    InvoicePrint.InvoiceDate    = InvoiceJour.InvoiceDate;
    InvoicePrint.InvoiceName    = InvoiceJour.invoiceName();
    InvoicePrint.TaxOfficeName_TR   = CustTable::find(InvoiceJour.InvoiceAccount).TaxOfficeName_TR;
    ...
    InvoicePrint.insert();
    while select InvoiceTrans where
        InvoiceTrans.SalesId == InvoiceJour.SalesId && InvoiceTrans.InvoiceId == InvoiceJour.InvoiceId &&
        InvoiceTrans.InvoiceDate == InvoiceJour.InvoiceDate && InvoiceTrans.numberSequenceGroup == InvoiceJour.numberSequenceGroup
    {
        select taxOnItem
                where taxOnItem.TaxItemGroup == InvoiceTrans.TaxItemGroup
            join taxGroupData
                where taxGroupData.TaxCode == taxOnItem.TaxCode &&
                      taxGroupData.TaxGroup == InvoiceTrans.TaxGroup;
        InvoicePrintTrans.TaxValue          = TaxData::find(TaxOnItem.TaxCode, InvoiceTrans.InvoiceDate, 0).TaxValue;
        InvoicePrintTrans.Qty               = InvoiceTrans.Qty;
        ...
        InvoicePrintTrans.insert();
        Tax = Tax::calcTaxAmount(InvoiceTrans.TaxGroup,taxOnItem.TaxItemGroup,InvoiceTrans.InvoiceDate,
                InvoiceTrans.CurrencyCode,InvoiceTrans.LineAmount,TaxModuleType::Sales);
        ...
            InvoicePrintTax.insert();
        }
    }
    ...
}


Controller class:

--------------Class Declaration------------------
class myCustInvoicePrintController extends SrsReportRunController
{
    #define.ReportName('CustInvoicePrint.Report')
    myCustInvoicePrintContract    contract;
    CustInvoiceJour           custInvoiceJour;
}

Get parameter
protected void prePromptModifyContract()
{
    if (this.parmArgs()             &&
        this.parmArgs().record()    &&
        this.parmArgs().dataset() == tableNum(CustInvoiceJour))
    {
        custInvoiceJour = this.parmArgs().record();
    }

    if (!Contract)
    {
        Contract = this.parmReportContract().parmRdpContract();
    }

    contract.parmRecordId(custInvoiceJour.RecId);

    super();
}

public static myCustInvoicePrintController construct(Args _args)
{
    myCustInvoicePrintController controller = new myCustInvoicePrintController();
    controller.parmArgs(_args);
    return controller;
}

public static void main(Args _args)
{
    SysLastValue    SysLastValue;
    myCustInvoicePrintController controller = new myCustInvoicePrintController();
    controller.parmReportName(#ReportName);
    controller.parmArgs(_args);

    if(CSReportPrint::find(SysUserInfo::find().RecId,CSReportType::Invoice1).PrinterName)
    {
        controller.parmReportContract().parmPrintSettings().printMediumType(SRSPrintMediumType::Printer);
        controller.parmReportContract().parmPrintSettings().printerName(CSReportPrint::find(SysUserInfo::find().RecId,CSReportType::Invoice1).PrinterName);
    }
    controller.parmShowDialog(false); //don't show dialog at screen
    controller.startOperation();
}



Contract class:
---------------class declaration---------------------------

[DataContractAttribute]
class myCustInvoicePrintContract
{
    RecId recordId;
}
Get parameter
[DataMemberAttribute('RecordId')]
public recId parmRecordId(recId _recordId = recordId)
{
   recordId = _recordId;
   return recordId;
}

10 Mart 2014 Pazartesi

AXAPTA - Find VAT rate and amount at document lines

while select InvoiceTrans where
        InvoiceTrans.SalesId == InvoiceJour.SalesId && InvoiceTrans.InvoiceId == InvoiceJour.InvoiceId &&
        InvoiceTrans.InvoiceDate == InvoiceJour.InvoiceDate && InvoiceTrans.numberSequenceGroup == InvoiceJour.numberSequenceGroup
    {
        InvoicePrintTrans.Name  = InvoiceTrans.Name;
        select taxOnItem
                where taxOnItem.TaxItemGroup == InvoiceTrans.TaxItemGroup
            join taxGroupData
                where taxGroupData.TaxCode == taxOnItem.TaxCode &&
                      taxGroupData.TaxGroup == InvoiceTrans.TaxGroup;
        TaxValue  = TaxData::find(TaxOnItem.TaxCode, InvoiceTrans.InvoiceDate, 0).TaxValue;
Tax = Tax::calcTaxAmount(InvoiceTrans.TaxGroup,taxOnItem.TaxItemGroup,InvoiceTrans.InvoiceDate,
                InvoiceTrans.CurrencyCode,InvoiceTrans.LineAmount,TaxModuleType::Sales);

        info(strFmt("VAT rate %1 VAT amount",TaxValue,Tax));
    }

26 Şubat 2014 Çarşamba

AXAPTA - Call a class extended from another with name string

There are three ways:

1- classFactory.createClass(className2Id('MyClass'))

2- test1  test;
    DictClass d;

    d = new DictClass(className2Id("test1"));
    test = d.makeObject(222);
    test.MyTest();

3. Just for AX 2012 için extension framework . I'll look up this later.


4 Şubat 2014 Salı

AX 2012 - Company logo

mylogo = FormLetter::companyLogo();

AX 2012 - Test RDP class at Axapta side

How do you test your RDP classes developed for SSRS reports at AX side?

DGHCreditDetailsDP  dp = new DGHCreditDetailsDP();
DGHCreditDetailsDC  dc = new DGHCreditDetailsDC();

Query q;

dc.parmTransDate(str2Date("28.12.2013",123));

q = dp.parmQuery();

         q.dataSourceTable(tableNum(BankAccountTrans)).addRange(Fieldnum(BankAccountTrans,accountid)).value("102 02 034 002");

dp.parmDataContract(dc);
dp.processReport();

6 Ocak 2014 Pazartesi

AX 2012 - Create SSRS report PDF output

I got help from Martin Drab's blog for create PDF with AX 2012:

void CreatePDF(Str60 _Subject,Notes _Body)
{
MYReportPurchController          controller;
MYReportPurchContract            rdpContract = new MyReportPurchContract();
SRSPrintDestinationSettings settings;
Args                        args = new args();
str                         fileName;

args.record(this);
controller = MYReportPurchController::construct(args);
// Define report and report design to use
controller.parmReportName(ssrsReportStr(EtgPurchOrderForm,PrecisionDesign1));
// Use execution mode appropriate to your situation
controller.parmExecutionMode(SysOperationExecutionMode::Synchronous);
// Suppress report dialog

// Explicitly provide all required parameters
controller.parmReportContract().parmRdpContract(rdpContract);
    //rdpContract.
// Change print settings as needed
settings = controller.parmReportContract().parmPrintSettings();
settings.overwriteFile(true);
settings.printMediumType(SRSPrintMediumType::File);
settings.fileFormat(SRSReportFileFormat::PDF);
//settings.

    #WinAPI

  fileName = WinApi::getTempPath() +this.PurchOrderDocNum+".PDF";
settings.fileName(fileName);
// Execute the report
    controller.parmShowDialog(false);
    controller.startOperation();
}


Or send selected records to PDF by RDP report:
 
SMAServiceOrderTable        serviceOrder;
    MultiSelectionHelper        helper;
    FormRun                     caller = _args.caller();
    FormDataSource              SMAServiceOrderTable_DS;
    SRSPrintDestinationSettings settings;
    ETGServiceReportContract    contract = new ETGServiceReportContract();
    SrsReportRunController      controller;
    Filename                    fileName;
    int                         counter;
    SysMailer                   mailer = new SysMailer();
    SysEmailParameters          parameters = SysEmailParameters::find();
    Dialog                      dialog;
    DialogField                 field;
    Email                       email;

    dialog = new Dialog("Servis Raporu Gönderme");
    field = dialog.addField(ExtendedTypeStr(email));
    dialog.run();

    if (!dialog.closedOK())
        return;
    email = field.value();
    if (email == "")
        throw error("Bir mail adresi girmelisiniz!..");

    SMAServiceOrderTable_DS = caller.dataSource();
    helper = MultiSelectionHelper::createFromCaller(caller);
    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('noreply@sinbo.com.tr');
    mailer.tos().appendAddress(email);
    mailer.htmlBody('<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-9">Sayın Yetkili,<br><br> Servis raporu kopyanız ektedir.<br><br>Saygılarımızla,<br><br><br>Sinbo');
    mailer.subject('Sinbo Servis Raporu');
    mailer.bodyCharSet("Windows-1254");

    helper.createQueryRanges(SMAServiceOrderTable_DS.queryBuildDataSource(),fieldStr(SMAServiceOrderTable,RecId));
    serviceOrder = helper.getFirst();

    while(serviceOrder)
    {
        controller = new SrsReportRunController();
        controller.parmReportName(ssrsReportStr(ETGServiceReport, Report));
        contract = controller.parmReportContract().parmRdpContract();
        controller.parmReportContract().parmPrintSettings().printMediumType(SRSPrintMediumType::Screen);
        controller.parmShowDialog(false);
        contract.parmServiceOrderId(serviceOrder.ServiceOrderId);

        counter++;
        fileName = WinApi::getTempPath() + strFmt("Servis Raporu %1.PDF",counter);
        
        settings = controller.parmReportContract().parmPrintSettings();
        settings.overwriteFile(true);
        settings.printMediumType(SRSPrintMediumType::File);
        settings.fileFormat(SRSReportFileFormat::PDF);
        settings.fileName(fileName);
        
        controller.startOperation();
        mailer.attachments().add(fileName);
        serviceOrder = helper.getNext();
    }
    if (counter == 0)
        return;
    infolog.clear();



    mailer.sendMail();

AXAPTA - Send email

private void SendMail2(str _FileName,Str60 _Subject,Notes _Body)
{

   str Toaddress;
   System.Net.Mail.MailMessage Msg =  new System.Net.Mail.MailMessage();
   System.Net.Mail.MailAddress fromMail;
   System.Net.Mail.MailAddressCollection toadrr;
   System.Net.Mail.SmtpClient smCL = new System.Net.Mail.SmtpClient();
   System.Net.NetworkCredential credential;
   str          bodygrd,sSmtpServer;
   CLRObject   exc;
   CLRObject   innerExc;
   CLRObject   clrExcMessage;
   str         strError;
   SysEmailParameters EmailParm;
   str pass;
   System.Net.Mail.AttachmentCollection  mailAttachementCollection;
   System.Net.Mail.Attachment            mailAttachment;
;

toaddress="test@hotmail.com";


    EmailParm = SysEmailParameters::find();
    pass = SysEmailParameters::password();
    credential = new System.Net.NetworkCredential(EmailParm.SMTPUserName,pass);
    fromMail = new System.Net.Mail.MailAddress(EmailParm.SMTPUserName);
    new InteropPermission(InteropKind::ClrInterop).assert();
  try
  {
    Msg.set_From(fromMail);
    toadrr = Msg.get_To();
    toadrr.Add(new System.Net.Mail.MailAddress(toaddress));
    Msg.set_Subject(_Subject);
    Msg.set_Body(_body);
    Msg.set_IsBodyHtml(true);
    sSmtpServer =  EmailParm.SMTPRelayServerName;
    smCL.set_Host(sSmtpServer);
    mailAttachementCollection = msg.get_Attachments();
        mailAttachment = new System.Net.Mail.Attachment(_fileName);
        mailAttachementCollection.Add(mailAttachment);
    smCL.set_Port(EmailParm.SMTPPortNumber);
    smCL.set_EnableSsl(true);
    smCL.set_Credentials(credential);
    smCL.Send(Msg);
  }     catch( Exception::CLRError )
                   {
                        exc = CLRInterop::getLastException();
                        if( exc )
                        {
                           clrExcMessage = exc.get_Message();
                           innerExc = exc.get_InnerException();
                           while(innerExc != null)
                           {
                              clrExcMessage = innerExc.get_Message();
                              innerExc = innerExc.get_InnerException();
                           }
                           strError = CLRInterop::getAnyTypeForObject( clrExcMessage );
                           throw error(strError);
                        }
                   }
}