Files
comun/utile/Teste/todo21/test_todo21_mesaj_meniu.prg
2026-08-23 10:29:05 +03:00

377 lines
17 KiB
Plaintext

* test_todo21_mesaj_meniu.prg
* TODO #21: regresie pentru D6/D7 (mesajul de detalii grupat pe sectiuni) si D10 (meniul
* scurtat de verificare cod fiscal), ca schimbari ulterioare in formular sa nu le strice tacut.
* Fara HTTP, fara ANAF live, fara Oracle - GetMeniuVerificareCodFiscal/GetOptiuneVerificareCodFiscal/
* verifica_partener_show_info nu depind de ele (doar de parametri si de variabila globala crlf,
* setata mai jos ca in test_init_env_auto.prg).
*
* Pas 1-2: GetMeniuVerificareCodFiscal / GetOptiuneVerificareCodFiscal apelate DIRECT (functii
* pure, fara XMENU in interior).
* Pas 3: aritmetica optiuni_meniu_ante - copiata LITERAL din VerificaCodFiscal
* (COMUN\programe\oproceduri_comune.prg:4960-4967: "lnOptiuneVerificare = m.lnOptiune" apoi
* "lnOptiuneVerificare = m.lnOptiuneVerificare - Occurs(';', m.lcOptiuniMeniuAnte)"), aplicata pe
* o pozitie FABRICATA (nu se apeleaza VerificaCodFiscal, care ar deschide XMENU si ar bloca
* headless-ul).
* Pas 4: verifica_partener_show_info, apelata prin umbra (copie a oproceduri_comune.prg cu
* amessagebox redenumit, ca in test_todo21_perioade_anaf.prg) - amessagebox e inlocuit de
* mock_amessagebox.prg, textul se captureaza in gcMockUltimMesaj fara dialog modal. Obiectele
* partener sunt fabricate (CREATEOBJECT("empty") + ADDPROPERTY), fara verificare reala.
*
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_mesaj_meniu.prg"
* Verdict in log: TOTAL OK / TOTAL FAIL: n pas(i).
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcLog, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns, crlf
gcLog = "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_mesaj_meniu_log.txt"
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 6
crlf = CHR(13) + CHR(10)
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
PUBLIC gnEsecuri
gnEsecuri = 0
ON ERROR DO WriteTestErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- umbra: copie a oproceduri_comune.prg cu FUNCTION amessagebox redenumita, ca apelul din
*-- verifica_partener_show_info sa cada pe mock_amessagebox.prg (fara conflict de nume) si
*-- niciun dialog modal sa nu apara. VFP rezolva numele duplicate de procedura in favoarea
*-- fisierului deschis PRIMUL cu SET PROCEDURE - de-asta mock-ul si umbra se incarca aici,
*-- inaintea oricarui alt cod.
LOCAL lcSrc, lcUmbra
lcUmbra = ADDBS(SYS(2023)) + 'oproceduri_comune_umbra_mesajmeniu.prg'
lcSrc = FILETOSTR("D:\ROA\ROACONT\COMUN\programe\oproceduri_comune.prg")
lcSrc = STRTRAN(lcSrc, CHR(13) + CHR(10) + 'Function amessagebox' + CHR(13) + CHR(10), ;
CHR(13) + CHR(10) + 'Function amessagebox_umbrit_mm' + CHR(13) + CHR(10))
STRTOFILE(lcSrc, lcUmbra)
ERASE (FORCEEXT(lcUmbra, 'fxp'))
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
SET PROCEDURE TO (lcUmbra) ADDITIVE
DO WriteTestLog WITH 'mock si umbra incarcate (fara Oracle - functiile testate nu depind de el)'
*==================================================================
* Pas 1: GetMeniuVerificareCodFiscal - cele 5 pozitii, in ordine, cu cod fiscal prezent
*==================================================================
LOCAL lcMenu, lcMenuAsteptat, lcMenuFaraCod, lcMenuFaraCodAsteptat
lcMenu = GetMeniuVerificareCodFiscal('RO1890420')
lcMenuAsteptat = "VERIFICARE ANAF;VERIFICARE VIES;ISTORIC VERIFICARI COD FISCAL;\-;DESCHIDE FISA PE MFINANTE.RO"
IF m.lcMenu == m.lcMenuAsteptat
DO WriteTestLog WITH 'OK P1a: meniul cu cod fiscal are exact cele 5 pozitii, in ordine'
ELSE
DO WriteTestLog WITH 'FAIL P1a: meniu=[' + m.lcMenu + '] asteptat=[' + m.lcMenuAsteptat + ']'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- Pas 3 (partial aici): fara cod fiscal, pozitiile dezactivabile au prefixul "\";
*-- ISTORIC (pozitia 3) ramane activa oricum.
lcMenuFaraCod = GetMeniuVerificareCodFiscal('')
lcMenuFaraCodAsteptat = "\VERIFICARE ANAF;\VERIFICARE VIES;ISTORIC VERIFICARI COD FISCAL;\-;\DESCHIDE FISA PE MFINANTE.RO"
IF m.lcMenuFaraCod == m.lcMenuFaraCodAsteptat
DO WriteTestLog WITH 'OK P1b: fara cod fiscal, ANAF/VIES/MFINANTE dezactivate (\), ISTORIC ramane activ'
ELSE
DO WriteTestLog WITH 'FAIL P1b: meniu=[' + m.lcMenuFaraCod + '] asteptat=[' + m.lcMenuFaraCodAsteptat + ']'
gnEsecuri = gnEsecuri + 1
ENDIF
*==================================================================
* Pas 2: GetOptiuneVerificareCodFiscal - 1/2/3/5 mapate, 4 (separator) si restul goale
*==================================================================
LOCAL lnI, lcOptRezultat, lcOptAsteptat
DIMENSION laOptiuni(7,2)
laOptiuni(1,1) = 0
laOptiuni(1,2) = ''
laOptiuni(2,1) = 1
laOptiuni(2,2) = 'ANAF_SERVICIU_WEB'
laOptiuni(3,1) = 2
laOptiuni(3,2) = 'VIES_AUTO'
laOptiuni(4,1) = 3
laOptiuni(4,2) = 'ISTORIC'
laOptiuni(5,1) = 4
laOptiuni(5,2) = ''
laOptiuni(6,1) = 5
laOptiuni(6,2) = 'MFIN_MANUAL_COD'
laOptiuni(7,1) = 6
laOptiuni(7,2) = ''
FOR lnI = 1 TO 7
lcOptRezultat = GetOptiuneVerificareCodFiscal(laOptiuni(m.lnI,1))
lcOptAsteptat = laOptiuni(m.lnI,2)
IF m.lcOptRezultat == m.lcOptAsteptat
DO WriteTestLog WITH 'OK P2: GetOptiuneVerificareCodFiscal(' + TRANSFORM(laOptiuni(m.lnI,1)) + ') = [' + m.lcOptRezultat + ']'
ELSE
DO WriteTestLog WITH 'FAIL P2: GetOptiuneVerificareCodFiscal(' + TRANSFORM(laOptiuni(m.lnI,1)) + ') = [' + m.lcOptRezultat + '], asteptat [' + m.lcOptAsteptat + ']'
gnEsecuri = gnEsecuri + 1
ENDIF
ENDFOR
*==================================================================
* Pas 3: aritmetica optiuni_meniu_ante - formula copiata din VerificaCodFiscal:4960-4967
*==================================================================
LOCAL lcOptiuniMeniuAnte, lcMenuCombinat, lcMenuCombinatAsteptat, lnOptiuneSimulat, lnOptiuneVerificare, lcTip
lcOptiuniMeniuAnte = "MODIFICARE PARTENER - X;\-;"
*-- meniul combinat trebuie sa fie exact prepandatul + submeniul de verificare neschimbat
lcMenuCombinat = GetMeniuVerificareCodFiscal('RO1890420', m.lcOptiuniMeniuAnte)
lcMenuCombinatAsteptat = m.lcOptiuniMeniuAnte + m.lcMenuAsteptat
IF m.lcMenuCombinat == m.lcMenuCombinatAsteptat
DO WriteTestLog WITH 'OK P3a: meniul combinat = prepandate (2 pozitii) + submeniul de verificare neschimbat'
ELSE
DO WriteTestLog WITH 'FAIL P3a: combinat=[' + m.lcMenuCombinat + '] asteptat=[' + m.lcMenuCombinatAsteptat + ']'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- pozitia 3 din meniul COMBINAT (dupa cele 2 prepandate: "MODIFICARE PARTENER - X" si "\-")
*-- e primul element din submeniul de verificare -> trebuie sa cada pe ANAF_SERVICIU_WEB
lnOptiuneSimulat = 3
lnOptiuneVerificare = m.lnOptiuneSimulat
IF !EMPTY(m.lcOptiuniMeniuAnte)
lnOptiuneVerificare = m.lnOptiuneVerificare - OCCURS(';', m.lcOptiuniMeniuAnte)
ENDIF
lcTip = GetOptiuneVerificareCodFiscal(m.lnOptiuneVerificare)
IF m.lcTip == 'ANAF_SERVICIU_WEB'
DO WriteTestLog WITH 'OK P3b: pozitia 3 din meniul combinat (dupa cele 2 prepandate) = ANAF_SERVICIU_WEB'
ELSE
DO WriteTestLog WITH 'FAIL P3b: pozitia 3 combinata a dat [' + m.lcTip + '], asteptat ANAF_SERVICIU_WEB'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- pozitia 7 (ultima din meniul combinat) e ultimul element din submeniu -> MFIN_MANUAL_COD
lnOptiuneSimulat = 7
lnOptiuneVerificare = m.lnOptiuneSimulat - OCCURS(';', m.lcOptiuniMeniuAnte)
lcTip = GetOptiuneVerificareCodFiscal(m.lnOptiuneVerificare)
IF m.lcTip == 'MFIN_MANUAL_COD'
DO WriteTestLog WITH 'OK P3c: pozitia 7 din meniul combinat = MFIN_MANUAL_COD'
ELSE
DO WriteTestLog WITH 'FAIL P3c: pozitia 7 combinata a dat [' + m.lcTip + '], asteptat MFIN_MANUAL_COD'
gnEsecuri = gnEsecuri + 1
ENDIF
*==================================================================
* Pas 4: verifica_partener_show_info - structura mesajului, pe obiecte fabricate
*==================================================================
LOCAL loPart
*-- 4a: sursa ANAF, atribut RO nepotrivit (neplatitor + cod RO) -> *** ATENTIE ***,
*-- Mesaj ANAF completat, identificare PARTIALA (telefon/fax/cod postal goale -> absente)
loPart = CREATEOBJECT("empty")
ADDPROPERTY(loPart, "firma", "FIRMA UNU SRL")
ADDPROPERTY(loPart, "sursa", "ANAF")
ADDPROPERTY(loPart, "data_sursa", {})
ADDPROPERTY(loPart, "platitortvamfin", .F.)
ADDPROPERTY(loPart, "datatvamfin", "")
ADDPROPERTY(loPart, "PlatitorTVA", .F.)
ADDPROPERTY(loPart, "tvaincasare", .T.)
ADDPROPERTY(loPart, "splittva", .F.)
ADDPROPERTY(loPart, "inactiv", .F.)
ADDPROPERTY(loPart, "stare", "ANULAT DIN OFICIU - TEST")
ADDPROPERTY(loPart, "adresa", "STR TEST NR 1")
ADDPROPERTY(loPart, "judet", "BUCURESTI")
ADDPROPERTY(loPart, "regcom", "J40/1/2020")
ADDPROPERTY(loPart, "codpostal", "")
ADDPROPERTY(loPart, "telefon", "")
ADDPROPERTY(loPart, "fax", "")
ADDPROPERTY(loPart, "eroare", "")
gcMockUltimMesaj = ''
verifica_partener_show_info(m.loPart, 'RO1234567', 'FIRMA UNU SRL', '')
IF 'ANAF: FIRMA UNU SRL' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4a1: prefix sursa "ANAF: " pe linia denumirii'
ELSE
DO WriteTestLog WITH 'FAIL P4a1: prefixul ANAF lipseste din mesaj'
gnEsecuri = gnEsecuri + 1
ENDIF
IF '*** ATENTIE ***' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4a2: *** ATENTIE *** prezent (atribut RO nepotrivit)'
ELSE
DO WriteTestLog WITH 'FAIL P4a2: *** ATENTIE *** lipseste pentru atribut RO nepotrivit'
gnEsecuri = gnEsecuri + 1
ENDIF
IF '--- TVA ---' $ m.gcMockUltimMesaj AND '--- STARE FIRMA ---' $ m.gcMockUltimMesaj AND '--- IDENTIFICARE ---' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4a3: cele 3 titluri de sectiune sunt prezente'
ELSE
DO WriteTestLog WITH 'FAIL P4a3: lipseste cel putin un titlu de sectiune - [' + m.gcMockUltimMesaj + ']'
gnEsecuri = gnEsecuri + 1
ENDIF
IF 'Mesaj ANAF: ANULAT DIN OFICIU - TEST' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4a4: Mesaj ANAF completat cand stare e nevida'
ELSE
DO WriteTestLog WITH 'FAIL P4a4: linia Mesaj ANAF lipseste sau e gresita'
gnEsecuri = gnEsecuri + 1
ENDIF
IF NOT ('Cod postal:' $ m.gcMockUltimMesaj) AND NOT ('Telefon:' $ m.gcMockUltimMesaj) AND NOT ('Fax:' $ m.gcMockUltimMesaj)
DO WriteTestLog WITH 'OK P4a5: liniile pentru campurile goale (cod postal/telefon/fax) lipsesc'
ELSE
DO WriteTestLog WITH 'FAIL P4a5: cel putin un camp gol si-a pastrat linia - [' + m.gcMockUltimMesaj + ']'
gnEsecuri = gnEsecuri + 1
ENDIF
IF 'Adresa: STR TEST NR 1' $ m.gcMockUltimMesaj AND 'Judet: BUCURESTI' $ m.gcMockUltimMesaj AND 'Reg. comertului: J40/1/2020' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4a6: campurile completate (adresa/judet/reg. comertului) apar'
ELSE
DO WriteTestLog WITH 'FAIL P4a6: lipseste cel putin un camp completat de identificare'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- 4b: sursa CACHE cu data, platitor+cod RO potrivite dar INACTIV -> *** ATENTIE *** pt. inactiv,
*-- fara proprietatile de perioada ANAF (ramura Else din verifica_partener_show_info),
*-- identificare COMPLETA (toate cele 6 campuri completate)
loPart = CREATEOBJECT("empty")
ADDPROPERTY(loPart, "firma", "FIRMA DOI SRL")
ADDPROPERTY(loPart, "sursa", "CACHE")
ADDPROPERTY(loPart, "data_sursa", {^2026-08-21})
ADDPROPERTY(loPart, "platitortvamfin", .T.)
ADDPROPERTY(loPart, "datatvamfin", "01/01/2015")
ADDPROPERTY(loPart, "PlatitorTVA", .T.)
ADDPROPERTY(loPart, "tvaincasare", .F.)
ADDPROPERTY(loPart, "splittva", .F.)
ADDPROPERTY(loPart, "inactiv", .T.)
ADDPROPERTY(loPart, "stare", "")
ADDPROPERTY(loPart, "adresa", "STR DOI NR 2")
ADDPROPERTY(loPart, "judet", "CLUJ")
ADDPROPERTY(loPart, "regcom", "J12/2/2015")
ADDPROPERTY(loPart, "codpostal", "400000")
ADDPROPERTY(loPart, "telefon", "0264000000")
ADDPROPERTY(loPart, "fax", "0264000001")
ADDPROPERTY(loPart, "eroare", "")
gcMockUltimMesaj = ''
verifica_partener_show_info(m.loPart, 'RO7654321', 'FIRMA DOI SRL', '')
IF 'CACHE 21/08/2026: FIRMA DOI SRL' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4b1: prefix sursa "CACHE dd/mm/yyyy: " pe linia denumirii'
ELSE
DO WriteTestLog WITH 'FAIL P4b1: prefixul CACHE lipseste sau e gresit - [' + m.gcMockUltimMesaj + ']'
gnEsecuri = gnEsecuri + 1
ENDIF
IF '*** ATENTIE ***' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4b2: *** ATENTIE *** prezent (inactiv)'
ELSE
DO WriteTestLog WITH 'FAIL P4b2: *** ATENTIE *** lipseste pentru partener inactiv'
gnEsecuri = gnEsecuri + 1
ENDIF
IF 'Mesaj ANAF:' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'FAIL P4b3: linia Mesaj ANAF apare desi stare e goala'
gnEsecuri = gnEsecuri + 1
ELSE
DO WriteTestLog WITH 'OK P4b3: linia Mesaj ANAF lipseste cand stare e goala'
ENDIF
IF 'Cod postal: 400000' $ m.gcMockUltimMesaj AND 'Telefon: 0264000000' $ m.gcMockUltimMesaj AND 'Fax: 0264000001' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4b4: identificare completa (cod postal/telefon/fax completate) apare integral'
ELSE
DO WriteTestLog WITH 'FAIL P4b4: lipseste cel putin un camp de identificare completat'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- 4c: sursa CACHE_INDISP, fara atentie, IDENTIFICARE complet goala -> sectiunea lipseste
loPart = CREATEOBJECT("empty")
ADDPROPERTY(loPart, "firma", "FIRMA TREI SRL")
ADDPROPERTY(loPart, "sursa", "CACHE_INDISP")
ADDPROPERTY(loPart, "data_sursa", {^2026-08-20})
ADDPROPERTY(loPart, "platitortvamfin", .T.)
ADDPROPERTY(loPart, "datatvamfin", "01/01/2015")
ADDPROPERTY(loPart, "PlatitorTVA", .T.)
ADDPROPERTY(loPart, "tvaincasare", .F.)
ADDPROPERTY(loPart, "splittva", .F.)
ADDPROPERTY(loPart, "inactiv", .F.)
ADDPROPERTY(loPart, "stare", "")
ADDPROPERTY(loPart, "adresa", "")
ADDPROPERTY(loPart, "judet", "")
ADDPROPERTY(loPart, "regcom", "")
ADDPROPERTY(loPart, "codpostal", "")
ADDPROPERTY(loPart, "telefon", "")
ADDPROPERTY(loPart, "fax", "")
ADDPROPERTY(loPart, "eroare", "")
gcMockUltimMesaj = ''
verifica_partener_show_info(m.loPart, 'RO1112223', 'FIRMA TREI SRL', '')
IF 'CACHE 20/08/2026 (ANAF indisponibil): FIRMA TREI SRL' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4c1: prefix "CACHE dd/mm/yyyy (ANAF indisponibil): " pe linia denumirii'
ELSE
DO WriteTestLog WITH 'FAIL P4c1: prefixul CACHE_INDISP lipseste sau e gresit - [' + m.gcMockUltimMesaj + ']'
gnEsecuri = gnEsecuri + 1
ENDIF
IF '*** ATENTIE ***' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'FAIL P4c2: *** ATENTIE *** apare desi codul si starea sunt consistente'
gnEsecuri = gnEsecuri + 1
ELSE
DO WriteTestLog WITH 'OK P4c2: *** ATENTIE *** absent cand nu e cazul'
ENDIF
IF '--- IDENTIFICARE ---' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'FAIL P4c3: sectiunea IDENTIFICARE apare desi toate campurile ei sunt goale'
gnEsecuri = gnEsecuri + 1
ELSE
DO WriteTestLog WITH 'OK P4c3: sectiunea IDENTIFICARE lipseste cand toate campurile ei sunt goale'
ENDIF
IF '--- TVA ---' $ m.gcMockUltimMesaj AND '--- STARE FIRMA ---' $ m.gcMockUltimMesaj
DO WriteTestLog WITH 'OK P4c4: sectiunile TVA/STARE FIRMA raman prezente'
ELSE
DO WriteTestLog WITH 'FAIL P4c4: lipseste sectiunea TVA sau STARE FIRMA'
gnEsecuri = gnEsecuri + 1
ENDIF
*-- 4d: fara proprietatea sursa (stil mfinante.ro) -> fara prefix pe linia denumirii
loPart = CREATEOBJECT("empty")
ADDPROPERTY(loPart, "firma", "FIRMA PATRU SRL")
ADDPROPERTY(loPart, "platitortvamfin", .T.)
ADDPROPERTY(loPart, "datatvamfin", "01/01/2015")
ADDPROPERTY(loPart, "PlatitorTVA", .T.)
ADDPROPERTY(loPart, "tvaincasare", .F.)
ADDPROPERTY(loPart, "splittva", .F.)
ADDPROPERTY(loPart, "inactiv", .F.)
ADDPROPERTY(loPart, "stare", "")
ADDPROPERTY(loPart, "adresa", "")
ADDPROPERTY(loPart, "judet", "")
ADDPROPERTY(loPart, "regcom", "")
ADDPROPERTY(loPart, "codpostal", "")
ADDPROPERTY(loPart, "telefon", "")
ADDPROPERTY(loPart, "fax", "")
ADDPROPERTY(loPart, "eroare", "")
gcMockUltimMesaj = ''
verifica_partener_show_info(m.loPart, 'RO4445556', 'FIRMA PATRU SRL', '')
IF 'FIRMA PATRU SRL' $ m.gcMockUltimMesaj AND NOT ('ANAF:' $ m.gcMockUltimMesaj) AND NOT ('CACHE' $ m.gcMockUltimMesaj)
DO WriteTestLog WITH 'OK P4d: fara proprietatea sursa, linia denumirii nu are niciun prefix'
ELSE
DO WriteTestLog WITH 'FAIL P4d: mesajul are un prefix desi obiectul nu are proprietatea sursa'
gnEsecuri = gnEsecuri + 1
ENDIF
DO WriteTestLog WITH IIF(gnEsecuri = 0, 'TOTAL OK', 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)')
CATCH TO loEx
DO WriteTestLog WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
DO WriteTestLog WITH 'TOTAL FAIL: exceptie neasteptata'
ENDTRY
QUIT
**********************************************************
PROCEDURE WriteTestLog
LPARAMETERS tcMsg
LOCAL lcL
SET SAFETY OFF
lcL = IIF(FILE(gcLog), FILETOSTR(gcLog), '')
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcLog)
ENDPROC
**********************************************************
PROCEDURE WriteTestErr
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
DO WriteTestLog WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
ENDPROC