Scheduling by assembly in extremely large jobs

Sorry about the long read to get to the point, I just want to get some basic background out of the way…

So one of the bedrocks of being able to manage a manufacturing business well with software is to have at least a semi-realistic schedule. If you have that you can rely on dates for a lot of things that help you make decisions.

One (of our many) issues is, we set up our jobs as very large, singular jobs, structured to match the CAD model. The largest job we have currently going through the system has 4,429 assembly sequences with a quantity sum of 27,552, 6,591 material lines, 7,459 operations. This is about the largest job we would have, but you get the point.

These are not unique parts for every assembly sequence. The same part may be use 30 different places, but since we have the Job BOM structured to match the CAD BOM, you get an assembly sequence for every different parent that it’s used in. If we used MRP, it would consolidate some things, but 1. we don’t have MRP and 2. I don’t think our shop is disciplined enough to the the necessary transactions to make the system match reality enough for MRP to work correctly.

Our capacities and resources are not well enough defined in our process to be able to utilize finite scheduling either. Right now I have queue and move times to artificially space some things out, but that only expands the critical path, and doesn’t stretch out the schedule due to limited resources.

So that (finally) brings me to my question. What I would like to do is be able to move my assemblies in the level 1 (if level 0 is the final part number) and sometimes level 2 of the tree and space them out in the schedule. For the example I listed above, there are about 40 or so items that I would like to simply space out about 1 or 2 per day in final assembly, and then let the rest of the tree below it schedule using the move and queue times that I have set up in the resource groups.

I’ve played with the scheduling board, and I see that this is the intention of how it’s supposed to work, however, the way it ends up working, is every time you try to move an assembly, it has to go through some process that takes about 3 mins. So for 40*3=120mins or two hours, just to space out the assemblies. And that’s if I jump back on exactly when it’s done and do the next change.

Is there a way to set these dates (and lock them?) without doing the processing until I set all of the dates that I want? I’m ok with the processes taking a while, but don’t want to have to keep poking it every 3 minutes. I’m fine with a DMT, UBAQ or something else. I just have no idea where to start on something like this. Has anyone tackled something like this?

I’ve adjusted the schedule with a UBAQ before (it isn’t fun or trivial, but it is doable)

 foreach(var x in ttResults.Where(r=>r.Updated() && r.Calculated_RecordType=="SE"))
        ScheduleEngineTableset seTs = new ScheduleEngineTableset();
        var schedEng =(ScheduleEngineRow) seTs.ScheduleEngine.NewRow();
        schedEng.Company = callContextClient.CurrentCompany;
        schedEng.JobNum = x.JobHead_JobNum;
        schedEng.AssemblySeq = x.ResourceTimeUsed_AssemblySeq;
        schedEng.OprSeq = x.ResourceTimeUsed_OprSeq;
        schedEng.OpDtlSeq = x.ResourceTimeUsed_OpDtlSeq;
        schedEng.StartDate = x.ResourceTimeUsed_StartDate;
        schedEng.StartTime =x.ResourceTimeUsed_StartTime;
        schedEng.EndDate = x.ResourceTimeUsed_EndDate;
        schedEng.EndTime = x.ResourceTimeUsed_EndTime;
        schedEng.WhatIf = false;
        schedEng.Finite = false;
        schedEng.OverrideMtlCon = true;
        schedEng.OverRideHistDateSetting = 2;
        schedEng.SetupComplete =false;
        schedEng.ProductionComplete = false;
        schedEng.SchedTypeCode = "oo";
        schedEng.ScheduleDirection = "Start";
        schedEng.RecalcExpProdYld = false;
        schedEng.ResourceID = x.ResourceTimeUsed_ResourceID;
        schedEng.ResourceGrpID = x.ResourceTimeUsed_ResourceGrpID;
        schedEngine.GetSchedulingMultiJobFlags(out _schedulingMultiJobActive, out _minimizeWIPFlag, out _allowMoveJobsAcrossPlants, out _autoLoadParentJobs, out _autoLoadChildJobs);
        schedEng.UseSchedulingMultiJob = _schedulingMultiJobActive;
        schedEng.SchedulingMultiJobMinimizeWIP = _minimizeWIPFlag;
        schedEng.SchedulingMultiJobMoveJobsAcrossPlants = _allowMoveJobsAcrossPlants;
        schedEng.SysRowID = x.JobHead_SysRowID;
        schedEng.RowMod= "A";
        string txt="";
        bool finished;
        schedEngine.MoveJobItem(seTs, out finished, out txt);

The most difficult bit is figuring out the schedule type code
AA will be Assembly and all operations
AS will be Assembly and subsequent operations.