44 lines
1.4 KiB
Markdown
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.
|