Вверх ↑
Этот топик читают: Гость
Этот топик был перемещен из раздела "Помощь по среде"
Ответов: 322
Рейтинг: 8
#1: 2017-01-24 14:01:40 ЛС | профиль | цитата
Прошу гуру HiAsm подсказать как правильно сделать запрос поиска по базе - мне нужно, что бы при вводе букв в строке таблица обновлялась и выводились варианты наименований из базы с начальными буквами которые ввожу.
Возможно такая тема уже была, если да - дайте ссылку.

Add(MainForm,7851702,154,77)
{
Width=337
Height=533
}
Add(SQLite_DB,11491245,301,203)
{
FileName="notebook.db"
link(onOpen,12755171:doString,[])
link(onError,14399684:doMessage,[(363,216)(363,328)])
}
Add(SQLite_Query,34590,560,189)
{
link(onQuery,14865837:doStr,[])
link(onError,3817780:doMessage,[(625,209)(625,307)])
link(dbHandle,11491245:dbHandle,[(566,177)(525,177)(525,248)(307,248)])
}
Add(Hub,10580939,259,196)
{
link(onEvent1,4414019:doClear,[])
link(onEvent2,11491245:doOpen,[])
}
Add(FormatStr,12755171,378,203)
{
DataCount=1
Mask="select * from note where gf2 like '%1%'"
link(onFString,34590:doQuery,[(485,209)(485,195)])
link(Str1,14684736:Text,[])
}
Add(Edit,14684736,378,84)
{
Left=50
Top=15
Width=215
Text=""
link(onChange,10580939:doEvent1,[(429,90)(429,146)(247,146)(247,202)])
}
Add(Message,14399684,406,322)
{
Caption="1 опс"
}
Add(StringTableMT,4414019,714,189)
{
Left=5
Top=50
Width=310
Height=440
Columns=#12:Наименование|
ColumnWidth=130
TabGrid=0
TabGridFrame=0
Grid=0
IconsCheck=[]
MiscIcons=[]
Icons=[]
Point(doAddColumn)
}
Add(Message,3817780,644,301)
{
Caption="2 опс"
}
Add(MT_String,14865837,637,189)
{
link(onResult,4414019:doAdd,[])
}
Заранее всем спасибо.
карма: 0

0
Ответов: 198
Рейтинг: 2
#2: 2017-01-24 16:32:11 ЛС | профиль | цитата
А что не работает то? Все же работает
Только базу данных не нужно каждый раз открывать, а так все вроде норм.


Add(MainForm,7851702,203,301)
{
Width=337
Height=533
link(onCreate,11491245:doOpen,[])
}
Add(SQLite_DB,11491245,252,315)
{
FileName="notebook.db"
link(onError,14399684:doMessage,[])
}
Add(SQLite_Query,34590,378,273)
{
link(onQuery,14865837:doStr,[])
link(onError,3817780:doMessage,[])
link(dbHandle,11491245:dbHandle,[(384,261)(358,261)(358,358)(258,358)])
}
Add(Hub,10580939,217,266)
{
link(onEvent1,5056763:In,[])
link(onEvent2,12755171:doString,[])
}
Add(FormatStr,12755171,301,273)
{
DataCount=1
Mask="select * from note where gf2 like '%1%'"
link(onFString,34590:doQuery,[])
link(Str1,14684736:Text,[])
}
Add(Edit,14684736,301,189)
{
Left=50
Top=15
Width=215
Text=""
link(onChange,10580939:doEvent1,[(348,195)(348,236)(209,236)(209,272)])
}
Add(Message,14399684,301,322)
{
Caption="1 опс"
}
Add(StringTableMT,4414019,560,273)
{
Left=5
Top=50
Width=310
Height=440
Columns=#12:Наименование|10:Еще что-то|
ColumnWidth=130
TabGrid=0
TabGridFrame=0
Grid=0
IconsCheck=[]
MiscIcons=[]
Icons=[]
Point(doAddColumn)
}
Add(Message,3817780,427,287)
{
Caption="2 опс"
}
Add(LineBreak,13847637,518,280)
{
link(Out,4414019:doClear,[])
Primary=[5056763,-266,-14]
}
Add(MT_String,14865837,476,273)
{
link(onResult,4414019:doAdd,[])
}

карма: 0

0
Ответов: 322
Рейтинг: 8
#3: 2017-01-24 17:55:53 ЛС | профиль | цитата
Вот моя база - (http://file.sampo.ru/t5j7w4/), с которой мне нужно выбирать наименование из колонки gf2. При вводе букв в таблице выдаёт цифры по порядку, но не как не наименование которое начинается с этих букв!
Очень прошу помочь, кто сможет.

--- Добавлено в 2017-01-24 17:56:53

таблица обновляется при вводе нового символа.

Редактировалось 2 раз(а), последний 2017-01-24 18:52:24
карма: 0

0
Ответов: 322
Рейтинг: 8
#4: 2017-01-24 19:35:28 ЛС | профиль | цитата
Разобрался работает, но не после каждого символа (набираешь 3-4 символа тогда фильтрует, через следующие 3-4 символа ещё фильтрует) и т.д.
Конечно хотелось-бы после каждого символа.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#5: 2017-01-24 20:32:06 ЛС | профиль | цитата
1. Никогда не заставляю оператора вводить символы с клавиатуры. ИМХО.
2. Тем более LIKE не работает (без танцев с бубном) с символами с кодами > 128 (русские буквы)
3. Если записей с полмиллиона, то время каждого поиска в минутах.
4. Моргание таблицы после ввода каждой буквы. Офигеть.
5. Если операторов несколько, то они тебя убьют и суд их оправдает.
Add(MainForm,7851702,217,224)
{
Width=441
Height=533
Point(onClose)
link(onCreate,11491245:doOpen,[])
link(onClose,11491245:doClose,[])
}
Add(SQLite_DB,11491245,266,238)
{
FileName="notebook.db"
link(onOpen,12755171:doString,[])
link(onError,14399684:doMessage,[(312,251)(312,300)])
}
Add(SQLite_Query,34590,399,245)
{
link(onQuery,14865837:doStr,[])
link(onError,3817780:doMessage,[(443,265)(443,293)])
link(dbHandle,11491245:dbHandle,[(405,233)(361,233)(361,282)(272,282)])
}
Add(Hub,10580939,371,238)
{
link(onEvent1,9854747:doClear,[(492,244)(492,258)])
link(onEvent2,34590:doQuery,[])
}
Add(FormatStr,12755171,322,238)
{
DataCount=1
Mask="SELECT DISTINCT gf2 FROM note ORDER BY gf2;"
link(onFString,10580939:doEvent1,[])
}
Add(Message,14399684,322,294)
{
Caption="1 опс"
}
Add(Message,3817780,448,287)
{
Caption="2 опс"
}
Add(MT_String,14865837,448,245)
{
link(onResult,9854747:doAdd,[])
}
Add(ComboBox,9854747,511,245)
{
Left=5
Top=15
Width=415
Height=21
DropDownCount=30
}


Редактировалось 3 раз(а), последний 2017-01-24 20:57:09
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 322
Рейтинг: 8
#6: 2017-01-25 06:27:36 ЛС | профиль | цитата
Полностью согласен с миганиями и т.д., но как быть с тем - если нужно из списка выбрать несколько значений с одинаковым названием в начале, но разным продолжением?
В связи с этим и появился запрос именно на такой способ поиска.
карма: 0

0
Ответов: 198
Рейтинг: 2
#7: 2017-01-25 07:26:08 ЛС | профиль | цитата
Я конечно не профи, но можно попробовать:

1. Выгрузить нужные столбцы в программу после ввода первого символа, а затем делать поиск в оставшемся только средствами приложения.
2. Или сделать поиск по минимум трем символам, если такой подход возможен.

Хотя при большем объеме базы это один хрен тормоза.
карма: 0

0
Ответов: 322
Рейтинг: 8
#8: 2017-01-25 08:58:43 ЛС | профиль | цитата
Согласен что тормоза.
Да и база со 187 строками уже моргает, что говорить о большем количестве строк.
Видимо придётся остановится на совете "Tad".
Спасибо всем за дельные советы.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#9: 2017-01-25 09:42:29 ЛС | профиль | цитата
Можно так:
Add(MainForm,7851702,217,224)
{
Width=764
Height=207
Point(onClose)
link(onCreate,11491245:doOpen,[])
link(onClose,11491245:doClose,[])
}
Add(SQLite_DB,11491245,266,238)
{
FileName="notebook.db"
link(onOpen,10758059:doQuery,[])
link(onError,14399684:doMessage,[(312,251)(312,300)])
}
Add(SQLite_Query,34590,532,252)
{
link(onQuery,9854747:doAdd,[])
link(onError,3817780:doMessage,[(576,272)(576,314)])
link(dbHandle,4851005:Var3,[(538,219)])
}
Add(Hub,10580939,504,245)
{
link(onEvent1,9854747:doClear,[(572,251)(572,265)])
link(onEvent2,34590:doQuery,[])
}
Add(FormatStr,12755171,462,245)
{
DataCount=1
Mask="SELECT gf2 FROM note WHERE substr(gf2,1,1)='%1' ORDER BY gf2;"
link(onFString,10580939:doEvent1,[])
}
Add(Message,14399684,343,294)
{
Caption="1 опс"
}
Add(Message,3817780,581,308)
{
Caption="2 опс"
}
Add(ComboBox,9854747,581,252)
{
Left=140
Top=15
Width=595
Height=21
DropDownCount=30
}
Add(ComboBox,12721352,406,238)
{
Left=70
Top=15
Height=21
DataType=1
link(onClick,12755171:doString,[])
}
Add(Label,11543057,217,294)
{
Left=10
Top=10
Height=30
Caption="Первая\r\nбуква:"
AutoSize=1
Alignment=1
}
Add(SQLite_Query,10758059,343,238)
{
SQL="SELECT DISTINCT substr(gf2,1,1) AS a FROM note ORDER BY a;"
link(onQuery,12721352:doAdd,[])
link(dbHandle,4851005:Var2,[])
}
Add(GetDataEx,4851005,343,214)
{
Angle=3
link(Data,11491245:dbHandle,[(323,219)(323,283)(272,283)])
}

или так:
Add(MainForm,7851702,217,224)
{
Width=764
Height=207
Point(onClose)
link(onCreate,11491245:doOpen,[])
link(onClose,11491245:doClose,[])
}
Add(SQLite_DB,11491245,266,238)
{
FileName="notebook.db"
link(onOpen,2573979:doEvent1,[])
link(onError,14399684:doMessage,[(312,251)(312,300)])
}
Add(SQLite_Query,34590,546,259)
{
link(onQuery,9854747:doAdd,[])
link(onError,3817780:doMessage,[(590,279)(590,321)])
link(dbHandle,11491245:dbHandle,[(552,219)(316,219)(316,277)(272,277)])
}
Add(Hub,10580939,518,252)
{
link(onEvent1,9854747:doClear,[(601,258)(601,272)])
link(onEvent2,34590:doQuery,[])
}
Add(FormatStr,12755171,476,252)
{
DataCount=1
Mask="SELECT gf2 FROM note WHERE substr(gf2,1,pos(' ',gf2))='%1' ORDER BY gf2;"
link(onFString,10580939:doEvent1,[])
}
Add(Message,14399684,357,294)
{
Caption="1 опс"
}
Add(Message,3817780,616,315)
{
Caption="2 опс"
}
Add(ComboBox,9854747,616,259)
{
Left=205
Top=15
Width=530
Height=21
Text=""
DropDownCount=30
}
Add(ComboBox,12721352,420,245)
{
Left=70
Top=15
Width=125
Height=21
Text=""
DataType=1
DropDownCount=30
link(onClick,12755171:doString,[])
}
Add(Label,11543057,217,294)
{
Left=10
Top=10
Height=30
Caption="Первое\r\nслово:"
AutoSize=1
Alignment=1
}
Add(SQLite_Query,10758059,357,245)
{
SQL="SELECT DISTINCT substr(gf2,1,pos(' ',gf2)) AS a FROM note ORDER BY a;"
link(onQuery,12721352:doAdd,[])
}
Add(InlineCode,11586007,357,175)
{
@Hint=#5:Pos()|
WorkPoints=#11:addFunction|
DataPoints=#8:dbHandle|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|52:uses kol,Share,Debug,Windows,SQLite3Api,hiSQLite_DB;|0:|4:type|28: THiAsmClass = class(TDebug)|9: public|24: dbHandle : THI_Event;|52: procedure addFunction(var _Data:TData; idx:word);|5: end;|46:type arr = array[0..1] of PValue; parr = ^arr;|14:implementation|66:procedure MyFunc(ctx:pointer; nArg:integer; data:ppvalue); cdecl;|19:var s, ss : string;|16: i : integer;|5:begin|43: s := sqlite3_value_text(parr(data)[0]);|48: ss := sqlite3_value_text(parr(data)[1])+'.';|19: i := pos(s,ss);|32: sqlite3_result_int(ctx,i); |4:end;|0:|34:procedure THiAsmClass.addFunction;|13:var dt:TData;|13: s:string;|5:begin|37: dt := ReadData(_Data,dbHandle,nil);|41: if _IsObject(dt,SQLite_GUID) then begin|86: sqlite3_create_function(ToObject(dt),PChar('POS'),2,SQLITE_ANY,nil,@myFunc,nil,nil);|6: end;|4:end;|0:|4:end.|1:{|45:function sqlite3_create_collation(db:pointer;|14: zName:pchar;|19: eTextRep:integer;|19: userData:pointer;|38: func:TUserCollation):integer; cdecl;|1:}|
AddHint(-17,-29,39,13,@Hint)
}
Add(Hub,2573979,322,238)
{
link(onEvent1,11586007:addFunction,[(350,244)(350,181)])
link(onEvent2,10758059:doQuery,[])
}

Если используется последняя версия sqlite3.dll, то вместо доморощенной функции Pos() используется instr().

Редактировалось 3 раз(а), последний 2017-01-25 15:14:03
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 322
Рейтинг: 8
#10: 2017-01-26 15:53:18 ЛС | профиль | цитата
Ещё вариант на основе твоей программы

Add(MainForm,7851702,161,147)
{
Width=572
Height=460
Point(onClose)
link(onCreate,11491245:doOpen,[])
link(onClose,11491245:doClose,[])
}
Add(SQLite_DB,11491245,238,161)
{
FileName="notebook.db"
link(onOpen,10758059:doQuery,[])
link(onError,14399684:doMessage,[(292,174)(292,314)])
}
Add(SQLite_Query,34590,630,175)
{
link(onQuery,5426789:doAdd,[])
link(onError,3817780:doMessage,[(688,195)(688,237)])
link(dbHandle,4851005:Var3,[(636,142)])
}
Add(Hub,10580939,602,168)
{
link(onEvent1,5426789:doClear,[(690,174)(690,188)])
link(onEvent2,34590:doQuery,[])
}
Add(FormatStr,12755171,560,168)
{
DataCount=1
Mask="SELECT gf2 FROM note WHERE substr(gf2,1,1)='%1' ORDER BY gf2;"
link(onFString,10580939:doEvent1,[])
}
Add(Message,14399684,308,308)
{
Caption="1 опс"
}
Add(Message,3817780,714,231)
{
Caption="2 опс"
}
Add(SQLite_Query,10758059,315,161)
{
SQL="SELECT DISTINCT substr(gf2,1,1) AS a FROM note ORDER BY a;"
link(onQuery,15144961:doAdd,[])
link(dbHandle,4851005:Var2,[])
}
Add(GetDataEx,4851005,315,137)
{
Angle=3
link(Data,11491245:dbHandle,[(295,142)(295,206)(244,206)])
}
Add(StringTableMT,15144961,406,161)
{
Left=5
Top=5
Width=65
Height=410
Columns=#11:Буква=50==2|
IconsCheck=[]
MiscIcons=[]
Icons=[]
Point(doAddColumn)
Point(Matrix)
Point(Index)
link(onClick,15867393:doWork1,[(450,167)(450,222)(408,222)(408,251)])
}
Add(StringTableMT,5426789,763,175)
{
Left=75
Top=5
Width=475
Height=410
Columns=#19:Наименование=450==2|
TabGrid=0
Grid=0
IconsCheck=[]
MiscIcons=[]
Icons=[]
}
Add(MultiElement,15867393,420,245)
{
link(onEvent1,12755171:doString,[(506,251)(506,174)])
link(Data1,15144961:Matrix,[])
link(Data2,15144961:Index,[])
}
BEGIN_SDK
Add(EditMulti,11107367,21,21)
{
EventCount=1
WorkCount=1
DataCount=2
VarCount=1
Width=223
Height=88
link(doWork1,15249824:doEvent2,[(63,27)(63,62)])
link(Var1,9946774:Value,[(27,95)(202,95)])
}
Add(MatrixRW,15125939,133,49)
{
link(onRead,9946774:doValue,[])
link(Matrix,11107367:Data1,[(139,35)(27,35)])
link(X,15299142:Value,[(153,41)(96,41)(96,89)(48,89)])
link(Y,11107367:Data2,[(160,31)(34,31)])
}
Add(Hub,15249824,105,49)
{
InCount=2
OutCount=1
link(onEvent1,15125939:doRead,[])
}
Add(Memory,15299142,42,49)
{
Default=Integer(0)
link(onData,15249824:doEvent1,[])
}
Add(Memory,9946774,196,49)
{
link(onData,11107367:onEvent1,[(236,55)(236,27)])
}
END_SDK
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#11: 2017-01-26 22:18:12 ЛС | профиль | цитата
Dad2016, вариантов море.
Конечно наличие у ПАО "Оренбургнефть" Труба профильная 160х160х6 ст.3сп5 ГОСТ 30245-03 производства ОАО "Уральский Трубный Завод" это хорошо, но причем здесь в этой-же строке Ведущий инженер по надзору строительства ПАО "Оренбургнефть" Русаков Д.А. совершенно непонятно.
Начни с проектирования БД.
У тебя "Смешались в кучу кони, люди" (с)
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 824
Рейтинг: 138
#12: 2017-01-26 23:11:13 ЛС | профиль | цитата
И сразу делай базу в UTF-8, тогда и "like" работать будет.

--- Добавлено в 2017-01-26 23:18:24

Поищи по форуму компоненты для работы SQLite с UTF-8
Вот-тут один

Редактировалось 2 раз(а), последний 2017-01-26 23:20:06
карма: 1

2
Голосовали:Tad, Dad2016
Ответов: 322
Рейтинг: 8
#13: 2017-01-27 08:22:38 ЛС | профиль | цитата
Tad писал(а):
Dad2016, вариантов море.
Конечно наличие у ПАО "Оренбургнефть" Труба профильная 160х160х6 ст.3сп5 ГОСТ 30245-03 производства ОАО "Уральский Трубный Завод" это хорошо, но причем здесь в этой-же строке Ведущий инженер по надзору строительства ПАО "Оренбургнефть" Русаков Д.А. совершенно непонятно.
Начни с проектирования БД.
У тебя "Смешались в кучу кони, люди" (с)

эта база взята из другой программы (входной контроль материалов) просто для пробы.
В одной строке базы содержится информация по всему акту.

Редактировалось 1 раз(а), последний 2017-01-27 09:37:05
карма: 0

0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)