Acumatica 在业务逻辑定制期间获取销售订单中的订单信息,例如库存id、客户id和位置id

Acumatica 在业务逻辑定制期间获取销售订单中的订单信息,例如库存id、客户id和位置id,acumatica,Acumatica,正如我在上一个问题中提到的,在添加此销售订单后,我需要为销售订单中的每个特定产品自动添加合同 感谢@Gabriel的回答,我已经学会了在前面的问题中添加合同部分,现在我需要知道如何在销售订单业务逻辑屏幕SO301000中获取这些订单信息,例如订单项中的库存id、客户id和位置id。谁能给我一些示例代码吗 谢谢 现在,我似乎能够从代码中获取客户id和位置id: SOOrder SalesOrder = (SOOrder)Base.Caches[typeof(SOOrder)].Current;

正如我在上一个问题中提到的,在添加此销售订单后,我需要为销售订单中的每个特定产品自动添加合同

感谢@Gabriel的回答,我已经学会了在前面的问题中添加合同部分,现在我需要知道如何在销售订单业务逻辑屏幕SO301000中获取这些订单信息,例如订单项中的库存id、客户id和位置id。谁能给我一些示例代码吗

谢谢

现在,我似乎能够从代码中获取客户id和位置id:

SOOrder SalesOrder = (SOOrder)Base.Caches[typeof(SOOrder)].Current; 
int customer_id = SalesOrder.CustomerID; 
int Location ID = SalesOrder.CustomerLocationID;
....
但我仍然需要了解如何按顺序遍历product list SOLine项……我发现的代码如下,这是在T200 training PDF中实现SO发布操作的示例,似乎太旧了,对我没有帮助:

public static void ReleaseOrder(SalesOrder order)
{
  SalesOrderEntry graph = PXGraph.CreateInstance<SalesOrderEntry>();
  graph.Orders.Current = order;
  foreach (OrderLine line in graph.OrderDetails.Select())
  {
    ProductQty productQty = new ProductQty();
    productQty.ProductID = line.ProductID;
    productQty.AvailQty = -line.OrderQty;
    graph.Stock.Insert(productQty);
   }
    order.ShippedDate = graph.Accessinfo.BusinessDate;
    order.Status = OrderStatus.Completed;
    graph.Orders.Update(order);
    graph.Persist();
}

我知道了如何做,下面是我拥有的代码,到目前为止它对我有效-你可以看到我使用SOLine_RowPersisted,而不是像以前那样定制Persiste

protected virtual void SOLine_RowPersisted(PXCache sender,PXRowPersistedEventArgs e)
{           
    if (e.TranStatus == PXTranStatus.Completed)
    {
        if ((e.Operation & PXDBOperation.Command) == PXDBOperation.Insert)
        {
           SOOrder SalesOrder = (SOOrder)Base.Caches[typeof(SOOrder)].Current;

           SOLine line = (SOLine)e.Row;                

           // Lookup inventory
           InventoryItem template = PXSelect<InventoryItem,
                                    Where<InventoryItem.inventoryID, Equal<Required<InventoryItem.inventoryID>>>>
                          .Select(Base, line.InventoryID);
           if (template.InventoryCD == null)
           {
             throw new PXException("Inventory CD can not be blank.");
           }

           if (template.InventoryCD.StartsWith("AAABBB"))
           {
               ContractMaint contractMaint = PXGraph.CreateInstance<ContractMaint>();
               CTBillEngine engine = PXGraph.CreateInstance<CTBillEngine>();
               DateTime StartDate = DateTime.Now;

               ........
               string contractCD = ......
               Contract contract = SetupActivateContract(contractMaint, contractCD, StartDate , line.CustomerID, SalesOrder.CustomerLocationID, engine);
            }           
       } else if ((e.Operation & PXDBOperation.Command) == PXDBOperation.Delete)
       {
         .....
       } else if ((e.Operation & PXDBOperation.Command) == PXDBOperation.Update)
       {
         ....
        }

     }   
}

这就是在覆盖扩展中的persist时必须循环行的方式

 foreach (SOLine line in this.Base.Transactions.Select())
 {
 }

您在这里所做的是通过执行select方法循环缓存中的有效记录。为此,您必须从基本BLC定义中找到与DACSOLine相关的视图定义事务。

您是否完成了各种Acumatica开发人员培训?这是这些培训中涉及的一个非常广泛的问题。@Gabriel,很抱歉,我刚刚从Acumatica开放大学网站下载了所有我能得到的东西,并阅读了那些PDF,尽管那里的T300培训材料似乎已经过时了。是否有正式的开发者在线或课堂培训?我刚刚编辑了我的问题。我们有一个完整的开发者认证流程-你需要完成T100和T200…@Gabriel,谢谢你的回答-我已经阅读了所有T100、T200和T300,尽管我承认我没有尝试每一个示例,但是PDF文档似乎过时了,因为一些菜单和方法似乎不起作用。顺便说一句,当你添加评论时,我正在编辑我的帖子-你能看看我的编辑吗?谢谢。此事件将针对销售订单中的每一行触发,另外需要注意的是,它也将在删除时触发。正如Gabriel所指出的,这是一件非常基本的事情,您必须了解开发教程。@Hybridzz,感谢您的提醒-是的,关于删除和更新事件,您是对的,我刚刚将其添加到我的代码中,如上所述,以演示我的计划。最初的代码只是一个概念证明,最终我将不得不处理所有的插入、更新和删除事件。我想补充一点,即使@Gladiator的代码行可以获得当前元素,但它过于复杂:SOOrder SalesOrder=SOOrderBase.Caches[typeofSOOrder].current;可以替换为SOOrder salesOrder=Base.Transactions.Current;请注意:如果是SOOrder,则关联的视图定义将是“文档”而不是“事务”。所以,Base.Document.CurrentYou是对的@Hybridzz。交易是针对Soline的。谢谢你指出这一点!