2017-12-31 196 views
0

Wir haben ein benutzerdefiniertes Verarbeitungsfenster, das ein benutzerdefiniertes Feld namens UsrDateNotified in der ARTran-Tabelle aktualisiert, in dem sich UsrDateNotified vor dem RevisionDateReceived in einer benutzerdefinierten Tabelle ItemBaseDocument befindet. Außerdem müssen wir das Feld UsrDateNotified in der Tabelle ItemBaseDocument aktualisieren, das mit der InventoryID in ARTran verknüpft ist. Unser aktueller Code validiert die Aktualisierung der ARTran-Tabelle, aber wir haben Schwierigkeiten damit, auch das zugehörige ItemBaseDocument für die ausgewählten ARTran-Datensätze zu aktualisieren. Was ist der richtige Ansatz für dieses Szenario?Acumatica-Verarbeitungsbildschirm Aktualisieren des benutzerdefinierten ARTran-Felds muss auch das benutzerdefinierte Tabellenfeld aktualisieren

using System; 
using System.Collections; 
using System.Linq; 
using PX.Data; 
using PX.SM; 
using PX.Objects.AR; 
using PX.Objects.CR; 
using PX.Objects.IN; 

namespace DocCenter 
{ 
    public class UpdateLastNotified : PXGraph<UpdateLastNotified> 
    { 
    public PXFilter<UpdateLastNotifiedFilter> MasterView; 
    public PXCancel<UpdateLastNotifiedFilter> Cancel; 


    [PXFilterable] 

    public PXSelect<ARTran> DetailsView; 

public UpdateLastNotified() 
    { 
    Cancel.SetCaption("Clear Filter"); 
    this.DetailsView.Cache.AllowInsert = false; 
    this.DetailsView.Cache.AllowDelete = false; 
    this.DetailsView.Cache.AllowUpdate = true; 
    } 



protected virtual IEnumerable detailsView() 
{ 
UpdateLastNotifiedFilter filter = MasterView.Current as UpdateLastNotifiedFilter; 
PXSelectBase<ARTran> cmd = new PXSelectJoinOrderBy<ARTran, 
    InnerJoin<InventoryItem, On<ARTran.inventoryID, Equal <InventoryItem.inventoryID>>, 
    InnerJoin<ItemBaseDocument, On<InventoryItemExt.usrDocumentNumber, Equal<ItemBaseDocument.baseDocumentCode>>, 
    InnerJoin<Contact, On<ARTranExt.usrContactID, Equal<Contact.contactID>>>>>, 
    OrderBy<Asc<ARTran.tranDate>>>(this);  

cmd.WhereAnd<Where<ContactExt.usrNotificationPriority, 
Equal<Current<UpdateLastNotifiedFilter.notificationPriority>>>>(); 


cmd.WhereAnd<Where<ARTranExt.usrDateNotified, 
Less<ItemBaseDocument.revisionDateReceived>>>();  


if (filter.BaseDocumentCode != null) 
{ 
cmd.WhereAnd<Where<InventoryItemExt.usrDocumentNumber, 
Equal<Current<UpdateLastNotifiedFilter.baseDocumentCode>>>>(); 
} 

    return cmd.Select(); 
} 

public PXAction<UpdateLastNotifiedFilter> Process; 
[PXProcessButton] 
[PXButton(CommitChanges=true)] 
[PXUIField(DisplayName = "Process")] 
protected virtual IEnumerable process(PXAdapter adapter) 
{ 

    PXLongOperation.StartOperation(this, delegate() 
    { 
    foreach(ARTran tran in DetailsView.Select()) 
    { 
    if (tran.Selected==true) 
     { 
     ARTranExt tranExt = tran.GetExtension<ARTranExt>(); 
     ARInvoiceEntry tranEntry = new ARInvoiceEntry(); 
     tranExt.UsrDateNotified = MasterView.Current.DateNotified; 
     tranEntry.Transactions.Update(tran); 
     tranEntry.Save.PressButton(); 



     } 

    } 


    } 

     ); 
return adapter.Get(); 
} 




    [Serializable] 
    public class UpdateLastNotifiedFilter : IBqlTable 
    { 

public static class NotificationPriority 
{ 
    public const string None = "N"; 
    public const string Alert = "A"; 
    public const string Express = "E"; 
    public const string Shipment = "P"; 
    public const string Subscription = "S"; 
} 


     #region NotificationPriority 
     public abstract class notificationPriority : PX.Data.IBqlField 
     { 
     } 

     [PXDBString(1, IsFixed = true)] 
     [PXDefault(NotificationPriority.None)] 
     [PXUIField(DisplayName = "Notification Type")] 
     [PXStringList(
      new string[] 
     { 
     NotificationPriority.None, 
     NotificationPriority.Alert, 
     NotificationPriority.Express, 
     NotificationPriority.Shipment, 
     NotificationPriority.Subscription 
     }, 
     new string[] 
     { 
     "None", 
     "Alert", 
     "Express", 
     "Shipment", 
     "Subscription" 
     })] 


     #endregion  





     #region BaseDocumentID 
     public abstract class baseDocumentCode : PX.Data.IBqlField 
     { 
     } 

[PXString(50)] 
[PXUIField(DisplayName="Document Number")] 
[PXSelector(typeof(DocCenter.ItemBaseDocument.baseDocumentCode))]  

     public virtual String BaseDocumentCode 
     { 
     get; 

     set; 

     } 
     #endregion  



     #region DateNotified 
     public abstract class dateNotified : PX.Data.IBqlField 
     { 
     } 
     [PXDBDate()] 
     [PXDefault(typeof(AccessInfo.businessDate))] 
     [PXUIField(DisplayName = "Date Notified")] 
     public DateTime? DateNotified { get; set; } 
     #endregion 




    } 




    } 
} 

Antwort

0

Ihre beste Wette wäre, eine Ansicht zu erstellen, die ItemBaseDocument auswählt.

PXSelect<ItemBaseDocument> ViewName; 

In Ihrem for-Schleife des Aktionstaste, wollen Sie ein neues ItemBaseDocument Objekt erstellen und es gleich den entsprechenden ItemBaseDocument Zeileneintrag gesetzt. Sie können dann das Datum dieses Objekts aktualisieren, und wenn Sie die Aktion Save.PressButton() ausführen, sollten die Aktualisierungen auch für diesen Eintrag gespeichert werden.

foreach(ARTran tran in DetailsView.Select()) 
{ 
if (tran.Selected==true) 
    { 
    ARTranExt tranExt = tran.GetExtension<ARTranExt>(); 
    ARInvoiceEntry tranEntry = new ARInvoiceEntry(); 
    tranExt.UsrDateNotified = MasterView.Current.DateNotified; 
    tranEntry.Transactions.Update(tran); 
    tranEntry.Save.PressButton(); 

    //Target Added Code 
    ItemBaseDocument doc = PXSelect<ItemBaseDocument, Where<ItemBaseDocument.inventoryID, 
    Equal<Required<ARTran.inventoryID>>>>.Select(tran.InventoryID); 
    doc.UsrDateNotified = MasterView.Current.DateNotified; 

    } 

} 

Haftungsausschluss: Im obigen Code kann ein Syntaxfehler auftreten. Wenn ja, lass es mich wissen und ich werde es beheben.

+0

Ich habe festgestellt, dass Sie die Save.PressButton() ausführen möchten, nachdem Sie den Code ausgeführt, den ich hinzugefügt habe. –

Verwandte Themen