#acumatica
Вопрос:
Я работаю над пользовательским экраном на основе сетки, чтобы пользователи могли повторно выдавать устаревшие быстрые проверки (у клиента много таких устаревших проверок).
Нажатие кнопки «Переоформить» обнаруживает последний устаревший чек в серии, который был аннулирован. Это тот, кого я хочу «клонировать».
У меня есть экземпляр графика APQuickCheckEntry с документом, который я хочу скопировать, загруженным в память:
APQuickCheckEntry graph = PXGraph.CreateInstance<APQuickCheckEntry>();
graph.Document.Current = graph.Document.Search<APQuickCheck.refNbr>(doc.RefNbr, doc.DocType);
Здесь мне нужно скопировать/добавить/вставить или клонировать? Не знаю, что здесь делать. Это должно быть «глубокое копирование», как функция копирования/вставки пользовательского интерфейса. За кулисами мне также нужно установить пару других значений. Затем всплывающее диалоговое окно для пользователя, чтобы изменить/сохранить новую быструю проверку.
Я могу открыть диалоговое окно с быстрой проверкой источника, например:
PXRedirectHelper.TryRedirect(graph.Document.Cache, graph.Document.Current, "Re-Issue Check", PXRedirectHelper.WindowMode.NewWindow);
но не уверен, как это клонировать и открыть новую запись (пользователь также должен иметь возможность отменить, если он не хочет сохранять новую быструю проверку).
Обновить
Я считаю, что приближаюсь к этому, изучая VoidCheckProc на графике APQuickCheckEntry.
APQuickCheckEntry graphCurrent = PXGraph.CreateInstance<APQuickCheckEntry>();
graphCurrent.Document.Current = graphCurrent.Document.Search<APQuickCheck.refNbr>(doc.RefNbr, doc.DocType);
APQuickCheckEntry graph = PXGraph.CreateInstance<APQuickCheckEntry>();
foreach (PXResult<APQuickCheck, CurrencyInfo> res in PXSelectJoin<APQuickCheck,
InnerJoin<CurrencyInfo, On<CurrencyInfo.curyInfoID, Equal<APQuickCheck.curyInfoID>>>,
Where<APQuickCheck.docType, Equal<Required<APQuickCheck.docType>>,
And<APQuickCheck.refNbr, Equal<Required<APQuickCheck.refNbr>>>>>.Select(this, doc.DocType, doc.RefNbr))
{
CurrencyInfo info = PXCache<CurrencyInfo>.CreateCopy(res);
info.CuryInfoID = null;
info.IsReadOnly = false;
info = PXCache<CurrencyInfo>.CreateCopy(graph.currencyinfo.Insert(info));
APQuickCheck payment = new APQuickCheck
{
// DocType = APDocType.QuickCheck,
DocType = null,
RefNbr = null,
CuryInfoID = info.CuryInfoID
};
payment = PXCache<APQuickCheck>.CreateCopy(res);
payment.DocType = null;
payment.Voided = false;
payment.RefNbr = null;
payment.Status = APDocStatus.Hold;
payment.ExtRefNbr = null;
payment.Hold = true;
payment.OpenDoc = true;
payment.Released = false;
payment.LineCntr = 0;
payment.AdjCntr = 0;
payment.BatchNbr = null;
payment.AdjDate = doc.DocDate;
payment.AdjFinPeriodID = doc.AdjFinPeriodID;
payment.AdjTranPeriodID = doc.AdjTranPeriodID;
payment.CuryDocBal = payment.CuryOrigDocAmt payment.CuryOrigDiscAmt;
payment.CuryLineTotal = 0m;
payment.CuryTaxTotal = 0m;
payment.CuryOrigWhTaxAmt = 0m;
payment.CuryChargeAmt = 0;
payment.CuryVatExemptTotal = 0;
payment.CuryVatTaxableTotal = 0;
payment.ClosedDate = null;
payment.ClosedFinPeriodID = null;
payment.ClosedTranPeriodID = null;
payment.Printed = false;
payment.PrintCheck = true;
payment.Cleared = false;
payment.ClearDate = null;
graph.Document.Insert(payment);
if (info != null)
{
CurrencyInfo b_info = PXSelect<CurrencyInfo, Where<CurrencyInfo.curyInfoID, Equal<Current<APQuickCheck.curyInfoID>>>>.Select(graphCurrent, null);
b_info.CuryID = info.CuryID;
b_info.CuryEffDate = info.CuryEffDate;
b_info.CuryRateTypeID = info.CuryRateTypeID;
b_info.CuryRate = info.CuryRate;
b_info.RecipRate = info.RecipRate;
b_info.CuryMultDiv = info.CuryMultDiv;
graph.currencyinfo.Update(b_info);
}
}
foreach (APTran srcTran in PXSelect<APTran, Where<APTran.tranType, Equal<Required<APTran.tranType>>, And<APTran.refNbr, Equal<Required<APTran.refNbr>>>>>.Select(graphCurrent, doc.DocType, doc.RefNbr))
{
//TODO Create new APTran and explicitly fill the required fields
APTran tran = PXCache<APTran>.CreateCopy(srcTran);
tran.TranType = null;
tran.RefNbr = null;
tran.TranID = null;
tran.DrCr = null;
tran.Released = null;
tran.CuryInfoID = null;
tran.NoteID = null;
tran = graph.Transactions.Insert(tran);
}
foreach (APTaxTran tax in PXSelect<APTaxTran, Where<APTaxTran.tranType, Equal<Required<APTaxTran.tranType>>, And<APTaxTran.refNbr, Equal<Required<APTaxTran.refNbr>>>>>.Select(graphCurrent, doc.DocType, doc.RefNbr))
{
APTaxTran new_artax = new APTaxTran();
new_artax.TaxID = tax.TaxID;
new_artax = graph.Taxes.Insert(new_artax);
if (new_artax != null)
{
new_artax = PXCache<APTaxTran>.CreateCopy(new_artax);
new_artax.TaxRate = tax.TaxRate;
new_artax.CuryTaxableAmt = tax.CuryTaxableAmt;
new_artax.CuryTaxAmt = tax.CuryTaxAmt;
new_artax.CuryTaxDiscountAmt = tax.CuryTaxDiscountAmt;
new_artax.CuryTaxableDiscountAmt = tax.CuryTaxableDiscountAmt;
new_artax = graph.Taxes.Update(new_artax);
}
}
PXRedirectHelper.TryRedirect(graph, PXRedirectHelper.WindowMode.NewWindow);
However, getting this error when I try to save the new quick check: CA Error: Attempt to rewrite existing CATran
UPDATE 2
Сейчас он у меня в основном работает. Похоже, моя главная проблема заключалась в том, что я не очищал CATranID и NoteID. Я могу опубликовать свой полный код здесь, если кому-то интересно. Это было много взлома, чтобы понять, но я относительно новичок в Acumatica dev. Я нахожу существующие объекты ERP сложными, что понятно, так как многое происходит.