06.11.2006, 12:39 | #1 |
Участник
|
Вытащить записи из InventSum ...
Здраствыйте ,
Никак немогу marked записи в InventSum вытащить . Я добавил в форме InventOnHandItem бутончик и хочу замеченные записи скопировать . Вот примерчик , чего я хочу сделать : Код: void clicked() { TextBuffer tb; InventSum Tabl1; super(); if ( InventSum_ds.anyMarked() ) { if ( box::yesNo( "Копировать записи в памаять ?", DialogButton::Ok, "Вопрос" ) ) { tb = new TextBuffer(); tb.appendText( "InventSumRec\n"); Tabl1 = InventSum_ds.getFirst(1); for ( Table = InventSum_ds.getFirst(1); Table ; Table = InventSum_ds.getNext() ) { tb.appendText(int2str(Table.RecId) + "\n"); } tb.toClipboard(); for ( Table = InventSum_ds.getFirst(1); Table ; Table = InventSum_ds.getNext() ) { InventSum_ds.mark(0); } InventSum_ds.reread(); InventSum_ds.refresh(); } } } Спасибо заранее за помочь ! С уважением , Римантас |
|
06.11.2006, 13:06 | #2 |
Участник
|
Так на форме же запрос с группировкой идет и данные из RecId просто не выбираются. В качестве идентификторов полученной записи выбирайте InventSum.ItemId и InventDim.InventLocationId - группировка идет по ним
__________________
Axapta v.3.0 sp5 kr2 |
|
06.11.2006, 13:18 | #3 |
Участник
|
И замените
Код: for ( Table = InventSum_ds.getFirst(1); Table ; Table = InventSum_ds.getNext() ) { InventSum_ds.mark(0); } InventSum_ds.reread(); InventSum_ds.refresh(); Код: inventSum_ds.research(); |
|
06.11.2006, 14:29 | #4 |
Участник
|
Могу ошибаться, но, насколько я помню, группировка идёт по всем полям аналитик, выведенных в форму. Кроме склада, это могут быть партия, серийный номер...
|
|
06.11.2006, 14:34 | #5 |
Участник
|
Цитата:
Но сути это не меняет |
|
06.11.2006, 15:51 | #6 |
Участник
|
Цитата:
Заранее спасибо ! С уважением , Римантас |
|
06.11.2006, 16:06 | #7 |
Участник
|
В приведенном Вами коде не проходит условие:
for ( Table = InventSum_ds.getFirst(1); Table ; Table = InventSum_ds.getNext() ) Если, к примеру, поменять его на Table.ItemId, то записи будут перебираться. А сохранять нужно помимо кода номенклатуры и код аналитики текущей строки. А вообще, я бы сделал через Map или Set, к примеру - добавил бы edit метод первой колонкой, который сохранял бы в MAP текущую строку при установке галочки и удалял бы значения оттуда при снятии галочки. |
|
06.11.2006, 16:12 | #8 |
Участник
|
Цитата:
Сообщение от kashperuk
В приведенном Вами коде не проходит условие:
for ( Table = InventSum_ds.getFirst(1); Table ; Table = InventSum_ds.getNext() ) Если, к примеру, поменять его на Table.ItemId, то записи будут перебираться. А сохранять нужно помимо кода номенклатуры и код аналитики текущей строки. А вообще, я бы сделал через Map или Set, к примеру - добавил бы edit метод первой колонкой, который сохранял бы в MAP текущую строку при установке галочки и удалял бы значения оттуда при снятии галочки. С уважением , Римантас |
|
06.11.2006, 16:13 | #9 |
Участник
|
Почему не выйдет?
Подставьте в цикле вместо проверку Table.itemId, т.е. X++: for ( Table = InventSum_ds.getFirst(1); Table.itemId ; Table = InventSum_ds.getNext() ) Но в данном случае получается интересная ситуация - если проверять InventSum (табличную переменную на форме) - то проверка пройдет успешно. Если проверять полученную через getFirst() / GetNext() - то будет облом. Если перекрыть DisplayOption на датасоурсе - то проверка так же вернет false.
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 06.11.2006 в 16:24. |
|
06.11.2006, 16:34 | #10 |
Участник
|
Цитата:
Сообщение от AndyD
Почему не выйдет?
Подставьте в цикле вместо проверку Table.itemId, т.е. X++: for ( Table = InventSum_ds.getFirst(1); Table.itemId ; Table = InventSum_ds.getNext() ) Но в данном случае получается интересная ситуация - если проверять InventSum (табличную переменную на форме) - то проверка пройдет успешно. Если проверять полученную через getFirst() / GetNext() - то будет облом. Если перекрыть DisplayOption на датасоурсе - то проверка так же вернет false. Код: for ( Tabl1 = InventSum_ds.getFirst(1); Tabl1.ItemId ; Tabl1 = InventSum_ds.getNext() ) { cStr = ; tb.appendText(Tabl1.ItemId+";"+Tabl1.InventDimId+";"+num2str(Tabl1.AvailPhysical,12,1,0,0) +"\n"); } |
|
06.11.2006, 17:06 | #11 |
Участник
|
Оно тоже не выбирается.
Кстати, не могу сейчас придумать, как достать связанную с полученной InventSum запись из InventDim
__________________
Axapta v.3.0 sp5 kr2 |
|
06.11.2006, 17:20 | #12 |
Участник
|
Можно попробовать такой ход:
Изменить метод \Classes\InventDimCtrl_Frm_OnHand\modifyQuery так: (это в самом верху почти) Код: qBSSum.addSortField(fieldnum(InventSum,itemId)); qbSSum.addSelectionField(fieldNum(inventSum, InventDimId), SelectionField::Max); criteriaClosed = qBSSum.findRange(FieldNum(InventSum,closed)); (tb.appendText(Tabl1.Itemid + "\t" + tabl1.InventDimId + '\n') НО: необходимо помимо этого анализировать, какие выбраны аналитики. Так как аналитика выбиралась максимальная, то в ней могут быть заполнены не только указанные поля, а и другие, которые съелись в группировке. Получить выбранные флаги можно так element.inventDimSetupObject().parmDimParmVisibleGrid(); (вернет таблицу InventDimParm) и уже анализируя ее можем выбрать только те складские аналитики, которые действительно нужно учитывать. |
|
06.11.2006, 17:24 | #13 |
Участник
|
Выбрать только нужные аналитики можно по примеру класса PriceDisc:
Код: InventDim inventDimAllActivated; ; inventDimAllActivated.initFromInventDim(inventDim::find(Tabl1.inventDimId)); inventDimAllActivated.clearNotSelectedDim(element.inventDimSetupObject().parmDimParmVisibleGrid()); Надеюсь достаточно ясно изъясняюсь. P.S. 888 - прикольно. Делаю ScreenShot + AndyD - 999 Последний раз редактировалось kashperuk; 06.11.2006 в 17:31. |
|
|
За это сообщение автора поблагодарили: Gustav (2). |
06.11.2006, 17:24 | #14 |
Участник
|
Цитата:
Код: invDim = Tabl1.inventDim(); select firstonly invD2 where invD2.configId == invDim.configId && invD2.InventLocationId == invDim.InventLocationId && invD2.inventSerialId == invDim.inventSerialId && invD2.inventBatchId == invDim.inventBatchId; if ( invD2 ) { cStr = Tabl1.ItemId+";"+invD2.InventDimId+";"+num2str(Tabl1.AvailPhysical,12,1,0,0); tb.appendText(cStr+"\n"); } Спасибо ! С уважением , Римантас |
|
06.11.2006, 17:29 | #15 |
Участник
|
А вы уверены, что вот эта строка
Код: invDim = Tabl1.inventDim(); И Вам не следует завязываться на InventDimId, так как его не Должно быть - в одной строке может быть собрано более одной строки с разными аналитиками!! |
|
06.11.2006, 17:46 | #16 |
Участник
|
Это все понятно.
Я имел в виду - как дость запись из InventDim_ds - она же уже на клиенте и связана с InventSum.
__________________
Axapta v.3.0 sp5 kr2 |
|
07.11.2006, 09:32 | #17 |
Участник
|
Цитата:
Здраствыйте ! Утро умнее вечера ... : Так вот решение есть : Код: tb = new TextBuffer(); tb.appendText( "InventSumRec\n"); Tabl1 = InventSum_ds.getFirst(1); invDim = InventDim_ds.getFirst(); while ( Tabl1.ItemId ) { select firstonly invD2 where invD2.configId == invDim.configId && invD2.InventLocationId == invDim.InventLocationId && invD2.inventSerialId == invDim.inventSerialId && invD2.inventBatchId == invDim.inventBatchId; if ( invD2 ) { cStr = Tabl1.ItemId+";"+invD2.InventDimId+";"+num2str(Tabl1.AvailPhysical,12,1,0,0); tb.appendText(cStr+"\n"); } Tabl1 = InventSum_ds.getNext(); invDim = InventDim_ds.getNext(); } tb.toClipboard(); InventSum_ds.research(); С уважением , Римантас |
|
07.11.2006, 10:18 | #18 |
Участник
|
Вы ошибаетесь.
invDim = InventDim_ds.getFirst(); вернет вам первую выбранную в запросе (а не отмаркированную) запись, а InventDim_ds.getNext() вернет следующую после нее и т.д. Т.е. если вы отмаркируете с первой и без разрывов, то отработает правильно. В остальных случаях - нет
__________________
Axapta v.3.0 sp5 kr2 |
|
07.11.2006, 10:22 | #19 |
Участник
|
Да и зачем вам InventDimId? Одной строке из сгруппированной InventSum может соответствовать несколько строк из InventDim.
__________________
Axapta v.3.0 sp5 kr2 |
|
07.11.2006, 12:02 | #20 |
Участник
|
Цитата:
Римантас |
|