/////////////////////////////////////////////////////////// // Bool.cs // Implementation of Class RelatedObjectIDFetcher // CSLA type: Read-only object // Created on: 17-Dec-2008 // Object design: John // Coded: 17-Dec-2008 /////////////////////////////////////////////////////////// using System; using System.Data; using CSLA.Data; using GZTW.Data; using CSLA; using System.Threading; using CSLA.Security; using System.ComponentModel; using System.Collections.Generic; namespace GZTW.AyaNova.BLL { //case 981 /// ///Fetch the id of objects related to other objects /// /// /// [Serializable, EditorBrowsable(EditorBrowsableState.Never)] internal class RelatedObjectIDFetcher : ReadOnlyBase { #region Attributes private List mIDList=new List(); #endregion #region Constructor /// /// Private constructor to prevent direct instantiation /// private RelatedObjectIDFetcher() { } #endregion #region Static methods /// /// Returns the ID of a specific object type related /// to the specific object type and ID passed in. /// /// For example if a workorder labour id and type is passed in and the /// related type is Client then the client id for the work order that the labour record /// id is found in is returned /// /// Note: this is *not* a regionalized method for performance reasons, /// if you need to ensure results are within a specific region you must handle that yourself. /// /// Source object starting point (the object we have) /// Desired relative type (the object we want) /// ID of found related object of type specified or Guid.Empty if no result internal static List GetRelatedObjectID(TypeAndID ObjectTypeAndID, RootObjectTypes RelatedObjectType) { if (RelatedObjectType != RootObjectTypes.Client) throw new System.NotSupportedException(RelatedObjectType.ToString() + " is not currently supported. Object types supported are: Client"); return ((RelatedObjectIDFetcher)DataPortal.Fetch(new Criteria(ObjectTypeAndID, RelatedObjectType))).mIDList; } #endregion #region DAL DATA ACCESS /// /// protected override void DataPortal_Fetch(object Criteria) { Criteria crit = (Criteria)Criteria; mIDList.Clear(); string q = ""; if (crit.RelatedObjectType == RootObjectTypes.Client) { #region Client is desired type switch (crit.ObjectTypeAndID.RootObjectType) { case RootObjectTypes.Client: mIDList.Add(crit.ObjectTypeAndID.ID); return; case RootObjectTypes.Workorder: q = "SELECT ACLIENTID FROM AWORKORDER WHERE AWORKORDER.AID=@ID"; break; case RootObjectTypes.WorkorderItem: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERITEM " + "LEFT OUTER JOIN AWORKORDER ON (AWORKORDERITEM.AWORKORDERID = AWORKORDER.AID) " + "WHERE AWORKORDERITEM.AID=@ID"; break; case RootObjectTypes.WorkorderItemLabor: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERITEM " + "INNER JOIN AWORKORDER ON (AWORKORDERITEM.AWORKORDERID = AWORKORDER.AID) " + "INNER JOIN AWORKORDERITEMLABOR ON (AWORKORDERITEM.AID = AWORKORDERITEMLABOR.AWORKORDERITEMID) " + "WHERE (AWORKORDERITEMLABOR.AID = @ID)"; break; case RootObjectTypes.WorkorderItemLoan: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERITEM " + "INNER JOIN AWORKORDER ON (AWORKORDERITEM.AWORKORDERID = AWORKORDER.AID) " + "INNER JOIN AWORKORDERITEMLOAN ON (AWORKORDERITEM.AID = AWORKORDERITEMLOAN.AWORKORDERITEMID) " + "WHERE (AWORKORDERITEMLOAN.AID = @ID)"; break; case RootObjectTypes.WorkorderItemMiscExpense: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERITEM " + "INNER JOIN AWORKORDER ON (AWORKORDERITEM.AWORKORDERID = AWORKORDER.AID) " + "INNER JOIN AWORKORDERITEMMISCEXPENSE ON (AWORKORDERITEM.AID = AWORKORDERITEMMISCEXPENSE.AWORKORDERITEMID) " + "WHERE (AWORKORDERITEMMISCEXPENSE.AID = @ID)"; break; case RootObjectTypes.WorkorderItemOutsideService: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERITEM " + "INNER JOIN AWORKORDER ON (AWORKORDERITEM.AWORKORDERID = AWORKORDER.AID) " + "INNER JOIN AWORKORDERITEMOUTSIDESERVICE ON (AWORKORDERITEM.AID = AWORKORDERITEMOUTSIDESERVICE.AWORKORDERITEMID) " + "WHERE (AWORKORDERITEMOUTSIDESERVICE.AID = @ID)"; break; case RootObjectTypes.WorkorderItemPart: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERITEM " + "INNER JOIN AWORKORDER ON (AWORKORDERITEM.AWORKORDERID = AWORKORDER.AID) " + "INNER JOIN AWORKORDERITEMPART ON (AWORKORDERITEM.AID = AWORKORDERITEMPART.AWORKORDERITEMID) " + "WHERE (AWORKORDERITEMPART.AID = @ID)"; break; case RootObjectTypes.WorkorderItemTravel: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERITEM " + "INNER JOIN AWORKORDER ON (AWORKORDERITEM.AWORKORDERID = AWORKORDER.AID) " + "INNER JOIN AWORKORDERITEMTRAVEL ON (AWORKORDERITEM.AID = AWORKORDERITEMTRAVEL.AWORKORDERITEMID) " + "WHERE (AWORKORDERITEMTRAVEL.AID = @ID)"; break; case RootObjectTypes.WorkorderPreventiveMaintenance: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERPREVENTIVEMAINTENANCE " + "INNER JOIN AWORKORDER ON (AWORKORDERPREVENTIVEMAINTENANCE.AWORKORDERID = AWORKORDER.AID) " + "WHERE (AWORKORDERPREVENTIVEMAINTENANCE.AID = @ID)"; break; case RootObjectTypes.WorkorderQuote: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERQUOTE " + "INNER JOIN AWORKORDER ON (AWORKORDERQUOTE.AWORKORDERID = AWORKORDER.AID) " + "WHERE (AWORKORDERQUOTE.AID = @ID)"; break; case RootObjectTypes.WorkorderService: q = "SELECT AWORKORDER.ACLIENTID FROM AWORKORDERSERVICE " + "INNER JOIN AWORKORDER ON (AWORKORDERSERVICE.AWORKORDERID = AWORKORDER.AID) " + "WHERE (AWORKORDERSERVICE.AID = @ID)"; break; case RootObjectTypes.AssignedDocument: q = "SELECT ACLIENT.AID FROM AASSIGNEDDOC " + "INNER JOIN ACLIENT ON (AASSIGNEDDOC.AROOTOBJECTID = ACLIENT.AID) " + "WHERE (AASSIGNEDDOC.AID = @ID)"; break; case RootObjectTypes.ClientNote: q = "SELECT ACLIENTID FROM ACLIENTNOTE " + "WHERE (ACLIENTNOTE.AID = @ID)"; break; case RootObjectTypes.ClientServiceRequest: q = "SELECT ACLIENTID FROM ACLIENTSERVICEREQUEST " + "WHERE (ACLIENTSERVICEREQUEST.AID = @ID)"; break; case RootObjectTypes.Contract: q = "SELECT ACLIENT.AID FROM ACLIENT " + "INNER JOIN ACONTRACT ON (ACLIENT.ACONTRACTID = ACONTRACT.AID) " + "WHERE (ACONTRACT.AID = @ID)"; break; case RootObjectTypes.DispatchZone: q = "SELECT ACLIENT.AID FROM ACLIENT " + "INNER JOIN ADISPATCHZONE ON (ACLIENT.ADISPATCHZONEID = ADISPATCHZONE.AID) " + "WHERE (ADISPATCHZONE.AID = @ID)"; break; case RootObjectTypes.HeadOffice: q = "SELECT ACLIENT.AID FROM AHEADOFFICE " + "INNER JOIN ACLIENT ON (AHEADOFFICE.AID = ACLIENT.AHEADOFFICEID) " + "WHERE (AHEADOFFICE.AID = @ID)"; break; case RootObjectTypes.Project: q = "SELECT ACLIENT.AID FROM APROJECT " + "INNER JOIN AWORKORDER ON (APROJECT.AID = AWORKORDER.APROJECTID) " + "INNER JOIN ACLIENT ON (AWORKORDER.ACLIENTID = ACLIENT.AID) " + "WHERE (APROJECT.AID = @ID)"; break; case RootObjectTypes.ServiceBank: q = "SELECT ACLIENT.AID FROM ASERVICEBANK INNER JOIN ACLIENT " + "ON (ASERVICEBANK.AAPPLIESTOROOTOBJECTID = ACLIENT.AID) " + "WHERE (ASERVICEBANK.AID = @ID)"; break; case RootObjectTypes.Unit: q = "SELECT ACLIENT.AID FROM AUNIT INNER JOIN ACLIENT ON " + "(AUNIT.ACLIENTID = ACLIENT.AID) " + "WHERE (AUNIT.AID = @ID)"; break; case RootObjectTypes.UnitMeterReading: q = "SELECT ACLIENT.AID FROM AUNIT INNER JOIN ACLIENT ON " + "(AUNIT.ACLIENTID = ACLIENT.AID) INNER JOIN AUNITMETERREADING " + "ON (AUNIT.AID = AUNITMETERREADING.AUNITID) " + "WHERE (AUNITMETERREADING.AID = @ID)"; break; case RootObjectTypes.UnitModel: q = "SELECT ACLIENT.AID FROM AUNIT INNER JOIN ACLIENT ON " + "(AUNIT.ACLIENTID = ACLIENT.AID) INNER JOIN AUNITMODEL " + "ON (AUNIT.AUNITMODELID = AUNITMODEL.AID) " + "WHERE (AUNITMODEL.AID = @ID)"; break; case RootObjectTypes.User: q = "SELECT ACLIENT.AID FROM AUSER INNER JOIN ACLIENT ON " + "(AUSER.ACLIENTID = ACLIENT.AID) " + "WHERE (AUSER.AID = @ID)"; break; case RootObjectTypes.WikiPage: q = "SELECT ACLIENT.AID FROM AWIKIPAGE INNER JOIN ACLIENT " + "ON (AWIKIPAGE.AROOTOBJECTID = ACLIENT.AID) " + "WHERE (AWIKIPAGE.AID = @ID)"; break; } #endregion client type } if (string.IsNullOrEmpty(q)) return; SafeDataReader dr = null; try { dr = DBUtil.GetReaderFromSQLString(q, crit.ObjectTypeAndID.ID); while (dr.Read()) { mIDList.Add(dr.GetGuid(0)); } } finally { if (dr != null) dr.Close(); } } #endregion #region criteria /// /// Criteria for identifying existing object /// [Serializable] private class Criteria { public TypeAndID ObjectTypeAndID; public RootObjectTypes RelatedObjectType; public Criteria(TypeAndID _ObjectTypeAndID, RootObjectTypes _RelatedObjectType) { ObjectTypeAndID = _ObjectTypeAndID; RelatedObjectType = _RelatedObjectType; } } #endregion }//end class }//end namespace GZTW.AyaNova.BLL