1.9 KiB
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.
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)
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.