Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
Имеется БД сотрудников отдела которая содержит в себе 7 таблиц связанных по индексным полям.
Действие происходит на форме. Имеется два listbox1 и listbox2 и кнопка вывода на экран таблицы с реквизитами listbox2. В listbox1 содержатся все реквизиты результирующей таблицы сотрудников, в listbox2 перемещаются реквизиты которые должны быть выведены в результирующей таблицы. Вопрос: каким способом можно вывести на экран только выбранные реквизиты? |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Хотелось бы увидеть ваши соображения, по этому поводу.
Попутно, для ответа, требуется что то знать о схеме данных. А так же
На какой экран? На форму? В Грид, или еще что то? Так же неясна фраза В общем написали вопрос для соседа, который видит ваш экран, и в курсе чем вы занимаетесь) ------------------ |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
Божья_коровка Сообщений: 25720 Дата регистрации: 23.08.2001 |
Может ТС нужен просто запрос? Вроде такого -
select <тут перечень выбранных реквизитов> from результирующая таблица и выбросить это в грид на форму, ну или где ТС хочет показать результат ------------------ Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается... |
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 |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
Извиняюсь, сейчас все будет...
Вывести результат нужно в окно просмотра browse т.к. из него легко и просто делать экспорт в EXCEL. Если использовать Grid то нет возможности соединять таблицы как это делается в select с помощью inner join, а у меня как раз все таблицы взаимосвязаны, и мне необходимо из всех таблиц сформировать нужную скорее всего через select. |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
Я не против сделать через select, но есть одно НО. придется создать 2^54 запросов, чтобы попасть под тот который будет скомпанован в Listbox2. |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
Вот тут похоже на истину которая подходит для моего случая)) Запросная форма у меня уже создана, функционирует. Сейчас работаю именно над формированием таблицы по выбранным реквизам Если есть какой-то подобный пример "с макро" бросьте ссылочку пожалуйста. Исправлено 1 раз(а). Последнее : ptaxa888, 07.03.18 15:11 |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
Божья_коровка Сообщений: 25720 Дата регистрации: 23.08.2001 |
Чего там делать то -
Если хотите создать таблицу с вашими выбранными полями с эталона то можно примерно так - COPY TO (gsFile_Nam) FIELDS &rekv а потом уже открывать ее и делать brow ------------------ Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается... Исправлено 2 раз(а). Последнее : Божья_коровка, 07.03.18 15:27 |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
понял, практически) Еще вопрос как связать строку из listbox2 и переменную? thisform.list2.value=fio? Исправлено 1 раз(а). Последнее : ptaxa888, 07.03.18 15:47 |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
Так скорее всего не получится т.к. будут потеряны связи между таблицами, а в каждой таблице практически разное кол-во строк. Результирующая таблица имеет вид (см.во вложении), но на выходе вместо цифр появляется текст. Вообщем без inner join не обойтись. |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
Божья_коровка Сообщений: 25720 Дата регистрации: 23.08.2001 |
Вы не можете сформировать строку с необходимыми полями которые выбрали в листбокс2? Я правильно поняла? А что значит применить код к нему? Вам нужен примерный запрос но из тех полей, что были выбраны в листбокс2? Ну так сформируйте нужную для вас строку из перечня реквизитов, ну и соответственно в FROM будут изменения. К примеру если юзер не выбрал какой либо справочный реквизит или блок реквизитов из таблицы - Passport, то эта таблица в связке не понадобится ------------------ Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается... Исправлено 1 раз(а). Последнее : Божья_коровка, 07.03.18 15:58 |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
Божья_коровка Сообщений: 25720 Дата регистрации: 23.08.2001 |
Ну так у вас по сути будет "динамический" запрос. Ведь юзер может и не выбрать к примеру реквизиты Паспорта или ВУ или Авто....Т.е. по вашему заданию пользователь выбирает в листбокс2 ряд нужных ему реквизитов и по ним формируется запрос со связями к справочникам и тем таблицам чьи данные он выбрал.
------------------ Жись, она как зёбра, полоса белая, полоса черная, а мне всегда задница достается... |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
К примеру одного из реквизитов: в результирующей таблице "Фамилия Имя Отчество" это реквизит 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 |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
не в бровь, а в глаз - все верно. |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
Да, не получается ничего путного. |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
Аспид Сообщений: 3475 Откуда: Москва Дата регистрации: 01.04.2005 |
Бегло перечитал, может что то упустил)
У вас есть listbox1, в котором описаны все критерии отбора. Я бы советовал свести их в некую таблицу (criteria), структура которой Наименование - Name, таблица_поле - tblfld, алиас поля - fldname Для формы выбираете из этой таблицы в курсор, в который добавляете поле выбора choice.
При переносе в listbox2, на переносимых записях ставите choice=.t. Далее для формирования запроса просто сканируете курсор c фильтром choice=.t. и заполняете поля.
Остается вопрос про соединения. Тут только вам видна структура, и что да как. Но вполне можно в ту же таблицу criteria их запихнуть Еще вариант, сделать запрос по все полям, а потом смотреть что исключить (просто visible = .f. в гриде) ------------------ |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В прикладных программах НИКОГДА не следует использовать команду BROWSE. Используются формы и объект grid - который даёт почти то же самое, но под полным контролем, и полностью настраиваемо. Browse не имеет никаких средств для экспорта куда бы то ни было. Равно как и grid. Есть команды типа COPY TO/EXPORT, и работают они с курсором (таблицей, либо временной таблицей открытой в одной из рабочих областей). Курсор может отображаться как по команде BROWSE, так и в объекте grid - принципиальной разницы тут нет. Ни browse ни grid не "соединяют" таблицы - ни через inner join ни "старым" способом через SET RELATION. Они оба лишь средства ПРОСМОТРА курсора (или нескольких связанных курсоров, хотя я бы не рекомендовал такой вариант - основанный на командах-настройках SET RELATION). "Соединяет по join" таблицы (точнее курсоры - как более широкое понятие, включающее и "обычные dbf" и временные, автоматически управляемые фоксом таблицы) команда SELECT-SQL. Она создаёт из исходных таблиц одну новую - обычно это временная таблица, создаваемая с помощью опции INTO CURSOR имя_курсора. Созданный курсор можно отобразить в grid (и в BROWSE - но оставь его только для целей отладки - не используй в собственно коде приложения), и можно "экспортировать" в другие форматы - начиная от простейших вариантов реализуемых командами COPY TO/EXPORT и заканчивая достаточно сложными генераторами отчётов на основе шаблонов, к примеру. Нет, при использовании макро запрос будет всего один, он будет собран в нужном виде, на основе выбранных в mover полей.
В объекте 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 - т.к. помимо "человеческого имени" нужно ещё и собственно имя поля (желательно с префиксом - именем таблицы), и имя "выходного" поля - как его называть в создаваемом в результате курсоре.
Вот то что "Фамилия Имя Отчество" это человеческое имя для поля "ic.a01", а в таблице-результате это поле должно называться "PersonName" - это ТЫ должен прописать в программе. В зависимости от того как сделаны списки для mover-а - в курсорах, наподобии того что пишет Аспид, в массивах, или в коде использующем Listbox.AddListItem - и пишется всё это "соответствие". Скорее всего где-то уже есть курсор-источник с данной метаинформацией (списком "человеческих" имён полей) - так что там и ищи, или туда и добавляй дополнительные поля. Надеюсь что учить тому как зная значение одного уникального поля перейти на соответствующую запись и получить значения остальных полей не требуется... Хотя нет, конечно же я НЕ надеюсь на это, по уровню задаваемых вопросов Кстати, очень не советую именовать что либо кириллицей - фокс не 1с, и поиметь тупых ошибок от того что в ic.a01 буква с или буква а были набраны не в той раскладке - проще простого. Вот найти эту проблему порой затруднительно - ОСОБЕННО для динамически создаваемого кода - когда до момента прогона "с использованием" этого поля ты ошибку и не увидишь. По поводу соединений - если данная БД хотя-бы минимально не г*венная (есть уникальные ключи) и не ворочает гигабайтами данных, то по крайней мере на первом этапе не обязательно парится насчёт динамического формирования части FROM запроса. Вполне подойдёт статически (без макро) прописанный FROM соединяющий ВСЕГДА все 7 или сколько их там надо таблиц. Кстати, там наверняка потребуется именно LEFT JOIN для прицепления "неосновных" таблиц к "главной". Да, это приводит к выполнению некоторого объёма "лишней работы" - но ты бы для начала основу одолел, потом уж можно заниматься доведением до ума, в т.ч. и оптимизацией кода запроса. ------------------ WBR, Igor |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
of63 Сообщений: 25161 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> Browse не имеет никаких средств для экспорта куда бы то ни было. Равно как и grid.
Лирическое отступление. Все просят, что вот вижу таблицу (грид по-нашему), как мне сделать ее же в Экселе. Поскольку BROWSE у меня изображается через подпрограмму (BROW "инкапсулирован" по-научному), то приделал перехват клавиши Ctrl-P (печать в винде) и по нажатии её делаю превращение текущего курсора в "файл Excel" (детали преобразования тоже увлекательны, но это может быть в принципе что-то типа COPY TO (имя_файла_excel) TYPE XL5) |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
Этот вариант к сожалению не подходит, его я осилил уже на первом этапе. Необходимо отсечь(удалить) поля до того как на экране появляется информация из БД. |
Re: Вывод БД на экран по реквизитам содержащихся в ListBox. | |
---|---|
ptaxa888 Автор Сообщений: 61 Дата регистрации: 07.03.2018 |
Прошу прощения, я сам Вас запутал. Когда говорилось про browse имелось ввиду использование временной таблицы с использованием SELECT-SQL.
Уникальные ключи имеются, в запросной части всё получилось на ура, поддалось освоению. А вот mover пока даже не щупал. Я два месяца в программировании, и в фоксе ровно столько же. Прошу сильно не ругать Спасибо большое за информацию, буду разбираться. Исправлено 1 раз(а). Последнее : ptaxa888, 07.03.18 23:17 |
© 2000-2024 Fox Club  |