Acumatica 如何在保存发票之前分配发票参考编号
我已将发票设置为手动编号 我想在保存发票(AR301000)之前分配发票编号(RefNbr)-如果为空。我已覆盖RowPersisting事件,如下所示:Acumatica 如何在保存发票之前分配发票参考编号,acumatica,Acumatica,我已将发票设置为手动编号 我想在保存发票(AR301000)之前分配发票编号(RefNbr)-如果为空。我已覆盖RowPersisting事件,如下所示: public class ARInvoiceEntry_Extension:PXGraphExtension<ARInvoiceEntry> { protected void ARInvoice_RowPersisting(PXCache cache, PXRowPersistingEventArgs e, PXRow
public class ARInvoiceEntry_Extension:PXGraphExtension<ARInvoiceEntry>
{
protected void ARInvoice_RowPersisting(PXCache cache, PXRowPersistingEventArgs e, PXRowPersisting InvokeBaseHandler)
{
var row = (ARInvoice)e.Row;
if (row != null)
{
//BB-<timestamp> as inv# for testing only
if (string.IsNullOrEmpty(row.RefNbr))
row.RefNbr = "BB-" + DateTime.Now.ToString("hhmmsstt");
}
if(InvokeBaseHandler != null)
InvokeBaseHandler(cache, e);
}
}
public类ARInvoiceEntry_扩展名:pxGrapherExtension
问题是,如果我提出了一个新的发票行。它抱怨RefNbr是空白的
我错过了什么?我该如何解决这个问题?谢谢。Acumatica的PXDBDefaultAttribute仅在父记录的源字段和从属记录的外键字段均不为空时更新从属记录的字段
将依赖记录插入缓存时,PXDBDefaultAttribute将源字段值从父记录复制到它从依赖记录修饰的字段。当框架将新的父记录保存到数据库中时,它首先为父记录引发RowPersisting事件PXDBDefaultAttribute订阅父记录类型的行持久化事件以保存原始源字段值:
- 将父记录保存到数据库后查找父记录的步骤
- 或者在事务中止的情况下,将其用作依赖字段的还原点
另外,PXDBDefaultAttribute订阅从属记录类型的RowPersisting事件,以使用数据库中刚刚记录的实际源字段值更新外键字段。要更新外键字段PXDBDefaultAttribute,必须首先使用先前在父记录类型的行持久化事件处理程序中获得的原始源字段值定位父记录。如果外键字段值为空,则PXDBDefaultAttribute没有机会找到它的父记录,它只是将依赖字段保留为空。这就是最终导致错误“RefNbr不能为空”的原因
综上所述,我相信如果在将AR发票参考号保存到数据库之前将其保留为空,将不可能达到预期的结果。作为替代方案,我建议将AR发票参考号默认为某个常量,如 ,同时将其替换为ARInvoice\u行持久化处理程序中的实际编号:
using PX.Data;
using System;
namespace PX.Objects.AR
{
public class ARInvoiceNumberingCstAttribute : ARInvoiceType.NumberingAttribute
{
public const string EnterRefNbr = "<ENTER>";
protected override string GetNewNumber()
{
string newNumber = base.GetNewNumber();
if (string.IsNullOrEmpty(newNumber))
{
newNumber = EnterRefNbr;
}
return newNumber;
}
public override void RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
{
if (GetNewNumber() == EnterRefNbr) return;
base.RowPersisting(sender, e);
}
}
public class ARInvoiceEntry_Extension : PXGraphExtension<ARInvoiceEntry>
{
[PXRemoveBaseAttribute(typeof(ARInvoiceType.NumberingAttribute))]
[PXMergeAttributes(Method = MergeMethod.Append)]
[ARInvoiceNumberingCst]
protected void ARInvoice_RefNbr_CacheAttached(PXCache sender)
{ }
protected void ARInvoice_RowPersisting(PXCache cache, PXRowPersistingEventArgs e,
PXRowPersisting InvokeBaseHandler)
{
if (InvokeBaseHandler != null)
InvokeBaseHandler(cache, e);
var row = (ARInvoice)e.Row;
if (row != null)
{
//BB-<timestamp> as inv# for testing only
if (row.RefNbr == ARInvoiceNumberingCstAttribute.EnterRefNbr)
row.RefNbr = "BB-" + DateTime.Now.ToString("hhmmsstt");
}
}
}
}
使用PX.Data;
使用制度;
命名空间PX.Objects.AR
{
公共类ARInvoiceNumberingCstAttribute:ARInvoiceType.NumberingAttribute
{
public const字符串enterefnbr=“”;
受保护的重写字符串GetNewNumber()
{
字符串newNumber=base.GetNewNumber();
if(string.IsNullOrEmpty(newNumber))
{
新编号=输入参考编号;
}
返回newNumber;
}
公共覆盖无效行持久化(PXCache发送方,PXRowPersistingEventArgs e)
{
如果(GetNewNumber()==EnterRefNbr)返回;
基。行持久化(发送方,e);
}
}
公共类的VoiceEntry_扩展名:pxGrapherExtension
{
[PXRemoveBaseAttribute(typeof(ARInvoiceType.NumberingAttribute))]
[PXMergeAttributes(Method=MergeMethod.Append)]
[ARInvoiceNumberingCst]
受保护的Voice\u RefNbr\u缓存已连接(PXCache发送方)
{ }
受保护的Voice_Row持久化(PXCache缓存、PXRowPersistingEventArgs e、,
PXRowPersisting(持久化调用eBaseHandler)
{
if(InvokeBaseHandler!=null)
InvokeBaseHandler(缓存,e);
var row=(ARInvoice)e.row;
如果(行!=null)
{
//BB-作为库存#仅用于测试
if(row.RefNbr==ARInvoiceNumberingCstAttribute.EnterRefNbr)
row.RefNbr=“BB-”+DateTime.Now.ToString(“hhmmstt”);
}
}
}
}
Acumatica的PXDBDefaultAttribute仅在父记录的源字段和从属记录的外键字段均不为空时更新从属记录的字段
将依赖记录插入缓存时,PXDBDefaultAttribute将源字段值从父记录复制到它从依赖记录修饰的字段。当框架将新的父记录保存到数据库中时,它首先为父记录引发RowPersisting事件PXDBDefaultAttribute订阅父记录类型的行持久化事件以保存原始源字段值:
- 将父记录保存到数据库后查找父记录的步骤
- 或者在事务中止的情况下,将其用作依赖字段的还原点
另外,PXDBDefaultAttribute订阅从属记录类型的RowPersisting事件,以使用数据库中刚刚记录的实际源字段值更新外键字段。要更新外键字段PXDBDefaultAttribute,必须首先使用先前在父记录类型的行持久化事件处理程序中获得的原始源字段值定位父记录。如果外键字段值为空,则PXDBDefaultAttribute没有机会找到它的父记录,它只是将依赖字段保留为空。这就是最终导致错误“RefNbr不能为空”的原因
综上所述,我相信如果在将AR发票参考号保存到数据库之前将其保留为空,将不可能达到预期的结果。作为改变