NNIR editabil in Registrul Jurnal (frm_modific2024) + teste

This commit is contained in:
2026-08-03 23:44:27 +03:00
parent 4666262c92
commit 26d2c205c9
9 changed files with 1488 additions and 39 deletions

View File

@@ -6720,6 +6720,8 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*< OBJECTDATA: ObjPath="Grid1.Column43.Header1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1.Column43.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Grid1.Column43.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1.Column43.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Grid1.Column43._combobox1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Grid1.Column43._combobox1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Grid1.Column44.Header1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Grid1.Column44.Text1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Command1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Command1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Gridextra1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Gridextra1" UniqueID="" Timestamp="" />
*< OBJECTDATA: ObjPath="Command2" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Command2" UniqueID="" Timestamp="" />
@@ -6762,6 +6764,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*m: grid_focus_prima_coloana *m: grid_focus_prima_coloana
*m: resize_grid1 *m: resize_grid1
*m: salveazaxml *m: salveazaxml
*m: sincronizeaza_nnir
*m: updateexplicatiesaft *m: updateexplicatiesaft
*m: updateexplicatiesaftrul *m: updateexplicatiesaftrul
*m: valideaza_data *m: valideaza_data
@@ -6778,6 +6781,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
*p: lverificare *p: lverificare
*p: lvizualizare *p: lvizualizare
*p: nid_set *p: nid_set
*p: nnnirvechi
*p: noldsuma && Valoarea la intrarea in campul "Suma" *p: noldsuma && Valoarea la intrarea in campul "Suma"
*p: nprimadata *p: nprimadata
*p: nsuma && Total suma inregistrari *p: nsuma && Total suma inregistrari
@@ -6809,6 +6813,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
lvizualizare = .F. lvizualizare = .F.
Name = "frm_modific2024" Name = "frm_modific2024"
nid_set = 0 nid_set = 0
nnnirvechi = 0
noldsuma = 0 noldsuma = 0
nprimadata = 0 nprimadata = 0
nsuma = 0 nsuma = 0
@@ -7143,7 +7148,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ADD OBJECT 'Grid1' AS grid WITH ; ADD OBJECT 'Grid1' AS grid WITH ;
Anchor = 10, ; Anchor = 10, ;
BackColor = 244,250,255, ; BackColor = 244,250,255, ;
ColumnCount = 43, ; ColumnCount = 44, ;
DeleteMark = .F., ; DeleteMark = .F., ;
FontCharSet = 238, ; FontCharSet = 238, ;
FontSize = 10, ; FontSize = 10, ;
@@ -7185,7 +7190,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column2.Width = 71, ; Column2.Width = 71, ;
Column3.Alignment = 0, ; Column3.Alignment = 0, ;
Column3.BackColor = 244,250,255, ; Column3.BackColor = 244,250,255, ;
Column3.ColumnOrder = 15, ; Column3.ColumnOrder = 16, ;
Column3.ControlSource = "fdoc", ; Column3.ControlSource = "fdoc", ;
Column3.FontCharSet = 238, ; Column3.FontCharSet = 238, ;
Column3.FontName = "Arial", ; Column3.FontName = "Arial", ;
@@ -7215,7 +7220,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column5.Width = 53, ; Column5.Width = 53, ;
Column6.Alignment = 0, ; Column6.Alignment = 0, ;
Column6.BackColor = 244,250,255, ; Column6.BackColor = 244,250,255, ;
Column6.ColumnOrder = 7, ; Column6.ColumnOrder = 8, ;
Column6.ControlSource = "partd", ; Column6.ControlSource = "partd", ;
Column6.FontCharSet = 238, ; Column6.FontCharSet = 238, ;
Column6.FontName = "Arial", ; Column6.FontName = "Arial", ;
@@ -7225,7 +7230,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column6.Width = 114, ; Column6.Width = 114, ;
Column7.Alignment = 1, ; Column7.Alignment = 1, ;
Column7.BackColor = 244,250,255, ; Column7.BackColor = 244,250,255, ;
Column7.ColumnOrder = 10, ; Column7.ColumnOrder = 11, ;
Column7.ControlSource = "scd", ; Column7.ControlSource = "scd", ;
Column7.FontCharSet = 238, ; Column7.FontCharSet = 238, ;
Column7.FontName = "Arial", ; Column7.FontName = "Arial", ;
@@ -7235,7 +7240,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column7.Width = 57, ; Column7.Width = 57, ;
Column8.Alignment = 1, ; Column8.Alignment = 1, ;
Column8.BackColor = 244,250,255, ; Column8.BackColor = 244,250,255, ;
Column8.ColumnOrder = 12, ; Column8.ColumnOrder = 13, ;
Column8.ControlSource = "scc", ; Column8.ControlSource = "scc", ;
Column8.FontCharSet = 238, ; Column8.FontCharSet = 238, ;
Column8.FontName = "Arial", ; Column8.FontName = "Arial", ;
@@ -7245,7 +7250,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column8.Width = 62, ; Column8.Width = 62, ;
Column9.Alignment = 1, ; Column9.Alignment = 1, ;
Column9.BackColor = 244,250,255, ; Column9.BackColor = 244,250,255, ;
Column9.ColumnOrder = 14, ; Column9.ColumnOrder = 15, ;
Column9.ControlSource = "suma", ; Column9.ControlSource = "suma", ;
Column9.DynamicForeColor = "IIF(SUMA>=0, RGB(0,0,0), RGB(255,0,0))", ; Column9.DynamicForeColor = "IIF(SUMA>=0, RGB(0,0,0), RGB(255,0,0))", ;
Column9.FontCharSet = 238, ; Column9.FontCharSet = 238, ;
@@ -7258,7 +7263,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column9.Width = 93, ; Column9.Width = 93, ;
Column10.Alignment = 0, ; Column10.Alignment = 0, ;
Column10.BackColor = 244,250,255, ; Column10.BackColor = 244,250,255, ;
Column10.ColumnOrder = 8, ; Column10.ColumnOrder = 9, ;
Column10.ControlSource = "partc", ; Column10.ControlSource = "partc", ;
Column10.FontCharSet = 238, ; Column10.FontCharSet = 238, ;
Column10.FontName = "Arial", ; Column10.FontName = "Arial", ;
@@ -7268,7 +7273,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column10.Width = 100, ; Column10.Width = 100, ;
Column11.Alignment = 0, ; Column11.Alignment = 0, ;
Column11.BackColor = 244,250,255, ; Column11.BackColor = 244,250,255, ;
Column11.ColumnOrder = 9, ; Column11.ColumnOrder = 10, ;
Column11.ControlSource = "explicatia", ; Column11.ControlSource = "explicatia", ;
Column11.FontCharSet = 238, ; Column11.FontCharSet = 238, ;
Column11.FontName = "Arial", ; Column11.FontName = "Arial", ;
@@ -7277,7 +7282,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column11.ReadOnly = .F., ; Column11.ReadOnly = .F., ;
Column11.Width = 77, ; Column11.Width = 77, ;
Column12.BackColor = 244,250,255, ; Column12.BackColor = 244,250,255, ;
Column12.ColumnOrder = 37, ; Column12.ColumnOrder = 38, ;
Column12.ControlSource = "cod", ; Column12.ControlSource = "cod", ;
Column12.FontCharSet = 238, ; Column12.FontCharSet = 238, ;
Column12.FontName = "Arial", ; Column12.FontName = "Arial", ;
@@ -7286,7 +7291,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column12.ReadOnly = .T., ; Column12.ReadOnly = .T., ;
Column12.Width = 52, ; Column12.Width = 52, ;
Column13.BackColor = 244,250,255, ; Column13.BackColor = 244,250,255, ;
Column13.ColumnOrder = 16, ; Column13.ColumnOrder = 17, ;
Column13.ControlSource = "pereched", ; Column13.ControlSource = "pereched", ;
Column13.FontCharSet = 238, ; Column13.FontCharSet = 238, ;
Column13.FontName = "Arial", ; Column13.FontName = "Arial", ;
@@ -7295,7 +7300,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column13.ReadOnly = .F., ; Column13.ReadOnly = .F., ;
Column13.Width = 106, ; Column13.Width = 106, ;
Column14.BackColor = 244,250,255, ; Column14.BackColor = 244,250,255, ;
Column14.ColumnOrder = 31, ; Column14.ColumnOrder = 32, ;
Column14.ControlSource = "explicatia4", ; Column14.ControlSource = "explicatia4", ;
Column14.FontCharSet = 238, ; Column14.FontCharSet = 238, ;
Column14.FontName = "Arial", ; Column14.FontName = "Arial", ;
@@ -7304,7 +7309,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column14.ReadOnly = .F., ; Column14.ReadOnly = .F., ;
Column14.Width = 120, ; Column14.Width = 120, ;
Column15.BackColor = 244,250,255, ; Column15.BackColor = 244,250,255, ;
Column15.ColumnOrder = 24, ; Column15.ColumnOrder = 25, ;
Column15.ControlSource = "nrord", ; Column15.ControlSource = "nrord", ;
Column15.FontCharSet = 238, ; Column15.FontCharSet = 238, ;
Column15.FontName = "Arial", ; Column15.FontName = "Arial", ;
@@ -7312,7 +7317,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column15.Name = "Column15", ; Column15.Name = "Column15", ;
Column15.ReadOnly = .F., ; Column15.ReadOnly = .F., ;
Column16.BackColor = 244,250,255, ; Column16.BackColor = 244,250,255, ;
Column16.ColumnOrder = 26, ; Column16.ColumnOrder = 27, ;
Column16.ControlSource = "nresp", ; Column16.ControlSource = "nresp", ;
Column16.FontCharSet = 238, ; Column16.FontCharSet = 238, ;
Column16.FontName = "Arial", ; Column16.FontName = "Arial", ;
@@ -7322,7 +7327,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column16.Name = "Column16", ; Column16.Name = "Column16", ;
Column16.ReadOnly = .F., ; Column16.ReadOnly = .F., ;
Column17.BackColor = 244,250,255, ; Column17.BackColor = 244,250,255, ;
Column17.ColumnOrder = 27, ; Column17.ColumnOrder = 28, ;
Column17.ControlSource = "dst_chlt", ; Column17.ControlSource = "dst_chlt", ;
Column17.FontCharSet = 238, ; Column17.FontCharSet = 238, ;
Column17.FontName = "Arial", ; Column17.FontName = "Arial", ;
@@ -7332,7 +7337,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column17.Name = "Column17", ; Column17.Name = "Column17", ;
Column17.ReadOnly = .F., ; Column17.ReadOnly = .F., ;
Column18.BackColor = 244,250,255, ; Column18.BackColor = 244,250,255, ;
Column18.ColumnOrder = 32, ; Column18.ColumnOrder = 33, ;
Column18.ControlSource = "explicatia5", ; Column18.ControlSource = "explicatia5", ;
Column18.FontCharSet = 238, ; Column18.FontCharSet = 238, ;
Column18.FontName = "Arial", ; Column18.FontName = "Arial", ;
@@ -7341,7 +7346,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column18.ReadOnly = .F., ; Column18.ReadOnly = .F., ;
Column18.Width = 119, ; Column18.Width = 119, ;
Column19.BackColor = 244,250,255, ; Column19.BackColor = 244,250,255, ;
Column19.ColumnOrder = 23, ; Column19.ColumnOrder = 24, ;
Column19.ControlSource = "datascad", ; Column19.ControlSource = "datascad", ;
Column19.FontCharSet = 238, ; Column19.FontCharSet = 238, ;
Column19.FontName = "Arial", ; Column19.FontName = "Arial", ;
@@ -7351,7 +7356,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column19.Visible = .T., ; Column19.Visible = .T., ;
Column19.Width = 87, ; Column19.Width = 87, ;
Column20.BackColor = 244,250,255, ; Column20.BackColor = 244,250,255, ;
Column20.ColumnOrder = 28, ; Column20.ColumnOrder = 29, ;
Column20.ControlSource = "suma_val", ; Column20.ControlSource = "suma_val", ;
Column20.FontCharSet = 238, ; Column20.FontCharSet = 238, ;
Column20.FontName = "Arial", ; Column20.FontName = "Arial", ;
@@ -7361,7 +7366,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column20.ReadOnly = .F., ; Column20.ReadOnly = .F., ;
Column20.Width = 89, ; Column20.Width = 89, ;
Column21.BackColor = 244,250,255, ; Column21.BackColor = 244,250,255, ;
Column21.ColumnOrder = 30, ; Column21.ColumnOrder = 31, ;
Column21.ControlSource = "curs", ; Column21.ControlSource = "curs", ;
Column21.FontCharSet = 238, ; Column21.FontCharSet = 238, ;
Column21.FontName = "Arial", ; Column21.FontName = "Arial", ;
@@ -7371,7 +7376,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column21.ReadOnly = .F., ; Column21.ReadOnly = .F., ;
Column21.Width = 72, ; Column21.Width = 72, ;
Column22.BackColor = 244,250,255, ; Column22.BackColor = 244,250,255, ;
Column22.ColumnOrder = 33, ; Column22.ColumnOrder = 34, ;
Column22.ControlSource = "gestin", ; Column22.ControlSource = "gestin", ;
Column22.FontCharSet = 238, ; Column22.FontCharSet = 238, ;
Column22.FontName = "Arial", ; Column22.FontName = "Arial", ;
@@ -7380,7 +7385,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column22.ReadOnly = .F., ; Column22.ReadOnly = .F., ;
Column22.Width = 116, ; Column22.Width = 116, ;
Column23.BackColor = 244,250,255, ; Column23.BackColor = 244,250,255, ;
Column23.ColumnOrder = 11, ; Column23.ColumnOrder = 12, ;
Column23.ControlSource = "ascd", ; Column23.ControlSource = "ascd", ;
Column23.FontCharSet = 238, ; Column23.FontCharSet = 238, ;
Column23.FontName = "Arial", ; Column23.FontName = "Arial", ;
@@ -7389,7 +7394,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column23.ReadOnly = .F., ; Column23.ReadOnly = .F., ;
Column23.Width = 46, ; Column23.Width = 46, ;
Column24.BackColor = 244,250,255, ; Column24.BackColor = 244,250,255, ;
Column24.ColumnOrder = 13, ; Column24.ColumnOrder = 14, ;
Column24.ControlSource = "ascc", ; Column24.ControlSource = "ascc", ;
Column24.FontCharSet = 238, ; Column24.FontCharSet = 238, ;
Column24.FontName = "Arial", ; Column24.FontName = "Arial", ;
@@ -7398,7 +7403,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column24.ReadOnly = .F., ; Column24.ReadOnly = .F., ;
Column24.Width = 48, ; Column24.Width = 48, ;
Column25.BackColor = 244,250,255, ; Column25.BackColor = 244,250,255, ;
Column25.ColumnOrder = 38, ; Column25.ColumnOrder = 39, ;
Column25.ControlSource = "id_set", ; Column25.ControlSource = "id_set", ;
Column25.FontCharSet = 238, ; Column25.FontCharSet = 238, ;
Column25.FontName = "Arial", ; Column25.FontName = "Arial", ;
@@ -7407,7 +7412,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column25.ReadOnly = .T., ; Column25.ReadOnly = .T., ;
Column25.Width = 71, ; Column25.Width = 71, ;
Column26.BackColor = 244,250,255, ; Column26.BackColor = 244,250,255, ;
Column26.ColumnOrder = 19, ; Column26.ColumnOrder = 20, ;
Column26.ControlSource = "proc_tva", ; Column26.ControlSource = "proc_tva", ;
Column26.FontCharSet = 238, ; Column26.FontCharSet = 238, ;
Column26.FontName = "Arial", ; Column26.FontName = "Arial", ;
@@ -7416,7 +7421,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column26.ReadOnly = .T., ; Column26.ReadOnly = .T., ;
Column26.Width = 54, ; Column26.Width = 54, ;
Column27.BackColor = 244,250,255, ; Column27.BackColor = 244,250,255, ;
Column27.ColumnOrder = 17, ; Column27.ColumnOrder = 18, ;
Column27.ControlSource = "perechec", ; Column27.ControlSource = "perechec", ;
Column27.FontCharSet = 238, ; Column27.FontCharSet = 238, ;
Column27.FontName = "Arial", ; Column27.FontName = "Arial", ;
@@ -7425,7 +7430,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column27.ReadOnly = .F., ; Column27.ReadOnly = .F., ;
Column27.Width = 104, ; Column27.Width = 104, ;
Column28.BackColor = 244,250,255, ; Column28.BackColor = 244,250,255, ;
Column28.ColumnOrder = 35, ; Column28.ColumnOrder = 36, ;
Column28.ControlSource = "sectie", ; Column28.ControlSource = "sectie", ;
Column28.FontCharSet = 238, ; Column28.FontCharSet = 238, ;
Column28.FontName = "Arial", ; Column28.FontName = "Arial", ;
@@ -7434,7 +7439,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column28.ReadOnly = .F., ; Column28.ReadOnly = .F., ;
Column28.Width = 88, ; Column28.Width = 88, ;
Column29.BackColor = 244,250,255, ; Column29.BackColor = 244,250,255, ;
Column29.ColumnOrder = 29, ; Column29.ColumnOrder = 30, ;
Column29.ControlSource = "nume_val", ; Column29.ControlSource = "nume_val", ;
Column29.FontCharSet = 238, ; Column29.FontCharSet = 238, ;
Column29.FontName = "Arial", ; Column29.FontName = "Arial", ;
@@ -7443,7 +7448,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column29.ReadOnly = .F., ; Column29.ReadOnly = .F., ;
Column29.Width = 79, ; Column29.Width = 79, ;
Column30.BackColor = 244,250,255, ; Column30.BackColor = 244,250,255, ;
Column30.ColumnOrder = 39, ; Column30.ColumnOrder = 40, ;
Column30.ControlSource = "id_partd", ; Column30.ControlSource = "id_partd", ;
Column30.FontCharSet = 238, ; Column30.FontCharSet = 238, ;
Column30.FontName = "Arial", ; Column30.FontName = "Arial", ;
@@ -7452,7 +7457,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column30.ReadOnly = .T., ; Column30.ReadOnly = .T., ;
Column30.Width = 55, ; Column30.Width = 55, ;
Column31.BackColor = 244,250,255, ; Column31.BackColor = 244,250,255, ;
Column31.ColumnOrder = 40, ; Column31.ColumnOrder = 41, ;
Column31.ControlSource = "id_partc", ; Column31.ControlSource = "id_partc", ;
Column31.FontCharSet = 238, ; Column31.FontCharSet = 238, ;
Column31.FontName = "Arial", ; Column31.FontName = "Arial", ;
@@ -7461,7 +7466,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column31.ReadOnly = .T., ; Column31.ReadOnly = .T., ;
Column31.Width = 55, ; Column31.Width = 55, ;
Column32.BackColor = 244,250,255, ; Column32.BackColor = 244,250,255, ;
Column32.ColumnOrder = 34, ; Column32.ColumnOrder = 35, ;
Column32.ControlSource = "gestout", ; Column32.ControlSource = "gestout", ;
Column32.FontCharSet = 238, ; Column32.FontCharSet = 238, ;
Column32.FontName = "Arial", ; Column32.FontName = "Arial", ;
@@ -7470,7 +7475,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column32.ReadOnly = .F., ; Column32.ReadOnly = .F., ;
Column32.Width = 92, ; Column32.Width = 92, ;
Column33.BackColor = 244,250,255, ; Column33.BackColor = 244,250,255, ;
Column33.ColumnOrder = 36, ; Column33.ColumnOrder = 37, ;
Column33.ControlSource = "sucursala", ; Column33.ControlSource = "sucursala", ;
Column33.FontCharSet = 238, ; Column33.FontCharSet = 238, ;
Column33.FontName = "Arial", ; Column33.FontName = "Arial", ;
@@ -7479,7 +7484,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column33.ReadOnly = .F., ; Column33.ReadOnly = .F., ;
Column33.Width = 121, ; Column33.Width = 121, ;
Column34.BackColor = 244,250,255, ; Column34.BackColor = 244,250,255, ;
Column34.ColumnOrder = 25, ; Column34.ColumnOrder = 26, ;
Column34.ControlSource = "contract", ; Column34.ControlSource = "contract", ;
Column34.FontCharSet = 238, ; Column34.FontCharSet = 238, ;
Column34.FontName = "Arial", ; Column34.FontName = "Arial", ;
@@ -7488,7 +7493,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column34.ReadOnly = .T., ; Column34.ReadOnly = .T., ;
Column34.Width = 65, ; Column34.Width = 65, ;
Column35.BackColor = 244,250,255, ; Column35.BackColor = 244,250,255, ;
Column35.ColumnOrder = 20, ; Column35.ColumnOrder = 21, ;
Column35.ControlSource = "explicatie_tva", ; Column35.ControlSource = "explicatie_tva", ;
Column35.FontCharSet = 238, ; Column35.FontCharSet = 238, ;
Column35.FontName = "Arial", ; Column35.FontName = "Arial", ;
@@ -7497,7 +7502,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column35.ReadOnly = .F., ; Column35.ReadOnly = .F., ;
Column35.Width = 136, ; Column35.Width = 136, ;
Column36.BackColor = 244,250,255, ; Column36.BackColor = 244,250,255, ;
Column36.ColumnOrder = 18, ; Column36.ColumnOrder = 19, ;
Column36.ControlSource = "cu_tva", ; Column36.ControlSource = "cu_tva", ;
Column36.FontCharSet = 238, ; Column36.FontCharSet = 238, ;
Column36.FontName = "Arial", ; Column36.FontName = "Arial", ;
@@ -7517,7 +7522,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column37.ReadOnly = .F., ; Column37.ReadOnly = .F., ;
Column37.Width = 58, ; Column37.Width = 58, ;
Column38.BackColor = 244,250,255, ; Column38.BackColor = 244,250,255, ;
Column38.ColumnOrder = 41, ; Column38.ColumnOrder = 42, ;
Column38.ControlSource = "id_fact", ; Column38.ControlSource = "id_fact", ;
Column38.FontCharSet = 238, ; Column38.FontCharSet = 238, ;
Column38.FontName = "Arial", ; Column38.FontName = "Arial", ;
@@ -7526,7 +7531,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column38.ReadOnly = .T., ; Column38.ReadOnly = .T., ;
Column38.Width = 94, ; Column38.Width = 94, ;
Column39.BackColor = 244,250,255, ; Column39.BackColor = 244,250,255, ;
Column39.ColumnOrder = 42, ; Column39.ColumnOrder = 43, ;
Column39.ControlSource = "id_factd", ; Column39.ControlSource = "id_factd", ;
Column39.FontCharSet = 238, ; Column39.FontCharSet = 238, ;
Column39.FontName = "Arial", ; Column39.FontName = "Arial", ;
@@ -7535,7 +7540,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column39.ReadOnly = .T., ; Column39.ReadOnly = .T., ;
Column39.Width = 75, ; Column39.Width = 75, ;
Column40.BackColor = 244,250,255, ; Column40.BackColor = 244,250,255, ;
Column40.ColumnOrder = 43, ; Column40.ColumnOrder = 44, ;
Column40.ControlSource = "id_factc", ; Column40.ControlSource = "id_factc", ;
Column40.FontCharSet = 238, ; Column40.FontCharSet = 238, ;
Column40.FontName = "Arial", ; Column40.FontName = "Arial", ;
@@ -7555,7 +7560,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column41.Width = 22, ; Column41.Width = 22, ;
Column42.BackColor = 244,250,255, ; Column42.BackColor = 244,250,255, ;
Column42.Bound = .F., ; Column42.Bound = .F., ;
Column42.ColumnOrder = 21, ; Column42.ColumnOrder = 22, ;
Column42.ControlSource = "Iif(Seek(tAct.taxcode,'saft_taxtable','taxcode'),saft_taxtable.taxname,'')", ; Column42.ControlSource = "Iif(Seek(tAct.taxcode,'saft_taxtable','taxcode'),saft_taxtable.taxname,'')", ;
Column42.CurrentControl = "_combobox1", ; Column42.CurrentControl = "_combobox1", ;
Column42.FontCharSet = 238, ; Column42.FontCharSet = 238, ;
@@ -7566,7 +7571,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column42.Width = 184, ; Column42.Width = 184, ;
Column43.BackColor = 244,250,255, ; Column43.BackColor = 244,250,255, ;
Column43.Bound = .F., ; Column43.Bound = .F., ;
Column43.ColumnOrder = 22, ; Column43.ColumnOrder = 23, ;
Column43.ControlSource = "Iif(Seek(tAct.paymentcode,'saft_mecanisme_plati','mcode'),saft_mecanisme_plati.paymentname,'')", ; Column43.ControlSource = "Iif(Seek(tAct.paymentcode,'saft_mecanisme_plati','mcode'),saft_mecanisme_plati.paymentname,'')", ;
Column43.CurrentControl = "_combobox1", ; Column43.CurrentControl = "_combobox1", ;
Column43.FontCharSet = 238, ; Column43.FontCharSet = 238, ;
@@ -7574,7 +7579,17 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
Column43.Name = "Column43", ; Column43.Name = "Column43", ;
Column43.ReadOnly = .F., ; Column43.ReadOnly = .F., ;
Column43.Sparse = .F., ; Column43.Sparse = .F., ;
Column43.Width = 146 Column43.Width = 146, ;
Column44.Alignment = 1, ;
Column44.BackColor = 244,250,255, ;
Column44.ColumnOrder = 7, ;
Column44.ControlSource = "nnir", ;
Column44.FontCharSet = 238, ;
Column44.FontName = "Arial", ;
Column44.FontSize = 10, ;
Column44.Name = "Column44", ;
Column44.ReadOnly = .F., ;
Column44.Width = 60
*< END OBJECT: BaseClass="grid" /> *< END OBJECT: BaseClass="grid" />
ADD OBJECT 'Grid1.cAles._CHECKBOX1' AS _checkbox WITH ; ADD OBJECT 'Grid1.cAles._CHECKBOX1' AS _checkbox WITH ;
@@ -8442,6 +8457,29 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
SelectedBackColor = 49,106,197 SelectedBackColor = 49,106,197
*< END OBJECT: BaseClass="textbox" /> *< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'Grid1.Column44.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Nr. NIR", ;
FontCharSet = 238, ;
FontName = "Arial", ;
FontSize = 10, ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'Grid1.Column44.Text1' AS textbox WITH ;
Alignment = 1, ;
BackColor = 244,250,255, ;
BorderStyle = 0, ;
FontCharSet = 238, ;
FontName = "Arial", ;
FontSize = 10, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .F., ;
SelectedBackColor = 49,106,197
*< END OBJECT: BaseClass="textbox" />
ADD OBJECT 'Grid1.Column5.Header5' AS header WITH ; ADD OBJECT 'Grid1.Column5.Header5' AS header WITH ;
Alignment = 2, ; Alignment = 2, ;
Caption = "Nr.Doc.", ; Caption = "Nr.Doc.", ;
@@ -13613,6 +13651,9 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
This.grid1.Anchor = 11 This.grid1.Anchor = 11
This.but_renunt1.Anchor = 8 This.but_renunt1.Anchor = 8
If This.nid_set = 90101
This.grid1.Column44.ReadOnly = .T.
Endif
ENDPROC ENDPROC
PROCEDURE Load PROCEDURE Load
@@ -13683,6 +13724,19 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
this.gridextra1.setup() this.gridextra1.setup()
LOCAL lcPrefFile, lcPrefFileContents, lcKey, lcPrefs
LOCAL ARRAY laNnirPrefs(1)
lcPrefFile = This.gridextra1.GetUserApplicationDataPath() + This.gridextra1.GridPreferenceFile
lcPrefFileContents = ""
IF FILE(m.lcPrefFile)
lcPrefFileContents = FILETOSTR(m.lcPrefFile)
ENDIF
lcKey = SYS(1272, This.grid1) + "("
lcPrefs = STREXTRACT(m.lcPrefFileContents, m.lcKey, ")", 1, 1)
*!* pozitioneaza coloana la prima deschidere, cat timp preferintele salvate nu o acopera
IF EMPTY(m.lcPrefs) OR ALINES(laNnirPrefs, m.lcPrefs, 7, ",") < This.grid1.ColumnCount * 2
This.grid1.Column44.ColumnOrder = 7
ENDIF
this.grid1.SetAll("dynamicbackcolor", "IIF(ALES, RGB(255,255,225), RGB(255,255,255))", "Column") this.grid1.SetAll("dynamicbackcolor", "IIF(ALES, RGB(255,255,225), RGB(255,255,255))", "Column")
This.CalculeazaTotal() This.CalculeazaTotal()
*!* 24.05.2011 ^ *!* 24.05.2011 ^
@@ -13717,6 +13771,37 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
ENDPROC ENDPROC
PROCEDURE sincronizeaza_nnir
*!* propaga NNIR-ul modificat pe toate liniile notei si pe rulajele asociate
LPARAMETERS tnNnirVechi, tnNnirNou
LOCAL lcSelect, lnRecno
IF NVL(m.tnNnirVechi, 0) = NVL(m.tnNnirNou, 0)
RETURN
ENDIF
lcSelect = SELECT()
lnRecno = RECNO('tact')
UPDATE tact SET nnir = m.tnNnirNou WHERE NVL(nnir, 0) = m.tnNnirVechi
IF USED('trul')
UPDATE trul SET nnir = m.tnNnirNou WHERE NVL(nnir, 0) = m.tnNnirVechi
IF _TALLY > 0
Thisform.pgfArticole.page1.grdRulaje.Refresh()
ENDIF
ENDIF
IF USED('trul_obinv')
UPDATE trul_obinv SET nnir = m.tnNnirNou WHERE NVL(nnir, 0) = m.tnNnirVechi
IF _TALLY > 0
Thisform.pgfArticole.page2.grdRulajeObinv.Refresh()
ENDIF
ENDIF
SELECT tact
IF BETWEEN(m.lnRecno, 1, RECCOUNT('tact'))
GO m.lnRecno
ELSE
GO TOP
ENDIF
SELECT (m.lcSelect)
ENDPROC
PROCEDURE updateexplicatiesaft PROCEDURE updateexplicatiesaft
* Daca nu este activata SAFT 406 nu fac nimic * Daca nu este activata SAFT 406 nu fac nimic
IF !m.gl406 IF !m.gl406
@@ -14201,6 +14286,10 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
.Column35.ReadOnly = .T. && cod .Column35.ReadOnly = .T. && cod
.Column25.ReadOnly = .T. && id_set .Column25.ReadOnly = .T. && id_set
ENDWITH ENDWITH
*!* pastreaza blocarea NNIR pentru notele de inventar (id_set = 90101)
IF Thisform.nid_set = 90101
This.Column44.ReadOnly = .T.
ENDIF
*!* 10.08.2011 ^ *!* 10.08.2011 ^
*!* pot selecta inregistrari din alte sucursale pentru operatiile de copiere, adaugare care *!* pot selecta inregistrari din alte sucursale pentru operatiile de copiere, adaugare care
This.cAles.ReadOnly = .F. This.cAles.ReadOnly = .F.
@@ -14674,6 +14763,19 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
thisform.cPaymentCode = ALLTRIM(tAct.paymentcode) thisform.cPaymentCode = ALLTRIM(tAct.paymentcode)
ENDPROC ENDPROC
PROCEDURE Grid1.Column44.Text1.LostFocus
Local lnNnirNou, lnNnirVechi
lnNnirVechi = thisform.nnnirvechi
lnNnirNou = NVL(tAct.nnir, 0)
Thisform.sincronizeaza_nnir(m.lnNnirVechi, m.lnNnirNou)
Thisform.nnnirvechi = m.lnNnirNou
Thisform.Grid1.Refresh()
ENDPROC
PROCEDURE Grid1.Column44.Text1.When
Thisform.nnnirvechi = NVL(tAct.nnir, 0)
ENDPROC
PROCEDURE Grid1.Column6.Text1.InteractiveChange PROCEDURE Grid1.Column6.Text1.InteractiveChange
ADDPROPERTY(this, 'lInteractiveChange') ADDPROPERTY(this, 'lInteractiveChange')
LOCAL lnIdPart LOCAL lnIdPart

View File

@@ -0,0 +1,17 @@
# Capcana: coloana noua intr-un grid existent ajunge la coada (preferinte GridExtras)
`GridExtras` (`COMUN\utile\GridExtras\gridextras.vc2:1051`, `restoregridpreferences` /
`savegridpreferences`) salveaza **per utilizator** latimea si ordinea coloanelor fiecarui grid,
in `%APPDATA%\...\gridprefs.tmp`, sub cheia `SYS(1272, grid)` (ex. `frm_modific2024.grid1`).
Salvarea se face live, la `columnmoved`/`columnresize`, nu la iesirea din formular.
Consecinta: `ColumnOrder` setat in clasa e neutralizat la runtime pentru orice utilizator care a
deschis deja formularul inainte de livrare - `gridextra1.setup()` restaureaza ordinea veche, iar
coloana nou adaugata (care nu exista in preferinte) ajunge ultima.
Solutie: repozitionare la runtime, in `Show()`, **dupa** `gridextra1.setup()`, aplicata o singura
data - cat timp preferintele salvate nu acopera toate coloanele (implementat pe
`frm_modific2024`, `COMUN\clase\omodificari.vc2`, coloana `nnir`).
La testare: pozitia coloanei nu e o asertiune stabila intre masini. Se asertesteaza tare
`ControlSource` si `ReadOnly`; `ColumnOrder` ramane informativ.

View File

@@ -76,6 +76,10 @@ fals `roundtrip text1 != text2`. Ruleaza atunci cu lista rebazata:
- Metoda noua de clasa cere `*m: nume` in `*<DefinedPropArrayMethod>`; fara ea, prima salvare - Metoda noua de clasa cere `*m: nume` in `*<DefinedPropArrayMethod>`; fara ea, prima salvare
din IDE o arunca tacut, iar refresh-ul urmator absoarbe pierderea in cache (si in .bak-uri). din IDE o arunca tacut, iar refresh-ul urmator absoarbe pierderea in cache (si in .bak-uri).
Override-urile de metode de baza (Init, Show, hook-uri) nu au nevoie de `*m:`. Override-urile de metode de baza (Init, Show, hook-uri) nu au nevoie de `*m:`.
- FoxBin2Prg NU pastreaza pozitia in text a unei metode noi: o regenereaza la pozitia
alfabetica din `*<DefinedPropArrayMethod>`. O metoda scrisa in alta parte a fisierului
face fidelity-check-ul sa pice. Sursa de adevar pentru relocare e textul regenerat din
`<staging>\verify\` - muta metoda unde apare acolo si reia write-back-ul.
- Salvarea din VFP IDE peste un binar scris de txt2vcx poate PIERDE si definitii `*m:` deja - Salvarea din VFP IDE peste un binar scris de txt2vcx poate PIERDE si definitii `*m:` deja
existente, desi corpurile PROCEDURE raman (patit pe ROAGEST: `import_adauga_factura.recalc_tva`, existente, desi corpurile PROCEDURE raman (patit pe ROAGEST: `import_adauga_factura.recalc_tva`,
`import_nota.do_adauga/do_copie/do_reface`); simptom: crash la Createobject cu `import_nota.do_adauga/do_copie/do_reface`); simptom: crash la Createobject cu

View File

@@ -0,0 +1,53 @@
# Flux: modificare/stergere nota in Registrul Jurnal
Comportament CORECT (nu bug): la **modificarea** unei note din Registrul Jurnal, documentul
original nu se suprascrie. Se marcheaza `sters = 1` pe randurile vechi (`ACT`/`RUL`/`RUL_OBINV`),
apoi se scrie un document NOU cu alt `cod`, pastrand acelasi `id_fact`/`id_factd`. Ambele operatii
ruleaza intr-o tranzactie manuala unica (commit sau rollback pe amandoua).
## Unde
- `afisjurcom.do_modifica` - `COMUN\clase\comun.vc2:2222-2562`. Deschide tranzactia manuala
(`Thisform.do_deschide_tranzactie()`, linia 2448), apoi `oscrie_in_fisiere(2,...)` = STERGE
(linia 2451), apoi `oscrie_in_fisiere(0,...)` = SCRIE (linia 2479), apoi
`pack_contafin.finalizeaza_modificare_nota(...)` (2484-2486), apoi
`Thisform.do_inchide_tranzactie(...)` (linia 2535) - commit daca tot ce a rulat inainte a
reusit, rollback altfel.
- `do_deschide_tranzactie`/`do_inchide_tranzactie` (`_frmbase`, `COMUN\clase\_frm_base.vc2:252,279`;
varianta identica ca procedura globala in `COMUN\programe\oproceduri_rulaje.prg:287,303`):
`SQLSetProp(gnHandle,'Transactions',2)` la deschidere, `SQLCOMMIT`/`SQLROLLBACK` +
`SQLSetProp(...,'Transactions',1)` la inchidere.
- `oscrie_in_fisiere.prg` (`COMUN\programe\oscrie_in_fisiere.prg`): `tnScrie_Sterge` 0=scriere,
2=stergere. Apeleaza server-side `pack_contafin.init_scriere_act_rul_local` +
`final_scriere_act_rul_local` -> `finalizeaza_scriere_act_rul`, care ruleaza `SCRIE_IN_ACT`
(scriere) sau `STERGE_DIN_ACT` (stergere) din `PACK_CONTAFIN.pck`.
- `PACK_CONTAFIN.STERGE_DIN_ACT` (`COMUN\docs\PACK_CONTAFIN.pck:1815-1859`):
`UPDATE ACT SET STERS = 1 ... WHERE COD = tnCod` - marcheaza vechiul document, pe `cod`-ul vechi.
- `PACK_CONTAFIN.SCRIE_IN_ACT` (`PACK_CONTAFIN.pck:630-901`): `LN_COD := pack_contafin.GET_COD()`
(linia 648) aloca un `cod` nou; `UPDATE ACT_TEMP SET COD = LN_COD, ...` (linia 897) il scrie pe
noul document - `ID_FACT` nu e atins, ramane cel din documentul original.
- `PACK_CONTAFIN.finalizeaza_modificare_nota` (`PACK_CONTAFIN.pck:8601-8651`): aloca din nou
`lnCodNou := pack_contafin.get_cod()` si actualizeaza pe codul nou `vanzari`
(`pack_facturare.actualizeaza_vanzari`) si `atasamente_vanzari`. `nom_lucrari` se actualizeaza
DOAR pentru `id_set IN (31003,31004,31005,31011)` (repune `id_fact`), nu general. `gest_inventar`
NU se leaga de `cod`-ul nou - se identifica dupa `dataora_validat + an + luna` (cazul
`id_set = 90101`, note de inventariere).
## Atentie: nu e valabil la fel pentru stergerea simpla
`afisjurcom.do_sterge` (`comun.vc2:2565-2724`) ofera doua optiuni (`xmenu`, linia 2625):
- **Stergere document** (`lnOptiune = 1`): DOAR `OSCRIE_IN_FISIERE(2,...)` + `finalizeaza_stergere_nota`
- marcheaza `sters = 1`, NU se creeaza document nou.
- **Anulare document** (`lnOptiune = 2`): STERGE (linia 2698) + SCRIE (linia 2709, cu sumele puse pe
0) - creeaza si document nou, la fel ca la modificare - dar aici cele doua apeluri NU sunt
invelite intr-o tranzactie manuala comuna (nu apare `do_deschide_tranzactie`/
`do_inchide_tranzactie` in `do_sterge`); fiecare `OSCRIE_IN_FISIERE` isi gestioneaza singur
commit-ul (vezi `tlModificare`/`llManualTransactions` in `oscrie_in_fisiere.prg:111-165`).
## Implicatii practice
- Codul (`cod`) unui document din Registrul Jurnal NU e stabil dupa modificare/anulare - se schimba
la fiecare editare. Cod hardcodat sau retinut dintr-o executare anterioara devine invalid.
- Regasirea documentului editat se face dupa `id_fact` (sau alt marcaj stabil), niciodata dupa `cod`.
- Randurile `sters = 1` ramase in `ACT`/`RUL`/`RUL_OBINV` dupa o modificare sunt normale (istoric),
nu date corupte sau duplicate de curatat.

View File

@@ -60,6 +60,8 @@
`0xBA` strica `a`/`t` cu caciula (`0xE3`, `0xFE`) din alte fisiere; `0xBA` strica `a`/`t` cu caciula (`0xE3`, `0xFE`) din alte fisiere;
- adaugi/rearanjezi controale pe formulare sau coloane in grid -> `conventie_ux_formulare.md`; - adaugi/rearanjezi controale pe formulare sau coloane in grid -> `conventie_ux_formulare.md`;
- grid needitabil pe formular cu 2+ grid-uri -> `capcana_grid_controlsource.md`; - grid needitabil pe formular cu 2+ grid-uri -> `capcana_grid_controlsource.md`;
- adaugi o coloana intr-un grid deja livrat (ordinea din clasa e neutralizata de
preferintele salvate per utilizator) -> `capcana_grid_preferinte_utilizator.md`;
- `GO` pe un `Recno()` capturat/primit ca parametru -> `conventie_go_recno.md`; - `GO` pe un `Recno()` capturat/primit ca parametru -> `conventie_go_recno.md`;
- `ALTER TABLE` pe cursorul intors de `goExecutor.oExecute()` -> `conventie_goexecutor_alter_table.md`; - `ALTER TABLE` pe cursorul intors de `goExecutor.oExecute()` -> `conventie_goexecutor_alter_table.md`;
- testare UI / prin MCP -> `testare-ui-vfp.md`, `testare-vfp-mcp.md`; - testare UI / prin MCP -> `testare-ui-vfp.md`, `testare-vfp-mcp.md`;

View File

@@ -0,0 +1,121 @@
# Date de test - NNIR editabil in Registru Jurnal
Baza: `MARIUSM_AUTO@ROA_CENTRAL` (test, nu productie). Verificare: `verif_nnir_cod.sql` in acest
folder (`sqlplus ... @verif_nnir_cod.sql <cod>`).
| Caz | COD | AN | LUNA | ID_SET | NNIR curent | ACT randuri | RUL randuri | RUL_OBINV randuri |
|---|---|---|---|---|---|---|---|---|
| NIR/achizitie (principal) | 1140841 | 2026 | 7 | 209 | 3 | 7 (doar 1 cu nnir=3, restul 0) | 1 (nnir=3) | 0 |
| Obiecte de inventar | 1140835 | 2026 | 6 | 211 | 2026060001 | 1 | 0 | 2 (nnir=2026060001) |
| Fara rulaje | 1140848 | 2026 | 7 | 209 | 124 | 2 (ambele nnir=124) | 0 | 0 |
| Nota de inventar (blocare) | 1140716 | 2026 | 3 | 90101 | 2026030004 | 1 | 1 (nnir=2026030004) | 0 |
Note:
- ACT e pe linii (nu pe antet) - la COD 1140841 doar linia efectiv legata de rulaj are NNIR-ul
real, restul liniilor documentului au NNIR=0. Sincronizarea (`WHERE Nvl(nnir,0) = vechi`) trebuie
sa lase liniile cu 0 neatinse.
- Nu exista nicio nota cu `id_set=90101` sau cu rulaje in `RUL_OBINV` in luna curenta de lucru
(AN=2026, LUNA=7) - alese din perioade anterioare. Editarea reala prin `afisjurcom.do_modifica`
e limitata la luna curenta (`comun.vc2:2265-2268`); testul instantiaza `frm_modific2024` direct
(ca `test_repro_cnrcrt_footer.prg`), cu cursoare construite pe AN/LUNA propriu notei, ocolind
acel filtru - la fel ca precedentul deja acceptat in `achizitie_import`.
## Stare implementare (livrata, 03.08.2026)
`COMUN\clase\omodificari.vc2` (frm_modific2024):
- `Grid1.ColumnCount = 44`, `Column44.ControlSource = "nnir"` (la runtime apare calificat automat
de VFP cu aliasul cursorului: `tact.nnir`), `ReadOnly = .F.` - confirmat prin instantiere reala
(nu doar citire de sursa).
- `PROCEDURE sincronizeaza_nnir(tnNnirVechi, tnNnirNou)` (`omodificari.vc2:13762`) - update pe
`tact`/`trul`/`trul_obinv` unde `Nvl(nnir,0) = vechi`, cu revenire pe recno. Propaga si valoarea
0 (stergerea NNIR) - nu exista garda `EMPTY` pe valoarea noua.
- Legare pe coloana: `Grid1.Column44.Text1.When` retine valoarea veche in `thisform.nnnirvechi`;
**`Grid1.Column44.Text1.LostFocus`** apeleaza `sincronizeaza_nnir` si `Thisform.Grid1.Refresh()`
- `Valid` a fost eliminat (la textbox valoarea nu ajunge in ControlSource decat DUPA ce Valid
returneaza .T., deci nu propaga). Testul declanseaza `LostFocus`.
- Blocarea pentru `id_set = 90101` (nota de inventar): in `Init` (`omodificari.vc2:13654`) SI
reimpusa in `Grid1.AfterRowColChange` (14289-14292), dupa `SetAll("ReadOnly", ...)` - fara a doua,
`SetAll` anuleaza blocarea la prima navigare in grid.
- `ColumnOrder = 7` in clasa, plus repozitionare la runtime in `Show()`, dupa `gridextra1.setup()`
(13729-13738) - preferintele de grid salvate per utilizator impingeau coloana noua la coada
(vezi `COMUN\docs\capcana_grid_preferinte_utilizator.md`). Pozitia NU e o asertiune stabila intre
masini; asertat tare in test: `ControlSource = "nnir"`, `ReadOnly` (.F. normal / .T. pe
id_set 90101), propagarea valorii.
## Cerinte de mediu descoperite la construirea harness-ului (deja tratate in scripturile livrate)
- `COMUN\utile\Teste\test_init_env_auto.prg` (generic) e de fapt specific ROACONT (`gcAppPath`,
classlib-uri si proceduri hardcodate `D:\ROA\ROACONT\`) - inutilizabil pentru ROAGEST. S-a scris
`COMUN\utile\Teste\test_init_env_auto_roagest.prg`, cu SET PATH/CLASSLIB/PROCEDURE reconstruite
din `Programe\roagest.prg`.
- `gcUserName` trebuie setat explicit inainte de `optiuni_firma` (`oinit_optiuni.prg`) - altfel
`SCRIE_OPTIUNI(gcUserName)` da "Operator/operand type mismatch" (PUBLIC nedeclarat ramane
logic .F.). **`gcUserName` e schema/userul de conectare Oracle** (`Programe\roagest.prg:560,575`)
- `SCRIE_OPTIUNI` il foloseste direct in `from <gcUserName>.optiuni`, deci trebuie
`gcUserName = m.gcS`, NU un nume de persoana (ex. 'MARIUS M' da ORA-00907, identificator invalid
- incercare gresita initiala). Numele de persoana e `gcUserNameApp` (variabila separata).
- `frm_modific2024` face `Seek(..,'crsJtvaTemp','id_jtva')` in ControlSource-ul coloanei de
explicatie TVA a rulajelor (Column63) - evaluat la CONSTRUCTIA formularului. Fara cursorul
deschis, `CREATEOBJECT('frm_modific2024',...)` pica cu "File 'crsjtvatemp.dbf' does not exist".
Fix: `update_jtva_coloane('', 'crsJtvaTemp', 6)` (in `COMUN\programe\updateserver.prg:553`)
inainte de instantiere - construieste direct cursorul cu indexul cerut, fara pasii intermediari
folositi de exemplul ROACONT (`update_jtva_coloana`/`crsExplicatiiTVATemp`, care oricum nu
exista in ROAGEST).
- Mock-ul `amessagebox` trebuie incarcat **INAINTE** de `test_init_env_auto_roagest.prg` (nu doar
dupa, cum sugereaza exemplele din `achizitie_import`) - `optiuni_firma` poate afisa un dialog
real daca `SCRIE_OPTIUNI` raporteaza eroare, inainte sa apuce sa se incarce mock-ul "la coada".
- La citirea unei coloane de grid prin ControlSource dintr-un cursor legat ca RecordSource, VFP
calificat automat campul simplu cu aliasul (`nnir` -> `tact.nnir`) - comparatiile exacte
`== 'NNIR'` trebuie sa accepte si forma calificata.
- Coloanele de grid nu sunt garantat numite `Column<N>` - unele au `Name` custom (ex. `cAles` pe
pozitia 41 in acest grid); accesul dinamic la coloana trebuie facut prin colectia
`Grid1.Columns(i)`, nu prin constructia textuala a numelui `"column" + TRANSFORM(i)`.
- `frm_modific2024.Grid1.AfterRowColChange` are propria logica de blocare pe sucursala (SetAll
ReadOnly pe toate coloanele daca `Nvl(gnIdSucursala,0) <> Nvl(tAct.id_sucursala,0)`) - independenta
de blocarea 90101, se declanseaza automat la pozitionare in grid. COD 1140835 (cazul obiecte de
inventar) are `id_sucursala` diferit de sesiunea de test (`gnIdSucursala = NULL`), deci Column44
iese `ReadOnly=.T.` in acest scenariu - nu e o eroare, e comportament existent, neplanificat de
NNIR; sincronizarea tot functioneaza (apelul e direct, nu prin UI).
- **Termin reatribuie COD nou**: `afisjurcom.do_modifica` (comun.vc2:2444-2487) cheama
`oscrie_in_fisiere` de DOUA ori - intai `(2,.T.,llRul)` (STERGE, marcheaza `sters=1` pe COD-ul
ORIGINAL, din `actactan` neatins de editare), apoi `(0,.T.,llRul)` (SCRIE varianta editata sub
COD nou, generat de `pack_contafin`, sub AN/LUNA de sesiune curenta - nu pastreaza COD-ul/AN/LUNA
notei editate). Verificarea si curatenia testului se fac dupa NNIR (marcaj distinct), nu dupa
COD, si readuc nota originala la `sters=0` dupa test (pasul STERGE o dezactiveaza altfel permanent).
- Salvarea reala cere tranzactie manuala explicita: `SQLSetProp(gnHandle,'Transactions',2)` inainte
de blocul STERGE+SCRIE+finalizeaza, apoi `SQLCOMMIT(gnHandle)`/`SQLROLLBACK` +
`SQLSetProp(...,1)` dupa - echivalentul direct al `thisform.do_deschide_tranzactie()`/
`do_inchide_tranzactie()` din `afisjurcom` (`_frm_base.vc2:252-305`, mostenite, apelate pe
formularul de jurnal - nu pe `frm_modific2024`, deci invizibile la o privire doar pe clasa notei).
Fara acest wrapping, `oscrie_in_fisiere`/`finalizeaza_modificare_nota` raporteaza succes dar nu
se vede nimic persistat, nici in aceeasi sesiune.
## Capcana: dialog modal "Enter the value for <var>" in loc de eroare catchabila
O variabila memorie lipsa/umbrita folosita ca `?param` intr-un SQL pass-through (SQLEXEC/
`goExecutor.oExecuta`) NU da o eroare VFP catchabila (ON ERROR) - deschide dialogul nativ
"View Parameter" ("Enter the value for <var>"), MODAL, care blocheaza tot procesul headless la
nesfarsit si nu lasa nimic in log (spre deosebire de un `REPLACE`/expresie cu aceeasi variabila
lipsa, care DA eroare catchabila - vezi cazul `gnIdUtil` scapat o data ca `PRIVATE` neasignat).
Simptom: proces `vfp9.exe` care nu mai raspunde, fara `.ERR`, fara linie noua in log.
Remediu: **garda explicita inainte de orice rulare care ajunge la cod ce foloseste `?param`** -
verifica `TYPE(<nume>) == 'U'` pe toate variabilele relevante (nu doar cele proprii testului, ci
si cele din codul apelat: `oscrie_in_fisiere`, `pack_contafin`/`pack_sesiune`, `oinit_optiuni.prg`)
si opreste testul cu FAIL clar in log daca lipseste ceva, inainte sa ajunga la SQLEXEC. Implementat
in `test_nnir_sincronizare.prg` (`NnirGardaVariabile`, apelata imediat dupa init mediu). `TYPE()`
returneaza `'X'` (nu `'U'`) pentru NULL - o valoare NULL e un bind valid, doar variabila absenta
e problema.
## Rezultat test complet (03.08.2026, pe binarul livrat)
**33 PASS, 0 FAIL** pe cele 6 scenarii: NIR, obiecte de inventar si nota fara rulaje (toate cu
salvare reala prin Termin + verificare in Oracle), blocare `id_set=90101`, `NNIR -> 0`, si blocare
`id_set=90101` pe sucursala curenta. Baza de test verificata dupa rulare: cele 4 note originale
(1140841, 1140835, 1140848, 1140716) raman intacte (NNIR si `sters` la valorile initiale); notele
noi create de Termin (COD reatribuit) au fost marcate `sters=1` de curatenia din test.
Scenariul 6 (`INVENTAR2`) exista pentru ca scenariul 4 ruleaza pe o nota din ALTA sucursala, unde
`AfterRowColChange` blocheaza oricum tot gridul - trecea din motivul gresit. Scenariul 6 aliniaza
`gnIdSucursala` la nota (`llReadOnly` iese `.F.`) si asertesteaza si ca restul coloanelor raman
editabile, altfel blocarea NNIR nu dovedeste nimic.

View File

@@ -0,0 +1,837 @@
* test_nnir_sincronizare.prg
* Test e2e (fluxul real): NNIR editabil in Registru Jurnal, cu sincronizare in tact/trul/trul_obinv
* si in ACT/RUL/RUL_OBINV (Oracle). Vezi cerinta initiala (todos.txt pct. 9) si
* date_test_nnir.md (datele de test alese, an/luna/cod, stare implementare la data scrierii).
*
* Instantiaza frm_modific2024 direct (ca test_repro_cnrcrt_footer.prg din achizitie_import),
* cu cursoarele tact/trul/trul_obinv construite exact ca afisjurcom.do_modifica (comun.vc2:2352-
* 2434), dar pe AN/LUNA proprii notei - do_modifica limiteaza editarea la luna curenta de lucru
* (comun.vc2:2265-2268), iar notele de test nu sunt toate in luna curenta.
*
* Editarea NNIR se simuleaza ca un utilizator: pozitionare pe rand, declansarea evenimentelor
* reale ale coloanei (When la intrare, LostFocus la iesire - textboxul nu comite valoarea in
* ControlSource inainte de Valid, de-aia implementarea sincronizeaza pe LostFocus), NU apel
* direct al metodei de sincronizare. Salvarea (Termin) replica blocul din
* afisjurcom.do_modifica (comun.vc2:2456-2487): oscrie_in_fisiere + pack_contafin.
* finalizeaza_modificare_nota. Termin reatribuie COD nou (pack_contafin), sub AN/LUNA de sesiune
* curenta - nu pastreaza COD-ul original; verificarea si curatenia de dupa salvare se fac dupa
* valoarea NNIR marcaj (nu poate coincide cu date reale), marcand sters=1 (conventia aplicatiei)
* orice a ajuns sub acea valoare - nota originala (COD/NNIR vechi) ramane intacta.
*
* Rulare headless (nu tine VFP IDE deschis; nu rula cu roagest.exe pornit):
* & "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T ;
* "D:\ROA\ROAGEST\COMUN\utile\Teste\nnir_registru_jurnal\test_nnir_sincronizare.prg"
* Timeout recomandat: minim 220s. Log: %TEMP%\test_nnir_sincronizare_log.txt (PASS/FAIL pe linie).
LPARAMETERS tcMode
tcMode = IIF(EMPTY(tcMode), 'ALL', UPPER(ALLTRIM(tcMode)))
SET SAFETY OFF
SET TALK OFF
PUBLIC gcLogFile, gnFail, gnPass
gcLogFile = ADDBS(SYS(2023)) + 'test_nnir_sincronizare_log.txt'
gnFail = 0
gnPass = 0
STRTOFILE('START ' + tcMode + ' ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLogFile)
ON ERROR DO NnirErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
* mock amessagebox incarcat INAINTE de mediul aplicatiei: optiuni_firma (in mediul de test)
* poate afisa un dialog real daca SCRIE_OPTIUNI raporteaza eroare
SET PROCEDURE TO D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
DO D:\ROA\ROAGEST\COMUN\utile\Teste\test_init_env_auto_roagest.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO NnirLog WITH 'EROARE: conectare Oracle esuata'
DO NnirLog WITH 'REZULTAT SUITA: NEDETERMINAT'
QUIT
ENDIF
DO NnirLog WITH 'mediu OK, gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna)
* garda anti-blocaj: o variabila lipsa folosita ca ?param intr-un SQL pass-through NU da eroare
* catchabila - VFP deschide dialogul modal nativ "Enter the value for <var>", care blocheaza
* headless-ul la nesfarsit si nu lasa nimic in log (vezi date_test_nnir.md). Verificare
* explicita INAINTE de orice apel care le foloseste, opreste testul cu FAIL clar daca lipseste ceva.
IF !NnirGardaVariabile()
DO NnirLog WITH 'REZULTAT SUITA: NEDETERMINAT (garda variabile a picat)'
QUIT
ENDIF
* mock amessagebox - se incarca ULTIMUL (dupa fisierele aplicatiei), vezi antetul mock-ului
SET PROCEDURE TO D:\ROA\ROAGEST\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
* Grid1.Column63 (explicatie TVA pe rulaje) face Seek pe alias 'crsJtvaTemp' la CONSTRUCTIA
* formularului (inainte de Init) - fara cursorul deschis, CREATEOBJECT('frm_modific2024',...)
* pica cu "File 'crsjtvatemp.dbf' does not exist"
update_jtva_coloane('', 'crsJtvaTemp', 6)
LOCAL Omodif, lcCallWhen, lcCallLostFocus, lcCall
*=====================================================================================
* Scenariul 1: NIR/achizitie, cu rulaje in RUL, cu salvare (Termin) + verificare Oracle
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'NIR')
LOCAL lnCod, lnAn, lnLuna, lnIdSet, lnNnirVechi, lnNnirNou
LOCAL lnCntTactVechi, lnCntTrulVechi, lnCntTactNou, lnCntTrulNou
LOCAL i, llGasit, lnColOrder, llReadOnly, lnColCheck, lcColName
lnCod = 1140841
lnAn = 2026
lnLuna = 7
lnIdSet = 209
lnNnirVechi = 3
lnNnirNou = lnNnirVechi + 90000000
DO NnirConstruiesteCursoare WITH lnCod, lnAn, lnLuna
SELECT tact
lnCntTactVechi = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi TO lnCntTactVechi
SELECT trul
lnCntTrulVechi = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi TO lnCntTrulVechi
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'NIR', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasit = .F.
lnColOrder = 0
llReadOnly = .T.
lnColCheck = 0
FOR i = 1 TO Omodif.grid1.ColumnCount
lcColName = 'Omodif.grid1.Columns(' + TRANSFORM(i) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName + '.ControlSource'))
llGasit = .T.
lnColOrder = EVALUATE(lcColName + '.ColumnOrder')
llReadOnly = EVALUATE(lcColName + '.ReadOnly')
lnColCheck = i
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'NIR', llGasit, 'ControlSource=nnir gasit=' + ;
TRANSFORM(llGasit) + ' ColumnOrder=' + TRANSFORM(lnColOrder) + ' ReadOnly=' + TRANSFORM(llReadOnly)
IF llGasit
DO NnirAssert WITH 'coloana_editabila', 'NIR', !llReadOnly, 'nota normala: ReadOnly asteptat .F.'
SELECT tact
LOCATE FOR NVL(nnir,0) = lnNnirVechi
IF FOUND()
lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck) + ').Text1.When'
&lcCallWhen
REPLACE nnir WITH lnNnirNou
lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck) + ').Text1.LostFocus'
&lcCallLostFocus
SELECT tact
lnCntTactNou = 0
COUNT FOR NVL(nnir,0) = lnNnirNou TO lnCntTactNou
DO NnirAssert WITH 'sync_tact', 'NIR', lnCntTactNou = lnCntTactVechi, ;
TRANSFORM(lnCntTactNou) + ' randuri tact cu nnir nou (asteptat ' + TRANSFORM(lnCntTactVechi) + ')'
* trul = cursorul legat de pgfArticole.page1.grdRulaje (RecordSource) - verificare
* explicita ca propagarea se vede in cursorul de rulaje, nu doar in tact
SELECT trul
lnCntTrulNou = 0
COUNT FOR NVL(nnir,0) = lnNnirNou TO lnCntTrulNou
DO NnirAssert WITH 'sync_trul', 'NIR', lnCntTrulNou = lnCntTrulVechi, ;
TRANSFORM(lnCntTrulNou) + ' randuri trul (grid rulaje) cu nnir nou (asteptat ' + TRANSFORM(lnCntTrulVechi) + ')'
ELSE
DO NnirAssert WITH 'locate_rand_vechi', 'NIR', .F., 'nu s-a gasit randul cu nnir vechi in tact'
ENDIF
ENDIF
DO NnirVerificaOracleNeschimbat WITH lnCod, lnNnirVechi, 'NIR'
Omodif.Release()
Omodif = NULL
DO NnirSalveazaSiVerifica WITH lnCod, lnAn, lnLuna, lnIdSet, lnNnirVechi, lnNnirNou, 'NIR'
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 2: obiecte de inventar, cu rulaje in RUL_OBINV, cu salvare + verificare Oracle
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'OBINV')
LOCAL lnCod2, lnAn2, lnLuna2, lnIdSet2, lnNnirVechi2, lnNnirNou2
LOCAL lnCntTactVechi2, lnCntRobinvVechi2, lnCntTactNou2, lnCntRobinvNou2
LOCAL i2, llGasit2, lnColOrder2, llReadOnly2, lnColCheck2, lcColName2
lnCod2 = 1140835
lnAn2 = 2026
lnLuna2 = 6
lnIdSet2 = 211
lnNnirVechi2 = 2026060001
lnNnirNou2 = lnNnirVechi2 + 90000000
DO NnirConstruiesteCursoare WITH lnCod2, lnAn2, lnLuna2
SELECT tact
lnCntTactVechi2 = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi2 TO lnCntTactVechi2
SELECT trul_obinv
lnCntRobinvVechi2 = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi2 TO lnCntRobinvVechi2
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet2)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'OBINV', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasit2 = .F.
lnColOrder2 = 0
llReadOnly2 = .T.
lnColCheck2 = 0
FOR i2 = 1 TO Omodif.grid1.ColumnCount
lcColName2 = 'Omodif.grid1.Columns(' + TRANSFORM(i2) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName2 + '.ControlSource'))
llGasit2 = .T.
lnColOrder2 = EVALUATE(lcColName2 + '.ColumnOrder')
llReadOnly2 = EVALUATE(lcColName2 + '.ReadOnly')
lnColCheck2 = i2
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'OBINV', llGasit2, 'ControlSource=nnir gasit=' + ;
TRANSFORM(llGasit2) + ' ColumnOrder=' + TRANSFORM(lnColOrder2) + ' ReadOnly=' + TRANSFORM(llReadOnly2)
IF llGasit2
SELECT tact
LOCATE FOR NVL(nnir,0) = lnNnirVechi2
IF FOUND()
lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck2) + ').Text1.When'
&lcCallWhen
REPLACE nnir WITH lnNnirNou2
lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck2) + ').Text1.LostFocus'
&lcCallLostFocus
SELECT tact
lnCntTactNou2 = 0
COUNT FOR NVL(nnir,0) = lnNnirNou2 TO lnCntTactNou2
DO NnirAssert WITH 'sync_tact', 'OBINV', lnCntTactNou2 = lnCntTactVechi2, ;
TRANSFORM(lnCntTactNou2) + ' randuri tact cu nnir nou (asteptat ' + TRANSFORM(lnCntTactVechi2) + ')'
SELECT trul_obinv
lnCntRobinvNou2 = 0
COUNT FOR NVL(nnir,0) = lnNnirNou2 TO lnCntRobinvNou2
DO NnirAssert WITH 'sync_trul_obinv', 'OBINV', lnCntRobinvNou2 = lnCntRobinvVechi2, ;
TRANSFORM(lnCntRobinvNou2) + ' randuri trul_obinv cu nnir nou (asteptat ' + TRANSFORM(lnCntRobinvVechi2) + ')'
ELSE
DO NnirAssert WITH 'locate_rand_vechi', 'OBINV', .F., 'nu s-a gasit randul cu nnir vechi in tact'
ENDIF
ENDIF
Omodif.Release()
Omodif = NULL
DO NnirSalveazaSiVerificaObinv WITH lnCod2, lnAn2, lnLuna2, lnIdSet2, lnNnirVechi2, lnNnirNou2
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 3: nota fara rulaje - regresie (nu crapa), cu salvare + verificare Oracle
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'FARARUL')
LOCAL lnCod3, lnAn3, lnLuna3, lnIdSet3, lnNnirVechi3, lnNnirNou3
LOCAL lnCntTactVechi3, lnCntTactNou3
LOCAL i3, llGasit3, lnColCheck3, lcColName3
lnCod3 = 1140848
lnAn3 = 2026
lnLuna3 = 7
lnIdSet3 = 209
lnNnirVechi3 = 124
lnNnirNou3 = lnNnirVechi3 + 90000000
DO NnirConstruiesteCursoare WITH lnCod3, lnAn3, lnLuna3
SELECT tact
lnCntTactVechi3 = 0
COUNT FOR NVL(nnir,0) = lnNnirVechi3 TO lnCntTactVechi3
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet3)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'FARARUL', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasit3 = .F.
lnColCheck3 = 0
FOR i3 = 1 TO Omodif.grid1.ColumnCount
lcColName3 = 'Omodif.grid1.Columns(' + TRANSFORM(i3) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName3 + '.ControlSource'))
llGasit3 = .T.
lnColCheck3 = i3
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'FARARUL', llGasit3, 'ControlSource=nnir gasit=' + TRANSFORM(llGasit3)
IF llGasit3
SELECT tact
LOCATE FOR NVL(nnir,0) = lnNnirVechi3
IF FOUND()
lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck3) + ').Text1.When'
&lcCallWhen
REPLACE nnir WITH lnNnirNou3
lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheck3) + ').Text1.LostFocus'
&lcCallLostFocus
SELECT tact
lnCntTactNou3 = 0
COUNT FOR NVL(nnir,0) = lnNnirNou3 TO lnCntTactNou3
DO NnirAssert WITH 'sync_tact', 'FARARUL', lnCntTactNou3 = lnCntTactVechi3, ;
TRANSFORM(lnCntTactNou3) + ' randuri tact cu nnir nou (asteptat ' + TRANSFORM(lnCntTactVechi3) + ')'
DO NnirAssert WITH 'nu_crapa', 'FARARUL', .T., 'editarea pe nota fara rulaje nu a generat eroare'
ELSE
DO NnirAssert WITH 'locate_rand_vechi', 'FARARUL', .F., 'nu s-a gasit randul cu nnir vechi in tact'
ENDIF
ENDIF
Omodif.Release()
Omodif = NULL
DO NnirSalveazaSiVerifica WITH lnCod3, lnAn3, lnLuna3, lnIdSet3, lnNnirVechi3, lnNnirNou3, 'FARARUL'
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 4: nota de inventar (id_set=90101) - regresie blocare editare NNIR
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'INVENTAR')
LOCAL lnCod4, lnAn4, lnLuna4, lnIdSet4
LOCAL i4, llGasit4, llReadOnly4, lcColName4
lnCod4 = 1140716
lnAn4 = 2026
lnLuna4 = 3
lnIdSet4 = 90101
DO NnirConstruiesteCursoare WITH lnCod4, lnAn4, lnLuna4
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet4)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'INVENTAR', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasit4 = .F.
llReadOnly4 = .F.
FOR i4 = 1 TO Omodif.grid1.ColumnCount
lcColName4 = 'Omodif.grid1.Columns(' + TRANSFORM(i4) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName4 + '.ControlSource'))
llGasit4 = .T.
llReadOnly4 = EVALUATE(lcColName4 + '.ReadOnly')
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'INVENTAR', llGasit4, 'ControlSource=nnir gasit=' + TRANSFORM(llGasit4)
IF llGasit4
* nu se incearca editarea - doar se verifica blocarea, ca sa nu se altereze o nota
* reala de inventar cat timp blocarea nu e implementata
DO NnirAssert WITH 'coloana_blocata', 'INVENTAR', llReadOnly4, ;
'id_set=90101: ReadOnly asteptat .T., gasit ' + TRANSFORM(llReadOnly4)
ENDIF
Omodif.Release()
Omodif = NULL
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 5: stergere NNIR (-> 0) pe randul unei note cu rulaje - propagare la 0.
* Comportament nou (runda 4): garda EMPTY(NVL(tnNnirNou,0)) eliminata din sincronizeaza_nnir,
* ramane doar egalitatea - stergerea celulei (0 scris pe rand inainte de LostFocus) trebuie sa
* se propage la toate liniile cu valoarea veche, nu doar schimbarile intre doua valori nenule.
* Doar la nivel de cursoare (tact/trul) - nu se salveaza in Oracle.
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'ZERO')
LOCAL lnCodZ, lnAnZ, lnLunaZ, lnIdSetZ, lnNnirVechiZ
LOCAL lnCntTactVechiZ, lnCntTrulVechiZ, lnCntTactRamasVechiZ, lnCntTrulRamasVechiZ
LOCAL lnCntTactZeroZ, lnCntTrulZeroZ
LOCAL iz, llGasitZ, lnColCheckZ, lcColNameZ
lnCodZ = 1140841
lnAnZ = 2026
lnLunaZ = 7
lnIdSetZ = 209
lnNnirVechiZ = 3
DO NnirConstruiesteCursoare WITH lnCodZ, lnAnZ, lnLunaZ
SELECT tact
lnCntTactVechiZ = 0
COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTactVechiZ
SELECT trul
lnCntTrulVechiZ = 0
COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTrulVechiZ
Omodif = CREATEOBJECT('frm_modific2024', lnIdSetZ)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'ZERO', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
llGasitZ = .F.
lnColCheckZ = 0
FOR iz = 1 TO Omodif.grid1.ColumnCount
lcColNameZ = 'Omodif.grid1.Columns(' + TRANSFORM(iz) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColNameZ + '.ControlSource'))
llGasitZ = .T.
lnColCheckZ = iz
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'ZERO', llGasitZ, 'ControlSource=nnir gasit=' + TRANSFORM(llGasitZ)
IF llGasitZ
SELECT tact
LOCATE FOR NVL(nnir,0) = lnNnirVechiZ
IF FOUND()
lcCallWhen = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheckZ) + ').Text1.When'
&lcCallWhen
* simuleaza stergerea celulei: utilizatorul goleste campul, valoarea ajunge 0
REPLACE nnir WITH 0
lcCallLostFocus = 'Omodif.grid1.Columns(' + TRANSFORM(lnColCheckZ) + ').Text1.LostFocus'
&lcCallLostFocus
SELECT tact
lnCntTactRamasVechiZ = 0
COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTactRamasVechiZ
lnCntTactZeroZ = 0
COUNT FOR NVL(nnir,0) = 0 TO lnCntTactZeroZ
DO NnirAssert WITH 'sync_tact_zero', 'ZERO', lnCntTactRamasVechiZ = 0 AND lnCntTactZeroZ >= lnCntTactVechiZ, ;
TRANSFORM(lnCntTactRamasVechiZ) + ' randuri tact au ramas pe valoarea veche (asteptat 0), ' + ;
TRANSFORM(lnCntTactZeroZ) + ' au ajuns la 0 (asteptat cel putin ' + TRANSFORM(lnCntTactVechiZ) + ')'
* verificare explicita in cursorul legat de grid-ul de rulaje (pgfArticole.page1.grdRulaje)
SELECT trul
lnCntTrulRamasVechiZ = 0
COUNT FOR NVL(nnir,0) = lnNnirVechiZ TO lnCntTrulRamasVechiZ
lnCntTrulZeroZ = 0
COUNT FOR NVL(nnir,0) = 0 TO lnCntTrulZeroZ
DO NnirAssert WITH 'sync_trul_zero', 'ZERO', lnCntTrulRamasVechiZ = 0 AND lnCntTrulZeroZ >= lnCntTrulVechiZ, ;
TRANSFORM(lnCntTrulRamasVechiZ) + ' randuri trul au ramas pe valoarea veche (asteptat 0), ' + ;
TRANSFORM(lnCntTrulZeroZ) + ' au ajuns la 0 (asteptat cel putin ' + TRANSFORM(lnCntTrulVechiZ) + ')'
ELSE
DO NnirAssert WITH 'locate_rand_vechi', 'ZERO', .F., 'nu s-a gasit randul cu nnir vechi in tact'
ENDIF
ENDIF
Omodif.Release()
Omodif = NULL
ENDIF
DO NnirCurataCursoare
ENDIF
*=====================================================================================
* Scenariul 6: nota de inventar (id_set=90101) pe sucursala CURENTA - blocarea NNIR trebuie sa
* vina din regula 90101, nu din blocarea pe sucursala din AfterRowColChange. Scenariul 4 ruleaza
* pe o nota din alta sucursala, unde SetAll("ReadOnly",.T.) blocheaza oricum tot gridul, deci ar
* trece si fara implementare. Aici gnIdSucursala se aliniaza la id_sucursala notei (llReadOnly
* iese .F.), se declanseaza AfterRowColChange (care face SetAll dupa Init) si se verifica ca
* Column44 ramane blocata cat timp restul coloanelor sunt editabile.
*=====================================================================================
IF INLIST(tcMode, 'ALL', 'INVENTAR2')
LOCAL lnCod6, lnAn6, lnLuna6, lnIdSet6
LOCAL i6, llGasit6, llReadOnly6, lnEditabile6, lnSucVechi6, llMamaVechi6
LOCAL lnIdSucNota6, lcColName6
lnCod6 = 1140716
lnAn6 = 2026
lnLuna6 = 3
lnIdSet6 = 90101
DO NnirConstruiesteCursoare WITH lnCod6, lnAn6, lnLuna6
SELECT tact
GO TOP
lnIdSucNota6 = NVL(tact.id_sucursala, 0)
lnSucVechi6 = gnIdSucursala
llMamaVechi6 = glEMama
gnIdSucursala = lnIdSucNota6
glEMama = .F.
Omodif = CREATEOBJECT('frm_modific2024', lnIdSet6)
IF VARTYPE(Omodif) <> 'O'
DO NnirAssert WITH 'instantiere', 'INVENTAR2', .F., 'frm_modific2024 nu s-a instantiat'
ELSE
SELECT tact
GO TOP
Omodif.grid1.SetFocus
Omodif.gridextra1.setup()
Omodif.CalculeazaTotal()
* AfterRowColChange face SetAll("ReadOnly", llReadOnly) peste blocarea pusa in Init
Omodif.grid1.AfterRowColChange(1)
llGasit6 = .F.
llReadOnly6 = .F.
lnEditabile6 = 0
FOR i6 = 1 TO Omodif.grid1.ColumnCount
lcColName6 = 'Omodif.grid1.Columns(' + TRANSFORM(i6) + ')'
IF NnirEsteColoanaNnir(EVALUATE(lcColName6 + '.ControlSource'))
llGasit6 = .T.
llReadOnly6 = EVALUATE(lcColName6 + '.ReadOnly')
ELSE
IF !EVALUATE(lcColName6 + '.ReadOnly')
lnEditabile6 = lnEditabile6 + 1
ENDIF
ENDIF
ENDFOR
DO NnirAssert WITH 'coloana_grid', 'INVENTAR2', llGasit6, 'ControlSource=nnir gasit=' + TRANSFORM(llGasit6)
* control: daca gridul e blocat integral, testul de blocare NNIR nu dovedeste nimic
DO NnirAssert WITH 'grid_editabil', 'INVENTAR2', lnEditabile6 > 0, ;
'coloane editabile (fara nnir): ' + TRANSFORM(lnEditabile6) + ' (asteptat > 0, ' + ;
'gnIdSucursala=' + TRANSFORM(lnIdSucNota6) + ')'
IF llGasit6
DO NnirAssert WITH 'coloana_blocata', 'INVENTAR2', llReadOnly6, ;
'id_set=90101 pe sucursala curenta: ReadOnly asteptat .T., gasit ' + TRANSFORM(llReadOnly6)
ENDIF
Omodif.Release()
Omodif = NULL
ENDIF
gnIdSucursala = lnSucVechi6
glEMama = llMamaVechi6
DO NnirCurataCursoare
ENDIF
DO NnirLog WITH 'REZULTAT SUITA: ' + TRANSFORM(gnPass) + ' PASS, ' + TRANSFORM(gnFail) + ' FAIL'
QUIT
*=====================================================================================
* proceduri ajutatoare (fara CREATEOBJECT - vezi depanare_testare_vfp.md / capcana l:
* CREATEOBJECT apelat dintr-o procedura se comporta gresit in acest runtime headless)
*=====================================================================================
PROCEDURE NnirLog
LPARAMETERS tcMsg
STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLogFile, 1)
ENDPROC
PROCEDURE NnirAssert
LPARAMETERS tcPas, tcCaz, llOk, tcDetaliu
LOCAL lcRez
lcRez = IIF(llOk, 'PASS', 'FAIL')
IF llOk
gnPass = gnPass + 1
ELSE
gnFail = gnFail + 1
ENDIF
DO NnirLog WITH lcRez + ' [' + tcCaz + '/' + tcPas + '] ' + tcDetaliu
ENDPROC
PROCEDURE NnirErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO NnirLog WITH 'ERR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
* verifica ca toate variabilele folosite ca ?param in SQL pass-through pe calea de test (env-init,
* optiuni_firma, oscrie_in_fisiere, pack_contafin/pack_sesiune) sunt definite - o variabila
* PUBLIC lipsa/umbrita da direct dialogul modal "Enter the value for <var>", nu o eroare catchabila
FUNCTION NnirGardaVariabile
LOCAL laVar(9), i, llOk
laVar(1) = 'gnIdUtil'
laVar(2) = 'gnAn'
laVar(3) = 'gnLuna'
laVar(4) = 'gnIdFirma'
laVar(5) = 'gnIdSucursala'
laVar(6) = 'gcS'
laVar(7) = 'gnIdProgram'
laVar(8) = 'gnId_Prg_Owner'
laVar(9) = 'gnHandle'
llOk = .T.
FOR i = 1 TO ALEN(laVar)
IF TYPE(laVar(i)) == 'U'
DO NnirLog WITH 'FAIL [garda_variabile] ' + laVar(i) + ' nu exista (TYPE U) - ar fi dat dialog modal "Enter the value"'
llOk = .F.
ENDIF
ENDFOR
RETURN llOk
ENDFUNC
* VFP calificat automat ControlSource-ul unui camp simplu cu aliasul cursorului (RecordSource) -
* "nnir" definit in sursa apare la runtime ca "tact.nnir" - se accepta ambele forme
FUNCTION NnirEsteColoanaNnir
LPARAMETERS tcControlSource
LOCAL lcCs
lcCs = UPPER(ALLTRIM(TRANSFORM(tcControlSource)))
RETURN lcCs == 'NNIR' OR RIGHT(lcCs, 5) == '.NNIR'
ENDFUNC
* construieste tact/trul/trul_obinv exact ca afisjurcom.do_modifica (comun.vc2:2352-2434),
* dar pe AN/LUNA proprii notei (nu gnAn/gnLuna) - vezi antetul fisierului
PROCEDURE NnirConstruiesteCursoare
LPARAMETERS tnCod, tnAn, tnLuna
LOCAL lcSql, lnSucces
DO NnirCurataCursoare
lcSql = [select * from vact_tot where sters = 0 and an = ] + TRANSFORM(tnAn) + ;
[ and luna = ] + TRANSFORM(tnLuna) + [ and cod = ] + TRANSFORM(tnCod) + [ order by id_act]
lnSucces = goExecutor.oExecute(lcSql, 'v_act')
goExecutor.oReset()
IF lnSucces < 0
DO NnirLog WITH 'EROARE construire tact: ' + goExecutor.cEroare
RETURN .F.
ENDIF
SELECT * FROM v_act INTO CURSOR actactan
SELECT .F. AS ales, T.*, CAST(0 AS N(2)) AS tipnota FROM actactan T INTO CURSOR tact READWRITE
USE IN v_act
lcSql = [select * from vrul_tot where sters = 0 and an = ] + TRANSFORM(tnAn) + ;
[ and luna = ] + TRANSFORM(tnLuna) + [ and cod = ] + TRANSFORM(tnCod) + [ order by id_rul]
goExecutor.oExecute(lcSql, 'v_rul')
goExecutor.oReset()
SELECT *, valoare + valtva AS valoarectva, valoarev + valtvav AS valoarevctva ;
FROM v_rul INTO CURSOR RUL_TEMP READWRITE
SELECT * FROM RUL_TEMP INTO CURSOR trul READWRITE
USE IN v_rul
lcSql = [select * from vrul_obinv_tot where sters = 0 and an = ] + TRANSFORM(tnAn) + ;
[ and luna = ] + TRANSFORM(tnLuna) + [ and cod = ] + TRANSFORM(tnCod) + [ order by id_rul_obinv]
goExecutor.oExecute(lcSql, 'v_rul_obinv')
goExecutor.oReset()
SELECT *, valoare + valtva AS valoarectva, valoarev + valtvav AS valoarevctva ;
FROM v_rul_obinv INTO CURSOR RUL_TEMP_OBINV READWRITE
SELECT * FROM RUL_TEMP_OBINV INTO CURSOR trul_obinv READWRITE
USE IN v_rul_obinv
SELECT a.*, IIF(NVL(a.id_jtva_coloana,0)=0,0,1) AS cu_tva FROM tact a INTO CURSOR tact READWRITE
SELECT tact
GO TOP
RETURN .T.
ENDPROC
PROCEDURE NnirCurataCursoare
IF USED('tact')
USE IN tact
ENDIF
IF USED('trul')
USE IN trul
ENDIF
IF USED('trul_obinv')
USE IN trul_obinv
ENDIF
IF USED('actactan')
USE IN actactan
ENDIF
IF USED('rul_temp')
USE IN rul_temp
ENDIF
IF USED('rul_temp_obinv')
USE IN rul_temp_obinv
ENDIF
ENDPROC
FUNCTION NnirOraCount
LPARAMETERS tcSql
LOCAL lnVal, llOk
lnVal = -1
llOk = goExecutor.oExecuta(tcSql, 'cNnirOraCnt')
IF llOk AND USED('cNnirOraCnt') AND RECCOUNT('cNnirOraCnt') > 0
lnVal = cNnirOraCnt.cnt
ENDIF
IF USED('cNnirOraCnt')
USE IN cNnirOraCnt
ENDIF
RETURN lnVal
ENDFUNC
* verifica ca in Oracle nu s-a scris nimic dupa editarea DOAR in cursoare (echivalent Renunt)
PROCEDURE NnirVerificaOracleNeschimbat
LPARAMETERS tnCod, tnNnirVechi, tcCaz
LOCAL lnCnt, lcSql
lcSql = [select count(*) cnt from act where cod = ] + TRANSFORM(tnCod) + ;
[ and nnir = ] + TRANSFORM(tnNnirVechi)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'renunt_neschimbat', tcCaz, lnCnt > 0, ;
'ACT.NNIR in Oracle inainte de Termin ramane ' + TRANSFORM(tnNnirVechi) + ' (' + TRANSFORM(lnCnt) + ' randuri)'
ENDPROC
* replica blocul de salvare din afisjurcom.do_modifica (comun.vc2:2456-2487): scrie tact/trul/
* trul_obinv in ACT/RUL/RUL_OBINV prin oscrie_in_fisiere + pack_contafin.finalizeaza_modificare_
* nota, verifica in Oracle, apoi reface valoarea originala (revert - baza de test ramane
* neschimbata pentru rulari repetate)
PROCEDURE NnirSalveazaSiVerifica
LPARAMETERS tnCod, tnAn, tnLuna, tnIdSet, tnNnirVechi, tnNnirNou, tcCaz
PRIVATE pnAn, pnLuna, pdDataOra
LOCAL lnIdFact, lnIdfactd, llRul, lnSuccesSalvare, lcSqlFin, lnCnt, lcSql
pnAn = tnAn
pnLuna = tnLuna
pdDataOra = NULL
SELECT tact
LOCATE FOR NVL(nnir,0) = tnNnirNou
lnIdFact = NVL(id_fact, 0)
lnIdfactd = NVL(id_factd, 0)
llRul = (RECCOUNT('trul') > 0) OR (RECCOUNT('trul_obinv') > 0)
* thisform.do_deschide_tranzactie()/do_inchide_tranzactie() din afisjurcom (_frm_base.vc2:252-
* 305, mostenite, apelate pe formularul de jurnal, nu pe frm_modific2024) - echivalent direct,
* fara instanta de forma: manual pe durata scrierii, apoi commit/rollback + revenire pe auto
SQLSetProp(gnHandle, 'Transactions', 2)
* replica exact secventa din afisjurcom.do_modifica: intai STERGE nota veche (COD-ul
* original, din actactan neatins de editare), abia apoi SCRIE varianta editata
SELECT actactan
lnSuccesSalvare = oscrie_in_fisiere(2, .T., llRul)
DO NnirAssert WITH 'oscrie_in_fisiere_sterge', tcCaz, lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
IF lnSuccesSalvare > 0
SELECT * FROM tact INTO CURSOR actactan READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN actactan
IF llRul
SELECT * FROM trul INTO CURSOR rul_temp READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp
SELECT * FROM trul_obinv INTO CURSOR rul_temp_obinv READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp_obinv
ENDIF
lnSuccesSalvare = oscrie_in_fisiere(0, .T., llRul)
DO NnirAssert WITH 'oscrie_in_fisiere', tcCaz, lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
ENDIF
IF lnSuccesSalvare > 0
lcSqlFin = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,?pdDataOra,] + ;
TRANSFORM(tnIdSet) + [,] + TRANSFORM(tnCod) + [,] + TRANSFORM(lnIdFact) + [,] + ;
TRANSFORM(lnIdfactd) + [,?gnIdUtil); end;]
lnSuccesSalvare = IIF(goExecutor.oExecuta(lcSqlFin), 1, -1)
DO NnirAssert WITH 'finalizeaza_modificare_nota', tcCaz, lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
ENDIF
IF lnSuccesSalvare > 0
SQLCOMMIT(gnHandle)
ELSE
SQLROLLBACK(gnHandle)
ENDIF
SQLSetProp(gnHandle, 'Transactions', 1)
* Termin reatribuie COD nou (pack_contafin), sub AN/LUNA de sesiune curente - nu pastreaza
* COD-ul original notei editate. Verificarea si curatenia se fac dupa valoarea NNIR marcaj
* (distincta, nu poate coincide cu date reale), nu dupa COD-ul original.
lcSql = [select count(*) cnt from act where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'oracle_act_final', tcCaz, lnCnt > 0, TRANSFORM(lnCnt) + ' randuri ACT cu nnir nou in Oracle'
IF RECCOUNT('trul') > 0
lcSql = [select count(*) cnt from rul where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'oracle_rul_final', tcCaz, lnCnt > 0, TRANSFORM(lnCnt) + ' randuri RUL cu nnir nou in Oracle'
ENDIF
* curatenie: pasul STERGE (oscrie_in_fisiere param 2) marcheaza sters=1 pe COD-ul ORIGINAL -
* readuc nota originala activa, apoi marchez sters=1 (conventia aplicatiei) pe orice a ajuns
* sub NNIR-ul marcaj (COD nou, atribuit de pack_contafin la scriere)
goExecutor.oExecuta([update act set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul_obinv set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update act set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul_obinv set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta('commit')
ENDPROC
* varianta pt. scenariul RUL_OBINV (verifica RUL_OBINV in loc de RUL)
PROCEDURE NnirSalveazaSiVerificaObinv
LPARAMETERS tnCod, tnAn, tnLuna, tnIdSet, tnNnirVechi, tnNnirNou
PRIVATE pnAn, pnLuna, pdDataOra
LOCAL lnIdFact, lnIdfactd, llRul, lnSuccesSalvare, lcSqlFin, lnCnt, lcSql
pnAn = tnAn
pnLuna = tnLuna
pdDataOra = NULL
SELECT tact
LOCATE FOR NVL(nnir,0) = tnNnirNou
lnIdFact = NVL(id_fact, 0)
lnIdfactd = NVL(id_factd, 0)
llRul = (RECCOUNT('trul') > 0) OR (RECCOUNT('trul_obinv') > 0)
* thisform.do_deschide_tranzactie()/do_inchide_tranzactie() din afisjurcom (_frm_base.vc2:252-
* 305, mostenite, apelate pe formularul de jurnal, nu pe frm_modific2024) - echivalent direct,
* fara instanta de forma: manual pe durata scrierii, apoi commit/rollback + revenire pe auto
SQLSetProp(gnHandle, 'Transactions', 2)
* replica exact secventa din afisjurcom.do_modifica: intai STERGE nota veche (COD-ul
* original, din actactan neatins de editare), abia apoi SCRIE varianta editata
SELECT actactan
lnSuccesSalvare = oscrie_in_fisiere(2, .T., llRul)
DO NnirAssert WITH 'oscrie_in_fisiere_sterge', 'OBINV', lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
IF lnSuccesSalvare > 0
SELECT * FROM tact INTO CURSOR actactan READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN actactan
IF llRul
SELECT * FROM trul INTO CURSOR rul_temp READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp
SELECT * FROM trul_obinv INTO CURSOR rul_temp_obinv READWRITE
REPLACE ALL id_util WITH gnIdUtil, sters WITH 0 IN rul_temp_obinv
ENDIF
lnSuccesSalvare = oscrie_in_fisiere(0, .T., llRul)
DO NnirAssert WITH 'oscrie_in_fisiere', 'OBINV', lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
ENDIF
IF lnSuccesSalvare > 0
lcSqlFin = [begin pack_contafin.finalizeaza_modificare_nota(?pnLuna,?pnAn,?pdDataOra,] + ;
TRANSFORM(tnIdSet) + [,] + TRANSFORM(tnCod) + [,] + TRANSFORM(lnIdFact) + [,] + ;
TRANSFORM(lnIdfactd) + [,?gnIdUtil); end;]
lnSuccesSalvare = IIF(goExecutor.oExecuta(lcSqlFin), 1, -1)
DO NnirAssert WITH 'finalizeaza_modificare_nota', 'OBINV', lnSuccesSalvare > 0, 'a returnat ' + TRANSFORM(lnSuccesSalvare)
ENDIF
IF lnSuccesSalvare > 0
SQLCOMMIT(gnHandle)
ELSE
SQLROLLBACK(gnHandle)
ENDIF
SQLSetProp(gnHandle, 'Transactions', 1)
* Termin reatribuie COD nou (pack_contafin), sub AN/LUNA de sesiune curente - nu pastreaza
* COD-ul original notei editate. Verificarea si curatenia se fac dupa valoarea NNIR marcaj
* (distincta, nu poate coincide cu date reale), nu dupa COD-ul original.
lcSql = [select count(*) cnt from act where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'oracle_act_final', 'OBINV', lnCnt > 0, TRANSFORM(lnCnt) + ' randuri ACT cu nnir nou in Oracle'
lcSql = [select count(*) cnt from rul_obinv where sters = 0 and nnir = ] + TRANSFORM(tnNnirNou)
lnCnt = NnirOraCount(lcSql)
DO NnirAssert WITH 'oracle_rul_obinv_final', 'OBINV', lnCnt > 0, TRANSFORM(lnCnt) + ' randuri RUL_OBINV cu nnir nou in Oracle'
* curatenie: pasul STERGE (oscrie_in_fisiere param 2) marcheaza sters=1 pe COD-ul ORIGINAL -
* readuc nota originala activa, apoi marchez sters=1 (conventia aplicatiei) pe orice a ajuns
* sub NNIR-ul marcaj (COD nou, atribuit de pack_contafin la scriere)
goExecutor.oExecuta([update act set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul_obinv set sters = 0 where cod = ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update act set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta([update rul_obinv set sters = 1 where nnir = ] + TRANSFORM(tnNnirNou) + [ and cod <> ] + TRANSFORM(tnCod))
goExecutor.oExecuta('commit')
ENDPROC

View File

@@ -0,0 +1,11 @@
-- verif_nnir_cod.sql - NNIR distinct pe ACT/RUL/RUL_OBINV pentru un COD dat
-- Rulare: sqlplus -L -S MARIUSM_AUTO/<parola>@ROA_CENTRAL @verif_nnir_cod.sql <cod>
set pagesize 200 linesize 200 trimspool on feedback off
define v_cod = &1
prompt ==ACT==
select cod, an, luna, id_set, nnir from act where cod = &v_cod;
prompt ==RUL_NNIR_DISTINCT==
select an, luna, nnir, count(*) cnt from rul where cod = &v_cod group by an, luna, nnir;
prompt ==RUL_OBINV_NNIR_DISTINCT==
select an, luna, nnir, count(*) cnt from rul_obinv where cod = &v_cod group by an, luna, nnir;
exit;

View File

@@ -0,0 +1,302 @@
* test_init_env_auto_roagest.prg
* Varianta ROAGEST a test_init_env_auto.prg (acel fisier e specializat pe ROACONT -
* gcAppPath/clase/proceduri hardcodate D:\ROA\ROACONT\ - nu poate initializa mediul ROAGEST).
* Initializare completa de mediu FARA interactiune, pentru vfp9.exe -A -T.
*
* Utilizare:
* DO test_init_env_auto_roagest WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola'
* IF gnHandle <= 0 ... eroare conectare
*
* Dupa apel sunt disponibile: goConn/goExecutor/goApp/goLog/goApi, goFirma/goCalendar,
* gnAn/gnLuna/gcS/gnIdFirma etc., SET PATH/CLASSLIB/PROCEDURE ca in roagest.prg,
* pachetele Oracle de sesiune setate (pack_sesiune/pack_contafin).
* ATENTIE: mentine lista de SET CLASSLIB/PROCEDURE sincronizata cu Programe\roagest.prg.
LPARAMETERS tcHost, tcSchema, tcPassword, tnAn, tnLuna
tcHost = IIF(EMPTY(tcHost), 'CENTRAL', tcHost)
tcSchema = IIF(EMPTY(tcSchema), 'MARIUSM_AUTO', tcSchema)
tcPassword = IIF(EMPTY(tcPassword), 'ROMFASTSOFT', tcPassword)
SET DELETED ON
SET ANSI ON
SET EXACT ON
SET SAFETY OFF
CLOSE DATABASES
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
SET DECIMALS TO 4
SET POINT TO '.'
PUBLIC CT_SUCCES, CT_INSUCCES, crlf, gnAn, gnLuna, gnIdUtil, glEMama, gnIdFirma, gcCondSucursala, ;
gnIdSucursala, gcS, gcFirma, gcUserName, gcUserNameApp, gcNumeProgram, gcAppName, glLunaInchisa, ;
buton, gnButon, pnButon, gl406, gcAcces, gnIdProgram, gnId_Prg_Owner
CT_SUCCES = 1
CT_INSUCCES = -1
crlf = CHR(13) + CHR(10)
gnAn = IIF(EMPTY(tnAn), YEAR(DATE()), tnAn)
gnLuna = IIF(EMPTY(tnLuna), MONTH(DATE()), tnLuna)
gnIdUtil = -3
gnIdProgram = 0
gnId_Prg_Owner = 0
gnIdFirma = 110
gcCondSucursala = []
gnIdSucursala = m.gnIdFirma
gcS = UPPER(ALLTRIM(tcSchema))
gcFirma = m.gcS
gcUserName = m.gcS
gcUserNameApp = [MARIUS M]
gcNumeProgram = [ROAGEST]
gcAppName = [ROAGEST]
glLunaInchisa = .F.
glEMama = .F.
gl406 = .F.
* PUBLIC, nu Declare: nrcrt() (oproceduri_comune.prg) citeste NROR din ControlSource-uri
* de grid mult dupa ce acest program s-a terminat (Declare ar muri la RETURN)
PUBLIC nror(65000)
buton = 1
gnButon = 1
pnButon = 1
LOCAL lcPath
PUBLIC gcAppPath, DIRGEN, gcDirMare, gcBasePath, gcTempPath, gcGeneralIniFile, gcSettingsFile, ;
gcSecurityPath, gcSecurityFile
gcAppPath = [D:\ROA\ROAGEST\]
Set Default To (gcAppPath)
lcPath = gcAppPath + 'Date;' + ;
gcAppPath + 'Include;' + ;
gcAppPath + 'FERESTRE;' + ;
gcAppPath + 'GRAFICE;' + ;
gcAppPath + 'CLASE;' + ;
gcAppPath + 'MENIURI;' + ;
gcAppPath + 'PROGRAME;' + ;
gcAppPath + 'RAPOARTE;' + ;
gcAppPath + 'COMUN;' + ;
gcAppPath + 'COMUN\CLASE;' + ;
gcAppPath + 'COMUN\FERESTRE;' + ;
gcAppPath + 'COMUN\PROGRAME;' + ;
gcAppPath + 'COMUN\GRAFICE;' + ;
gcAppPath + 'COMUN\RAPOARTE;' + ;
gcAppPath + 'COMUN\MENIURI;' + ;
gcAppPath + 'COMUN\UTILE\GRIDEXTRAS;' + ;
gcAppPath + 'COMUN\UTILE\CTL32;' + ;
gcAppPath + 'COMUN\UTILE\HPDF;' + ;
gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ;
gcAppPath + 'COMUN\UTILE\WEB;' + ;
gcAppPath + 'COMUN\UTILE\EXCEL;' + ;
gcAppPath + 'COMUN\UTILE\NFJSON;' + ;
Addbs(Substr(gcAppPath,1,Rat([\],gcAppPath,2)))+[COMUNROA\]
SET PATH TO &lcPath ADDITIVE
Local lcMainClassLib
lcMainClassLib = gcAppPath + "comun\clase\appwiz"
SET CLASSLIB TO (lcMainClassLib) ADDITIVE
SET CLASSLIB TO GESTIUNI ADDITIVE
SET CLASSLIB TO CAUT ADDITIVE
SET CLASSLIB TO BAZA ADDITIVE
SET CLASSLIB TO comun ADDITIVE
SET CLASSLIB TO accessibility.vcx ADDITIVE
SET CLASSLIB TO messagebox ADDITIVE
SET CLASSLIB TO registry ADDITIVE
SET CLASSLIB TO cauta_alfa_forms.vcx ADDITIVE
SET CLASSLIB TO DECABAZA ADDITIVE
SET CLASSLIB TO onomenclatoare ADDITIVE
SET CLASSLIB TO stocuri.vcx ADDITIVE
SET CLASSLIB TO rulaje.vcx ADDITIVE
SET CLASSLIB TO ointroduceri ADDITIVE
SET CLASSLIB TO ointroduceri_web ADDITIVE
SET CLASSLIB TO ointroduceri_depozit ADDITIVE
SET CLASSLIB TO overificari ADDITIVE
SET CLASSLIB TO ferestre_oracle ADDITIVE
SET CLASSLIB TO ferestre_cere_date.vcx ADDITIVE
SET CLASSLIB TO configurare.vcx ADDITIVE
SET CLASSLIB TO serii_numere.vcx ADDITIVE
SET CLASSLIB TO omodificari.vcx ADDITIVE
SET CLASSLIB TO ocompensari.vcx ADDITIVE
SET CLASSLIB TO caut_ora ADDITIVE
SET CLASSLIB TO onote_contabile ADDITIVE
SET CLASSLIB TO otoolbar ADDITIVE
SET CLASSLIB TO bon_fisc ADDITIVE
SET CLASSLIB TO onom_articole ADDITIVE
SET CLASSLIB TO onom_retete ADDITIVE
Set Classlib To oinventar ADDITIVE
SET CLASSLIB TO orapoarte ADDITIVE
SET CLASSLIB TO orapoarte_gestiuni ADDITIVE
SET CLASSLIB TO orapoarte_parametri ADDITIVE
SET CLASSLIB TO ONOM_CURS ADDITIVE
SET CLASSLIB TO ctl32_statusbar_fals.vcx additive
SET CLASSLIB TO ctl32_common.vcx additive
SET CLASSLIB TO ctl32_structs.vcx additive
SET CLASSLIB TO ctl32_progressbar.vcx additive
SET CLASSLIB TO ctl32_balloontip.vcx additive
SET CLASSLIB TO ocriterii.vcx ADDITIVE
SET CLASSLIB TO oavize.vcx ADDITIVE
SET CLASSLIB TO onomenclatoare2 ADDITIVE
Set Classlib To oschimbare_pret.vcx additive
SET CLASSLIB TO wwdialogs.vcx additive
SET CLASSLIB TO oimportxml.vcx additive
SET CLASSLIB TO excelxml.vcx ADDITIVE
SET CLASSLIB TO orapoarte_obinv.vcx ADDITIVE
SET CLASSLIB TO locale ADDITIVE
SET PROCEDURE TO PROCEDURI ADDITIVE
SET PROCEDURE TO acces_meniu ADDITIVE
SET PROCEDURE TO cauta_alfa ADDITIVE
SET PROCEDURE TO pmenu ADDITIVE
SET PROCEDURE TO proceduri_comune ADDITIVE
SET PROCEDURE TO quitapp ADDITIVE
SET PROCEDURE TO init_program ADDITIVE
SET PROCEDURE TO oproceduri_listari.prg ADDITIVE
SET PROCEDURE TO oproceduri_configurare.prg ADDITIVE
SET PROCEDURE TO oproceduri_articole.prg ADDITIVE
SET PROCEDURE TO oproceduri_retete.prg ADDITIVE
SET PROCEDURE TO orapoarte.prg ADDITIVE
SET PROCEDURE TO mesaje ADDITIVE
SET PROCEDURE TO oserii_numere.prg ADDITIVE
SET PROCEDURE TO oexport.prg ADDITIVE
SET PROCEDURE TO wwConfig.prg ADDITIVE
SET PROCEDURE TO proceduri_rapoarte.prg additive
SET PROCEDURE TO OPROCEDURI_CURS.PRG ADDITIVE
Set procedure to orapoarte_dinamice.prg additive
SET PROCEDURE TO validare.prg additive
SET PROCEDURE TO GENCURSOR.PRG ADDITIVE
SET PROCEDURE TO OPROCEDURI_COMUNE.PRG ADDITIVE
SET PROCEDURE TO OINIT_OPTIUNI.PRG ADDITIVE
SET PROCEDURE TO updateserver.prg ADDITIVE
SET PROCEDURE TO oinainte_de.prg ADDITIVE
SET PROCEDURE TO ooperatii_comune.prg ADDITIVE
SET PROCEDURE TO Ocompensari.PRG ADDITIVE
SET PROCEDURE TO OPROCEDURI_aMS.PRG ADDITIVE
SET PROCEDURE TO oproceduri_rulaje additive
SET PROCEDURE TO oproceduri_stocuri additive
SET PROCEDURE TO OINTRODUCERI ADDITIVE
SET PROCEDURE TO oHeader.prg ADDITIVE
SET PROCEDURE TO proceduri_excel.PRG ADDITIVE
SET PROCEDURE TO onomenclatoare.PRG ADDITIVE
SET PROCEDURE TO osecurity ADDITIVE
SET PROCEDURE TO ocautare ADDITIVE
SET PROCEDURE TO orefaceri ADDITIVE
SET PROCEDURE TO ofacturare_comun.PRG ADDITIVE
SET PROCEDURE TO ofacturare_stoc.PRG ADDITIVE
SET PROCEDURE TO oproceduri_casademarcat ADDITIVE
SET PROCEDURE TO oproceduri_casa_marcat_e500 ADDITIVE
SET PROCEDURE TO oproceduri_casa_marcat_mp500 ADDITIVE
SET PROCEDURE TO oproceduri_util.prg ADDITIVE
SET PROCEDURE TO wwxmlhttp.prg ADDITIVE
SET PROCEDURE TO ini.prg ADDITIVE
SET PROCEDURE TO odocumente.prg ADDITIVE
SET PROCEDURE TO regex.prg ADDITIVE
SET PROCEDURE TO wwutils.prg ADDITIVE
SET PROCEDURE TO inchidere_k ADDITIVE
Set procedure to oschimbare_pret.prg additive
SET PROCEDURE TO iniacces.prg ADDITIVE
SET PROCEDURE TO oupdate.prg additive
SET PROCEDURE TO procese.prg additive
SET PROCEDURE TO version.prg additive
SET PROCEDURE TO xmlaccess.prg additive
SET PROCEDURE TO xmlparser.prg additive
SET PROCEDURE TO filebringer.prg additive
SET PROCEDURE TO wwcodeupdate.prg additive
SET PROCEDURE TO wwhttp.prg ADDITIVE
Set Procedure To wwApi.prg Additive
SET PROCEDURE TO xdate.prg Additive
SET PROCEDURE TO ofacturare.prg ADDITIVE
SET PROCEDURE TO oproceduri_obinv.prg ADDITIVE
SET PROCEDURE TO oproceduri_facturare.prg ADDITIVE
SET PROCEDURE TO email.prg ADDITIVE
Declare Integer GetPrivateProfileString In WIN32API ;
string, String, String, String @, Integer, String
Declare Integer WritePrivateProfileString In Win32Api ;
string, String, String, String
Declare Integer CopyFile In WIN32API ;
STRING lpExistingFileName, STRING lpNewFileName, INTEGER bFailIfExists
Declare Integer PathFileExists In shlwapi STRING pszPath
If Type('goApi') = 'U'
Public goApi
goApi = Newobject("wwAPI", "wwAPI.prg")
ENDIF
PUBLIC gnHandle, goExecutor, goConn, goFirma, goCalendar, poLog, goLog, goApp
DIRGEN = [D:\ROA\]
gcDirMare = DIRGEN
gcBasePath = dirgen
gcSecurityPath = DIRGEN + 'Security\'
gcSecurityFile = gcSecurityPath + 'ROA_SECURITY.TXT'
gcGeneralIniFile = DIRGEN + "settings.ini"
gcSettingsFile = m.gcGeneralIniFile
gcTempPath = Addbs(shortpath(goApi.GetTempPath())) + gcS + [\]
If !Directory(gcTempPath)
Md (gcTempPath)
Endif
gcAcces = [1;2;3;4;5;6;7;8;]
poLog = Newobject("Log_Mesaje","Log_Mesaje.prg")
goLog = poLog
goApp = Createobject("wzApplication")
gnHandle = 0
goExecutor = createobject("oExecutor")
goConn = createobject("oConn")
goConn.Connect(m.tcHost, m.tcSchema, m.tcPassword)
IF m.gnHandle <= 0
RETURN .F.
ENDIF
LOCAL llSucces, lcSql
goFirma = null
llSucces = goExecutor.oExecuta("select * from syn_v_nom_firme where schema = ?gcS", "cFirma")
IF m.llSucces
SELECT cFirma
gnIdFirma = id_firma
gnIdSucursala = null
gcFirma = ALLTRIM(firma)
SCATTER NAME goFirma
IF TYPE('goFirma.codfiscalfro') = 'U'
ADDPROPERTY(goFirma, 'codfiscalfro', ALLTRIM(STRTRAN(ALLTRIM(NVL(goFirma.cod_fiscal, '')), 'RO', '')))
ENDIF
ELSE
goFirma = CREATEOBJECT('custom')
goFirma.addproperty('cod_fiscal', '')
goFirma.addproperty('schema', m.gcS)
goFirma.addproperty('firma', m.gcS)
goFirma.addproperty('codfiscalfro', '')
ENDIF
USE IN (SELECT('cFirma'))
goCalendar = null
llSucces = goExecutor.oExecuta('SELECT anul, luna, tva_incasare FROM calendar WHERE an*12+luna = (select MAX(an*12+luna) FROM calendar)', 'cCalendar')
IF m.llSucces
SELECT cCalendar
GO TOP
IF EMPTY(m.tnAn)
gnAn = anul
gnLuna = luna
ENDIF
SCATTER NAME goCalendar
ENDIF
USE IN (SELECT('cCalendar'))
CREATE CURSOR dual (dummy c(10))
INSERT INTO dual (dummy) VALUES ("")
actualizeaza_optiuni()
Do optiuni_firma IN oinit_optiuni.prg
lcSql = [begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.setluna(?gnLuna); pack_sesiune.setan(?gnAn); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.setlunabal(?gnLuna); pack_sesiune.setanbal(?gnAn); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.SET_DATA_RON(?gcS); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.set_data_ron(?gcS); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.set_id_firma(?gnIdFirma); end;]
llSucces = goExecutor.oExecuta(lcSql)
RETURN .T.