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

44 lines
1.4 KiB
Markdown

# 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.