# Capcana: ALTER TABLE pe cursorul intors de goExecutor.oExecute() Comun tuturor proiectelor ROA*. ## Ce nu functioneaza Exemple deja rezolvate cu SELECT in loc de ALTER: `overificari.vc2:3088`, `frm_import_extrase_banca.sc2:2324`. ```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) ``` ATENTIE: nici cursorul rematerializat NU accepta `ALTER TABLE` daca are un nume de camp peste 10 caractere (eroare 1115 `Invalid operation for the cursor.`). Garda `SourceType = 3` nu ajunge. Cursoarele din `select * from v_...` (ex. `tact` = `vact_tot`: id_jtva_coloana, id_sucursala, tva_incasare) au astfel de campuri -> `ALTER TABLE` nu se foloseste deloc pe ele. Schimbarea tipului unei coloane (T -> D) se face cu `SELECT` explicit, `TTOD(camp) AS camp`, in alias temporar si inapoi `INTO CURSOR ... READWRITE`; sau grila se leaga la `TTOD(camp)`. `ALTER TABLE` merge doar pe cursor cu nume <= 10 caractere, creat de tine.