51 lines
1.9 KiB
Markdown
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.
|