Форум » [x]Harbour » DBFNTX: как грамотно прервать работу SET FILTER ? » Ответить

DBFNTX: как грамотно прервать работу SET FILTER ?

Sergy: Добрый день Есть некая таблица: date D8 idx1 N5 idx2 N5 flags C5 string C80 И есть фрагмент программы: [pre2]filter_sx := "" SELE table SET FILT TO IIF(LEN(filter_sx)==0,TRUE,(filter_sx $ table->str)) DBEDIT(...)[/pre2] Т.е. пока в строку фильтра ничего не попало - видны все записи. Если юзер хочет отфильтровать часть записей по содержимому строки - срабатывает фильтр. Возникает ситуация: если таблица большая (>100 тыс записей), расположена на сервере и юзер желает увидеть какие-то "редкие" записи, процесс фильтрации начинает занимать непозволительно долгое время. Юзер понимает, что лучше набрать в фильтре что-то другое, но как остановить процесс текущей фильтрации ? Делал так: [pre2]filter_sx := "" SELE table SET FILT TO MyFilter() DBEDIT(...) ... FUNC MyFilter() IF LEN(filter_sx) == 0 RETURN TRUE ELSEIF INKEY(0) == K_ESC // юзер устал ждать ? filter_sx := "" // выключаем фильтр RETURN TRUE ELSE RETURN (filter_sx $ table->string) ENDIF RETURN TRUE[/pre2] Но данный метод приводит вообще к чудным результатам: в 90% случаев после нажатия Esc - DBEDIT() начинает бешено прокручивать список вверх и зависает на первом элементе таблицы. Насколько понял по отладчику, что-то непонятное (для меня) происходит в недрах объекта в районе :Stabilize() С какой стороны к этому вопросу подступиться? PS: в Clipper было тоже самое - но когда тормозило всё, это было не так заметно, а сейчас, на фоне быстрой и адекватной работы Harbour... напрягает....

Ответов - 120, стр: 1 2 3 4 5 6 All

Andrey: Pasha пишет: Не буду даже пытаться объяснить, что к чему, просто покажу, как надо сделать: Спасибо БОЛЬШОЕ ! Как увидел, так сразу понял, раньше так делал. Просто уже глаза замылились....

Dima: Andrey пишет: Просто уже глаза замылились Глазам отдых нужен !

Andrey: dbEvalDirect() - заработал. Но Browse() ломается при показе после него и программ вылетает. Массив создается нормально. // Создание блока кода из выражения поиска bFilter := &("{||" + cFilterTo + "}") SELECT DOGOVOR dbEvalDirect(bDo, bFilter) BROWSE(1,0,MAXROW(),MAXCOL()) Как починить dbEvalDirect() или после него нельзя вызывать browse() ? C dbeval() таких проблем нет.


SergKis: Pasha dbEvalDirect() портит что-то ... prg: RddSetDefault( "DBFNTX" ) USE ( 'TEST' ) ALIAS TEST a := {} b := {|| right(R_32, 2) $ '02,04,06' } msglog(RecNo(),Alias()) i := seconds() dbEvalDirect({|| aAdd(a, RecNo()) }, b) msglog(seconds()-i,a, RecNo(),alias()) // aEval(a, {|xV,nE| msglog(nE, xV) }) GO TOP msglog(RecNo(),Alias()) USE // это 49 строка MAIN hb_out.log: Application Internal Error - C:\BK9\TEST\_TEST\INF\TEST.EXE Terminated at: 2013.11.26 12:23:40 Unrecoverable error 6005: Exception error: Exception Code:C0000005 Exception Address:00406C6A EAX:20202020 EBX:00000000 ECX:0000010C EDX:00000190 ESI:001F565C EDI:00000000 EBP:01271C88 CS:EIP:001B:00406C6A SS:ESP:0023:0012FE04 DS:0023 ES:0023 FS:003B GS:0000 Flags:00010202 CS:EIP: 8B 3C 28 A1 00 E7 52 00 33 F8 39 47 20 74 0A 5F SS:ESP: 00000000 00232088 0042A8F0 00000094 00407443 00000000 01271C90 0043C974 01271C94 001F565C 0021CA98 00000000 0045121F 001F565C 00000000 001F565C C stack: EIP: EBP: Frame: OldEBP, RetAddr, Params... 00406C6A 01271C88 20202020 20202020 20202020 98302020 20202051 34302020 3231312F 30313130 37343131 35352020 Modules: 0x00400000 0x0013E000 C:\BK9\TEST\_TEST\INF\TEST.EXE 0x777C0000 0x0013C000 C:\Windows\SYSTEM32\ntdll.dll 0x76AB0000 0x000D4000 C:\Windows\system32\kernel32.dll 0x75B00000 0x0004B000 C:\Windows\system32\KERNELBASE.dll 0x771E0000 0x000C9000 C:\Windows\system32\USER32.dll 0x770E0000 0x0004E000 C:\Windows\system32\GDI32.dll 0x779E0000 0x0000A000 C:\Windows\system32\LPK.dll 0x76EC0000 0x0009D000 C:\Windows\system32\USP10.dll 0x77130000 0x000AC000 C:\Windows\system32\msvcrt.dll 0x75D70000 0x00C4A000 C:\Windows\system32\SHELL32.dll 0x769C0000 0x00057000 C:\Windows\system32\SHLWAPI.dll 0x74850000 0x0019E000 C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\COMCTL32.dll 0x773C0000 0x000A0000 C:\Windows\system32\ADVAPI32.dll 0x76B90000 0x00019000 C:\Windows\SYSTEM32\sechost.dll 0x77680000 0x000A1000 C:\Windows\system32\RPCRT4.dll 0x76F60000 0x0015C000 C:\Windows\system32\ole32.dll 0x77330000 0x0008F000 C:\Windows\system32\OLEAUT32.dll 0x770C0000 0x0001F000 C:\Windows\system32\IMM32.DLL 0x77910000 0x000CC000 C:\Windows\system32\MSCTF.dll Called from DBCLOSEAREA(0) Called from MAIN(49) in .\PRG\TEST.txt ------------------------------------------------------------------------ мой log, тест работы: 1 TEST 0.5770 ARRAY[51218] 206903 TEST 1 TEST

Pasha: SergKis пишет: Pasha dbEvalDirect() портит что-то ... Поправил, переименовал функцию в dbfEval, добавил поддержку всех параметров, как в dbEval, сборку под xharbour: http://files.mail.ru/A324711CF8A94781808E50C7BEB48B30

SergKis: Pasha prg: a := {} dbfEval({|| aAdd(a, RecNo()) }, b) GO TOP browse() USE без Browse не снимается с Browse валится hb_out.log: [pre2] Application Internal Error - C:\BK9\TEST\_TEST\INF\_dbfEval.exe Terminated at: 2013.11.27 19:32:34 Unrecoverable error 6005: Exception error: Exception Code:C0000005 Exception Address:00422969 EAX:20202020 EBX:001E76AC ECX:20202020 EDX:80808080 ESI:001E153C EDI:00000000 EBP:0012FC70 CS:EIP:001B:00422969 SS:ESP:0023:0012FC64 DS:0023 ES:0023 FS:003B GS:0000 Flags:00010282 CS:EIP: 8B 01 8B 4B 10 03 C2 C1 E1 02 03 C1 8B 18 EB 12 SS:ESP: 00000000 001E153C 001E76AC 0012FC9C 0041238E 001E76AC 0012FDC8 0012FCEC 004E44E0 00422299 00417DAB 0012FDC8 0012FCEC 004F18B8 0012FCC8 004085BA C stack: EIP: EBP: Frame: OldEBP, RetAddr, Params... 00422969 0012FC70 0012FC9C 0041238E 001E76AC 0012FDC8 0012FCEC 004E44E0 00422299 00417DAB 0012FDC8 0012FCEC 0041238E 0012FC9C 0012FCC8 004085BA 001E76AC 004E44E0 0012FCB4 004F18B8 00000022 00000003 00000000 00000000 004085BA 0012FCC8 0012FCE0 0040BAB7 00000000 0012FDC8 0012FCEC 004E4EB0 0040BAB7 0012FCE0 0012FD14 004651FF 00000000 00000001 0012FD38 004E4430 004085F9 004F18B8 00000015 00000003 004651FF 0012FD14 0012FD2C 0040BAB7 00000001 0012FDC8 0012FD38 004E4EB0 0040BAB7 0012FD2C 0012FD60 00466ABC 00000001 00000000 00000000 004E46D0 004085F9 004F18B8 00000013 00000003 00466ABC 0012FD60 0012FD78 0040BAB7 001E0000 0012FDC8 00000000 004E0770 0040BAB7 0012FD78 0012FDA4 00466F66 00000000 0012FD90 004085F9 004F18B8 00000003 00000003 00000000 00A70004 00466F66 0012FDA4 0012FDBC 0040BAB7 00000000 0012FDC8 00000000 004E0BD0 0040BAB7 0012FDBC 004E0C15 0045014B 00000000 00000000 004F18B8 0012FDF8 004DC600 00000000 004F18B8 0040843C Modules: 0x00400000 0x00103000 C:\BK9\TEST\_TEST\INF\_dbfEval.exe 0x77640000 0x0013C000 C:\Windows\SYSTEM32\ntdll.dll 0x76D40000 0x000D4000 C:\Windows\system32\kernel32.dll 0x75770000 0x0004B000 C:\Windows\system32\KERNELBASE.dll 0x769C0000 0x000C9000 C:\Windows\system32\USER32.DLL 0x771B0000 0x0004E000 C:\Windows\system32\GDI32.dll 0x777A0000 0x0000A000 C:\Windows\system32\LPK.dll 0x76C90000 0x0009D000 C:\Windows\system32\USP10.dll 0x77030000 0x000AC000 C:\Windows\system32\msvcrt.dll 0x777B0000 0x0001F000 C:\Windows\system32\IMM32.DLL 0x770E0000 0x000CC000 C:\Windows\system32\MSCTF.dll Called from (b)EVAL(0) Called from TBROWSE:READRECORD(0) in ../../../tbrowse.prg Called from TBROWSE:STABILIZE(0) in ../../../tbrowse.prg Called from TBROWSE:FORCESTABLE(0) in ../../../tbrowse.prg Called from BROWSE(0) in ../../../browse.prg Called from MAIN(45) in _dbfEval.prg ------------------------------------------------------------------------ Application Internal Error - C:\BK9\TEST\_TEST\INF\_dbfEval.exe Terminated at: 2013.11.27 19:32:37 Unrecoverable error 6005: Exception error: Exception Code:C0000005 Exception Address:00422969 EAX:20202020 EBX:001E76AC ECX:20202020 EDX:80808080 ESI:001E153C EDI:00000000 EBP:0012FC70 CS:EIP:001B:00422969 SS:ESP:0023:0012FC64 DS:0023 ES:0023 FS:003B GS:0000 Flags:00010282 CS:EIP: 8B 01 8B 4B 10 03 C2 C1 E1 02 03 C1 8B 18 EB 12 SS:ESP: 00000000 001E153C 001E76AC 0012FC9C 0041238E 001E76AC 0012FDC8 0012FCEC 004E44E0 00422299 00417DAB 0012FDC8 0012FCEC 004F18B8 0012FCC8 004085BA C stack: EIP: EBP: Frame: OldEBP, RetAddr, Params... 00422969 0012FC70 0012FC9C 0041238E 001E76AC 0012FDC8 0012FCEC 004E44E0 00422299 00417DAB 0012FDC8 0012FCEC 0041238E 0012FC9C 0012FCC8 004085BA 001E76AC 004E44E0 0012FCB4 004F18B8 00000022 00000003 00000000 00000000 004085BA 0012FCC8 0012FCE0 0040BAB7 00000000 0012FDC8 0012FCEC 004E4EB0 0040BAB7 0012FCE0 0012FD14 004651FF 00000000 00000001 0012FD38 004E4430 004085F9 004F18B8 00000015 00000003 004651FF 0012FD14 0012FD2C 0040BAB7 00000001 0012FDC8 0012FD38 004E4EB0 0040BAB7 0012FD2C 0012FD60 00466ABC 00000001 00000000 00000000 004E46D0 004085F9 004F18B8 00000013 00000003 00466ABC 0012FD60 0012FD78 0040BAB7 001E0000 0012FDC8 00000000 004E0770 0040BAB7 0012FD78 0012FDA4 00466F66 00000000 0012FD90 004085F9 004F18B8 00000003 00000003 00000000 00A70004 00466F66 0012FDA4 0012FDBC 0040BAB7 00000000 0012FDC8 00000000 004E0BD0 0040BAB7 0012FDBC 004E0C15 0045014B 00000000 00000000 004F18B8 0012FDF8 004DC600 00000000 004F18B8 0040843C Modules: 0x00400000 0x00103000 C:\BK9\TEST\_TEST\INF\_dbfEval.exe 0x77640000 0x0013C000 C:\Windows\SYSTEM32\ntdll.dll 0x76D40000 0x000D4000 C:\Windows\system32\kernel32.dll 0x75770000 0x0004B000 C:\Windows\system32\KERNELBASE.dll 0x769C0000 0x000C9000 C:\Windows\system32\USER32.DLL 0x771B0000 0x0004E000 C:\Windows\system32\GDI32.dll 0x777A0000 0x0000A000 C:\Windows\system32\LPK.dll 0x76C90000 0x0009D000 C:\Windows\system32\USP10.dll 0x77030000 0x000AC000 C:\Windows\system32\msvcrt.dll 0x777B0000 0x0001F000 C:\Windows\system32\IMM32.DLL 0x770E0000 0x000CC000 C:\Windows\system32\MSCTF.dll Called from (b)EVAL(0) Called from TBROWSE:READRECORD(0) in ../../../tbrowse.prg Called from TBROWSE:STABILIZE(0) in ../../../tbrowse.prg Called from TBROWSE:FORCESTABLE(0) in ../../../tbrowse.prg Called from BROWSE(0) in ../../../browse.prg Called from MAIN(45) in _dbfEval.prg ------------------------------------------------------------------------ [/pre2] содержимое hb_out.log получено за один запуск exe. вариант со стандартным dbEval работает.

SergKis: Pasha это hb 3.2 bcc. под MSVC и hb 2.0 без browse валится на USE закрытия. hb_out.log:[pre2] Application Internal Error - C:\BK9\TEST\_TEST\INF\TEST.EXE Terminated at: 2013.11.27 19:45:04 Unrecoverable error 6005: Exception error: Exception Code:C0000005 Exception Address:00406D3A EAX:20202020 EBX:00000000 ECX:0000014C EDX:00000190 ESI:003D56D4 EDI:00000000 EBP:003F1C88 CS:EIP:001B:00406D3A SS:ESP:0023:0012FE04 DS:0023 ES:0023 FS:003B GS:0000 Flags:00010202 CS:EIP: 8B 3C 28 A1 20 E7 52 00 33 F8 39 47 20 74 0A 5F SS:ESP: 00000000 00701F90 0042A9C0 00000094 00407513 00000000 003F1C90 0043CC04 003F1C94 003D56D4 0054CA98 00000000 004514AF 003D56D4 00000000 003D56D4 C stack: EIP: EBP: Frame: OldEBP, RetAddr, Params... 00406D3A 003F1C88 20202020 20202020 20202020 98302020 20202051 34302020 3231312F 30313130 37343131 35352020 Modules: 0x00400000 0x0013E000 C:\BK9\TEST\_TEST\INF\TEST.EXE 0x77640000 0x0013C000 C:\Windows\SYSTEM32\ntdll.dll 0x76D40000 0x000D4000 C:\Windows\system32\kernel32.dll 0x75770000 0x0004B000 C:\Windows\system32\KERNELBASE.dll 0x769C0000 0x000C9000 C:\Windows\system32\USER32.dll 0x771B0000 0x0004E000 C:\Windows\system32\GDI32.dll 0x777A0000 0x0000A000 C:\Windows\system32\LPK.dll 0x76C90000 0x0009D000 C:\Windows\system32\USP10.dll 0x77030000 0x000AC000 C:\Windows\system32\msvcrt.dll 0x75A50000 0x00C4A000 C:\Windows\system32\SHELL32.dll 0x759F0000 0x00057000 C:\Windows\system32\SHLWAPI.dll 0x745C0000 0x0019E000 C:\Windows\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\COMCTL32.dll 0x773A0000 0x000A0000 C:\Windows\system32\ADVAPI32.dll 0x77780000 0x00019000 C:\Windows\SYSTEM32\sechost.dll 0x76E60000 0x000A1000 C:\Windows\system32\RPCRT4.dll 0x76860000 0x0015C000 C:\Windows\system32\ole32.dll 0x76FA0000 0x0008F000 C:\Windows\system32\OLEAUT32.dll 0x777B0000 0x0001F000 C:\Windows\system32\IMM32.DLL 0x770E0000 0x000CC000 C:\Windows\system32\MSCTF.dll Called from DBCLOSEAREA(0) Called from MAIN(65) in .\PRG\TEST.txt ------------------------------------------------------------------------ [/pre2]

Andrey: Pasha Не собирается под xHarbour 1.2.3 Intl. (SimpLex) (Build 20130903) Copyright 1999-2013, http://www.xharbour.org http://www.harbour-project.org/ Compiling 'DBFEVAL.PRG'... Generating C source output to 'obj\DBFEVAL.c'... Done. Building object module for 'obj\DBFEVAL.c' using C compiler 'BCC32' as defined in 'Z:\xHARBOUR\BIN\harbour.cfg'... Exec: BCC32 -c -D__EXPORT__ -IZ:\xHARBOUR\include -d -LZ:\xHARBOUR\lib -oobj\DBFEVAL.obj obj\DBFEVAL.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland obj\DBFEVAL.c: Warning W8075 DBFEVAL.PRG 32: Suspicious pointer conversion in function HB_FUN_DBFEVAL Warning W8075 DBFEVAL.PRG 37: Suspicious pointer conversion in function HB_FUN_DBFEVAL Error E2451 DBFEVAL.PRG 50: Undefined symbol 'hDataFile' in function HB_FUN_DBFEVAL Error E2451 DBFEVAL.PRG 54: Undefined symbol 'hDataFile' in function HB_FUN_DBFEVAL *** 2 errors in Compile *** Done. Deleting: "obj\DBFEVAL.c" Done. Lines 2, Functions/Procedures 0, pCodes 0

ММК: Andrey пишет: Не собирается под Пока возникли небольшие технические трудности я вас немножко развлеку. Необходимость в функции поиска возникает регулярно. И регулярно появляются разные варианты (но в Харбор , как стандартную функцию их почему то не включают :) ) Вот один из таких :)) http://files.mail.ru/4B45968E44E6429AB810802AB86AE7DF База shared , без индекса. Записей чуть больше трех с половиной лимонов. При поиске используются стандартные управляющие символы "?" и "*" . Анализ кодировки ( дос или win) и формирование массива с номерами найденных записей. Формат функции : поле, шаблон поиска, кодировка. #include "FiveWin.ch" Function Main Local nTime,n:=0 Local popa:={}, vr RDDSetDefault('DBFCDX') Use dr new shared nTime := Seconds() while (vr:=FLocate('TYJ','D?d*','D'))<>-1 N:=n+1 aadd(popa,vr) enddo MsgInfo( Seconds() - nTime ) for vr=1 to len(popa) MsgInfo( popa[vr] ) next Return NIL Скорость ,естественно , зависит от машины. Есть небольшая погрешность - память очищается не "до" , а "после " поэтому запустите примерчик два-три раза.... На моей машине это приблизительно 0.7 секунды

SergKis: MMK пишет:На моей машине это приблизительно 0.7 секунды у меня ~ 1.37. но в данном примере 4 поля и длина записи 40, в моем 92 и 912. Функция dbfEval работает в 4 раза быстрее стабильно: [pre2] Do while: 2.2470 ARRAY[51218] 206904 DbEval : 2.2460 ARRAY[51218] 206904 DbfEval : 0.5140 ARRAY[51218] 206903 [/pre2]

Dima: ММК пишет: FLocate Что за черный ящик ?

ММК: SergKis пишет: но в данном примере 4 поля и длина записи 40, в моем 92 и 912 Ну это понятно, понятно.... А не затруднит Вас сделать поиск по моей базке и сформировать массив? Шаблон D?d* . Т.е. с учетом ? и * . Для чистоты эксперемента :)))) Dima пишет: Что за черный ящик ? Да старые архивы перебирал :) Нашел Fast Locate

Dima: ММК пишет: Нашел Fast Locate Исходничек тоже есть ? :)

SergKis: MMK пишет: А не затруднит ... Сделал: маску превратил в: upper(left(TYJ,1)+subs(TYJ,3,1)) == 'DD' [pre2] Do while: 35.1160 ARRAY[5] 3506491 DbEval : 35.7870 ARRAY[5] 3506491 DbfEval : 7.3320 ARRAY[5] 3506490 [/pre2] Результат FastLocate впечатляет !

Pasha: SergKis пишет: без Browse не снимается с Browse валится hb_out.log: Я пока в затруднении. Дело в том, что я таких ошибок не получаю, никакого последействия нет. Вот прицепил эту функцию к своему dbedit, тоже все работает. Да и кода в dbfEval с гулькин нос, непонятно, откуда взяться ошибке.

Andrey: Pasha Не собирается под xHarbour 1.2.3 Intl. (SimpLex) (Build 20130903) Copyright 1999-2013, http://www.xharbour.org http://www.harbour-project.org/ Compiling 'DBFEVAL.PRG'... Generating C source output to 'obj\DBFEVAL.c'... Done. Building object module for 'obj\DBFEVAL.c' using C compiler 'BCC32' as defined in 'Z:\xHARBOUR\BIN\harbour.cfg'... Exec: BCC32 -c -D__EXPORT__ -IZ:\xHARBOUR\include -d -LZ:\xHARBOUR\lib -oobj\DBFEVAL.obj obj\DBFEVAL.c Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland obj\DBFEVAL.c: Warning W8075 DBFEVAL.PRG 32: Suspicious pointer conversion in function HB_FUN_DBFEVAL Warning W8075 DBFEVAL.PRG 37: Suspicious pointer conversion in function HB_FUN_DBFEVAL Error E2451 DBFEVAL.PRG 50: Undefined symbol 'hDataFile' in function HB_FUN_DBFEVAL Error E2451 DBFEVAL.PRG 54: Undefined symbol 'hDataFile' in function HB_FUN_DBFEVAL *** 2 errors in Compile *** Done. Deleting: "obj\DBFEVAL.c" Done. Lines 2, Functions/Procedures 0, pCodes 0

SergKis: Pasha собрал как есть: http://gfile.ru/a2yK5 browse перестал слетать и пару раз даже без снятия отработал.

ММК: SergKis пишет: Do while: 35.1160 ARRAY[5] 3506491 DbEval : 35.7870 ARRAY[5] 3506491 DbfEval : 7.3320 ARRAY[5] 3506490 Результат FastLocate впечатляет ! Спасибо , что уделили внимание ! Pasha пишет: Я пока в затруднении. Дело в том, что я таких ошибок не получаю, никакого последействия нет. Если у Вас есть желание и время я пришлю Вам исходник. Может из двух вариантов получится что хорошее для народа :)) Dima пишет: Исходничек тоже есть ? :) Вот ,собственно говоря , ответ :)))

Dima: ММК пишет: Если у Вас есть желание и время я пришлю Вам исходник. Может из двух вариантов получится что хорошее для народа :)) Ждем Пашу !

Pasha: Да я уже со всем разобрался, вечером скину. Должен сказать, что в letodb выборка по установленному фильтру по скорости сопоставима с dbfEval, (хотя чуть медленнее) Но так и должно быть, поскольку letodb работает в монопольном режиме. А насчет fast locate - если его скорость сопоставима или лучше, чем в dbfEval, есть смысл на него глянуть.



полная версия страницы