Nous avons 2 DAC - Master et Child

DAC maître

#region MasterID
public abstract class masterID:PX.Data.BQL.BqlInt.Field<masterID> { }
protected int? _MasterID;
[PXDBIdentity()]
[PXUIField(Visibility = PXUIVisibility.Invisible)]
[PXReferentialIntegrityCheck]
public virtual int? MasterID
{
    get {return this._MasterID;}
    set {this._MasterID = value;}
}
#endregion

#region MasterCD
public abstract class masterRoutingCD:PX.Data.BQL.BqlString.Field<masterCD> { }
protected string _MasterRoutingCD;
[BomID(DisplayName = "Master #", IsKey = true, Required = true,
    Visibility = PXUIVisibility.SelectorVisible)]
[PXDefault]
[Rev.Key(typeof(Setup.pMMasterNumberSequenceID),
         typeof(Master.masterCD),
         typeof(Master.revisionNo),
         typeof(Master.masterCD),
         typeof(Master.revisionNo)
    )]

public virtual string MasterCD
{
    get {return this._MasterCD;}
    set {this._MasterCD = value;}
}
#endregion

#region RevisionNo
public abstract class revisionNo:PX.Data.IBqlField { }
protected string _RevisionNo;
[RevisionIDField(IsKey = true, Visibility = PXUIVisibility.SelectorVisible,
    Required = true)]
[PXDefault(typeof(Master.defaultRevisionNo),
    PersistingCheck = PXPersistingCheck.Nothing)]
[Rev.ID(typeof(Master.defaultRevisionNo),
        typeof(Master.masterCD),
        typeof(Master.revisionNo),
        typeof(Master.revisionNo),
        typeof(Master.description),
        typeof(Master.fromDate),
        typeof(Master.toDate))]
public virtual string RevisionNo
{
    get {return this._RevisionNo;}
    set {this._RevisionNo = value;}
}
#endregion

DAC enfant

public abstract class childID:PX.Data.BQL.BqlInt.Field<childID> { }
protected int? _ChildID;
[PXDBIdentity()]
//[PXReferentialIntegrityCheck]
public virtual int? ChildID
{
  get {return this._ChildID;}
  set {this._ChildID = value;}
}
#endregion

#region MasterID
public abstract class masterID:PX.Data.BQL.BqlInt.Field<masterID> { }
protected int? _MasterID;
[PXDBInt()]
[PXDBDefault(typeof(Master.masterID))]
[PXParent(typeof(Select<Master, Where<Master.masterRoutingCD, Equal<Current<masterCD>>,
    And<Master.revisionNo, Equal<Current<revisionNo>>>>>))]
public virtual int? MasterID
{
  get {return _MasterID;}
  set {_MasterID = value;}
}
#endregion MasterID

#region MasterCD
public abstract class masterCD:PX.Data.BQL.BqlString.Field<masterCD> { }
protected string _MasterCD;
[PXDBDefault(typeof(Master.masterCD))]
[PXDBString(IsKey = true, IsUnicode = true)]
public virtual string MasterCD
{
    get {return this._MasterCD;}
    set {this._MasterCD = value;}
}
#endregion

#region Revision
public abstract class revisionNo:PX.Data.BQL.BqlString.Field<revisionNo> {}
[PXDBString(15, IsKey = true, IsUnicode = true)]
[PXDBDefault(typeof(Master.revisionNo))]
public virtual string RevisionNo { get; set; }
#endregion Revision

public abstract class stepsID:PX.Data.BQL.BqlInt.Field<stepsID> { }
[OperationCDField(IsKey =true, DisplayName = "Steps ID",
    Visibility = PXUIVisibility.SelectorVisible)]
[PXDefault(PersistingCheck = PXPersistingCheck.NullOrBlank)]
//[PXUIField(DisplayName = "Process Steps ID")]
public virtual string StepsID { get; set; }

Graphique - MasterMaint

public class MasterMaint:PXRevisionableGraph<MasterMaint, Master,
    Master.masterCD, Master.revisionNo>
{
    public PXSelect<Child, Where<Child.masterCD, Equal<Current<Master.masterCD>>,
        And<Child.revisionNo, Equal<Current<Master.revisionNo>>>>> ChildRecords;

    #region Override

    public override bool CanClipboardCopyPaste()
    {
        return false;
    }

    public override bool CanCreateNewRevision(MasterMaint fromGraph, MasterMaint toGraph,
        string keyValue, string revisionValue, out string error)
    {
        // Always returns true as new revisions can be created at any time
        error = string.Empty;
        return true;
    }
   
    public override void CopyRevision(MasterMaint fromGraph, MasterMaint toGraph,
        string keyValue, string revisionValue)
    {
        if(toGraph?.Documents?.Current == null || fromGraph?.Documents?.Current == null)
        {
            // api calls should create new revs on their own - this causes issues
            // when calling from api so we need to turn the copy rev logic off
            return;
        }
        toGraph.Documents.Cache.SetDefaultExt<EWPMMasterRouting.status>
            (toGraph.Documents.Current);
        if(SkipAutoCreateNewRevision())
        {
            return;
        }
        CopyChildRecords(fromGraph.Documents.Current.MasterRoutingCD,
            fromGraph.Documents.Current.RevisionNo, toGraph.Documents.Current.MasterID,
            keyValue, revisionValue, false);
    }

  
    internal virtual void CopyChildRecords(string sourceID, string sourceRevisionNo,
        int? newMasterID, string newMasterCD, string newRevisionID, bool copyNotes)
    {
        foreach(Child fromRow in PXSelect<Child,
            Where<Child.masterCD, Equal<Required<Child.masterCD>>,
                And<Child.revisionNo, Equal<Required<Child.revisionNo>>>>>
            .Select(this, sourceID, sourceRevisionNo))
        {
            var toRow = PXCache<Child>.CreateCopy(fromRow);
            toRow.MasterID = newMasterRoutingID;
            toRow.ChildID = null;
            toRow.MasterCD = newMasterCD;
            toRow.RevisionNo= newRevisionID;
            toRow = ChildRecords.Insert(toRow);
        }
    }

    #endregion
}

Problème - Lorsque la valeur est modifiée dans la révision, l'enregistrement est affiché avec le nouveau numéro de révision en conservant les champs du CD comme pour la révision précédente et tous les enfants. Tout est correct, mais lorsque l'enregistrement est enregistré, l'erreur "Un autre processus a mis à jour l'enregistrement, vos modifications seront perdues" Pourquoi il y a une erreur

0
Shaj 25 févr. 2021 à 13:47

1 réponse

Meilleure réponse

Dans Acuamtica, nous avons une colonne NoteID unique dans le système. Si vous essayez de créer un enregistrement avec une valeur de champ NoteID dupliquée, vous obtiendrez l'exception «Un autre processus a mis à jour l'enregistrement» car il considère que vous mettez à jour le même enregistrement. Dans votre cas, lorsque vous copiez la révision, vous ne réinitialisez pas la valeur NoteID pour l'enregistrement afin que vous essayez réellement d'insérer un autre enregistrement avec la même valeur.

Vous devrez ajouter la ligne suivante à la méthode CopyRevision

toGraph.Documents.Cache.SetDefaultExt<EWPMMasterRouting.noteID>(toGraph.Documents.Current);
0
Dmitrii Naumov 9 mars 2021 à 21:56