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

Сообщений: 61
Дата регистрации: 07.03.2018
Имеется БД сотрудников отдела которая содержит в себе 7 таблиц связанных по индексным полям.
Действие происходит на форме. Имеется два listbox1 и listbox2 и кнопка вывода на экран таблицы с реквизитами listbox2.
В listbox1 содержатся все реквизиты результирующей таблицы сотрудников, в listbox2 перемещаются реквизиты которые должны быть выведены в результирующей таблицы.
Вопрос: каким способом можно вывести на экран только выбранные реквизиты?
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Хотелось бы увидеть ваши соображения, по этому поводу.
Попутно, для ответа, требуется что то знать о схеме данных.
А так же
ptaxa888
Действие происходит на форме.
ptaxa888
каким способом можно вывести на экран только выбранные реквизиты?
На какой экран? На форму? В Грид, или еще что то?
Так же неясна фраза
ptaxa888
В listbox1 содержатся все реквизиты результирующей таблицы сотрудников
В общем написали вопрос для соседа, который видит ваш экран, и в курсе чем вы занимаетесь)


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

Сообщений: 25720
Дата регистрации: 23.08.2001
Может ТС нужен просто запрос? Вроде такого -

select <тут перечень выбранных реквизитов> from результирующая таблица

и выбросить это в грид на форму, ну или где ТС хочет показать результат


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если вопрос только в визуальном представлении, то просто сделать грид со всеми возможными полями, а по результату выбора в mover (обычно так называют 2 списка с возможностью перемещения между ними - не суть важно на listbox или на grid они реализованы) просто скрывать/показывать колонки в этом самом гриде.
Если же нужно зачем-то именно таблицу с соответствующими полями делать (ну мало ли, для других программ так "выгружают" информацию, или в том же excel потом будут dbf открывать), то это делается через макро - формируется переменная-строка со списком имён полей, и потом SELECT &эта_переменная FROM ... INNER/LEFT JOIN ... ON ... INTO TABLE новая_таблица
В запросе следует "связать" все эти 7 таблиц (если в результат должны попадать поля из ЛЮБОЙ таблицы). А в переменной-списке следует уточнять имена полей именем таблицы, и желательно давать им новые уникальные имена - если в таблицах имеются одноименные поля (как правило так оно и есть). Т.е. писать нам не просто "id, name, name" а "tbl1.id person_id, tbl1.name first_name, tbl2.name department_name" В принципе фокс и сам может "пообзывать" поля если имена повторяются, но лучше, конечно, самому это делать и так как надо, а не tbl_name.


------------------
WBR, Igor




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

Сообщений: 61
Дата регистрации: 07.03.2018
Извиняюсь, сейчас все будет...
Вывести результат нужно в окно просмотра browse т.к. из него легко и просто делать экспорт в EXCEL. Если использовать Grid то нет возможности соединять таблицы как это делается в select с помощью inner join, а у меня как раз все таблицы взаимосвязаны, и мне необходимо из всех таблиц сформировать нужную скорее всего через select.
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Божья_коровка
Может ТС нужен просто запрос? Вроде такого -
select <тут перечень выбранных реквизитов> from результирующая таблица

и выбросить это в грид на форму, ну или где ТС хочет показать результат
Я не против сделать через select, но есть одно НО. придется создать 2^54 запросов, чтобы попасть под тот который будет скомпанован в Listbox2.
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Igor Korolyov
Если же нужно зачем-то именно таблицу с соответствующими полями делать (ну мало ли, для других программ так "выгружают" информацию, или в том же excel потом будут dbf открывать), то это делается через макро - формируется переменная-строка со списком имён полей, и потом SELECT &эта_переменная FROM ... INNER/LEFT JOIN ... ON ... INTO TABLE новая_таблица
Вот тут похоже на истину которая подходит для моего случая))
Запросная форма у меня уже создана, функционирует. Сейчас работаю именно над формированием таблицы по выбранным реквизам
Если есть какой-то подобный пример "с макро" бросьте ссылочку пожалуйста.



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

Сообщений: 25720
Дата регистрации: 23.08.2001
ptaxa888
Запросная форма у меня уже создана, функционирует. Сейчас работаю именно над формированием таблицы по выбранным реквизам
Если есть какой-то подобный пример "с макро" бросьте ссылочку пожалуйста.
Чего там делать то -

rekv = "fld1,fld2,fld3" &&& перечень выбранных полей формируешь в строку присваиваешь переменной
SELECT &rekv from table1 &&& запрос

Если хотите создать таблицу с вашими выбранными полями с эталона то можно примерно так - COPY TO (gsFile_Nam) FIELDS &rekv а потом уже открывать ее и делать brow


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




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

Сообщений: 61
Дата регистрации: 07.03.2018
Божья_коровка
ptaxa888
Запросная форма у меня уже создана, функционирует. Сейчас работаю именно над формированием таблицы по выбранным реквизам
Если есть какой-то подобный пример "с макро" бросьте ссылочку пожалуйста.
Чего там делать то -

rekv = "fld1,fld2,fld3" &&& перечень выбранных полей формируешь в строку присваиваешь переменной
SELECT &rekv from table1 &&& запрос
понял, практически)
Еще вопрос как связать строку из listbox2 и переменную?
thisform.list2.value=fio?



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

Сообщений: 61
Дата регистрации: 07.03.2018
Божья_коровка
Если хотите создать таблицу с вашими выбранными полями с эталона то можно примерно так - COPY TO (gsFile_Nam) FIELDS &rekv а потом уже открывать ее и делать brow

Так скорее всего не получится т.к. будут потеряны связи между таблицами, а в каждой таблице практически разное кол-во строк.
Результирующая таблица имеет вид (см.во вложении), но на выходе вместо цифр появляется текст. Вообщем без inner join не обойтись.
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
ptaxa888
Еще вопрос как связать строку из listbox2 и переменную?
Вы не можете сформировать строку с необходимыми полями которые выбрали в листбокс2? Я правильно поняла?

ptaxa888
Нужно пробывать применить это к этому коду->
А что значит применить код к нему? Вам нужен примерный запрос но из тех полей, что были выбраны в листбокс2? Ну так сформируйте нужную для вас строку из перечня реквизитов, ну и соответственно в FROM будут изменения. К примеру если юзер не выбрал какой либо справочный реквизит или блок реквизитов из таблицы - Passport, то эта таблица в связке не понадобится


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...




Исправлено 1 раз(а). Последнее : Божья_коровка, 07.03.18 15:58
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Божья_коровка

Сообщений: 25720
Дата регистрации: 23.08.2001
Ну так у вас по сути будет "динамический" запрос. Ведь юзер может и не выбрать к примеру реквизиты Паспорта или ВУ или Авто....Т.е. по вашему заданию пользователь выбирает в листбокс2 ряд нужных ему реквизитов и по ним формируется запрос со связями к справочникам и тем таблицам чьи данные он выбрал.


------------------
Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается...
Ratings: 0 negative/1 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Божья_коровка
ptaxa888
Еще вопрос как связать строку из listbox2 и переменную?
Вы не можете сформировать строку с необходимыми полями которые выбрали в листбокс2? Я правильно поняла?

ptaxa888
Нужно пробывать применить это к этому коду->
А что значит применить код к нему? Вам нужен примерный запрос но из тех полей, что были выбраны в листбокс2? Ну так сформируйте нужную для вас строку из перечня реквизитов, ну и соответственно в FORM будут изменения. К примеру если юзер не выбрал какой либо справочный реквизит или блок реквизитов из таблицы - Passport.
К примеру одного из реквизитов:
в результирующей таблице "Фамилия Имя Отчество" это реквизит ic.a01
В listbox2 "Фамилия Имя Отчество" это реквизит "для формирования.c01" (в этой таблице c01 это едиственное поле)
Как взять конкретно "Фамилия Имя Отчество" из Listbox2 присвоить ему переменную например ic.a01 "вогнать" его в перечень rekv = " ic.a01, ic.a02, ic.a03" а дальше как Вы писали Select &rekv from ic.dbf



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

Сообщений: 61
Дата регистрации: 07.03.2018
Божья_коровка
Ну так у вас по сути будет "динамический" запрос. Ведь юзер может и не выбрать к примеру реквизиты Паспорта или ВУ или Авто....Т.е. по вашему заданию пользователь выбирает в листбокс2 ряд нужных ему реквизитов и по ним формируется запрос со связями к справочникам и тем таблицам чьи данные он выбрал.
не в бровь, а в глаз - все верно.
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

Сообщений: 61
Дата регистрации: 07.03.2018
Божья_коровка
ptaxa888
Еще вопрос как связать строку из listbox2 и переменную?
Вы не можете сформировать строку с необходимыми полями которые выбрали в листбокс2? Я правильно поняла?
Да, не получается ничего путного.
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
Аспид

Сообщений: 3475
Откуда: Москва
Дата регистрации: 01.04.2005
Бегло перечитал, может что то упустил)
У вас есть listbox1, в котором описаны все критерии отбора.
Я бы советовал свести их в некую таблицу (criteria), структура которой
Наименование - Name, таблица_поле - tblfld, алиас поля - fldname
Для формы выбираете из этой таблицы в курсор, в который добавляете поле выбора choice.
select Name, tblfld,fldname, .f. choice from criteria into cursor forlistbox1 readwrite
Этот курсор должен быть источником listbox1.
При переносе в listbox2, на переносимых записях ставите choice=.t.

Далее для формирования запроса просто сканируете курсор c фильтром choice=.t.
и заполняете поля.
cFld=''
scan for choice
cFld=cFld+tblfld+' as '+fldname
endscan

Остается вопрос про соединения.
Тут только вам видна структура, и что да как.
Но вполне можно в ту же таблицу criteria их запихнуть

Еще вариант, сделать запрос по все полям, а потом смотреть что исключить (просто visible = .f. в гриде)


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

Сообщений: 34580
Дата регистрации: 28.05.2002
ptaxa888
Вывести результат нужно в окно просмотра browse
В прикладных программах НИКОГДА не следует использовать команду BROWSE. Используются формы и объект grid - который даёт почти то же самое, но под полным контролем, и полностью настраиваемо.
ptaxa888
из него легко и просто делать экспорт в EXCEL.
Browse не имеет никаких средств для экспорта куда бы то ни было. Равно как и grid.
Есть команды типа COPY TO/EXPORT, и работают они с курсором (таблицей, либо временной таблицей открытой в одной из рабочих областей). Курсор может отображаться как по команде BROWSE, так и в объекте grid - принципиальной разницы тут нет.
ptaxa888
Если использовать Grid то нет возможности соединять таблицы как это делается в select с помощью inner join
Ни browse ни grid не "соединяют" таблицы - ни через inner join ни "старым" способом через SET RELATION. Они оба лишь средства ПРОСМОТРА курсора (или нескольких связанных курсоров, хотя я бы не рекомендовал такой вариант - основанный на командах-настройках SET RELATION).
"Соединяет по join" таблицы (точнее курсоры - как более широкое понятие, включающее и "обычные dbf" и временные, автоматически управляемые фоксом таблицы) команда SELECT-SQL. Она создаёт из исходных таблиц одну новую - обычно это временная таблица, создаваемая с помощью опции INTO CURSOR имя_курсора. Созданный курсор можно отобразить в grid (и в BROWSE - но оставь его только для целей отладки - не используй в собственно коде приложения), и можно "экспортировать" в другие форматы - начиная от простейших вариантов реализуемых командами COPY TO/EXPORT и заканчивая достаточно сложными генераторами отчётов на основе шаблонов, к примеру.
ptaxa888
но есть одно НО. придется создать 2^54 запросов, чтобы попасть под тот который будет скомпанован в Listbox2.
Нет, при использовании макро запрос будет всего один, он будет собран в нужном виде, на основе выбранных в mover полей.
ptaxa888
Еще вопрос как связать строку из listbox2 и переменную?
thisform.list2.value=fio?

В объекте mover есть два списка. Для простоты можно назвать их "источник" и "назначение", или "исходные" и "выбранные". Если визуально эти объекты реализованы через объект класса Listbox, то может быть куча самых разных способов привязать ДАННЫЕ к этим самым спискам. Это может быть 2 курсора, 2 массива, в конце концов элементы могут просто помещаться в объекты при помощи их методов AddItem/AddListItem (тогда они по сути хранятся во внутреннем свойстве-массиве Listbox-а, и доступны через свойства-индексаторы ListItem или List). Как именно оно реализовано в твоей форме - это уж тебе виднее.
В любом случае получить через .Value всё содержимое объекта Listbox невозможно (там будет лишь один "выбранный" элемент, да и то для двумерного источника лишь значение одного его первого "поля" или колонки). Если источником листбокса является курсор или массив, то и обращаться нужно к этому самому курсору/массиву. Если listbox-ы (что наиболее вероятно, т.к. так проще всего реализуется mover) были наполнены "вручную" методами AddItem/AddListItem, соответственно при "переносе" из одного в другой используется RemoveItem/RemoveListItem, то получить весь список можно простым циклом, используя свойство-индексатор List(номер_строки, номер_колонки) с пробегом переменной от 1 до ListCount. Вообще следует внимательно изучить поставляемый с фоксом пример работы с объектами типа mover - он есть в TaskPane/Solution Samples - на вкладке supermover как раз есть кнопка которая формирует строку из "выбранных" элементов и выводит их в messagebox. Сам код там в классе, в методе GetSelections, его можно посмотреть через кнопку "View Parent Code" в редакторе метода.
Для твоего случая не обязательно заморачиваться с передачей массива по ссылке. Хотя наверняка придётся заморочиться с ведением двумерного списка для mover - т.к. помимо "человеческого имени" нужно ещё и собственно имя поля (желательно с префиксом - именем таблицы), и имя "выходного" поля - как его называть в создаваемом в результате курсоре.
ptaxa888
в результирующей таблице "Фамилия Имя Отчество" это реквизит ic.a01
В listbox2 "Фамилия Имя Отчество" это реквизит "для формирования.c01" (в этой таблице c01 это едиственное поле)
Как взять конкретно "Фамилия Имя Отчество" из Listbox2 присвоить ему переменную например ic.a01 "вогнать" его в перечень rekv =

Вот то что "Фамилия Имя Отчество" это человеческое имя для поля "ic.a01", а в таблице-результате это поле должно называться "PersonName" - это ТЫ должен прописать в программе. В зависимости от того как сделаны списки для mover-а - в курсорах, наподобии того что пишет Аспид, в массивах, или в коде использующем Listbox.AddListItem - и пишется всё это "соответствие". Скорее всего где-то уже есть курсор-источник с данной метаинформацией (списком "человеческих" имён полей) - так что там и ищи, или туда и добавляй дополнительные поля. Надеюсь что учить тому как зная значение одного уникального поля перейти на соответствующую запись и получить значения остальных полей не требуется... Хотя нет, конечно же я НЕ надеюсь на это, по уровню задаваемых вопросов
Кстати, очень не советую именовать что либо кириллицей - фокс не 1с, и поиметь тупых ошибок от того что в ic.a01 буква с или буква а были набраны не в той раскладке - проще простого. Вот найти эту проблему порой затруднительно - ОСОБЕННО для динамически создаваемого кода - когда до момента прогона "с использованием" этого поля ты ошибку и не увидишь.

По поводу соединений - если данная БД хотя-бы минимально не г*венная (есть уникальные ключи) и не ворочает гигабайтами данных, то по крайней мере на первом этапе не обязательно парится насчёт динамического формирования части FROM запроса. Вполне подойдёт статически (без макро) прописанный FROM соединяющий ВСЕГДА все 7 или сколько их там надо таблиц. Кстати, там наверняка потребуется именно LEFT JOIN для прицепления "неосновных" таблиц к "главной". Да, это приводит к выполнению некоторого объёма "лишней работы" - но ты бы для начала основу одолел, потом уж можно заниматься доведением до ума, в т.ч. и оптимизацией кода запроса.


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

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
> Browse не имеет никаких средств для экспорта куда бы то ни было. Равно как и grid.

Лирическое отступление. Все просят, что вот вижу таблицу (грид по-нашему), как мне сделать ее же в Экселе. Поскольку BROWSE у меня изображается через подпрограмму (BROW "инкапсулирован" по-научному), то приделал перехват клавиши Ctrl-P (печать в винде) и по нажатии её делаю превращение текущего курсора в "файл Excel" (детали преобразования тоже увлекательны, но это может быть в принципе что-то типа COPY TO (имя_файла_excel) TYPE XL5)
Ratings: 0 negative/0 positive
Re: Вывод БД на экран по реквизитам содержащихся в ListBox.
ptaxa888
Автор

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

Сообщений: 61
Дата регистрации: 07.03.2018
Прошу прощения, я сам Вас запутал. Когда говорилось про browse имелось ввиду использование временной таблицы с использованием SELECT-SQL.
Уникальные ключи имеются, в запросной части всё получилось на ура, поддалось освоению. А вот mover пока даже не щупал.
Я два месяца в программировании, и в фоксе ровно столько же. Прошу сильно не ругать
Спасибо большое за информацию, буду разбираться.



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


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

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

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