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ě.
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:
Přihlásit se k odběru:
Komentáře k příspěvku (Atom)
Ahoj. A ma nejaky prakticky smysl tahat vetu pro update s direktivou client? Unika me trosku smysl takoveho kodu.
OdpovědětVymazatS pozdravem
Jenda
V cíleném psaní takového kódu smysl také nevidím, ale někdy se ho povede vytvořit neúmyslně.
OdpovědětVymazatKonkré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…