コード例 #1
0
ファイル: Extracts.cs プロジェクト: merbst/openpetra
        /// <summary>
        /// Adds a Partner to an Extract, if they are not already present
        /// </summary>
        /// <param name="APartnerKey">PartnerKey of Partner</param>
        /// <param name="ALocationPK">Location PK of a Partner's PartnerLocation
        /// (usually the LocationPK of the 'Best Address' of the Partner).</param>
        /// <param name="AExtractId">ExtractId of the Extract that the Partner should
        /// get added to.</param>
        /// <returns>True if the Partner was added to the Extract, otherwise false.</returns>
        public static bool AddPartnerToExtract(Int64 APartnerKey,
                                               TLocationPK ALocationPK, int AExtractId)
        {
            TDBTransaction Transaction  = null;
            bool           SubmissionOK = false;
            MExtractTable  TemplateTable;
            MExtractRow    TemplateRow;
            MExtractRow    NewRow;

            if (APartnerKey > 0)
            {
                DBAccess.GDBAccessObj.GetNewOrExistingAutoTransaction(IsolationLevel.Serializable, ref Transaction, ref SubmissionOK,
                                                                      delegate
                {
                    /*
                     * First check whether the Partner isn't already in that Extract
                     */
                    TemplateTable          = new MExtractTable();
                    TemplateRow            = TemplateTable.NewRowTyped(false);
                    TemplateRow.ExtractId  = AExtractId;
                    TemplateRow.PartnerKey = APartnerKey;

                    if (MExtractAccess.CountUsingTemplate(TemplateRow, null, Transaction) == 0)
                    {
                        /*
                         * Add Partner to Extract.
                         */
                        NewRow             = TemplateTable.NewRowTyped(false);
                        NewRow.ExtractId   = AExtractId;
                        NewRow.PartnerKey  = APartnerKey;
                        NewRow.SiteKey     = ALocationPK.SiteKey;
                        NewRow.LocationKey = ALocationPK.LocationKey;
                        TemplateTable.Rows.Add(NewRow);

                        MExtractAccess.SubmitChanges(TemplateTable, Transaction);

                        SubmissionOK = true;
                    }
                    else
                    {
                        // Partner is already in that Extract -> Partner does not get added.
                        SubmissionOK = false;
                    }
                });
            }
            else
            {
                // Invalid PartnerKey -> return false;
                SubmissionOK = false;
            }

            return(SubmissionOK);
        }
コード例 #2
0
ファイル: Extracts.cs プロジェクト: Davincier/openpetra
        /// <summary>
        /// extend an extract from a list of best addresses
        /// </summary>
        /// <param name="AExtractId">Extract Id of the Extract to extend</param>
        /// <param name="APartnerKeysTable"></param>
        /// <param name="APartnerKeyColumn">number of the column that contains the partner keys</param>
        /// <param name="ASiteKeyColumn">number of the column that contains the site keys</param>
        /// <param name="ALocationKeyColumn">number of the column that contains the location keys</param>
        /// <param name="AIgnoreDuplicates">true if duplicates should be looked out for. Can be set to false if called only once and not several times per extract.</param>
        public static void ExtendExtractFromListOfPartnerKeys(
            Int32 AExtractId,
            DataTable APartnerKeysTable,
            Int32 APartnerKeyColumn,
            Int32 ASiteKeyColumn,
            Int32 ALocationKeyColumn,
            bool AIgnoreDuplicates)
        {
            int RecordCounter = 0;
            PPartnerLocationTable PartnerLocationKeysTable;
            Int64 PartnerKey;

            TDBTransaction Transaction = null;
            bool SubmissionOK = true;

            DBAccess.GDBAccessObj.GetNewOrExistingAutoTransaction(IsolationLevel.Serializable, ref Transaction, ref SubmissionOK,
                delegate
                {
                    MExtractTable ExtractTable = new MExtractTable();
                    ExtractTable = MExtractAccess.LoadViaMExtractMaster(AExtractId, Transaction);

                    // Location Keys need to be determined as extracts do not only need partner keys but
                    // also Location Keys.
                    DetermineBestLocationKeys(APartnerKeysTable, APartnerKeyColumn, ASiteKeyColumn,
                        ALocationKeyColumn, out PartnerLocationKeysTable,
                        Transaction);

                    // use the returned table which contains partner and location keys to build the extract
                    foreach (PPartnerLocationRow PartnerLocationRow in PartnerLocationKeysTable.Rows)
                    {
                        PartnerKey = Convert.ToInt64(PartnerLocationRow[PPartnerLocationTable.GetPartnerKeyDBName()]);

                        if (PartnerKey > 0)
                        {
                            RecordCounter += 1;
                            TLogging.LogAtLevel(1, "Preparing Partner " + PartnerKey + " (Record Number " + RecordCounter + ")");

                            // add row for partner to extract and fill with contents
                            MExtractRow NewRow = ExtractTable.NewRowTyped();
                            NewRow.ExtractId = AExtractId;
                            NewRow.PartnerKey = PartnerKey;
                            NewRow.SiteKey = Convert.ToInt64(PartnerLocationRow[PPartnerLocationTable.GetSiteKeyDBName()]);
                            NewRow.LocationKey = Convert.ToInt32(PartnerLocationRow[PPartnerLocationTable.GetLocationKeyDBName()]);

                            // only add row if it does not already exist for this partner
                            if (AIgnoreDuplicates || !ExtractTable.Rows.Contains(new object[] { NewRow.ExtractId, NewRow.PartnerKey, NewRow.SiteKey }))
                            {
                                ExtractTable.Rows.Add(NewRow);
                            }
                        }
                    }

                    if (ExtractTable.Rows.Count > 0)
                    {
                        // update field in extract master for quick access to number of partners in extract
                        MExtractMasterTable ExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(AExtractId, Transaction);
                        ExtractMaster[0].KeyCount = ExtractTable.Rows.Count;

                        ExtractTable.ThrowAwayAfterSubmitChanges = true; // no need to keep data as this increases speed significantly

                        MExtractAccess.SubmitChanges(ExtractTable, Transaction);

                        MExtractMasterAccess.SubmitChanges(ExtractMaster, Transaction);
                    }
                });
        }
コード例 #3
0
ファイル: Extracts.cs プロジェクト: Davincier/openpetra
        /// <summary>
        /// Adds a Partner to an Extract, if they are not already present
        /// </summary>
        /// <param name="APartnerKey">PartnerKey of Partner</param>
        /// <param name="ALocationPK">Location PK of a Partner's PartnerLocation
        /// (usually the LocationPK of the 'Best Address' of the Partner).</param>
        /// <param name="AExtractId">ExtractId of the Extract that the Partner should
        /// get added to.</param>
        /// <returns>True if the Partner was added to the Extract, otherwise false.</returns>
        public static bool AddPartnerToExtract(Int64 APartnerKey,
            TLocationPK ALocationPK, int AExtractId)
        {
            TDBTransaction Transaction = null;
            bool SubmissionOK = false;
            MExtractTable TemplateTable;
            MExtractRow TemplateRow;
            MExtractRow NewRow;

            if (APartnerKey > 0)
            {
                DBAccess.GDBAccessObj.GetNewOrExistingAutoTransaction(IsolationLevel.Serializable, ref Transaction, ref SubmissionOK,
                    delegate
                    {
                        /*
                         * First check whether the Partner isn't already in that Extract
                         */
                        TemplateTable = new MExtractTable();
                        TemplateRow = TemplateTable.NewRowTyped(false);
                        TemplateRow.ExtractId = AExtractId;
                        TemplateRow.PartnerKey = APartnerKey;

                        if (MExtractAccess.CountUsingTemplate(TemplateRow, null, Transaction) == 0)
                        {
                            /*
                             * Add Partner to Extract.
                             */
                            NewRow = TemplateTable.NewRowTyped(false);
                            NewRow.ExtractId = AExtractId;
                            NewRow.PartnerKey = APartnerKey;
                            NewRow.SiteKey = ALocationPK.SiteKey;
                            NewRow.LocationKey = ALocationPK.LocationKey;
                            TemplateTable.Rows.Add(NewRow);

                            MExtractAccess.SubmitChanges(TemplateTable, Transaction);

                            SubmissionOK = true;
                        }
                        else
                        {
                            // Partner is already in that Extract -> Partner does not get added.
                            SubmissionOK = false;
                        }
                    });
            }
            else
            {
                // Invalid PartnerKey -> return false;
                SubmissionOK = false;
            }

            return SubmissionOK;
        }
コード例 #4
0
ファイル: Extracts.cs プロジェクト: merbst/openpetra
        /// <summary>
        /// extend an extract from a list of best addresses
        /// </summary>
        /// <param name="AExtractId">Extract Id of the Extract to extend</param>
        /// <param name="APartnerKeysTable"></param>
        /// <param name="APartnerKeyColumn">number of the column that contains the partner keys</param>
        /// <param name="ASiteKeyColumn">number of the column that contains the site keys</param>
        /// <param name="ALocationKeyColumn">number of the column that contains the location keys</param>
        /// <param name="AKeyCount">The number of keys that were actually added to the extract (any duplicates are excluded)</param>
        /// <param name="AIgnoredKeyList">A reference to a List of long.  If not null the server will fill it with the partner keys that were ignored.  Does not include duplicates.</param>
        /// <param name="AIgnoreDuplicates">true if duplicates should be looked out for. Can be set to false if called only once and not several times per extract.</param>
        /// <param name="AIgnoreInactive">true if inactive partners should be ignored</param>
        /// <param name="AIgnoreNonMailingLocations">true to ignore if the partner's best address is a non-mailing location</param>
        /// <param name="AIgnoreNoSolicitations">true to ignore partners where the No Solicitations flag is set</param>
        public static void ExtendExtractFromListOfPartnerKeys(
            Int32 AExtractId,
            DataTable APartnerKeysTable,
            Int32 APartnerKeyColumn,
            Int32 ASiteKeyColumn,
            Int32 ALocationKeyColumn,
            out Int32 AKeyCount,
            out List <long> AIgnoredKeyList,
            bool AIgnoreDuplicates,
            bool AIgnoreInactive,
            bool AIgnoreNonMailingLocations,
            bool AIgnoreNoSolicitations)
        {
            int RecordCounter = 0;
            PPartnerLocationTable PartnerLocationKeysTable;
            Int64 PartnerKey;

            List <long> ignoredKeyList = new List <long>();

            TDBTransaction Transaction  = null;
            bool           SubmissionOK = true;

            DBAccess.GDBAccessObj.GetNewOrExistingAutoTransaction(IsolationLevel.Serializable, ref Transaction, ref SubmissionOK,
                                                                  delegate
            {
                // Pre-process the table to remove partner rows that do not match the filter requirements
                for (int i = APartnerKeysTable.Rows.Count - 1; i >= 0; i--)
                {
                    DataRow dr       = APartnerKeysTable.Rows[i];
                    Int64 partnerKey = Convert.ToInt64(dr[APartnerKeyColumn]);

                    // Get a partner record containing our fields of interest
                    StringCollection fields = new StringCollection();
                    fields.Add(PPartnerTable.GetStatusCodeDBName());
                    fields.Add(PPartnerTable.GetNoSolicitationsDBName());
                    DataTable dt = PPartnerAccess.LoadByPrimaryKey(partnerKey, fields, Transaction);

                    if (dt.Rows.Count > 0)
                    {
                        if (AIgnoreInactive || AIgnoreNoSolicitations)
                        {
                            bool isActive         = false;
                            bool isNoSolicitation = false;
                            object o = dt.Rows[0][PPartnerTable.GetStatusCodeDBName()];

                            if (o != null)
                            {
                                TStdPartnerStatusCode statusCode = SharedTypes.StdPartnerStatusCodeStringToEnum(o.ToString());
                                isActive = (statusCode == TStdPartnerStatusCode.spscACTIVE);
                            }

                            o = dt.Rows[0][PPartnerTable.GetNoSolicitationsDBName()];

                            if (o != null)
                            {
                                isNoSolicitation = Convert.ToBoolean(o);
                            }

                            if ((AIgnoreInactive && !isActive) || (AIgnoreNoSolicitations && isNoSolicitation))
                            {
                                ignoredKeyList.Add(partnerKey);
                                APartnerKeysTable.Rows.Remove(dr);
                            }
                        }
                    }
                    else
                    {
                        ignoredKeyList.Add(partnerKey);
                    }
                }

                MExtractTable ExtractTable = new MExtractTable();
                ExtractTable = MExtractAccess.LoadViaMExtractMaster(AExtractId, Transaction);

                // Location Keys need to be determined as extracts do not only need partner keys but
                // also Location Keys.
                DetermineBestLocationKeys(APartnerKeysTable, APartnerKeyColumn, ASiteKeyColumn,
                                          ALocationKeyColumn, out PartnerLocationKeysTable,
                                          Transaction);

                // use the returned table which contains partner and location keys to build the extract
                foreach (PPartnerLocationRow PartnerLocationRow in PartnerLocationKeysTable.Rows)
                {
                    PartnerKey = PartnerLocationRow.PartnerKey;

                    if (PartnerKey > 0)
                    {
                        if (AIgnoreNonMailingLocations)
                        {
                            // The PartnerLocationRow only contains the PK fields so now we need to get the SendMail column
                            StringCollection fields = new StringCollection();
                            fields.Add(PPartnerLocationTable.GetSendMailDBName());

                            PPartnerLocationTable t =
                                PPartnerLocationAccess.LoadByPrimaryKey(PartnerKey, PartnerLocationRow.SiteKey,
                                                                        PartnerLocationRow.LocationKey, fields, Transaction);

                            if ((t != null) && (t.Rows.Count > 0) && (((PPartnerLocationRow)t.Rows[0]).SendMail == false))
                            {
                                ignoredKeyList.Add(PartnerKey);
                                continue;
                            }
                        }

                        RecordCounter += 1;
                        TLogging.LogAtLevel(1, "Preparing Partner " + PartnerKey + " (Record Number " + RecordCounter + ")");

                        // add row for partner to extract and fill with contents
                        MExtractRow NewRow = ExtractTable.NewRowTyped();
                        NewRow.ExtractId   = AExtractId;
                        NewRow.PartnerKey  = PartnerKey;
                        NewRow.SiteKey     = Convert.ToInt64(PartnerLocationRow[PPartnerLocationTable.GetSiteKeyDBName()]);
                        NewRow.LocationKey = Convert.ToInt32(PartnerLocationRow[PPartnerLocationTable.GetLocationKeyDBName()]);

                        // only add row if it does not already exist for this partner
                        if (AIgnoreDuplicates || !ExtractTable.Rows.Contains(new object[] { NewRow.ExtractId, NewRow.PartnerKey, NewRow.SiteKey }))
                        {
                            ExtractTable.Rows.Add(NewRow);
                        }
                    }
                }

                if (ExtractTable.Rows.Count > 0)
                {
                    // update field in extract master for quick access to number of partners in extract
                    MExtractMasterTable ExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(AExtractId, Transaction);
                    ExtractMaster[0].KeyCount         = ExtractTable.Rows.Count;

                    ExtractTable.ThrowAwayAfterSubmitChanges = true;     // no need to keep data as this increases speed significantly

                    MExtractAccess.SubmitChanges(ExtractTable, Transaction);

                    MExtractMasterAccess.SubmitChanges(ExtractMaster, Transaction);
                }
            });

            AKeyCount       = RecordCounter;
            AIgnoredKeyList = ignoredKeyList;
        }
コード例 #5
0
ファイル: Extracts.cs プロジェクト: jsuen123/openpetragit
        /// <summary>
        /// Adds a Partner to an Extract, if they are not already present
        /// </summary>
        /// <param name="APartnerKey">PartnerKey of Partner</param>
        /// <param name="ALocationPK">Location PK of a Partner's PartnerLocation
        /// (usually the LocationPK of the 'Best Address' of the Partner).</param>
        /// <param name="AExtractId">ExtractId of the Extract that the Partner should
        /// get added to.</param>
        /// <returns>True if the Partner was added to the Extract, otherwise false.</returns>
        public static bool AddPartnerToExtract(Int64 APartnerKey,
                                               TLocationPK ALocationPK, int AExtractId)
        {
            bool           ReturnValue;
            TDBTransaction WriteTransaction;
            MExtractTable  TemplateTable;
            MExtractRow    TemplateRow;
            MExtractRow    NewRow;
            Boolean        NewTransaction;

            if (APartnerKey > 0)
            {
                WriteTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(
                    IsolationLevel.Serializable, TEnforceIsolationLevel.eilMinimum, out NewTransaction);

                try
                {
                    /*
                     * First check whether the Partner isn't already in that Extract
                     */
                    TemplateTable          = new MExtractTable();
                    TemplateRow            = TemplateTable.NewRowTyped(false);
                    TemplateRow.ExtractId  = AExtractId;
                    TemplateRow.PartnerKey = APartnerKey;

                    if (MExtractAccess.CountUsingTemplate(TemplateRow, null, WriteTransaction) == 0)
                    {
                        /*
                         * Add Partner to Extract.
                         */
                        NewRow             = TemplateTable.NewRowTyped(false);
                        NewRow.ExtractId   = AExtractId;
                        NewRow.PartnerKey  = APartnerKey;
                        NewRow.SiteKey     = ALocationPK.SiteKey;
                        NewRow.LocationKey = ALocationPK.LocationKey;
                        TemplateTable.Rows.Add(NewRow);

                        MExtractAccess.SubmitChanges(TemplateTable, WriteTransaction);

                        ReturnValue = true;
                    }
                    else
                    {
                        // Partner is already in that Extract -> Partner does not get added.
                        ReturnValue = false;
                    }

                    if (NewTransaction)
                    {
                        DBAccess.GDBAccessObj.CommitTransaction();
                        TLogging.LogAtLevel(8, "TExtractsHandling.AddPartnerToExtract: committed own transaction!");
                    }
                }
                catch (Exception Exc)
                {
                    TLogging.Log("An Exception occured while adding a Partner to an Extract:" + Environment.NewLine + Exc.ToString());

                    if (NewTransaction)
                    {
                        DBAccess.GDBAccessObj.RollbackTransaction();
                    }

                    throw;
                }
            }
            else
            {
                // Invalid PartnerKey -> return false;
                ReturnValue = false;
            }

            return(ReturnValue);
        }
コード例 #6
0
ファイル: Extracts.cs プロジェクト: jsuen123/openpetragit
        /// <summary>
        /// extend an extract from a list of best addresses
        /// </summary>
        /// <param name="AExtractId">Extract Id of the Extract to extend</param>
        /// <param name="APartnerKeysTable"></param>
        /// <param name="APartnerKeyColumn">number of the column that contains the partner keys</param>
        /// <param name="ASiteKeyColumn">number of the column that contains the site keys</param>
        /// <param name="ALocationKeyColumn">number of the column that contains the location keys</param>
        /// <param name="AIgnoreDuplicates">true if duplicates should be looked out for. Can be set to false if called only once and not several times per extract.</param>
        /// <param name="ACommitTransaction">true if transaction should be committed at end of method</param>
        public static void ExtendExtractFromListOfPartnerKeys(
            Int32 AExtractId,
            DataTable APartnerKeysTable,
            Int32 APartnerKeyColumn,
            Int32 ASiteKeyColumn,
            Int32 ALocationKeyColumn,
            bool AIgnoreDuplicates,
            bool ACommitTransaction)
        {
            Boolean NewTransaction;
            int     RecordCounter = 0;
            PPartnerLocationTable PartnerLocationKeysTable;
            Int64 PartnerKey;

            TDBTransaction WriteTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(IsolationLevel.Serializable,
                                                                                                TEnforceIsolationLevel.eilMinimum, out NewTransaction);

            try
            {
                MExtractTable ExtractTable = new MExtractTable();
                ExtractTable = MExtractAccess.LoadViaMExtractMaster(AExtractId, WriteTransaction);

                // Location Keys need to be determined as extracts do not only need partner keys but
                // also Location Keys.
                DetermineBestLocationKeys(APartnerKeysTable, APartnerKeyColumn, ASiteKeyColumn,
                                          ALocationKeyColumn, out PartnerLocationKeysTable,
                                          WriteTransaction);

                // use the returned table which contains partner and location keys to build the extract
                foreach (PPartnerLocationRow PartnerLocationRow in PartnerLocationKeysTable.Rows)
                {
                    PartnerKey = Convert.ToInt64(PartnerLocationRow[PPartnerLocationTable.GetPartnerKeyDBName()]);

                    if (PartnerKey > 0)
                    {
                        RecordCounter += 1;
                        TLogging.Log("Preparing Partner " + PartnerKey.ToString() + " (Record Number " + RecordCounter.ToString() + ")");

                        // add row for partner to extract and fill with contents
                        MExtractRow NewRow = ExtractTable.NewRowTyped();
                        NewRow.ExtractId   = AExtractId;
                        NewRow.PartnerKey  = PartnerKey;
                        NewRow.SiteKey     = Convert.ToInt64(PartnerLocationRow[PPartnerLocationTable.GetSiteKeyDBName()]);
                        NewRow.LocationKey = Convert.ToInt32(PartnerLocationRow[PPartnerLocationTable.GetLocationKeyDBName()]);

                        // only add row if it does not already exist for this partner
                        if (AIgnoreDuplicates || !ExtractTable.Rows.Contains(new object[] { NewRow.ExtractId, NewRow.PartnerKey, NewRow.SiteKey }))
                        {
                            ExtractTable.Rows.Add(NewRow);
                        }
                    }
                }

                if (ExtractTable.Rows.Count > 0)
                {
                    // update field in extract master for quick access to number of partners in extract
                    MExtractMasterTable ExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(AExtractId, WriteTransaction);
                    ExtractMaster[0].KeyCount = ExtractTable.Rows.Count;

                    ExtractTable.ThrowAwayAfterSubmitChanges = true; // no need to keep data as this increases speed significantly

                    MExtractAccess.SubmitChanges(ExtractTable, WriteTransaction);

                    MExtractMasterAccess.SubmitChanges(ExtractMaster, WriteTransaction);
                }

                if (ACommitTransaction)
                {
                    DBAccess.GDBAccessObj.CommitTransaction();
                }
            }
            catch (Exception Exc)
            {
                TLogging.Log("An Exception occured while extending an Extract from a list of Partner Keys:" + Environment.NewLine + Exc.ToString());

                if (NewTransaction)
                {
                    DBAccess.GDBAccessObj.RollbackTransaction();
                }

                throw;
            }
        }
コード例 #7
0
ファイル: ExtractMaster.cs プロジェクト: Davincier/openpetra
        public static Boolean IntersectExtracts(String ANewExtractName,
            String ANewExtractDescription,
            List <Int32>AIntersectExtractIdList,
            out Int32 ANewExtractId)
        {
            Boolean ResultValue = true;
            Boolean ExtractAlreadyExists = false;
            Int32 ExtractIndex;
            MExtractTable FirstExtractTable;
            MExtractTable IntersectedExtractTable = new MExtractTable();
            MExtractRow TemplateRow;
            Boolean PartnerExistsInAllExtracts;
            Int32 NewExtractId;

            NewExtractId = -1;

            TDBTransaction Transaction = null;
            bool SubmissionOK = false;

            DBAccess.GDBAccessObj.GetNewOrExistingAutoTransaction(IsolationLevel.Serializable,
                ref Transaction,
                ref SubmissionOK,
                delegate
                {
                    ResultValue = MPartner.Extracts.TExtractsHandling.CreateNewExtract(ANewExtractName,
                        ANewExtractDescription, out NewExtractId, out ExtractAlreadyExists);

                    if (ResultValue && !ExtractAlreadyExists)
                    {
                        if (AIntersectExtractIdList.Count > 0)
                        {
                            FirstExtractTable = MExtractAccess.LoadViaMExtractMaster(AIntersectExtractIdList[0], Transaction);

                            // iterate through all partners in first extract and check if this record also exists in all other extracts
                            foreach (DataRow ExtractRow in FirstExtractTable.Rows)
                            {
                                PartnerExistsInAllExtracts = true;

                                // now check if this partner record exists in all other extracts as well
                                for (ExtractIndex = 1;
                                     ExtractIndex < AIntersectExtractIdList.Count && PartnerExistsInAllExtracts;
                                     ExtractIndex++)
                                {
                                    if (!MExtractAccess.Exists(AIntersectExtractIdList[ExtractIndex], ((MExtractRow)ExtractRow).PartnerKey,
                                            ((MExtractRow)ExtractRow).SiteKey, Transaction))
                                    {
                                        // can stop here as there is at least one extract where partner does not exist
                                        PartnerExistsInAllExtracts = false;
                                    }
                                }

                                // create and add row to intersected extract as it exists in all extracts
                                if (PartnerExistsInAllExtracts)
                                {
                                    TemplateRow = (MExtractRow)IntersectedExtractTable.NewRowTyped(true);
                                    TemplateRow.ExtractId = NewExtractId;
                                    TemplateRow.PartnerKey = ((MExtractRow)ExtractRow).PartnerKey;
                                    TemplateRow.SiteKey = ((MExtractRow)ExtractRow).SiteKey;
                                    TemplateRow.LocationKey = ((MExtractRow)ExtractRow).LocationKey;

                                    IntersectedExtractTable.Rows.Add(TemplateRow);
                                }
                            }
                        }

                        // update key count in master table
                        MExtractMasterTable IntersectedExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(NewExtractId, Transaction);
                        IntersectedExtractMaster[0].KeyCount = IntersectedExtractTable.Rows.Count;

                        // submit changes in master and then in extract content table which refers to it
                        MExtractAccess.SubmitChanges(IntersectedExtractTable, Transaction);

                        MExtractMasterAccess.SubmitChanges(IntersectedExtractMaster, Transaction);
                    }

                    SubmissionOK = true;
                });

            ResultValue = SubmissionOK;
            ANewExtractId = NewExtractId;

            return ResultValue;
        }
コード例 #8
0
ファイル: ExtractMaster.cs プロジェクト: Davincier/openpetra
        public static Boolean SubtractExtracts(String ANewExtractName,
            String ANewExtractDescription,
            String ABaseExtractName,
            List <Int32>ASubtractExtractIdList,
            out Int32 ANewExtractId)
        {
            Boolean ResultValue = true;
            Boolean ExtractAlreadyExists = false;
            MExtractTable ExtractTable;
            MExtractMasterTable BaseExtractMasterTable;
            MExtractTable BaseExtractTable;
            MExtractTable SubtractedExtractTable = new MExtractTable();
            MExtractRow TemplateRow;
            Int32 NewExtractId;

            List <Int64>SubtractPartnerKeyList = new List <Int64>();

            NewExtractId = -1;

            TDBTransaction Transaction = null;
            bool SubmissionOK = false;

            DBAccess.GDBAccessObj.GetNewOrExistingAutoTransaction(IsolationLevel.Serializable,
                ref Transaction,
                ref SubmissionOK,
                delegate
                {
                    ResultValue = MPartner.Extracts.TExtractsHandling.CreateNewExtract(ANewExtractName,
                        ANewExtractDescription, out NewExtractId, out ExtractAlreadyExists);

                    if (ResultValue && !ExtractAlreadyExists)
                    {
                        // first create a table that contains all partners to be subtracted
                        foreach (Int32 ExtractId in ASubtractExtractIdList)
                        {
                            ExtractTable = MExtractAccess.LoadViaMExtractMaster(ExtractId, Transaction);

                            foreach (DataRow ExtractRow in ExtractTable.Rows)
                            {
                                if (!SubtractPartnerKeyList.Exists(item => item == ((MExtractRow)ExtractRow).PartnerKey))
                                {
                                    SubtractPartnerKeyList.Add(((MExtractRow)ExtractRow).PartnerKey);
                                }
                            }
                        }

                        if (ASubtractExtractIdList.Count > 0)
                        {
                            BaseExtractMasterTable = MExtractMasterAccess.LoadByUniqueKey(ABaseExtractName, Transaction);
                            BaseExtractTable = MExtractAccess.LoadViaMExtractMaster(((MExtractMasterRow)BaseExtractMasterTable.Rows[0]).ExtractId,
                                Transaction);

                            // iterate through all partners in base extract and check if this record also exists in extracts to be subtracted
                            foreach (DataRow ExtractRow in BaseExtractTable.Rows)
                            {
                                if (!SubtractPartnerKeyList.Exists(item => item == ((MExtractRow)ExtractRow).PartnerKey))
                                {
                                    // if partner key does not exist in list to subtract then add it to result extract
                                    TemplateRow = (MExtractRow)SubtractedExtractTable.NewRowTyped(true);
                                    TemplateRow.ExtractId = NewExtractId;
                                    TemplateRow.PartnerKey = ((MExtractRow)ExtractRow).PartnerKey;
                                    TemplateRow.SiteKey = ((MExtractRow)ExtractRow).SiteKey;
                                    TemplateRow.LocationKey = ((MExtractRow)ExtractRow).LocationKey;

                                    SubtractedExtractTable.Rows.Add(TemplateRow);
                                }
                            }
                        }

                        // update key count in master table
                        MExtractMasterTable IntersectedExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(NewExtractId, Transaction);
                        IntersectedExtractMaster[0].KeyCount = SubtractedExtractTable.Rows.Count;

                        // submit changes in master and then in extract content table which refers to it
                        MExtractAccess.SubmitChanges(SubtractedExtractTable, Transaction);

                        MExtractMasterAccess.SubmitChanges(IntersectedExtractMaster, Transaction);
                    }

                    SubmissionOK = true;
                });

            ResultValue = SubmissionOK;
            ANewExtractId = NewExtractId;

            return ResultValue;
        }
コード例 #9
0
ファイル: Extracts.cs プロジェクト: js1987/openpetragit
        /// <summary>
        /// extend an extract from a list of best addresses
        /// </summary>
        /// <param name="AExtractId">Extract Id of the Extract to extend</param>
        /// <param name="APartnerKeysTable"></param>
        /// <param name="APartnerKeyColumn">number of the column that contains the partner keys</param>
        /// <param name="ASiteKeyColumn">number of the column that contains the site keys</param>
        /// <param name="ALocationKeyColumn">number of the column that contains the location keys</param>
        /// <param name="AIgnoreDuplicates">true if duplicates should be looked out for. Can be set to false if called only once and not several times per extract.</param>
        /// <param name="ACommitTransaction">true if transaction should be committed at end of method</param>
        public static void ExtendExtractFromListOfPartnerKeys(
            Int32 AExtractId,
            DataTable APartnerKeysTable,
            Int32 APartnerKeyColumn,
            Int32 ASiteKeyColumn,
            Int32 ALocationKeyColumn,
            bool AIgnoreDuplicates,
            bool ACommitTransaction)
        {
            Boolean NewTransaction;
            int RecordCounter = 0;
            PPartnerLocationTable PartnerLocationKeysTable;
            Int64 PartnerKey;

            TDBTransaction WriteTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(IsolationLevel.Serializable,
                TEnforceIsolationLevel.eilMinimum, out NewTransaction);

            try
            {
                MExtractTable ExtractTable = new MExtractTable();
                ExtractTable = MExtractAccess.LoadViaMExtractMaster(AExtractId, WriteTransaction);

                // Location Keys need to be determined as extracts do not only need partner keys but
                // also Location Keys.
                DetermineBestLocationKeys(APartnerKeysTable, APartnerKeyColumn, ASiteKeyColumn,
                    ALocationKeyColumn, out PartnerLocationKeysTable,
                    WriteTransaction);

                // use the returned table which contains partner and location keys to build the extract
                foreach (PPartnerLocationRow PartnerLocationRow in PartnerLocationKeysTable.Rows)
                {
                    PartnerKey = Convert.ToInt64(PartnerLocationRow[PPartnerLocationTable.GetPartnerKeyDBName()]);

                    if (PartnerKey > 0)
                    {
                        RecordCounter += 1;
                        TLogging.Log("Preparing Partner " + PartnerKey.ToString() + " (Record Number " + RecordCounter.ToString() + ")");

                        // add row for partner to extract and fill with contents
                        MExtractRow NewRow = ExtractTable.NewRowTyped();
                        NewRow.ExtractId = AExtractId;
                        NewRow.PartnerKey = PartnerKey;
                        NewRow.SiteKey = Convert.ToInt64(PartnerLocationRow[PPartnerLocationTable.GetSiteKeyDBName()]);
                        NewRow.LocationKey = Convert.ToInt32(PartnerLocationRow[PPartnerLocationTable.GetLocationKeyDBName()]);

                        // only add row if it does not already exist for this partner
                        if (AIgnoreDuplicates || !ExtractTable.Rows.Contains(new object[] { NewRow.ExtractId, NewRow.PartnerKey, NewRow.SiteKey }))
                        {
                            ExtractTable.Rows.Add(NewRow);
                        }
                    }
                }

                if (ExtractTable.Rows.Count > 0)
                {
                    // update field in extract master for quick access to number of partners in extract
                    MExtractMasterTable ExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(AExtractId, WriteTransaction);
                    ExtractMaster[0].KeyCount = ExtractTable.Rows.Count;

                    ExtractTable.ThrowAwayAfterSubmitChanges = true; // no need to keep data as this increases speed significantly

                    MExtractAccess.SubmitChanges(ExtractTable, WriteTransaction);

                    MExtractMasterAccess.SubmitChanges(ExtractMaster, WriteTransaction);
                }

                if (ACommitTransaction)
                {
                    DBAccess.GDBAccessObj.CommitTransaction();
                }
            }
            catch (Exception Exc)
            {
                TLogging.Log("An Exception occured while extending an Extract from a list of Partner Keys:" + Environment.NewLine + Exc.ToString());

                if (NewTransaction)
                {
                    DBAccess.GDBAccessObj.RollbackTransaction();
                }

                throw;
            }
        }
コード例 #10
0
ファイル: ExtractMaster.cs プロジェクト: Davincier/openpetra
        public static Boolean CombineExtracts(String ANewExtractName,
            String ANewExtractDescription,
            List <Int32>ACombineExtractIdList,
            out Int32 ANewExtractId)
        {
            Boolean ResultValue = true;
            Boolean ExtractAlreadyExists = false;
            MExtractTable ExtractTable;
            MExtractTable CombinedExtractTable = new MExtractTable();
            MExtractRow TemplateRow;
            Int32 NewExtractId;

            NewExtractId = -1;

            TDBTransaction Transaction = null;
            bool SubmissionOK = false;

            DBAccess.GDBAccessObj.GetNewOrExistingAutoTransaction(IsolationLevel.Serializable,
                ref Transaction,
                ref SubmissionOK,
                delegate
                {
                    ResultValue = MPartner.Extracts.TExtractsHandling.CreateNewExtract(ANewExtractName,
                        ANewExtractDescription, out NewExtractId, out ExtractAlreadyExists);

                    if (ResultValue && !ExtractAlreadyExists)
                    {
                        // loop through each extract and combine them
                        foreach (Int32 ExtractId in ACombineExtractIdList)
                        {
                            ExtractTable = MExtractAccess.LoadViaMExtractMaster(ExtractId, Transaction);

                            foreach (DataRow ExtractRow in ExtractTable.Rows)
                            {
                                if (CombinedExtractTable.Rows.Find(new object[] { NewExtractId,
                                                                                  ((MExtractRow)ExtractRow).PartnerKey,
                                                                                  ((MExtractRow)ExtractRow).SiteKey }) == null)
                                {
                                    // create and add row to combined extract as it does not exist yet
                                    TemplateRow = (MExtractRow)CombinedExtractTable.NewRowTyped(true);
                                    TemplateRow.ExtractId = NewExtractId;
                                    TemplateRow.PartnerKey = ((MExtractRow)ExtractRow).PartnerKey;
                                    TemplateRow.SiteKey = ((MExtractRow)ExtractRow).SiteKey;
                                    TemplateRow.LocationKey = ((MExtractRow)ExtractRow).LocationKey;

                                    CombinedExtractTable.Rows.Add(TemplateRow);
                                }
                            }
                        }

                        // update key count in master table
                        MExtractMasterTable CombinedExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(NewExtractId, Transaction);
                        CombinedExtractMaster[0].KeyCount = CombinedExtractTable.Rows.Count;

                        // submit changes in master and then in extract content table which refers to it
                        MExtractAccess.SubmitChanges(CombinedExtractTable, Transaction);

                        MExtractMasterAccess.SubmitChanges(CombinedExtractMaster, Transaction);
                    }

                    SubmissionOK = true;
                });

            ResultValue = SubmissionOK;
            ANewExtractId = NewExtractId;

            return ResultValue;
        }
コード例 #11
0
ファイル: Extracts.cs プロジェクト: js1987/openpetragit
        /// <summary>
        /// Adds a Partner to an Extract, if they are not already present
        /// </summary>
        /// <param name="APartnerKey">PartnerKey of Partner</param>
        /// <param name="ALocationPK">Location PK of a Partner's PartnerLocation
        /// (usually the LocationPK of the 'Best Address' of the Partner).</param>
        /// <param name="AExtractId">ExtractId of the Extract that the Partner should
        /// get added to.</param>
        /// <returns>True if the Partner was added to the Extract, otherwise false.</returns>
        public static bool AddPartnerToExtract(Int64 APartnerKey,
            TLocationPK ALocationPK, int AExtractId)
        {
            bool ReturnValue;
            TDBTransaction WriteTransaction;
            MExtractTable TemplateTable;
            MExtractRow TemplateRow;
            MExtractRow NewRow;
            Boolean NewTransaction;

            if (APartnerKey > 0)
            {
                WriteTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(
                    IsolationLevel.Serializable, TEnforceIsolationLevel.eilMinimum, out NewTransaction);

                try
                {
                    /*
                     * First check whether the Partner isn't already in that Extract
                     */
                    TemplateTable = new MExtractTable();
                    TemplateRow = TemplateTable.NewRowTyped(false);
                    TemplateRow.ExtractId = AExtractId;
                    TemplateRow.PartnerKey = APartnerKey;

                    if (MExtractAccess.CountUsingTemplate(TemplateRow, null, WriteTransaction) == 0)
                    {
                        /*
                         * Add Partner to Extract.
                         */
                        NewRow = TemplateTable.NewRowTyped(false);
                        NewRow.ExtractId = AExtractId;
                        NewRow.PartnerKey = APartnerKey;
                        NewRow.SiteKey = ALocationPK.SiteKey;
                        NewRow.LocationKey = ALocationPK.LocationKey;
                        TemplateTable.Rows.Add(NewRow);

                        MExtractAccess.SubmitChanges(TemplateTable, WriteTransaction);

                        ReturnValue = true;
                    }
                    else
                    {
                        // Partner is already in that Extract -> Partner does not get added.
                        ReturnValue = false;
                    }

                    if (NewTransaction)
                    {
                        DBAccess.GDBAccessObj.CommitTransaction();
                        TLogging.LogAtLevel(8, "TExtractsHandling.AddPartnerToExtract: committed own transaction!");
                    }
                }
                catch (Exception Exc)
                {
                    TLogging.Log("An Exception occured while adding a Partner to an Extract:" + Environment.NewLine + Exc.ToString());

                    if (NewTransaction)
                    {
                        DBAccess.GDBAccessObj.RollbackTransaction();
                    }

                    throw;
                }
            }
            else
            {
                // Invalid PartnerKey -> return false;
                ReturnValue = false;
            }

            return ReturnValue;
        }
コード例 #12
0
ファイル: ExtractMaster.cs プロジェクト: js1987/openpetragit
        public static Boolean SubtractExtracts(String ANewExtractName,
            String ANewExtractDescription,
            String ABaseExtractName,
            List <Int32>ASubtractExtractIdList,
            out Int32 ANewExtractId)
        {
            Boolean ResultValue = true;
            Boolean ExtractAlreadyExists = false;
            MExtractTable ExtractTable;
            MExtractMasterTable BaseExtractMasterTable;
            MExtractTable BaseExtractTable;
            MExtractTable SubtractedExtractTable = new MExtractTable();
            MExtractRow TemplateRow;
            Boolean NewTransaction;

            List <Int64>SubtractPartnerKeyList = new List <Int64>();

            ANewExtractId = -1;

            TDBTransaction WriteTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(IsolationLevel.Serializable,
                TEnforceIsolationLevel.eilMinimum, out NewTransaction);

            try
            {
                ResultValue = MPartner.Extracts.TExtractsHandling.CreateNewExtract(ANewExtractName,
                    ANewExtractDescription, out ANewExtractId, out ExtractAlreadyExists);

                if (ResultValue && !ExtractAlreadyExists)
                {
                    // first create a table that contains all partners to be subtracted
                    foreach (Int32 ExtractId in ASubtractExtractIdList)
                    {
                        ExtractTable = MExtractAccess.LoadViaMExtractMaster(ExtractId, WriteTransaction);

                        foreach (DataRow ExtractRow in ExtractTable.Rows)
                        {
                            if (!SubtractPartnerKeyList.Exists(item => item == ((MExtractRow)ExtractRow).PartnerKey))
                            {
                                SubtractPartnerKeyList.Add(((MExtractRow)ExtractRow).PartnerKey);
                            }
                        }
                    }

                    if (ASubtractExtractIdList.Count > 0)
                    {
                        BaseExtractMasterTable = MExtractMasterAccess.LoadByUniqueKey(ABaseExtractName, WriteTransaction);
                        BaseExtractTable = MExtractAccess.LoadViaMExtractMaster(((MExtractMasterRow)BaseExtractMasterTable.Rows[0]).ExtractId,
                            WriteTransaction);

                        // iterate through all partners in base extract and check if this record also exists in extracts to be subtracted
                        foreach (DataRow ExtractRow in BaseExtractTable.Rows)
                        {
                            if (!SubtractPartnerKeyList.Exists(item => item == ((MExtractRow)ExtractRow).PartnerKey))
                            {
                                // if partner key does not exist in list to subtract then add it to result extract
                                TemplateRow = (MExtractRow)SubtractedExtractTable.NewRowTyped(true);
                                TemplateRow.ExtractId = ANewExtractId;
                                TemplateRow.PartnerKey = ((MExtractRow)ExtractRow).PartnerKey;
                                TemplateRow.SiteKey = ((MExtractRow)ExtractRow).SiteKey;
                                TemplateRow.LocationKey = ((MExtractRow)ExtractRow).LocationKey;

                                SubtractedExtractTable.Rows.Add(TemplateRow);
                            }
                        }
                    }

                    // update key count in master table
                    MExtractMasterTable IntersectedExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(ANewExtractId, WriteTransaction);
                    IntersectedExtractMaster[0].KeyCount = SubtractedExtractTable.Rows.Count;

                    // submit changes in master and then in extract content table which refers to it
                    MExtractAccess.SubmitChanges(SubtractedExtractTable, WriteTransaction);

                    MExtractMasterAccess.SubmitChanges(IntersectedExtractMaster, WriteTransaction);

                    ResultValue = true;
                }

                if (NewTransaction)
                {
                    DBAccess.GDBAccessObj.CommitTransaction();
                }
            }
            catch (Exception Exc)
            {
                TLogging.Log("An Exception occured during the subtraction of Extracts:" + Environment.NewLine + Exc.ToString());

                if (NewTransaction)
                {
                    DBAccess.GDBAccessObj.RollbackTransaction();
                }

                throw;
            }

            return ResultValue;
        }
コード例 #13
0
ファイル: ExtractMaster.cs プロジェクト: js1987/openpetragit
        public static Boolean IntersectExtracts(String ANewExtractName,
            String ANewExtractDescription,
            List <Int32>AIntersectExtractIdList,
            out Int32 ANewExtractId)
        {
            Boolean ResultValue = true;
            Boolean ExtractAlreadyExists = false;
            Int32 ExtractIndex;
            MExtractTable FirstExtractTable;
            MExtractTable IntersectedExtractTable = new MExtractTable();
            MExtractRow TemplateRow;
            Boolean NewTransaction;
            Boolean PartnerExistsInAllExtracts;

            TDBTransaction WriteTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(IsolationLevel.Serializable,
                TEnforceIsolationLevel.eilMinimum, out NewTransaction);

            ANewExtractId = -1;

            try
            {
                ResultValue = MPartner.Extracts.TExtractsHandling.CreateNewExtract(ANewExtractName,
                    ANewExtractDescription, out ANewExtractId, out ExtractAlreadyExists);

                if (ResultValue && !ExtractAlreadyExists)
                {
                    if (AIntersectExtractIdList.Count > 0)
                    {
                        FirstExtractTable = MExtractAccess.LoadViaMExtractMaster(AIntersectExtractIdList[0], WriteTransaction);

                        // iterate through all partners in first extract and check if this record also exists in all other extracts
                        foreach (DataRow ExtractRow in FirstExtractTable.Rows)
                        {
                            PartnerExistsInAllExtracts = true;

                            // now check if this partner record exists in all other extracts as well
                            for (ExtractIndex = 1;
                                 ExtractIndex < AIntersectExtractIdList.Count && PartnerExistsInAllExtracts;
                                 ExtractIndex++)
                            {
                                if (!MExtractAccess.Exists(AIntersectExtractIdList[ExtractIndex], ((MExtractRow)ExtractRow).PartnerKey,
                                        ((MExtractRow)ExtractRow).SiteKey, WriteTransaction))
                                {
                                    // can stop here as there is at least one extract where partner does not exist
                                    PartnerExistsInAllExtracts = false;
                                }
                            }

                            // create and add row to intersected extract as it exists in all extracts
                            if (PartnerExistsInAllExtracts)
                            {
                                TemplateRow = (MExtractRow)IntersectedExtractTable.NewRowTyped(true);
                                TemplateRow.ExtractId = ANewExtractId;
                                TemplateRow.PartnerKey = ((MExtractRow)ExtractRow).PartnerKey;
                                TemplateRow.SiteKey = ((MExtractRow)ExtractRow).SiteKey;
                                TemplateRow.LocationKey = ((MExtractRow)ExtractRow).LocationKey;

                                IntersectedExtractTable.Rows.Add(TemplateRow);
                            }
                        }
                    }

                    // update key count in master table
                    MExtractMasterTable IntersectedExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(ANewExtractId, WriteTransaction);
                    IntersectedExtractMaster[0].KeyCount = IntersectedExtractTable.Rows.Count;

                    // submit changes in master and then in extract content table which refers to it
                    MExtractAccess.SubmitChanges(IntersectedExtractTable, WriteTransaction);

                    MExtractMasterAccess.SubmitChanges(IntersectedExtractMaster, WriteTransaction);
                }

                if (NewTransaction)
                {
                    DBAccess.GDBAccessObj.CommitTransaction();
                }
            }
            catch (Exception Exc)
            {
                TLogging.Log("An Exception occured during the intersecting of Extracts:" + Environment.NewLine + Exc.ToString());

                if (NewTransaction)
                {
                    DBAccess.GDBAccessObj.RollbackTransaction();
                }

                throw;
            }

            return ResultValue;
        }
コード例 #14
0
ファイル: ExtractMaster.cs プロジェクト: js1987/openpetragit
        public static Boolean CombineExtracts(String ANewExtractName,
            String ANewExtractDescription,
            List <Int32>ACombineExtractIdList,
            out Int32 ANewExtractId)
        {
            Boolean ResultValue = true;
            Boolean ExtractAlreadyExists = false;
            MExtractTable ExtractTable;
            MExtractTable CombinedExtractTable = new MExtractTable();
            MExtractRow TemplateRow;
            Boolean NewTransaction;

            TDBTransaction WriteTransaction = DBAccess.GDBAccessObj.GetNewOrExistingTransaction(IsolationLevel.Serializable,
                TEnforceIsolationLevel.eilMinimum, out NewTransaction);

            ANewExtractId = -1;

            try
            {
                ResultValue = MPartner.Extracts.TExtractsHandling.CreateNewExtract(ANewExtractName,
                    ANewExtractDescription, out ANewExtractId, out ExtractAlreadyExists);

                if (ResultValue && !ExtractAlreadyExists)
                {
                    // loop through each extract and combine them
                    foreach (Int32 ExtractId in ACombineExtractIdList)
                    {
                        ExtractTable = MExtractAccess.LoadViaMExtractMaster(ExtractId, WriteTransaction);

                        foreach (DataRow ExtractRow in ExtractTable.Rows)
                        {
                            if (CombinedExtractTable.Rows.Find(new object[] { ANewExtractId,
                                                                              ((MExtractRow)ExtractRow).PartnerKey,
                                                                              ((MExtractRow)ExtractRow).SiteKey }) == null)
                            {
                                // create and add row to combined extract as it does not exist yet
                                TemplateRow = (MExtractRow)CombinedExtractTable.NewRowTyped(true);
                                TemplateRow.ExtractId = ANewExtractId;
                                TemplateRow.PartnerKey = ((MExtractRow)ExtractRow).PartnerKey;
                                TemplateRow.SiteKey = ((MExtractRow)ExtractRow).SiteKey;
                                TemplateRow.LocationKey = ((MExtractRow)ExtractRow).LocationKey;

                                CombinedExtractTable.Rows.Add(TemplateRow);
                            }
                        }
                    }

                    // update key count in master table
                    MExtractMasterTable CombinedExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(ANewExtractId, WriteTransaction);
                    CombinedExtractMaster[0].KeyCount = CombinedExtractTable.Rows.Count;

                    // submit changes in master and then in extract content table which refers to it
                    MExtractAccess.SubmitChanges(CombinedExtractTable, WriteTransaction);

                    MExtractMasterAccess.SubmitChanges(CombinedExtractMaster, WriteTransaction);
                }

                if (NewTransaction)
                {
                    DBAccess.GDBAccessObj.CommitTransaction();
                }
            }
            catch (Exception Exc)
            {
                TLogging.Log("An Exception occured during the combining of Extracts:" + Environment.NewLine + Exc.ToString());

                if (NewTransaction)
                {
                    DBAccess.GDBAccessObj.RollbackTransaction();
                }

                throw;
            }

            return ResultValue;
        }
コード例 #15
0
ファイル: Extracts.cs プロジェクト: Kingefosa/openpetra
        /// <summary>
        /// extend an extract from a list of best addresses
        /// </summary>
        /// <param name="AExtractId">Extract Id of the Extract to extend</param>
        /// <param name="APartnerKeysTable"></param>
        /// <param name="APartnerKeyColumn">number of the column that contains the partner keys</param>
        /// <param name="ASiteKeyColumn">number of the column that contains the site keys</param>
        /// <param name="ALocationKeyColumn">number of the column that contains the location keys</param>
        /// <param name="AIgnoreDuplicates">true if duplicates should be looked out for. Can be set to false if called only once and not several times per extract.</param>
        public static void ExtendExtractFromListOfPartnerKeys(
            Int32 AExtractId,
            DataTable APartnerKeysTable,
            Int32 APartnerKeyColumn,
            Int32 ASiteKeyColumn,
            Int32 ALocationKeyColumn,
            bool AIgnoreDuplicates)
        {
            int RecordCounter = 0;
            PPartnerLocationTable PartnerLocationKeysTable;
            Int64 PartnerKey;

            TDBTransaction Transaction  = null;
            bool           SubmissionOK = true;

            DBAccess.GDBAccessObj.GetNewOrExistingAutoTransaction(IsolationLevel.Serializable, ref Transaction, ref SubmissionOK,
                                                                  delegate
            {
                MExtractTable ExtractTable = new MExtractTable();
                ExtractTable = MExtractAccess.LoadViaMExtractMaster(AExtractId, Transaction);

                // Location Keys need to be determined as extracts do not only need partner keys but
                // also Location Keys.
                DetermineBestLocationKeys(APartnerKeysTable, APartnerKeyColumn, ASiteKeyColumn,
                                          ALocationKeyColumn, out PartnerLocationKeysTable,
                                          Transaction);

                // use the returned table which contains partner and location keys to build the extract
                foreach (PPartnerLocationRow PartnerLocationRow in PartnerLocationKeysTable.Rows)
                {
                    PartnerKey = Convert.ToInt64(PartnerLocationRow[PPartnerLocationTable.GetPartnerKeyDBName()]);

                    if (PartnerKey > 0)
                    {
                        RecordCounter += 1;
                        TLogging.LogAtLevel(1, "Preparing Partner " + PartnerKey + " (Record Number " + RecordCounter + ")");

                        // add row for partner to extract and fill with contents
                        MExtractRow NewRow = ExtractTable.NewRowTyped();
                        NewRow.ExtractId   = AExtractId;
                        NewRow.PartnerKey  = PartnerKey;
                        NewRow.SiteKey     = Convert.ToInt64(PartnerLocationRow[PPartnerLocationTable.GetSiteKeyDBName()]);
                        NewRow.LocationKey = Convert.ToInt32(PartnerLocationRow[PPartnerLocationTable.GetLocationKeyDBName()]);

                        // only add row if it does not already exist for this partner
                        if (AIgnoreDuplicates || !ExtractTable.Rows.Contains(new object[] { NewRow.ExtractId, NewRow.PartnerKey, NewRow.SiteKey }))
                        {
                            ExtractTable.Rows.Add(NewRow);
                        }
                    }
                }

                if (ExtractTable.Rows.Count > 0)
                {
                    // update field in extract master for quick access to number of partners in extract
                    MExtractMasterTable ExtractMaster = MExtractMasterAccess.LoadByPrimaryKey(AExtractId, Transaction);
                    ExtractMaster[0].KeyCount         = ExtractTable.Rows.Count;

                    ExtractTable.ThrowAwayAfterSubmitChanges = true;     // no need to keep data as this increases speed significantly

                    MExtractAccess.SubmitChanges(ExtractTable, Transaction);

                    MExtractMasterAccess.SubmitChanges(ExtractMaster, Transaction);
                }
            });
        }