Прежде всего хотел сказать что форма SalesQuickQuote работает не правильно.
Причина в классе InventDimCtrl_Frm_QuickQuote метод initQuery строчка
X++:
queryBuildDs.addSelectionField(FieldNum(InventSum, inventDimId), SelectionField::MIN);
Поясню к чему это приводит.
Пусть есть номенклатура 1. По ней 3 остатка в inventsum(1, 2, 3).
остаток 1 - 100 шт.
остаток 2 - 50 шт.
остаток 3 - 40 шт.
Так вот когда у нас в отображение аналитики все галки сняты кроме itemId(номенклатуры). У нас они отображаются в виде 190 шт. Если мы поставим в edit-поле количество 190 шт. То они проставятся, но как. Заходим в отображение аналитики. Ставим все галки. Грид распахнулся, физ доступно расщепилось на состовляющие, но мы видим что это количество стоит только в одном строке. В какой? В отсатке 1. Т.к. причина та строка которую я написал. Вообщем такой финт ушами, только не правильный.
В проекте я изменил edit метод
X++:
edit Qty Qty(boolean set,
InventSum _inventSum,
Qty _qty)
{
InventTrans inventTrans;
Qty qty;
MRD_SelectQtyFromInventTrans selectQtyFromInventTrans;
Map map;
MapEnumerator mapEnumerator;
InventDim inventDimLoc;
InventDim inventDimLoc2;
InventDimParm inventDimParm;
;
inventDimParm = inventDimFormSetup.dimParmVisibleGrid(); //чтобы знать какие аналитики отмечены галачками
inventDimLoc2 = InventDim::find(_inventSum.InventDimId); //всэ то же min inventdim навязаный системой, но из него мы возмём то что нам нужно
select sum (Qty) from tmpFrmVirtual
where tmpFrmVirtual.ItemId == _inventSum.itemId
join inventDimLoc
where inventDimLoc.inventDimId == tmpFrmVirtual.inventDimId &&
((inventDimParm.InventBatchIdFlag && inventDimLoc.inventBatchId == inventDimLoc2.inventBatchId)
|| !inventDimParm.InventBatchIdFlag) &&
((inventDimParm.WMSLocationIdFlag && inventDimLoc.wMSLocationId == inventDimLoc2.wMSLocationId)
|| !inventDimParm.WMSLocationIdFlag) &&
((inventDimParm.WMSPalletIdFlag && inventDimLoc.wMSPalletId == inventDimLoc2.wMSPalletId)
|| !inventDimParm.WMSPalletIdFlag) &&
((inventDimParm.InventSerialIdFlag && inventDimLoc.inventSerialId == inventDimLoc2.inventSerialId)
|| !inventDimParm.InventSerialIdFlag) &&
((inventDimParm.InventLocationIdFlag && inventDimLoc.inventLocationId ==inventDimLoc2.InventLocationId)
|| !inventDimParm.InventLocationIdFlag) &&
((inventDimParm.ConfigIdFlag && inventDimLoc.configId == inventDimLoc2.configId)
|| !inventDimParm.ConfigIdFlag) &&
((inventDimParm.InventSizeIdFlag && inventDimLoc.InventSizeId == inventDimLoc2.InventSizeId)
|| !inventDimParm.InventSizeIdFlag) &&
((inventDimParm.InventColorIdFlag && inventDimLoc.InventColorId == inventDimLoc2.InventColorId)
|| !inventDimParm.InventColorIdFlag) &&
((inventDimParm.InventGTDIdFlag_RU && inventDimLoc.InventGtdId_RU == inventDimLoc2.InventGtdId_RU)
|| !inventDimParm.InventGTDIdFlag_RU) &&
((inventDimParm.MRD_DefectFlag && inventDimLoc.MRD_DefectId == inventDimLoc2.MRD_DefectId)
|| !inventDimParm.MRD_DefectFlag) &&
((inventDimParm.MRD_UnitFlag && inventDimLoc.MRD_UnitID == inventDimLoc2.MRD_UnitID)
|| !inventDimParm.MRD_UnitFlag) &&
((inventDimParm.MRD_BusinessDirectionFlag && inventDimLoc.MRD_BusinessDirectionId == inventDimLoc2.MRD_BusinessDirectionId)
|| !inventDimParm.MRD_BusinessDirectionFlag);
// В tmp в отличие от стандарта я пишу не минимальный, а реальный inventdimId по этому мне нужно узнавать сумму количеств в зависимости от тех галочек которые выбраны
if (tmpFrmVirtual)
{
qty = tmpFrmVirtual.qty;
}
else
{
tmpFrmVirtual.tableNum = _inventSum.tableId;
tmpFrmVirtual.itemId = _inventSum.itemId;
tmpFrmVirtual.inventDimId = _inventSum.inventDimId;
tmpFrmVirtual.insert();
}
if (set) //еслт пользователь вставил новое значение начинается подбор
{
delete_from tmpFrmVirtual
where tmpFrmVirtual.ItemId == _inventSum.itemId;// прежние результаты подбора по номенклатуре удаляем
if (_qty > 0)
{//сам подбор происходит в класса MRD_SelectQtyFromInventTrans.(я подбираю аналитики и количества из проводок, хоть это и не правильно сточки зрения архитиктуры, но на этом настоял аналитик, вы можете изменить и подбирать из InventSum)
selectQtyFromInventTrans = new MRD_SelectQtyFromInventTrans(_inventSum.itemId, _qty, _inventSum.InventDimId, inventDimParm);
selectQtyFromInventTrans.run();
map = selectQtyFromInventTrans.getRezult();//возращается map InventDimId и количество, больше вам и не надо номенклатура у вас уже есть
error("Не удалось подобрать " + num2str(selectQtyFromInventTrans.getRemain(),2,2,2,2) + " единиц номенклатуры: " + _inventSum.itemId);
mapEnumerator = map.getEnumerator();
while (mapEnumerator.moveNext())
{
tmpFrmVirtual.tableNum = _inventSum.tableId;
tmpFrmVirtual.itemId = _inventSum.itemId;
tmpFrmVirtual.inventDimId = mapEnumerator.current();
tmpFrmVirtual.qty = mapEnumerator.currentValue();
tmpFrmVirtual.insert();//заполнили подобранными аналитиками tmp
}
}
else
qty = 0;
InventSumAuto_ds.research();
}
return qty;
}
А теперь собственно, где отбираются отобранные.
X++:
public boolean modified()
{
boolean ret;
str strDimId;
QueryBuildDataSource qbdsInventSumHand;
QueryBuildRange qbrInventDimIdHand;
;
qbdsInventSumHand = InventSumHand_ds.query().dataSourceTable(tablenum(InventSum));
qbrInventDimIdHand = qbdsInventSumHand.findRange(fieldnum(InventSum, InventDimId));
if (!qbrInventDimIdHand)
qbrInventDimIdHand = qbdsInventSumHand.addRange(fieldnum(InventSum, InventDimId));
ret = super();
if (this.value() == NoYes::Yes)//если поставили галочку отобразить
{
while select tmpFrmVirtual
where tmpFrmVirtual.Qty > 0
{
strDimId = strDimId ? strDimId + ', ' + tmpFrmVirtual.InventDimId : tmpFrmVirtual.InventDimId;
}//отбираем inventdimId у которых количество проставлено, кстати узкий момент ели inventdim-ом будет много, могут в range все не уместится(надо будет подумать как исправить)
if (strDimId)//строим по ним range
{
qbrInventDimIdHand.value(strDimId);
}
else
{
qbrInventDimIdHand.value("0");
}
}
else
{
qbrInventDimIdHand.value(SysQuery::valueUnlimited());
}
InventSumHand_ds.executeQuery();
return ret;
}
Есть ещё штука. Если количество не ноль строка подсвечивается. Мож тоже пригодится
X++:
public void displayOption(Common _record, FormRowDisplayOption _options)
{
InventSum inventSumLoc;
InventDim inventDimLoc;
InventDimParm inventDimParm;
InventDim inventDimLoc2;
;
inventSumLoc = _record;
inventDimParm = inventDimFormSetup.dimParmVisibleGrid();
inventDimLoc2 = InventDim::find(inventSumLoc.InventDimId);
select sum (Qty) from tmpFrmVirtual
where tmpFrmVirtual.ItemId == inventSumLoc.itemId
join inventDimLoc
where inventDimLoc.inventDimId == tmpFrmVirtual.inventDimId &&
((inventDimParm.InventBatchIdFlag && inventDimLoc.inventBatchId == inventDimLoc2.inventBatchId)
|| !inventDimParm.InventBatchIdFlag) &&
((inventDimParm.WMSLocationIdFlag && inventDimLoc.wMSLocationId == inventDimLoc2.wMSLocationId)
|| !inventDimParm.WMSLocationIdFlag) &&
((inventDimParm.WMSPalletIdFlag && inventDimLoc.wMSPalletId == inventDimLoc2.wMSPalletId)
|| !inventDimParm.WMSPalletIdFlag) &&
((inventDimParm.InventSerialIdFlag && inventDimLoc.inventSerialId == inventDimLoc2.inventSerialId)
|| !inventDimParm.InventSerialIdFlag) &&
((inventDimParm.InventLocationIdFlag && inventDimLoc.inventLocationId ==inventDimLoc2.InventLocationId)
|| !inventDimParm.InventLocationIdFlag) &&
((inventDimParm.ConfigIdFlag && inventDimLoc.configId == inventDimLoc2.configId)
|| !inventDimParm.ConfigIdFlag) &&
((inventDimParm.InventSizeIdFlag && inventDimLoc.InventSizeId == inventDimLoc2.InventSizeId)
|| !inventDimParm.InventSizeIdFlag) &&
((inventDimParm.InventColorIdFlag && inventDimLoc.InventColorId == inventDimLoc2.InventColorId)
|| !inventDimParm.InventColorIdFlag) &&
((inventDimParm.InventGTDIdFlag_RU && inventDimLoc.InventGtdId_RU == inventDimLoc2.InventGtdId_RU)
|| !inventDimParm.InventGTDIdFlag_RU) &&
((inventDimParm.MRD_DefectFlag && inventDimLoc.MRD_DefectId == inventDimLoc2.MRD_DefectId)
|| !inventDimParm.MRD_DefectFlag) &&
((inventDimParm.MRD_UnitFlag && inventDimLoc.MRD_UnitID == inventDimLoc2.MRD_UnitID)
|| !inventDimParm.MRD_UnitFlag) &&
((inventDimParm.MRD_BusinessDirectionFlag && inventDimLoc.MRD_BusinessDirectionId == inventDimLoc2.MRD_BusinessDirectionId)
|| !inventDimParm.MRD_BusinessDirectionFlag);
if (tmpFrmVirtual && tmpFrmVirtual.Qty > 0)
_options.backColor(WinApi::RGB2int(0, 255, 0));
else
_options.backColor(winapi::RGB2int(255, 255, 255 ));
super(_record, _options);
}
Щас у меня подбирается всё правильно при любых вариантах, когда галочка отображать стоит только на номенклатуре и когда она стоит на других. И при схлопование и разхлоповании отображается коректно.