Skip to main content

Command Palette

Search for a command to run...

How to Create SSRS Reports in Dynamics 365

SSRS rapor oluşturmak

Updated
3 min read
How to Create SSRS Reports in Dynamics 365

Bu yazımızda adım adım Dynamics 365'te SSRS rapor nasıl yapılıyor öğreneceğiz.

Öncelikle temp bir tablo oluşturalım. Table Type özelliğinin TempDB olmasına dikkat edelim. Tablomuzun alanlarını ekledikten sonra class’lara geçebiliriz.

Temp Table


Sıra Contract, DP ve Controller class’larımızı oluşturmaya geldi. Bu class’lar için örnek kodları aşağıda paylaşıyorum. Siz kendi ihtiyaçlarınız doğrultusunda class’ları revize edebilirsiniz.

[
    DataContractAttribute
]
public class ETGVendorPaymentOrderReportContract implements SysOperationValidatable
{
    LedgerJournalId ledgerJournalId;

    [
        DataMemberAttribute('ledgerJournalId'),
        SysOperationLabelAttribute(literalstr("@SYS328705")),
        SysOperationHelpTextAttribute(literalstr("@SYS328705")),
        SysOperationDisplayOrderAttribute('1')
    ]
    public LedgerJournalId parmLedgerJournalId(LedgerJournalId _ledgerJournalId = ledgerJournalId)
    {
        ledgerJournalId = _ledgerJournalId;
        return ledgerJournalId;
    }

    public boolean validate()
    {
        boolean isValid = true;

        if (!ledgerJournalId)
        {
            isValid = checkFailed(strfmt("Günlük zorunludur."));
        }

        return isValid;
    }

}
[
    SRSReportParameterAttribute(classStr(ETGVendorPaymentOrderReportContract))
]
public class ETGVendorPaymentOrderReportDP extends SrsReportDataProviderPreProcessTempDB
{
    ETGVendorPaymentOrderReportTmp tmp;

    [SRSReportDataSetAttribute(tableStr(ETGVendorPaymentOrderReportTmp))]
    public ETGVendorPaymentOrderReportTmp getTmp()
    {
        select tmp;
        return tmp;
    }

    public void processReport()
    {
        ETGVendorPaymentOrderReportContract contract;
        LedgerJournalId ledgerJournalId;

        LedgerJournalTrans ledgerJournalTrans, ledgerJournalTransTotal;
        VendTable vendTable;
        VendBankAccount vendBankAccount;
        BankAccountTable bankAccountTable;
        PaxBankBranchTable paxBankBranchTable;
        BankAccountID bankAccountID;
        CompanyName companyName;
        int i;

        // Set the user connection to use on tables.
        // This is needed because the createdTransactionId is different for the report than the default connection.
        tmp.setConnection(this.parmUserConnection());

        contract = this.parmDataContract() as ETGVendorPaymentOrderReportContract;

        ledgerJournalId = contract.parmLedgerJournalId();

        companyName = CompanyInfo::find().name();

        select count(RecId) from ledgerJournalTransTotal
            where ledgerJournalTransTotal.JournalNum == ledgerJournalId;

        while select ledgerJournalTrans
            where ledgerJournalTrans.JournalNum == ledgerJournalId
        {
            i++;

            tmp.clear();
            tmp.CompanyName = companyName;
            tmp.LineNum = i;
            tmp.TotalLine = ledgerJournalTransTotal.RecId;
            tmp.TransDate = ledgerJournalTrans.TransDate;
            tmp.CurrencyCode = ledgerJournalTrans.CurrencyCode;
            tmp.Amount = ledgerJournalTrans.AmountCurCredit;
            tmp.PaymMode = ledgerJournalTrans.PaymMode;
            tmp.Txt = ledgerJournalTrans.Txt;

            VendAccount vendAccount = LedgerDynamicAccountHelper::getAccountNumberFromDynamicAccount(ledgerJournalTrans.LedgerDimension);

            vendTable = VendTable::find(vendAccount);
            vendBankAccount = VendBankAccount::find(vendTable.AccountNum, vendTable.BankAccount);
            paxBankBranchTable = PaxBankBranchTable::findByRecId(vendBankAccount.PAXBankBranchRecId);

            tmp.TitleIban = strFmt("%1 / %2 / %3", vendTable.name(), vendBankAccount.BankIBAN, vendBankAccount.AccountNum);
            tmp.BankBranch = strFmt("%1 / %2", vendBankAccount.Name, paxBankBranchTable.BranchName);
            tmp.VATNum = vendTable.VATNum;


            bankAccountID = LedgerDynamicAccountHelper::getAccountNumberFromDynamicAccount(ledgerJournalTrans.OffsetLedgerDimension);
            bankAccountTable = BankAccountTable::find(bankAccountID);
            paxBankBranchTable = PaxBankBranchTable::findByRecId(bankAccountTable.PAXBankBranchRecId);

            tmp.Name = strFmt("%1 %2", paxBankBranchTable.BranchName, paxBankBranchTable.BankBranchId);
            tmp.IBAN = bankAccountTable.IBAN;
            tmp.insert();
        }
    }

}
public class ETGVendorPaymentOrderReportController extends SrsReportRunController
{
    public static ETGVendorPaymentOrderReportController construct()
    {
        return new ETGVendorPaymentOrderReportController();
    }

    public static void main(Args args)
    {
        ETGVendorPaymentOrderReportController  controller;

        controller = ETGVendorPaymentOrderReportController::construct();

        controller.parmReportName(ssrsReportStr(ETGVendorPaymentOrderReport, Report));
        controller.parmLoadFromSysLastValue(false);
        controller.parmArgs(args);
        controller.parmShowDialog(false);
        controller.parmDialogCaption("Satıcı ödeme toplu talimatı");
        controller.prePromptModifyContract();
        controller.startOperation();
    }

    protected void prePromptModifyContract()
    {
        ETGVendorPaymentOrderReportContract contract;

        LedgerJournalTable ledgerJournalTable;
        LedgerJournalTrans ledgerJournalTrans;
        LedgerJournalId ledgerJournalId;

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

        if (this.parmArgs().dataset() == tableNum(LedgerJournalTable))
        {
            ledgerJournalTable = this.parmArgs().record();
            ledgerJournalId = ledgerJournalTable.JournalNum;
        }
        else if (this.parmArgs().dataset() == tableNum(LedgerJournalTrans))
        {
            ledgerJournalTrans = this.parmArgs().record();
            ledgerJournalId = ledgerJournalTrans.JournalNum;
        }

        contract.parmLedgerJournalId(ledgerJournalId);
        //super();
    }

}

Artık sıra rapor nesnemizi oluşturmaya geldi. Add - New item diyerek Report nesnesini seçip, isim verildikten sonra projemize ekliyoruz.

Add New Item

Şimdi sıra rapor nesnemize bir Data Set eklemeye geldi. DataSet düğümü üzerinde sağ tıkladıktan sonra New Data Set tıklanır.

Report DataSet

DataSet özellikleri ekranından aşağıda ki ayarlamalar yapılır.

Report DataSet Propery

Query özelliği üzerinden ilgili Data provider(DP) class’ımız seçilir. Eğer aşağıda ki ekranda ilgili Data provider(DP) class'ını göremiyorsanız projenizi derlemeniz gerekebilir.

Report DP class

Tüm alanlar işaretlendikten sonra tamam tuşu ile işlem onaylanır. Böylece rapor nesnemiz ilgili veri kaynağına bağlanmış olur.


Şimdi sıra rapor dizaynına geldi. Designs düğümüne sağ tıkladıktan sonra New>Precision Design dedikten sonra rapor dizayn edebileceğiniz yeni bir ekran açılacaktır. Bu kısmı sizin hayal gücünüze ve ihtiyaçlarınıza bırakıyorum. :)

Report Design


Son olarak raporumuz için bir menu item nesnesi oluşturmamız ve ilgili ekranlara bağlamamız gerekiyor. Controller class’ımıza bağlayacağımız için bir MenuItemAction oluşturuyoruz. Eğer controller class’ına ihtiyacınız yok ise Output menu item oluşturarak direkt rapor nesnenize bağlayabilirsiniz.

Action Menu Item

Raporumuz LedgerJournalTrans tablosu üzerinden çalışacağı için LedgerJournalTransDaily formuna menu item’ımızı ekledik.

Ledger Journal Trans Daily Form

Son olarak raporu çalıştırdığımda aşağıda ki gibi bir ekran açılıyor. Elimde güzel veriler olsaydı daha dolu bir rapor olabilirdi. :)

Dynamics 365 FO Blog

Part 29 of 33

Microsoft Dynamics 365 for Finance and Operations ürünü ile ilgili yaptığım işler ve tecrübelerim

Up next

Dynamics 365 Change Company

Firma değiştirmek