1.4 KiB
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.