예제 #1
0
        public ProductionBed( RecProductionFormStd form, BedFilter filter )
            : base( form )
        {
            this.bedFilter = filter;
            IsFull = false;
            if( null != form.ProductionCast && form.ProductionCast.CastId > 0 )
            {
                // Well this is never used so far
                this.ProductionCast = form.ProductionCast;
            }
            else
            {
                // Create a cast object
                var cast = new RecProductionCast( form )
                               {
                                   Factory = filter.Factory,
                                   Project = filter.Project,
                                   StartDate = filter.StartDateFrom,
                                   EndDate = filter.EndDateFrom,
                                   Shift = filter.Shift
                               };

                if( form.FormType == V120.Planning.Common.FormType.Bed && form.StrandType == V120.Planning.Common.StrandType.Bed )
                {
                    var strand = new RecProductionFormStrandStd()
                                     { Factory = filter.Factory, Project = filter.Project, Name = form.Name };
                    cast.Strands = LoadStandardStrands( strand );
                }

                this.ProductionCast = cast;
            }
        }
		public int Sort( List<RecTMElement> elements, RecProductionFormStd form, BedFilter filter )
		{
			_filter = filter;
			if( form == null )
			{
				string msg = string.Format( "No forms defined!" );
				throw new FaultException<BusinessFaultContract>( new BusinessFaultContract() { Argument = msg }, "Cannot manage form!" );
			}

            ExBed bed = new ExBed( form, filter );

			List<RecTMElement> result = bed.FillBed( elements );
			return bed.Save( result );
		}
예제 #3
0
		public ExBed( RecProductionFormStd form, BedFilter filter )
			: base( form )
		{
			_bedFilter = filter;
			IsFull = false;
			// Create a cast object
			RecProductionCast cast = new RecProductionCast( form );
			cast.Factory = filter.Factory;
			cast.Project = filter.Project;

			cast.StartDate = filter.StartDateFrom;
			cast.EndDate = filter.EndDateFrom;

			cast.Shift = filter.Shift;
			AddCast( cast );
		}
        public int LoadPositionedElementData( List<RecProductionFormStd> forms, BedFilter filter )
        {
            _filter = filter;
            if( forms == null || forms.Count == 0 )
            {
                string msg = string.Format( "No forms defined!" );
                throw new FaultException<BusinessFaultContract>( new BusinessFaultContract() { Argument = msg }, "Cannot manage form!" );
            }

            foreach( RecProductionFormStd f in forms )
            {
                _beds.Add( new ExBed( f, filter ) );
            }

            // Load existing elements
            BedManager mgr = new BedManager();
            CastData castData = mgr.LoadBedPlanning( filter, null );
            List<RecProductionFormStd> existingData = castData.CastList;
            foreach( ExBed bed in _beds )
            {
                bed.AddExistingData( existingData );
            }
            return 0;
        }
	    /// <summary>
	    /// Load Positioned Element Data
	    /// </summary>
	    /// <param name="forms"></param>
	    /// <param name="bedfilter"></param>
	    /// <param name="isUserPositionedElement"> </param>
	    /// <returns></returns>
	    public int LoadPositionedElementData( List<RecProductionFormStd> forms, BedFilter bedfilter, bool isUserPositionedElement = false )
        {
            this.filter = bedfilter;
            if( forms == null || forms.Count == 0 )
            {
                string msg = string.Format( "No forms defined!" );
                throw new FaultException<BusinessFaultContract>( new BusinessFaultContract() { Argument = msg }, "Cannot manage form!" );
            }

            foreach( var form in forms )
            {
                this.CastUnits.Add( new ProductionBed( form, bedfilter ) );
            }

            // Load existing elements
            var mgr = new ProjectManager();
            var castData = mgr.LoadBedPlanning( bedfilter, isUserPositionedElement? forms[0] : null );
            var casts = castData.CastList;
            foreach( var bed in this.CastUnits )
            {
                bed.AssignProductionCast( casts );
            }
            return 0;
        }
예제 #6
0
 /// <summary>
 /// MoveElement
 /// </summary>
 /// <param name="filter"></param>
 /// <param name="form"></param>
 /// <param name="elements"></param>
 /// <returns></returns>
 public BedResult MoveElementBedManager( BedFilter filter, RecProductionFormStd form, List<RecTMElement> elements )
 {
     if( null == filter || null == form || null == elements || elements.Count == 0 )
     {
         throw new ArgumentNullException( "AutoBedManage, Missing input!" );
     }
     var castUnits = new List<RecProductionFormStd> { form };
     var positionedElements = new List<RecTMElement>();
     bool hasShiftExistingElements;
     return ProcessElement( filter, castUnits, elements, positionedElements, out hasShiftExistingElements, true );
 }
예제 #7
0
        /// <summary>
        /// Returns CastData which contains the following info
        /// (1) List<RecProductionFormStd>: a set of beds, each with one production cast ONLY.
        /// The production cast object can contain elements.
        /// (2) ProductionFormStdData: Production Forms Standard Data
        /// </summary>
        /// <param name="filter">BedFilter</param>
        /// <param name="form">RecProductionFormStd</param>
        /// <returns></returns>
        public CastData LoadBedPlanning( BedFilter filter, RecProductionFormStd form )
        {
            if( null == filter || 
                string.IsNullOrEmpty( filter.Factory ) || 
                string.IsNullOrEmpty( filter.Project ) )
            {
                return null;
            }

            ImpactQuery query = new ImpactQuery()
            {
                Select =
				{
					ImpProductionCast.CastId,
					ImpProductionCast.Description,
					ImpProductionCast.StartDate,
					ImpProductionCast.EndDate,
					ImpProductionCast.Tolerance,
					ImpProductionCast.ElementType,
                    ImpProductionCast.Style,
					ImpProductionCast.Strandptn,
                    ImpProductionCast.CastType,
					ImpProductionCast.CastStatus,
                    ImpProductionCast.Form,
					ImpProductionCast.Shift,
					Aggregate.Count( ImpProductionCastStrand.StrandPos ),

					ImpProductionFormStd.Name,
					ImpProductionFormStd.MaxLength,
					ImpProductionFormStd.MaxWidth,
					ImpProductionFormStd.MaxHeight,
                    ImpProductionFormStd.ElementType,
                    ImpProductionFormStd.Style,
					ImpProductionFormStd.Strandptn,
                    ImpProductionFormStd.StrandType,
                    ImpProductionFormStd.FormType,

					ImpModelPlanning.ElementId,
					ImpModelGeometry.ElementMark,
					ImpModelPlanning.ErectionSequenceNo,
					ImpModelPlanning.TransportId,

					ImpModelPlanning.BedSequenceNo,
					ImpModelPlanning.BedX,
					ImpModelPlanning.BedY,
					ImpModelPlanning.BedZ,
					ImpModelPlanning.BedRotation,
                    ImpModelPlanning.ElementIdStatus,
                    ImpModelPlanning.ProductionDate,
                    ImpModelPlanning.PlannedProductionDate,

					ImpElement.ElementLength,
					ImpElement.ElementWidth,
					ImpElement.ElementHeight,
					ImpElement.ElementType,
					ImpElement.GrossArea,
					ImpElement.Product,
					ImpElement.Project,
					ImpElement.AngleLeftSide,
					ImpElement.AngleRightSide,

					ImpElement.Style,
					ImpElement.Strandptn,
					ImpElement.NbrOfStrands,
                    ImpElement.Volume,
                },

                From = { ImpProductionFormStd.As( "FRM" ) },

                Join =
				{
					Join.Left( ImpProductionCast.As( "CST" ),	
						ImpProductionCast.Factory.Equal( ImpProductionFormStd.Factory ),
						ImpProductionCast.Project.Equal( ImpProductionFormStd.Project ),//Factory, Factory
						ImpProductionCast.Form.Equal( ImpProductionFormStd.Name ) ),

					Join.Left( ImpProductionCastStrand.As( "STA" ),	
						ImpProductionCast.Factory.Equal( ImpProductionCastStrand.Factory ),
						ImpProductionCast.Project.Equal( ImpProductionCastStrand.Project ),// Factory, Factory for productionCast & ProductionCastStrand
						ImpProductionCast.CastId.Equal( ImpProductionCastStrand.CastId ) ),


					Join.Left( ImpModelPlanning.As( "MPL" ),	
						ImpProductionCast.Factory.Equal( ImpModelPlanning.Factory ),
						ImpProductionCast.Project.Equal( ImpModelPlanning.Factory ),// Factory, Factory for productionCast & ProductionCastStrand
						ImpProductionCast.CastId.Equal( ImpModelPlanning.CastId ) ),


					Join.Left( ImpModelGeometry.As( "MGO" ),	
						ImpModelPlanning.Factory.Equal( ImpModelGeometry.Factory ),
						ImpModelPlanning.Project.Equal( ImpModelGeometry.Project ),
						ImpModelPlanning.ElementId.Equal( ImpModelGeometry.ElementId ) ),

					Join.Left( ImpElement.As( "ELM" ),	
						ImpModelGeometry.Factory.Equal( ImpElement.Factory ),
						ImpModelGeometry.Project.Equal( ImpElement.Project ),
						ImpModelGeometry.ElementMark.Equal( ImpElement.ElementMark ) ),
				},

                Where = {
							ImpProductionCast.Factory.Equal( filter.Factory ), 
							ImpProductionCast.Project.Equal( filter.Factory ), // Factory, Factory for productionCast & ProductionCastStrand
							ImpProductionCast.StartDate.Equal( filter.StartDateFrom ), 
                            ImpProductionCast.Shift.Equal( filter.Shift ), 
						   // ImpModelPlanning.CastId.GreaterThan( 0 ),      // Get even the casts without elements!
						},

                GroupBy = 
                {
					ImpProductionCast.CastId,
					ImpProductionCast.Description,
					ImpProductionCast.StartDate,
					ImpProductionCast.EndDate,
					ImpProductionCast.Tolerance,
					ImpProductionCast.ElementType,
                    ImpProductionCast.Style,
					ImpProductionCast.Strandptn,
                    ImpProductionCast.CastType,
					ImpProductionCast.CastStatus,
					ImpProductionCast.Form,
					ImpProductionCast.Shift,

					ImpProductionFormStd.Name,
					ImpProductionFormStd.MaxLength,
					ImpProductionFormStd.MaxWidth,
					ImpProductionFormStd.MaxHeight,
                    ImpProductionFormStd.ElementType,
                    ImpProductionFormStd.Style,
					ImpProductionFormStd.Strandptn,
                    ImpProductionFormStd.StrandType,
                    ImpProductionFormStd.FormType,

					ImpModelPlanning.ElementId,
					ImpModelGeometry.ElementMark,
					ImpModelPlanning.ErectionSequenceNo,
					ImpModelPlanning.TransportId,

					ImpModelPlanning.BedSequenceNo,
					ImpModelPlanning.BedX,
					ImpModelPlanning.BedY,
					ImpModelPlanning.BedZ,
					ImpModelPlanning.BedRotation,
                    ImpModelPlanning.ElementIdStatus,
                    ImpModelPlanning.ProductionDate,
                    ImpModelPlanning.PlannedProductionDate,

					ImpElement.ElementLength,
					ImpElement.ElementWidth,
					ImpElement.ElementHeight,
					ImpElement.ElementType,
					ImpElement.GrossArea,
					ImpElement.Product,
					ImpElement.Project,
					ImpElement.AngleLeftSide,
					ImpElement.AngleRightSide,

					ImpElement.Style,
					ImpElement.Strandptn,
					ImpElement.NbrOfStrands,
                    ImpElement.Volume,
                },

                OrderBy = 
				{ 
					{ ImpElement.Project },
					{ ImpProductionFormStd.Name },
					{ ImpProductionCast.CastId },
					{ ImpModelPlanning.BedSequenceNo, OrderBy.Ascending }
				},
            };

            if( filter.FormType != FormType.All )
            {
                query.Where.Add( ImpProductionCast.CastType.Equal( filter.FormType ) );
            }

            if( !string.IsNullOrWhiteSpace( filter.Location ) && !filter.Location.Equals( Filter.All ) )
            {
                query.Where.Add( ImpProductionFormStd.Location.Equal( filter.Location ) );
            }
            if( !filter.Bed.Equals( Filter.All ) )
            {
                query.Where.Add( ImpProductionCast.Form.Equal( filter.Bed ) );
            }

            // used when sorting elements on bed
            if( form != null && !string.IsNullOrWhiteSpace( form.Name ) )
            {
                query.Where.Add( ImpProductionFormStd.Name.Equal( form.Name ) );
            }

            var statement = query.ToString();

            var tmList = new List<RecProductionFormStd>();
            var parser = new FormParser( tmList );

            using( var database = new ImpactDatabase() )
            {
                var list = database.GetAll( statement, ParseCast );

                foreach( var item in list )
                {
                    item.Form.Factory = filter.Factory;
                    item.Cast.Factory = filter.Factory;

                    item.Form.Project = filter.Project; // What does that really mean!
                    item.Cast.Project = filter.Project; // What does that really mean!

                    if( null != item.Element )
                    {
                        item.Element.Factory = filter.Factory;
                        // Never set element.project to curFilter.project
                        // since we retrieve elmenets from different projects!
                    }

                    parser.Parse( item.Form, item.Cast, item.Element );
                }
            }

            var formSvc = new ProjectManager();
            var filter2 = new BedFilter( filter ) { Location = "" };
            var productionFormStdData = formSvc.LoadProductionFormStd( filter2 );

            // Load strands
            LoadCastStrands( tmList, filter );
            LoadFormStrands( productionFormStdData.Forms, filter );

            return new CastData( tmList, productionFormStdData );
        }
예제 #8
0
        /// <summary>
        /// Returns a set of casts with element information 
        /// </summary>
        /// <param name="filter">curFilter</param>
        /// <param name="reportFilter"> </param>
        /// <returns></returns>
        public CastScheduleData LoadCastSchedule( BedFilter filter, ReportFilter reportFilter )
        {
            if( filter == null || string.IsNullOrEmpty( filter.Factory ) || string.IsNullOrEmpty( filter.Project ) )
            {
                return null;
            }

            var query = new ImpactQuery()
            {
                Select =
				{
					ImpProductionCast.CastId,
					ImpProductionCast.Description,
					ImpProductionCast.StartDate,
					ImpProductionCast.EndDate,
					ImpProductionCast.Tolerance,
					ImpProductionCast.ElementType,
					ImpProductionCast.Style,
					ImpProductionCast.Strandptn,
					ImpProductionCast.CastStatus,
                    ImpProductionCast.CastType,
					ImpProductionCast.Form,
					ImpProductionCast.Shift,

                    Aggregate.Count( ImpProductionCastStrand.StrandPos ),

					ImpProductionFormStd.Location,
                    ImpProductionFormStd.FormType,
					ImpProductionFormStd.MaxLength,
					ImpProductionFormStd.MaxWidth,
					ImpProductionFormStd.MaxHeight,
                    ImpProductionFormStd.ElementType,

					ImpModelPlanning.ElementId,
					ImpModelGeometry.ElementMark,

                    ImpModelGeometry.Building,
                    ImpModelGeometry.FloorId,
                    ImpModelGeometry.Phase,

					ImpModelPlanning.ErectionSequenceNo,
					ImpModelPlanning.TransportId,

					ImpModelPlanning.BedSequenceNo,
					ImpModelPlanning.BedX,
					ImpModelPlanning.BedY,
					ImpModelPlanning.BedZ,
					ImpModelPlanning.BedRotation,
                    ImpModelPlanning.ElementIdStatus,

                    ImpModelPlanning.ProductionDate,
                    ImpModelPlanning.PlannedProductionDate,

                    ImpElement.ElementLength,
					ImpElement.ElementWidth,
					ImpElement.ElementHeight,
					ImpElement.ElementType,
					ImpElement.GrossArea,
					ImpElement.NetArea,
					ImpElement.Volume,
					ImpElement.Product,
					ImpElement.Project,
					ImpElement.AngleLeftSide,
					ImpElement.AngleRightSide,
                    ImpElement.Mass,

					ImpElement.Style,
					ImpElement.Strandptn,
					ImpElement.NbrOfStrands,
				},

                From = { ImpProductionCast.As( "CST" ) },

                Join =
				{
					Join.Left( ImpProductionCastStrand.As( "STA" ),	
						ImpProductionCast.Factory.Equal( ImpProductionCastStrand.Factory ),
						ImpProductionCast.Project.Equal( ImpProductionCastStrand.Project ),//Factory, Factory
						ImpProductionCast.CastId.Equal( ImpProductionCastStrand.CastId ) ),

					Join.Left( ImpProductionFormStd.As( "FRM" ),	
						ImpProductionCast.Factory.Equal( ImpProductionFormStd.Factory ),
						ImpProductionCast.Project.Equal( ImpProductionFormStd.Project ),// Factory, Factory for productionCast & ProductionCastStrand
						ImpProductionCast.Form.Equal( ImpProductionFormStd.Name ) ),

					Join.Left( ImpModelPlanning.As( "MPL" ),	
						ImpProductionCast.Factory.Equal( ImpModelPlanning.Factory ),
						ImpProductionCast.Project.Equal( ImpModelPlanning.Factory ),// Factory, Factory for productionCast & ProductionCastStrand
						ImpProductionCast.CastId.Equal( ImpModelPlanning.CastId ) ),


					Join.Left( ImpModelGeometry.As( "MGO" ),	
						ImpModelPlanning.Factory.Equal( ImpModelGeometry.Factory ),
						ImpModelPlanning.Project.Equal( ImpModelGeometry.Project ),
						ImpModelPlanning.ElementId.Equal( ImpModelGeometry.ElementId ) ),

					Join.Left( ImpElement.As( "ELM" ),	
						ImpModelGeometry.Factory.Equal( ImpElement.Factory ),
						ImpModelGeometry.Project.Equal( ImpElement.Project ),
						ImpModelGeometry.ElementMark.Equal( ImpElement.ElementMark ) ),
				},

                Where = {
							ImpProductionCast.Factory.Equal( filter.Factory ), 
							ImpProductionCast.Project.Equal( filter.Factory ), // Factory, Factory for productionCast & ProductionCastStrand
                            //ImpModelPlanning.CastId.GreaterThan( 0 ), 
						},
                GroupBy = 
                {
					ImpProductionCast.CastId,
					ImpProductionCast.Description,
					ImpProductionCast.StartDate,
					ImpProductionCast.EndDate,
					ImpProductionCast.Tolerance,
					ImpProductionCast.ElementType,
					ImpProductionCast.Style,
					ImpProductionCast.Strandptn,
					ImpProductionCast.CastStatus,
                    ImpProductionCast.CastType,
					ImpProductionCast.Form,
					ImpProductionCast.Shift,

					ImpProductionFormStd.Location,
                    ImpProductionFormStd.FormType,
					ImpProductionFormStd.MaxLength,
					ImpProductionFormStd.MaxWidth,
					ImpProductionFormStd.MaxHeight,
                    ImpProductionFormStd.ElementType,

					ImpModelPlanning.ElementId,
					ImpModelGeometry.ElementMark,

                    ImpModelGeometry.Building,
                    ImpModelGeometry.FloorId,
                    ImpModelGeometry.Phase,

					ImpModelPlanning.ErectionSequenceNo,
					ImpModelPlanning.TransportId,

					ImpModelPlanning.BedSequenceNo,
					ImpModelPlanning.BedX,
					ImpModelPlanning.BedY,
					ImpModelPlanning.BedZ,
					ImpModelPlanning.BedRotation,
                    ImpModelPlanning.ElementIdStatus,

                    ImpModelPlanning.ProductionDate,
                    ImpModelPlanning.PlannedProductionDate,

					ImpElement.ElementLength,
					ImpElement.ElementWidth,
					ImpElement.ElementHeight,
					ImpElement.ElementType,
					ImpElement.GrossArea,
					ImpElement.NetArea,
					ImpElement.Volume,
					ImpElement.Product,
					ImpElement.Project,
					ImpElement.AngleLeftSide,
					ImpElement.AngleRightSide,
                    ImpElement.Mass,

					ImpElement.Style,
					ImpElement.Strandptn,
					ImpElement.NbrOfStrands,
                },

                OrderBy = 
				{ 
					{ ImpElement.Project },
					{ ImpProductionCast.StartDate, OrderBy.Descending },
					{ ImpProductionCast.CastId },
				},
            };

            var whereStatus = WhereGroup.Or( new Where[] { } );

            if( filter.NoStatus )
            {
                whereStatus.Add( ImpProductionCast.CastStatus.Equal( CastStatus.NoStatus ) );
            }
            if( filter.Planned )
            {
                whereStatus.Add( ImpProductionCast.CastStatus.Equal( CastStatus.Planned ) );
            }
            if( filter.Produced )
            {
                whereStatus.Add( ImpProductionCast.CastStatus.Equal( CastStatus.Produced ) );
            }

            if( whereStatus.Count > 0 )
            {
               query.Where.Add( whereStatus );
            }

            if( filter.UseStartDateFrom )
            {
                query.Where.Add( ImpProductionCast.StartDate.GreaterThanOrEqual( filter.StartDateFrom ) );
            }
            if( filter.UseStartDateTo )
            {
                query.Where.Add( ImpProductionCast.StartDate.LessThanOrEqual( filter.StartDateTo ) );
            }
            if( filter.UseEndDateFrom )
            {
                query.Where.Add( ImpProductionCast.EndDate.GreaterThanOrEqual( filter.EndDateFrom ) );
            }
            if( filter.UseEndDateTo )
            {
                query.Where.Add( ImpProductionCast.EndDate.LessThanOrEqual( filter.EndDateTo ) );
            }

            if( filter.Shift != 0 )
            {
                query.Where.Add( ImpProductionCast.Shift.Equal( filter.Shift ) );
            }
            if( !string.IsNullOrEmpty(filter.Location) && !filter.Location.Equals( Filter.All ) )
            {
                query.Where.Add( ImpProductionFormStd.Location.Equal( filter.Location ) );
            }
            if( !filter.Bed.Equals( Filter.All ) )
            {
                query.Where.Add( ImpProductionCast.Form.Equal( filter.Bed ) );
            }
            if( !string.IsNullOrEmpty( filter.CastId ) )
            {
                query.Where.Add( ImpProductionCast.CastId.Like( filter.CastId ) );
            }

            if( reportFilter != null && reportFilter.Ranges.Count > 0 )
            {
                var list = new List<Where>();
                foreach( var range in reportFilter.Ranges )
                {
                    if( !string.IsNullOrEmpty( range.From ) && !string.IsNullOrEmpty( range.To ) )
                    {
                        list.Add( ImpProductionCast.CastId.Between( range.From, range.To ) );
                    }
                }

                if( list.Count > 0 )
                {
                    query.Where.Add( WhereGroup.Or( list.ToArray() ) );
                }
            }

            var statement = query.ToString();

            var tmList = new List<RecProductionCast>();
            var parser = new CastParser( tmList );

            using( var database = new ImpactDatabase() )
            {
                var list = database.GetAll( statement, ParseSchedule );

                foreach( var item in list )
                {
                    item.Form.Factory = filter.Factory;
                    item.Cast.Factory = filter.Factory;

                    item.Form.Project = filter.Project;
                    item.Cast.Project = filter.Project;

                    if( null != item.Element )
                    {
                        item.Element.Factory = filter.Factory;
                        // Never set element.project to curFilter.project
                        // since we retrieve elmenets from different projects!                    
                    }

                    parser.Parse( item.Form, item.Cast, item.Element );
                }
            }

            // Now load all the existing forms
            var formSvc = new ProjectManager();
            var productionFormStdData = formSvc.LoadProductionFormStd( new BedFilter( filter ) { Location = Filter.All } );
            return new CastScheduleData( tmList, productionFormStdData );
        }
예제 #9
0
        /// <summary>
        /// Returns a list of projects that are involved in a certain cast
        /// </summary>
        /// <param name="filter">curFilter</param>
        /// <param name="castId">castId</param>
        /// <returns></returns>
        public List<string> LoadCastProjects( BedFilter filter, int castId )
        {
            if( null == filter || string.IsNullOrWhiteSpace( filter.Factory ) )
            {
                return null;
            }

            var query = new ImpactQuery( true )
            {
                Select =
				{
					ImpModelPlanning.Project,
				},

                From = { ImpProductionCast.As( "CST" ) },

                Join =
				{
					Join.Left( ImpModelPlanning.As( "PLN" ),	
						ImpModelPlanning.Factory.Equal( ImpProductionCast.Factory ),
						ImpModelPlanning.CastId.Equal( ImpProductionCast.CastId ) ),
				},

                Where = {
							ImpModelPlanning.CastId.GreaterThan( 0 ), 
							ImpProductionCast.Factory.Equal( filter.Factory ), 
						},
            };

            if( castId > 0 )
            {
                query.Where.Add( ImpProductionCast.CastId.Equal( castId ) );
            }
            else
            {
                query.Where.Add( ImpProductionCast.StartDate.Equal( filter.StartDateFrom ) );
                query.Where.Add( ImpProductionCast.Shift.Equal( filter.Shift ) );
            }

            string statement = query.ToString();

            List<string> result;
            using( ImpactDatabase database = new ImpactDatabase() )
            {
                result = database.GetAll( statement, Parse );
            }

            return result;
        }
예제 #10
0
        /// <summary>
        /// Sorts element on bed
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="form"></param>
        /// <param name="sortType"></param>
        /// <returns></returns>
        public bool SortBedElements( BedFilter filter, RecProductionFormStd form, SortType sortType )
        {
            // Let's work on a copy of the given curFilter
            // Make sure that SingleElementCastUnit is set to false
            var curFilter = new BedFilter( filter ) { SingleElementCastUnit = false };

            var castData = LoadBedPlanning( curFilter, form );
            var forms = castData.CastList;
            if( forms != null )
            {
                foreach( var bed in forms )
                {
                    if( bed.ProductionCast == null )
                    {
                        continue;
                    }
                    if( bed.ProductionCast.Elements == null || bed.ProductionCast.Elements.Count <= 0 )
                    {
                        continue;
                    }
                    List<RecTMElement> sortedElements;
                    if( sortType == SortType.DimensionAscending )
                    {
                        sortedElements = bed.ProductionCast.Elements.OrderBy( x => x.ElementWidth ).ThenBy( x => x.ElementLengthOnBed ).ToList();
                    }
                    else if( sortType == SortType.DimensionDescending )
                    {
                        sortedElements = bed.ProductionCast.Elements.OrderByDescending( x => x.ElementWidth ).ThenByDescending( x => x.ElementLengthOnBed ).ToList();
                    }
                    else if( sortType == SortType.ErectionSequenceAscending )
                    {
                        sortedElements = bed.ProductionCast.Elements.OrderBy( x => x.ErectionSequenceNo ).ToList();
                    }
                    else //( sortType == SortType.ErectionSequenceDescending )
                    {
                        sortedElements = bed.ProductionCast.Elements.OrderByDescending( x => x.ErectionSequenceNo ).ToList();
                    }

                    var bpc = new ProductionBedContainer();
                    bpc.Sort( sortedElements, bed, curFilter );
                }
            }

            return true;
        }
예제 #11
0
        /// <summary>
        /// Returns a list of elements that are allowed to bed positioned of the given castunit(bed)
        /// </summary>
        /// <param name="filter">curFilter</param>
        /// <param name="form">castunit</param>
        /// <param name="recProductionCast"> </param>
        /// <param name="elements">A list of elements to be positioned</param>
        /// <param name="strict">Strict flag</param>
        /// <returns></returns>
        private List<RecTMElement> LoadAllowedElements( BedFilter filter, RecProductionFormStd form, RecProductionCast recProductionCast, List<RecTMElement> elements, bool strict )
        {
            if( elements == null || elements.Count == 0 || form == null &&
                filter == null || string.IsNullOrEmpty( filter.Factory ) || string.IsNullOrEmpty( filter.Project ) )
            {
                return null;
            }

            var inVect = ( from o in elements select o.ElementId ).ToArray();

            List<RecTMElement> result;
            var query = new ImpactQuery()
            {
                Select =
				{
                    ImpElement.ElementMark,

                    ImpElement.ElementLength,
					ImpElement.ElementWidth,
					ImpElement.ElementHeight,

                    ImpElement.ElementType,
                    ImpElement.AngleLeftSide,
					ImpElement.AngleRightSide,

					ImpElement.Style,
					ImpElement.Strandptn,
					ImpElement.NbrOfStrands,

                    ImpModelGeometry.Factory,
                    ImpModelGeometry.Project,
                    ImpModelGeometry.ElementId,
				},

                From = { ImpElement.As( "ELM" ) },

                Join =
				{
					Join.Left( ImpModelGeometry.As( "GEO" ),	
						ImpModelGeometry.Factory.Equal( ImpElement.Factory ),
						ImpModelGeometry.Project.Equal( ImpElement.Project ),
						ImpModelGeometry.ElementMark.Equal( ImpElement.ElementMark ) ),
				},

                Where = {
							ImpElement.Factory.Equal( filter.Factory ), 
							ImpElement.Project.Equal( filter.Project ), 
							ImpModelGeometry.ElementId.In( inVect ), 
						},
            };

            if( form != null && ( strict && form.FormType == FormType.Bed ) )
            {
                query.Where.Add( ImpElement.ElementType.Equal( form.ElementType ) );

                var hasStrands = form.ElementType.Equals( ImpactElementType.HollowCore ) ||
                                  form.ElementType.Equals( ImpactElementType.PrestressedSlab ) ||
                                  form.ElementType.Equals( ImpactElementType.PrestressedFormSlab );

                if( hasStrands )
                {
                    if( filter.ForceStyleControl )
                    {
                        var style = (null != recProductionCast)? recProductionCast.Style : form.Style;
                        var strandptn = (null != recProductionCast)? recProductionCast.Strandptn : form.Strandptn;
                        var nbrOfStrands = (null != recProductionCast)? GetNumberOfStrands( recProductionCast ) : GetNumberOfStrands( form );

                        query.Where.Add( ImpElement.Style.Equal( style ) );
                        query.Where.Add( ImpElement.Strandptn.Equal( strandptn ) );
                        query.Where.Add( ImpElement.NbrOfStrands.LessThanOrEqual( nbrOfStrands ) );
                    }
                }
            }

            var statement = query.ToString();
            using( var database = new ImpactDatabase() )  
            {
                result = database.GetAll( statement, ElementParse );
            }

            return result;
        }
예제 #12
0
        /// <summary>
        /// Positions elements of a set of beds
        /// </summary>
        /// <param name="filter">Filter</param>
        /// <param name="forms">A ser of beds(castUnits)</param>
        /// <param name="elements">A list of elements to be positioned</param>
        /// <returns></returns>
        public BedResult AutoBedManage( BedFilter filter, List<RecProductionFormStd> forms, List<RecTMElement> elements )
        {
            if( null == filter || null == forms || forms.Count == 0 || null == elements || elements.Count == 0 )
            {
                throw new ArgumentNullException( "AutoBedManage, Missing input!" );
            }
            var castResult = new BedResult();
            if( null == castResult.PositionedElements )
            {
                castResult.PositionedElements = new List<RecTMElement>();
            }
            // Let's work on a copy of the given curFilter
            var curFilter = new BedFilter( filter );

            //DateTime curDate = curfilter.StartDateFrom;
            var maxShift = forms.OrderBy(p => p.NbrOfShift).Last().NbrOfShift;
            var firstLoop = true;
            var unpositioned = elements;
            var totPositionedElements = new List<RecTMElement>();

            do
            {
                var firstShift = firstLoop? filter.Shift : 1;

                castResult.FirstShift = Math.Min( castResult.FirstShift, firstShift);
                castResult.LastShift = Math.Max( castResult.LastShift, maxShift);
                castResult.CastDays.Add( curFilter.StartDateFrom );

                var hasDayExistingElements = false;
                var numberOfPositionedElements = 0;

                for( var shift = firstShift; shift <= maxShift; shift++ )
                {
                    curFilter.Shift = shift;
                    var curForms = ( from o in forms where o.NbrOfShift >= curFilter.Shift select o ).ToList();
                    if( curForms.Count <= 0 )
                    {
                        continue;
                    }
                    var tempPositioned = new List<RecTMElement>();
                    bool hasShiftExistingElements;
                    var tempResult = this.ProcessElement( curFilter, curForms, unpositioned, tempPositioned, out hasShiftExistingElements );

                    castResult.PositionedElements.AddRange( tempPositioned );

                    if( hasShiftExistingElements )
                    {
                        hasDayExistingElements = true;
                    }
                    if( tempResult.NumberOfElements > 0 )
                    {
                        castResult.NumberOfCasts += tempResult.NumberOfCasts;
                    }
                    totPositionedElements.AddRange( tempPositioned );

                    unpositioned = this.GetUnpositionedElements( elements, totPositionedElements );

                    castResult.NumberOfElements = totPositionedElements.Count;
                    castResult.Element = tempResult.Element;

                    // For single cast interrupt here, please
                    var done = !curFilter.MultiCast || totPositionedElements.Count == elements.Count;
                    if( done )
                    {
                        return castResult;
                    }

                    numberOfPositionedElements += tempPositioned.Count;
                }

                // If none of the shifts could position then interrupt and return
                if( 0 == numberOfPositionedElements && !hasDayExistingElements )
                {
                    break;
                }

                curFilter.StartDateFrom = curFilter.StartDateFrom.AddDays( 1 );
                firstLoop = false;
            } while( true );

            return castResult;
        }
예제 #13
0
		/// <summary>
		/// Returns a list of the reset element ids.
		/// </summary>
		/// <param name="record">The record to delete from the database.</param>
		/// <returns>The number of affected records.</returns>
		public CastScheduleResult DeleteProductionCast( RecProductionCast record )
		{
            ProjectManager projectManagerService = new ProjectManager();   
            BedFilter filter = new BedFilter();
            filter.Factory = record.Factory;
            List<string> projectsInvolved = projectManagerService.LoadCastProjects( filter, record.CastId );
            if( null == projectsInvolved )
            {
                return null;
            }

            ProjectManager mgr = new ProjectManager();
            RecElementIdStatusStd std = new RecElementIdStatusStd { Factory = record.Factory, Project = record.Project };
            List<RecElementIdStatusStd> settings = mgr.LoadStandardSettings( std );

			ModelPlanner svc = new ModelPlanner( );
            List<int> deletedIds = svc.LoadElementIds( record.Factory, record.Project, record.CastId );

            // (1) Reset elements
            // Update Status, Note this can be optimized!
            RecProductionCast recProductionCastStatus = new RecProductionCast( record );
            recProductionCastStatus.CastStatus = (int)CastStatus.NoStatus;
            recProductionCastStatus.ElementIdStatus = RecElementIdStatusStd.GetLocalSettingFromGlobalId( settings, recProductionCastStatus.CastStatus).StatusId;
            UpdateStatus( record, recProductionCastStatus, settings );
            // Now reset
			svc.ResetElementProduction( record.Factory, record.Project, record.CastId, 0, false );

            // (2) Delete strands
            RecProductionCastStrand recStrand = new RecProductionCastStrand();
            recStrand.Factory = record.Factory;
            recStrand.Project = record.Factory; // Factory, Factory for productionCast & ProductionCastStrand
            recStrand.CastId = record.CastId;
            recStrand.StrandPos = 0;
            ProjectManager strand = new ProjectManager();
            strand.DeleteProductionCastStrand(recStrand);
            // (3) Now delete the cast Object
            int result = 0;
            // The cast object can be deleted if no elements belong to other projects other that the current one
            if( projectsInvolved.Count == 0 || (projectsInvolved.Count == 1 && projectsInvolved[0].Equals( record.Project ) )  )
            {
                var delete = new ImpactDelete( ImpProductionCast.Instance )
                {
                    Where = 
				{
					{ ImpProductionCast.Factory.Equal( record.Factory )},
					{ ImpProductionCast.Project.Equal( record.Factory )},// Factory, Factory for productionCast & ProductionCastStrand
					{ ImpProductionCast.CastId.Equal( record.CastId )},
				}
                };

                string statement = delete.ToString();

                using( ImpactDatabase database = new ImpactDatabase() )
                {
                    result = database.ExecuteNonQuery( statement );
                }
            }

			return new CastScheduleResult(deletedIds, projectsInvolved);
		}
예제 #14
0
		/// <summary>  
		/// Load all records of the same factory and project as the supplied record.
		/// </summary>
		/// <param name="record">A record with factory and project set.</param>
		/// <returns>A list of all mathcing records.</returns>
		public List<RecProductionCast> LoadProductionCast( BedFilter filter, RecProductionCast record )
		{
            List<RecProductionCast> castData = new List<RecProductionCast>( );
			ImpactQuery query = new ImpactQuery()
			{
				Select =
				{
					ImpProductionCast.Factory,
					ImpProductionCast.Project,
					ImpProductionCast.CastId,
					ImpProductionCast.CastType,
					ImpProductionCast.Description,
					ImpProductionCast.Shift,
					ImpProductionCast.StartDate,
					ImpProductionCast.EndDate,
					ImpProductionCast.Form,
					ImpProductionCast.Tolerance,
					ImpProductionCast.ElementType,
					ImpProductionCast.Style,
					ImpProductionCast.Strandptn,
					ImpProductionCast.CastStatus,
					ImpProductionCast.CastDivision,

					ImpProductionFormStd.Location,
				},
				From  = { ImpProductionCast.As( "T1" ) },

				Join =
				{
					Join.Left( ImpProductionFormStd.As( "FRM" ),	
						ImpProductionCast.Factory.Equal( ImpProductionFormStd.Factory ),
						ImpProductionCast.Project.Equal( ImpProductionFormStd.Project ),//Factory, Factory
						ImpProductionCast.Form.Equal( ImpProductionFormStd.Name ) ),
				},

				Where = { ImpProductionCast.Factory.Equal( record.Factory ) , 
                          ImpProductionCast.Project.Equal( record.Factory ) }, // Factory, Factory for productionCast & ProductionCastStrand
			};

			query.Where.Add( ImpProductionCast.StartDate.Equal( record.StartDate ) );
			query.Where.Add( ImpProductionCast.Form.Equal( record.Form ) );

            if( filter != null )
            {
                if( filter.Shift != 0 )
                {
                    query.Where.Add( ImpProductionCast.Shift.Equal( filter.Shift) );
                }
                if( !filter.Location.Equals( Filter.All) && !string.IsNullOrEmpty( filter.Location ) )
                {
                    query.Where.Add( ImpProductionFormStd.Location.Equal( filter.Location) );
                }
                if( !filter.Bed.Equals( Filter.All) && !string.IsNullOrEmpty( filter.Bed ) )
                {
                    query.Where.Add( ImpProductionCast.Form.Equal( filter.Bed ) );
                }
                if( filter.UseStartDateFrom )
                {
                    query.Where.Add( ImpProductionCast.StartDate.GreaterThanOrEqual( filter.StartDateFrom ) );
                }			
                if( filter.UseStartDateTo )
                {
                    query.Where.Add( ImpProductionCast.StartDate.LessThanOrEqual( filter.StartDateTo ) );
                }			
                if( filter.UseEndDateFrom )
                {
                    query.Where.Add( ImpProductionCast.EndDate.GreaterThanOrEqual( filter.EndDateFrom ) );
                }			
                if( filter.UseEndDateTo )
                {
                    query.Where.Add( ImpProductionCast.EndDate.LessThanOrEqual( filter.EndDateTo ) );
                }			
            }
			string statement = query.ToString();

			List<RecProductionCast> result;

			using( ImpactDatabase database = new ImpactDatabase() )
			{
				result = database.GetAll( statement, ParseProductionCast );
			}

            return result;
		}
	    /// <summary>
		/// Insert the specified record into the database.
		/// </summary>
		/// <param name="record">The record to insert into the database.</param>
		/// <returns>The number of affected records.</returns>
        public int InsertProductionCastStrand(RecProductionCastStrand record, RecProductionFormStd form, BedFilter filter)
		{
            if (null == record)
            {
                return -1;
            }
            int castId = record.CastId;
            if (castId <= 0)
            {
                if (null == form || null == filter)
                {
                    return -1;
                }
                var cast = new RecProductionCast
                    {
                        Factory = record.Factory,
                        Project = record.Project,
                        CastType = form.FormType,
                        Description = "",
                        Shift = filter.Shift,
                        StartDate = filter.StartDateFrom,
                        EndDate = filter.StartDateFrom,
                        Form = form.Name,
                        Tolerance = form.Tolerance,
                        ElementType = form.ElementType,
                        Style = form.Style,
                        Strandptn = form.Strandptn,
                        CastStatus = 0,
                        CastDivision = ""
                    };

                var svc = new ProjectManager();
                var newCast = svc.InsertProductionCast(cast);
                castId = newCast.CastId;
            }

			var insert = new ImpactInsert( ImpProductionCastStrand.Instance )
			{
				Columns = 
				{
					{ ImpProductionCastStrand.Factory, record.Factory },
					{ ImpProductionCastStrand.Project, record.Factory },// Factory, Factory for productionCast & ProductionCastStrand
					{ ImpProductionCastStrand.CastId, castId },
					{ ImpProductionCastStrand.StrandPos, record.StrandPos },
					{ ImpProductionCastStrand.StrandX, record.StrandX },
					{ ImpProductionCastStrand.StrandY, record.StrandY },
					{ ImpProductionCastStrand.StrandQuality, record.StrandQuality },
					{ ImpProductionCastStrand.StrandDimension, record.StrandDimension },
					{ ImpProductionCastStrand.StrandPrestressing, record.StrandPrestressing },
				}
			};

			string statement = insert.ToString();

			int result;

			using( var database = new ImpactDatabase() )
			{
				result = database.ExecuteNonQuery( statement );
			}

			return result;
		}
        /// <summary>
        /// 
        /// </summary>
        /// <param name="records"></param>
        /// <param name="form"></param>
        /// <param name="filter"></param>
        /// <returns></returns>
        public int BulkInsertProductionCastStrand( List<RecProductionCastStrand> records, RecProductionFormStd form, BedFilter filter )
        {
            if( null == records || records.Count == 0 )
            {
                return -1;
            }

            foreach( var recProductionCastStrand in records )
            {
                this.InsertProductionCastStrand( recProductionCastStrand, form, filter );
            }

            return 0;
        }
예제 #17
0
		/// <summary>
		/// Update the specified record in the database.
		/// </summary>
		/// <param name="record">The record to update.</param>
		/// <returns></returns>
		public CastResult UpdateProductionCast( RecProductionCast record )
		{
            bool hasScheduleCollision = false;
            BedFilter filter = new BedFilter();
            filter.Factory = record.Factory;
            filter.Project = record.Project;
            filter.Shift = record.Shift;
            List<RecProductionCast> casts = this.LoadProductionCast( filter, record );
            if( null != casts && casts.Count > 0 )
            {
                List<RecProductionCast> otherCasts = (from o in casts where o.CastId != record.CastId select o).ToList();
                if( null != otherCasts && otherCasts.Count > 0 )
                {
                    hasScheduleCollision = true;
                }
            }

			var update = new ImpactUpdate( ImpProductionCast.Instance )
			{
				Columns = 
				{
					{ ImpProductionCast.CastType, record.CastType },
					{ ImpProductionCast.Description, record.Description },

					{ ImpProductionCast.Form, record.Form },
					{ ImpProductionCast.Tolerance, record.Tolerance },
					{ ImpProductionCast.ElementType, record.ElementType },
					{ ImpProductionCast.Style, record.Style },
					{ ImpProductionCast.Strandptn, record.Strandptn },
					{ ImpProductionCast.CastStatus, record.CastStatus },
					{ ImpProductionCast.CastDivision, record.CastDivision },
				},
				Where = 
				{
					{ ImpProductionCast.Factory.Equal( record.Factory ) },
					{ ImpProductionCast.Project.Equal( record.Factory ) },// Factory, Factory for productionCast & ProductionCastStrand
					{ ImpProductionCast.CastId.Equal( record.CastId ) },
				},
			};

            if( !hasScheduleCollision )
            {
                update.Columns.Add( ImpProductionCast.Shift, record.Shift );
                update.Columns.Add( ImpProductionCast.StartDate, record.StartDate );
                update.Columns.Add( ImpProductionCast.EndDate, record.EndDate );
            }

			string statement = update.ToString();

			int result;

			using( ImpactDatabase database = new ImpactDatabase() )
			{
				result = database.ExecuteNonQuery( statement );
			}

			return new CastResult { HasScheduleCollision = hasScheduleCollision, EffectedRows = result };
		}
        /// <summary>
        /// Sort existin elements
        /// </summary>
        /// <param name="elements"></param>
        /// <param name="form"></param>
        /// <param name="curFilter"></param>
        /// <returns></returns>
		public int Sort( List<RecTMElement> elements, RecProductionFormStd form, BedFilter curFilter )
		{
			if( null == form || null == elements || elements.Count == 0 )
			{
				var msg = string.Format( "Missing sorting input!" );
				throw new FaultException<BusinessFaultContract>( new BusinessFaultContract() { Argument = msg }, "Cannot sort form!" );
			}

			this.filter = curFilter;
            var bed = new ProductionBed( form, curFilter );

			var positionedElements = bed.FillBed( elements );
			var savedElem = bed.Save( positionedElements );

            if( savedElem < elements.Count )
            {
                // remove the delta
                var mgr = new ProjectManager();
                var planner = new ModelPlanner();
                foreach( RecTMElement elem in elements )
                {
                    if( !mgr.Find( positionedElements, elem ) )
                    {
                        planner.ResetElementProduction( elem.Factory, elem.Project, 0, elem.ElementId, false );
                    }
                }
            }

            return 0;
		}
예제 #19
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="filter"></param>
        /// <param name="castUnits"></param>
        /// <param name="elements"></param>
        /// <param name="positionedElements"> </param>
        /// <param name="hasShiftExistingElements"> </param>
        /// <param name="isUserPositionedElement"> </param>
        /// <returns></returns>
        private BedResult ProcessElement( BedFilter filter, List<RecProductionFormStd> castUnits, 
            IList<RecTMElement> elements, List<RecTMElement> positionedElements, out bool hasShiftExistingElements,
            bool isUserPositionedElement = false )
        {
            if( positionedElements == null )
            {
                throw new ArgumentNullException( "positionedElements" );
            }
            var bedResult = new BedResult();
            if( null == filter || null == castUnits || castUnits.Count == 0 || null == elements || elements.Count == 0 )
            {
                throw new ArgumentNullException( "Missing curFilter, castUnits or positionedElements!" );
            }
            //
            var bpc = new ProductionBedContainer();
            bpc.LoadPositionedElementData( castUnits, filter, isUserPositionedElement );

            hasShiftExistingElements = false;
            foreach( var castUnit in castUnits )
            {
                //var controlfilter = new BedFilter( filter );
                var hasElements = bpc.HasExistingElements( castUnit );
                // If there are no elements on the current cast unit of type bed
                // then adjust the cast unit data (element type, style,strands) to the first element
                var recProductionCast = bpc.GetProductionCast( castUnit );
                if( castUnit.FormType == FormType.Bed && !hasElements )
                {
                    //controlfilter.ForceStrandControl = false;
                    //controlfilter.ForceStyleControl = false;
                    recProductionCast = bpc.AdjustProductionCastToElement( castUnit, elements[0] );
                }

                // Register element existing flag
                if( hasElements )
                {
                    hasShiftExistingElements = true;
                }
                // interrupt for single element cast unit if there are existing elements
                if( filter.SingleElementCastUnit && hasElements )
                {
                    continue;
                }

                var unpositioned = GetUnpositionedElements( elements, positionedElements );
                var allowedElements = LoadAllowedElements( filter, castUnit, recProductionCast, unpositioned, true );
                allowedElements = ( from o in allowedElements where o.ElementWidthOnBed < castUnit.MaxWidth || DoubleHelper.IsEqual( o.ElementWidthOnBed, castUnit.MaxWidth )  select o ).ToList();
                if( allowedElements.Count > 0 )
                {
                    List<RecTMElement> elementsToSave;
                    if( isUserPositionedElement )
                    {
                        elementsToSave = new List<RecTMElement>();
                        foreach( var element in elements  )
                        {
                            var found = (from o in allowedElements
                                          where
                                              o.ElementId == element.ElementId
                                              && o.Project.Equals( element.Project ) select o).Any();
                            if( found )
                            {
                                elementsToSave.Add( element );
                            }
                        }
                    }
                    else
                    {
                        // Sort elements by dim
                        var sortedElements =
                            allowedElements.OrderBy( x => x.ElementWidthOnBed ).ThenBy( x => x.ElementLengthOnBed ).
                                ToList();
                        //Debug( sortedElements );
                        elementsToSave = bpc.PositionElementsOnBed( castUnit, sortedElements );
                    }
                    bpc.Save( castUnit, elementsToSave );
                    if( null != elementsToSave )
                    {
                        bedResult.NumberOfCasts++;
                        positionedElements.AddRange( elementsToSave );
                    }
                }
                if( positionedElements.Count == elements.Count )
                {
                    //Then we are done
                    break;
                }
            }
            bedResult.NumberOfElements = positionedElements.Count;

            if( positionedElements.Count == 0 )
            {
                // Let's prepare some hint for the user
                var tempList = new List<RecTMElement> { elements[0] };
                var elemInfo = LoadAllowedElements( filter, castUnits[0], null, tempList, false );
                if( null != elemInfo && elemInfo.Count > 0 )
                {
                    bedResult.Element = elemInfo[0];
                }
            }

            return bedResult;
        }
예제 #20
0
	    /// <summary>
	    /// Load all records of the same factory and project as the supplied record.
	    /// </summary>
	    /// <param name="filter"> </param>
	    /// <returns>A list of all mathcing records.</returns>
	    public ProductionFormStdData LoadProductionFormStd( BedFilter filter )
		{
            var formData = new ProductionFormStdData
                               { SectionStyles = this.LoadSectionStyles( filter.Factory, filter.Project ) };
            //Load SectionStyleStd
	        //Load forms
            var query = new ImpactQuery()
			{
				Select =
				{
					ImpProductionFormStd.Factory,
					ImpProductionFormStd.Project,
					ImpProductionFormStd.Name,
					ImpProductionFormStd.FormType,
					ImpProductionFormStd.Description,
					ImpProductionFormStd.Location,
					ImpProductionFormStd.NbrOfShift,
					ImpProductionFormStd.Length,
					ImpProductionFormStd.Width,
					ImpProductionFormStd.Height,
					ImpProductionFormStd.Tolerance,
					ImpProductionFormStd.MaxLength,
					ImpProductionFormStd.MaxWidth,
					ImpProductionFormStd.MaxHeight,
					ImpProductionFormStd.MaxMass,
					ImpProductionFormStd.ElementType,
					ImpProductionFormStd.Style,
					ImpProductionFormStd.StrandType,
					ImpProductionFormStd.Strandptn,
					ImpProductionFormStd.Division,
					ImpProductionFormStd.CreatedBy,
					ImpProductionFormStd.CreatedDate,
					ImpProductionFormStd.ChangedBy,
					ImpProductionFormStd.ChangedDate,

                    Aggregate.Count( ImpProductionFormStrand.Strand ),

				},
				From  = { ImpProductionFormStd.As( "T1" ) },
                Join =
				{
					Join.Left( ImpProductionFormStrand.As( "T2" ),	
					ImpProductionFormStrand.Factory.Equal( ImpProductionFormStd.Factory ),
					ImpProductionFormStrand.Project.Equal( ImpProductionFormStd.Project ),
					ImpProductionFormStrand.Form.Equal( ImpProductionFormStd.Name ) ),

					Join.Left( ImpProductionFormStrandStd.As( "T3" ),	
					ImpProductionFormStrandStd.Factory.Equal( ImpProductionFormStrand.Factory ),
					ImpProductionFormStrandStd.Project.Equal( ImpProductionFormStrand.Project ),
					ImpProductionFormStrandStd.Name.Equal( ImpProductionFormStrand.Form ),
					ImpProductionFormStrandStd.StrandPos.Equal( ImpProductionFormStrand.Strand ) ),
                },
				Where = { ImpProductionFormStd.Factory.Equal( filter.Factory ), ImpProductionFormStd.Project.Equal( filter.Factory ) },//Factory, Factory
                GroupBy = 
                {
					ImpProductionFormStd.Factory,
					ImpProductionFormStd.Project,
					ImpProductionFormStd.Name,
					ImpProductionFormStd.FormType,
					ImpProductionFormStd.Description,
					ImpProductionFormStd.Location,
					ImpProductionFormStd.NbrOfShift,
					ImpProductionFormStd.Length,
					ImpProductionFormStd.Width,
					ImpProductionFormStd.Height,
					ImpProductionFormStd.Tolerance,
					ImpProductionFormStd.MaxLength,
					ImpProductionFormStd.MaxWidth,
					ImpProductionFormStd.MaxHeight,
					ImpProductionFormStd.MaxMass,
					ImpProductionFormStd.ElementType,
					ImpProductionFormStd.Style,
					ImpProductionFormStd.StrandType,
					ImpProductionFormStd.Strandptn,
					ImpProductionFormStd.Division,
					ImpProductionFormStd.CreatedBy,
					ImpProductionFormStd.CreatedDate,
					ImpProductionFormStd.ChangedBy,
					ImpProductionFormStd.ChangedDate,
                }

			};

            if (null != filter && !string.IsNullOrWhiteSpace(filter.Location) && !filter.Location.Equals(Filter.All))
            {
                query.Where.Add(ImpProductionFormStd.Location.Equal(filter.Location));
            }

			string statement = query.ToString();

			List<RecProductionFormStd> result;

			using( ImpactDatabase database = new ImpactDatabase() )
			{
				result = database.GetAll( statement, ParseProductionFormStd );
			}
            formData.Forms = result;

			return formData;
		}