sync SVN r18188

This commit is contained in:
2026-09-19 23:45:23 +03:00
parent d0c1174829
commit 43d5a93572
13 changed files with 23 additions and 1446 deletions

View File

@@ -1,35 +0,0 @@
-- 08.08.2026 Marius Mutu
-- VVANZARI_ARTICOLE: liniile unei vanzari (VANZARI_DETALII) cu denumirea articolului, a gestiunii
-- si a valutei, pentru gridul de articole din formularul de modificare a notei. Valori brute, fara
-- conversie valutara si fara calcule - editarea scrie inapoi exact ce a citit. Filtrul STERS ramane
-- pe seama apelantului, ca la VACT_TOT / VRUL_TOT / VRUL_OBINV_TOT.
CREATE OR REPLACE VIEW VVANZARI_ARTICOLE AS
select vd.id_vanzare,
vd.id_vanzare_det,
vd.id_articol,
vd.cantitate,
vd.pret,
vd.pret_cu_tva,
vd.proc_tvav,
vd.discount_unitar,
vd.id_gestiune,
vd.cont,
vd.id_valuta,
vd.id_jtva_coloana,
vd.serie,
vd.explicatie,
vd.taxcode,
vd.lot,
vd.sters,
na.denumire,
na.codmat,
ng.nume_gestiune,
nv.nume_val
from vanzari_detalii vd
left join nom_articole na on na.id_articol = vd.id_articol
left join nom_gestiuni ng on ng.id_gestiune = vd.id_gestiune
left join nom_valute nv on nv.id_valuta = vd.id_valuta;
exec pack_migrare.UpdateVersiune('ff_2026_08_08_01_COMUN_VVANZARI_ARTICOLE');
commit;

View File

@@ -1,127 +0,0 @@
# Handoff — watchdog VFP + bisectie blocaj "View Parameter" gnAn
Predare la peste 310k context (Regula zero). **Doar stare, fara analize noi.** Raport analitic
complet (dovezi, log-uri, discutie): `docs\cercetare\rec_watchdog_vfp.md`.
## 1. Inventar livrabile, cu fisier:linie
**Utilitar**: `D:\ROA\ROAFACTURARE\COMUN\utile\Teste\watchdog_vfp.ps1`. Linia de comanda completa:
```
powershell -ExecutionPolicy Bypass -File "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\watchdog_vfp.ps1" -Script "<cale.prg>" -TimeoutSec 90 -AutoDismiss -MaxDialogs 10
```
Lanseaza `vfp9.exe -A -T "<script>"`, detecteaza orice fereastra noua diferita de
`Process.MainWindowHandle`, o captureaza (PNG + `WM_GETTEXT` pe titlu si controale copil) in
`<folderul scriptului>\watchdog_out\`, si cu `-AutoDismiss` incearca s-o inchida STRICT prin mesaje
Windows tintite pe handle (`BM_CLICK` pe buton Cancel/Anulare -> `WM_COMMAND IDCANCEL` ->
`WM_KEYDOWN`/`WM_KEYUP` ca mesaj -> `WM_CLOSE`) - **FARA input real** (vezi sectiunea 3). Omoara
procesul mereu la iesire (`finally`).
**Fisiere de test noi**:
- `COMUN\utile\Teste\watchdog_selftest.prg` - caz banal de validare (MESSAGEBOX), folosit doar ca
sa confirme ca watchdog-ul detecteaza/captureaza/dismite corect, inainte de cazul real.
- `COMUN\utile\Teste\editare_factura\test_repro_izolat_gnan.prg` - experimentul B (izolat): DOAR
`test_init_env_auto` + `update_jtva_coloane("", "crsJtvaTemp", 6)`, fara nimic din S4. NU
reproduce blocajul - dovada ca `update_jtva_coloane`/`updateserver.prg` sunt nevinovate.
**Fisier de test modificat**: `COMUN\utile\Teste\editare_factura\test_page3_articole.prg`:
- linia 176: `update_jtva_coloane("", "crsJtvaTemp", 6)` (parametrul schimbat din `0` in `6` -
necesar pentru indexul `id_jtva` cerut de `Column63.ControlSource` din `omodificari.vc2:9199`;
independent de defectul principal, fix cunoscut deja din `date_test_nnir.md`);
- `PROCEDURE bisect_log_gnan` (noua, la coada fisierului, ~linia 236) + apeluri `DO bisect_log_gnan
WITH <tag>, lcLog` inserate: in programul principal intre fiecare apel de nivel superior, si ca
PRIMA linie in interiorul fiecarei proceduri (`verifica_vanzare_nota`, `verifica_coliziune_cod`,
`verifica_pagecount_form`) - infrastructura de bisectie, ramasa in cod ca dovada;
- **liniile 37, 39, 50 - remediul APLICAT DE TEAM-LEAD** (nu de mine, sub pragul lui de editare
directa): `gnAn`/`gnLuna` parantezate - `(gnAn)`, `(gnLuna)` - in apelurile `DO verifica_vanzare_nota
WITH ...` (x2) si `DO verifica_pagecount_form WITH ...` (primul), cu comentariu explicativ deasupra
primei aparitii (liniile 34-36).
**Log-uri si capturi**: `test_page3_articole_log.txt` (log-ul aplicatiei, contine liniile `[BISECT]`),
`watchdog_out\*.png` + `watchdog_out\*_watchdog.log` (capturi + jurnal watchdog, per fisier de test),
toate in `COMUN\utile\Teste\editare_factura\`.
## 2. Ce e terminat, ce nu
**Terminat**:
- Watchdog-ul: scris, testat pe caz banal, testat pe cazul real, corectat (heuristica de fereastra
principala, bug de indexare PowerShell pe array cu 1 element, input real scos complet).
- Bisectia: COMPLETA, cauza CONFIRMATA cu date brute (nu deductie) - vezi sectiunea 4.
- Remediul: APLICAT de team-lead (liniile 37/39/50).
**Neterminat**: remediul NU a fost re-testat dupa aplicare. Ultima rulare a suitei (a mea) a fost
INAINTE de remediul team-lead-ului. Team-lead ruleaza el insusi suita, separat - **eu nu mai rulez
nimic** (interdictie explicita primita).
## 3. Stare fisiere - write-back
**Toate fisierele atinse in aceasta sesiune sunt `.prg`/`.ps1` (text simplu)** - NU exista
`.vc2`/`.sc2`/`.vcx`/`.vct` atinse, deci **NU exista niciun write-back nefacut**.
Confirmare explicita: `COMUN\clase\omodificari.vc2/.vcx/.vct` si `COMUN\programe\updateserver.prg`
sunt **NEATINSE** in aceasta sesiune (nici de mine, nici - din cate stiu - de altcineva). Fara
commit git/svn facut sau initiat.
## 4. Ce s-a stabilit deja - NU relua
- **Cauza CONFIRMATA, nu ipoteza**: `test_page3_articole.prg` (inainte de remediu) trecea
`gnAn`/`gnLuna` NEPARANTEZAT in `DO...WITH` (liniile 34, 36, 47 - numerotare dinainte de remediu).
`DO proc WITH var` paseaza variabile de memorie BY REFERENCE implicit in VFP; `LPARAMETERS`
primitor devine alias direct pe storage-ul original, iar numele original (`gnAn`) devine
inaccesibil (`TYPE()='U'`) STRICT pe durata acelui apel, revenind valid imediat dupa `RETURN`.
Confirmat simetric pe 3 apeluri afectate vs 2 neafectate (vezi tabelul din `rec_watchdog_vfp.md`
sectiunea 5).
- **`updateserver.prg`/`update_jtva_coloane` sunt nevinovate** - experimentul B (izolat, fara nimic
din S4) NU reproduce; functia merge perfect cand `gnAn` e vizibil normal.
- **`gnAn` NU e eliberata niciodata** - ramane valida (`TYPE()='N'`, 2026) la FIECARE checkpoint din
scope-ul PRINCIPAL, fara exceptie. Nu exista `CLEAR ALL`/`CLEAR MEMORY`/`RELEASE ALL EXTENDED` pe
lantul executat.
- **Nu e coliziune de nume in corpul procedurii**: `verifica_pagecount_form` NU are `gnAn` in
`LOCAL` (linia ei 148/159), si NU exista `PRIVATE gnAn`/`LOCAL gnAn` nicaieri in `COMUN\programe`.
Umbrirea vine din SINTAXA APELULUI (`DO...WITH` neparantezat), nu din declaratiile callee-ului.
- **Handler-ul de eroare** (`test_error_handler`/`ON ERROR`) doar logheaza (`STRTOFILE`) si continua
- nu ascunde nimic, util pentru diagnostic.
- **Incidentul de focus**: ESC-ul trimis de o versiune veche a watchdog-ului (cu `SetForegroundWindow`
+ `keybd_event`, SCOASA complet acum) a aterizat de fapt in PROPRIUL nostru proces de test, NU in
sesiunea utilizatorului - dar mecanismul tot nu are tinta si regula "fara input real" ramane
obligatorie indiferent (documentat in `rec_watchdog_vfp.md` sectiunea 1, corectat acolo dupa o
formulare initiala gresita).
## 5. Ce e interzis
- Input real de tastatura/mouse in watchdog (`keybd_event`, `SetForegroundWindow`, `SendInput`,
`mouse_event`) - masina e PARTAJATA. Deja scos din cod, verificat cu grep (zero hit-uri de cod,
doar comentarii care explica interdictia).
- Atingerea `COMUN\clase\omodificari.vc2/.vcx/.vct` si `COMUN\programe\updateserver.prg`.
- Commit git/svn.
- **Eu nu mai rulez suita** - team-lead o ruleaza separat dupa remediul lui.
## 6. Capcane de mediu platite in aceasta sesiune
- **Heuristica "prima fereastra vazuta = principala" e o cursa pierduta**: un dialog poate aparea in
aceeasi fractiune de secunda cu fereastra principala. Solutia corecta: `Process.MainWindowHandle`
(.NET), NU ordinea de aparitie si NU numele clasei (VFP foloseste clase `vfp9...` si pentru shell,
si pentru dialogurile proprii - `vfp99400000` vs `vfp994000002`).
- **Dialogurile proprii VFP (ex. "View Parameter") sunt owner-drawn** - `EnumChildWindows` intoarce
ZERO controale copil (butoanele sunt desenate, nu HWND-uri reale). `BM_CLICK` e imposibil pentru
ele; chiar si `WM_CLOSE` poate "reusi" aparent (`IsWindow` -> fals) FARA sa deblocheze de fapt
motorul VFP din spate (SQLEXEC ramas agatat, fara linie noua in log, pana la timeout) - un fals
"succes" de retinut daca cineva reia mecanismul de dismiss.
- **Bug PowerShell subtil**: un `List[string]` cu UN SINGUR element e "descompus" de PowerShell la
scalar string simplu la `return` din functie (fara `,` unar) - indexarea ulterioara `$x[0]` citeste
atunci primul CARACTER, nu primul element. Prins la dump-ul de text al dialogului "View Parameter"
(fara controale copil = un singur element in listă). Fix: `return , $lista.ToArray()`.
- **`.fxp` vechi blocat**: sterge intotdeauna `.fxp`-ul inainte de fiecare rulare (watchdog-ul o face
singur) - altfel VFP ruleaza tacut codul vechi compilat.
- **Bisectia**: `TRANSFORM(gnAn)` pe o variabila `TYPE()='U'` ARUNCA eroare catchabila ("Variable
'GNAN' is not found") - helper-ul `bisect_log_gnan` verifica `TYPE()<>'U'` INAINTE de a apela
`TRANSFORM()`, ca sa nu produca o eroare noua care ar fi intrerupt bisectia la primul checkpoint
"gol".
## Confirmare finala
**PID 16548 nu mai exista** (verificat cu `Get-Process -Id 16548` - inexistent la momentul acestui
handoff) si **niciun `vfp9.exe` nu ruleaza** (verificat cu `Get-Process vfp9` - lista goala). Nimic
in stare periculoasa: fara editare pe jumatate, fara cursor/tranzactie Oracle deschisa (doar
citiri), fara fisier binar atins. Sesiunea se opreste aici.

View File

@@ -1,55 +0,0 @@
-- S10 - curatare istoric TABELA VERSIUNE, MARIUSM_AUTO/ROA_CENTRAL
-- Scop: cele 5 scripturi ff_2026_08_06_* au fiecare mai multe inregistrari in VERSIUNE,
-- din aplicari succesive pe masura ce au fost extinse in cursul zilei de 06.08.2026.
-- Fara impact functional (versiune_db.txt si aplicarea DDL nu depind de numarul de randuri),
-- doar istoric zgomotos. Pastreaza UN singur rand per script (cel cu ID_VERSIUNE maxim, adica
-- ultima aplicare - starea finala reala a scriptului), sterge restul.
--
-- NU S-A RULAT. Propunere pentru aprobare - stergerea de istoric e decizie de om, iar
-- MARIUSM_AUTO e schema de dezvoltare partajata.
-- 1) Verificare inainte de stergere: cate randuri per script, azi
select script_final, count(*) as nr_inregistrari
from versiune
where script_final in (
'ff_2026_08_06_02_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_03_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_04_COMUN_VANZARI_COMANDA_CONTRACT.sql',
'ff_2026_08_06_05_COMUN_FACT_VFACTURI.sql',
'ff_2026_08_06_06_COMUN_VANZARI_BACKFILL.sql'
)
group by script_final
order by script_final;
-- Stare masurata 06.08.2026: _02=2, _03=1 (nimic de sters), _04=2, _05=4, _06=5 (14 randuri total,
-- 9 de sters, ramanand 5 - unul per script).
-- 2) Stergere: pastreaza doar randul cu ID_VERSIUNE maxim per script (ultima aplicare)
delete from versiune v
where v.script_final in (
'ff_2026_08_06_02_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_03_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_04_COMUN_VANZARI_COMANDA_CONTRACT.sql',
'ff_2026_08_06_05_COMUN_FACT_VFACTURI.sql',
'ff_2026_08_06_06_COMUN_VANZARI_BACKFILL.sql'
)
and v.id_versiune < (
select max(v2.id_versiune)
from versiune v2
where v2.script_final = v.script_final
);
-- 3) Verificare dupa stergere: fiecare script din lista trebuie sa aiba exact 1 rand
select script_final, count(*) as nr_inregistrari
from versiune
where script_final in (
'ff_2026_08_06_02_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_03_COMUN_PACK_FACTURARE.sql',
'ff_2026_08_06_04_COMUN_VANZARI_COMANDA_CONTRACT.sql',
'ff_2026_08_06_05_COMUN_FACT_VFACTURI.sql',
'ff_2026_08_06_06_COMUN_VANZARI_BACKFILL.sql'
)
group by script_final
order by script_final;
-- commit; -- de dat manual, dupa verificarea pasului 3