У меня есть пользовательская страница с пользовательским графиком с именем POReceiptTieOut
Источник данных:
public PXSelect<POReceipt> Document;
Форма данных Memeber: документ
Данные сетки Участник: Транзакции:
public PXSelectJoin<
APTran,
LeftJoin<POReceiptLine,
On<POReceiptLine.receiptNbr, Equal<APTran.receiptNbr>,
And<POReceiptLine.lineNbr, Equal<APTran.receiptLineNbr>>>>,
Where<APTran.receiptNbr, Equal<Current<POReceipt.receiptNbr>>>> Transactions;
Я хочу иметь возможность обновлять записи транзакций в этой сетке. Когда я нажимаю стандартную кнопку Сохранить, я получаю эту ошибку Ошибка: «TranDate» не может быть пустым. APTran.TranDate для всех записей в моем DAC транзакций присутствует, но по какой-то причине действие сохранения не признавая это.
Вот код для графа POReceiptTieOut
namespace APPOReceiptTieOut
{
public class POReceiptTieOut : PXGraph<POReceiptTieOut, POReceipt>
{
IPOReceiptRepository _receiptRepository {get;set;}
public POReceiptTieOut()
{
_receiptRepository = new POReceiptRepository();
}
public PXSelect<POReceipt> Document;
[PXViewName(PX.Objects.AP.Messages.APTran)]
public PXSelectJoin<
APTran,
LeftJoin<POReceiptLine,
On<POReceiptLine.receiptNbr, Equal<APTran.receiptNbr>,
And<POReceiptLine.lineNbr, Equal<APTran.receiptLineNbr>>>>,
Where<APTran.receiptNbr, Equal<Current<POReceipt.receiptNbr>>>> Transactions;
protected void POReceipt_RowSelected(PXCache cache, PXRowSelectedEventArgs e)
{
var row = (POReceipt)e.Row;
var rowExt = row.GetExtension<POReceiptExt>();
this.SetCalculatedValues(cache, row);
}
protected void APTran_CuryLineAmt_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e)
{
var row = (APTran)e.Row;
POReceipt receipt = Document.Current;
this.SetCalculatedValues(Document.Cache, receipt);
}
private void SetCalculatedValues(PXCache cache, object record)
{
decimal invoiceLineTotal, receiptLineTotal;
this.CalculateLineTotals(out invoiceLineTotal, out receiptLineTotal);
cache.SetValueExt<POReceiptExt.usrTranTotal>(record, invoiceLineTotal);
cache.SetValueExt<POReceiptExt.usrReceiptLineTotal>(record, receiptLineTotal);
cache.SetValueExt<POReceiptExt.usrBalance>(record, receiptLineTotal - invoiceLineTotal);
if( Math.Abs(receiptLineTotal - invoiceLineTotal ) < 10 )
{
cache.SetValueExt<POReceipt.status>(record, "B");
}
else
{
cache.SetValueExt<POReceipt.status>(record, "H");
cache.SetValueExt<POReceipt.hold>(record, true);
}
}
private void CalculateLineTotals(out decimal tranTotal, out decimal lineTotal)
{
tranTotal = 0;
lineTotal = 0;
foreach(PXResult<APTran, POReceiptLine> record in Transactions.Select())
{
APTran tran = (APTran)record;
POReceiptLine rLine = (POReceiptLine)record;
lineTotal += rLine.TranCostFinal ?? 0;
tranTotal += tran.CuryTranAmt ?? 0;
}
}
public bool ValidateReceiptBalance(string receiptNbr)
{
POReceipt receipt = _receiptRepository.GetByReceiptNbr(receiptNbr);
if(receipt == null)
throw new PXException("Receipt " + receiptNbr + " was not found");
this.Document.Current = receipt;
decimal tranTotal = 0;
decimal lineTotal = 0;
this.CalculateLineTotals(out tranTotal, out lineTotal);
return true;
}
}
}
Вот этот след ...
5/22/2019 16:38:19 Ошибка:
Ошибка: «TranDate» не может быть пустым. в PX.Data.PXDBDefaultAttribute.RowPersisting (отправитель PXCache, PXRowPersistingEventArgs e)
в PX.Data.PXCache.OnRowPersisting (элемент объекта, операция PXDBOperation)
в PX.Data.PXCache 1.PersistUpdated(Object row, Boolean bypassInterceptor)
at PX.Data.PXCache
1.Persist (операция PXDBOperation)
в PX.Data.PXGraph.Persist (Тип cacheType, операция PXDBOperation)
в PX.Data.PXGraph.Persist ()
в PX.Data.PXSave 1.d__2.MoveNext()
at PX.Data.PXAction
1.d__32.MoveNext ()
в PX.Data.PXAction`1.d__32.MoveNext ()
в PX.Web.UI.PXBaseDataSource.tryExecutePendingCommand (String viewName, String [] sortcolumns, логические [] нисходящие, поиски Object [], параметры Object [], аргументы PXFilterRow [], аргументы DataSourceSelectArguments, логические и адаптеры closeWindowReowStartTowToRTRALTOWTTROTTALTORTTALTRENTEALTORTINGTREINT, Int32 )
в PX.Web.UI.PXBaseDataSource.ExecuteSelect (аргументы String viewName, DataSourceSelectArguments, PXDSSelectArguments pxarguments)