/// <summary> /// Takes a report and a list of cost centres; it runs the report for each of the cost centres and emails the results to the address(es) /// associated with that cost centre. Used by Account Detail, Income Expense reports and HOSAs. /// </summary> /// <remarks>If ACostCentreFilter is an SQL clause selecting cost centres, the associated email address is the Primary E-Mail Address of /// every Partner linked to the cost centre. If ACostCentreFilter is "Foreign", the list is every cost centre in the a_email_destination /// table with a File Code of "HOSA".</remarks> /// <param name="FormUtils">The report selection form, to write to the status bar.</param> /// <param name="ReportEngine">FastReport wrapper object.</param> /// <param name="ACalc">The report parameters.</param> /// <param name="ALedgerNumber">The ledger number.</param> /// <param name="ACostCentreFilter">SQL clause to select the list of cost centres to run the report for, or "Foreign" </param> /// <returns>List of status strings that should be shown to the user.</returns> public static List <String> AutoEmailReports(TFrmPetraReportingUtils FormUtils, FastReportsWrapper ReportEngine, TRptCalculator ACalc, Int32 ALedgerNumber, String ACostCentreFilter) { TSmtpSender EmailSender; Int32 SuccessfulCount = 0; var NoEmailAddr = new List <String>(); var FailedAddresses = new List <String>(); var SendReport = new List <String>(); // FastReport will use a temporary folder to store HTML files. // I need to ensure that the CurrectDirectory is somewhere writable: String prevCurrentDir = Directory.GetCurrentDirectory(); //Get a path in the Public Documents folder String newDir = Path.Combine(Environment.GetFolderPath( Environment.SpecialFolder.CommonDocuments), "OpenPetraOrg"); //Check it exists, and if not create it if (!Directory.Exists(newDir)) { try { Directory.CreateDirectory(newDir); } catch (Exception ex) { //Could not create the path so return useful debugging information: SendReport.Add(Catalog.GetString("Error - could not create directory: ")); SendReport.Add(newDir); SendReport.Add(ex.Message); return(SendReport); } } Directory.SetCurrentDirectory(newDir); // This gets email defaults from the user settings table //TUC_EmailPreferences.LoadEmailDefaults(); try { EmailSender = new TSmtpSender(); EmailSender.SetSender(TUserDefaults.GetStringDefault("SmtpFromAccount"), TUserDefaults.GetStringDefault("SmtpDisplayName")); EmailSender.CcEverythingTo = TUserDefaults.GetStringDefault("SmtpCcTo"); EmailSender.ReplyTo = TUserDefaults.GetStringDefault("SmtpReplyTo"); } catch (ESmtpSenderInitializeException e) { if (e.InnerException != null) { // I'd write the full exception to the log file, but it still gets transferred to the client window status bar and is _really_ ugly. //TLogging.Log("AutoEmailReports: " + e.InnerException.ToString()); TLogging.Log("AutoEmailReports: " + e.InnerException.Message); } SendReport.Add(e.Message); if (e.ErrorClass == TSmtpErrorClassEnum.secClient) { SendReport.Add(Catalog.GetString("Check the Email tab in User Settings >> Preferences.")); } return(SendReport); } // I need to find the email addresses for the linked partners I'm sending to. DataTable LinkedPartners = null; LinkedPartners = TRemote.MFinance.Setup.WebConnectors.GetLinkedPartners(ALedgerNumber, ACostCentreFilter); LinkedPartners.DefaultView.Sort = "CostCentreCode"; String myLedgerName = ""; DataTable CostCentreList = null; if (ACostCentreFilter == "Foreign") { myLedgerName = TRemote.MFinance.Reporting.WebConnectors.GetLedgerName(ALedgerNumber); CostCentreList = TDataCache.TMFinance.GetCacheableFinanceTable(TCacheableFinanceTablesEnum.CostCentreList, ALedgerNumber); } foreach (DataRowView rv in LinkedPartners.DefaultView) { DataRow LinkedPartner = rv.Row; Boolean reportAsAttachment = TUserDefaults.GetBooleanDefault("SmtpSendAsAttachment", true); if (LinkedPartner["EmailAddress"].ToString() != "") { ACalc.AddStringParameter("param_linked_partner_cc", LinkedPartner["CostCentreCode"].ToString()); FormUtils.WriteToStatusBar("Generate " + ReportEngine.FReportName + " Report for " + LinkedPartner["PartnerShortName"]); MemoryStream ReportStream = ReportEngine.ExportToStream(ACalc, reportAsAttachment ? FastReportsWrapper.ReportExportType.Pdf : FastReportsWrapper.ReportExportType.Html); // in OpenSource OpenPetra, we do not have and use the FastReport dlls // if (ReportEngine.FfastReportInstance.ReportInfo.Description == "Empty") // { // continue; // Don't send an empty report // } ReportStream.Position = 0; String EmailBody = ""; if (reportAsAttachment) { EmailBody = TUserDefaults.GetStringDefault("SmtpEmailBody"); EmailSender.AttachFromStream(ReportStream, ReportEngine.FReportName + ".pdf"); } else { StreamReader sr = new StreamReader(ReportStream); EmailBody = sr.ReadToEnd(); } String subjectLine; if (ACostCentreFilter == "Foreign") { String recipientLedgerName = ""; CostCentreList.DefaultView.RowFilter = "a_cost_centre_code_c='" + LinkedPartner["CostCentreCode"].ToString() + "'"; if (CostCentreList.DefaultView.Count > 0) { recipientLedgerName = CostCentreList.DefaultView[0].Row["a_cost_centre_name_c"].ToString(); } subjectLine = "HOSA & RGS from " + myLedgerName + " to " + recipientLedgerName; } else { subjectLine = ReportEngine.FReportName + " Report for " + LinkedPartner["PartnerShortName"]; } Boolean SentOk = EmailSender.SendEmail( LinkedPartner["EmailAddress"].ToString(), subjectLine, EmailBody); if (SentOk) { SuccessfulCount++; } else // Email didn't send for some reason { SendReport.Add(String.Format( Catalog.GetString("Failed to send to {0}. Message returned: \"{1}\"."), LinkedPartner["EmailAddress"], EmailSender.ErrorStatus )); FailedAddresses.Add(" " + LinkedPartner["EmailAddress"]); } } else // No Email Address for this Partner { NoEmailAddr.Add(" " + String.Format("{0:D10}", LinkedPartner["PartnerKey"]) + " " + LinkedPartner["PartnerShortName"]); } } if (SuccessfulCount == 1) { SendReport.Add( String.Format(Catalog.GetString("{0} emailed to {1} partner."), ReportEngine.FReportName, SuccessfulCount)); } else if (SuccessfulCount > 1) { SendReport.Add( String.Format(Catalog.GetString("{0} emailed to {1} partners."), ReportEngine.FReportName, SuccessfulCount)); } else { SendReport.Add(Catalog.GetString( "Error – no cost centre in the report was linked to a Partner with a valid Primary E-mail Address.")); } if (NoEmailAddr.Count > 0) { SendReport.Add(Catalog.GetString("These Partners have no Primary E-mail Address:")); SendReport.AddRange(NoEmailAddr); } if (FailedAddresses.Count > 0) { SendReport.Add(Catalog.GetString("Failed to send email to these addresses:")); SendReport.AddRange(FailedAddresses); } FormUtils.WriteToStatusBar(""); Directory.SetCurrentDirectory(prevCurrentDir); EmailSender.Dispose(); return(SendReport); } // AutoEmailReports
private void ViewReportTemplate(TRptCalculator ACalc) { String ReportName = ""; if (chkFees.Enabled && chkFees.Checked) { ReportName = "Fees"; } if (chkStewardship.Enabled && chkStewardship.Checked) { ReportName = "Stewardship"; } if (chkHOSA.Enabled && chkHOSA.Checked) { ReportName = "HOSA"; } if (ReportName == "") { return; } MyFastReportsPlugin = new FastReportsWrapper(ReportName); if (chkFees.Enabled && chkFees.Checked) { MyFastReportsPlugin.SetDataGetter(LoadFeesReportData); } if (chkStewardship.Enabled && chkStewardship.Checked) { MyFastReportsPlugin.SetDataGetter(LoadStewardshipReportData); } if (chkHOSA.Enabled && chkHOSA.Checked) { MyFastReportsPlugin.SetDataGetter(LoadHosaReportData); } MyFastReportsPlugin.DesignReport(ACalc); }
/// <summary> /// Print out the Hierarchy using FastReports template. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FilePrint(object sender, EventArgs e) { TLogging.Log("CostCentreHierarchy.File Print.."); FastReportsWrapper ReportingEngine = new FastReportsWrapper("Cost Centre Hierarchy"); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } if (!FMainDS.ACostCentre.Columns.Contains("CostCentrePath")) { FMainDS.ACostCentre.Columns.Add("CostCentrePath", typeof(String)); FMainDS.ACostCentre.Columns.Add("CostCentreLevel", typeof(Int32)); } DataView PathView = new DataView(FMainDS.ACostCentre); PathView.Sort = "a_cost_centre_code_c"; TLogging.Log("CostCentreHierarchy.File Print calculating paths.."); // I need to make the "CostCentrePath" field that will be used to sort the table for printout: foreach (DataRowView rv in PathView) { DataRow Row = rv.Row; String Path = Row["a_cost_centre_code_c"].ToString() + '~'; Int32 Level = 0; String ReportsTo = Row["a_cost_centre_to_report_to_c"].ToString(); while (ReportsTo != "") { Int32 ParentIdx = PathView.Find(ReportsTo); if (ParentIdx >= 0) { DataRow ParentRow = PathView[ParentIdx].Row; ReportsTo = ParentRow["a_cost_centre_to_report_to_c"].ToString(); Path = ParentRow["a_cost_centre_code_c"].ToString() + "~" + Path; Level++; if (Level > 100) // Surely this is a fault. If I just break here, { break; // the report will print and I should be able to see what the fault is. } } else { ReportsTo = ""; } } Row["CostCentrePath"] = Path; Row["CostCentreLevel"] = Level; } PathView.Sort = "CostCentrePath"; DataTable SortedByPath = PathView.ToTable(); TLogging.Log("CostCentreHierarchy.File Print paths all done."); ReportingEngine.RegisterData(SortedByPath, "CostCentreHierarchy"); TRptCalculator Calc = new TRptCalculator(); ALedgerRow LedgerRow = FMainDS.ALedger[0]; Calc.AddParameter("param_ledger_nunmber", LedgerRow.LedgerNumber); Calc.AddStringParameter("param_ledger_name", LedgerRow.LedgerName); TLogging.Log("CostCentreHierarchy.File Print calling FastReport..."); if (ModifierKeys.HasFlag(Keys.Control)) { ReportingEngine.DesignReport(Calc); } else { ReportingEngine.GenerateReport(Calc); } }
} // AutoEmailReports /// <summary>Helper for the report printing ClientTask</summary> /// <remarks>This way of printing reports shows some reliability concerns so it is not currently used.</remarks> /// <param name="ReportName"></param> /// <param name="paramStr"></param> public static void PrintReportNoUi(String ReportName, String paramStr) { String[] Params = paramStr.Split(','); Int32 ledgerNumber = -1; Int32 batchNumber = -1; FastReportsWrapper ReportingEngine = new FastReportsWrapper(ReportName); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } Dictionary <String, TVariant> paramsDictionary = new Dictionary <string, TVariant>(); TRptCalculator Calc = new TRptCalculator(); // // Copy paramters to report: foreach (String param in Params) { String[] term = param.Split('='); if (term.Length > 1) { if (term[1][0] == '"') // This is a string { String val = term[1].Substring(1, term[1].Length - 2); Calc.AddStringParameter(term[0], val); paramsDictionary.Add(term[0], new TVariant(val)); } else // This is a number - Int32 assumed. { Int32 IntTerm; if (Int32.TryParse(term[1], out IntTerm)) { Calc.AddParameter(term[0], IntTerm); paramsDictionary.Add(term[0], new TVariant(IntTerm)); // // As I'm adding these values, I'll keep a note of any that may be useful later.. switch (term[0]) { case "param_ledger_number_i": { ledgerNumber = IntTerm; break; } case "param_batch_number_i": { batchNumber = IntTerm; break; } } } else { MessageBox.Show("Error: Parameter not recognised: " + param, "FastReportWrapper.PrintReportNoUi"); } } } else { MessageBox.Show("Error: malformed Parameter: " + param, "FastReportWrapper.PrintReportNoUi"); } } // foreach param // I'm not in the User Interface thread, so I can use an invoke here: TFormsList.GFormsList.MainMenuForm.Invoke((ThreadStart) delegate { ReportingEngine.GenerateReport(Calc); }); } // PrintReportNoUi
/// <summary> /// The report will be sent to a list of email addresses derived from the Cost Centres in the supplied CostCentreFilter. /// </summary> /// <returns>Status string that should be shown to the user</returns> public static String AutoEmailReports(TFrmPetraReportingUtils FormUtils, FastReportsWrapper ReportEngine, TRptCalculator ACalc, Int32 ALedgerNumber, String ACostCentreFilter) { Int32 SuccessfulCount = 0; String NoEmailAddr = ""; String FailedAddresses = ""; String SendReport = ""; // // I need to find the email addresses for the linked partners I'm sending to. DataTable LinkedPartners = null; LinkedPartners = TRemote.MFinance.Setup.WebConnectors.GetLinkedPartners(ALedgerNumber, ACostCentreFilter); LinkedPartners.DefaultView.Sort = "CostCentreCode"; foreach (DataRowView rv in LinkedPartners.DefaultView) { DataRow LinkedPartner = rv.Row; if (LinkedPartner["EmailAddress"].ToString() != "") { ACalc.AddStringParameter("param_linked_partner_cc", LinkedPartner["CostCentreCode"].ToString()); FormUtils.WriteToStatusBar("Generate " + ReportEngine.FReportName + " Report for " + LinkedPartner["PartnerShortName"]); MemoryStream ReportStream = ReportEngine.ExportToStream(ACalc, FastReportsWrapper.ReportExportType.Html); if (ReportStream.Position < 1000) { continue; // Don't send an empty report } ReportStream.Position = 0; TUC_EmailPreferences.LoadEmailDefaults(); TSmtpSender EmailSender = new TSmtpSender( TUserDefaults.GetStringDefault("SmtpHost"), TUserDefaults.GetInt16Default("SmtpPort"), TUserDefaults.GetBooleanDefault("SmtpUseSsl"), TUserDefaults.GetStringDefault("SmtpUser"), TUserDefaults.GetStringDefault("SmtpPassword"), ""); EmailSender.CcEverythingTo = TUserDefaults.GetStringDefault("SmtpCcTo"); EmailSender.ReplyTo = TUserDefaults.GetStringDefault("SmtpReplyTo"); if (!EmailSender.FInitOk) { return String.Format( Catalog.GetString( "Failed to set up the email server.\n Please check the settings in Preferences / Email.\n Message returned : \"{0}\""), EmailSender.FErrorStatus); } String EmailBody = ""; if (TUserDefaults.GetBooleanDefault("SmtpSendAsAttachment")) { EmailBody = TUserDefaults.GetStringDefault("SmtpEmailBody"); EmailSender.AttachFromStream(ReportStream, ReportEngine.FReportName + ".html"); } else { StreamReader sr = new StreamReader(ReportStream); EmailBody = sr.ReadToEnd(); } Boolean SentOk = EmailSender.SendEmail( TUserDefaults.GetStringDefault("SmtpFromAccount"), TUserDefaults.GetStringDefault("SmtpDisplayName"), "*****@*****.**", //LinkedPartner["EmailAddress"] ReportEngine.FReportName + " Report for " + LinkedPartner["PartnerShortName"] + ", Address=" + LinkedPartner["EmailAddress"], EmailBody); if (SentOk) { SuccessfulCount++; } else // Email didn't send for some reason { SendReport += String.Format( Catalog.GetString("\r\nFailed to send to {0}. Message returned: \"{1}\"."), LinkedPartner["EmailAddress"], EmailSender.FErrorStatus ); FailedAddresses += ("\r\n " + LinkedPartner["EmailAddress"]); } } else // No Email Address for this Partner { NoEmailAddr += ("\r\n " + LinkedPartner["PartnerKey"] + " " + LinkedPartner["PartnerShortName"]); } } if (SuccessfulCount > 0) { SendReport += String.Format(Catalog.GetString("\r\n{0} emailed to {1} addresses."), ReportEngine.FReportName, SuccessfulCount) + "\r\n\r\n"; } if (NoEmailAddr != "") { SendReport += (Catalog.GetString("\r\nThese Partners have no email addresses:") + NoEmailAddr + "\r\n"); } if (FailedAddresses != "") { SendReport += (Catalog.GetString("Failed to send email to these addresses:") + FailedAddresses + "\r\n\r\n"); } FormUtils.WriteToStatusBar(""); return SendReport; } // AutoEmailReports
/// <summary> /// Data loader for HOSA data, /// Made static so it can be called from Stewardship Reports /// </summary> public static Boolean LoadReportDataStaticInner(Form ParentForm, TFrmPetraReportingUtils UtilsObject, FastReportsWrapper ReportingEngine, TRptCalculator ACalc) { Shared.MReporting.TParameterList pm = ACalc.GetParameters(); String Csv = ""; // // My "a_transaction" table forms the lower half of the HOSA: // All transactions for all the "Expense" accounts for the selected Cost Centre within the selected dates or periods. String LedgerFilter = "a_ledger_number_i=" + pm.Get("param_ledger_number_i").ToInt32(); String TranctDateFilter = ""; // Optional Date Filter, as periods or dates String CostCentreCodes = pm.Get("param_cost_centre_codes").ToString(); if (CostCentreCodes == String.Empty) { MessageBox.Show(Catalog.GetString("Please select one or more Cost Centres."), "HOSA"); return false; } String CostCentreFilter = ""; if (CostCentreCodes == "ALL") { CostCentreFilter = " AND a_cost_centre.a_cost_centre_type_c='Foreign' "; } else { CostCentreCodes = CostCentreCodes.Replace('"', '\''); ACalc.AddStringParameter("param_cost_centre_codes", CostCentreCodes); CostCentreFilter = " AND a_cost_centre.a_cost_centre_code_c IN (" + CostCentreCodes + ") "; } if (pm.Get("param_period").ToBool() == true) { Int32 PeriodStart = pm.Get("param_start_period_i").ToInt32(); Int32 PeriodEnd = pm.Get("param_end_period_i").ToInt32(); DateTime DateStart = pm.Get("param_start_date").ToDate(); DateTime DateEnd = pm.Get("param_end_date").ToDate(); ALedgerTable LedgerDetailsTable = (ALedgerTable)TDataCache.TMFinance.GetCacheableFinanceTable( TCacheableFinanceTablesEnum.LedgerDetails); ALedgerRow LedgerRow = LedgerDetailsTable[0]; Boolean IsClosed = (!pm.Get("param_current_financial_year").ToBool() || (PeriodEnd < LedgerRow.CurrentPeriod)); ACalc.AddParameter("param_period_closed", IsClosed); Boolean IsCurrent = (pm.Get("param_current_financial_year").ToBool() && (PeriodEnd == LedgerRow.CurrentPeriod)); ACalc.AddParameter("param_period_current", IsCurrent); String PeriodTitle = " (" + DateStart.ToString("dd-MMM-yyyy") + " - " + DateEnd.ToString("dd-MMM-yyyy") + ")"; if (PeriodEnd > PeriodStart) { PeriodTitle = String.Format("{0} - {1}", PeriodStart, PeriodEnd) + PeriodTitle; } else { PeriodTitle = String.Format("{0}", PeriodStart) + PeriodTitle; } pm.Add("param_date_title", PeriodTitle); } else { String PeriodTitle = " " + pm.Get("param_start_date").DateToString("yyyy-MM-dd") + " - " + pm.Get("param_end_date").DateToString("yyyy-MM-dd"); pm.Add("param_date_title", PeriodTitle); } TranctDateFilter = "a_transaction_date_d>='" + pm.Get("param_start_date").DateToString("yyyy-MM-dd") + "' AND a_transaction_date_d<='" + pm.Get("param_end_date").DateToString("yyyy-MM-dd") + "'"; Csv = StringHelper.AddCSV(Csv, "AAccount/SELECT * FROM a_account WHERE " + LedgerFilter + " AND a_posting_status_l=true AND a_account_active_flag_l=true"); Csv = StringHelper.AddCSV(Csv, "ACostCentre/SELECT * FROM a_cost_centre WHERE " + LedgerFilter + CostCentreFilter + " AND a_posting_cost_centre_flag_l=true AND a_cost_centre_active_flag_l=true"); Csv = StringHelper.AddCSV( Csv, "ATransaction/SELECT a_transaction.* FROM a_transaction, a_cost_centre WHERE a_transaction." + LedgerFilter + " AND " + TranctDateFilter + " AND NOT (a_system_generated_l = true AND (a_narrative_c LIKE 'Gifts received - Gift Batch%' OR a_narrative_c LIKE 'GB - Gift Batch%' OR a_narrative_c LIKE 'Year end re-allocation%'))" + " AND a_transaction.a_ledger_number_i = a_cost_centre.a_ledger_number_i " + " AND a_transaction.a_cost_centre_code_c = a_cost_centre.a_cost_centre_code_c " + CostCentreFilter + " ORDER BY a_account_code_c, a_transaction_date_d"); GLReportingTDS ReportDs = TRemote.MReporting.WebConnectors.GetReportingDataSet(Csv); ArrayList reportParam = ACalc.GetParameters().Elems; Dictionary <String, TVariant>paramsDictionary = new Dictionary <string, TVariant>(); foreach (Shared.MReporting.TParameter p in reportParam) { if (p.name.StartsWith("param") && (p.name != "param_calculation")) { paramsDictionary.Add(p.name, p.value); } } DataTable GiftsTable = TRemote.MReporting.WebConnectors.GetReportDataTable("HOSA", paramsDictionary); DataTable KeyMinGiftsTable = TRemote.MReporting.WebConnectors.GetReportDataTable("FieldGifts", paramsDictionary); // // I'm going to get rid of any Cost Centres that saw no activity in the requested period: for (Int32 Idx = ReportDs.ACostCentre.Rows.Count - 1; Idx >= 0; Idx--) { ACostCentreRow Row = ReportDs.ACostCentre[Idx]; ReportDs.ATransaction.DefaultView.RowFilter = String.Format("a_cost_centre_code_c='{0}'", Row.CostCentreCode); GiftsTable.DefaultView.RowFilter = String.Format("CostCentre='{0}'", Row.CostCentreCode); if ((ReportDs.ATransaction.DefaultView.Count == 0) && (GiftsTable.DefaultView.Count == 0)) { ReportDs.ACostCentre.Rows.Remove(Row); } } if (ParentForm.IsDisposed) { return false; } if (GiftsTable == null) { UtilsObject.WriteToStatusBar("Report Cancelled."); return false; } ReportingEngine.RegisterData(GiftsTable, "Gifts"); ReportingEngine.RegisterData(KeyMinGiftsTable, "FieldGifts"); ReportingEngine.RegisterData(ReportDs.AAccount, "a_account"); ReportingEngine.RegisterData(ReportDs.ACostCentre, "a_costCentre"); ReportingEngine.RegisterData(ReportDs.ATransaction, "a_transaction"); Boolean HasData = (ReportDs.ATransaction.Rows.Count > 0) || (GiftsTable.Rows.Count > 0); if (!HasData) { MessageBox.Show(Catalog.GetString("No Transactions found for selected Cost Centres."), "HOSA"); } return HasData; }
/// <summary>Helper for the report printing ClientTask</summary> /// <param name="ReportName"></param> /// <param name="paramStr"></param> public static void PrintReportNoUi(String ReportName, String paramStr) { String[] Params = paramStr.Split(','); Int32 LedgerNumber = -1; Int32 BatchNumber = -1; /* * String Msg = ReportName + "\n"; * foreach (String param in Params) * { * Msg += (param + "\n"); * } * MessageBox.Show(Msg, "FastReportWrapper.PrintReportNoUi"); */ FastReportsWrapper ReportingEngine = new FastReportsWrapper(ReportName); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } Dictionary <String, TVariant> paramsDictionary = new Dictionary <string, TVariant>(); TRptCalculator Calc = new TRptCalculator(); // // Copy paramters to report: foreach (String param in Params) { String[] term = param.Split('='); if (term.Length > 1) { if (term[1][0] == '"') // This is a string { String val = term[1].Substring(1, term[1].Length - 2); Calc.AddStringParameter(term[0], val); paramsDictionary.Add(term[0], new TVariant(val)); } else // This is a number - Int32 assumed. { Int32 IntTerm; if (Int32.TryParse(term[1], out IntTerm)) { Calc.AddParameter(term[0], IntTerm); paramsDictionary.Add(term[0], new TVariant(IntTerm)); // // As I'm adding these values, I'll keep a note of any that may be useful later.. switch (term[0]) { case "param_ledger_number_i": { LedgerNumber = IntTerm; break; } case "param_batch_number_i": { BatchNumber = IntTerm; break; } } } else { MessageBox.Show("Error: Parameter not recognised: " + param, "FastReportWrapper.PrintReportNoUi"); } } } else { MessageBox.Show("Error: malformed Parameter: " + param, "FastReportWrapper.PrintReportNoUi"); } } // foreach param // // Get Data for report: switch (ReportName) { case "Batch Posting Register": { if ((LedgerNumber != -1) && (BatchNumber != -1)) { ReportingEngine.RegisterBatchPostingData(Calc, LedgerNumber, BatchNumber); } else { MessageBox.Show("Error: Can't get data for Batch Posting Register", "FastReportWrapper.PrintReportNoUi"); } break; } case "Gift Batch Detail": { DataTable ReportTable = TRemote.MReporting.WebConnectors.GetReportDataTable("GiftBatchDetail", paramsDictionary); ReportingEngine.RegisterData(ReportTable, "GiftBatchDetail"); break; } } // switch // I'm not in the User Interface thread, so I can use an invoke here: TFormsList.GFormsList.MainMenuForm.Invoke((ThreadStart) delegate { ReportingEngine.GenerateReport(Calc); }); //Application.OpenForms[0].Invoke((ThreadStart) delegate { ReportingEngine.GenerateReport(Calc); }); } // PrintReportNoUi
/// <summary> /// Print out the Hierarchy using FastReports template. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FilePrint(object sender, EventArgs e) { FastReportsWrapper ReportingEngine = new FastReportsWrapper("Account Hierarchy"); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } if (!FMainDS.AAccount.Columns.Contains("AccountPath")) { FMainDS.AAccount.Columns.Add("AccountPath", typeof(String)); FMainDS.AAccount.Columns.Add("AccountLevel", typeof(Int32)); } DataView PathView = new DataView(FMainDS.AAccountHierarchyDetail); PathView.Sort = "a_reporting_account_code_c"; DataView AccountView = new DataView(FMainDS.AAccount); AccountView.Sort = "a_account_code_c"; // I need to make the "AccountPath" field that will be used to sort the table for printout: foreach (DataRowView rv in PathView) { DataRow Row = rv.Row; String AccountCode = Row["a_reporting_account_code_c"].ToString(); String Path = Row["a_report_order_i"] + "-" + AccountCode + '~'; Int32 Level = 0; String ReportsTo = Row["a_account_code_to_report_to_c"].ToString(); while (ReportsTo != "") { Int32 ParentIdx = PathView.Find(ReportsTo); if (ParentIdx >= 0) { DataRow ParentRow = PathView[ParentIdx].Row; ReportsTo = ParentRow["a_account_code_to_report_to_c"].ToString(); Path = ParentRow["a_report_order_i"] + "-" + ParentRow["a_reporting_account_code_c"].ToString() + "~" + Path; Level++; if (Level > 100) // Surely this is a fault. If I just break here, { break; // the report will print and I should be able to see what the fault is. } } else { ReportsTo = ""; } } Int32 AccountIdx = AccountView.Find(AccountCode); DataRow AccountRow = AccountView[AccountIdx].Row; AccountRow["AccountPath"] = Path; AccountRow["AccountLevel"] = Level; } AccountView.Sort = "AccountPath"; DataTable SortedByPath = AccountView.ToTable(); ReportingEngine.RegisterData(SortedByPath, "AccountHierarchy"); ReportingEngine.RegisterData(FMainDS.AAnalysisAttribute, "AnalysisAttribute"); TRptCalculator Calc = new TRptCalculator(); ALedgerRow LedgerRow = FMainDS.ALedger[0]; Calc.AddParameter("param_ledger_number_i", LedgerRow.LedgerNumber); Calc.AddStringParameter("param_ledger_name", LedgerRow.LedgerName); if (ModifierKeys.HasFlag(Keys.Control)) { ReportingEngine.DesignReport(Calc); } else { ReportingEngine.GenerateReport(Calc); } }
// // New methods using the Fast-reports DLL: // This form generates a clutch of different reports. // In this method, a new FastReportsWrapper is used for each selected report type. private void GenerateAllSelectedReports(TRptCalculator ACalc) { // "Stewardship"; MyFastReportsPlugin = new FastReportsWrapper("Stewardship"); MyFastReportsPlugin.SetDataGetter(LoadStewardshipReportData); MyFastReportsPlugin.GenerateReport(ACalc); }
/// <summary> /// The report will be sent to a list of email addresses derived from the Cost Centres in the supplied CostCentreFilter. /// </summary> /// <returns>Status string that should be shown to the user</returns> public static String AutoEmailReports(TFrmPetraReportingUtils FormUtils, FastReportsWrapper ReportEngine, TRptCalculator ACalc, Int32 ALedgerNumber, String ACostCentreFilter) { Int32 SuccessfulCount = 0; String NoEmailAddr = ""; String FailedAddresses = ""; String SendReport = "Auto Email\r\n"; // // FastReport will use a temporary folder to store HTML files. // I need to ensure that the CurrectDirectory is somewhere writable: String prevCurrentDir = Directory.GetCurrentDirectory(); //Get a path in the Public Documents folder String newDir = Path.Combine(Environment.GetFolderPath( Environment.SpecialFolder.CommonDocuments), "OpenPetraOrg"); //Check it exists, and if not create it if (!Directory.Exists(newDir)) { try { Directory.CreateDirectory(newDir); } catch (Exception ex) { //could not create the path so return useful debugging information: SendReport += Catalog.GetString("\r\nError - could not create directory: " + newDir); SendReport += Catalog.GetString("\r\n" + newDir); SendReport += ex.Message; return(SendReport); } } Directory.SetCurrentDirectory(newDir); // // I need to find the email addresses for the linked partners I'm sending to. DataTable LinkedPartners = null; LinkedPartners = TRemote.MFinance.Setup.WebConnectors.GetLinkedPartners(ALedgerNumber, ACostCentreFilter); LinkedPartners.DefaultView.Sort = "CostCentreCode"; foreach (DataRowView rv in LinkedPartners.DefaultView) { DataRow LinkedPartner = rv.Row; if (LinkedPartner["EmailAddress"].ToString() != "") { ACalc.AddStringParameter("param_linked_partner_cc", LinkedPartner["CostCentreCode"].ToString()); FormUtils.WriteToStatusBar("Generate " + ReportEngine.FReportName + " Report for " + LinkedPartner["PartnerShortName"]); MemoryStream ReportStream = ReportEngine.ExportToStream(ACalc, FastReportsWrapper.ReportExportType.Html); // in OpenSource OpenPetra, we do not have and use the FastReport dlls // if (ReportEngine.FfastReportInstance.ReportInfo.Description == "Empty") // { // continue; // Don't send an empty report // } ReportStream.Position = 0; // This gets email defaults from the user settings table TUC_EmailPreferences.LoadEmailDefaults(); // This gets some of the settings from the server configuration. We no longer get these items from local PC. // SmtpUsername and SmtpPassword will usually be null string smtpHost, smtpUsername, smtpPassword; int smtpPort; bool smtpUseSSL; TRemote.MSysMan.Application.WebConnectors.GetServerSmtpSettings(out smtpHost, out smtpPort, out smtpUseSSL, out smtpUsername, out smtpPassword); if ((smtpHost == string.Empty) || (smtpPort < 0)) { return(Catalog.GetString( "Cannot send email because 'smtpHost' and/or 'smtpPort' are not configured in the OP server configuration file.")); } TSmtpSender EmailSender = new TSmtpSender(smtpHost, smtpPort, smtpUseSSL, smtpUsername, smtpPassword, ""); EmailSender.CcEverythingTo = TUserDefaults.GetStringDefault("SmtpCcTo"); EmailSender.ReplyTo = TUserDefaults.GetStringDefault("SmtpReplyTo"); if (!EmailSender.FInitOk) { return(String.Format( Catalog.GetString( "Failed to set up the email server.\n Please check the settings in Preferences / Email.\n Message returned : \"{0}\""), EmailSender.FErrorStatus)); } String EmailBody = ""; if (TUserDefaults.GetBooleanDefault("SmtpSendAsAttachment")) { EmailBody = TUserDefaults.GetStringDefault("SmtpEmailBody"); EmailSender.AttachFromStream(ReportStream, ReportEngine.FReportName + ".html"); } else { StreamReader sr = new StreamReader(ReportStream); EmailBody = sr.ReadToEnd(); } Boolean SentOk = EmailSender.SendEmail( TUserDefaults.GetStringDefault("SmtpFromAccount"), TUserDefaults.GetStringDefault("SmtpDisplayName"), LinkedPartner["EmailAddress"].ToString(), ReportEngine.FReportName + " Report for " + LinkedPartner["PartnerShortName"] + ", Address=" + LinkedPartner["EmailAddress"], EmailBody); if (SentOk) { SuccessfulCount++; } else // Email didn't send for some reason { SendReport += String.Format( Catalog.GetString("\r\nFailed to send to {0}. Message returned: \"{1}\"."), LinkedPartner["EmailAddress"], EmailSender.FErrorStatus ); FailedAddresses += ("\r\n " + LinkedPartner["EmailAddress"]); } } else // No Email Address for this Partner { NoEmailAddr += ("\r\n " + LinkedPartner["PartnerKey"] + " " + LinkedPartner["PartnerShortName"]); } } if (SuccessfulCount > 0) { SendReport += String.Format(Catalog.GetString("\r\n{0} emailed to {1} addresses."), ReportEngine.FReportName, SuccessfulCount) + "\r\n\r\n"; } else { SendReport += Catalog.GetString("\r\nError - no page had a linked email address."); } if (NoEmailAddr != "") { SendReport += (Catalog.GetString("\r\nThese Partners have no email addresses:") + NoEmailAddr + "\r\n"); } if (FailedAddresses != "") { SendReport += (Catalog.GetString("Failed to send email to these addresses:") + FailedAddresses + "\r\n\r\n"); } FormUtils.WriteToStatusBar(""); Directory.SetCurrentDirectory(prevCurrentDir); return(SendReport); } // AutoEmailReports
/* * private void GenerateReports(Object Sender, EventArgs e) * { * String CurrencySelect = (this.rbtBase.Checked ? MFinanceConstants.CURRENCY_BASE : MFinanceConstants.CURRENCY_INTERNATIONAL); * bool DoGenerateHOSAReports = chkHOSAReport.Checked; * bool DoEmailHOSAReports = chkEmailHOSAReport.Checked; * bool DoGenerateHOSAFiles = chkHOSAFile.Checked; * bool DoEmailHOSAFiles = chkEmailHOSAFile.Checked; * * TVerificationResultCollection VerificationResults; * * string msg = string.Empty; * string SuccessfullCostCentres = string.Empty; * string FailedCostCentres = string.Empty; * * int SelectedReportPeriod = cmbReportPeriod.GetSelectedInt32(); * int SelectedICHNumber = cmbICHNumber.GetSelectedInt32(); * * if (!ValidReportPeriod()) * { * return; * } * * String HOSAFilePrefix = txtHOSAPrefix.Text; * * if (HOSAFilePrefix.Length == 0) * { * HOSAFilePrefix = Catalog.GetString("HOSAFilesExportFor"); * } * else * { * Int32 IndexOfInvalidFilenameCharacter = HOSAFilePrefix.IndexOfAny(Path.GetInvalidFileNameChars()); * * if (IndexOfInvalidFilenameCharacter >= 0) * { * msg = String.Format("The HOSA File Prefix: '{0}', contains characters not valid in a filename: {1}{2}{2}Please remove and retry.", * HOSAFilePrefix, * String.Join(", ", Path.GetInvalidFileNameChars()), * Environment.NewLine); * * MessageBox.Show(msg, "Generate HOSA Reports and Files", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); * * txtHOSAPrefix.Focus(); * txtHOSAPrefix.Select(IndexOfInvalidFilenameCharacter, 1); * return; * } * } * * try * { * Cursor = Cursors.WaitCursor; * * DataTable ICHNumbers = TDataCache.TMFinance.GetCacheableFinanceTable(TCacheableFinanceTablesEnum.ICHStewardshipList, FLedgerNumber); * * //Filter for current period * if (SelectedICHNumber != 0) * { * ICHNumbers.DefaultView.RowFilter = String.Format("{0}={1} And {2}={3}", * AIchStewardshipTable.GetPeriodNumberDBName(), * SelectedReportPeriod, * AIchStewardshipTable.GetIchNumberDBName(), * SelectedICHNumber); * } * else * { * ICHNumbers.DefaultView.RowFilter = String.Format("{0}={1}", * AIchStewardshipTable.GetPeriodNumberDBName(), * SelectedReportPeriod); * } * * ICHNumbers.DefaultView.Sort = AIchStewardshipTable.GetCostCentreCodeDBName(); * * foreach (DataRowView tmpRow in ICHNumbers.DefaultView) * { * AIchStewardshipRow ichRow = (AIchStewardshipRow)tmpRow.Row; * bool HOSASuccess = false; * * String CostCentreCode = ichRow.CostCentreCode; * * if (DoGenerateHOSAReports) * { * //TODO code to generate the HOSA reports * TRemote.MFinance.ICH.WebConnectors.GenerateHOSAReports(FLedgerNumber, * cmbReportPeriod.GetSelectedInt32(), * cmbICHNumber.GetSelectedInt32(), * CurrencySelect, * out VerificationResults); * HOSASuccess = !VerificationResults.HasCriticalErrors; * } * else if (DoGenerateHOSAFiles) * { * String FileName = TClientSettings.PathTemp + Path.DirectorySeparatorChar + HOSAFilePrefix + CostCentreCode + ".csv"; * HOSASuccess = TRemote.MFinance.ICH.WebConnectors.GenerateHOSAFiles(FLedgerNumber, cmbReportPeriod.GetSelectedInt32(), * cmbICHNumber.GetSelectedInt32(), CostCentreCode, CurrencySelect, FileName, out VerificationResults); * } * * if (HOSASuccess) * { * if (SuccessfullCostCentres.Length == 0) * { * SuccessfullCostCentres = CostCentreCode; * } * else * { * SuccessfullCostCentres += ", " + CostCentreCode; * } * } * else * { * if (FailedCostCentres.Length == 0) * { * FailedCostCentres = CostCentreCode; * } * else * { * FailedCostCentres += ", " + CostCentreCode; * } * } * } * * Cursor = Cursors.Default; * * if (SuccessfullCostCentres.Length > 0) * { * msg = String.Format(Catalog.GetString("HOSA file generated successfully for Cost Centre(s):{0}{0}{1}{0}{0}"), * Environment.NewLine, * SuccessfullCostCentres); * } * * if (FailedCostCentres.Length > 0) * { * msg += String.Format(Catalog.GetString("HOSA generation FAILED for Cost Centre(s):{0}{0}{1}"), * Environment.NewLine, * FailedCostCentres); * } * * if (msg.Length == 0) * { * msg = Catalog.GetString("Stewardship Calculations haven't been run or no transactions to process."); * } * * MessageBox.Show(msg, Catalog.GetString("Generate Reports")); * } * finally * { * Cursor = Cursors.Default; * } * } * private bool ValidReportPeriod() * { * if (cmbReportPeriod.SelectedIndex > -1) * { * return true; * } * else if (cmbReportPeriod.Count > 0) * { * MessageBox.Show(Catalog.GetString("Please select a valid reporting period first.")); * cmbReportPeriod.Focus(); * } * * return false; * } */ private void ViewReportTemplate(TRptCalculator ACalc) { String ReportName = ""; if (chkRecipient.Checked) { ReportName = "Recipient Gift Statement"; } if (chkFees.Checked) { ReportName = "Fees"; } if (chkStewardship.Checked) { ReportName = "Stewardship"; } if (chkHOSA.Checked) { ReportName = "HOSA"; } if (ReportName == "") { return; } MyFastReportsPlugin = new FastReportsWrapper(ReportName); MyFastReportsPlugin.DesignReport(ACalc); }
/// <summary> /// The report will be sent to a list of email addresses derived from the Cost Centres in the supplied CostCentreFilter. /// </summary> /// <returns>Status string that should be shown to the user</returns> public static String AutoEmailReports(TFrmPetraReportingUtils FormUtils, FastReportsWrapper ReportEngine, TRptCalculator ACalc, Int32 ALedgerNumber, String ACostCentreFilter) { Int32 SuccessfulCount = 0; String NoEmailAddr = ""; String FailedAddresses = ""; String SendReport = ""; // // I need to find the email addresses for the linked partners I'm sending to. DataTable LinkedPartners = null; LinkedPartners = TRemote.MFinance.Setup.WebConnectors.GetLinkedPartners(ALedgerNumber, ACostCentreFilter); LinkedPartners.DefaultView.Sort = "CostCentreCode"; foreach (DataRowView rv in LinkedPartners.DefaultView) { DataRow LinkedPartner = rv.Row; if (LinkedPartner["EmailAddress"].ToString() != "") { ACalc.AddStringParameter("param_linked_partner_cc", LinkedPartner["CostCentreCode"].ToString()); FormUtils.WriteToStatusBar("Generate " + ReportEngine.FReportName + " Report for " + LinkedPartner["PartnerShortName"]); MemoryStream ReportStream = ReportEngine.ExportToStream(ACalc, FastReportsWrapper.ReportExportType.Html); if (ReportStream.Position < 1000) { continue; // Don't send an empty report } ReportStream.Position = 0; TUC_EmailPreferences.LoadEmailDefaults(); TSmtpSender EmailSender = new TSmtpSender( TUserDefaults.GetStringDefault("SmtpHost"), TUserDefaults.GetInt16Default("SmtpPort"), TUserDefaults.GetBooleanDefault("SmtpUseSsl"), TUserDefaults.GetStringDefault("SmtpUser"), TUserDefaults.GetStringDefault("SmtpPassword"), ""); EmailSender.CcEverythingTo = TUserDefaults.GetStringDefault("SmtpCcTo"); EmailSender.ReplyTo = TUserDefaults.GetStringDefault("SmtpReplyTo"); if (!EmailSender.FInitOk) { return(String.Format( Catalog.GetString( "Failed to set up the email server.\n Please check the settings in Preferences / Email.\n Message returned : \"{0}\""), EmailSender.FErrorStatus)); } String EmailBody = ""; if (TUserDefaults.GetBooleanDefault("SmtpSendAsAttachment")) { EmailBody = TUserDefaults.GetStringDefault("SmtpEmailBody"); EmailSender.AttachFromStream(ReportStream, ReportEngine.FReportName + ".html"); } else { StreamReader sr = new StreamReader(ReportStream); EmailBody = sr.ReadToEnd(); } Boolean SentOk = EmailSender.SendEmail( TUserDefaults.GetStringDefault("SmtpFromAccount"), TUserDefaults.GetStringDefault("SmtpDisplayName"), "*****@*****.**", //LinkedPartner["EmailAddress"] ReportEngine.FReportName + " Report for " + LinkedPartner["PartnerShortName"] + ", Address=" + LinkedPartner["EmailAddress"], EmailBody); if (SentOk) { SuccessfulCount++; } else // Email didn't send for some reason { SendReport += String.Format( Catalog.GetString("\r\nFailed to send to {0}. Message returned: \"{1}\"."), LinkedPartner["EmailAddress"], EmailSender.FErrorStatus ); FailedAddresses += ("\r\n " + LinkedPartner["EmailAddress"]); } } else // No Email Address for this Partner { NoEmailAddr += ("\r\n " + LinkedPartner["PartnerKey"] + " " + LinkedPartner["PartnerShortName"]); } } if (SuccessfulCount > 0) { SendReport += String.Format(Catalog.GetString("\r\n{0} emailed to {1} addresses."), ReportEngine.FReportName, SuccessfulCount) + "\r\n\r\n"; } if (NoEmailAddr != "") { SendReport += (Catalog.GetString("\r\nThese Partners have no email addresses:") + NoEmailAddr + "\r\n"); } if (FailedAddresses != "") { SendReport += (Catalog.GetString("Failed to send email to these addresses:") + FailedAddresses + "\r\n\r\n"); } FormUtils.WriteToStatusBar(""); return(SendReport); } // AutoEmailReports
/// <summary> /// Print out the Hierarchy using FastReports template. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FilePrint(object sender, EventArgs e) { FastReportsWrapper ReportingEngine = new FastReportsWrapper("Duplicate Address Check"); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } ReportingEngine.RegisterData(FDuplicateLocations, "DuplicateLocations"); TRptCalculator Calc = new TRptCalculator(); if (ModifierKeys.HasFlag(Keys.Control)) { ReportingEngine.DesignReport(Calc); } else { ReportingEngine.GenerateReport(Calc); } }
// // New methods using the Fast-reports DLL: // This form generates a clutch of different reports. // In this method, a new FastReportsWrapper is used for each selected report type. private void GenerateAllSelectedReports(TRptCalculator ACalc) { FStatusMsg = ""; if (chkHOSA.Enabled && chkHOSA.Checked) { FStatusMsg += Catalog.GetString("\r\nAll HOSAs:"); MyFastReportsPlugin = new FastReportsWrapper("HOSA"); MyFastReportsPlugin.SetDataGetter(LoadHosaReportData); MyFastReportsPlugin.GenerateReport(ACalc); } if (chkStewardship.Enabled && chkStewardship.Checked) { FStatusMsg += Catalog.GetString("\r\nStewardship Report:"); MyFastReportsPlugin = new FastReportsWrapper("Stewardship"); MyFastReportsPlugin.SetDataGetter(LoadStewardshipReportData); MyFastReportsPlugin.GenerateReport(ACalc); } if (chkFees.Enabled && chkFees.Checked) { FStatusMsg += Catalog.GetString("\r\nFees Report:"); MyFastReportsPlugin = new FastReportsWrapper("Fees"); MyFastReportsPlugin.SetDataGetter(LoadFeesReportData); MyFastReportsPlugin.GenerateReport(ACalc); } // complex way of stepping around the Windows non-thread-safe controls problem! FStatusMsg += Catalog.GetString("\r\n\r\nReport generation complete."); this.Invoke(new CrossThreadUpdate(ShowReportStatus)); }
/// <summary> /// setup the form /// /// </summary> /// <param name="AReportParameter"></param> /// <returns>false if there are not enough permissions /// </returns> public virtual bool InitialiseData(String AReportParameter) { bool ReturnValue = true; if (!HasSufficientPermissions()) { MessageBox.Show("You don't have enough permissions for this report"); return false; } this.FCalculator = new TRptCalculator(); FWindowCaption = FWinForm.Text; InitialiseStoredSettings(); FSelectedColumn = -1; // // If the FFastReportsPlugin initialises fully, it changes the available menu options. FFastReportsPlugin = new FastReportsWrapper(this); if (FFastReportsPlugin.LoadedOK) { SetAvailableFunctions(); } return ReturnValue; }
} // AutoEmailReports /// <summary> /// /// </summary> /// <param name="ReportName"></param> /// <param name="paramStr"></param> public static void PrintReportNoUi(String ReportName, String paramStr) { String[] Params = paramStr.Split(','); Int32 LedgerNumber = -1; Int32 BatchNumber = -1; /* * String Msg = ReportName + "\n"; * foreach (String param in Params) * { * Msg += (param + "\n"); * } * MessageBox.Show(Msg, "FastReportWrapper.PrintReportNoUi"); */ FastReportsWrapper ReportingEngine = new FastReportsWrapper(ReportName); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } TRptCalculator Calc = new TRptCalculator(); // // Copy paramters to report: foreach (String param in Params) { String[] term = param.Split('='); if (term.Length > 1) { if (term[1][0] == '"') // This is a string { Calc.AddStringParameter(term[0], term[1].Substring(1, term[1].Length - 2)); } else // This is a number - Int32 assumed. { Int32 IntTerm; if (Int32.TryParse(term[1], out IntTerm)) { Calc.AddParameter(term[0], IntTerm); // // As I'm adding these values, I'll keep a note of any that may be useful later.. switch (term[0]) { case "param_ledger_number_i": { LedgerNumber = IntTerm; break; } case "param_batch_number_i": { BatchNumber = IntTerm; break; } } } else { MessageBox.Show("Error: Parameter not recognised: " + param, "FastReportWrapper.PrintReportNoUi"); } } } else { MessageBox.Show("Error: malformed Parameter: " + param, "FastReportWrapper.PrintReportNoUi"); } } // foreach // // Get Data for report: switch (ReportName) { case "Batch Posting Register": { if ((LedgerNumber != -1) && (BatchNumber != -1)) { GLBatchTDS BatchTDS = TRemote.MFinance.GL.WebConnectors.LoadABatchAndContent(LedgerNumber, BatchNumber); ReportingEngine.RegisterData(BatchTDS.ABatch, "ABatch"); ReportingEngine.RegisterData(BatchTDS.AJournal, "AJournal"); ReportingEngine.RegisterData(BatchTDS.ATransaction, "ATransaction"); } else { MessageBox.Show("Error: Can't get data for Batch Posting Register", "FastReportWrapper.PrintReportNoUi"); } break; } } // switch ReportingEngine.GenerateReport(Calc); } // PrintReportNoUi
/// <summary> /// Print out the Motivation Details using FastReports template. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FilePrint(object sender, EventArgs e) { FastReportsWrapper ReportingEngine = new FastReportsWrapper("Motivation Details"); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } // Add in the Fees applicable for each row: if (!FMainDS.AMotivationDetail.Columns.Contains("Fees")) { FMainDS.AMotivationDetail.Columns.Add("Fees", typeof(String)); FMainDS.AMotivationDetail.Columns.Add("KeyMin", typeof(String)); } foreach (AMotivationDetailRow Row in FMainDS.AMotivationDetail.Rows) { FMainDS.AMotivationDetailFee.DefaultView.RowFilter = String.Format( "a_motivation_group_code_c='{0}' AND a_motivation_detail_code_c='{1}'", Row.MotivationGroupCode, Row.MotivationDetailCode); String Fees = ""; foreach (DataRowView rv in FMainDS.AMotivationDetailFee.DefaultView) { AMotivationDetailFeeRow FeeRow = (AMotivationDetailFeeRow)rv.Row; if (Fees != "") { Fees += ", "; } Fees += FeeRow.FeeCode; } Row["Fees"] = Fees; if (Row.RecipientKey != 0) { String mPartnerShortName; TPartnerClass mPartnerClass; if (TServerLookup.TMPartner.GetPartnerShortName(Row.RecipientKey, out mPartnerShortName, out mPartnerClass, true)) { Row["KeyMin"] = mPartnerShortName; } } } // foreach // // Ensure the proper sorting for the printout: FMainDS.AMotivationDetail.DefaultView.Sort = "a_motivation_group_code_c, a_motivation_detail_code_c"; ReportingEngine.RegisterData(FMainDS.AMotivationDetail.DefaultView.ToTable(), "MotivationDetail"); TRptCalculator Calc = new TRptCalculator(); ALedgerRow LedgerRow = FMainDS.ALedger[0]; Calc.AddParameter("param_ledger_number_i", LedgerRow.LedgerNumber); Calc.AddStringParameter("param_ledger_name", LedgerRow.LedgerName); Calc.AddParameter("param_TD", FTaxDeductiblePercentageEnabled); if (ModifierKeys.HasFlag(Keys.Control)) { ReportingEngine.DesignReport(Calc); } else { ReportingEngine.GenerateReport(Calc); } }
/// <summary> /// Print or reprint the posting report for this batch. /// </summary> public static void PrintPostingRegister(Int32 ALedgerNumber, Int32 ABatchNumber, Boolean AEditTemplate = false) { FastReportsWrapper ReportingEngine = new FastReportsWrapper("Batch Posting Register"); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } GLBatchTDS BatchTDS = TRemote.MFinance.GL.WebConnectors.LoadABatchAndContent(ALedgerNumber, ABatchNumber); TRptCalculator Calc = new TRptCalculator(); ALedgerRow LedgerRow = BatchTDS.ALedger[0]; //Call RegisterData to give the data to the template ReportingEngine.RegisterData(BatchTDS.ABatch, "ABatch"); ReportingEngine.RegisterData(BatchTDS.AJournal, "AJournal"); ReportingEngine.RegisterData(BatchTDS.ATransaction, "ATransaction"); Calc.AddParameter("param_batch_number_i", ABatchNumber); Calc.AddParameter("param_ledger_number_i", ALedgerNumber); String LedgerName = TRemote.MFinance.Reporting.WebConnectors.GetLedgerName(ALedgerNumber); Calc.AddStringParameter("param_ledger_name", LedgerName); if (AEditTemplate) { ReportingEngine.DesignReport(Calc); } else { ReportingEngine.GenerateReport(Calc); } }
/// <summary>Helper for the report printing ClientTask</summary> /// <param name="ReportName"></param> /// <param name="paramStr"></param> public static void PrintReportNoUi(String ReportName, String paramStr) { String[] Params = paramStr.Split(','); Int32 LedgerNumber = -1; Int32 BatchNumber = -1; /* * String Msg = ReportName + "\n"; * foreach (String param in Params) * { * Msg += (param + "\n"); * } * MessageBox.Show(Msg, "FastReportWrapper.PrintReportNoUi"); */ FastReportsWrapper ReportingEngine = new FastReportsWrapper(ReportName); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } Dictionary <String, TVariant>paramsDictionary = new Dictionary <string, TVariant>(); TRptCalculator Calc = new TRptCalculator(); // // Copy paramters to report: foreach (String param in Params) { String[] term = param.Split('='); if (term.Length > 1) { if (term[1][0] == '"') // This is a string { String val = term[1].Substring(1, term[1].Length - 2); Calc.AddStringParameter(term[0], val); paramsDictionary.Add(term[0], new TVariant(val)); } else // This is a number - Int32 assumed. { Int32 IntTerm; if (Int32.TryParse(term[1], out IntTerm)) { Calc.AddParameter(term[0], IntTerm); paramsDictionary.Add(term[0], new TVariant(IntTerm)); // // As I'm adding these values, I'll keep a note of any that may be useful later.. switch (term[0]) { case "param_ledger_number_i": { LedgerNumber = IntTerm; break; } case "param_batch_number_i": { BatchNumber = IntTerm; break; } } } else { MessageBox.Show("Error: Parameter not recognised: " + param, "FastReportWrapper.PrintReportNoUi"); } } } else { MessageBox.Show("Error: malformed Parameter: " + param, "FastReportWrapper.PrintReportNoUi"); } } // foreach param // // Get Data for report: switch (ReportName) { case "Batch Posting Register": { if ((LedgerNumber != -1) && (BatchNumber != -1)) { ReportingEngine.RegisterBatchPostingData(Calc, LedgerNumber, BatchNumber); } else { MessageBox.Show("Error: Can't get data for Batch Posting Register", "FastReportWrapper.PrintReportNoUi"); } break; } case "Gift Batch Detail": { DataTable ReportTable = TRemote.MReporting.WebConnectors.GetReportDataTable("GiftBatchDetail", paramsDictionary); ReportingEngine.RegisterData(ReportTable, "GiftBatchDetail"); break; } } // switch // I'm not in the User Interface thread, so I can use an invoke here: Application.OpenForms[0].Invoke((ThreadStart) delegate { ReportingEngine.GenerateReport(Calc); }); } // PrintReportNoUi
/// <summary> /// Print out the Motivation Details using FastReports template. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void FilePrint(object sender, EventArgs e) { FastReportsWrapper ReportingEngine = new FastReportsWrapper("Motivation Details"); if (!ReportingEngine.LoadedOK) { ReportingEngine.ShowErrorPopup(); return; } ReportingEngine.RegisterData(FMainDS.AMotivationDetail, "MotivationDetail"); TRptCalculator Calc = new TRptCalculator(); ALedgerRow LedgerRow = FMainDS.ALedger[0]; Calc.AddParameter("param_ledger_number_i", LedgerRow.LedgerNumber); Calc.AddStringParameter("param_ledger_name", LedgerRow.LedgerName); if (ModifierKeys.HasFlag(Keys.Control)) { ReportingEngine.DesignReport(Calc); } else { ReportingEngine.GenerateReport(Calc); } }