Files
comun/docs/conventie_goexecutor_alter_table.md
2026-08-23 11:08:56 +03:00

1.4 KiB

Capcana: ALTER TABLE pe cursorul intors de goExecutor.oExecute()

Comun tuturor proiectelor ROA*.

Ce nu functioneaza

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 *:

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.