AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.11.2006, 12:39   #1  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Вытащить записи из 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();
      }
   }
}
Отчего то первая запись для Tabl1 получает курсор , где RecId == 0 . В етой форме datasource есть как результат query , как я понимаю . Можеть из за етого данные таким путем недостижимые ?

Спасибо заранее за помочь !

С уважением , Римантас
Старый 06.11.2006, 13:06   #2  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Так на форме же запрос с группировкой идет и данные из RecId просто не выбираются. В качестве идентификторов полученной записи выбирайте InventSum.ItemId и InventDim.InventLocationId - группировка идет по ним
__________________
Axapta v.3.0 sp5 kr2
Старый 06.11.2006, 13:18   #3  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
И замените
Код:
         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  
Михаил Андреев is offline
Михаил Андреев
Участник
Компания АМАНД
Лучший по профессии 2009
 
1,296 / 239 (10) ++++++
Регистрация: 09.11.2001
Адрес: Химки, Московская область
Цитата:
Сообщение от AndyD Посмотреть сообщение
Так на форме же запрос с группировкой идет и данные из RecId просто не выбираются. В качестве идентификторов полученной записи выбирайте InventSum.ItemId и InventDim.InventLocationId - группировка идет по ним
Могу ошибаться, но, насколько я помню, группировка идёт по всем полям аналитик, выведенных в форму. Кроме склада, это могут быть партия, серийный номер...
__________________
Михаил Андреев
https://www.amand.ru
Старый 06.11.2006, 14:34   #5  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Цитата:
Сообщение от Михаил Андреев Посмотреть сообщение
Могу ошибаться, но, насколько я помню, группировка идёт по всем полям аналитик, выведенных в форму. Кроме склада, это могут быть партия, серийный номер...
Нет. не ошибаетесь. Зависит от выбранных в inventDimParm флагов.
Но сути это не меняет
Старый 06.11.2006, 15:51   #6  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от AndyD Посмотреть сообщение
Так на форме же запрос с группировкой идет и данные из RecId просто не выбираются. В качестве идентификторов полученной записи выбирайте InventSum.ItemId и InventDim.InventLocationId - группировка идет по ним
Поскольку я новичок в Aaxapte , но сразу всё и непонимаю ... АндиД , вы потвердили ето , что из за запроса так просто не выдёт с getfirst() getnext() сыграть . Но тогда как можно отыскать информацию ? Вы можете подсказать как ето делаеться с замеченными записями ?

Заранее спасибо ! С уважением , Римантас
Старый 06.11.2006, 16:06   #7  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
В приведенном Вами коде не проходит условие:

for ( Table = InventSum_ds.getFirst(1); Table ; Table = InventSum_ds.getNext() )

Если, к примеру, поменять его на Table.ItemId, то записи будут перебираться.
А сохранять нужно помимо кода номенклатуры и код аналитики текущей строки.

А вообще, я бы сделал через Map или Set, к примеру - добавил бы edit метод первой колонкой, который сохранял бы в MAP текущую строку при установке галочки и удалял бы значения оттуда при снятии галочки.
Старый 06.11.2006, 16:12   #8  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от kashperuk Посмотреть сообщение
В приведенном Вами коде не проходит условие:

for ( Table = InventSum_ds.getFirst(1); Table ; Table = InventSum_ds.getNext() )

Если, к примеру, поменять его на Table.ItemId, то записи будут перебираться.
А сохранять нужно помимо кода номенклатуры и код аналитики текущей строки.

А вообще, я бы сделал через Map или Set, к примеру - добавил бы edit метод первой колонкой, который сохранял бы в MAP текущую строку при установке галочки и удалял бы значения оттуда при снятии галочки.
Попробуем с Table.ItemId . Как новичоку - MAP ещё трудновато понять . А можно кусочек примера на ето ?

С уважением , Римантас
Старый 06.11.2006, 16:13   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Почему не выйдет?
Подставьте в цикле вместо проверку Table.itemId, т.е.
X++:
for ( Table = InventSum_ds.getFirst(1); Table.itemId ; Table = InventSum_ds.getNext() )
PS Иван уже ответил
Но в данном случае получается интересная ситуация - если проверять InventSum (табличную переменную на форме) - то проверка пройдет успешно. Если проверять полученную через getFirst() / GetNext() - то будет облом. Если перекрыть DisplayOption на датасоурсе - то проверка так же вернет false.
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 06.11.2006 в 16:24.
Старый 06.11.2006, 16:34   #10  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от AndyD Посмотреть сообщение
Почему не выйдет?
Подставьте в цикле вместо проверку Table.itemId, т.е.
X++:
for ( Table = InventSum_ds.getFirst(1); Table.itemId ; Table = InventSum_ds.getNext() )
PS Иван уже ответил
Но в данном случае получается интересная ситуация - если проверять InventSum (табличную переменную на форме) - то проверка пройдет успешно. Если проверять полученную через getFirst() / GetNext() - то будет облом. Если перекрыть DisplayOption на датасоурсе - то проверка так же вернет false.
Да ... . Так идёт . Осталось одна мелоч - как вытащить InventDimId . Поскольку RecId несуществует , тогда стараюсь сбросить в память все нужные переменные -
Код:
     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");
         }
Но вот етот InventDimId в Tabl1 пустой ...
Старый 06.11.2006, 17:06   #11  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Оно тоже не выбирается.
Кстати, не могу сейчас придумать, как достать связанную с полученной InventSum запись из InventDim
__________________
Axapta v.3.0 sp5 kr2
Старый 06.11.2006, 17:20   #12  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Можно попробовать такой ход:
Изменить метод \Classes\InventDimCtrl_Frm_OnHand\modifyQuery так:
(это в самом верху почти)
Код:
    qBSSum.addSortField(fieldnum(InventSum,itemId));
 
    qbSSum.addSelectionField(fieldNum(inventSum, InventDimId), SelectionField::Max);
 
    criteriaClosed = qBSSum.findRange(FieldNum(InventSum,closed));
Тогда у нас в clicked() будет доступна и аналитика.
(tb.appendText(Tabl1.Itemid + "\t" + tabl1.InventDimId + '\n')
НО:
необходимо помимо этого анализировать, какие выбраны аналитики.
Так как аналитика выбиралась максимальная, то в ней могут быть заполнены не только указанные поля, а и другие, которые съелись в группировке.

Получить выбранные флаги можно так

element.inventDimSetupObject().parmDimParmVisibleGrid();
(вернет таблицу InventDimParm)
и уже анализируя ее можем выбрать только те складские аналитики, которые действительно нужно учитывать.
Старый 06.11.2006, 17:24   #13  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Выбрать только нужные аналитики можно по примеру класса PriceDisc:

Код:
    InventDim       inventDimAllActivated;
    ;
    inventDimAllActivated.initFromInventDim(inventDim::find(Tabl1.inventDimId));
    inventDimAllActivated.clearNotSelectedDim(element.inventDimSetupObject().parmDimParmVisibleGrid());
Тогда в переменной inventDimAllActivated остануться заполненными только те аналитики, которые выбраны флагами.

Надеюсь достаточно ясно изъясняюсь.

P.S. 888 - прикольно. Делаю ScreenShot + AndyD - 999
Изображения
 

Последний раз редактировалось kashperuk; 06.11.2006 в 17:31.
За это сообщение автора поблагодарили: Gustav (2).
Старый 06.11.2006, 17:24   #14  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от AndyD Посмотреть сообщение
Оно тоже не выбирается.
Кстати, не могу сейчас придумать, как достать связанную с полученной InventSum запись из InventDim
Ну почти догадалься ... . Там ещё подзапрос сделал в цикле , заново отыискать :

Код:
            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  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
А вы уверены, что вот эта строка
Код:
invDim = Tabl1.inventDim();
возвращает вам правильную аналитику?

И Вам не следует завязываться на InventDimId, так как его не Должно быть - в одной строке может быть собрано более одной строки с разными аналитиками!!
Старый 06.11.2006, 17:46   #16  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Это все понятно.
Я имел в виду - как дость запись из InventDim_ds - она же уже на клиенте и связана с InventSum.
__________________
Axapta v.3.0 sp5 kr2
Старый 07.11.2006, 09:32   #17  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от AndyD Посмотреть сообщение
Это все понятно.
Я имел в виду - как дость запись из InventDim_ds - она же уже на клиенте и связана с InventSum.

Здраствыйте ! Утро умнее вечера ... : Так вот решение есть :
Код:
         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  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Вы ошибаетесь.
invDim = InventDim_ds.getFirst(); вернет вам первую выбранную в запросе (а не отмаркированную) запись, а InventDim_ds.getNext() вернет следующую после нее и т.д. Т.е. если вы отмаркируете с первой и без разрывов, то отработает правильно. В остальных случаях - нет
__________________
Axapta v.3.0 sp5 kr2
Старый 07.11.2006, 10:22   #19  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Да и зачем вам InventDimId? Одной строке из сгруппированной InventSum может соответствовать несколько строк из InventDim.
__________________
Axapta v.3.0 sp5 kr2
Старый 07.11.2006, 12:02   #20  
Rimantas is offline
Rimantas
Участник
 
304 / 16 (1) ++
Регистрация: 30.04.2004
Адрес: Utena , Lithuania
Цитата:
Сообщение от AndyD Посмотреть сообщение
Вы ошибаетесь.
invDim = InventDim_ds.getFirst(); вернет вам первую выбранную в запросе (а не отмаркированную) запись, а InventDim_ds.getNext() вернет следующую после нее и т.д. Т.е. если вы отмаркируете с первой и без разрывов, то отработает правильно. В остальных случаях - нет
Ну незнаю ... Но самое интересное , то что я получаю точные данные ... И если подумать - datasources же соединнены . Так если я делаю записи marked в гриде , то они оба делаеться - и InventSum и InventDim . Углубляьтся в етот раз нету и времени и опыта - меня удовлетворяет , что данные есть точные ...

Римантас
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
RecordSet у inventSum CasperSKY DAX: Программирование 3 21.03.2008 15:52
Ошибка при разноске складских движений Starling DAX: Администрирование 9 12.10.2007 14:21
ALEG: Доступны записи тренингов по Microsoft Dynamics NAV Blog bot DAX Blogs 0 21.03.2007 15:00
Можно ли чистить InventSum? DreamCreator DAX: Программирование 19 05.12.2006 15:38
Форма InventOnhandItem, Почему RecID у InventSum в этой форме всегда 0? Кирилл DAX: Программирование 2 25.05.2004 18:15
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:36.