ssrs etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
ssrs etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

10 Kasım 2017 Cuma

AX 2012 - SSRS Raporda Nakli/Devreden Yekün ve Sayfa Toplamı

Maalesef SSRS'te nakli yekün ve sayfa toplamı olması gerekenden çetrefilli. Nakli yekün için bir blogdan (Peter ?), sayfa toplamı için de başka bir blogdan (Annette Theißen) faydalandım.

Nakli yekün ve sayfa toplamı alacağımız alan AccountingCurrencyAmountDebit olsun.

Devreden yekün için tablix kontrolümüze adı dCarry, valuesi aşağıdaki gibi olan bir alan ekliyoruz:

=RunningValue(Fields!AccountingCurrencyAmountDebit.Value,SUM,"LedgerTransListAccountDS")

veya koda göre gruplayacaksak:

=RunningValue(Fields!AccountingCurrencyAmountDebit.Value,SUM,"AccountNum_0")


Nakli yekün için de adı dCarryH olan aşağıdaki gibi bir alan ekliyoruz:

=RunningValue(Fields!AccountingCurrencyAmountDebit.Value,SUM,"AccountNum_0") - Fields!AccountingCurrencyAmountDebit.Value

Her iki alanın da visibility değerini no yapıyoruz. Alanlar gizli de olsa hesaplama yapacak.

Nakli yekün için Page Header kısmına valuesi aşağıdaki gibi olan bir alan ekliyoruz:

=First(ReportItems!dCarryH.Value)

Visibility değerini şarta bağlıyoruz (Böylece ilk sayfada nakli yekün olmayacak):

=Globals!PageNumber=1

Devreden yekün için de Page Footer kısmına da valuesi aşağıdaki gibi olan bir alan ekliyoruz:

=last(ReportItems!dCarry.Value)

Visibility değerini şarta bağlıyoruz (Böylece son sayfada devreden yekün olmayacak):

=Globals!PageNumber=Globals!TotalPages

Sayfa toplamı için iki data method ve variable eklememiz gerekiyor. Data method eklemek için treeview'de Designs altındaki Data Methods nodunda sağ klik - Add Data Method yapıyoruz. Ardından üzerine çift klik yaparak kod ekranını açıyoruz. Eklediğimiz kod aşağıda kırmızı çizili olan parça:

using System;
using System.Collections.Generic;
using System.Security.Permissions;
using System.Data;
using Microsoft.Dynamics.Framework.Reports;
using Microsoft.Dynamics.AX.Application.Reports;
public partial class LedgerTransListAccount
{
    static double previousTotal;
    static double pageTotal;
    static bool NewAccount;
    static string lastAccount;

     ...
   
 [DataMethod(), PermissionSet(SecurityAction.Assert, Name = "FullTrust")]
    public static double PageTotal(double total)
    {
         if (NewAccount)
            return total;
         else
            return total - previousTotal;
    }

    [DataMethod(), PermissionSet(SecurityAction.Assert, Name = "FullTrust")]
    public static double PreviousTotal(double total)
    {
        previousTotal = total;

        return 0;
    }
[DataMethod(), PermissionSet(SecurityAction.Assert, Name = "FullTrust")]
    public static string Reset()
    {
        NewAccount = false;
        lastAccount = "";

        return "";
    }

    [DataMethod(), PermissionSet(SecurityAction.Assert, Name = "FullTrust")]
    public static string FollowAccount(string account)
    {
        if (lastAccount != "" && lastAccount != account)
            NewAccount = true;
        lastAccount = account;

        return account;

    }
      
}

Page Footera Bir textbox ekliyoruz:

=PreviousTotal(First(ReportItems!dCarryH.Value))

Bu textbox'un visible değerini false yaparsak maalesef hesaplama yapmaz. Display formatı number seçip Show zero as combobox değerini boşluk yapın (None değil!!).

Sayfa toplamını göstermek için bir alan daha ekliyoruz:

=PageTotal(last(ReportItems!dCarry.Value))

Neden yukarıdaki gibi fazladan bir textbox kullandık diyenler için; SSRS malesef expression parametre olarak iki farklı alanı kabul etmiyor.

Sayfa başına bir Textbox ekliyoruz:

=Reset()




29 Eylül 2014 Pazartesi

AX 2012 - R3 Kurulum

Öncelikle minimum sistem gereksinimlerini kontrol edin. MS-SQL kurulumunuzun collate değeri turkish olmamalı. SAP ve Oracle'da da sorun olan meşhur "i" problemi sebebiyle AX kurulumu tamamlandıktan sonra database sync işleminiz patlar.
Kurulum için Microsoft'un uzun ve karmaşık kurulum dökümanı yerine Dilip's Blog'dan faydalandım. AX 2012 kurulumu çok basit veya bana öyle denk geldi.

Öncelikle Active Directory kurulum gerekiyor. Active Directory kurulumu çok basit ve Google'da anlatan çok fazla makale var.

Ben aynen Dilip'in yaptığı gibi SSRS vs.. kurulumları daha sonraya bırakarak temel AX 2012 kurdum. AX 2012 Setup gerekli yazılımların download linklerini veriyor ve yazılımları otomatik konfigüre ediyor. Kurulum esnasında hiç problem yaşamadım.

Daha sonra Microsoft'un demo datayı da yine bir blog sayfasından faydalanarak kurdum. Demo data kurulumu AX 2012 kurulumundan daha zor.

SQL Server SSRS eklentisini kurduktan sonra ayarlarını da yine bir blogdan faydalanarak yaptım. Bu arada SSRS rapor düzenleyebilmek için (Deploy için gerekmiyor) SQL Server Setup ile Business Intelligence Development Studio kurmayı unutmayın. SSRS ayarları oldukça basitti; sırasıyla  Service account, Web service URL, Database, Report Manager URL tablarını varsayılan ayarlarıyla çalıştırmak yeterli oluyor.

Yine başka bir Dilip sayfasından faydalanarak AX 2012 SSRS kurulumunu yaptım. Burda da hiç sorun yaşamadım ve Dilip'in gösterdiği manuel kuruluma ihtiyacım olmadı, raporlarım otomatik deploy oldu.


4 Ağustos 2014 Pazartesi

AX 2012 - SSRS ile sıfır yerine boşluk göstermek

Field yerine (örnekte PurchPrice) aşağıdaki gibi bir IIF fonksiyonu kullanabilirsiniz:

=IIF(Fields!PurchPrice.Value = 0 ,"",Fields!PurchPrice.Value)

11 Temmuz 2014 Cuma

AX 2012 - SSRS RDP Rapora Seçili Kayıtları Göndermek

SSRS DP Class parm metod olarak tablo ve container kabul etmiyor. Forumlarda biraz araştırdım ve str tipi veri göndermenin tavsiye edildiğini gördüm. Ancak bu çok da iyi bir yaklaşım değildi. En sonunda doğru metodun mevcut AX 2012 raporları içinde zaten bulunduğunu öğrendim. Linkte verdiğim PDF dosyasında çek raporunda bunun kullanıldığı anlatılıyordu. ChequeDP ve ChequeController classlarını inceleyerek aşağıdaki raporu yazdım:

Controller class:

class declaration:

class myController extends SrsReportRunController
{
    #define.ReportName('myreport.Report')
   myTMPTable   myTMPTable;
}

public static void main(Args _args)
{
    SysLastValue    SysLastValue;
    myController controller = new myController();
    controller.parmReportName(#ReportName);
    controller.parmArgs(_args);
    controller.DeleteTmpData();
    controller.init();
    controller.startOperation();
}


protected void prePromptModifyContract()
{

    SrsTmpTblMarshallerContract contract = this.parmReportContract().parmRdpContract() as SrsTmpTblMarshallerContract;

    new SRSReportRunPermission().assert();
    contract.parmTmpTableDataRecId(SRSTmpTblMarshaller::SendTmpTblToDataProvider(myTMPTable));

}


public void init()
{
    FormDataSource      ds;
    TransDate           transDate;
    VendTrans           vendTrans;


    if (!this.parmArgs()             ||
        !this.parmArgs().record()    ||
        this.parmArgs().dataset() != tableNum(VendTrans))
        throw error("Rapor uygun bir parametreyle çağrılmalıdır!..");

    ds = this.parmArgs().record().dataSource();

    vendTrans = ds.getFirst(1);
    transDate = vendTrans.transDate;
    PaymentReceipt.VendAccount = vendTrans.AccountNum;

    for (vendTrans = ds.getFirst(1); vendTrans != null; vendTrans = ds.getNext())
    {
        myTMPTable.Date             = vendTrans.TransDate;

...
        myTMPTable.insert();
    }
}


DP Class:

// <ETG - memre > GN:   T: 11.07.2014 A:
[SRSReportParameterAttribute(classStr(SrsTmpTblMarshallerContract))]
public class mpDP extends SRSReportDataProviderBase
{
    myTMPTAble myTMPTable;
}


private void initTmpTable()
{
    SrsTmpTblMarshallerContract contract = this.parmDataContract() as SrsTmpTblMarshallerContract;

    new SRSReportRunPermission().assert();

    myTMPTable = SRSTmpTblMarshaller::getTmpTbl(contract.parmTmpTableDataRecId());

    SRSTmpTblMarshaller::deleteTmpTblData(contract.parmTmpTableDataRecId());
    CodeAccessPermission::revertAssert();
}


public void processReport()
{

    CompanyInfo                 Company;
    VendTable                   vendTable;
    AmountMST                   amount;
    TempStr                     NumtoTxt;
    LedgerJournalTrans          LedgerTrans;

    this.initTmpTable();

...
}

17 Haziran 2014 Salı

AX 2012 RDP ile SSRS oluştururken Query ekleme

Data provider class a aşağıdaki query attribute yi ekleyin:

[
    SRSReportQueryAttribute (querystr(Cust)),
    SRSReportParameterAttribute(classstr(myReportContract))
]
class myReportDP extends SRSReportDataProviderBase
{
    ...

}
Query'i böyle alın:

[SysEntryPointAttribute(false)]
public void processReport()
{
    QueryRun                    qRun;
    Query                       query;
     ...

    query = this.parmQuery();
    ...


Eğer select query butonu görmek istiyorsanız SSRS rapor dizayn ekranında Dynamics Filter property değerini true yapmayı unutmayın.

4 Şubat 2014 Salı

AX 2012 - RDP class'ı Axapta tarafında test etme

SSRS report için geliştirdiğiniz RDP classlarını AX tarafında nasıl test edersiniz?

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 - SSRS rapor ile PDF çıktısı alma

AX 2012 ile PDF rapor oluşturma için Martin Drab'ın blog sayfasını kullandım:

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();
}


Veya seçili kayıtları RDP rapordan PDF olarak mail gönderme:
 
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();