This is using a function (which you should be using for anything complicated anyway), but it walks you through the whole process of taking an existing job, unengineering it, re-pulling details, and re-engineering. If you stick to BPM’s, the method calls will be pretty much the same.
Note that this specific example was meant to be run on a list of JobHead records. For your needs you’d need to call JobEntry.GetByID() or use a LINQ query to create the variable “job”.
The quick answer to your question is that JobEntry.Update() does not like having any child rows in the dataset of engineered jobs. You have to strip out everything except the JobHead record.