# Capcana: ALTER TABLE pe cursorul intors de goExecutor.oExecute() Comun tuturor proiectelor ROA*. ## Ce nu functioneaza ```foxpro lnSucces = goExecutor.oExecute(lcSql, lcCursor) ... ALTER TABLE (lcCursor) ADD COLUMN coloananoua L && <- pica ``` Simptome intalnite, in aceasta ordine: `Function is not supported on remote tables.` (ALTER TABLE direct pe cursorul original) / `Alias name is already in use.` (rematerializare cu sursa si tinta acelasi nume) / `Invalid operation for the cursor.` (ALTER TABLE pe alias scratch diferit ca tinta). ## Ce functioneaza Nu folosi `ALTER TABLE` deloc pe rezultatul unui `oExecute()`. Include coloanele suplimentare direct in `SELECT`-ul de rematerializare, ca expresii literale alaturi de `*`: ```foxpro lcCursorRaw = lcCursor + '_raw' IF USED(lcCursorRaw) USE IN (lcCursorRaw) ENDIF lnSucces = goExecutor.oExecute(lcSql, lcCursorRaw) IF lnSucces < 0 * tratare eroare, RETURN ENDIF SELECT *, .F. AS coloananoua, SPACE(100) AS altacoloana ; FROM (lcCursorRaw) INTO CURSOR (lcCursor) READWRITE USE IN (lcCursorRaw) * de-aici incolo doar REPLACE (date), NICIODATA ALTER TABLE (structura) pe (lcCursor) ``` Dupa acest pas cursorul (`lcCursor`) e un cursor local obisnuit - `ALTER TABLE` functioneaza normal pe el DUPA ACEEA (ex. intr-o alta functie care primeste cursorul deja gata construit), doar comanda imediat urmatoare unui `oExecute()` e restrictionata.