Маркировка VendTransOpen с помощью CustVendOpenTransManager

У меня есть кнопка на VendOpenTrans и я реализовал метод clicked.

Я думал, что это сработает, но я получаю исключение, и AX закрывается.

void clicked()
{
   LedgerJournalTrans ledgerJournalTrans;
   VendTransOpen vto;

   super();

   switch (originator.TableId)
   {
      case tableNum(LedgerJournalTrans):
          ledgerJournalTrans = element.args().record();
    }



for ( vto = vendTransOpen_ds.getFirst(0); vto; vto = vendTransOpen_ds.getNext() )
{
    //vendTransOpen_ds.markRecord(vto, 1);
    if (vto.RecId)
    {
        if (manager.getTransMarked(vto) == NoYes::No)
        {
           select Invoice from vendTrans
               where vto.AccountNum == vendTrans.AccountNum &&
                 vto.RefRecId == vendTrans.RecId;

              if (ledgerJournalTrans.Invoice == vendTrans.Invoice)
              {
                // Mark transaction for settlement
                 showError = NoYes::No;
                 manager.updateTransMarked(vto, NoYes::Yes);
                 showError = NoYes::Yes;
              }
          }
      }

    // Update dynamic controls & refresh form as auto-redraw is not triggered
     element.updateDesignDynamic();
     element.redraw();

 }
vendTransOpen_ds.refreshEx(-2);
}

Если я прокомментирую следующие строки, это сработает, в основном отмечая все строки в сетке.

//select Invoice from vendTrans
     //where vto.AccountNum == vendTrans.AccountNum &&
          //vto.RefRecId == vendTrans.RecId;

//if (ledgerJournalTrans.Invoice == vendTrans.Invoice)
//{
     // Mark transaction for settlement
        showError = NoYes::No;
        manager.updateTransMarked(vto, NoYes::Yes);
        showError = NoYes::Yes;
//}

Итак, чтобы было понятнее, остается следующее: manager.updateTransMarked(vto, NoYes::Yes);

и таким образом это работает. Насколько я вижу, что-то происходит, когда я добавляю этот выбор.

Используя отладку, я смог проверить это, и я думаю, что исключение выдается циклом for..

Есть ли шанс получить подсказку по этому поводу?


person Olaru Mircea    schedule 17.12.2015    source источник


Ответы (1)


Попробуйте изменить определение цикла for на это:

for (vto = vendTransOpen_ds.getFirst(0) ? vendTransOpen_ds.getFirst(0) : vendTransOpen_ds.cursor(); vto; vto = vendTransOpen_ds.getNext())

И измените это:

select Invoice from vendTrans
    where vto.AccountNum == vendTrans.AccountNum &&
          vto.RefRecId == vendTrans.RecId;

    if (ledgerJournalTrans.Invoice == vendTrans.Invoice)
    {

К этому:

if (ledgerJournalTrans.Invoice == vto.vendTrans().Invoice)
person Alex Kwitny    schedule 17.12.2015
comment
Это сработало именно так, как вы сказали. Большое спасибо, но не могли бы вы немного объяснить цикл for? - person Olaru Mircea; 17.12.2015
comment
? и : предназначены для троичной операции (см. msdn.microsoft.com/en-us/library/). Поэтому, если getFirst() не возвращает значение, он использует курсор. - person Alex Kwitny; 17.12.2015