|
27.05.2005, 15:10 | #1 |
1C
|
Форма SalesQuickQuote
Добрый день!
форма subj - вызывается для создания строк заказа (ее можно в принципе и так открыть - на наблюдаемый эффект это не влияет). На первую закладку (существующая номенклатура) я добавил поле "название номенклатуры" И что же - в нем ничего не отображается! Кстати, если через настройку добавить - то же самое. Почему так может быть? |
|
27.11.2007, 00:20 | #2 |
Участник
|
Добрый вечер всем!
пару вопросов по этой форме: 1) Хочется добавить в грид на первой закладке чек-бокс, по нажатию на который автоматически бы заполнялось поле Кол-во(срабытывал бы edit-метод) по значению из поля физ.доступно проблема в том что данные на форме в сгруппированном виде, поэтому если это возможно, то думаю только если чек-бокс будет также edit-методом на inventsum_ds Но что-то у меня не получается все равно... Может задачка и впрямь неразрешима без переписывания всей формы??? 2) сверху грида также на 1ой закладке добавить чек-бокс, по нажатию на который производилась бы фильтрация строк в гриде: выбрали - показывать только с кол-вом > 0 отключили - снимать фильтр Кто сталкивался с этой формой подскажите? или все-таки игра не стоит свеч и без глобального перепиливания формы не обойтись? |
|
27.11.2007, 08:43 | #3 |
Участник
|
2sparur. По первому вопросу.
на datasource InventSum создайте вот такой edit-метод: Код: edit NoYes setQtyAvail_UTX(boolean _set, InventSum _inventSum, NoYes _value) { select tmpFrmVirtual where tmpFrmVirtual.tableNum == _inventSum.tableId && tmpFrmVirtual.itemId == _inventSum.itemId && tmpFrmVirtual.inventDimId == _inventSum.inventDimId; if (_set) { if (_value) { InventSum_ds.salesQty(true, _inventSum, _inventSum.AvailPhysical); } else { InventSum_ds.salesQty(true, _inventSum, 0); } InventTable_ds.refresh(); tmpFrmVirtual.NoYes= _value; tmpFrmVirtual.update(); } return tmpFrmVirtual.NoYes; } Должно работать.
__________________
Денис Балуев. Последний раз редактировалось denny; 27.11.2007 в 08:47. Причина: Слегка исправил код |
|
27.11.2007, 17:33 | #4 |
Участник
|
Цитата:
Сообщение от denny
2sparur. По первому вопросу.
на datasource InventSum создайте вот такой edit-метод: Код: edit NoYes setQtyAvail_UTX(boolean _set, InventSum _inventSum, NoYes _value) { select tmpFrmVirtual where tmpFrmVirtual.tableNum == _inventSum.tableId && tmpFrmVirtual.itemId == _inventSum.itemId && tmpFrmVirtual.inventDimId == _inventSum.inventDimId; if (_set) { if (_value) { InventSum_ds.salesQty(true, _inventSum, _inventSum.AvailPhysical); } else { InventSum_ds.salesQty(true, _inventSum, 0); } InventTable_ds.refresh(); tmpFrmVirtual.NoYes= _value; tmpFrmVirtual.update(); } return tmpFrmVirtual.NoYes; } Должно работать. |
|
29.11.2007, 09:17 | #5 |
Участник
|
Странно, по идее edit-метод salesQty, существующий на том же InventSum, уже должен был создать запись. Версию Аксапты напишите, пожалуйста.
В любом случае, вот так должно работать: X++: edit NoYes setQtyAvail_UTX(boolean _set, InventSum _inventSum, NoYes _value) { select tmpFrmVirtual where tmpFrmVirtual.tableNum == _inventSum.tableId && tmpFrmVirtual.itemId == _inventSum.itemId && tmpFrmVirtual.inventDimId == _inventSum.inventDimId; if (!tmpFrmVirtual) { tmpFrmVirtual.tableNum = _inventSum.tableId; tmpFrmVirtual.itemId = _inventSum.itemId; tmpFrmVirtual.inventDimId = _inventSum.inventDimId; tmpFrmVirtual.write(); } if (_set) { if (_value) { InventSum_ds.salesQty(true, _inventSum, _inventSum.AvailPhysical); } else { InventSum_ds.salesQty(true, _inventSum, 0); } InventTable_ds.refresh(); tmpFrmVirtual.NoYes= _value; tmpFrmVirtual.update(); } return tmpFrmVirtual.NoYes; }
__________________
Денис Балуев. |
|
27.11.2007, 09:29 | #6 |
Участник
|
Цитата:
Сообщение от sparur
Добрый вечер всем!
пару вопросов по этой форме: 1) Хочется добавить в грид на первой закладке чек-бокс, по нажатию на который автоматически бы заполнялось поле Кол-во(срабытывал бы edit-метод) по значению из поля физ.доступно проблема в том что данные на форме в сгруппированном виде, поэтому если это возможно, то думаю только если чек-бокс будет также edit-методом на inventsum_ds Но что-то у меня не получается все равно... Может задачка и впрямь неразрешима без переписывания всей формы??? 2) сверху грида также на 1ой закладке добавить чек-бокс, по нажатию на который производилась бы фильтрация строк в гриде: выбрали - показывать только с кол-вом > 0 отключили - снимать фильтр Кто сталкивался с этой формой подскажите? или все-таки игра не стоит свеч и без глобального перепиливания формы не обойтись? Там есть нужный вам пункт 2. Насчет 1 заполните просто tmp таблицу. У вас есть inventsum пробегите по нему любым доступным средством либо QueryRun. Либо select к базе у вас будут invendimId, ItemId и колво, заполните ими tmp таблицу и будет счастье. |
|
27.11.2007, 08:31 | #7 |
Аманд
|
Цитата:
автоматически бы заполнялось поле Кол-во(срабытывал бы edit-метод) по значению из поля физ.доступно
Цитата:
выбрали - показывать только с кол-вом > 0
|
|
27.11.2007, 17:44 | #8 |
Участник
|
|
|
27.11.2007, 20:20 | #9 |
Участник
|
Прежде всего хотел сказать что форма 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); } Последний раз редактировалось miklenew; 27.11.2007 в 20:43. |
|
27.11.2007, 20:41 | #10 |
Участник
|
Цитата:
Сообщение от miklenew
Пусть есть номенклатура 1. По ней 3 остатка в inventsum(1, 2, 3).
остаток 1 - 100 шт. остаток 2 - 50 шт. остаток 3 - 40 шт. Так вот когда у нас в отображение аналитики все галки сняты кроме itemId(номенклатуры). У нас они отображаются в виде 190 шт. Если мы поставим в edit-поле количество 190 шт. То они проставятся, но как. Заходим в отображение аналитики. Ставим все галки. Грид распахнулся, физ доступно расщепилось на состовляющие, но мы видим что это количество стоит только в одном строке. В какой в отсатке 1. Т.к. причина та строка которую я написал. |
|
27.11.2007, 20:50 | #11 |
Участник
|
Молодцы. Значит исправили. А мне вот руками пришлось исправлять.
Четвёрки у меня нет посмотреть не могу. Но вот в тройке есть. Ну раз исправили хорошо. Только вот посоветовать теперь мне сложно что-то вам. Я не знаю, как они это исправили. Рискну предположить, что в tmp у них теперь всё нормально тогда смело берить код modif-айд галки и у вас поидее должно всё работать. Хотя вот думаю как исправить возможный косяк c переполнением range. Прийдётся наврное не все значения в один range через запятую. А сколько inventDimId столько и range формировать. |
|
27.11.2007, 20:46 | #12 |
Участник
|
блин или я чего то не догоняю или неправильно вопрос поставил...
нужно показывать/скрывать строки у которых Inventsum.AvailPhysical = 0, а не те строки в которых мы проставили или нет поле кол-во |
|
27.11.2007, 20:54 | #13 |
Участник
|
Цитата:
Тогда в запрос включите это условие. Это легче. Я как раз думал вам по выбранному надо. |
|
27.11.2007, 22:01 | #14 |
Участник
|
пробовал не получается
|
|
27.11.2007, 22:04 | #15 |
Участник
|
вот что у меня получается:
X++: public void init() { Query q; QueryBuildDataSource qbdsInventDim, qbdsInventSum; SalesTable callerRecord; ; super(); qbdsInventSum = this.query().dataSourceTable(tablenum(InventSum)); qbrAvailPhysical = qbdsInventSum.addRange(fieldNum(InventSum, AvailPhysical)); } X++: public void executeQuery() { QueryBuildDataSource qbdsInventSum; Query q; ; if (ctrlShowAvailPhysical.value() == NoYes::Yes) qbrAvailPhysical.value(">0"); else qbrAvailPhysical.value(""); super(); } ну и на методе clicked контрола(чекбокса) вызываю inventsum_ds.executequery() |
|
27.11.2007, 22:05 | #16 |
Участник
|
в чем трабл?
|
|
27.11.2007, 22:35 | #17 |
Участник
|
|
|
28.11.2007, 00:25 | #18 |
Участник
|
неа, не помогает фильтр никак не цепляется
вернее цепляется в одном случае: если в init() формы прописать инициализацию чек-бокса = Yes тогда фильтр добавляется, но потом не сбрасывается... |
|
28.11.2007, 09:15 | #19 |
Участник
|
|
|
28.11.2007, 10:42 | #20 |
Участник
|
вот она неладная...
только она с 4.0, но думаю не беда... |
|
|
Похожие темы | ||||
Тема | Ответов | |||
лукап-форма с доп. фильтром | 10 | |||
Как передать параметры из одной web форма в другую | 9 | |||
новая форма расчета авансовых платежей | 4 | |||
LookUp форма и параметры | 7 | |||
Произвольная Lookup форма | 0 |
|