/// <summary> /// todoComment /// </summary> /// <param name="AParameterDT"></param> public void SimilarLocationsProcessing(PartnerAddressAggregateTDSSimilarLocationParametersTable AParameterDT) { if (FCurrentModuleTabGroup == TPartnerEditScreenLogic.TModuleTabGroupEnum.mtgPartner) { if (!ucoPartnerTabSet.IsDynamicallyLoadableTabSetUp(TUC_PartnerEdit_PartnerTabSet.TDynamicLoadableUserControls.dlucAddresses)) { // The follwing function calls internally 'DynamicLoadUserControl(TDynamicLoadableUserControls.dlucAddresses);' ucoPartnerTabSet.SetUpPartnerAddressTab(); } ucoPartnerTabSet.ProcessServerResponseSimilarLocations(AParameterDT); } }
/// <summary> /// Called if the PetraServer responds on added or edited Location data that was /// submitted in a call to the UIConnector's SubmitChanges function. /// /// The PetraServer found out that for one or more Locations which were /// added or edited similar Location(s) already exist in the DB. The user needs /// to choose what to do with the changed Location(s). /// The user's answer is stored in the AParameterDT DataTable for each Address. /// Eventually this DataTable is sent back to the PetraServer for further /// evaluation and action. /// /// </summary> /// <param name="AParameterDT">DataTable containing parameter data that needs to be /// processed /// </param> /// <returns>void</returns> public void ProcessServerResponseSimilarLocations(PartnerAddressAggregateTDSSimilarLocationParametersTable AParameterDT) { PartnerAddressAggregateTDSSimilarLocationParametersRow SimilarLocationParametersRow; String AlreadyUsedMessage; int Counter; System.Windows.Forms.DialogResult SimilarLocationDialogResult; for (Counter = 0; Counter <= AParameterDT.Rows.Count - 1; Counter += 1) { SimilarLocationParametersRow = (PartnerAddressAggregateTDSSimilarLocationParametersRow)AParameterDT.Rows[Counter]; /* MessageBox.Show('ProcessServerResponseSimilarLocations: SimilarLocationParametersRow.SiteKey: ' + SimilarLocationParametersRow.SiteKey.ToString + '; SimilarLocationParametersRow.LocationKey: ' + *SimilarLocationParametersRow.LocationKey.ToString); */ if (!SimilarLocationParametersRow.AnswerProcessedClientSide) { if (SimilarLocationParametersRow.UsedByNOtherPartners > 0) { AlreadyUsedMessage = "\r\n\r\n" + String.Format(Catalog.GetString( "NOTE: this is used by {0} "), SimilarLocationParametersRow.UsedByNOtherPartners) + Catalog.GetPluralString(" other partner.", " other partners.", SimilarLocationParametersRow.UsedByNOtherPartners); } else { AlreadyUsedMessage = ""; } SimilarLocationDialogResult = MessageBox.Show( Catalog.GetString("A similar address already exists in the database:") + "\r\n" + " " + SimilarLocationParametersRow.Locality + "\r\n" + " " + SimilarLocationParametersRow.StreetName + "\r\n" + " " + SimilarLocationParametersRow.Address3 + "\r\n" + " " + SimilarLocationParametersRow.City + ' ' + SimilarLocationParametersRow.PostalCode + "\r\n" + " " + SimilarLocationParametersRow.County + ' ' + SimilarLocationParametersRow.CountryCode + "\r\n" + AlreadyUsedMessage + "\r\n" + "\r\n" + Catalog.GetString("Use the existing address record?") + "\r\n" + Catalog.GetString("(Choose 'No' to create a new address record.)"), Catalog.GetString("Similar Address Exists"), MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (SimilarLocationDialogResult == System.Windows.Forms.DialogResult.Yes) { SimilarLocationParametersRow.AnswerReuse = true; } else { SimilarLocationParametersRow.AnswerReuse = false; } AddCleanupAddressesLocationKey((Int32)SimilarLocationParametersRow.LocationKey); } } }
/// <summary> /// todoComment /// </summary> /// <param name="AParameterDT"></param> public void ProcessServerResponseSimilarLocations(PartnerAddressAggregateTDSSimilarLocationParametersTable AParameterDT) { if (!FTabSetup.ContainsKey(TDynamicLoadableUserControls.dlucAddresses)) { // The follwing function calls internally 'DynamicLoadUserControl(TDynamicLoadableUserControls.dlucAddresses);' SetupUserControlAddresses(); } FUcoAddresses.ProcessServerResponseSimilarLocations(AParameterDT); }
/// <summary> /// todoComment /// </summary> private static TSubmitChangesResult PerformSimilarLocationReUseChecks(ref PLocationRow ALocationRow, ref PartnerAddressAggregateTDS AResponseDS, TDBTransaction ASubmitChangesTransaction, Int64 APartnerKey, ref PartnerAddressAggregateTDSSimilarLocationParametersTable AExistingLocationParametersDT, ref PPartnerLocationTable APartnerLocationTable, ref TLocationPK[, ] ALocationReUseKeyMapping, out Boolean AReUseSimilarLocation, ref TVerificationResultCollection AVerificationResult) { TSubmitChangesResult ReturnValue; PPartnerLocationRow PartnerLocationCheckRow; DataView ExistingLocationParametersDV; PLocationRow ExistingLocationRow; Int64 CurrentSiteKey; Int64 ExistingSiteKey; Int32 CurrentLocationKey; Int32 ExistingLocationKey; PLocationTable SimilarLocationDT; // TLogging.LogAtLevel(9, "PerformSimilarLocationReUseChecks: AExistingLocationParametersDT.Rows.Count: " + // AExistingLocationParametersDT.Rows.Count.ToString()); AReUseSimilarLocation = false; if (CheckReUseExistingLocation(ALocationRow, APartnerKey, ref AExistingLocationParametersDT, ASubmitChangesTransaction, out ExistingSiteKey, out ExistingLocationKey)) { // Check if there is a Parameter Row for the LocationKey we are looking at ExistingLocationParametersDV = new DataView(AExistingLocationParametersDT, PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName() + " = " + ALocationRow.SiteKey.ToString() + " AND " + PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName() + " = " + ALocationRow.LocationKey.ToString() + " AND " + PartnerAddressAggregateTDSSimilarLocationParametersTable.GetAnswerProcessedClientSideDBName() + " = false", "", DataViewRowState.CurrentRows); if (ExistingLocationParametersDV.Count > 0) { // TLogging.LogAtLevel(9, "PerformSimilarLocationReUseChecks: Location " + ALocationRow.LocationKey.ToString() + ": found similar Location, decision is needed."); /* * More information is needed (usually via user interaction) * -> stop processing here and return parameters * (usually used for UI interaction) */ if (AResponseDS == null) { // TLogging.LogAtLevel(9, "PerformSimilarLocationReUseChecks: Creating AResponseDS."); AResponseDS = new PartnerAddressAggregateTDS(MPartnerConstants.PARTNERADDRESSAGGREGATERESPONSE_DATASET); } // TLogging.LogAtLevel(9, "PerformSimilarLocationReUseChecks: AExistingLocationParametersDT.Rows.Count: " + AExistingLocationParametersDT.Rows.Count.ToString()); AResponseDS.Merge(AExistingLocationParametersDT); // TLogging.LogAtLevel(9, "PerformSimilarLocationReUseChecks: Merged ExistingLocationParametersDT into AResponseDS."); // TLogging.LogAtLevel(9, "PerformSimilarLocationReUseChecks: AResponseDS.Tables[" + MPartnerConstants.EXISTINGLOCATIONPARAMETERS_TABLENAME + // "].Rows.Count: " + AResponseDS.Tables[MPartnerConstants.EXISTINGLOCATIONPARAMETERS_TABLENAME].Rows.Count.ToString()); return TSubmitChangesResult.scrInfoNeeded; } else { // TLogging.LogAtLevel(9, "PerformSimilarLocationReUseChecks: Location " + ALocationRow.LocationKey.ToString() + // ": found similar Location and this one (" + ExistingLocationKey.ToString() + ") should be used instead of creating a new one!"); /* * Location with the same data already exists and it should be * re-used instead of creating a new one! */ // Keep a mapping of the initially submitted LocationKey to the newly assigned one ALocationReUseKeyMapping = new TLocationPK[ALocationReUseKeyMapping.GetLength(0) + 1, 2]; ALocationReUseKeyMapping[(ALocationReUseKeyMapping.GetLength(0)) - 1, 0] = new TLocationPK(ALocationRow.SiteKey, (int)ALocationRow.LocationKey); ALocationReUseKeyMapping[(ALocationReUseKeyMapping.GetLength(0)) - 1, 1] = new TLocationPK(ExistingSiteKey, ExistingLocationKey); AReUseSimilarLocation = true; if (!AExistingLocationParametersDT[0].AnswerProcessedServerSide) { AExistingLocationParametersDT[0].AnswerProcessedServerSide = true; // Preserve Key of current Location CurrentSiteKey = ALocationRow.SiteKey; CurrentLocationKey = (int)ALocationRow.LocationKey; /* * Make sure that the Partner hasn't already got a PartnerLocation with * the same Key (neither in memory nor in the DB) */ // TLogging.LogAtLevel(9, "PerformSimilarLocationReUseChecks: Finding PartnerLocation Row in APartnerLocationTable with LocationKey " + ALocationRow.LocationKey.ToString()); PartnerLocationCheckRow = (PPartnerLocationRow)APartnerLocationTable.Rows.Find(new object[] { APartnerKey, ALocationRow.SiteKey, ALocationRow.LocationKey }); if (PartnerLocationCheckRow != null) { /* * Checks in Memory: look for Current (ie. unchanged, new or edited) * rows first whether they are the Location that is about to being * reused. Secondly, check if there is a deleted Location with the same * LocationKey that is about to being reused; only if this is not the * case: * Check in the DB whether the Partner hasn't got the Location * with the same LocationKey that is about to being reuse. */ if ((APartnerLocationTable.Select(PPartnerLocationTable.GetPartnerKeyDBName() + " = " + APartnerKey.ToString() + " AND " + PPartnerLocationTable.GetSiteKeyDBName() + " = " + ExistingSiteKey.ToString() + " AND " + PPartnerLocationTable.GetLocationKeyDBName() + " = " + ExistingLocationKey.ToString(), "", DataViewRowState.CurrentRows).Length != 0) || ((APartnerLocationTable.Select(PPartnerLocationTable.GetPartnerKeyDBName() + " = " + APartnerKey.ToString() + " AND " + PPartnerLocationTable.GetSiteKeyDBName() + " = " + ExistingSiteKey.ToString() + " AND " + PPartnerLocationTable.GetLocationKeyDBName() + " = " + ExistingLocationKey.ToString(), "", DataViewRowState.Deleted).Length == 0) && (PPartnerLocationAccess.Exists(APartnerKey, ExistingSiteKey, ExistingLocationKey, ASubmitChangesTransaction)))) { AVerificationResult.Add(new TVerificationResult("[Partner Address Save]", "Partner " + APartnerKey.ToString() + " already has a " + "record linked with Location " + ExistingLocationKey.ToString() + Environment.NewLine + "Unable to save.", "Duplicate Address Entered", "", TResultSeverity.Resv_Critical)); ReturnValue = TSubmitChangesResult.scrError; return ReturnValue; } else { // TLogging.LogAtLevel(9, "PerformSimilarLocationReUseChecks: LocationKey: " + ExistingLocationKey.ToString() + " will later get assigned to PPartnerLocation."); } } else { throw new EOPAppException( "PerformSimilarLocationReUseChecks: PartnerLocationCheckRow with SiteKey " + ALocationRow.SiteKey.ToString() + " and LocationKey " + ALocationRow.LocationKey.ToString() + " not found!"); } /* * Copy all fields from the existing Location to the current Location */ SimilarLocationDT = PLocationAccess.LoadByPrimaryKey(ExistingSiteKey, ExistingLocationKey, null, ASubmitChangesTransaction); if (SimilarLocationDT.Rows.Count != 0) { ExistingLocationRow = (PLocationRow)SimilarLocationDT.Rows[0]; ALocationRow.ItemArray = ExistingLocationRow.ItemArray; /* * NOTE: The SiteKey and LocationKey are re-assigned to the ones of the * current Location. This is done to have the current SiteKey and * LocationKey preserved throughout the whole process of working with the * Locations. The SiteKey and LocationKey are exchanged with the ones of * the existing Location before the DataRow gets sent back to the Client! */ ALocationRow.SiteKey = CurrentSiteKey; ALocationRow.LocationKey = CurrentLocationKey; // TLogging.LogAtLevel(9, "CheckReUseExistingLocation: Location " + ALocationRow.LocationKey.ToString() + // ": data got replaced with data from the existing Location (" + ExistingLocationKey.ToString() + ")!"); } else { throw new EOPAppException( "Couldn''t find existing Similar Location with SiteKey " + ALocationRow.SiteKey.ToString() + " and LocationKey " + ALocationRow.LocationKey.ToString() + '!'); } } } } else { // TLogging.LogAtLevel(9, "CheckReUseExistingLocation: Location " + ALocationRow.LocationKey.ToString() + // ": Location does not exist yet (or an existing Location should not be re-used) -> will get saved later."); /* * No similar Location exists, or an existing similar Location should * not be re-used: Save this Location * -> will get saved later in call to SubmitChanges */ } return TSubmitChangesResult.scrOK; }
/// <summary> /// Allows adding of a new Location of a FAMILY Partner to all PERSONS of that /// FAMILY. /// /// @comment Must only be called for Partners of Partner Class FAMILY - the /// function does no checks on that and will fail for other Partner Classes! /// </summary> /// <returns>void</returns> private static TSubmitChangesResult PerformLocationFamilyMemberPropagationChecks(PPartnerLocationRow APartnerLocationRow, ref PartnerAddressAggregateTDS AResponseDS, TDBTransaction ASubmitChangesTransaction, Int64 APartnerKey, String APartnerClass, ref PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable AAddressAddedPromotionDT, ref PPartnerLocationTable APartnerLocationTable, PartnerAddressAggregateTDSSimilarLocationParametersTable AExistingLocationParametersDT, TLocationPK[, ] ALocationReUseKeyMapping, out Boolean APerformPropagation, ref TVerificationResultCollection AVerificationResult) { // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks for LocationKey: " + APartnerLocationRow.LocationKey.ToString() + // "; AAddressAddedPromotionDT.Rows.Count: " + AAddressAddedPromotionDT.Rows.Count.ToString()); APerformPropagation = false; TLocationPK SubmittedLocationPK = DetermineReplacedLocationPK(APartnerLocationRow, ALocationReUseKeyMapping); TLocationPK LocationPK = DetermineReplacedLocationPK(APartnerLocationRow, AExistingLocationParametersDT); if (CheckFamilyMemberPropagation(APartnerLocationRow, APartnerKey, APartnerClass, ref AAddressAddedPromotionDT, LocationPK, ASubmitChangesTransaction)) { // Check if there is a Parameter Row for the LocationKey we are looking at DataView PropagateLocationParametersDV = new DataView(AAddressAddedPromotionDT, PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable.GetSiteKeyDBName() + " = " + LocationPK.SiteKey.ToString() + " AND " + PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable.GetLocationKeyDBName() + " = " + LocationPK.LocationKey.ToString() + " AND " + PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable.GetLocationAddedDBName() + " = true AND " + PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable.GetAnswerProcessedClientSideDBName() + " = false", "", DataViewRowState.CurrentRows); if (PropagateLocationParametersDV.Count > 0) { // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: Location " + APartnerLocationRow.LocationKey.ToString() + ": found Family Members, decision on propagation is needed."); /* * More information is needed (usually via user interaction) * -> stop processing here and return parameters * (usually used for UI interaction) */ if (AResponseDS == null) { // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: Creating AResponseDS."); AResponseDS = new PartnerAddressAggregateTDS(MPartnerConstants.PARTNERADDRESSAGGREGATERESPONSE_DATASET); } // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: AAddressAddedPromotionDT.Rows.Count: " + AAddressAddedPromotionDT.Rows.Count.ToString()); AResponseDS.Merge(AAddressAddedPromotionDT); // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: Merged AAddressAddedPromotionDT into AResponseDS."); // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: PerformLocationFamilyMemberPropagationChecks: AResponseDS.Tables[" + // MPartnerConstants.ADDRESSADDEDORCHANGEDPROMOTION_TABLENAME + "].Rows.Count: " + // AResponseDS.Tables[MPartnerConstants.EXISTINGLOCATIONPARAMETERS_TABLENAME].Rows.Count.ToString()); return TSubmitChangesResult.scrInfoNeeded; } else { // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: Location " + APartnerLocationRow.LocationKey.ToString() + ": found Family Members and new Location should be propagated to them!"); /* * Family Members were found and the new Location should be added to all * of them! */ APerformPropagation = true; // Load all Persons of the Family PPersonTable FamilyPersonsDT = PPersonAccess.LoadViaPFamily(APartnerKey, ASubmitChangesTransaction); // Find PPartnerLocation row of the Family that we should process PPartnerLocationRow FamilyPartnerLocationRow = (PPartnerLocationRow)APartnerLocationTable.Rows.Find( new System.Object[] { APartnerKey, APartnerLocationRow.SiteKey, APartnerLocationRow.LocationKey }); if (FamilyPartnerLocationRow != null) { for (int Counter = 0; Counter <= FamilyPersonsDT.Rows.Count - 1; Counter += 1) { PPersonRow ProcessedPersonRow = FamilyPersonsDT[Counter]; // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: Person " + ProcessedPersonRow.PartnerKey.ToString() + ": checking..."); // Check if Person doesn't already have the Location if (!PPartnerLocationAccess.Exists(ProcessedPersonRow.PartnerKey, SubmittedLocationPK.SiteKey, SubmittedLocationPK.LocationKey, ASubmitChangesTransaction)) { /* * PartnerLocation records for family members are added to APartnerLocationTable for easier data handling and * will be removed again after SubmitChanges of whole dataset but before returning to client as otherwise * they would confusingly show up on client side. */ // Make sure record is not added more than once to APartnerLocationTable (in case it is not yet in database). if (APartnerLocationTable.Rows.Find(new System.Object[] { ProcessedPersonRow.PartnerKey, SubmittedLocationPK.SiteKey, SubmittedLocationPK.LocationKey }) == null) { // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: Person " + ProcessedPersonRow.PartnerKey.ToString() + // ": adding Location " + SubmittedLocationPK.LocationKey.ToString() + "..."); // Add a copy of the PartnerLocation data to the Person PPartnerLocationRow AddPartnerLocationRow = APartnerLocationTable.NewRowTyped(false); AddPartnerLocationRow.ItemArray = DataUtilities.DestinationSaveItemArray(AddPartnerLocationRow, FamilyPartnerLocationRow); AddPartnerLocationRow.PartnerKey = ProcessedPersonRow.PartnerKey; AddPartnerLocationRow.SiteKey = SubmittedLocationPK.SiteKey; AddPartnerLocationRow.LocationKey = SubmittedLocationPK.LocationKey; APartnerLocationTable.Rows.Add(AddPartnerLocationRow); /* * If this Person has an PartnerLocation with LocationKey 0 (this * means that this was the only PartnerLocation so far), delete the * PartnerLocation with LocationKey 0. */ if (PPartnerLocationAccess.Exists(ProcessedPersonRow.PartnerKey, SubmittedLocationPK.SiteKey, 0, ASubmitChangesTransaction)) { // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: Person " + ProcessedPersonRow.PartnerKey.ToString() + ": had Location 0 assigned, deleting it."); PPartnerLocationAccess.DeleteByPrimaryKey(ProcessedPersonRow.PartnerKey, APartnerLocationRow.SiteKey, 0, ASubmitChangesTransaction); } } } else { // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: Person " + ProcessedPersonRow.PartnerKey.ToString() + // ": already has Location " + SubmittedLocationPK.LocationKey.ToString() + " assigned."); } } } else { throw new EOPAppException( "TPPartnerAddressAggregate.PerformLocationFamilyMemberPropagationChecks: PPartnerLocation record for Family is missing"); } } } else { // TLogging.LogAtLevel(9, "PerformLocationFamilyMemberPropagationChecks: Location " + SubmittedLocationPK.LocationKey.ToString() + // ": Family either has no Family Members, or no propagation of the new Location is wanted. New Location will therefore only be added to the FAMILY."); /* * Family either has no Family Members, or it has Members, but the decision * was made that the new PartnerLocation should not be added to the Family * Members. * The new Location will therefore only be added to the FAMILY. */ } return TSubmitChangesResult.scrOK; }
/// <summary> /// todoComment /// </summary> /// <param name="ARow"></param> /// <param name="AExistingLocationParametersDT"></param> /// <returns></returns> private static TLocationPK DetermineReplacedLocationPK(DataRow ARow, PartnerAddressAggregateTDSSimilarLocationParametersTable AExistingLocationParametersDT) { TLocationPK ReturnValue; Int64 SiteKey; Int32 LocationKey; PartnerAddressAggregateTDSSimilarLocationParametersRow ExistingLocationParametersDR; DataView ExistingLocationParametersDV; ReturnValue = null; if (!((ARow is PLocationRow) || (ARow is PPartnerLocationRow))) { throw new System.ArgumentException("ARow Argument must be either of Type PLocationRow or of Type PPartnerLocationRow"); } if (ARow is PLocationRow) { SiteKey = ((PLocationRow)ARow).SiteKey; LocationKey = (int)((PLocationRow)ARow).LocationKey; } else { SiteKey = ((PPartnerLocationRow)ARow).SiteKey; LocationKey = ((PPartnerLocationRow)ARow).LocationKey; } if ((AExistingLocationParametersDT != null) && (AExistingLocationParametersDT.Rows.Count > 0)) { // TLogging.LogAtLevel(9, "DetermineReplacedLocationPK: checking for LocationKey: " + LocationKey.ToString()); // Check if there is a Parameter Row for the LocationKey we are looking at ExistingLocationParametersDV = new DataView(AExistingLocationParametersDT, PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName() + " = " + SiteKey.ToString() + " AND " + PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName() + " = " + LocationKey.ToString(), "", DataViewRowState.CurrentRows); if (ExistingLocationParametersDV.Count != 0) { // TLogging.LogAtLevel(9, "DetermineReplacedLocationPK: Key found in AExistingLocationParametersDT"); ExistingLocationParametersDR = (PartnerAddressAggregateTDSSimilarLocationParametersRow)ExistingLocationParametersDV[0].Row; ReturnValue = new TLocationPK(Convert.ToInt64(ExistingLocationParametersDR[PartnerAddressAggregateTDSSimilarLocationParametersTable. GetSiteKeyDBName(), DataRowVersion.Original]), Convert.ToInt32(ExistingLocationParametersDR[PartnerAddressAggregateTDSSimilarLocationParametersTable. GetLocationKeyDBName(), DataRowVersion.Original])); } } if (ReturnValue == null) { // passed in Key not found in AExistingLocationParametersDT // TLogging.LogAtLevel(9, "DetermineReplacedLocationPK: Key *not* found in AExistingLocationParametersDT"); ReturnValue = new TLocationPK(SiteKey, LocationKey); } // TLogging.LogAtLevel(9, "DetermineReplacedLocationPK: Result.SiteKey: " + ReturnValue.SiteKey.ToString() + "; ReturnValue.LocationKey: " + ReturnValue.LocationKey.ToString()); return ReturnValue; }
/// <summary> /// todoComment /// </summary> /// <param name="ALocationRow"></param> /// <param name="AOriginalLocationKey"></param> /// <param name="AExistingLocationParametersDT"></param> private static void ModifyExistingLocationParameters(PLocationRow ALocationRow, TLocationPK AOriginalLocationKey, ref PartnerAddressAggregateTDSSimilarLocationParametersTable AExistingLocationParametersDT) { DataView ExistingLocationParametersDV; PartnerAddressAggregateTDSSimilarLocationParametersRow SimilarLocationParameterRow; // TLogging.LogAtLevel(9, "ModifyExistingLocationParameters: Looking for ExistingLocationParameters with LocationKey " + // AOriginalLocationKey.LocationKey.ToString() + "; AExistingLocationParametersDT.Rows.Count: " + AExistingLocationParametersDT.Rows.Count.ToString()); /* if DEBUGMODE * if (TLogging.DL >= 8) * { * for (int TmpRowCounter = 0; TmpRowCounter <= AExistingLocationParametersDT.Rows.Count - 1; TmpRowCounter += 1) * { * TLogging.Log("Checking Row: " + TmpRowCounter.ToString()); * TLogging.Log("ModifyExistingLocationParameters: SimilarLocationParameterRow[" + TmpRowCounter.ToString() + ".RowState: " + * (Enum.GetName(typeof(DataRowState), AExistingLocationParametersDT.Rows[TmpRowCounter].RowState))); * TLogging.Log( * "ModifyExistingLocationParameters: before searching: Row[" + TmpRowCounter.ToString() + "]: PLocationKey: " + * AExistingLocationParametersDT[TmpRowCounter][PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName(), * DataRowVersion.Current].ToString() + "; PSiteKey: " + * AExistingLocationParametersDT[TmpRowCounter][PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName(), * DataRowVersion.Current].ToString() + "; RowState: " + * (Enum.GetName(typeof(DataRowState), AExistingLocationParametersDT.Rows[TmpRowCounter].RowState))); * } * } */ if (AExistingLocationParametersDT.Rows.Count != 0) { // Check if there is a Parameter Row for the LocationKey we are looking at // ExistingLocationParametersDV := new DataView( // AExistingLocationParametersDT, // PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName + // ' = ' + Convert.ToInt64(ALocationRow[PLocationTable.GetSiteKeyDBName, // DataRowVersion.Original]).ToString + // ' AND ' + // PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName + // ' = ' + Convert.ToInt32(ALocationRow[PLocationTable.GetLocationKeyDBName, // DataRowVersion.Original]).ToString, '', DataViewRowState.OriginalRows); ExistingLocationParametersDV = new DataView(AExistingLocationParametersDT, PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName() + " = " + AOriginalLocationKey.SiteKey.ToString() + " AND " + PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName() + " = " + AOriginalLocationKey.LocationKey.ToString(), "", DataViewRowState.ModifiedOriginal); // There is a row like that: replace SiteKey and LocationKey! if (ExistingLocationParametersDV.Count != 0) { SimilarLocationParameterRow = (PartnerAddressAggregateTDSSimilarLocationParametersRow)ExistingLocationParametersDV[0].Row; // TLogging.LogAtLevel(9, "ModifyExistingLocationParameters: Exchanging LocationKey " + SimilarLocationParameterRow.LocationKey.ToString() + // " with LocationKey " + ALocationRow.LocationKey.ToString()); /* if DEBUGMODE * if (TLogging.DL >= 8) * { * TLogging.Log("ModifyExistingLocationParameters: SimilarLocationParameterRow.RowState: " + * (Enum.GetName(typeof(DataRowState), SimilarLocationParameterRow.RowState))); * * if (SimilarLocationParameterRow.RowState == DataRowState.Added) * { * TLogging.Log("ModifyExistingLocationParameters (before modification): PLocationKey: " + * SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName()].ToString( * ) + * "; PSiteKey: " + * SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName()].ToString() + * "; RowState: " + (Enum.GetName(typeof(DataRowState), SimilarLocationParameterRow.RowState))); * } * else if ((SimilarLocationParameterRow.RowState == DataRowState.Modified) || (SimilarLocationParameterRow.RowState == DataRowState.Unchanged)) || { || TLogging.Log("ModifyExistingLocationParameters (before modification): PLocationKey: " + || SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName(), || DataRowVersion.Original].ToString() + "; PSiteKey: " + || SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName(), || DataRowVersion.Original].ToString() + "; RowState: " + || (Enum.GetName(typeof(DataRowState), SimilarLocationParameterRow.RowState) + " (ORIGINAL)")); || TLogging.Log("ModifyExistingLocationParameters (before modification): PLocationKey: " + || SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName(), || DataRowVersion.Current].ToString() + "; PSiteKey: " + || SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName(), || DataRowVersion.Current].ToString() + "; RowState: " + || (Enum.GetName(typeof(DataRowState), SimilarLocationParameterRow.RowState) + " (CURRENT)")); || } || } */ // Now modify it so that it can be found later by function DetermineReplacedLocationPK! SimilarLocationParameterRow.SiteKey = ALocationRow.SiteKey; SimilarLocationParameterRow.LocationKey = ALocationRow.LocationKey; /* if DEBUGMODE * if (TLogging.DL >= 8) * { * TLogging.Log("ModifyExistingLocationParameters: SimilarLocationParameterRow.RowState: " + * (Enum.GetName(typeof(DataRowState), SimilarLocationParameterRow.RowState))); * * if (SimilarLocationParameterRow.RowState == DataRowState.Added) * { * TLogging.Log("ModifyExistingLocationParameters (after modification): PLocationKey: " + * SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName()].ToString( * ) + * "; PSiteKey: " + * SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName()].ToString() + * "; RowState: " + (Enum.GetName(typeof(DataRowState), SimilarLocationParameterRow.RowState))); * } * else if ((SimilarLocationParameterRow.RowState == DataRowState.Modified) || (SimilarLocationParameterRow.RowState == DataRowState.Unchanged)) || { || TLogging.Log("ModifyExistingLocationParameters (after modification): PLocationKey: " + || SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName(), || DataRowVersion.Original].ToString() + "; PSiteKey: " + || SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName(), || DataRowVersion.Original].ToString() + "; RowState: " + || (Enum.GetName(typeof(DataRowState), SimilarLocationParameterRow.RowState) + " (ORIGINAL)")); || TLogging.Log("ModifyExistingLocationParameters (after modification): PLocationKey: " + || SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName(), || DataRowVersion.Current].ToString() + "; PSiteKey: " + || SimilarLocationParameterRow[PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName(), || DataRowVersion.Current].ToString() + "; RowState: " + || (Enum.GetName(typeof(DataRowState), SimilarLocationParameterRow.RowState) + " (CURRENT)")); || } || } */ } } else { // TLogging.LogAtLevel(9, "ModifyExistingLocationParameters: No ExistingLocationParameters with LocationKey " + AOriginalLocationKey.LocationKey.ToString() + " found --> creating new one!"); /* * No such parameter row found -> create a 'fake' one! * * NOTE: This is a bit of a 'Hack', since normally only function * CheckReUseExistingLocation creates such a DataRow. However, currently * this 'Hack' is needed to make function DetermineReplacedLocationPK work * even if function CheckReUseExistingLocation was never executed (because * no similar Location was found)... */ SimilarLocationParameterRow = AExistingLocationParametersDT.NewRowTyped(false); SimilarLocationParameterRow.SiteKey = AOriginalLocationKey.SiteKey; SimilarLocationParameterRow.LocationKey = AOriginalLocationKey.LocationKey; SimilarLocationParameterRow.UsedByNOtherPartners = 0; SimilarLocationParameterRow.SiteKeyOfSimilarLocation = ALocationRow.SiteKey; SimilarLocationParameterRow.LocationKeyOfSimilarLocation = (int)ALocationRow.LocationKey; SimilarLocationParameterRow.AnswerProcessedClientSide = true; SimilarLocationParameterRow.AnswerProcessedServerSide = true; SimilarLocationParameterRow.AnswerReuse = false; AExistingLocationParametersDT.Rows.Add(SimilarLocationParameterRow); SimilarLocationParameterRow.AcceptChanges(); // Now modify it so that it can be found later by function DetermineReplacedLocationPK! SimilarLocationParameterRow.SiteKey = ALocationRow.SiteKey; SimilarLocationParameterRow.LocationKey = ALocationRow.LocationKey; } }
/// <summary> /// Check each PartnerLocation DataRow before calling SubmitChanges /// to enforce Business Rules: /// - Added PartnerLocation: /// - if working with a PartnerLocation of a FAMILY: /// - Added PartnerLocation: if working with a Location of a FAMILY: allow /// choosing whether this PartnerLocation should be added to all PERSONs /// in the FAMILY /// - make sure that Location 0 is no longer mapped to this Partner. /// - Modified Location: /// - if working with a PartnerLocation of a FAMILY: /// - check whether other Partners are referencing it, and if so, /// allow choosing which of the Partners (or none or all) should be /// affected by the change /// - if the value in the DateGoodUntil column has changed, silently /// update it for all PERSONs of a FAMILY that have the same LocationKey. /// - Deleted PartnerLocation: check whether this is the last /// PartnerLocation that is left for this Partner. If this is the case, /// don't delete the PartnerLocation, but set it's LocationKey to 0. /// </summary> private static TSubmitChangesResult ProcessPartnerLocationChanges( PPartnerLocationTable PartnerLocationTable, ref PartnerAddressAggregateTDS AResponseDS, TDBTransaction ASubmitChangesTransaction, Int64 APartnerKey, String APartnerClass, ref TLocationPK[, ] ASimilarLocationReUseKeyMapping, ref PartnerAddressAggregateTDSSimilarLocationParametersTable AExistingLocationParametersDT, ref PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable AAddressAddedOrChangedPromotionParametersDT, ref PartnerAddressAggregateTDSChangePromotionParametersTable AChangeLocationParametersDT, ref TVerificationResultCollection AVerificationResult) { TSubmitChangesResult Result = TSubmitChangesResult.scrOK; TSubmitChangesResult TmpResult; for (Int16 PartnerLocationCounter = 0; PartnerLocationCounter <= PartnerLocationTable.Rows.Count - 1; PartnerLocationCounter += 1) { switch (PartnerLocationTable.Rows[PartnerLocationCounter].RowState) { case DataRowState.Added: if (PartnerLocationTable[PartnerLocationCounter].LocationKey != 0) { /* * PartnerLocation of a FAMILY: Family Members promotion */ if (APartnerClass == SharedTypes.PartnerClassEnumToString(TPartnerClass.FAMILY)) { bool PerformPropagation = false; TmpResult = PerformLocationFamilyMemberPropagationChecks( PartnerLocationTable[PartnerLocationCounter], ref AResponseDS, ASubmitChangesTransaction, APartnerKey, APartnerClass, ref AAddressAddedOrChangedPromotionParametersDT, ref PartnerLocationTable, AExistingLocationParametersDT, ASimilarLocationReUseKeyMapping, out PerformPropagation, ref AVerificationResult); if (TmpResult != TSubmitChangesResult.scrOK) { Result = TmpResult; if (TmpResult == TSubmitChangesResult.scrError) { return TmpResult; } } if (PerformPropagation) { ModifyAddressAddedOrChangedParameters(PartnerLocationTable[PartnerLocationCounter], ref AAddressAddedOrChangedPromotionParametersDT); } } /* * Since a new Location has been added, we need to make sure that * Location 0 is no longer mapped to this Partner! */ MakeSureLocation0IsNotPresent(APartnerKey, PartnerLocationTable[PartnerLocationCounter].SiteKey, PartnerLocationTable, ASubmitChangesTransaction); } else { MakeSureLocation0SavingIsAllowed(PartnerLocationTable[PartnerLocationCounter], APartnerKey, ASubmitChangesTransaction); } break; case DataRowState.Modified: /* * PartnerLocation of a FAMILY: Family Members promotion */ if (APartnerClass == SharedTypes.PartnerClassEnumToString(TPartnerClass.FAMILY)) { /* * If the value in the DateGoodUntil column has changed, silently * update it for all PERSONs of this FAMILY that have the same * LocationKey. */ if (TSaveConvert.ObjectToDate(PartnerLocationTable[PartnerLocationCounter][PPartnerLocationTable. GetDateGoodUntilDBName(), DataRowVersion.Original]) != TSaveConvert.ObjectToDate(PartnerLocationTable[PartnerLocationCounter][PPartnerLocationTable. GetDateGoodUntilDBName(), DataRowVersion.Current])) { // TLogging.LogAtLevel(8, "SubmitChanges: PartnerLocation of a FAMILY: DateGoodUntil has changed -> promoting change to FAMILY members..."); PromoteToFamilyMembersDateGoodUntilChange(APartnerKey, PartnerLocationTable[PartnerLocationCounter], ASubmitChangesTransaction); } } break; case DataRowState.Deleted: /* * PPartnerLocation must not get deleted if it is the last one of the * Partner, but must get mapped to Location 0 instead! */ // Make sure that Location 0 can never get deleted! if (Convert.ToInt32(PartnerLocationTable[PartnerLocationCounter][PPartnerLocationTable.GetLocationKeyDBName(), DataRowVersion.Original]) != 0) { // Some other Location than Location 0 is about to be deleted! // Check in the in-memory PartnerLocation Table first... DataRow[] ChangePartnerLocationKeyRows = PartnerLocationTable.Select( PPartnerLocationTable.GetPartnerKeyDBName() + " = " + APartnerKey.ToString() + " AND " + PPartnerLocationTable.GetLocationKeyDBName() + " <> " + PartnerLocationTable[PartnerLocationCounter][PPartnerLocationTable.GetLocationKeyDBName(), DataRowVersion.Original].ToString(), "", DataViewRowState.CurrentRows); if (ChangePartnerLocationKeyRows.Length == 0) { // No PPartnerLocation that is not deleted is left in // PartnerLocationTable > now check for deleted ones DataView DeletedPartnerLocationsDV = new DataView(PartnerLocationTable, "", "", DataViewRowState.Deleted); int[] DeletedPartnerLocationKeys = new int[DeletedPartnerLocationsDV.Count]; for (Int16 DeletedPartnerLocationsCounter = 0; DeletedPartnerLocationsCounter <= DeletedPartnerLocationsDV.Count - 1; DeletedPartnerLocationsCounter += 1) { DeletedPartnerLocationKeys[DeletedPartnerLocationsCounter] = Convert.ToInt32(DeletedPartnerLocationsDV[DeletedPartnerLocationsCounter].Row[PPartnerLocationTable. GetLocationKeyDBName(), DataRowVersion.Original ]); } // now check in the DB as well if (!CheckHasPartnerOtherPartnerLocations(DeletedPartnerLocationKeys, APartnerKey, ASubmitChangesTransaction)) { // 'Undelete' DataRow and make it point to Location 0 // (dummy Location) > will get submitted lateron! PartnerLocationTable[PartnerLocationCounter].RejectChanges(); PartnerLocationTable[PartnerLocationCounter].LocationKey = 0; // TLogging.LogAtLevel(8, "SubmitChanges: PPartnerLocation " + // PartnerLocationTable[PartnerLocationCounter][PPartnerLocationTable.GetLocationKeyDBName(), // DataRowVersion.Original].ToString() + ": was last PartnerLocation, so its LocationKey got set to 0 (will be submitted lateron)!"); } } else { // There is at least one PPartnerLocation that is not deleted // left in PartnerLocationTable, so the current PPartnerLocation // can't be the last one > nothing to do. } } else { DataRow[] ChangePartnerLocationKeyRows = PartnerLocationTable.Select( PPartnerLocationTable.GetPartnerKeyDBName() + " = " + APartnerKey.ToString() + " AND " + PPartnerLocationTable.GetLocationKeyDBName() + " = 0 ", "", DataViewRowState.CurrentRows); // TLogging.LogAtLevel(8, "SubmitChanges: ChangePartnerLocationKeyRows Length: " + Convert.ToInt16(ChangePartnerLocationKeyRows.Length).ToString()); if (ChangePartnerLocationKeyRows.Length != 0) { // remove this location because it should not be submitted to the database PartnerLocationTable.Rows.RemoveAt(PartnerLocationCounter); PartnerLocationCounter--; // TLogging.LogAtLevel(8, "SubmitChanges: Extra Location 0 row won''t be submitted lateron"); } } break; case DataRowState.Unchanged: break; default: throw new ArgumentException( "SubmitChanges can only deal with PartnerLocations of DataRowState Added, Modified or Deleted, but not with " + (Enum.GetName(typeof(DataRowState), PartnerLocationTable.Rows[PartnerLocationCounter].RowState))); } } return Result; }
/// <summary> /// Check each Location DataRow before calling SubmitChanges /// to enforce Business Rules: /// - Added or changed Location: check for a similar Location record /// - if no similar Location record exists, save this Location record /// - if a similar Location record exists: allow choosing whether the /// existing one should be used, or this Location record should be saved /// - Changed Location: don't save Location record if the data is actually /// the same than before /// - Deleted Location: delete Location only if no other PartnerLocation /// is referencing it /// - Deleted Location: remove references from any Extracts /// </summary> private static TSubmitChangesResult ProcessLocationChanges( PLocationTable ALocationTable, PPartnerLocationTable APartnerLocationTable, ref PartnerAddressAggregateTDS AResponseDS, TDBTransaction ASubmitChangesTransaction, Int64 APartnerKey, ref PartnerAddressAggregateTDSSimilarLocationParametersTable AExistingLocationParametersDT, ref TLocationPK[, ] ASimilarLocationReUseKeyMapping, ref PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable AAddressAddedOrChangedPromotionParametersDT, ref PartnerAddressAggregateTDSChangePromotionParametersTable AChangeLocationParametersDT, ref TVerificationResultCollection AVerificationResult) { TSubmitChangesResult Result = TSubmitChangesResult.scrOK; TSubmitChangesResult TmpResult; for (Int16 LocationCounter = 0; LocationCounter < ALocationTable.Rows.Count; LocationCounter++) { if ((ALocationTable.Rows[LocationCounter].RowState == DataRowState.Added) || (ALocationTable.Rows[LocationCounter].RowState == DataRowState.Modified)) { if (ALocationTable[LocationCounter].LocationKey == 0) { throw new Exception("TPPartnerAddress.ProcessLocationChanges: must not add or modify the empty location"); } } if (ALocationTable.Rows[LocationCounter].RowState == DataRowState.Deleted) { if (Convert.ToInt32(ALocationTable[LocationCounter][PLocationTable.GetLocationKeyDBName(), DataRowVersion.Original]) == 0) { throw new Exception("TPPartnerAddress.ProcessLocationChanges: must not delete the empty location"); } } if (ALocationTable.Rows[LocationCounter].RowState == DataRowState.Added) { bool ReUseSimilarLocation = false; // Check for reuse of a similar location in the DB PLocationRow TmpRow = ALocationTable[LocationCounter]; TmpResult = PerformSimilarLocationReUseChecks( ref TmpRow, ref AResponseDS, ASubmitChangesTransaction, APartnerKey, ref AExistingLocationParametersDT, ref APartnerLocationTable, ref ASimilarLocationReUseKeyMapping, out ReUseSimilarLocation, ref AVerificationResult); // TLogging.LogAtLevel(8, "SubmitChanges: TmpRow.LocationKey after PerformSimilarLocationReUseChecks (1): " + TmpRow.LocationKey.ToString()); if (TmpResult != TSubmitChangesResult.scrOK) { // Stop processing here - we need a decision whether to re-use // an existing Location or not (or the user tried to re-use a // Location that is already used by this Partner, which is a // user error) return TmpResult; } } // DataRowState.Added else if (ALocationTable.Rows[LocationCounter].RowState == DataRowState.Modified) { if (CheckHasLocationChanged(ALocationTable[LocationCounter])) { bool ReUseSimilarLocation = false; // Check for reuse of a similar location in the DB PLocationRow TmpRow = ALocationTable[LocationCounter]; TmpResult = PerformSimilarLocationReUseChecks(ref TmpRow, ref AResponseDS, ASubmitChangesTransaction, APartnerKey, ref AExistingLocationParametersDT, ref APartnerLocationTable, ref ASimilarLocationReUseKeyMapping, out ReUseSimilarLocation, ref AVerificationResult); // TLogging.LogAtLevel(9, "SubmitChanges: TmpRow.LocationKey after PerformSimilarLocationReUseChecks (2): " + TmpRow.LocationKey.ToString()); if (TmpResult != TSubmitChangesResult.scrOK) { // Stop processing here - we need a decision whether to re-use // an existing Location or not (or the user tried to re-use a // Location that is already used by this Partner, which is a // user error) return TmpResult; } if (!ReUseSimilarLocation) { // No similar Location exists, or an existing similar Location // should not be reused if (CheckHasPartnerLocationOtherPartnerReferences(ALocationTable[LocationCounter], APartnerKey, ASubmitChangesTransaction)) { // TLogging.LogAtLevel(9, "SubmitChanges: Location " + ALocationTable[LocationCounter].LocationKey.ToString() + ": is used by other Partners as well."); bool CreateLocationFlag; TLocationPK OriginalLocationKey; TmpResult = PerformLocationChangeChecks(ALocationTable[LocationCounter], APartnerKey, ref AResponseDS, ASubmitChangesTransaction, ref AAddressAddedOrChangedPromotionParametersDT, ref AChangeLocationParametersDT, ref APartnerLocationTable, ref AVerificationResult, out CreateLocationFlag, out OriginalLocationKey); if (TmpResult != TSubmitChangesResult.scrOK) { Result = TmpResult; if (Result == TSubmitChangesResult.scrError) { return Result; } } if (CreateLocationFlag) { ModifyExistingLocationParameters(ALocationTable[LocationCounter], OriginalLocationKey, ref AExistingLocationParametersDT); // Make this location's DataRow undmodified because it should not be submitted to the database ALocationTable.Rows[LocationCounter].AcceptChanges(); LocationCounter--; } } // if CheckHasPartnerLocationOtherPartnerReferences ... then } } // if CheckHasLocationChanged ... then else { // TLogging.LogAtLevel(9, "Location " + ALocationTable[LocationCounter].LocationKey.ToString() + ": data has NOT changed -> will not be saved."); // remove this location because it should not be submitted to the database ALocationTable.Rows.RemoveAt(LocationCounter); LocationCounter--; } } // DataRowState.Modified else if (ALocationTable.Rows[LocationCounter].RowState == DataRowState.Deleted) { // TLogging.LogAtLevel(9, "SubmitChanges: Location " + ALocationTable[LocationCounter] // [PLocationTable.GetLocationKeyDBName(), DataRowVersion.Original].ToString() + ": has been marked for deletion."); // Handle deletion of Location row: delete it only if no other PartnerLocation is referencing it if (CheckHasPartnerLocationOtherPartnerReferences(ALocationTable[LocationCounter], APartnerKey, ASubmitChangesTransaction)) { // TLogging.LogAtLevel(9, TLogging.Log("SubmitChanges: Location " + // ALocationTable[LocationCounter][PLocationTable.GetLocationKeyDBName(), DataRowVersion.Original].ToString() + // ": has been marked for deletion and is used by others, so it won''t get deleted."); // remove this location because it should not be submitted to the database ALocationTable.Rows.RemoveAt(LocationCounter); LocationCounter--; } else { // TLogging.LogAtLevel(9, "SubmitChanges: Location " + ALocationTable[LocationCounter][PLocationTable.GetLocationKeyDBName(), // DataRowVersion.Original].ToString() + ": has been marked for deletion and will get deleted."); // Any Extract in Petra that references this Location must no longer // reference this Location since it will get deleted RemoveLocationFromExtracts(ALocationTable[LocationCounter], ASubmitChangesTransaction); } } // if LocationTable.Rows[LocationCounter].RowState = DataRowState.Deleted else if (ALocationTable.Rows[LocationCounter].RowState != DataRowState.Unchanged) { throw new ArgumentException( "SubmitChanges can only deal with Locations of DataRowState Added, Modified or Deleted, but not with " + (Enum.GetName(typeof(DataRowState), ALocationTable.Rows[LocationCounter].RowState))); } } return Result; }
/// <summary> /// todoComment /// </summary> /// <param name="ALocationRow"></param> /// <param name="APartnerKey"></param> /// <param name="AExistingLocationParametersDT"></param> /// <param name="AReadTransaction"></param> /// <param name="AExistingSiteKey"></param> /// <param name="AExistingLocationKey"></param> /// <returns></returns> private static Boolean CheckReUseExistingLocation(PLocationRow ALocationRow, Int64 APartnerKey, ref PartnerAddressAggregateTDSSimilarLocationParametersTable AExistingLocationParametersDT, TDBTransaction AReadTransaction, out Int64 AExistingSiteKey, out Int32 AExistingLocationKey) { Boolean ReturnValue; PLocationTable MatchingLocationsDT; Boolean FoundSimilarLocation; PartnerAddressAggregateTDSSimilarLocationParametersRow SimilarLocationRow; PartnerAddressAggregateTDSSimilarLocationParametersRow SimilarLocationParameterRow; DataView ExistingLocationParametersDV; int LocationUsedByNPartners; int Counter; PLocationRow MatchingLocationRow; AExistingSiteKey = 0; AExistingLocationKey = 0; // TLogging.LogAtLevel(9, "CheckReUseExistingLocation for Location " + ALocationRow.LocationKey.ToString() + // ": AExistingLocationParametersDT.Rows.Count: " + AExistingLocationParametersDT.Rows.Count.ToString()); // Check if there is a Parameter Row for the LocationKey we are looking at ExistingLocationParametersDV = new DataView(AExistingLocationParametersDT, PartnerAddressAggregateTDSSimilarLocationParametersTable.GetSiteKeyDBName() + " = " + ALocationRow.SiteKey.ToString() + " AND " + PartnerAddressAggregateTDSSimilarLocationParametersTable.GetLocationKeyDBName() + " = " + ALocationRow.LocationKey.ToString(), "", DataViewRowState.CurrentRows); // No, there isn't one: perform DB check if (ExistingLocationParametersDV.Count == 0) { FoundSimilarLocation = false; #region Look in the DB for *similar* Locations // first check how many odbc parameters need to be created int CountParameters = 0; int CurrentParameter = 0; if (!ALocationRow.IsLocalityNull() && (ALocationRow.Locality != "")) { CountParameters++; } if (!ALocationRow.IsStreetNameNull() && (ALocationRow.StreetName != "")) { CountParameters++; } if (!ALocationRow.IsCityNull() && (ALocationRow.City != "")) { CountParameters++; } if (!ALocationRow.IsPostalCodeNull() && (ALocationRow.PostalCode != "")) { CountParameters++; } if (!ALocationRow.IsCountryCodeNull() && (ALocationRow.CountryCode != "")) { CountParameters++; } // initialize parameters and prepare SQL statement OdbcParameter[] parameters = new OdbcParameter[CountParameters]; string sqlLoadSimilarAddresses = "SELECT * FROM PUB_" + PLocationTable.GetTableDBName() + " WHERE"; // add Locality to query sqlLoadSimilarAddresses += " " + PLocationTable.GetLocalityDBName(); if (ALocationRow.IsLocalityNull() || (ALocationRow.Locality == "")) { sqlLoadSimilarAddresses += " is null"; } else { sqlLoadSimilarAddresses += " = ?"; parameters[CurrentParameter] = new OdbcParameter("Locality", OdbcType.VarChar); parameters[CurrentParameter].Value = ALocationRow.Locality; CurrentParameter++; } // add Street Name to query sqlLoadSimilarAddresses += " AND " + PLocationTable.GetStreetNameDBName(); if (ALocationRow.IsStreetNameNull() || (ALocationRow.StreetName == "")) { sqlLoadSimilarAddresses += " is null"; } else { sqlLoadSimilarAddresses += " = ?"; parameters[CurrentParameter] = new OdbcParameter("StreetName", OdbcType.VarChar); parameters[CurrentParameter].Value = ALocationRow.StreetName; CurrentParameter++; } // add City to query sqlLoadSimilarAddresses += " AND " + PLocationTable.GetCityDBName(); if (ALocationRow.IsCityNull() || (ALocationRow.City == "")) { sqlLoadSimilarAddresses += " is null"; } else { sqlLoadSimilarAddresses += " = ?"; parameters[CurrentParameter] = new OdbcParameter("City", OdbcType.VarChar); parameters[CurrentParameter].Value = ALocationRow.City; CurrentParameter++; } // add Post Code to query sqlLoadSimilarAddresses += " AND " + PLocationTable.GetPostalCodeDBName(); if (ALocationRow.IsPostalCodeNull() || (ALocationRow.PostalCode == "")) { sqlLoadSimilarAddresses += " is null"; } else { sqlLoadSimilarAddresses += " = ?"; parameters[CurrentParameter] = new OdbcParameter("PostalCode", OdbcType.VarChar); parameters[CurrentParameter].Value = ALocationRow.PostalCode; CurrentParameter++; } // add Country Code to query sqlLoadSimilarAddresses += " AND " + PLocationTable.GetCountryCodeDBName(); if (ALocationRow.IsCountryCodeNull() || (ALocationRow.CountryCode == "")) { sqlLoadSimilarAddresses += " is null"; } else { sqlLoadSimilarAddresses += " = ?"; parameters[CurrentParameter] = new OdbcParameter("CountryCode", OdbcType.VarChar); parameters[CurrentParameter].Value = ALocationRow.CountryCode; CurrentParameter++; } MatchingLocationsDT = new PLocationTable(); // run query to find similar locations DBAccess.GDBAccessObj.SelectDT(MatchingLocationsDT, sqlLoadSimilarAddresses, AReadTransaction, parameters, 0, 0); /* * Note: County and Address3 are not searched for - we are looking for a * Location that is *similar*! */ MatchingLocationRow = null; // to avoid compiler warning if (MatchingLocationsDT.Rows.Count != 0) { // check if any of the returned Rows is not the current Row for (Counter = 0; Counter <= MatchingLocationsDT.Rows.Count - 1; Counter += 1) { if (MatchingLocationsDT[Counter].LocationKey != ALocationRow.LocationKey) { FoundSimilarLocation = true; AExistingSiteKey = MatchingLocationsDT[Counter].SiteKey; AExistingLocationKey = (int)MatchingLocationsDT[Counter].LocationKey; MatchingLocationRow = (PLocationRow)MatchingLocationsDT[Counter]; break; } } } else { FoundSimilarLocation = false; } #endregion if (FoundSimilarLocation) { // TLogging.LogAtLevel(9, "CheckReUseExistingLocation: Location " + ALocationRow.LocationKey.ToString() + ": found a similar Location (" + AExistingLocationKey.ToString() + ")!"); AExistingLocationParametersDT = new PartnerAddressAggregateTDSSimilarLocationParametersTable( MPartnerConstants.EXISTINGLOCATIONPARAMETERS_TABLENAME); LocationUsedByNPartners = (Int16)(PPartnerLocationAccess.CountViaPLocation(AExistingSiteKey, AExistingLocationKey, AReadTransaction)); // TLogging.LogAtLevel(9, "CheckReUseExistingLocation: LocationUsedByNPartners: " + LocationUsedByNPartners.ToString()); SimilarLocationRow = AExistingLocationParametersDT.NewRowTyped(false); SimilarLocationRow.SiteKey = ALocationRow.SiteKey; SimilarLocationRow.LocationKey = ALocationRow.LocationKey; SimilarLocationRow.Locality = TSaveConvert.StringColumnToString(MatchingLocationsDT.ColumnLocality, MatchingLocationRow); SimilarLocationRow.StreetName = TSaveConvert.StringColumnToString(MatchingLocationsDT.ColumnStreetName, MatchingLocationRow); SimilarLocationRow.Address3 = TSaveConvert.StringColumnToString(MatchingLocationsDT.ColumnAddress3, MatchingLocationRow); SimilarLocationRow.City = TSaveConvert.StringColumnToString(MatchingLocationsDT.ColumnCity, MatchingLocationRow); SimilarLocationRow.PostalCode = TSaveConvert.StringColumnToString(MatchingLocationsDT.ColumnPostalCode, MatchingLocationRow); SimilarLocationRow.County = TSaveConvert.StringColumnToString(MatchingLocationsDT.ColumnCounty, MatchingLocationRow); SimilarLocationRow.CountryCode = TSaveConvert.StringColumnToString(MatchingLocationsDT.ColumnCountryCode, MatchingLocationRow); if (LocationUsedByNPartners > 0) { SimilarLocationRow.UsedByNOtherPartners = LocationUsedByNPartners; } else { SimilarLocationRow.UsedByNOtherPartners = 0; } SimilarLocationRow.SiteKeyOfSimilarLocation = AExistingSiteKey; SimilarLocationRow.LocationKeyOfSimilarLocation = AExistingLocationKey; SimilarLocationRow.AnswerProcessedClientSide = false; SimilarLocationRow.AnswerProcessedServerSide = false; AExistingLocationParametersDT.Rows.Add(SimilarLocationRow); SimilarLocationRow.AcceptChanges(); ReturnValue = true; } else { // TLogging.LogAtLevel(9, "CheckReUseExistingLocation: Location " + ALocationRow.LocationKey.ToString() + ": found no similar Location."); ReturnValue = false; } } else { // AExistingLocationParametersDT was passed in, holding parameters for the LocationKey we are looking at SimilarLocationParameterRow = (PartnerAddressAggregateTDSSimilarLocationParametersRow)ExistingLocationParametersDV[0].Row; if (SimilarLocationParameterRow.AnswerReuse) { AExistingSiteKey = SimilarLocationParameterRow.SiteKeyOfSimilarLocation; AExistingLocationKey = SimilarLocationParameterRow.LocationKeyOfSimilarLocation; // TLogging.LogAtLevel(9, "CheckReUseExistingLocation: AExistingLocationParametersDT tells me to re-use existing Location " + // AExistingLocationParametersDT[0].LocationKeyOfSimilarLocation.ToString() + '.'); SimilarLocationParameterRow.AnswerProcessedClientSide = true; // SimilarLocationParameterRow.AcceptChanges; ReturnValue = true; } else { // TLogging.LogAtLevel(9, "CheckReUseExistingLocation: AExistingLocationParametersDT tells me NOT to re-use existing Location."); SimilarLocationParameterRow.AnswerProcessedClientSide = true; // SimilarLocationParameterRow.AcceptChanges; ReturnValue = false; } } return ReturnValue; }
/// <summary> /// todoComment /// </summary> /// <param name="AInspectDS"></param> /// <param name="AExistingLocationParametersDT"></param> /// <param name="AChangeLocationParametersDT"></param> /// <param name="AAddressAddedOrChangedPromotionParametersDT"></param> private static void CheckParameterTables(PartnerAddressAggregateTDS AInspectDS, out PartnerAddressAggregateTDSSimilarLocationParametersTable AExistingLocationParametersDT, out PartnerAddressAggregateTDSChangePromotionParametersTable AChangeLocationParametersDT, out PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable AAddressAddedOrChangedPromotionParametersDT) { if (AInspectDS != null) { if (AInspectDS.Tables.Contains(MPartnerConstants.EXISTINGLOCATIONPARAMETERS_TABLENAME)) { if (AInspectDS.Tables[MPartnerConstants.EXISTINGLOCATIONPARAMETERS_TABLENAME] is PartnerAddressAggregateTDSSimilarLocationParametersTable) { AExistingLocationParametersDT = (PartnerAddressAggregateTDSSimilarLocationParametersTable)AInspectDS.Tables[MPartnerConstants. EXISTINGLOCATIONPARAMETERS_TABLENAME]; /* if DEBUGMODE * if (TLogging.DL >= 9) * { * TLogging.Log( * "CheckParameterTables: Passed in ParameterTable ''" + MPartnerConstants.EXISTINGLOCATIONPARAMETERS_TABLENAME + * "''; Rows.Count: " + AExistingLocationParametersDT.Rows.Count.ToString()); * } * if (TLogging.DL >= 8) * { * for (Int16 TmpRowCounter = 0; TmpRowCounter <= AExistingLocationParametersDT.Rows.Count - 1; TmpRowCounter += 1) * { * TLogging.Log( * "CheckParameterTables: AExistingLocationParametersDT: Row[" + TmpRowCounter.ToString() + "]: PLocationKey: " + * AExistingLocationParametersDT[TmpRowCounter][PartnerAddressAggregateTDSSimilarLocationParametersTable. * GetLocationKeyDBName(), * DataRowVersion.Original].ToString() + "; PSiteKey: " + * AExistingLocationParametersDT[TmpRowCounter][PartnerAddressAggregateTDSSimilarLocationParametersTable. * GetSiteKeyDBName(), * DataRowVersion.Original].ToString() + "; RowState: " + * (Enum.GetName(typeof(DataRowState), AExistingLocationParametersDT.Rows[TmpRowCounter].RowState))); * } * } */ } else { throw new EOPAppException("Expected Typed DataTable, received normal DataTable"); } } else { AExistingLocationParametersDT = new PartnerAddressAggregateTDSSimilarLocationParametersTable( MPartnerConstants.EXISTINGLOCATIONPARAMETERS_TABLENAME); } if (AInspectDS.Tables.Contains(MPartnerConstants.ADDRESSCHANGEPROMOTIONPARAMETERS_TABLENAME)) { if (AInspectDS.Tables[MPartnerConstants.ADDRESSCHANGEPROMOTIONPARAMETERS_TABLENAME] is PartnerAddressAggregateTDSChangePromotionParametersTable) { AChangeLocationParametersDT = (PartnerAddressAggregateTDSChangePromotionParametersTable)AInspectDS.Tables[MPartnerConstants. ADDRESSCHANGEPROMOTIONPARAMETERS_TABLENAME]; // TLogging.LogAtLevel(9, "CheckParameterTables: Passed in ParameterTable ''" + MPartnerConstants.ADDRESSCHANGEPROMOTIONPARAMETERS_TABLENAME + // "''; Rows.Count: " + AChangeLocationParametersDT.Rows.Count.ToString()); } else { throw new EOPAppException("Expected Typed DataTable, received normal DataTable"); } } else { AChangeLocationParametersDT = new PartnerAddressAggregateTDSChangePromotionParametersTable( MPartnerConstants.ADDRESSCHANGEPROMOTIONPARAMETERS_TABLENAME); } if (AInspectDS.Tables.Contains(MPartnerConstants.ADDRESSADDEDORCHANGEDPROMOTION_TABLENAME)) { if (AInspectDS.Tables[MPartnerConstants.ADDRESSADDEDORCHANGEDPROMOTION_TABLENAME] is PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable) { AAddressAddedOrChangedPromotionParametersDT = (PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable)AInspectDS.Tables [MPartnerConstants.ADDRESSADDEDORCHANGEDPROMOTION_TABLENAME]; // TLogging.LogAtLevel(9, "CheckParameterTables: Passed in ParameterTable ''" + MPartnerConstants.ADDRESSADDEDORCHANGEDPROMOTION_TABLENAME + // "''; Rows.Count: " + AAddressAddedOrChangedPromotionParametersDT.Rows.Count.ToString()); } else { throw new EOPAppException("Expected Typed DataTable, received normal DataTable"); } } else { AAddressAddedOrChangedPromotionParametersDT = new PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable( MPartnerConstants.ADDRESSADDEDORCHANGEDPROMOTION_TABLENAME); } } else { // TLogging.LogAtLevel(9, "CheckParameterTables: Passed in ParameterDataSet is nil."); AExistingLocationParametersDT = new PartnerAddressAggregateTDSSimilarLocationParametersTable( MPartnerConstants.EXISTINGLOCATIONPARAMETERS_TABLENAME); AChangeLocationParametersDT = new PartnerAddressAggregateTDSChangePromotionParametersTable( MPartnerConstants.ADDRESSCHANGEPROMOTIONPARAMETERS_TABLENAME); AAddressAddedOrChangedPromotionParametersDT = new PartnerAddressAggregateTDSAddressAddedOrChangedPromotionTable( MPartnerConstants.ADDRESSADDEDORCHANGEDPROMOTION_TABLENAME); } }