private static TSubmitChangesResult SaveRecurringGLBatchTDS(ref GLBatchTDS AInspectDS) { Int32 LedgerNumber; Int32 BatchNumber; Int32 JournalNumber; Int32 TransactionNumber; Int32 Counter; bool recurrBatchTableInDataSet = (AInspectDS.ARecurringBatch != null); bool recurrJournalTableInDataSet = (AInspectDS.ARecurringJournal != null); bool recurrTransactionTableInDataSet = (AInspectDS.ARecurringTransaction != null); bool recurrTransAnalTableInDataSet = (AInspectDS.ARecurringTransAnalAttrib != null); TSubmitChangesResult SubmissionResult = new TSubmitChangesResult(); ARecurringJournalTable JournalTable = new ARecurringJournalTable(); ARecurringJournalRow TemplateJournalRow = JournalTable.NewRowTyped(false); ARecurringTransactionTable TransactionTable = new ARecurringTransactionTable(); ARecurringTransactionRow TemplateTransactionRow = TransactionTable.NewRowTyped(false); ARecurringTransAnalAttribTable TransAnalAttribTable = new ARecurringTransAnalAttribTable(); ARecurringTransAnalAttribRow TemplateTransAnalAttribRow = TransAnalAttribTable.NewRowTyped(false); GLBatchTDS DeletedDS = new GLBatchTDS(); ARecurringTransAnalAttribTable DeletedTransAnalAttribTable; // in this method we also think about deleted batches, journals, transactions where subsequent information // had not been loaded yet: a type of cascading delete is being used (real cascading delete currently does // not go down the number of levels needed). TDBTransaction Transaction = null; GLBatchTDS InspectDS = AInspectDS; DBAccess.GDBAccessObj.GetNewOrExistingAutoReadTransaction(IsolationLevel.Serializable, ref Transaction, delegate { if (recurrBatchTableInDataSet) { foreach (ARecurringBatchRow batch in InspectDS.ARecurringBatch.Rows) { if (batch.RowState == DataRowState.Deleted) { // need to use this way of retrieving data from deleted rows LedgerNumber = (Int32)batch[ARecurringBatchTable.ColumnLedgerNumberId, DataRowVersion.Original]; BatchNumber = (Int32)batch[ARecurringBatchTable.ColumnBatchNumberId, DataRowVersion.Original]; // load all depending journals, transactions and attributes and make sure they are also deleted via the dataset TemplateTransAnalAttribRow.LedgerNumber = LedgerNumber; TemplateTransAnalAttribRow.BatchNumber = BatchNumber; DeletedTransAnalAttribTable = ARecurringTransAnalAttribAccess.LoadUsingTemplate(TemplateTransAnalAttribRow, Transaction); for (Counter = DeletedTransAnalAttribTable.Count - 1; Counter >= 0; Counter--) { DeletedTransAnalAttribTable.Rows[Counter].Delete(); } InspectDS.Merge(DeletedTransAnalAttribTable); TemplateTransactionRow.LedgerNumber = LedgerNumber; TemplateTransactionRow.BatchNumber = BatchNumber; ARecurringTransactionAccess.LoadUsingTemplate(DeletedDS, TemplateTransactionRow, Transaction); for (Counter = DeletedDS.ARecurringTransaction.Count - 1; Counter >= 0; Counter--) { DeletedDS.ARecurringTransaction.Rows[Counter].Delete(); } InspectDS.Merge(DeletedDS.ARecurringTransaction); TemplateJournalRow.LedgerNumber = LedgerNumber; TemplateJournalRow.BatchNumber = BatchNumber; ARecurringJournalAccess.LoadUsingTemplate(DeletedDS, TemplateJournalRow, Transaction); for (Counter = DeletedDS.ARecurringJournal.Count - 1; Counter >= 0; Counter--) { DeletedDS.ARecurringJournal.Rows[Counter].Delete(); } InspectDS.Merge(DeletedDS.ARecurringJournal); } } } if (recurrJournalTableInDataSet) { foreach (ARecurringJournalRow journal in InspectDS.ARecurringJournal.Rows) { if (journal.RowState == DataRowState.Deleted) { // need to use this way of retrieving data from deleted rows LedgerNumber = (Int32)journal[ARecurringJournalTable.ColumnLedgerNumberId, DataRowVersion.Original]; BatchNumber = (Int32)journal[ARecurringJournalTable.ColumnBatchNumberId, DataRowVersion.Original]; JournalNumber = (Int32)journal[ARecurringJournalTable.ColumnJournalNumberId, DataRowVersion.Original]; // load all depending transactions and attributes and make sure they are also deleted via the dataset TemplateTransAnalAttribRow.LedgerNumber = LedgerNumber; TemplateTransAnalAttribRow.BatchNumber = BatchNumber; TemplateTransAnalAttribRow.JournalNumber = JournalNumber; DeletedTransAnalAttribTable = ARecurringTransAnalAttribAccess.LoadUsingTemplate(TemplateTransAnalAttribRow, Transaction); for (Counter = DeletedTransAnalAttribTable.Count - 1; Counter >= 0; Counter--) { DeletedTransAnalAttribTable.Rows[Counter].Delete(); } InspectDS.Merge(DeletedTransAnalAttribTable); TemplateTransactionRow.LedgerNumber = LedgerNumber; TemplateTransactionRow.BatchNumber = BatchNumber; TemplateTransactionRow.JournalNumber = JournalNumber; ARecurringTransactionAccess.LoadUsingTemplate(DeletedDS, TemplateTransactionRow, Transaction); for (Counter = DeletedDS.ARecurringTransaction.Count - 1; Counter >= 0; Counter--) { DeletedDS.ARecurringTransaction.Rows[Counter].Delete(); } InspectDS.Merge(DeletedDS.ARecurringTransaction); } } } if (recurrTransactionTableInDataSet) { foreach (ARecurringTransactionRow transaction in InspectDS.ARecurringTransaction.Rows) { if (transaction.RowState == DataRowState.Deleted) { // need to use this way of retrieving data from deleted rows LedgerNumber = (Int32)transaction[ARecurringTransactionTable.ColumnLedgerNumberId, DataRowVersion.Original]; BatchNumber = (Int32)transaction[ARecurringTransactionTable.ColumnBatchNumberId, DataRowVersion.Original]; JournalNumber = (Int32)transaction[ARecurringTransactionTable.ColumnJournalNumberId, DataRowVersion.Original]; TransactionNumber = (Int32)transaction[ARecurringTransactionTable.ColumnTransactionNumberId, DataRowVersion.Original]; // load all depending transactions and attributes and make sure they are also deleted via the dataset TemplateTransAnalAttribRow.LedgerNumber = LedgerNumber; TemplateTransAnalAttribRow.BatchNumber = BatchNumber; TemplateTransAnalAttribRow.JournalNumber = JournalNumber; TemplateTransAnalAttribRow.TransactionNumber = TransactionNumber; DeletedTransAnalAttribTable = ARecurringTransAnalAttribAccess.LoadUsingTemplate(TemplateTransAnalAttribRow, Transaction); for (Counter = DeletedTransAnalAttribTable.Count - 1; Counter >= 0; Counter--) { DeletedTransAnalAttribTable.Rows[Counter].Delete(); } InspectDS.Merge(DeletedTransAnalAttribTable); } } } }); // now submit the changes GLBatchTDSAccess.SubmitChanges(AInspectDS); SubmissionResult = TSubmitChangesResult.scrOK; if (recurrTransactionTableInDataSet) { //Accept deletion of Attributes to allow deletion of transactions if (recurrTransAnalTableInDataSet) { AInspectDS.ARecurringTransAnalAttrib.AcceptChanges(); } AInspectDS.ARecurringTransaction.AcceptChanges(); if (AInspectDS.ARecurringTransaction.Count > 0) { ARecurringTransactionRow tranR = (ARecurringTransactionRow)AInspectDS.ARecurringTransaction.Rows[0]; Int32 currentLedger = tranR.LedgerNumber; Int32 currentBatch = tranR.BatchNumber; Int32 currentJournal = tranR.JournalNumber; Int32 transToDelete = 0; try { //Check if any records have been marked for deletion DataRow[] foundTransactionForDeletion = AInspectDS.ARecurringTransaction.Select(String.Format("{0} = '{1}'", ARecurringTransactionTable.GetSubTypeDBName(), MFinanceConstants.MARKED_FOR_DELETION)); if (foundTransactionForDeletion.Length > 0) { ARecurringTransactionRow transRowClient = null; for (int i = 0; i < foundTransactionForDeletion.Length; i++) { transRowClient = (ARecurringTransactionRow)foundTransactionForDeletion[i]; transToDelete = transRowClient.TransactionNumber; TLogging.Log(String.Format("Recurring transaction to Delete: {0} from Journal: {1} in Batch: {2}", transToDelete, currentJournal, currentBatch)); transRowClient.Delete(); } //save changes GLBatchTDSAccess.SubmitChanges(AInspectDS); SubmissionResult = TSubmitChangesResult.scrOK; } } catch (Exception ex) { TLogging.Log("Saving DataSet: " + ex.Message); TLogging.Log(String.Format("Error trying to save transaction: {0} in Journal: {1}, Batch: {2}", transToDelete, currentJournal, currentBatch )); SubmissionResult = TSubmitChangesResult.scrError; } } } return SubmissionResult; }
public static GLBatchTDS LoadARecurringBatchAndContent(Int32 ALedgerNumber, Int32 ABatchNumber) { Boolean NewTransaction = false; TDBTransaction Transaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(IsolationLevel.ReadCommitted, TEnforceIsolationLevel.eilMinimum, out NewTransaction); GLBatchTDS MainDS = new GLBatchTDS(); ARecurringBatchAccess.LoadByPrimaryKey(MainDS, ALedgerNumber, ABatchNumber, Transaction); ARecurringJournalAccess.LoadViaARecurringBatch(MainDS, ALedgerNumber, ABatchNumber, Transaction); ARecurringTransactionTable TransactionTable = new ARecurringTransactionTable(); ARecurringTransactionRow TemplateTransactionRow = TransactionTable.NewRowTyped(false); TemplateTransactionRow.LedgerNumber = ALedgerNumber; TemplateTransactionRow.BatchNumber = ABatchNumber; ARecurringTransactionAccess.LoadUsingTemplate(MainDS, TemplateTransactionRow, Transaction); ARecurringTransAnalAttribTable TransAnalAttribTable = new ARecurringTransAnalAttribTable(); ARecurringTransAnalAttribRow TemplateTransAnalAttribRow = TransAnalAttribTable.NewRowTyped(false); TemplateTransAnalAttribRow.LedgerNumber = ALedgerNumber; TemplateTransAnalAttribRow.BatchNumber = ABatchNumber; ARecurringTransAnalAttribAccess.LoadUsingTemplate(MainDS, TemplateTransAnalAttribRow, Transaction); if (NewTransaction) { DBAccess.GDBAccessObj.RollbackTransaction(); } return MainDS; }
public static GLBatchTDS LoadARecurringJournalAndContent(Int32 ALedgerNumber, Int32 ABatchNumber) { #region Validate Arguments if (ALedgerNumber <= 0) { throw new EFinanceSystemInvalidLedgerNumberException(String.Format(Catalog.GetString( "Function:{0} - The Ledger number must be greater than 0!"), Utilities.GetMethodName(true)), ALedgerNumber); } else if (ABatchNumber <= 0) { throw new EFinanceSystemInvalidBatchNumberException(String.Format(Catalog.GetString( "Function:{0} - The Batch number must be greater than 0!"), Utilities.GetMethodName(true)), ALedgerNumber, ABatchNumber); } #endregion Validate Arguments GLBatchTDS MainDS = new GLBatchTDS(); TDBTransaction Transaction = null; try { DBAccess.GDBAccessObj.GetNewOrExistingAutoReadTransaction(IsolationLevel.ReadCommitted, TEnforceIsolationLevel.eilMinimum, ref Transaction, delegate { ARecurringJournalAccess.LoadViaARecurringBatch(MainDS, ALedgerNumber, ABatchNumber, Transaction); ARecurringTransactionTable TransactionTable = new ARecurringTransactionTable(); ARecurringTransactionRow TemplateTransactionRow = TransactionTable.NewRowTyped(false); TemplateTransactionRow.LedgerNumber = ALedgerNumber; TemplateTransactionRow.BatchNumber = ABatchNumber; ARecurringTransactionAccess.LoadUsingTemplate(MainDS, TemplateTransactionRow, Transaction); ARecurringTransAnalAttribTable TransAnalAttribTable = new ARecurringTransAnalAttribTable(); ARecurringTransAnalAttribRow TemplateTransAnalAttribRow = TransAnalAttribTable.NewRowTyped(false); TemplateTransAnalAttribRow.LedgerNumber = ALedgerNumber; TemplateTransAnalAttribRow.BatchNumber = ABatchNumber; ARecurringTransAnalAttribAccess.LoadUsingTemplate(MainDS, TemplateTransAnalAttribRow, Transaction); #region Validate Data if ((MainDS.ARecurringJournal.Count == 0) && (MainDS.ARecurringTransaction.Count > 0)) { throw new ApplicationException(String.Format(Catalog.GetString( "Function:{0} - Orphaned GL Transactions exist in Recurring GL Batch {1} in Ledger {2}!"), Utilities.GetMethodName(true), ABatchNumber, ALedgerNumber)); } else if (((MainDS.ARecurringJournal.Count == 0) || (MainDS.ARecurringTransaction.Count == 0)) && (MainDS.ARecurringTransAnalAttrib.Count > 0)) { throw new ApplicationException(String.Format(Catalog.GetString( "Function:{0} - Orphaned GL Transaction Analysis Attributes exist in Recurring GL Batch {1} in Ledger {2}!"), Utilities.GetMethodName(true), ABatchNumber, ALedgerNumber)); } #endregion Validate Data }); MainDS.AcceptChanges(); } catch (Exception ex) { TLogging.Log(String.Format("Method:{0} - Unexpected error!{1}{1}{2}", Utilities.GetMethodSignature(), Environment.NewLine, ex.Message)); throw ex; } return MainDS; }