【问题标题】:Create Invoice By Code按代码创建发票
【发布时间】:2015-06-04 13:10:24
【问题描述】:

我正在使用此代码创建新发票。我从 SOInvoiceEntry 进行定制。我调试并得到一个错误 Revision ID is not empty。当我为 customerID 设置值时,我客人说此代码无法获取客户财务信息的信息。这是我的代码。感谢您的支持。

public PXAction<ARInvoice> preparePayment;

    [PXUIField(DisplayName = "Pay Invoice", Enabled = true)]
    [PXButton()]
    public IEnumerable PreparePayment(PXAdapter adapter)
    {
        List<ARRegister> doclist = new List<ARRegister>();
        SOOrderShipment soOrderShipment =
                     PXSelect
                         <SOOrderShipment,
                             Where<SOOrderShipment.invoiceNbr, Equal<Required<SOOrderShipment.invoiceNbr>>>
                             >.Select(new PXGraph(), Base.Document.Current.RefNbr);

        if (soOrderShipment != null)
        {
            SOOrder soOrder = PXSelect<SOOrder, Where<SOOrder.orderNbr,
                Equal<Required<SOOrder.orderNbr>>,
                And<SOOrder.orderType, Equal<Required<SOOrder.orderType>>>>>.Select(
                    new PXGraph(), soOrderShipment.OrderNbr, soOrderShipment.OrderType);
            SOOrderExt soExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(soOrder);
            if (soExt.CustomerID != soExt.UsrARCustomer)
            {
                ARInvoiceEntry arInvoiceGraph = PXGraph.CreateInstance<ARInvoiceEntry>();
                ARInvoice invoice = (ARInvoice)arInvoiceGraph.Caches[typeof(ARInvoice)].CreateInstance();
                invoice = (ARInvoice) arInvoiceGraph.Caches[typeof (ARInvoice)].Insert(invoice);
                arInvoiceGraph.Caches[typeof(ARInvoice)].SetValue<ARInvoice.customerID>(invoice,soExt.UsrARCustomer);

                invoice.DocType = ARInvoiceType.DebitMemo;
                invoice.CustomerID = soExt.UsrARCustomer;
                //invoice.CustomerID = Base.Document.Current.CustomerID;
                Location location =
                    PXSelect<Location, Where<Location.bAccountID, Equal<Required<Location.bAccountID>>>>.Select(
                        arInvoiceGraph, soExt.UsrARCustomer);
                if(location!=null)
                       arInvoiceGraph.Caches[typeof(ARInvoice)].SetValue<ARInvoice.customerLocationID>(invoice, location.LocationID);
                arInvoiceGraph.Caches[typeof(ARInvoice)].SetValueExt<ARInvoice.docDate>(invoice, DateTime.Now);
                arInvoiceGraph.Caches[typeof(ARInvoice)].SetValue<ARInvoice.projectID>(invoice,location.CDefProjectID);

                ARInvoice oldInvoice = (ARInvoice)arInvoiceGraph.Caches[typeof(ARInvoice)].CreateCopy(invoice);

                invoice.CuryOrigDocAmt = 0;
                arInvoiceGraph.Caches[typeof(ARInvoice)].RaiseRowUpdated(invoice, oldInvoice);
                arInvoiceGraph.Caches[typeof(ARInvoice)].SetValue<ARInvoice.curyOrigDocAmt>(invoice, invoice.CuryDocBal);
                invoice.RefNoteID = 1;

                arInvoiceGraph.Caches[typeof(ARInvoice)].SetValueExt<ARInvoice.hold>(invoice, false);

                doclist.Add((ARInvoice)arInvoiceGraph.Caches[typeof(ARInvoice)].Current);
                arInvoiceGraph.Save.Press();

            }


        }

}

【问题讨论】:

  • “不为空”或“可能不为空”?因为使用反射器我只看到“可能不是空的”
  • @Yura: 抱歉可能不为空是正确的错误
  • 你的扩展图中是否有一些 ARInvoice_RowPersisting 的代码?
  • @Yura:我没有为这个活动定制

标签: c# cloud erp acumatica


【解决方案1】:

就我在基本图中查看protected virtual void ARInvoice_RowPersisting(PXCache sender, PXRowPersistingEventArgs e) 而言,我在那里看到了一些错误消息,上面写着"may not be empty"。没有任何与 RevisionID 相关的代码。但是有一个代码在 DAC 类ARInvoice,字段BillAddressID, BillContactID 中有RevisionID。根据这些事实,我建议您检查您是否在ARInvoice 中为 ARAddress 输入了正确的 ID,并检查数据库表 ARAddress 是否在列 RevisionID 中有值。这是必需的,因为 ARAddress 类中的 RevisionID 是通过以下方式声明的:

    [PXDBInt]
    [PXDefault]
    public virtual int? RevisionID
    {
      get
      {
        return this._RevisionID;
      }
      set
      {
        this._RevisionID = value;
      }
    }

【讨论】:

  • 如果有帮助请告诉我
  • 我会再次检查并回复您。感谢您的支持
  • @DMSpro.DangHuynh 有什么消息吗?
  • 请检查我上面的答案
  • 首先祝贺你向前迈进了一步。我明天找时间试试
【解决方案2】:
 arInvoiceGraph.Caches[typeof(ARInvoice)].SetValue<ARInvoice.customerID>(invoice,soExt.UsrARCustomer);

试试这个

invoice.Customer = soExt.UsrARCustomer;
invoice = arInvoiceGraph.Caches[typeof(ARInvoice)].Update(invoice);

【讨论】:

    【解决方案3】:

    我找到了通过更改代码来保存文档数据的解决方案

     public IEnumerable PreparePayment(PXAdapter adapter)
        {
            List<ARRegister> doclist = new List<ARRegister>();
            SOOrderShipment soOrderShipment =
                         PXSelect
                             <SOOrderShipment,
                                 Where<SOOrderShipment.invoiceNbr, Equal<Required<SOOrderShipment.invoiceNbr>>>
                                 >.Select(new PXGraph(), Base.Document.Current.RefNbr);
    
            if (soOrderShipment != null)
            {
                SOOrder soOrder = PXSelect<SOOrder, Where<SOOrder.orderNbr,
                    Equal<Required<SOOrder.orderNbr>>,
                    And<SOOrder.orderType, Equal<Required<SOOrder.orderType>>>>>.Select(
                        new PXGraph(), soOrderShipment.OrderNbr, soOrderShipment.OrderType);
                SOOrderExt soExt = PXCache<SOOrder>.GetExtension<SOOrderExt>(soOrder);
                if (soExt.CustomerID != soExt.UsrARCustomer)
                {
                    BAccount bAccount = PXSelect<BAccount, Where<BAccount.bAccountID,Equal<Required<BAccount.bAccountID>>>>.Select(new PXGraph(),soExt.UsrARCustomer);
                    ARInvoiceEntry arInvoiceGraph = PXGraph.CreateInstance<ARInvoiceEntry>();
                    ARInvoice invoice = (ARInvoice)arInvoiceGraph.Caches[typeof(ARInvoice)].CreateInstance();
                    invoice = (ARInvoice) arInvoiceGraph.Caches[typeof (ARInvoice)].Insert(invoice);
                    // Using SetValueExt by Passing AcctCD
    arInvoiceGraph.Caches[typeof(ARInvoice)].SetValueExt<ARInvoice.customerID>(invoice,bAccount.AcctCD);
                    invoice.CustomerID = soExt.UsrARCustomer;
                    arInvoiceGraph.Caches[typeof(ARInvoice)].SetValue<ARInvoice.docDesc>(invoice, "N/A");
                    invoice.DocType = ARInvoiceType.DebitMemo;
    
                    Location location =
                        PXSelect<Location, Where<Location.bAccountID, Equal<Required<Location.bAccountID>>>>.Select(
                            arInvoiceGraph, soExt.UsrARCustomer);
                    if(location!=null)
                           arInvoiceGraph.Caches[typeof(ARInvoice)].SetValue<ARInvoice.customerLocationID>(invoice, location.LocationID);
    
                    arInvoiceGraph.Caches[typeof(ARInvoice)].Update(invoice);
                    ARInvoice oldInvoice = (ARInvoice)arInvoiceGraph.Caches[typeof(ARInvoice)].CreateCopy(invoice);
    
                    invoice.CuryOrigDocAmt = Base.Document.Current.CuryOrigDocAmt;
                    arInvoiceGraph.Caches[typeof(ARInvoice)].RaiseRowUpdated(invoice, oldInvoice);
                    arInvoiceGraph.Caches[typeof(ARInvoice)].SetValue<ARInvoice.curyOrigDocAmt>(invoice, invoice.CuryDocBal);
                    arInvoiceGraph.Caches[typeof(ARInvoice)].SetValueExt<ARInvoice.hold>(invoice, false);
                    arInvoiceGraph.Caches[typeof(ARInvoice)].Update(invoice);
                    doclist.Add((ARInvoice)arInvoiceGraph.Caches[typeof(ARInvoice)].Current);
           // Insert transaction data
                    ARTran arTran = new ARTran();
                    arTran.TranDesc = "Total Value";
                    arTran.Qty = 1;
                    arTran.UnitPrice = Base.Document.Current.CuryDocBal;
                    arTran.CuryLineAmt = Base.Document.Current.CuryDocBal;
                    arInvoiceGraph.Transactions.Insert(arTran);
                    ARTran arTranUpdated = (ARTran) arInvoiceGraph.Transactions.Update(arTran);
                    arInvoiceGraph.Transactions.Current = arTranUpdated;
                    arInvoiceGraph.Transactions.Cache.Update(arInvoiceGraph.Transactions.Current);
                    arInvoiceGraph.Save.Press();
    
                }
    
    
            }
    

    虽然保存了文档数据,但没有保存交易数据。我已经尝试过这段代码来创建它,但我得到了错误。你对此有什么建议吗?感谢您的支持

     AR Error #113: Cannot save notes.
    
       at PX.Objects.AR.InvoiceNbrAttribute.RowPersisted(PXCache sender, PXRowPersistedEventArgs e)
       at PX.Objects.AR.ARInvoiceNbrAttribute.RowPersisted(PXCache sender, PXRowPersistedEventArgs e)
       at PX.Data.PXCache.OnRowPersisted(Object item, PXDBOperation operation, PXTranStatus tranStatus, Exception exception)
       at PX.Data.PXTableAttribute.PersistInserted(PXCache sender, Object row)
       at PX.Data.PXCache`1.PersistInserted(Object row)
       at PX.Data.PXCache`1.Persist(PXDBOperation operation)
       at PX.Data.PXGraph.Persist(Type cacheType, PXDBOperation operation)
       at PX.Data.PXGraph.Persist()
       at PX.Objects.AR.ARInvoiceEntry.Persist()
       at PX.Data.PXSave`1.d__0.MoveNext()
       at PX.Data.PXAction`1.d__c.MoveNext()
       at PX.Data.PXAction`1.d__c.MoveNext()
       at PX.Data.PXAction`1.Press() 
    

    【讨论】:

      【解决方案4】:

      我怀疑

      arInvoiceGraph.Transactions.Current = arTranUpdated;
      

      根据T200手册: 您可以设置 Currentproperty 在以下情况下: • 能够通过图表处理多个数据记录(参见示例 9.2:实施 收据发放操作)。 • 当您从以下位置重定向到页面时,能够打开显示指定数据记录的页面 另一个(参见示例 3.4:向网格添加重定向链接)。

      我不确定,你的情况是第 1 点或第 2 点。

      【讨论】:

      • 你好 Yura,我会检查一下
      • 我不是指重定向。我发现在 PMBilling Engine 的 PM 模块中,我发现他们使用 PXNoteAttribute.SetNote(invoiceEntry.Caches[typeof(ARTran)], newTran, data.Note);我试过了,但另一个错误是 Nullable 对象必须有一个值。
      • 这意味着你错过了一些值的初始化
      • 我不知道我错过了什么价值观。我想弄清楚
      • 我添加了值,但它返回到错误 AR 错误 #113:无法保存笔记。我不知道为什么虽然已经使用代码来初始化音符值。
      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 2015-08-07
      • 2021-09-19
      • 2018-11-05
      • 1970-01-01
      • 2014-02-28
      • 2011-08-20
      • 1970-01-01
      相关资源
      最近更新 更多