Files
comun/docs/conventie_goexecutor_alter_table.md
2026-09-25 12:21:30 +03:00

1.9 KiB

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.

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)

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.