Hi,
Can be some limits for number of array elements although I read on several points that Xbase have not limits ?
I have array where temporary store some strings. On some situationst number of elements is more than 400000. Every string have not more than 80 characters, and can be also blank = only CRLF.
At this situation my program not work correctly, and I do not know why.
I want try control content of variable with wtf but this break with error after store some part from 400000 elements :
FATAL ERROR LOG
Error within the error handling!
SYS Thread-ID: 2436
Module: EXE
Error Codes: EH: 1006 Sub: 0(0) OS: 0 XPP: 15
Call Stack of Thread 1 (1084):
array size
Re: array size
Are you saying that WTF causes the error?
The eXpress train is coming - and it has more cars.
Re: array size
I am not sure, but when running long time, and have have many rows, program crashes.
My program froze when read some number of elements (about 260000), but window stay open,
but when use wtf, program show error, but I must test again, because not remember what error show.
I will write when it happens again.
My program froze when read some number of elements (about 260000), but window stay open,
but when use wtf, program show error, but I must test again, because not remember what error show.
I will write when it happens again.
Re: array size
Hi Roger,
I get this error when use wtf to monitoring variables
I do not claim that it is wtf error, problem is in my program, resp. in data which I processing.
Program is simple, only open file, store content to variable, read data from this variable with controlling EOL to know where row end, , and store it to variable and after processing variable save to file.
File is not very large only 56MB, and this system works years, but now I have one file in which are blank rows with only CRLF sign, and this looks posses problem
With wtf I want find, on which row crashes.
I get this error when use wtf to monitoring variables
I do not claim that it is wtf error, problem is in my program, resp. in data which I processing.
Program is simple, only open file, store content to variable, read data from this variable with controlling EOL to know where row end, , and store it to variable and after processing variable save to file.
File is not very large only 56MB, and this system works years, but now I have one file in which are blank rows with only CRLF sign, and this looks posses problem
With wtf I want find, on which row crashes.
Code: Select all
FATAL ERROR LOG
Error within the error handling!
SYS Thread-ID: 1084
Module: EXE
Error Codes: EH: 1006 Sub: 0(0) OS: 0 XPP: 15
Call Stack of Thread 1 (1084):
DC_SKIPARRAY(3919)
(B)@DC_XBPBROWSE@I@INIT(581)
@XBPBROWSE@I@DOSKIP(2816)
@XBPBROWSE@I@FORCESTABLE(1314)
@DC_XBPBROWSE@I@FORCESTABLE(1427)
DC_DEBUGBROWSE(579)
FHTSU3D(1593)
HLAD3(857)
HVZ_SQL(3396)
(B)wolp_sql(848)
@DC_XBPPUSHBUTTONXP@I@ACTION(1422)
(B)@DC_XBPPUSHBUTTONXP@I@INIT(216)
@XBPPUSHBUTTON@I@HANDLEEVENT(1530)
@DC_GETLIST@I@EVENTLOOP(4651)
@DC_GETLIST@I@READGUI(3832)
DC_READGUI(111)
WOLP_SQL(1404)
(B)APPMENU2@1553(872)
@DC_XBPPUSHBUTTONXP@I@ACTION(1422)
(B)@DC_XBPPUSHBUTTONXP@I@INIT(216)
@XBPPUSHBUTTON@I@HANDLEEVENT(1530)
@DC_GETLIST@I@EVENTLOOP(4651)
@DC_GETLIST@I@READGUI(3832)
DC_READGUI(111)
APPMENU2(2287)
MAIN(1684)
Call Stack of GUI Thread (1256):
Call Stack of Thread 3 (2084):
@DC_SETTIMEREVENT@I@TIMERLOOP(2620)
(B)@DC_SETTIMEREVENT@I@INIT(2575)
Call Stack of Thread 4 (2172):
@JD_MAGICHELPTHREAD@I@EXECUTE(95)
(B)@JD_MAGICHELPTHREAD@I@INIT(41)
Call Stack of Thread 5 (2216):
@DC_SETTIMEREVENT@I@TIMERLOOP(2620)
(B)@DC_SETTIMEREVENT@I@INIT(2575)
Call Stack of Thread 6 (2332):
Call Stack of Thread 7 (2436):
@DC_GETLIST@I@EVENTLOOP(4131)
@DC_GETLIST@I@READGUI(3832)
DC_READGUI(111)
DC_DEBUGWINDOWBROWSE(931)
(B)_DebugBrowseWindow(618)
File: C:\PRG\Rauknw_30108\RAUKNW.exe
TimeStamp: 20190714 12:13
End of FATAL ERROR LOG
- Eugene Lutsenko
- Posts: 1649
- Joined: Sat Feb 04, 2012 2:23 am
- Location: Russia, Southern federal district, city of Krasnodar
- Contact:
Re: array size
Maybe, in the case of an empty string, when it consists only of CRLF, add one special character to the string, which will mean the absence of data?
Re: array size
Eugene, I do not know if this can help, on other files I have also blank lines, only CRLF and run without problems.
Only one file is special, where I read many rows to array, one block of file have about 416000 lines, and when reading, it slows in case of number rows readed.
I mean, this is memory problem.
Roger, in wtf can be some limit to read more than about 65000 rows ? I tested it, and stil when read to debug table about 65000 rows, crashed.
Only one file is special, where I read many rows to array, one block of file have about 416000 lines, and when reading, it slows in case of number rows readed.
I mean, this is memory problem.
Roger, in wtf can be some limit to read more than about 65000 rows ? I tested it, and stil when read to debug table about 65000 rows, crashed.
Re: array size
I need to make a change to WTF because it calls DC_Array2String() to put the contents in the browse window.
I will need to change it so it only does that on small arrays.
The memory failure is probably in DC_Array2String().
I will need to change it so it only does that on small arrays.
The memory failure is probably in DC_Array2String().
The eXpress train is coming - and it has more cars.
Re: array size
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.
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.)
*********************
Re: array size
Hi all,
I mean, found problem.
When using aadd() to add element to array, used like here : aadd(polozkavz,text,rp), where rp is counter for rows.
but I forget initialize array after every block,then in array stay old content with many rows, and third parameter causes "insert" element to position. I mean this slowing process because all elements move by position.
When not use third parameter, works all fine.
I mean, found problem.
When using aadd() to add element to array, used like here : aadd(polozkavz,text,rp), where rp is counter for rows.
but I forget initialize array after every block,then in array stay old content with many rows, and third parameter causes "insert" element to position. I mean this slowing process because all elements move by position.
When not use third parameter, works all fine.