How to Create SSRS Reports in Dynamics 365
SSRS rapor oluşturmak

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.

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.

Ş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.

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

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.

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. :)

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.

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

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. :)





