:: Visual Foxpro, Foxpro for DOS
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
ругать за [не]понимание никто не будет, главное - (участие в программерстве) - грамотное изложение своей задачи, и умение найти контакт. Тут не звери.
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
ptaxa888
Аспид
Еще вариант, сделать запрос по все полям, а потом смотреть что исключить (просто visible = .f. в гриде)
Этот вариант к сожалению не подходит, его я осилил уже на первом этапе. Необходимо отсечь(удалить) поля до того как на экране появляется информация из БД.

Ясно. Элементарное недопонимание начинающих. То что вы получили, и то что выводите на экран... могут быть сильно различны.
Простой пример. При выводе пользователю некой сложной структуры, заодно подтягиваются FK, но видеть их юзеру, совершенно не нужно.

Попробуйте пойти по этому пути. Задача может сильно облегчиться.
Например.
Делаете полный запрос, на грид (именно на него) выводите все поля.
В таблице критериев, каждому критерию назначаете columnN/
И далее просто делаете эти колонки невидимыми.

Плюс этого решения, вы всегда оперируете одним набором данных (не знаю что дальше с этим будете делать)
Минус, чуть более сложная передача в ексель, но думаю тут вам помогут)))
Дел минут на 10.

Совет. Смотрите на проблему так.
Данные - это отдельная песня.
Вывод на экран - другая.
передача в ексель третья.


------------------
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Аспид
ptaxa888
Аспид
Еще вариант, сделать запрос по все полям, а потом смотреть что исключить (просто visible = .f. в гриде)
Этот вариант к сожалению не подходит, его я осилил уже на первом этапе. Необходимо отсечь(удалить) поля до того как на экране появляется информация из БД.

Ясно. Элементарное недопонимание начинающих. То что вы получили, и то что выводите на экран... могут быть сильно различны.
Простой пример. При выводе пользователю некой сложной структуры, заодно подтягиваются FK, но видеть их юзеру, совершенно не нужно.

Попробуйте пойти по этому пути. Задача может сильно облегчиться.
Например.
Делаете полный запрос, на грид (именно на него) выводите все поля.
В таблице критериев, каждому критерию назначаете columnN/
И далее просто делаете эти колонки невидимыми.

Плюс этого решения, вы всегда оперируете одним набором данных (не знаю что дальше с этим будете делать)
Минус, чуть более сложная передача в ексель, но думаю тут вам помогут)))
Дел минут на 10.

Совет. Смотрите на проблему так.
Данные - это отдельная песня.
Вывод на экран - другая.
передача в ексель третья.
Даже если идти по этому пути в любом случае разбираться как сделать динамический запрос собранный из данных listbox2, как ни крути
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
ptaxa888
любом случае разбираться как сделать динамический запрос собранный из данных listbox2, как ни крути
- а чего тут разбираться - то же самое (я про SQL-запрос) что руками в коде пишете, тока записанный программно в строку-переменную.
Фокс позволяет вообще отдельные блоки кода (программы) таким образом запускать-выполнять - главное не увлекаться а использовать там и тогда когда это действительно оправдано - например, в вашем случае, это на мой взгляд самый простой путь.
Технически реализация создания/склеивания/прочее этой строки ничего сложного не представляет, ну вот простой как топор пример:

LOCAL lcWhere
SELECT 0
CREATE CURSOR cData (id i, name c(40))
INSERT INTO cData (id, name) VALUES (1, 'Вася')
INSERT INTO cData (id, name) VALUES (2, 'Петя')
INSERT INTO cData (id, name) VALUES (3, 'Маша')
INSERT INTO cData (id, name) VALUES (4, 'Света')
SELECT 0
CREATE CURSOR cPasport (id i, pseries c(20), pnum c(20))
INSERT INTO cPasport (id, pseries, pnum) VALUES (1, '18 01', '384056')
INSERT INTO cPasport (id, pseries, pnum) VALUES (2, '18 00', '376645')
INSERT INTO cPasport (id, pseries, pnum) VALUES (4, '18 01', '405675')
&& 1) допустим вы выводите тех у кого в pseries содержится 18
lcWhere=[ WHERE ATC('18', pseries)>0]
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut1 READWRITE &lcWhere
&& 2) допустим вы выводите всех
lcWhere=''
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut2 READWRITE &lcWhere
&& 3) допустим вы выводите тех у кого в pseries содержится 18 и в pnum 56
lcWhere=[ WHERE ATC('18', pseries)>0 AND ATC('56', pnum)>0]
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut3 READWRITE &lcWhere

ну или как у вас на скрине с листбоксами (хотя я предпочитаю гриды) - тоже только для примера - прикрепил форму



Исправлено 2 раз(а). Последнее : AndyNigmatec, 09.03.18 09:57
Ratings: 0 negative/1 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
AndyNigmatec
ptaxa888
любом случае разбираться как сделать динамический запрос собранный из данных listbox2, как ни крути
- а чего тут разбираться - то же самое (я про SQL-запрос) что руками в коде пишете, тока записанный программно в строку-переменную.
Фокс позволяет вообще отдельные блоки кода (программы) таким образом запускать-выполнять - главное не увлекаться а использовать там и тогда когда это действительно оправдано - например, в вашем случае, это на мой взгляд самый простой путь.
Технически реализация создания/склеивания/прочее этой строки ничего сложного не представляет, ну вот простой как топор пример:

LOCAL lcWhere
SELECT 0
CREATE CURSOR cData (id i, name c(40))
INSERT INTO cData (id, name) VALUES (1, 'Вася')
INSERT INTO cData (id, name) VALUES (2, 'Петя')
INSERT INTO cData (id, name) VALUES (3, 'Маша')
INSERT INTO cData (id, name) VALUES (4, 'Света')
SELECT 0
CREATE CURSOR cPasport (id i, pseries c(20), pnum c(20))
INSERT INTO cPasport (id, pseries, pnum) VALUES (1, '18 01', '384056')
INSERT INTO cPasport (id, pseries, pnum) VALUES (2, '18 00', '376645')
INSERT INTO cPasport (id, pseries, pnum) VALUES (4, '18 01', '405675')
&& 1) допустим вы выводите тех у кого в pseries содержится 18
lcWhere=[ WHERE ATC('18', pseries)>0]
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut1 READWRITE &lcWhere
&& 2) допустим вы выводите всех
lcWhere=''
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut2 READWRITE &lcWhere
&& 3) допустим вы выводите тех у кого в pseries содержится 18 и в pnum 56
lcWhere=[ WHERE ATC('18', pseries)>0 AND ATC('56', pnum)>0]
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut3 READWRITE &lcWhere

ну или как у вас на скрине с листбоксами (хотя я предпочитаю гриды) - тоже только для примера - прикрепил форму
С Вашей формой разобрался. Есть вопрос. В примере в listbox-сах Вы оперируете выбором (наличием/отсутствием) строк, но у меня задача "поиграть" с полями с помощью этих самых listbox. Подскажите-научите.



Исправлено 1 раз(а). Последнее : ptaxa888, 10.03.18 03:20
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
ptaxa888
AndyNigmatec
ptaxa888
любом случае разбираться как сделать динамический запрос собранный из данных listbox2, как ни крути
- а чего тут разбираться - то же самое (я про SQL-запрос) что руками в коде пишете, тока записанный программно в строку-переменную.
Фокс позволяет вообще отдельные блоки кода (программы) таким образом запускать-выполнять - главное не увлекаться а использовать там и тогда когда это действительно оправдано - например, в вашем случае, это на мой взгляд самый простой путь.
Технически реализация создания/склеивания/прочее этой строки ничего сложного не представляет, ну вот простой как топор пример:

LOCAL lcWhere
SELECT 0
CREATE CURSOR cData (id i, name c(40))
INSERT INTO cData (id, name) VALUES (1, 'Вася')
INSERT INTO cData (id, name) VALUES (2, 'Петя')
INSERT INTO cData (id, name) VALUES (3, 'Маша')
INSERT INTO cData (id, name) VALUES (4, 'Света')
SELECT 0
CREATE CURSOR cPasport (id i, pseries c(20), pnum c(20))
INSERT INTO cPasport (id, pseries, pnum) VALUES (1, '18 01', '384056')
INSERT INTO cPasport (id, pseries, pnum) VALUES (2, '18 00', '376645')
INSERT INTO cPasport (id, pseries, pnum) VALUES (4, '18 01', '405675')
&& 1) допустим вы выводите тех у кого в pseries содержится 18
lcWhere=[ WHERE ATC('18', pseries)>0]
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut1 READWRITE &lcWhere
&& 2) допустим вы выводите всех
lcWhere=''
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut2 READWRITE &lcWhere
&& 3) допустим вы выводите тех у кого в pseries содержится 18 и в pnum 56
lcWhere=[ WHERE ATC('18', pseries)>0 AND ATC('56', pnum)>0]
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut3 READWRITE &lcWhere

ну или как у вас на скрине с листбоксами (хотя я предпочитаю гриды) - тоже только для примера - прикрепил форму
С Вашей формой разобрался. Есть вопрос. В примере в listbox-сах Вы оперируете выбором (наличием/отсутствием) строк, но у меня задача "поиграть" с полями с помощью этих самых listbox. Подскажите-научите именно на основе представленного примера. Параллельно ковыряюсь с mover, пока не понял на чем проще реализовать
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
ptaxa888
С Вашей формой разобрался. Есть вопрос. В примере в listbox-сах Вы оперируете выбором (наличием/отсутствием) строк, но у меня задача "поиграть" с полями с помощью этих самых listbox.

Ну формочка то простенькая только для иллюстрации, в ней был обычный select на основе проставленного в таблице поля отвечающего за выбор (поле lcheck) ... непосредственно именно так как в примере я пожалуй бы делать не стал (здесь просто смоделировал вашу картинку).

Теперь что касается самого выбора - а в чем сложность аналогичным образом выбирать поля? Здесь вам просто определиться с самим базовым запросом в котором эти выбранные поля будут участвовать - т.е. набросать себе сам запрос со всеми возможными полями - проверить работоспособность - и если все устраивает - то переписать его уже через макроподстановку выбранных полей.

вот вам примерчик на основе предыдущей формы ...
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
AndyNigmatec
ptaxa888
С Вашей формой разобрался. Есть вопрос. В примере в listbox-сах Вы оперируете выбором (наличием/отсутствием) строк, но у меня задача "поиграть" с полями с помощью этих самых listbox.

Ну формочка то простенькая только для иллюстрации, в ней был обычный select на основе проставленного в таблице поля отвечающего за выбор (поле lcheck) ... непосредственно именно так как в примере я пожалуй бы делать не стал (здесь просто смоделировал вашу картинку).

Теперь что касается самого выбора - а в чем сложность аналогичным образом выбирать поля? Здесь вам просто определиться с самим базовым запросом в котором эти выбранные поля будут участвовать - т.е. набросать себе сам запрос со всеми возможными полями - проверить работоспособность - и если все устраивает - то переписать его уже через макроподстановку выбранных полей.

вот вам примерчик на основе предыдущей формы ...

Запросик какой-никакой но рабочий имеется
SELECT Ic.a01 AS фамилия_имя_отчество, Doljnost.d01 AS должность,;
Ic.a03 AS номер_приказа, Ic.a04 AS дата_приказа,;
Sprav.text AS код_состояния,;
Sprav_a.text AS образование_по_должности,;
Sprav_b.text AS звание_по_должности, Ic.a08 AS номер_личного_дела,;
Ic.a09 AS личный_номер, Ic.a10 AS номер_жетона, Sprav_c.text AS пол,;
Ic.a12 AS дата_рождения, Ic.a13 AS дата_поступ_в_органы,;
Ic.a14 AS начало_работы_в_службе, Ic.a15 AS назначение_на_должность,;
Sprav_d.text AS звание, Ic.a17 AS дата_присв_звания,;
Ic.a18 AS номер_приказа, Ic.a19 AS дата_приказа,;
Ic.a20 AS присв_очередного_звания, Ic.a22 AS количество_детей,;
Deti.det01 AS фио_ребенка_1, Deti.det02 AS дата_рожд_1_ребенка,;
Deti.det03 AS фио_ребенка_2, Deti.det04 AS дата_рожд_2_ребенка,;
Deti.det05 AS фио_ребенка_3, Deti.det06 AS дата_рожд_3_ребенка,;
Obraz.ob01 AS образование, Obraz.ob02 AS профиль,;
Obraz.ob03 AS специальность_по_образованию,;
Obraz.ob04 AS квалиф_по_образованию,;
Obraz.ob05 AS наимен_учебного_заведения, Obraz.ob06 AS год_окончания,;
Passport.p01 AS серия_паспорта, Passport.p02 AS номер_паспорта,;
Passport.p03 AS кем_выдан, Passport.p04 AS код_подразд,;
Passport.p05 AS дата_выдачи, Sprav_g.text AS квалификационное_звание,;
Ic.a27 AS номер_приказа, Ic.a28 AS дата_приказа,;
Sprav_h.text AS принят_в_органы,;
Ic.a30 AS дата_уволнения_перемещения,;
Sprav_e.text AS причина_уволнения_перемещения,;
Ic.a32 AS номер_приказа, Ic.a33 AS дата_приказа,;
Ic.a34 AS домашний_адрес, Ic.a35 AS семейное_положение,;
Ic.a36 AS место_рождения, Phone.t01 AS рабочий_тел,;
Phone.t02 AS домашний_тел, Phone.t03 AS мобильный_тел,;
Prava.vu01 AS серия_ву, Prava.vu02 AS номер_ву,;
Prava.vu03 AS категории_ву, Prava.vu04 AS дата_действия_ву,;
Avto.av01 AS марка_авто, Avto.av02 AS модель_авто,;
Avto.av03 AS номер_рег_знака, Sprav_f.text AS аттестация,;
Ic.a40 AS примечания;
FROM ;
ic!sprav ;
INNER JOIN ic!ic ;
ON Sprav.kod = Ic.a05 ;
INNER JOIN ic!avto ;
ON Ic.id = Avto.id ;
INNER JOIN ic!sprav Sprav_f ;
ON Ic.a37 = Sprav_f.kod ;
INNER JOIN ic!prava ;
ON Ic.id = Prava.id ;
INNER JOIN ic!sprav Sprav_e ;
ON Ic.a31 = Sprav_e.kod ;
INNER JOIN ic!phone ;
ON Ic.id = Phone.id ;
INNER JOIN ic!sprav Sprav_h ;
ON Ic.a29 = Sprav_h.kod ;
INNER JOIN ic!sprav Sprav_g ;
ON Ic.a26 = Sprav_g.kod ;
INNER JOIN ic!passport ;
ON Ic.id = Passport.id ;
INNER JOIN ic!obraz ;
ON Ic.id = Obraz.id ;
INNER JOIN ic!deti ;
ON Ic.id = Deti.id ;
INNER JOIN ic!sprav Sprav_d ;
ON Ic.a16 = Sprav_d.kod ;
INNER JOIN ic!sprav Sprav_c ;
ON Ic.a11 = Sprav_c.kod ;
INNER JOIN ic!sprav Sprav_b ;
ON Ic.a07 = Sprav_b.kod ;
INNER JOIN ic!sprav Sprav_a ;
ON Ic.a06 = Sprav_a.kod ;
INNER JOIN ic!doljnost ;
ON Doljnost.a02 = Ic.a02;
ORDER BY Ic.a02
Попробую внедрить его в Ваш selbrowse с макро



Исправлено 1 раз(а). Последнее : ptaxa888, 10.03.18 16:30
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Громоздкое у вас формирование списков.
Попробуйте так - добавьте в LISTBOX-ы еще два столбца для полей и таблиц соответмтвенно и формируйте строки в цикле.

STORE '' TO lcAttr,lcField,lcTable
WITH THISFORM.List2
FOR i = 1 TO .LISTCOUNT
lcAttr = lcAttr + IIF(i=1,'',',') + .LIST(i,1)
lcField = lcField + IIF(i=1,'',',') + .LIST(i,2)
lcTable = lcTable + IIF(i=1,'',',') + IIF(EMPTY(.LIST(i,3)),' ',.LIST(i,3))
ENDFOR
ENDWITH
? lcAttr
? lcField
? lcTable
Через GETWORDCOUNT/GETWORDNUM преобразуйете в строки для полей и JOIN и вставите в SELECT через макроподстановки.



Исправлено 1 раз(а). Последнее : lulgu, 10.03.18 19:48
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
AndyNigmatec
ptaxa888
С Вашей формой разобрался. Есть вопрос. В примере в listbox-сах Вы оперируете выбором (наличием/отсутствием) строк, но у меня задача "поиграть" с полями с помощью этих самых listbox.

Ну формочка то простенькая только для иллюстрации, в ней был обычный select на основе проставленного в таблице поля отвечающего за выбор (поле lcheck) ... непосредственно именно так как в примере я пожалуй бы делать не стал (здесь просто смоделировал вашу картинку).

Теперь что касается самого выбора - а в чем сложность аналогичным образом выбирать поля? Здесь вам просто определиться с самим базовым запросом в котором эти выбранные поля будут участвовать - т.е. набросать себе сам запрос со всеми возможными полями - проверить работоспособность - и если все устраивает - то переписать его уже через макроподстановку выбранных полей.

вот вам примерчик на основе предыдущей формы ...

Всё получилось, спасибо всем большое. Пошел по пути Andy и Аспида.
Хотелось уйти от создания курсора Fields в Load формы, а брать данные уже из заполненной table1.dbf с аналогичными полями и данными. Подскажите-помогите пожалуйста как. В builder подключаю поле table1.sname для Listbox1, отображает вложенные атрибуты но не кидает в listbox2. В свою очередь addchoice имеет структуру:
SELECT table1
REPLACE lcheck WITH 1
SCATTER MEMVAR
SELECT cChoice
APPEND BLANK
GATHER MEMVAR
thisform.list1.Requery()
thisform.list2.Requery()
Load формы
SELECT 0
CREATE CURSOR Fields (sname c(35), tblfld c(20), falias c(25), lcheck i)
INSERT INTO Fields (sname, tblfld, falias, lcheck) VALUES ('1.Фамилия Имя Отчество', 'ic.a01', 'Фамилия_Имя_Отчество', 0)
INSERT INTO Fields (sname, tblfld, falias, lcheck) VALUES ('1.1.Фамилия', 'fio.f01', 'Фамилия', 0)
INSERT INTO Fields (sname, tblfld, falias, lcheck) VALUES ('1.2.Отчество', 'fio.f02', 'Отчество', 0)
INSERT INTO Fields (sname, tblfld, falias, lcheck) VALUES ('2.1.Штатная должность(полн.)', 'doljnost.d01', 'Штатная_должность', 0)
INSERT INTO Fields (sname, tblfld, falias, lcheck) VALUES ('3.Номер приказа', 'ic.a03', 'Номер_приказа', 0)
SET FILTER TO lcheck=0
SELECT 0
CREATE CURSOR cChoice (sname c(35), tblfld c(20), falias c(25), lcheck i)
SET FILTER TO lcheck=1



Исправлено 1 раз(а). Последнее : ptaxa888, 11.03.18 17:29
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
Ну что вы - это ж я от балды для примера вам набросал ... у вас свои данные, своя логика приложения - а пример - он просто для демонстрации того о чем вам писали.

ptaxa888
Хотелось уйти от создания курсора Fields в Load формы, а брать данные уже из заполненной table1.dbf с аналогичными полями и даннымиХотелось уйти от создания курсора Fields в Load формы, а брать данные уже из заполненной table1.dbf с аналогичными полями и данными
- открою вам маааленький секрет - работа с курсором мало отличается от работы с реальной таблицей. Хотя чем вам курсор не нравится - временная табла, твори что хошь ))). Вот в нашем примере:
открываем вашу заполененную таблу и выбираем из нее в курсор - делов то
SELECT 0
USE (ваша_табла_с_полями_параметрами) ALIAS cF SHARED
SELECT ...что-вам_надо... FROM cF INTO CURSOR cFields READWRITE WHERE ...ограничения ...
USE IN SELECT('cF')


ptaxa888
В builder подключаю поле table1.sname для Listbox1В builder подключаю поле table1.sname для Listbox1
- я бы не советовал всякими билдерами пользоваться - по мне так лучше вручную прописать нужное свойство - оно как-то спокойнее и надежнее


Исправлено 8 раз(а). Последнее : AndyNigmatec, 11.03.18 20:32
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
[quote AndyNigmatec]Ну что вы - это ж я от балды для примера вам набросал ... у вас свои данные, своя логика приложения - а пример - он просто для демонстрации того о чем вам писали.

[quote ptaxa888]Хотелось уйти от создания курсора Fields в Load формы, а брать данные уже из заполненной table1.dbf с аналогичными полями и даннымиХотелось уйти от создания курсора Fields в Load формы, а брать данные уже из заполненной table1.dbf с аналогичными полями и данными[/quote]- открою вам маааленький секрет - работа с курсором мало отличается от работы с реальной таблицей. Хотя чем вам курсор не нравится - временная табла, твори что хошь ))). Вот в нашем примере:
открываем вашу заполененную таблу и выбираем из нее в курсор - делов то
SELECT 0
USE (ваша_табла_с_полями_параметрами) ALIAS cF SHARED
SELECT ...что-вам_надо... FROM cF INTO CURSOR cFields READWRITE WHERE ...ограничения ...
USE IN SELECT('cF')
Благодарствую сегодня опробую
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Непонятно, зачем к Mover нужен курсор - в нем ведь уже сидят выбранные данные.
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
lulgu
Непонятно, зачем к Mover нужен курсор - в нем ведь уже сидят выбранные данные.
Форма реализована на listbox'сах, не mover.
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
mover - это и есть пара листбоксов, кнопки перемещения элементов между ними, возможно поддержка drag'n'drop (перетаскивания мышкой из одного в другой).
Для удобства оформляют всё это хозяйство как класс, и потом, когда надо, просто бросают на форму уже готовый "комплект", а не занимаются копированием объектов и кода из какой-то "формы где такое уже было". В этом и заключается ООП подход - именно так в нём повторно используется код.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
[quote ptaxa888][quote AndyNigmatec][quote ptaxa888]любом случае разбираться как сделать динамический запрос собранный из данных listbox2, как ни крути[/quote]
- а чего тут разбираться - то же самое (я про SQL-запрос) что руками в коде пишете, тока записанный программно в строку-переменную.
Фокс позволяет вообще отдельные блоки кода (программы) таким образом запускать-выполнять - главное не увлекаться а использовать там и тогда когда это действительно оправдано - например, в вашем случае, это на мой взгляд самый простой путь.
Технически реализация создания/склеивания/прочее этой строки ничего сложного не представляет, ну вот простой как топор пример:

LOCAL lcWhere
SELECT 0
CREATE CURSOR cData (id i, name c(40))
INSERT INTO cData (id, name) VALUES (1, 'Вася')
INSERT INTO cData (id, name) VALUES (2, 'Петя')
INSERT INTO cData (id, name) VALUES (3, 'Маша')
INSERT INTO cData (id, name) VALUES (4, 'Света')
SELECT 0
CREATE CURSOR cPasport (id i, pseries c(20), pnum c(20))
INSERT INTO cPasport (id, pseries, pnum) VALUES (1, '18 01', '384056')
INSERT INTO cPasport (id, pseries, pnum) VALUES (2, '18 00', '376645')
INSERT INTO cPasport (id, pseries, pnum) VALUES (4, '18 01', '405675')
&& 1) допустим вы выводите тех у кого в pseries содержится 18
lcWhere=[ WHERE ATC('18', pseries)>0]
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut1 READWRITE &lcWhere
&& 2) допустим вы выводите всех
lcWhere=''
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut2 READWRITE &lcWhere
&& 3) допустим вы выводите тех у кого в pseries содержится 18 и в pnum 56
lcWhere=[ WHERE ATC('18', pseries)>0 AND ATC('56', pnum)>0]
SELECT a.id, a.name, CAST(NVL(b.pseries,'') as c(20)) as pseries,;
CAST(NVL(b.pnum,'') as c(20)) as pnum;
FROM cData a LEFT JOIN cPasport b ON a.id=b.id;
INTO CURSOR cOut3 READWRITE &lcWhere

ну или как у вас на скрине с листбоксами (хотя я предпочитаю гриды) - тоже только для примера - прикрепил форму[/quote]
Было две задачи:
1. Формирование запроса по всем полям (вывод всех полей но с фильтром по одному из полей) поиск организован через LOCATE
2. Формирование курсора (без условий отбора)
1+2. Теперь все объединяется в одну задачу.
Как построить условие &lcWhere когда оно имеет следующий вид:
Условие: lcWhere=[ where a+c+b]
Где a=thisform.combo1.value (в combo1 будут сидеть данные из Fields.sname
b=thisform.text1.value (искомый текст,дата)
c=thisform.combo2.value (вложены операторы =,!=,>,<)
Задача: задаём поле поиска, задаём оператор писка и искомый текст в базе.
Затем определяем поля для вывода и выводим в курсор.
Как я понимаю для lcWhere проводим туже процедуру как и для формирования lcScript в selbrowse Вашей формы.
Не знаю синтаксиса для формирования lcWhere=[ where a+c+b]



Исправлено 1 раз(а). Последнее : ptaxa888, 12.03.18 19:12
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
AndyNigmatec

Сообщений: 1574
Откуда: Волгоград
Дата регистрации: 28.06.2015
lcWhere - в примере я просто так переменную обозвал ...
теперь к сути - вам нужно установить условие отбора - т.е. то что в sql-запросе будет после ключевого слова where - ну так напишите сначала (и заодно проверьте работоспособность) тупо в тестовой prg-ке пару вариантов своего запроса - а как убедитесь что все работает как задумано - переложите уже в приложение в динамическое формирование ...
вот этого у вас:
ptaxa888
Как построить условие &lcWhere когда оно имеет следующий вид:
Условие: lcWhere=[ where a+c+b]
Где a=thisform.combo1.value (в combo1 будут сидеть данные из Fields.sname
b=thisform.text1.value (искомый текст,дата)
c=thisform.combo2.value (вложены операторы =,!=,>,<
Задача: задаём поле поиска, задаём оператор писка и искомый текст в базе.

я пока не смог расшифровать, уж не обессудьте )))
SELECT ... FROM ... WHERE [вот тут и пересчиляем наши условия отбора записей]
в простейшем виде условия - это - условие1 AND/OR условие2 AND/OR условие3 ... и т.п.

давайте в студию текст запроса к котрому вы хотите прикрутить - where a+c+b - будет понятнее



Исправлено 1 раз(а). Последнее : AndyNigmatec, 12.03.18 20:35
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
ptaxa888
1. Формирование запроса по всем полям (вывод всех полей но с фильтром по одному из полей) поиск организован через LOCATE
Locate не делает фильтрации - он лишь перемещает указатель на первую подходящую запись - в гриде/бровзе/при экспорте всё равно будут все записи. Фильтр можно сделать по старому, через SET FILTER или опции FOR в соответствующих командах вывода (BROWSE/EXPORT/COPY TO), но лучше запросом с WHERE - потом такой отфильтрованный курсор уже можно показывать/экспортировать - всё что угодно делать.
ptaxa888
Как построить условие &lcWhere когда оно имеет следующий вид:
Условие: lcWhere=[ where a+c+b]
Так и построить.
fieldName = "tbl1.someString"
operator = ">="
filterValue = "Иванов"
lcWhere = m.fieldName + m.operator + "m.filterValue"
*для проверки что получилось "tbl1.someString>=m.filterValue"
? m.lcWhere
* потом в запросе
SELECT ... FROM ... WHERE &lcWhere INTO CURSOR ...
Можно и без переменных, сразу из элементов управления брать значения. Вот только для собственно искомого значения лучше всё-таки переменную сделать, куда и поместить значение, преобразовав его к тому же типу, что и поле - если поле строковое, то в переменной должна быть строка, если числовое - то число.
В принципе, конечно, можно и в строку запроса вместо + "m.filterValue" написать + "ThisForm.txtFilter.Value" - если в Value этого элемента будет обеспечен надлежащий тип данных. Но лучше всё же через промежуточную переменную работать. Главное обеспечить её видимость в строке с командой SELECT - это если вдруг строка условия, переменная со значением и сам SELECT находятся в разных методах.
Есть вариант преобразовывать значение в литерал. Т.е. чтобы в переменной lcWhere получалась строка вида
tbl1.someString>="Иванов"
или
tbl1.someNumber=123
или
tbl1.someDate<DATE(2018,3,12)
но это чуть больше кода, чуть сложнее логика построения (особенно для строк, где внутри строки надо как-то с кавычками которые пользователь может ввести разбираться). В общем я такой вариант не рекомендую.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
AndyNigmatec
lcWhere - в примере я просто так переменную обозвал ...
теперь к сути - вам нужно установить условие отбора - т.е. то что в sql-запросе будет после ключевого слова where - ну так напишите сначала (и заодно проверьте работоспособность) тупо в тестовой prg-ке пару вариантов своего запроса - а как убедитесь что все работает как задумано - переложите уже в приложение в динамическое формирование ...
вот этого у вас:
ptaxa888
Как построить условие &lcWhere когда оно имеет следующий вид:
Условие: lcWhere=[ where a+c+b]
Где a=thisform.combo1.value (в combo1 будут сидеть данные из Fields.sname
b=thisform.text1.value (искомый текст,дата)
c=thisform.combo2.value (вложены операторы =,!=,>,<
Задача: задаём поле поиска, задаём оператор писка и искомый текст в базе.

я пока не смог расшифровать, уж не обессудьте )))
SELECT ... FROM ... WHERE [вот тут и пересчиляем наши условия отбора записей]
в простейшем виде условия - это - условие1 AND/OR условие2 AND/OR условие3 ... и т.п.

давайте в студию текст запроса к котрому вы хотите прикрутить - where a+c+b - будет понятнее
Для понимания друг-друга решил не менять переменные, итак сложно понять что я тут пишу
Вот код selbrowse формирования таблицы (всё рабоатет вопросов к нему нет):
LOCAL lcScript
lcScript=''
SELECT Fields
SET FILTER TO
SCAN FOR lcheck=1
lcScript=lcScript+', '+ALLTRIM(Fields.tblfld)+' as '+ALLTRIM(Fields.falias)
ENDSCAN
SET FILTER TO lcheck=0
lcScript=[SELECT ic.id ]+lcScript+[ FROM ic LEFT JOIN fio ON ic.id=fio.id]+;
[ LEFT JOIN doljnost ON ic.a02=doljnost.a02]+;
[ LEFT JOIN ic!sprav sprav ON ic.a05=sprav.kod]+;
[ LEFT JOIN ic!sprav sprav_a ON ic.a06=sprav_a.kod]+;
[ LEFT JOIN ic!sprav sprav_b ON ic.a07=sprav_b.kod]+;
[ LEFT JOIN ic!sprav sprav_c ON ic.a11=sprav_c.kod]+;
[ LEFT JOIN ic!sprav sprav_d ON ic.a16=sprav_d.kod]+;
[ LEFT JOIN obraz ON ic.id=obraz.id]+;
[ LEFT JOIN deti ON ic.id=deti.id]+;
[ LEFT JOIN ic!sprav sprav_g ON ic.a26=sprav_g.kod]+;
[ LEFT JOIN ic!sprav sprav_h ON ic.a29=sprav_h.kod]+;
[ LEFT JOIN ic!sprav sprav_e ON ic.a31=sprav_e.kod]+;
[ LEFT JOIN passport ON ic.id=passport.id]+;
[ LEFT JOIN phone ON ic.id=phone.id]+;
[ LEFT JOIN avto ON ic.id=avto.id]+;
[ LEFT JOIN prava ON ic.id=prava.id]+;
[ LEFT JOIN ic!sprav sprav_f ON ic.a37=sprav_f.kod]+;
[ LEFT JOIN ic!sprav sprav_k ON ic.a39=sprav_k.kod]+;
[ INTO CURSOR cOut READWRITE]
*MESSAGEBOX(lcScript)
&lcScript
SELECT cOut
BROWSE
Остается в него внедрить WHERE цепляясь к форме запроса (combo1,combo2 textbox).

Вот код который содержится в форме запроса, но там использовались не динамические запросы, теперь то от этого и нужно уйти.
SET DATE GERMAN
PUBLIC combo1, combo2, text1
combo1=ALLTRIM(thisform.combo1.Value)
combo2=thisform.combo2.Value
text1=UPPER(ALLTRIM(thisform.text1.text))
DO CASE
***********запрос по "Фамилия Имя Отчество" - ЛЮБОЙ РЕГИСТР
CASE combo1="Фамилия Имя Отчество"
IF upper(thisform.text1.text)!=" " && (1) проверка, что вводимое поле text1 не пусто " "
SELECT ic
LOCATE FOR ALLTRIM(ic.a01)=text1 && поиск в БД ic.dbf ФИО сотрудника
IF FOUND() && (2) совпадение text1 с реквизитом ic.a01
*выбор используемого запроса по символу в combo2 "=" или "!="
IF combo2="=" && (3)
DO "c:\Visual FoxPro Projects\prog_IC\QUERY\=FIO.qpr"
ELSE
IF combo2="!=" && (3)
DO "c:\Visual FoxPro Projects\prog_IC\QUERY\!=FIO.qpr"
ELSE
MESSAGEBOX("Необходимо выбрать условие '=' или '!='") && (3)
ENDIF
ENDIF
ELSE
MESSAGEBOX('ФИО не найдено в базе') && (2)
ENDIF
ELSE
MESSAGEBOX('Введите искомое ФИО') && (1)
ENDIF
thisform.refresh
и т.д.
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Igor Korolyov
ptaxa888
1. Формирование запроса по всем полям (вывод всех полей но с фильтром по одному из полей) поиск организован через LOCATE
Locate не делает фильтрации - он лишь перемещает указатель на первую подходящую запись - в гриде/бровзе/при экспорте всё равно будут все записи. Фильтр можно сделать по старому, через SET FILTER или опции FOR в соответствующих командах вывода (BROWSE/EXPORT/COPY TO), но лучше запросом с WHERE - потом такой отфильтрованный курсор уже можно показывать/экспортировать - всё что угодно делать.
Прошу прощения, locate у меня работает на поиск значения в dbf. Фильтр (where)находится в самом запросе.
Завтра буду разбираться с Вашими подсказками, спасибо, но силы оставляют меня на сегодня



Исправлено 2 раз(а). Последнее : ptaxa888, 12.03.18 23:14
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 29 (Гостей: 29)

© 2000-2024 Fox Club 
Яндекс.Метрика