neděle 23. srpna 2009

The records buffer is NULL

Tento příspěvek dokumentuje jedno ne zrovna intuitivní chování Axapty. Vezměme následující jednoduchou třídu:
class Test
{
    public server static void main(Args args)
    {
        Test::recordOnClient();
    }

    public client static InventTable recordOnClient()
    {
        InventTable inventTable;
        select firstOnly forUpdate inventTable;
        return inventTable;
    }
}
Tento kód (respektive pokus o vrácení hodnoty z metody recordOnClient()) vyhodí run-time výjimku Error executing code: The record buffer is NULL. Testováno v AX2009, AX3 jednoduše spadne (AX4 nemám po ruce). Právě vytvořením kódu sestřelujícího Axaptu 3 toto chování jeden můj kolega objevil. Zajímavé je, že se tak děje pouze při volání client metody ze serveru a pokud metoda vrací buffer vybraný pro update. Všechny ostatní scénáře skončily bez chyby. Doufal jsem, že se mi na základě chybové hlášky podaří najít více informací, ale nebyl jsem úspěšný. Zřejmě se to moc často vytvořit nepovede. Doplnění: Pokud je na bufferu volán insert(), dostane buffer příznak forUpdate. Výše popsané chování tedy platí i v takovém případě.

2 komentáře:

  1. Ahoj. A ma nejaky prakticky smysl tahat vetu pro update s direktivou client? Unika me trosku smysl takoveho kodu.

    S pozdravem

    Jenda

    OdpovědětVymazat
  2. V cíleném psaní takového kódu smysl také nevidím, ale někdy se ho povede vytvořit neúmyslně.

    Konkrétně v našem případě volal vývojář ze serveru metodu standardní třídy a nevšiml si, že je klientská (třída nebo metoda, detaily si nepamatuji). Tuším že se v ní zakládal záznam a ihned vracel, a v takovou chvíli má buffer právě příznak forUpdate. To bych asi měl doplnit do příspěvku…

    OdpovědětVymazat