1

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

Я думал, что это будет работать, но я получаю исключение и 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, Нойес :: Да);

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

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

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

ответ

2

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

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) 
+0

Он работал именно так, как вы сказали. Большое спасибо, но вы можете немного объяснить цикл for? –

+0

'?' И ':' предназначены для тройной операции (см. Https://msdn.microsoft.com/en-us/library/aa552755.aspx?f=255&MSPPError=-2147217396). Поэтому, если 'getFirst()' не возвращает значение, он использует курсор. –