Ok, Roger, this is not so important now, I deal with it to show wtf only every x-th record, to not exceed 60000 rows.
This is not my main problem, main problem is that I do not know why my function cannot read many records to array.
I am sure problem was on processing string, his dividing to rows using EOL code, now I start again with blank cycle only read rows, and later add other function to processing rows.
Just for interest here is code but not very correct formatting when store to board. Sorry there are more comments and not active blocks...
Function is for searching string in text file, when found string in some of block beginning and ending with "special" combination of characters, save this block to temporary variable and then save to file.
Code: Select all
*********
FUNCTION FHTSU3D(prechody,pomcisku,pomnazku,cSourceFile3,cTargetFile3,cTargetFile3d,hladtext1,hladtext2,hladtext3,pomtyp,pomtypx,pomtypd,davkovo,pkey3dpocet,hladtext4)
***************************************************************************************************************************************************************
LOCAL GetList := {}
LOCAL nSource3,nTarget3
*LOCAL nTarget3d[20]
LOCAL nTarget3d[1000] // zvyšujem na 100 kvoli stavbám
LOCAL cBuffer
* premenné pre vstupný reťazec
LOCAL cSourceString3:="",nSourceString3
* premenné pre výstupný reťazec
LOCAL cTargetString3:="",nTargetString3
LOCAL j3:=0,x3:=0,i3d:=0
LOCAL velkostsuboru3:=0,velkostsuboruout:=0,pocetriadkovsuboru:=0
LOCAL pocetriadkov:=0
LOCAL count:=0,countpom:=0,outpocet:=0
LOCAL znak:=space(0),pomznak
LOCAL minznak:=space(0),budznak:=space(0),ret:=space(0)
LOCAL poziciaEOL:=0, lastpoziciaEOL:=0
LOCAL zostatok3:=0,dlzkariadku:=0
LOCAL ctext:=space(0),ctext2:=space(0)
LOCAL pocnt:=0
LOCAL q1:=0,q2:=0,mempp:=0,mempos:=0,memapos:=0,ptext:=""
LOCAL rp:=0,nt:=.F.,pomrp:=0,np:=.F.
*LOCAL ntd[20]
*LOCAL ntd[1000] // zvyšujem kvoli stavbám na 100
*qqq 30.9.2016 zvyšujem kvôli chronológii Ba
LOCAL ntd[30000] // zvyšujem kvoli stavbám na 100
LOCAL ntdand:=0 // pri podmienke and, 0 vyhovujú všetky >0 jeden a viac nevyhovuje
* teraz oznacene s 2 aby som vedel generovať do výstupu nezávisle od povodnej verzie
LOCAL outriadok3:=""
*LOCAL outriadok3d[20] // pre dávkové protokoly
*LOCAL outriadok3d[1000] // pre dávkové protokoly // zvyšujem na 100 kvôli stavbám
*qqq 30.9.2016 zvyšujem kvôli chronológii Ba
LOCAL outriadok3d[30000] // pre dávkové protokoly // zvyšujem na 100 kvôli stavbám
LOCAL pomriadok3:=""
LOCAL pomnt:=.F.
LOCAL pprechody:=0
LOCAL prvyprechod:=.T. // ak prvý prechod, tak .T., ak ďalší tak .F.
LOCAL lastrow:="",chronolv:=0 // predch.riadok a príznak že sa jedná o chronológiu LV
LOCAL bloksize:=100000000 // nastavenie veľkosti bloku, final 100.000.000 Bytov
*LOCAL bloksize:=1000000 // test blok 1MB
*LOCAL bloksize:=25000
*LOCAL bloksize:=10000 // test blok 10kB
*LOCAL bloksize:=5000 // nastavenie veľkosti bloku, pre testovanie iba 5000 znakov
*LOCAL bloksize:=10
LOCAL velkostbloku:=0,poziciadelenia:=0,lastpozicia:=0
LOCAL poziciafileout:=0,poziciafile:=0
LOCAL nacitanychznakov:=0
LOCAL datpvz:=date(),vrozsahu:=.F.
DECLARE polozkavz[100000]
*qqq dávka, nulovanie premenných
for i3d:=1 to pkey3dpocet
ntd[i3d]:=.F.
outriadok3d[i3d]:=""
next
SET EXACT ON // tj. porovná presne identické reťazce
* ak TYP ZMENY, VLASTNÍK a mená vlastníkov v array
if prechody=3
hladtext1:=upper(lat_ibm(alltrim(hladtext1)))
hladtext2:=upper(lat_ibm(alltrim(hladtext2)))
* úprava pre array
*hladtext3:=upper(lat_ibm(alltrim(hladtext3)))
for i3d=1 to pkey3dpocet
hladtext3[i3d]:=upper(lat_ibm(alltrim(hladtext3[i3d])))
hladtext4[i3d]:=upper(lat_ibm(alltrim(hladtext4[i3d])))
next
* ak VLASTNIK a mená vlastníkov v array
elseif prechody=2
hladtext1:=upper(lat_ibm(alltrim(hladtext1)))
* úprava pre array
*hladtext2:=upper(lat_ibm(alltrim(hladtext2)))
for i3d=1 to pkey3dpocet
hladtext2[i3d]:=upper(lat_ibm(alltrim(hladtext2[i3d])))
hladtext4[i3d]:=upper(lat_ibm(alltrim(hladtext4[i3d])))
next
* ak iba jeden prechod ale chrono LV
elseif prechody=1
* úprava pre array
*qqqx 15.6.2018 optimalizácia, vyradenie úprav upper, latibm, ak sa nespracovávajú texty s diakritikou
* pôvodné
*
for i3d=1 to pkey3dpocet
hladtext1[i3d]:=upper(lat_ibm(alltrim(hladtext1[i3d])))
hladtext4[i3d]:=upper(lat_ibm(alltrim(hladtext4[i3d])))
next
endif
if prechody=1 .and. pkey3dpocet>=4 .and. substr(hladtext1[1],1,8)="LIST VLA"
*ladenie("spracovanie chronológie LV , chronolv=1")
chronolv:=1
endif
*qqq 9.9.2016 - keďže hore som to upravil aj pre variant 3 prechodov, tu toto blokujem !!!
*hladtext3:=upper(lat_ibm(alltrim(hladtext3)))
* skúška úpravy 13.3.2016 - ale nefungovalo to, zatiaľ neskúmam prečo
*hladtext:=upper(lat_ibm_u(alltrim(hladtext)))
*hladtext:=upper(lat_ibm_u(alltrim(hladtext)))
*hladtext:=upper(lat_ibm_u(alltrim(hladtext)))
********************************************************
* doplnenie hviezdičky pred a za hľadací kľúč ak wildcard povolené, aby našlo vnútri riadku
*if povolwild==.T.
* if left(hladtext,1)!="*"
* hladtext:="*"+hladtext
* endif
* if right(hladtext,1)!="*"
* hladtext:=hladtext+"*"
* endif
*endif
* pri dávkovom zadaní hladtext1 obsahuje údajovú skupinu, napr. VLASTNICI PARCIEL
if povolwild==.T.
if left(hladtext1,1)!="*"
hladtext1:="*"+hladtext1
endif
if right(hladtext1,1)!="*"
hladtext1:=hladtext1+"*"
endif
endif
*qqq 9.9.2016 tu ošetriť na variant 2 a 3 kľúčov
if prechody=2
* pri dávkovom zadaní hladtext2 obsahuje pole zadaných kľúčov, napr. mená vlastníkov
* úprava pre array
for i3d=1 to pkey3dpocet
if povolwild==.T.
if left(hladtext2[i3d],1)!="*"
hladtext2[i3d]:="*"+hladtext2[i3d]
hladtext4[i3d]:="*"+hladtext4[i3d]
endif
if right(hladtext2[i3d],1)!="*"
hladtext2[i3d]:=hladtext2[i3d]+"*"
hladtext4[i3d]:=hladtext4[i3d]+"*"
endif
endif
next
* pri dávkovom zadaní hladtext3 neobsahuje nič, hľadanie je nateraz iba dvojprechodové
if povolwild==.T.
if left(hladtext3,1)!="*"
hladtext3:="*"+hladtext3
endif
if right(hladtext3,1)!="*"
hladtext3:=hladtext3+"*"
endif
endif
*qqq 9.9.2016 doplnený variant pre 3 kľúče, typ zmeny, súbor, a vlastník napr. ktorý je v array dávkovo
elseif prechody=3
* pri dávkovom zadaní hladtext2 obsahuje pole zadaných kľúčov, napr. mená vlastníkov
* úprava pre array
for i3d=1 to pkey3dpocet
if povolwild==.T.
if left(hladtext3[i3d],1)!="*"
hladtext3[i3d]:="*"+hladtext3[i3d]
hladtext4[i3d]:="*"+hladtext4[i3d]
endif
if right(hladtext3[i3d],1)!="*"
hladtext3[i3d]:=hladtext3[i3d]+"*"
hladtext4[i3d]:=hladtext4[i3d]+"*"
endif
endif
next
* pri dávkovom zadaní hladtext3 neobsahuje nič, hľadanie je nateraz iba dvojprechodové
if povolwild==.T.
if left(hladtext2,1)!="*"
hladtext2:="*"+hladtext2
endif
if right(hladtext2,1)!="*"
hladtext2:=hladtext2+"*"
endif
endif
endif
*ladenie("FHTSU3 po uprave :"+hladtext1+"/"+hladtext2+"/"+hladtext3+"/")
* otvorenie vstupného súboru a kontrola či bol otvorený
** súbor sa nedá otvoriť
IF ( nSource3 := FOpen( cSourceFile3, FO_READ ) ) == -1
oznam2("Vstupný súbor sa nedá otvoriť:",cSourceFile3)
return(.F.)
** súbor sa otvoril, tak otvára aj súbor na výstup
* !!! tu iba otvoriť a nevytvárať súbor, lebo by mal byť uź vytvorený v hlavnej funkcii
* ktorá FHTSU volá
*ELSEIF ( nTarget3 := FCreate( cTargetFile3, FC_NORMAL ) ) == -1
** ošetrenie na povolenie zápisu a zároveň povolenie zápisu iba jednému užívateľovi
ELSEIF ( nTarget3 := FOpen( cTargetFile3, FO_READWRITE+FO_DENYWRITE ) ) == -1
FClose( nSource3 )
oznam2("Výstupný súbor sa nedá otvoriť:",cTargetFile3)
return(.F.)
ENDIF
*qqq tu doplniť otváranie dávkových súborov
*qqq 30.9.2016 - ak chronológia, tak čiastkové dávkové súbory nevytvárať , to isté aj keď všetky zmeny LV
**************
if chronolv!=1 // toto ošetrené všade kde nTarget3d
**************
for i3d=1 to pkey3dpocet
IF ( nTarget3d[i3d] := FOpen( cTargetFile3d[i3d], FO_READWRITE+FO_DENYWRITE ) ) == -1
FClose( nSource3 )
oznam2("Výstupný súbor sa nedá otvoriť:",cTargetFile3d[i3d])
return(.F.)
ENDIF
next
endif
*****
* skok na koniec súboru na výstup !!!, bez toho by prepisoval znova od zač.súboru
*************************
FSeek(nTarget3,0,FS_END)
*************************
*qqq 30.9.2016 - ak chronológia, tak čiastkové dávkové súbory nevytvárať , to isté aj keď všetky zmeny LV
* aj pre dávkové súbory
***************
if chronolv!=1
***************
for i3d=1 to pkey3dpocet
FSeek(nTarget3d[i3d],0,FS_END)
next
*****
endif
*****
* zistenie počtu riadkov súboru pozor trvá dlho výpočet, cca 11sec pre 22MB súbor
* vyradené, nepotrebujem to !!!
*pocetriadkovsuboru=DC_TxtCount(nSource3)
* vynulovanie výstupného reťazca
cTargetString3:=""
* zistenie veľkosti súboru
***************************
velkostsuboru3:=filesize(cSourceFile3)
velkostsuboru3p:=velkostsuboru3 // iba pre zapamätanie celej velkosti suboru, lebo neskor sa premenna
// velkostsuboru prepisuje podla velkosti bloku
*ladenie("FILESIZE-velkostsuboru3=velkostsuboru3p "+str(velkostsuboru3))
* výpočet zistenie počtu blokov , bloky nastavujem na 100MB viď vyššie bloksize
***********************************************************
pocetblokov:=int(velkostsuboru3/bloksize)+1
pb:=pocetblokov
*ladenie("počet blokov= "+str(pb))
/* qqq 23.9.2016 blokujem, tu zbytočné už , lebo neskôr riešené bloky
* vytvorenie premennej o veľkosti predvoleného buffra
cSourceString3 := Space( velkostsuboru3 )
*/
*zostatok3:=velkostsuboru3
* načítanie súboru do premennej , reťazec
** nSourceString3 tu je iba uložené asi či načítal alebo nie ?
** samotný súbor je uložený v premennej cBuffer
/* - blokujem, lebo už nový systém dávam na delenie blokov
* NAČÍTANIE OBSAHU SÚBORU DO REŤAZCA
*********************************************************************
nSourcestring3 := FRead( nSource3, @cSourceString3, velkostsuboru3 )
*********************************************************************
*/
* NAČÍTANIE OBSAHU SÚBORU DO REŤAZCA - nová verzia z postupným načítaním blokov zo vstup.súboru
***********************************************************************************************
* cyklus pre spracovanie blokov
*****************************************
FOR aktblok=1 to pocetblokov
*****************************************
*ladenie("aktblok="+str(aktblok))
*****************
* NOVY SYSTEM !!!
*****************
* iba jeden blok - toto OK! zhoda 100%
*****************
if pocetblokov==1
*ladenie("pocetblokov 1, jednoprechodovy system")
*ladenie("velkostsuboru3=velkostsuboru3= "+str(velkostsuboru3))
velkostbloku:=velkostsuboru3 // určenie veľkosti bloku
cSourcestring3:=Space(velkostsuboru3) // vytvorenie space pre fread
nSourcestring3 := FRead( nSource3, @cSourcestring3, velkostbloku) // načítanie bloku predbežne iba pre zistenie EOL
// Fread vracia počet skutočne načítaných znakov
*ladenie("načítal som nsourcestring3 znakov : "+str(nSourceString3))
velkostsuboru3:=velkostsuboru3 // velkost pre spracovanie kódovania
* spracovanie posledného bloku
*******************************
elseif pocetblokov!=1 .and. aktblok==pocetblokov
*ladenie("spracovavam posledny blok")
velkostbloku:=velkostsuboru3p-nacitanychznakov // určenie veľkosti bloku, zostatok do konca súboru
*ladenie("velkost zostatkového bloku pre nacitanie "+str(velkostsuboru3p)+"/"+str(velkostbloku))
*ladenie("Space-vytvaram space pre Fread : "+str(velkostbloku))
cSourcestring3:=Space(velkostbloku) // vytvorenie space pre fread
nSourcestring3 := FRead( nSource3, @cSourcestring3, velkostbloku) // načítanie bloku predbežne iba pre zistenie EOL
*ladenie("FREAD final načital som text,počet znakov: ["+cSourcestring3+"],"+str(nSourcestring3))
*ladenie("dlžka cSourcestring3 :"+str(len(cSourcestring3)))
velkostsuboru3:=nSourcestring3 // velkost pre spracovanie kódovania
* spracovanie ostatných blokov
********************************
elseif pocetblokov!=1 .and. aktblok!=pocetblokov
*ladenie("spracovavam blok :"+str(aktblok))
velkostbloku:=bloksize // určenie veľkosti bloku, zostatok do konca súboru
*ladenie("velkostbloku:"+str(velkostbloku))
* zistenie pozicie EOL
lastpozicia:=FSeek(nSource3,0,FS_RELATIVE)
*ladenie("lastpozicia pred hľadaním EOL:"+str(lastpozicia))
cSourcestring3 := Space( velkostbloku ) // vytvorenie space pre načítanie zo súboru
nSourcestring3 := FRead( nSource3, @cSourcestring3, velkostbloku ) // načítanie bloku predbežne iba pre zistenie EOL
*ladenie("načital som text,počet znakov: ["+cSourcestring3+"],"+str(nSourcestring3))
poziciadelenia:=at((chr(13)+chr(10)),cSourcestring3,velkostbloku-85)
*ladenie("poziciadelenia: "+str(poziciadelenia))
/* povodne ako to už zhruba išlo
do while poziciadelenia==0
* ladenie("opakovanie hľadanie pozície delenia, lebo poziciadelenia=0")
poziciadelenia:=at((chr(13)+chr(10)),cSourcestring3,velkostbloku-3)
* ladenie("poziciadelenia: "+str(poziciadelenia))
enddo
*/
* tu úprava aby aj pozicia delenia sa menila
do while poziciadelenia==0
* ladenie("opakovanie hľadanie pozície delenia, lebo poziciadelenia=0")
velkostbloku=velkostbloku-30
poziciadelenia:=at((chr(13)+chr(10)),cSourcestring3,velkostbloku)
* ladenie("poziciadelenia: "+str(poziciadelenia))
enddo
velkostbloku:=poziciadelenia+1
*ladenie("velkostbloku: "+str(velkostbloku))
poziciafile:=FSeek(nSource3,lastpozicia,FS_SET)
*ladenie("idem na poziciafile:"+str(poziciafile))
*ladenie("Space-vytvaram space pre Fread : "+str(velkostbloku))
cSourcestring3 := Space( velkostbloku ) // vytvorenie space pre načítanie zo súboru
nSourcestring3 := FRead( nSource3, @cSourcestring3, velkostbloku ) // načítanie bloku predbežne iba pre zistenie EOL
*ladenie("FREAD final načital som text,počet znakov: ["+cSourcestring3+"],"+str(nSourcestring3))
*???
/*
* ak by delil EOL chr(13)+chr(10)
cSourcestring3p:=space(1)
if right(cSourcestring3,1)==chr(13)
*ladenie("na konci je chr(13)")
FRead( nSource3, @cSourcestring3p, 1 )
cSourcestring3+=cSourcestring3p
nSourcestring3++
endif
*/
*ladenie("dlžka cSourcestring3 :"+str(len(cSourcestring3)))
velkostsuboru3:=nSourcestring3 // priradenie pre nasledujúci cyklus
*velkostsuboru3:=bloksize
nacitanychznakov+=nSourcestring3
*ladenie("nacitanych znakov pocitadlo :"+str(nacitanychznakov))
endif
* POTIAĽ NOVÝ SYSTÉM
**********************
pprechody:=prechody
* pri dávkovom hľadaní tu toto je v poriadku, lebo sa iba urobí prvé hľadanie pre skupinu VLASTNÍCI
hladtext:=hladtext1 // ako default ide hladtext1 1.kľúč
* !!! nútené doplnenie znaku EOL, aby korektne spracoval aj súbory nekončiace na EOL
***************************************************************************************************************
*if right(cSourceString3,2)!=EOL
* cSourceString3+=EOL
*endif
*qqq 25.3.2016 doplnenie špeciálneho riadiaceho textu
*cSourceString3+="| ENDIMPORT"+EOL
* doplnenie riadiacej značky
*cSourceString3+="| POLOZKA"+EOL
*********************
DO WHILE pprechody>=1 // začiatok cyklu prechodov, možné ich aj neskôr rozšíriť na viac podmienok
*********************
* nulovanie premenných lebo mohlo ostať z minulého prechodu
rp:=0
nt:=.F.
ntdand:=0 // mením z logical na číslo 0 že všetky vyhovujú, >0 jeden alebo viac nevyhovuje
for i3d=1 to pkey3dpocet
ntd[i3d]:=.F.
next
pomrp:=0
np:=.F.
outriadok3:=""
pomriadok3:=""
ctext1:=""
ctext2:=""
ctext:=""
poziciaEOL:=0
lastpoziciaEOL:=0
*DECLARE polozkavz[20000]
* nulovanie poľa polozkavz
*for x3=1 to 20000
* polozkavz[x3]:=""
*next
* !!! nútené doplnenie znaku EOL, aby korektne spracoval aj súbory nekončiace na EOL
***************************************************************************************************************
*if right(cSourceString3,2)!=EOL
* cSourceString3+=EOL
*endif
*qqq 25.3.2016 doplnenie špeciálneho riadiaceho textu
*qqq 27.3.2016 doplnenie EOL vždy, aj keď duplovane bude
cSourceString3+=(EOL+"| ENDIMPORT"+EOL)
* doplnenie riadiacej značky
*cSourceString3+="| POLOZKA"+EOL
* výpočet veľkosti súboru resp. bloku už v reťazci načítaného , tj. nie filesize
zostatok3:=len(cSourcestring3)
*qqq pokusne prekonvertovanie názvu kat.územia , toto dá správne iba do hlavičky nie ale v hľadaní
pomnazkut:=convtoansiCP(pomnazku)
* Vygenerovanie hlavičky do protokolu
* generovanie hlavičky iba ak nieje typ X
*if prvyprechod=.T. // ak prvý prechod, doplním hlavičku k.u.
if pomtypx==0
outriadok3+="#*****************************************************************************"+EOL
* outriadok3+="#* "+pomcisku+" - "+pomnazku+EOL
outriadok3+="#* "+pomcisku+" - "+pomnazkut+EOL
outriadok3+="#*****************************************************************************"+EOL
*else
elseif pomtypx==1
* outriadok3:=outriadok3+"#******************************************************************POMTYPX1*DP"+EOL
* outriadok3:=outriadok3+"#* "+pomcisku+" - "+pomnazkut+EOL
* outriadok3:=outriadok3+"#*****************************************************************************"+EOL
endif
*qqq 6.5.2016 zadefinovanie premennej pre zapamätanie predchádzajúceho riadku
lastrow:=""
* cyklus pre načítavanie riadkov z reťazca
*****************************************************
*DO WHILE (len(cSourcestring3))>0
DO WHILE zostatok3>0
*lastrow:=pomriadok3 // zapamätanie posledne načítaného riadku
* znak vo vyjadrení číselnej Ascii hodnoty
* znak:=asc(cSourcestring3[i])
* znak vo vyjadrení char tj. ako znak
* znak:=cSourcestring3[i]
* načítanie znaku z reťazca zo zvolenej pozície a budúcej pozície
* detekcia znaku EOL resp. chr(13)+chr(12)
* + uloženie riadku do premennej
** ak prvý riadok
if lastpoziciaEOL==0
poziciaEOL:=at(EOL,cSourcestring3)
pomriadok3:=substr(cSourcestring3,1,poziciaEOL-1)
** ak už ďalšie načítavané riadky
else
poziciaEOL:=at(EOL,cSourcestring3,lastpoziciaEOL+2)
pomriadok3:=substr(cSourcestring3,lastpoziciaEOL+2,poziciaEOL-(lastpoziciaEOL+2))
endif
* * ak typ X a riadiaci znak
* if pomtypx==1
* // ak riadiaci riadok, tak zapis riadku do protokolu
* if at("#*",pomriadok3)!=0
* outriadok3+=(pomriadok3+EOL)
* endif
* endif
* ak riadiaci riadok #*
************************
if at("#*",pomriadok3)!=0
if pomtypx==1
outriadok3+=(pomriadok3+EOL) // zápis riadiacich riadkov do výstupu
*qqq1 doplnenie zápisu aj názvu k.ú. aj do dávkových ptk
for i3d :=1 to pkey3dpocet
outriadok3d[i3d]+=(pomriadok3+EOL) // zápis riadiacich riadkov do výstupu
next
endif
*qqq 29.10.2016 - doplnenie nulovania pre istotu
nt:=.F.
* ak riadiaci riadok ENDIMPORT na poriešenie posledného riadku vo VZ
*********************************************************************
elseif at("| ENDIMPORT",pomriadok3)!=0
* ak v predchádzajúcej položke bolo evidované nájdenie textu
*qqq 26.10.2016
*if nt==.T.
if nt==.T. .and. vrozsahu==.T.
*qqq 3.11.2016 tu by mohlo byť vyhodnotenie takto
*if (pomdavkaorand=.F. .and. nt==.T. .and. vrozsahu==.T.) .or. (pomdavkaorand=.T. .and. nt==.T. .and. nt2==.T. .and. vrozsahu==.T.)
* kde nt2 sa vyhodnotí extra nižšie tiež len ak pomdavkaorand=.T.
* overiť, či tu sa dostáva informácia o pomdavkaorand
* a pri hľadaní ak je jeden z kľúčov prázdny, tak ho netestovať,
* napr. ak dám meno, alebo meno + ident, alebo len ident,
***********************************************
* zápis obsahu predchádzajúcej PVZ do výstupu
***********************************************
*qqq presun až za spracovanie dávkových ptk
* * zápis do spoločného protokolu
* FOR pomrp = 1 to rp
* // zapis riadku do protokolu
* outriadok3+=(polozkavz[pomrp]+EOL)
* NEXT
* ak klasické spracovanie z podmienkou dávky OR
***********************************************
if pomdavkaand=.F.
* triedenie podľa dávok
for i3d = 1 to pkey3dpocet
if ntd[i3d]=.T.
* zápis obsahu predchádzajúcej PVZ do výstupu
FOR pomrp = 1 to rp
// zapis riadku do protokolu
outriadok3d[i3d]+=(polozkavz[pomrp]+EOL)
NEXT
ntd[i3d]:=.F.
endif
next
* zápis do spoločného protokolu
FOR pomrp = 1 to rp
// zapis riadku do protokolu
outriadok3+=(polozkavz[pomrp]+EOL)
NEXT
* spracovanie dávky z podmienkou AND
*************************************
elseif pomdavkaand=.T.
ntdand:=0
* triedenie podľa dávok
for i3d = 1 to pkey3dpocet
if ntd[i3d]=.T.
* zápis obsahu predchádzajúcej PVZ do výstupu
FOR pomrp = 1 to rp
// zapis riadku do protokolu
outriadok3d[i3d]+=(polozkavz[pomrp]+EOL)
NEXT
ntd[i3d]:=.F.
else
ntdand++
endif
next
if ntdand=0 .or. pprechody!=1 // tu špeci podmienka, lebo pri prvom prechode
// filtruje iba VLASTNICI
* zápis do spoločného protokolu
FOR pomrp = 1 to rp
// zapis riadku do protokolu
outriadok3+=(polozkavz[pomrp]+EOL)
NEXT
endif
endif
*****
* nulovanie príznaku nájdenia textu
nt:=.F.
*qqq 29.10.2016 tu doplnenie možnosti ak je nt ale nieje v rozsahu
else
nt:=.F.
endif
rp:=1
*qqq dopĺňam 6.5.2016 či tu netreba np vynulovať ???
np:=.F.
* ostatné možnosti - údajové riadky
************************************
else
* ak riadok začína položka VZ , začínam ukladať
************************************************
if at("| POLOZKA",pomriadok3)!=0
np:=.T. // našiel som polozku
* ak v predchádzajúcej položke bolo evidované nájdenie textu
*qqq 26.10.2016
*if nt==.T.
if nt==.T. .and. vrozsahu==.T.
***********************************************
* zápis obsahu predchádzajúcej PVZ do výstupu
***********************************************
*qqq presun až za spracovanie dávkových ptk
* FOR pomrp = 1 to rp
* // zapis riadku do protokolu
* outriadok3+=(polozkavz[pomrp]+EOL)
* NEXT
* ak klasické spracovanie z podmienkou dávky OR
***********************************************
if pomdavkaand=.F.
* triedenie podľa dávok
for i3d =1 to pkey3dpocet
if ntd[i3d]=.T.
* zápis obsahu predchádzajúcej PVZ do výstupu
FOR pomrp = 1 to rp
// zapis riadku do protokolu
outriadok3d[i3d]+=(polozkavz[pomrp]+EOL)
NEXT
ntd[i3d]:=.F.
endif
next
* zápis do spoločného protokolu
FOR pomrp = 1 to rp
// zapis riadku do protokolu
outriadok3+=(polozkavz[pomrp]+EOL)
NEXT
* spracovanie dávky z podmienkou AND
************************************
elseif pomdavkaand=.T.
ntdand:=0
* triedenie podľa dávok
for i3d =1 to pkey3dpocet
if ntd[i3d]=.T.
* zápis obsahu predchádzajúcej PVZ do výstupu
FOR pomrp = 1 to rp
// zapis riadku do protokolu
outriadok3d[i3d]+=(polozkavz[pomrp]+EOL)
NEXT
ntd[i3d]:=.F.
else
ntdand++
endif
next
if ntdand=0 .or. pprechody!=1 // tu špeci podmienka, lebo pri prvom prechode
// filtruje iba VLASTNICI
* zápis do spoločného protokolu
FOR pomrp = 1 to rp
// zapis riadku do protokolu
outriadok3+=(polozkavz[pomrp]+EOL)
NEXT
endif
endif
* nulovanie príznaku nájdenia textu
nt:=.F.
*qqq 29.10.2016 tu doplnenie možnosti ak je nt ale nieje v rozsahu
else
nt:=.F.
endif
rp:=1 // nastavujem prvý riadok položky
*qqq 26.10.2016 doplnenie automat.úpravy zápisu položky VZ rok PVZ na RRRR formát
*polozkavz[rp]:=pomriadok3 // ukladám prvý riadok položky
polozkavz[rp]:=uprrpvz(pomriadok3) // ukladám prvý riadok položky
*qqq 26.10.2016 zistenie dátumu nasledujúcej položky
datpvz:=ctod(alltrim(substr(pomriadok3,at("|",pomriadok3,2)+1,at(" o ",pomriadok3)-at("|",pomriadok3,2))))
if h_hu=1 .or. ((h_hu=2 .or. h_hu=3) .and. datpvz>=(h_hod) .and. datpvz<=(h_hdo)) // začiatok vyhodnotenia dátumu
vrozsahu:=.T.
else
vrozsahu:=.F.
endif
* * ak riadok riadiaci koniec bloku importu
* elseif at("| ENDIMPORT",pomriadok3)!=0
* * ak v predchádzajúcej položke bolo evidované nájdenie textu
* if nt:=.T.
* * zápis obsahu predchádzajúcej PVZ do výstupu
* FOR pomrp := 1 to rp
* // zapis riadku do protokolu
* outriadok3+=(polozkavz[pomrp]+EOL)
* NEXT
*
* * nulovanie príznaku nájdenia textu
* nt:=.F.
* endif
* rp:=1
* ak riadok nezačína polozka VZ
********************************
else
if np=.T. // ak bola registrovaná začínajúca položka
rp++ // pridávam riadok položky
polozkavz[rp]:=pomriadok3 // ukladám ďalší riadok položky
endif
endif
* ak našiel vyhovujúci text, značím si príznak našiel
*qqq tu skúšam vyradiť doplnenie medzery
* toto bolo povodne
*ctext:=substr(pomriadok3,1,len(pomriadok3)-1)+" "
* a toto upravene
*!!!toto nemusí byť asi tu už
*ctext:=substr(pomriadok3,1,len(pomriadok3))
* skúšam
*qqq 15.8.2017 vyradzujem, zbytočná medzipremenná ctext
* ctext:=pomriadok3
* ak typ 2 , odstrániť diakritiku
if pomtyp==2
// prevod LATIN-2 -> ASCII pre DOS 852 aj Win1250 EE
*ctext:=lat_asc(ctext)
*ctext:=lat_ibm(ctext)
*optim3 - úprava pre optimalizovanú verziu lat_ibm
*ctext1:=lat_ibm_u(ctext)
*ctext2:=lat_ibm(ctext)
*qqq 15.8.2017 upravujem bez použitia medzipremennej ctext
* ctext1:=lat_ibm_u_o(ctext)
* ctext2:=lat_ibm_o(ctext)
ctext1:=lat_ibm_u_o(pomriadok3)
ctext2:=lat_ibm_o(pomriadok3)
* bez odstránenia diakritiky
else
*qqq 15.8.2017 upravujem bez použitia medzipremennej ctext
* ctext1:=ctext
* ctext2:=ctext
ctext1:=pomriadok3
ctext2:=pomriadok3
endif
*********************************************
* samotné hľadanie textu v reťazci - riadku
*********************************************
* spôsob hľadania či povolené wildcards
if povolwild==.F.
*qqq 3.3.2016 skúška úpravy pre doplenie medzery
* povodne
*if at(hladtext,upper(ctext1))!=0 .or. at(hladtext,upper(ctext2))!=0
* uprava 1
*if at(hladtext+" ",upper(ctext1))!=0 .or. at(hladtext+" ",upper(ctext2))!=0
* uprava 2
*qqq dávka
* pprechody!=1
if pprechody!=1
* toto je aktualne ku 25.3.2016
if (at(hladtext+" ",upper(ctext1)+" ")!=0) .or. (at(hladtext+" ",upper(ctext2)+" ")!=0)
* test ak chronológia, tak vylúčenie falošných nálezov, ak predch. riadok nebol Cislo LV
*optim1 if (chronolv=1) .and. (substr(ltrim(hladtext),1,4)=="NOVE")
if (chronolv=1) .and. (substr((hladtext),1,4)=="NOVE")
if substr(lastrow,1,45)=="Cislo LV Stare"
nt:=.T.
else
*nt:=.T.
endif
else
nt:=.T.
endif
endif
* pprechody=1
else
*qqq 13.10.2016 presúvam tu, aby optimalizovalo cyklus
*qqqx 15.6.2018 optimalizácia, vyradenie úprav upper, latibm, ak sa nespracovávajú texty s diakritikou
* pôvodné
*
upper_ctext1:=upper(ctext1)+" "
upper_ctext2:=upper(ctext2)+" "
*
* úprava
/*
if chronolv!=1
upper_ctext1:=upper(ctext1)+" "
upper_ctext2:=upper(ctext2)+" "
else
upper_ctext1:=ctext1+" "
upper_ctext2:=ctext2+" "
endif
*/
* koniec úpravy
for i3d :=1 to pkey3dpocet
*optim4
* if (at(hladtext[i3d]+" ",upper(ctext1)+" ")!=0) .or. (at(hladtext[i3d]+" ",upper(ctext2)+" ")!=0)
* upper_ctext1:=upper(ctext1)+" "
* upper_ctext2:=upper(ctext2)+" "
*qqqx 15.6.2018 optimalizácia, vyradenie úprav upper, latibm, ak sa nespracovávajú texty s diakritikou
* pôvodné
/*
if (at(hladtext[i3d]+" ",upper_ctext1)!=0) .or. (at(hladtext[i3d]+" ",upper_ctext2)!=0)
* test ak chronológia, tak vylúčenie falošných nálezov, ak predch. riadok nebol Cislo LV
*optim1 if (chronolv=1) .and. (substr(ltrim(hladtext[i3d]),1,4)=="NOVE")
if (chronolv=1) .and. (substr((hladtext[i3d]),1,4)=="NOVE")
if substr(lastrow,1,45)=="Cislo LV Stare"
nt:=.T.
ntd[i3d]:=.T.
else
*nt:=.T.
*ntd[i3d]:=.T.
endif
else
nt:=.T.
ntd[i3d]:=.T.
endif
endif
*/
* úprava
if chronolv!=1
if (at(hladtext[i3d]+" ",upper_ctext1)!=0) .or. (at(hladtext[i3d]+" ",upper_ctext2)!=0)
* test ak chronológia, tak vylúčenie falošných nálezov, ak predch. riadok nebol Cislo LV
*optim1 if (chronolv=1) .and. (substr(ltrim(hladtext[i3d]),1,4)=="NOVE")
if (chronolv=1) .and. (substr((hladtext[i3d]),1,4)=="NOVE")
if substr(lastrow,1,45)=="Cislo LV Stare"
nt:=.T.
ntd[i3d]:=.T.
else
*nt:=.T.
*ntd[i3d]:=.T.
endif
else
nt:=.T.
ntd[i3d]:=.T.
endif
endif
else
if (at(hladtext[i3d]+" ",upper_ctext1)!=0)
* test ak chronológia, tak vylúčenie falošných nálezov, ak predch. riadok nebol Cislo LV
*optim1 if (chronolv=1) .and. (substr(ltrim(hladtext[i3d]),1,4)=="NOVE")
if (chronolv=1) .and. (substr((hladtext[i3d]),1,4)=="NOVE")
if substr(lastrow,1,45)=="Cislo LV Stare"
nt:=.T.
ntd[i3d]:=.T.
else
*nt:=.T.
*ntd[i3d]:=.T.
endif
else
nt:=.T.
ntd[i3d]:=.T.
endif
endif
endif
* koniec úpravy
next
endif
* pri dávke vlastníci idem tu
elseif povolwild==.T.
if pprechody!=1
if (like(hladtext,upper(ctext1))=.T.) .or. (like(hladtext,upper(ctext2))=.T.)
* test ak chronológia, tak vylúčenie falošných nálezov
*optim1 if (chronolv=1) .and. (substr(ltrim(hladtext),1,4)=="NOVE")
if (chronolv=1) .and. (substr((hladtext),1,4)=="NOVE")
if substr(lastrow,1,45)=="Cislo LV Stare"
nt:=.T.
else
*nt:=.T.
endif
else
nt:=.T.
endif
endif
* toto neberie neviem prečo
*nt:=like(hladtext,upper(ctext))
* ak chrono LV tak iba toto sa využije
else
*qqq 13.10.2016 presúvam tu, aby optimalizovalo cyklus
upper_ctext1:=upper(ctext1)+" "
upper_ctext2:=upper(ctext2)+" "
for i3d :=1 to pkey3dpocet
*optim4
* if (like(hladtext[i3d],upper(ctext1))=.T.) .or. (like(hladtext[i3d],upper(ctext2))=.T.)
* upper_ctext1:=upper(ctext1)+" "
* upper_ctext2:=upper(ctext2)+" "
if (like(hladtext[i3d],upper_ctext1)=.T.) .or. (like(hladtext[i3d],upper_ctext2)=.T.)
* test ak chronológia, tak vylúčenie falošných nálezov
*optim1 if (chronolv=1) .and. (substr(ltrim(hladtext[i3d]),1,4)=="NOVE")
if (chronolv=1) .and. (substr((hladtext[i3d]),1,4)=="NOVE")
if substr(lastrow,1,45)=="Cislo LV Stare"
nt:=.T.
ntd[i3d]:=.T.
else
*nt:=.T.
*ntd[i3d]:=.T.
endif
else
nt:=.T.
ntd[i3d]:=.T.
endif
endif
* toto neberie neviem prečo
*nt:=like(hladtext,upper(ctext))
next
endif
endif
* zmena algoritmu, toto dopĺňam
endif // toto kontrola podmienky či nieje riadiaci znak
zostatok3:=zostatok3-len(pomriadok3)-2 // toto pôvodne bolo ku 25.3.2016
lastpoziciaEOL:=poziciaEOL
*lastrow:=pomriadok3 // zapamätanie posledne načítaného riadku
lastrow:=ctext1
ENDDO
* kontrola či nieje viacprechodové hľadanie
* odpočítanie počtu prechodov
pprechody:=pprechody-1
* dočasne zablokované na preverenie čo je v 1.prechode
if prechody=1
* konečný zapis do vystupu
FWrite( nTarget3, outriadok3)
* pre dávkové hľadanie iba toto je teraz použité !!!
elseif prechody=2
if pprechody=1
prvyprechod:=.F.
cSourcestring3:=outriadok3 // nahratie obsahu medzisúboru do cSourcestring na opakované spracovanie
*zostatok3:=len(cSourcestring3) // zistenie veľkosti premennej, súboru
* úprava pre pole kľúčov, ostáva tak, dúfam že tu nezhavaruje, do hladtext sa uloží pole
hladtext:=hladtext2 // nastavenie hľadacieho kľúča
pomtypx:=1
elseif pprechody=0
* konečný zapis do vystupu
FWrite( nTarget3, outriadok3)
*qqq 30.9.2016 - ak chronológia, tak čiastkové dávkové súbory nevytvárať , to isté aj keď všetky zmeny LV
***************
if chronolv!=1
***************
for i3d:=1 to pkey3dpocet
FWrite( nTarget3d[i3d], outriadok3d[i3d])
next
*****
endif
*****
endif
elseif prechody=3
if pprechody=2
prvyprechod:=.F.
cSourcestring3:=outriadok3 // nahratie obsahu medzisúboru do cSourcestring na opakované spracovanie
*zostatok3:=len(cSourcestring3) // zistenie veľkosti premennej, súboru
hladtext:=hladtext2
pomtypx:=1
elseif pprechody=1
prvyprechod:=.F.
cSourcestring3:=outriadok3 // nahratie obsahu medzisúboru do cSourcestring na opakované spracovanie
*zostatok3:=len(cSourcestring3) // zistenie veľkosti premennej, súboru
hladtext:=hladtext3
pomtypx:=1
elseif pprechody=0
* konečný zapis do vystupu
FWrite( nTarget3, outriadok3)
endif
endif
*****
ENDDO // koniec cyklu prechodov
*****
* konečný zapis do vystupu
*FWrite( nTarget3, outriadok3)
*KONIEC SPRACOVANIA CYKLU PRE HĽADANIE
********
NEXT // koniec cyklu blokov
********
* vypnutie exact,
SET EXACT OFF
* zatvorenie vstupného a výstupného súboru
FClose( nSource3 )
FClose( nTarget3 )
* zatvorenie dávkových protokolov
*qqq 30.9.2016 - ak chronológia, tak čiastkové dávkové súbory nevytvárať , to isté aj keď všetky zmeny LV
***************
if chronolv!=1
***************
for i3d=1 to pkey3dpocet
FClose( nTarget3d[i3d] )
next
*****
endif
*****
*********************
*RETURN FError()
RETURN(.T.)
*********************