Exemple #1
0
        /// <summary>
        /// Calculates the report, which is specified in the parameters table
        ///
        /// </summary>
        /// <returns>void</returns>
        public void Start(System.Data.DataTable AParameters)
        {
            FProgressID = "ReportCalculation" + Guid.NewGuid();
            TProgressTracker.InitProgressTracker(FProgressID, string.Empty, -1.0m);

            FParameterList = new TParameterList();
            FParameterList.LoadFromDataTable(AParameters);

            FSuccess = false;

            String PathStandardReports = TAppSettingsManager.GetValue("Reporting.PathStandardReports");
            String PathCustomReports   = TAppSettingsManager.GetValue("Reporting.PathCustomReports");

            FDatacalculator = new TRptDataCalculator(PathStandardReports, PathCustomReports);

            // setup the logging to go to the TProgressTracker
            TLogging.SetStatusBarProcedure(new TLogging.TStatusCallbackProcedure(WriteToStatusBar));

            string      session       = TSession.GetSessionID();
            ThreadStart myThreadStart = delegate {
                Run(session);
            };
            Thread TheThread = new Thread(myThreadStart);

            TheThread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
            TheThread.Name           = FProgressID + "_" + UserInfo.GetUserInfo().UserID + "__TReportGeneratorUIConnector.Start_Thread";
            TLogging.LogAtLevel(7, TheThread.Name + " starting.");
            TheThread.Start();
        }
Exemple #2
0
        public static DataSet GetOneYearMonthGivingDataSet(Dictionary <String, TVariant> AParameters)
        {
            FDbAdapter = new TReportingDbAdapter(false);
            TLogging.SetStatusBarProcedure(WriteToStatusBar);
            DataSet ReturnDataSet = new DataSet();

            // get recipients
            DataTable Recipients = TFinanceReportingWebConnector.RecipientGiftStatementRecipientTable(AParameters, FDbAdapter);

            if (FDbAdapter.IsCancelled || (Recipients == null))
            {
                return(null);
            }

            DataTable Donors = new DataTable("Donors");

            foreach (DataRow Row in Recipients.Rows)
            {
                // get donor information for each recipient
                Donors.Merge(TFinanceReportingWebConnector.OneYearMonthGivingDonorTable(AParameters, (Int64)Row["RecipientKey"], FDbAdapter));

                if (FDbAdapter.IsCancelled)
                {
                    return(null);
                }
            }

            ReturnDataSet.Tables.Add(Recipients);
            ReturnDataSet.Tables.Add(Donors);

            return((FDbAdapter.IsCancelled) ? null : ReturnDataSet);
        }
        public static DataSet GetReportDataSet(String AReportType, Dictionary <String, TVariant> AParameters)
        {
            TLogging.SetStatusBarProcedure(WriteToStatusBar);
            DataSet ResultSet = null;

            FDbAdapter = new TReportingDbAdapter(true);   // Uses a separate DB Connection.

            switch (AReportType)
            {
            /* Financial Development */

            case "GiftsOverMinimum":

                ResultSet = TFinanceReportingWebConnector.GiftsOverMinimum(AParameters, FDbAdapter);
                break;

            default:
                TLogging.Log("GetDataSetThread unknown ReportType: " + AReportType);
                break;
            }

            FDbAdapter.CloseConnection();

            if (FDbAdapter.IsCancelled)
            {
                ResultSet = null;
            }

            return(ResultSet);
        }
Exemple #4
0
        /// <summary>
        /// Calculates the report, which is specified in the parameters table
        ///
        /// </summary>
        /// <returns>void</returns>
        public void Start(System.Data.DataTable AParameters)
        {
            TRptUserFunctionsFinance.FlushSqlCache();
            FProgressID = "ReportCalculation" + Guid.NewGuid();
            TProgressTracker.InitProgressTracker(FProgressID, string.Empty, -1.0m);
            FParameterList = new TParameterList();
            FParameterList.LoadFromDataTable(AParameters);
            FSuccess = false;
            String PathStandardReports = TAppSettingsManager.GetValue("Reporting.PathStandardReports");
            String PathCustomReports   = TAppSettingsManager.GetValue("Reporting.PathCustomReports");

            FDatacalculator = new TRptDataCalculator(DBAccess.GDBAccessObj, PathStandardReports, PathCustomReports);

            // setup the logging to go to the TProgressTracker
            TLogging.SetStatusBarProcedure(new TLogging.TStatusCallbackProcedure(WriteToStatusBar));
            string      session       = TSession.GetSessionID();
            ThreadStart myThreadStart = delegate {
                Run(session);
            };
            Thread TheThread = new Thread(myThreadStart);

            TheThread.Name           = FProgressID;
            TheThread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
            TheThread.Start();
        }
Exemple #5
0
        /// <summary>
        /// the client can cancel the job
        /// </summary>
        /// <param name="AClientID"></param>
        static public bool CancelJob(string AClientID)
        {
            if (TSession.HasVariable(PROGRESSTRACKER + AClientID))
            {
                TProgressState state = ((JObject)TSession.GetVariable(PROGRESSTRACKER + AClientID)).ToObject <TProgressState>();

                TLogging.SetStatusBarProcedure(null);

                if (state.JobFinished == true)
                {
                    if (TLogging.DebugLevel >= DEBUG_PROGRESS)
                    {
                        TLogging.Log("Cannot cancel the job for " + AClientID + " because the job has already finished");
                    }
                }
                else
                {
                    state.CancelJob = true;

                    if (TLogging.DebugLevel >= DEBUG_PROGRESS)
                    {
                        TLogging.Log("Cancelled the job for " + AClientID);
                    }

                    TSession.SetVariable(PROGRESSTRACKER + AClientID, state);

                    return(true);
                }
            }

            return(false);
        }
Exemple #6
0
 /// <summary>
 /// constructor
 /// </summary>
 public MainForm()
 {
     //
     // The InitializeComponent() call is required for Windows Forms designer support.
     //
     InitializeComponent();
     new TLogging();
     TLogging.DebugLevel = 1;
     TLogging.SetStatusBarProcedure(WriteLogging);
 }
        public static DataTable GetReportDataTable(String AReportType, Dictionary <String, TVariant> AParameters)
        {
            FDbAdapter = new TReportingDbAdapter();
            TLogging.SetStatusBarProcedure(WriteToStatusBar);
            DataTable ResultTbl = null;

            switch (AReportType)
            {
            case "BalanceSheet":
                ResultTbl = TFinanceReportingWebConnector.BalanceSheetTable(AParameters, FDbAdapter);
                break;

            case "HOSA":
                ResultTbl = TFinanceReportingWebConnector.HosaGiftsTable(AParameters, FDbAdapter);
                break;

            case "Stewardship":
                ResultTbl = TFinanceReportingWebConnector.StewardshipTable(AParameters, FDbAdapter);
                break;

            case "IncomeExpense":
                ResultTbl = TFinanceReportingWebConnector.IncomeExpenseTable(AParameters, FDbAdapter);
                break;

            case "AFO":
                ResultTbl = TFinanceReportingWebConnector.AFOTable(AParameters, FDbAdapter);
                break;

            case "Executive Summary":
                ResultTbl = TFinanceReportingWebConnector.ExecutiveSummaryTable(AParameters, FDbAdapter);
                break;

            case "TrialBalance":
                ResultTbl = TFinanceReportingWebConnector.TrialBalanceTable(AParameters, FDbAdapter);
                break;

            case "GiftBatchDetail":
                ResultTbl = TFinanceReportingWebConnector.GiftBatchDetailTable(AParameters, FDbAdapter);
                break;

            case "RecipientTaxDeductPct":
                ResultTbl = TFinanceReportingWebConnector.RecipientTaxDeductPctTable(AParameters, FDbAdapter);
                break;

            default:
                TLogging.Log("GetDatatableThread unknown ReportType: " + AReportType);
                break;
            }

            return((FDbAdapter.IsCancelled) ? null : ResultTbl);
        }
Exemple #8
0
        /// <summary>
        /// Calculates the report, which is specified in the parameters table
        ///
        /// </summary>
        /// <returns>void</returns>
        public void Start(System.Data.DataTable AParameters)
        {
            FProgressID = "ReportCalculation" + Guid.NewGuid();
            TProgressTracker.InitProgressTracker(FProgressID, string.Empty, -1.0m);

            // First check whether the 'globally available' DB Connection isn't busy - we must not allow the start of a
            // Report Calculation when that is the case (as this would lead to a nested DB Transaction exception,
            // EDBTransactionBusyException).
            if (DBAccess.GDBAccessObj.Transaction != null)
            {
                FErrorMessage = Catalog.GetString(SharedConstants.NO_PARALLEL_EXECUTION_OF_XML_REPORTS_PREFIX +
                                                  "The OpenPetra Server is currently too busy to prepare this Report. " +
                                                  "Please retry once other running tasks (eg. a Report) are finished!");
                TProgressTracker.FinishJob(FProgressID);
                FSuccess = false;

                // Return to the Client immediately!
                return;
            }

            TRptUserFunctionsFinance.FlushSqlCache();

            FParameterList = new TParameterList();
            FParameterList.LoadFromDataTable(AParameters);

            FSuccess = false;

            String PathStandardReports = TAppSettingsManager.GetValue("Reporting.PathStandardReports");
            String PathCustomReports   = TAppSettingsManager.GetValue("Reporting.PathCustomReports");

            FDatacalculator = new TRptDataCalculator(DBAccess.GDBAccessObj, PathStandardReports, PathCustomReports);

            // setup the logging to go to the TProgressTracker
            TLogging.SetStatusBarProcedure(new TLogging.TStatusCallbackProcedure(WriteToStatusBar));

            string      session       = TSession.GetSessionID();
            ThreadStart myThreadStart = delegate {
                Run(session);
            };
            Thread TheThread = new Thread(myThreadStart);

            TheThread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
            TheThread.Name           = FProgressID + "_" + UserInfo.GUserInfo.UserID + "__TReportGeneratorUIConnector.Start_Thread";
            TLogging.LogAtLevel(7, TheThread.Name + " starting.");
            TheThread.Start();
        }
Exemple #9
0
        /// <summary>
        /// Calculates the report, which is specified in the parameters table
        ///
        /// </summary>
        /// <returns>void</returns>
        public void Start(System.Data.DataTable AParameters)
        {
            TRptUserFunctionsFinance.FlushSqlCache();
            this.FAsyncExecProgress = new TAsynchronousExecutionProgress();
            this.FAsyncExecProgress.ProgressState = TAsyncExecProgressState.Aeps_Executing;
            FParameterList = new TParameterList();
            FParameterList.LoadFromDataTable(AParameters);
            FSuccess = false;
            String PathStandardReports = TAppSettingsManager.GetValue("Reporting.PathStandardReports");
            String PathCustomReports   = TAppSettingsManager.GetValue("Reporting.PathCustomReports");

            FDatacalculator = new TRptDataCalculator(DBAccess.GDBAccessObj, PathStandardReports, PathCustomReports);

            // setup the logging to go to the FAsyncExecProgress.ProgressInformation
            TLogging.SetStatusBarProcedure(new TLogging.TStatusCallbackProcedure(WriteToStatusBar));
            Thread TheThread = new Thread(new ThreadStart(Run));

            TheThread.CurrentCulture = Thread.CurrentThread.CurrentCulture;
            TheThread.Start();
        }
Exemple #10
0
        private void GenerateReport()
        {
            try
            {
                FPreviewForm.Cursor = Cursors.WaitCursor;
                TLogging.SetStatusBarProcedure(FPetraUtilsObject.WriteToStatusBar);

                // calculate the report
                FCalculator = new TRptCalculator();
                FCalculator.GetParameters().LoadFromDataTable(FDetailParameters.ToDataTable());

                if (FCalculator.GenerateResultRemoteClient())
                {
                    if (TClientSettings.DebugLevel >= TClientSettings.DEBUGLEVEL_REPORTINGDATA)
                    {
                        FCalculator.GetParameters().Save(TClientSettings.PathLog + Path.DirectorySeparatorChar + "debugParameterReturn.xml", true);
                        FCalculator.GetResults().WriteCSV(
                            FCalculator.GetParameters(), TClientSettings.PathLog + Path.DirectorySeparatorChar + "debugResultReturn.csv");
                    }

                    FPreviewForm.Cursor = Cursors.Default;
                    object[] Args = new object[1];
                    Args[0] = FCalculator;
                    FPreviewForm.Invoke((System.Delegate) new TPreviewDelegate(FPreviewDelegate), Args);
                    TLogging.Log("", TLoggingType.ToStatusBar);
                }
                else
                {
                    // if generateResult failed
                    FPreviewForm.Cursor = Cursors.Default;

                    // EnableDisableToolbar(true);
                }
            }
            catch (Exception e)
            {
                TLogging.Log("Exception in GenerateReport: " + e.ToString());
                // EnableDisableToolbar(true);
            }
        }
Exemple #11
0
        /// <summary>
        /// the server will set the job to finished
        /// </summary>
        static public bool FinishJob(string AClientID)
        {
            if (TSession.HasVariable(PROGRESSTRACKER + AClientID))
            {
                TProgressState state = ((JObject)TSession.GetVariable(PROGRESSTRACKER + AClientID)).ToObject <TProgressState>();

                state.JobFinished = true;

                if (TLogging.DebugLevel >= DEBUG_PROGRESS)
                {
                    TLogging.Log("Finished the job for " + AClientID);
                }

                TSession.SetVariable(PROGRESSTRACKER + AClientID, state);

                TLogging.SetStatusBarProcedure(null);

                return(true);
            }

            return(false);
        }
Exemple #12
0
        /// <summary>
        /// to be called from PetraClient
        /// the latest patch zip files have already been copied;
        /// </summary>
        public static void PatchRemoteInstallation()
        {
            String           oldPatchVersion;
            TPetraPatchTools patchTools;
            Boolean          startPetraClient;

            System.Diagnostics.Process PetraClientProcess;
            startPetraClient = true;
            TLogging.SetStatusBarProcedure(new TLogging.TStatusCallbackProcedure(WriteToStatusWindow));
            patchTools =
                new TPetraPatchTools(TAppSettingsManager.GetValue("OpenPetra.Path"),
                                     TAppSettingsManager.GetValue("OpenPetra.Path") + Path.DirectorySeparatorChar + "bin" + TPatchTools.OPENPETRA_VERSIONPREFIX,
                                     TAppSettingsManager.GetValue("OpenPetra.PathTemp"),
                                     "",
                                     TAppSettingsManager.GetValue("OpenPetra.Path.Patches"),
                                     TAppSettingsManager.GetValue("OpenPetra.Path.RemotePatches", false));

            if (patchTools.CheckForRecentPatch())
            {
                oldPatchVersion = patchTools.GetCurrentPatchVersion();

                if (patchTools.PatchTheFiles())
                {
                    patchTools.CheckForRecentPatch();
                    TLogging.Log("The patch was installed successfully.");
                    TLogging.Log("Your OpenPetra was on patch " + oldPatchVersion + ", " + "and is now on patch " + patchTools.GetCurrentPatchVersion());
                }
                else
                {
                    startPetraClient = false;
                }
            }
            else
            {
                // todo: will this ever be executed? this should be checked by PetraClient
                if ((!patchTools.GetCurrentPatchVersion().Equals(patchTools.GetLatestPatchVersion())))
                {
                    TLogging.Log("Problem: You don't have all patches that are necessary for patching to the latest patch.");
                }
                else
                {
                    TLogging.Log("Note: There is no new patch to be installed.");
                }
            }

            if (StatusWindowThread != null)
            {
                StatusWindowThread.Join();
            }

            if (startPetraClient)
            {
                // restart Petra Client if patch was successful
                PetraClientProcess = new System.Diagnostics.Process();
                PetraClientProcess.EnableRaisingEvents = false;
                PetraClientProcess.StartInfo.FileName  = TAppSettingsManager.GetValue("OpenPetra.Path.Bin") + Path.DirectorySeparatorChar +
                                                         "PetraClient.exe";
                PetraClientProcess.StartInfo.Arguments   = "-C:\"" + TAppSettingsManager.GetValue("ClientConfig") + "\"";
                PetraClientProcess.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
                PetraClientProcess.Start();
            }
        }
Exemple #13
0
        public static DataTable GetReportDataTable(String AReportType, Dictionary <String, TVariant> AParameters)
        {
            TLogging.SetStatusBarProcedure(WriteToStatusBar);
            DataTable ResultTbl = null;

            switch (AReportType)
            {
            /* GL Reports */

            case "BalanceSheet":

                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.BalanceSheetTable(AParameters, FDbAdapter);
                break;

            case "FieldGifts":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.KeyMinGiftsTable(AParameters, FDbAdapter);
                break;

            case "HOSA":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.HosaGiftsTable(AParameters, FDbAdapter);
                break;

            case "Stewardship":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.StewardshipTable(AParameters, FDbAdapter);
                break;

            case "Fees":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.FeesTable(AParameters, FDbAdapter);
                break;

            case "StewardshipForPeriod":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.StewardshipForPeriodTable(AParameters, FDbAdapter);
                break;

            case "IncomeExpense":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.IncomeExpenseTable(AParameters, FDbAdapter);
                break;

            case "AFO":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.AFOTable(AParameters, FDbAdapter);
                break;

            case "Executive Summary":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.ExecutiveSummaryTable(AParameters, FDbAdapter);
                break;

            case "TrialBalance":
                FDbAdapter = new TReportingDbAdapter(false);

                ResultTbl = TFinanceReportingWebConnector.TrialBalanceTable(AParameters, FDbAdapter);
                break;

            case "SurplusDeficit":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.SurplusDeficitTable(AParameters, FDbAdapter);
                break;

            /* Gift Reports */

            case "GiftBatchDetail":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.GiftBatchDetailTable(AParameters, FDbAdapter);
                break;

            case "RecipientTaxDeductPct":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.RecipientTaxDeductPctTable(AParameters, FDbAdapter);
                break;

            case "FieldLeaderGiftSummary":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.FieldLeaderGiftSummary(AParameters, FDbAdapter);
                break;

            case "TotalGiftsThroughField":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.TotalGiftsThroughField(AParameters, FDbAdapter);
                break;

            case "MotivationResponse":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.

                ResultTbl = TFinanceReportingWebConnector.MotivationResponse(AParameters, FDbAdapter);
                break;

            case "DonorGiftsToField":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.
                ResultTbl  = TFinanceReportingWebConnector.DonorGiftsToField(AParameters, FDbAdapter);
                break;

            case "GiftDestination":
                FDbAdapter = new TReportingDbAdapter(false);
                ResultTbl  = TFinanceReportingWebConnector.GiftDestination(AParameters, FDbAdapter);
                break;

            case "TotalForRecipients":
                FDbAdapter = new TReportingDbAdapter(false);
                ResultTbl  = TFinanceReportingWebConnector.TotalForRecipients(AParameters, FDbAdapter);
                break;

            /* Financial Development */

            case "SYBUNT":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.
                ResultTbl  = TFinanceReportingWebConnector.SYBUNTTable(AParameters, FDbAdapter);
                break;

            case "GiftsOverMinimum":
                FDbAdapter = new TReportingDbAdapter(true);       // Uses a separate DB Connection.
                ResultTbl  = TFinanceReportingWebConnector.GiftsOverMinimum(AParameters, FDbAdapter);
                break;

            default:
                TLogging.Log("GetDatatableThread unknown ReportType: " + AReportType);
                break;
            }

            if (FDbAdapter != null)
            {
                FDbAdapter.CloseConnection();

                if (FDbAdapter.IsCancelled)
                {
                    ResultTbl = null;
                }
            }

            return(ResultTbl);
        }
Exemple #14
0
        public static DataSet GetRecipientGiftStatementDataSet(Dictionary <String, TVariant> AParameters)
        {
            string ReportType = AParameters["param_report_type"].ToString();

            FDbAdapter = new TReportingDbAdapter(false);
            TLogging.SetStatusBarProcedure(WriteToStatusBar);
            DataSet ReturnDataSet = new DataSet();

            // get recipients
            DataTable Recipients = TFinanceReportingWebConnector.RecipientGiftStatementRecipientTable(AParameters, FDbAdapter);

            if (FDbAdapter.IsCancelled || (Recipients == null))
            {
                return(null);
            }

            DataTable RecipientTotals = new DataTable("RecipientTotals");

            RecipientTotals.Columns.Add("PreviousYearTotal", typeof(decimal));
            RecipientTotals.Columns.Add("CurrentYearTotal", typeof(decimal));
            DataTable Donors = new DataTable("Donors");

            foreach (DataRow Row in Recipients.Rows)
            {
                if (ReportType == "Complete")
                {
                    // get year totals for recipient
                    RecipientTotals.Merge(TFinanceReportingWebConnector.RecipientGiftStatementTotalsTable(AParameters, (Int64)Row["RecipientKey"],
                                                                                                          FDbAdapter));
                }

                // get donor information for each recipient
                Donors.Merge(TFinanceReportingWebConnector.RecipientGiftStatementDonorTable(AParameters, (Int64)Row["RecipientKey"], FDbAdapter));

                if (FDbAdapter.IsCancelled)
                {
                    return(null);
                }
            }

            DataView  View           = new DataView(Donors);
            DataTable DistinctDonors = new DataTable();

            if (View.Count > 0)
            {
                DistinctDonors = View.ToTable(true, "DonorKey");
            }

            DataTable DonorAddresses = new DataTable("DonorAddresses");

            if ((ReportType == "Complete") || (ReportType == "Donors Only"))
            {
                foreach (DataRow Row in DistinctDonors.Rows)
                {
                    // get best address for each distinct donor
                    DonorAddresses.Merge(TFinanceReportingWebConnector.RecipientGiftStatementDonorAddressesTable(Convert.ToInt64(Row["DonorKey"]),
                                                                                                                 FDbAdapter));

                    if (FDbAdapter.IsCancelled)
                    {
                        return(null);
                    }
                }
            }
            else
            {
                DonorAddresses.Merge(DistinctDonors);
            }

            // We only want distinct donors for this report (i.e. no more than one per recipient)
            if (ReportType == "Donors Only")
            {
                if (View.Count > 0)
                {
                    DistinctDonors = View.ToTable(true, "DonorKey", "DonorName", "RecipientKey");
                    Donors.Clear();
                    Donors.Merge(DistinctDonors);
                }
                else // I should return an empty table with just columns, to keep the client happy:
                {
                    DistinctDonors = new DataTable();
                    DistinctDonors.Columns.Add("DonorKey", typeof(Int64));
                    DistinctDonors.Columns.Add("DonorName", typeof(String));
                    DistinctDonors.Columns.Add("RecipientKey", typeof(Int64));
                }
            }

            ReturnDataSet.Tables.Add(Recipients);
            ReturnDataSet.Tables.Add(RecipientTotals);
            ReturnDataSet.Tables.Add(Donors);
            ReturnDataSet.Tables.Add(DonorAddresses);

            return((FDbAdapter.IsCancelled) ? null : ReturnDataSet);
        }