Die Art und Weise, wie für bestimmte Datentypen Datensätze anhand gegebener Postleitzahlen ermittelt werden, ist durch die Programmierung von entsprechenden Datensatzlokatoren anpassbar.
Ein Datensatzlokator für die Umkreissuche muss das Interface
BA.Contact.Helpers.RadiusSearch.IRadiusSearchRecordLocator
implementieren.
Die Implementierung eines Datensatzlokators beinhaltet zwei Mechanismen: zum einen eine Kennung, für welche Datentypen dieser Lokator verwendet werden soll, zum anderen die Implementierung der Methode LocateRecords
, welche anhand eines String-Arrays mit Postleitzahlen entsprechend die Oids der anzuzeigenden Datensätze ermittelt. Die Ermittlung der Lokatoren erfolgt “von innen nach außen”, das heißt, sortiert nach Assembly-Typ beginnend mit dem CXM Core und endend mit Serviceprojektimplementierungen, so dass in entsprechenden Projekten die Lokatoren für bestimmte Datentypen notfalls ersetzt werden können.
Datensatzlokatoren können bei Bedarf über die statische Umkreissuche-Hilfsklasse BA.Contact.Helpers.RadiusSearch.RadiusSearchHelper
abgerufen werden:
public static IRadiusSearchRecordLocator GetRadiusSearchRecordLocator(Guid dataSource)
Die Suche selbst findet dann auf dem zurückgelieferten Objekt über die Methode LocateRecords
statt:
IQueryable<Guid> LocateRecords(string[] postalCodes)
In CXM existieren zwei Implementierungen hierfür:
Die Standardimplementierung liefert für alle Datentypen, die eine Teildatentabelle vom Typ OrmSubAddress
beinhalten, die Guids aller Datensätze, deren in den Teildatensätzen der Hauptanschrift angegebenen Postleitzahlen mit den gesuchten Werten übereinstimmen.
Diese Implementierung ist für Kontakte jedoch nicht hinreichend, da dort die Regel vorherrscht, dass die Hauptanschrift der übergeordneten Firma verwendet wird, wenn der Kontakt selbst keine Hauptanschrift hat. In diesem Fall würden Kontakte ohne eigene Hauptanschrift nicht bei der Suche berücksichtigt. Daher existiert eine gesonderte Implementierung explizit für Kontakte, welche sich bei der Suche nach den gewünschten Datensätzen die auf Kontakten existierende berechnete Eigenschaft MainPostalCode
zunutze macht. Diese berechnete Eigenschaft hält sich an obige Regel und ist durch die Angabe eines PersistentAlias-Attributs auch in Datenbankabfragen verwendbar.
Im Folgenden als Beispiel die Implementierung für die Suche nach Kontakten:
using BA.API;
using BA.Contact.Enums.Extensions;
using BA.Contact.Helpers.RadiusSearch;
using BA.CRM.Contact.DB;
using System;
using System.Linq;
namespace BA.CRM.Contact.RadiusSearch
{
/// <summary>
/// CRM contacts use the main address of their company, if they do not have one on their own. Radius search must
/// be modified regarding this.
/// </summary>
public class CRMContactsRadiusSearchRecordLocator : IRadiusSearchRecordLocator
{
/// <inheritdoc/>
public Guid[] ValidForDataSources => new Guid[] { EnumDataSourceExtension.Contact };
/// <inheritdoc/>
public IQueryable<Guid> LocateRecords(string[] postalCodes)
{
IQueryable<Guid> result = Api.ORM.GetQuery<OrmCRMContact>()
.Where(contact => postalCodes.Contains(contact.MainPostalCode))
.Select(ff => ff.Oid);
return result;
}
}
}