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

51 lines
1.9 KiB
Markdown

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