Как обращаться к такой таблице в коде? Первый вариант уже сказали - табличный мап и инициализация через MakeRecord. Второй вариант - дублировать таблицу чтобы FieildId были такие как в таблице с решетом и то-же инициализация через MakeRecord. В этом случае заработают insert-update-delete_recordset. Этакий хакерский мап в виде таблицы.
Работа с мапом обычным (mInventSumDeltaKeyMap - мап)
X++:
mInventSumDeltaKeyMap inventSumDeltaKey = mInventSumDeltaKeyMap::tmpTableInit();
InventSum inventSum;
InventSum inventSumNew;
RecordInsertList insertList;
;
while select ItemId, InventDimId from inventSumDeltaKey
group by ItemId, InventDimId
notexists join inventSum
where inventSum.ItemId == inventSumDeltaKey.ItemId &&
inventSum.InventDimId == inventSumDeltaKey.InventDimId
{
if (!inventSumDeltaKey.ItemId || !inventSumDeltaKey.InventDimId)
{
throw error(strfmt("@SYS68912",funcname()));
}
if (! insertList)
{
insertList = new RecordInsertList(tablenum(InventSum), true, true, true);
}
inventSumNew.ItemId = inventSumDeltaKey.ItemId;
inventSumNew.InventDimId = inventSumDeltaKey.InventDimId;
inventSumNew.ClosedQty = NoYes::Yes;
inventSumNew.Closed = NoYes::Yes;
insertList.add(inventSumNew);
}
if (insertList)
{
insertList.insertDatabase();
}
или так (mLedgerBalancesTransDeltaMap - мап)
X++:
mLedgerBalancesTransDeltaMap ledgerBalancesTransDelta = trecord::init(this.getBalanceDeltaTableId());
;
unchecked(Uncheck::TableSecurityPermission)
{
insert_recordset
ledgerBalancesTrans (AccountNum, PeriodCode, TransDate, SystemGeneratedUltimo, DebitMST,
CreditMST, DebitOPRMST, CreditOPRMST, DebitTaxMST, CreditTaxMST, DebitMSTSecond,
CreditMSTSecond, DebitOPRMSTSecond, CreditOPRMSTSecond, DebitTaxMSTSecond, CreditTaxMSTSecond, Qty)
select forceLiterals
LedgerAccountNum, PeriodCode, TransDate, SystemGeneratedUltimo, sum(DebitMST), sum(CreditMST), sum(DebitOPRMST), sum(CreditOPRMST), sum(DebitTaxMST),
sum(CreditTaxMST), sum(DebitMSTSecond), sum(CreditMSTSecond), sum(DebitOPRMSTSecond), sum(CreditOPRMSTSecond), sum(DebitTaxMSTSecond), sum(CreditTaxMSTSecond), sum(Quantity)
from
ledgerBalancesTransDelta group by LedgerAccountNum, PeriodCode, TransDate, SystemGeneratedUltimo;
}
Работа с таблицей для подмены имени (mInventSumDateTransTmp - таблица)
X++:
mInventSumDateTransTmp transTmp = trecord::init(_tableId, false, true);
mInventSumDateDim dim;
mInventSumDateTrans trans;
#mInventSumDateDimDevelop
insert_recordset transTmp (TransDate, ItemId, FinancialDimId)
select maxof(TransDate), ItemId, FinancialDimId from trans
group by ItemId, FinancialDimId
where trans.TransDate <= transDate
&& (!inventSumDateDimParmCriteria.ItemIdFlag || (trans.ItemId == inventSumDateDimCriteria.ItemId))
join dim
where dim.FinancialDimId == trans.FinancialDimId
&& (!inventSumDateDimParmCriteria.InventSiteIdFlag || (dim.InventSiteId == inventSumDateDimCriteria.InventSiteId ))
&& (!inventSumDateDimParmCriteria.InventLocationIdFlag || (dim.InventLocationId == inventSumDateDimCriteria.InventLocationId ))
&& (!inventSumDateDimParmCriteria.InventProfileIdFlag || (dim.InventProfileId == inventSumDateDimCriteria.InventProfileId ))
&& (!inventSumDateDimParmCriteria.InventProfileItemTypeFlag || (dim.InventProfileItemType == inventSumDateDimCriteria.InventProfileItemType))
&& (!inventSumDateDimParmCriteria.AccountFlag || (dim.Account == inventSumDateDimCriteria.Account ))
&& (!inventSumDateDimParmCriteria.Account2Flag || (dim.Account2 == inventSumDateDimCriteria.Account2 ))
&& (!inventSumDateDimParmCriteria.AccountOffsetFlag || (dim.AccountOffset == inventSumDateDimCriteria.AccountOffset ))
&& (!inventSumDateDimParmCriteria.AccountOffset2Flag || (dim.AccountOffset2 == inventSumDateDimCriteria.AccountOffset2 ))
&& (!inventSumDateDimParmCriteria.StornoFlag || (dim.Storno == inventSumDateDimCriteria.Storno ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[1] || (dim.Dimension[1] == inventSumDateDimCriteria.Dimension[1] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[2] || (dim.Dimension[2] == inventSumDateDimCriteria.Dimension[2] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[3] || (dim.Dimension[3] == inventSumDateDimCriteria.Dimension[3] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[4] || (dim.Dimension[4] == inventSumDateDimCriteria.Dimension[4] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[5] || (dim.Dimension[5] == inventSumDateDimCriteria.Dimension[5] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[6] || (dim.Dimension[6] == inventSumDateDimCriteria.Dimension[6] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[7] || (dim.Dimension[7] == inventSumDateDimCriteria.Dimension[7] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[8] || (dim.Dimension[8] == inventSumDateDimCriteria.Dimension[8] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[9] || (dim.Dimension[9] == inventSumDateDimCriteria.Dimension[9] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[10] || (dim.Dimension[10] == inventSumDateDimCriteria.Dimension[10] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[11] || (dim.Dimension[11] == inventSumDateDimCriteria.Dimension[11] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[12] || (dim.Dimension[12] == inventSumDateDimCriteria.Dimension[12] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[13] || (dim.Dimension[13] == inventSumDateDimCriteria.Dimension[13] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[14] || (dim.Dimension[14] == inventSumDateDimCriteria.Dimension[14] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[15] || (dim.Dimension[15] == inventSumDateDimCriteria.Dimension[15] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[16] || (dim.Dimension[16] == inventSumDateDimCriteria.Dimension[16] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[17] || (dim.Dimension[17] == inventSumDateDimCriteria.Dimension[17] ))
&& (!inventSumDateDimParmCriteria.DimensionFlag[18] || (dim.Dimension[18] == inventSumDateDimCriteria.Dimension[18] ));
}
Не в коня корм от задачи зависит как обычно. В моем случае темповыми стали InventSumDelta и LedgerBalancesTransDelta. Результат - ПОЛНОЕ отсутствие блокировок при обновлении запасов в наличии и балансов по ГК. Полное означает не облегчение, а устранение проблемы на корню и возможность многопоточной разноски документов в тысячи реально параллельных не ждущих друг друга потоков. И такие странные методы стоили достигнутого результата