Вверх ↑
Этот топик читают: Гость
Ответов: 59
Рейтинг: 0
#1: 2022-02-05 14:14:30 ЛС | профиль | цитата
Всем доброго времени суток.
Делаю небольшую программу для чтения одной таблицы (запрос с подключением связанных таблиц) из БД. Для удобного отображения таблицы нужны фильтры (не сортировка по столбцам). Сложностью возникло формирование запроса, т.е. чтобы в нужное место вставлялось WHERE и AND (если условий несколько).
Add(MainForm,2953706,21,105)
{
Width=704
Height=358
Position=1
}
Add(Label,7714648,161,28)
{
Left=10
Top=15
Width=44
Height=17
Caption="Фильтр"
}
Add(Label,3700171,266,63)
{
Left=85
Top=15
Width=59
Height=17
Caption="Поле name"
}
Add(ComboBox,5901007,455,112)
{
@Hint=#4:name|
Left=145
Top=10
Width=145
Height=21
Strings=#7:1|Антон|9:2|Аркадий|7:3|Борис|11:4|Екатерина|
DataType=1
link(onClick,4332866:doSplit,[(499,125)(499,153)(450,153)(450,181)])
AddHint(59,44,41,13,@Hint)
}
Add(Label,4363080,266,105)
{
Left=75
Top=40
Width=49
Height=17
Caption="Поле city"
}
Add(ComboBox,12873306,462,301)
{
@Hint=#4:city|
Left=145
Top=40
Width=145
Height=21
Strings=#8:1|Лондон|7:2|Париж|8:3|Берлин|9:4|Варшава|8:5|Багота|
DataType=1
link(onClick,7301653:doClear,[(506,314)(506,342)(457,342)(457,370)])
AddHint(58,35,31,13,@Hint)
}
Add(ChildPanel,9402115,826,350)
{
link(onEvent1,6686024:doString,[])
}
BEGIN_SDK
Add(EditMulti,15276896,21,21)
{
EventCount=1
WorkCount=1
Width=377
Height=298
}
Add(Panel,16524363,35,105)
{
Left=70
Top=80
Width=339
Height=37
}
Add(RadioButton,14210090,154,56)
{
Left=89
Top=9
Caption="Студент"
link(onSelect,5574395:doData,[])
}
Add(RadioButton,6630222,154,105)
{
Left=164
Top=9
Width=80
Caption="Пенсионер"
link(onSelect,1916104:doData,[])
}
Add(RadioButton,16052579,154,154)
{
Left=259
Top=9
Width=65
Caption="Рабочий"
link(onSelect,6900170:doData,[])
}
Add(Label,7977922,441,14)
{
Left=9
Top=9
Width=61
Height=17
Caption="Поле status"
}
Add(DoData,5574395,210,56)
{
Data=Integer(1)
link(onEventData,11635415:doEvent1,[(264,62)(264,104)])
}
Add(DoData,1916104,210,105)
{
Data=Integer(2)
link(onEventData,11635415:doEvent2,[])
}
Add(DoData,6900170,210,154)
{
Data=Integer(3)
link(onEventData,11635415:doEvent3,[(264,160)(264,118)])
}
Add(Hub,11635415,287,98)
{
InCount=3
OutCount=1
link(onEvent1,9354654:doValue,[])
}
Add(GlobalVar,9354654,322,98)
{
Name="status"
link(onValue,15276896:onEvent1,[(384,104)(384,27)])
}
END_SDK
Add(ChildPanel,13935565,679,357)
{
link(onEvent1,7779045:doString,[])
}
BEGIN_SDK
Add(EditMulti,15392110,21,21)
{
EventCount=1
Width=342
}
Add(Panel,15961416,35,105)
{
Left=70
Top=130
Width=339
Height=37
}
Add(RadioButton,10780047,133,49)
{
Left=89
Top=9
Caption="Женский"
link(onSelect,3727406:doData,[])
}
Add(RadioButton,5948420,133,98)
{
Left=164
Top=9
Width=80
Caption="Мужской"
link(onSelect,6171461:doData,[])
}
Add(RadioButton,11558322,133,147)
{
Left=259
Top=9
Width=65
Caption="Неизвестно"
link(onSelect,7296171:doData,[])
}
Add(Label,15928589,462,63)
{
Left=9
Top=9
Width=47
Height=17
Caption="Поле pol"
}
Add(DoData,3727406,196,49)
{
Data=Integer(1)
link(onEventData,14183791:doEvent1,[(247,55)(247,97)])
}
Add(DoData,6171461,196,98)
{
Data=Integer(2)
link(onEventData,14183791:doEvent2,[])
}
Add(DoData,7296171,196,147)
{
Data=Integer(3)
link(onEventData,14183791:doEvent3,[(247,153)(247,111)])
}
Add(Hub,14183791,266,91)
{
InCount=3
OutCount=1
link(onEvent1,9531103:doValue,[])
}
Add(GlobalVar,9531103,301,91)
{
Name="pol"
link(onValue,15392110:onEvent1,[(349,97)(349,27)])
}
END_SDK
Add(Label,504982,7,182)
{
Left=10
Top=185
Width=93
Height=17
Caption="Основной запрос"
}
Add(Edit,12595222,875,532)
{
Left=180
Top=185
Width=475
Height=25
Text="SELECT * FROM schema.tb_table;"
}
Add(Label,5371579,7,231)
{
Left=10
Top=230
Width=159
Height=17
Caption="Запрос с фильтром(условием)"
}
Add(Edit,2505127,924,665)
{
Left=180
Top=225
Width=475
Height=25
}
Add(Edit,3489991,1239,196)
{
Left=175
Top=270
Width=490
}
Add(MultiStrPart,4332866,462,175)
{
Char="|"
link(onSplit,3672907:doData,[(506,181)(506,205)(450,205)(450,230)])
link(Str,5901007:String,[])
}
Add(DoData,3672907,462,224)
{
link(Data,4332866:Part1,[])
}
Add(MultiStrPart,7301653,469,357)
{
Char="|"
link(onSplit,2043254:doData,[(513,363)(513,387)(457,387)(457,412)])
link(Str,12873306:String,[])
}
Add(DoData,2043254,469,406)
{
link(Data,7301653:Part1,[])
}
Add(FormatStr,14836428,875,665)
{
@Hint=#6:SELECT|
DataCount=3
Mask="SELECT * FROM schema.tb_table%2%3;"
link(onFString,2505127:doText,[])
link(Str1,12595222:Text,[])
link(Str2,6441863:FString,[(888,604)(986,604)])
AddHint(9,54,56,13,@Hint)
}
Add(Button,7915804,784,665)
{
Left=455
Top=100
link(onClick,14836428:doString,[])
}
Add(GlobalVar,11017452,889,322)
{
Name="status"
}
Add(FormatStr,6686024,882,350)
{
@Hint=#6:status|
Mask="status = %2"
Point(FString)
link(Str2,11017452:Var,[])
AddHint(114,10,43,13,@Hint)
}
Add(DoData,1055286,1239,133)
{
}
Add(Button,6151415,798,168)
{
Left=335
Top=15
Width=110
Caption="Сброс фильтра"
link(onClick,16284357:doReset,[(846,174)(846,153)])
}
Add(FormatStr,6441863,980,511)
{
@Hint=#5:WHERE|
Mask=" WHERE %2"
Point(FString)
link(Str2,6686024:FString,[(993,401)(888,401)])
AddHint(13,46,56,13,@Hint)
}
Add(FormatStr,16560601,980,112)
{
@Hint=#3:AND|
Mask=" AND %2"
Point(FString)
AddHint(17,48,38,13,@Hint)
}
Add(CounterEx,16284357,861,140)
{
Point(doReset)
link(onNext,2729480:doCompare,[])
}
Add(If_else,2729480,910,140)
{
Type=2
Op2=Integer(1)
link(onTrue,16560601:doString,[(961,146)(961,118)])
link(onFalse,6441863:doString,[(965,153)(965,517)])
}
Add(GlobalVar,3073591,749,322)
{
Name="pol"
}
Add(FormatStr,7779045,742,357)
{
@Hint=#3:pol|
Mask=" pol = %2"
Point(FString)
link(Str2,3073591:Var,[])
AddHint(-73,56,29,13,@Hint)
}
Add(Button,6150670,798,119)
{
Left=465
Top=15
Caption="+1"
link(onClick,16284357:doNext,[(846,125)(846,146)])
}
Add(StrCat,4569894,1239,266)
{
}
Add(IndexToChanel,1100930,1197,392)
{
}
Add(Case,384739,1204,497)
{
}
Если фильтр выбран по одному полю, то нужно только WHERE, а если по нескольким, то после каждого условия нужно AND
Запрос без условий
SELECT * FROM schema.tb_table;
Запрос с одним условием
SELECT * FROM schema.tb_table WHERE name = 1;
Запрос двумя условиями
SELECT * FROM schema.tb_table WHERE name = 1 AND status = 2;
Кто-то сможет помочь с этим?

Редактировалось 3 раз(а), последний 2022-02-05 14:16:04
карма: 0

0
vip
#1.1контекстная реклама от партнеров
Ответов: 4621
Рейтинг: 746
#2: 2022-02-05 19:24:36 ЛС | профиль | цитата
1) Место для вставки условия помечаешь маркером, например:
SELECT * FROM schema.tb_table WHERE 1=1;

2) Свои условия добавляешь в список, например, StrList.
3) Перед выполнением запроса формируешь актуальный запрос:
- берешь содержимое списка условий с точки StrList.Text. Условия в такой строке будут разделены переводами строки (\r\n). С помощью компонента замены в строке заменяешь "\r\n" на " and " - получаешь готовое условие.
- берешь шаблон запроса и в нем заменяешь маркер "1=1" на полученное условие.
4) В результате получаешь окончательный запрос.
карма: 26

0
Ответов: 687
Рейтинг: 142
#3: 2022-02-06 12:08:07 ЛС | профиль | цитата
LeoN писал(а):
Сложностью возникло формирование запроса, т.е. чтобы в нужное место вставлялось WHERE и AND (если условий несколько).

Вот пример как можно это сделать.
Add(MainForm,12661867,182,147)
{
Width=704
Height=358
Position=1
}
Add(Label,7714648,322,70)
{
Left=10
Top=15
Width=44
Height=17
Caption="Фильтр"
}
Add(Label,3700171,427,105)
{
Left=85
Top=15
Width=59
Height=17
Caption="Поле name"
}
Add(ComboBox,5901007,623,133)
{
@Hint=#4:name|
Left=145
Top=10
Width=145
Height=21
Strings=#7:1|Антон|9:2|Аркадий|7:3|Борис|11:4|Екатерина|
DataType=1
link(onClick,971629:doSplit,[])
AddHint(59,56,41,13,@Hint)
}
Add(Label,4363080,427,147)
{
Left=75
Top=40
Width=49
Height=17
Caption="Поле city"
}
Add(ComboBox,12873306,623,245)
{
@Hint=#4:city|
Left=145
Top=40
Width=145
Height=21
Strings=#8:1|Лондон|7:2|Париж|8:3|Берлин|9:4|Варшава|8:5|Багота|
DataType=1
link(onClick,7983654:doSplit,[])
AddHint(57,56,31,13,@Hint)
}
Add(ChildPanel,9402115,434,476)
{
link(onEvent1,15957351:doWork2,[])
}
BEGIN_SDK
Add(EditMulti,15276896,21,21)
{
EventCount=1
WorkCount=1
Width=615
Height=235
link(doWork1,16243722:doData,[(102,27)(102,62)])
}
Add(Panel,16524363,35,105)
{
Left=70
Top=80
Width=339
Height=37
}
Add(RadioButton,14210090,203,56)
{
Left=89
Top=9
Caption="Студент"
link(onSelect,14676883:doWork2,[(242,62)(242,104)])
}
Add(RadioButton,6630222,203,105)
{
Left=164
Top=9
Width=80
Caption="Пенсионер"
link(onSelect,14676883:doWork3,[])
}
Add(RadioButton,16052579,203,154)
{
Left=259
Top=9
Width=65
Caption="Рабочий"
link(onSelect,14676883:doWork4,[(242,160)(242,118)])
}
Add(Label,7977922,42,189)
{
Left=9
Top=9
Width=61
Height=17
Caption="Поле status"
}
Add(ChanelToIndex,14676883,273,91)
{
Count=4
link(onIndex,12803989:doString,[])
}
Add(FormatStr,12803989,336,91)
{
@Hint=#6:status|
DataCount=1
Mask="status = %1"
Point(FString)
link(onFString,15276896:onEvent1,[(459,97)(459,27)])
AddHint(114,10,43,13,@Hint)
}
Add(DoData,16243722,112,56)
{
Data=Integer(0)
link(onEventData,1214639:doEvent1,[])
}
Add(Hub,1214639,154,56)
{
OutCount=3
link(onEvent1,14210090:doSelect,[])
link(onEvent2,6630222:doSelect,[(193,69)(193,111)])
link(onEvent3,16052579:doSelect,[(186,76)(186,160)])
}
END_SDK
Add(ChildPanel,13935565,434,518)
{
link(onEvent1,15957351:doWork3,[(494,524)])
}
BEGIN_SDK
Add(EditMulti,15392110,21,21)
{
EventCount=1
WorkCount=1
Width=587
Height=242
link(doWork1,11330140:doData,[(39,27)(39,55)])
}
Add(Panel,15961416,35,105)
{
Left=70
Top=130
Width=339
Height=37
}
Add(RadioButton,10780047,154,49)
{
Left=89
Top=9
Caption="Женский"
link(onSelect,179084:doWork2,[(200,55)(200,90)])
}
Add(RadioButton,5948420,154,91)
{
Left=164
Top=9
Width=80
Caption="Мужской"
link(onSelect,179084:doWork3,[])
}
Add(RadioButton,11558322,154,133)
{
Left=259
Top=9
Width=65
Caption="Неизвестно"
link(onSelect,179084:doWork4,[(200,139)(200,104)])
}
Add(Label,15928589,462,63)
{
Left=9
Top=9
Width=47
Height=17
Caption="Поле pol"
}
Add(ChanelToIndex,179084,210,77)
{
Count=4
link(onIndex,15745763:doString,[])
}
Add(FormatStr,15745763,287,77)
{
@Hint=#3:pol|
DataCount=1
Mask=" pol = %1"
Point(FString)
link(onFString,15392110:onEvent1,[(326,83)(326,27)])
AddHint(-73,56,29,13,@Hint)
}
Add(DoData,11330140,49,49)
{
Data=Integer(0)
link(onEventData,14505728:doEvent1,[])
}
Add(Hub,14505728,98,49)
{
OutCount=3
link(onEvent1,10780047:doSelect,[])
link(onEvent2,5948420:doSelect,[(144,62)(144,97)])
link(onEvent3,11558322:doSelect,[(137,69)(137,139)])
}
END_SDK
Add(Label,504982,168,224)
{
Left=10
Top=185
Width=93
Height=17
Caption="Основной запрос"
}
Add(Edit,12595222,665,588)
{
Left=180
Top=185
Width=475
Height=25
Text="SELECT * FROM schema.tb_table;"
link(onEnter,6830465:doMask,[(704,601)(704,559)])
}
Add(Label,5371579,168,273)
{
Left=10
Top=230
Width=159
Height=17
Caption="Запрос с фильтром(условием)"
}
Add(Edit,2505127,826,546)
{
Left=180
Top=225
Width=475
Height=25
Text=""
}
Add(Button,7915804,532,546)
{
Left=455
Top=100
link(onClick,12522387:doEvent1,[])
}
Add(Button,6151415,959,210)
{
Left=335
Top=15
Width=110
Caption="Сброс фильтра"
}
Add(Button,6150670,959,161)
{
Left=465
Top=15
Caption="+1"
}
Add(StrPart,971629,679,140)
{
Char="|"
}
Add(StrPart,7983654,679,252)
{
Char="|"
}
Add(StrList,15694274,665,476)
{
}
Add(Replace,7988358,665,546)
{
SubStr="\r\n"
DestStr=" "
link(onReplace,6830465:doString,[])
link(Str,15694274:Text,[])
}
Add(StrCat,4526543,777,546)
{
Str2=";"
link(onStrCat,2505127:doText,[])
}
Add(FormatStr,6830465,721,546)
{
@Hint=#6:SELECT|
DataCount=1
Mask="SELECT * FROM schema.tb_table %1"
Point(doMask)
link(onFString,4526543:doStrCat,[])
AddHint(9,54,56,13,@Hint)
}
Add(Switch,1339391,539,406)
{
DataOn=String(WHERE)
DataOff=String(AND)
Default=0
Point(State)
Point(doOn)
}
Add(FormatStr,4512139,539,476)
{
link(onFString,12144080:doEvent1,[])
link(Str1,1339391:State,[])
}
Add(HubEx,15957351,490,476)
{
link(onEvent,4512139:doString,[])
}
Add(Hub,12144080,595,476)
{
link(onEvent1,15694274:doAdd,[])
link(onEvent2,1339391:doReset,[(620,489)(620,468)(529,468)(529,419)])
}
Add(Hub,12522387,595,546)
{
OutCount=3
link(onEvent1,7988358:doReplace,[])
link(onEvent2,15694274:doClear,[(627,559)(627,489)])
link(onEvent3,12727180:doEvent1,[(620,566)(620,587)(389,587)(389,475)])
}
Add(Hub,12727180,399,469)
{
OutCount=3
link(onEvent1,1339391:doOn,[(424,475)(424,426)])
link(onEvent2,9402115:doWork1,[])
link(onEvent3,13935565:doWork1,[(424,489)(424,524)])
}


P.S. Ты тему создал не в той ветке...

Редактировалось 1 раз(а), последний 2022-02-06 14:44:26
карма: 15

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