Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] MS Access. Отчёт, базирующийся на запросе с отбором данных для вывода - как сделать? (http://forum.oszone.net/showthread.php?t=180469)

Darkvar 13-07-2010 11:35 1452388

MS Access. Отчёт, базирующийся на запросе с отбором данных для вывода - как сделать?
 
Преамбула:
Есть MS Access база с 1 таблицей. Есть запрос по этой базе выбирающий следующие поля : ФИО и номера сертификатов. Всего 25 видов сертификатов, но не у каждого человека есть все, может быть 1 сертификат, а может быть 5 сертификатов. И есть отчёт, построенный на основании вышеуказанного запроса.

Амбула:
Необходимо выводить в отчёт ФИО и название сертификата, которого нету у данного человека, т.е. скрывать те сертификаты, которые он получил. Как я понимаю - нужно построчно просматривать запрос и проверять на наличие номера сертификата, если есть номер - скрывать поле с этим сертификатом в отчёте, но не знаю как это сделать.

Прошу помощи.

Delirium 14-07-2010 01:31 1452911

Darkvar, получается, что структура такая таблицы?
Код:

КОД
ФИО
Сертификат

А данные примерно такие(представим, что всего 2 сертификата):

Код:

1 Иванов Сер1
2 Иванов Сер2
3 Петров Сер2

И запрос Должен вывести

Код:

3 Петров Сер1
Т.к. у Иванова есть оба сертификата, то он и не выведется в результате. Верно?

Delirium 14-07-2010 02:14 1452919

Код:

SELECT Т1.ФИО, Т2.Сертификат
FROM Таблица1 AS Т1, Таблица1 AS Т2
WHERE NOT Exists (select Т2.Сертификат from Таблица1 Т2 where Т1.ФИО=Т2.ФИО and т1.Сертификат<>Т2.Сертификат) and Т1.Сертификат <>Т2.Сертификат;

Выведет

Код:

Петров Сер1
Проверял и тестировал в Access 2007. Работает.

Darkvar 14-07-2010 10:27 1453029

Цитата:

Цитата Delirium
А данные примерно такие(представим, что всего 2 сертификата):
Код:
1 Иванов Сер1
2 Иванов Сер2
3 Петров Сер2 »

Немножко не так.
Код:

1 Иванов Сер1  Сер2
2 Петров Сер1

И вывести должно
Код:

Петров Сер1
Поле ФИО в таблице уникально и не может повторяться, приходиться вот так изгаляться :(
И ещё только что узнал, что у разных сертификатов может быть один и тот же номер/название. Например OD 123 ... И как можно с такими людьми работать...
Выручайте, а то это тихий ужас какой-то

Delirium 15-07-2010 01:33 1453515

Не понял, так у вас структура таблицы такая? :

Код:

Код
ФИО
Сер1
Сер2
Сер3
....
Сер25

То есть 25 полей в таблице и в поле может быть какой то признак сертификата? Приведите ПРАВИЛЬНУЮ структуру, тогда и плясать будем. Лучшим вариантов будет вложение пустой базы (с 1-2 записями, чтобы понятней было).

Darkvar 15-07-2010 10:14 1453642

Цитата:

Цитата Delirium
Код:
Код
ФИО
Сер1
Сер2
Сер3
....
Сер25 »

Абсолютно верно. Только поля называются
Код:

Курс1Серт№
Курс2Серт№
...
Курс25Серт№

И в этих полях записаны номера сертификатов, которые являются признаком наличия сертификата соответственно. Причём номера сертификатов разных курсов могут совпадать, например:
Код:

Фамилия  Курс1Серт№ ... Курс14Серт№
Петров      OD 123          OD123

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

Delirium 16-07-2010 02:10 1454235

Мда, задача усложнилась тем, что каждый сертификат в отдельном столбце, а Access либо выводит столбец, либо нет при создании запроса. Теоретически могу сделать запрос, который выведет результат примерно в таком виде:
Код:

Иванов Сер1-OD123, Сер2-OD121, Сер3-OD125
Т.е. В одном поле будет фио, а в другом - через зяпятую-наименование столбца с сертификатом и имя. Устроит так?

El Scorpio 16-07-2010 05:58 1454260

Цитата:

Цитата Darkvar
Поле ФИО в таблице уникально и не может повторяться, приходиться вот так изгаляться »

"Головы им нужно поменять, а не конституцию" ((с) Крабе)

Таблицу эту нужно переделать, потому что в настоящее время она просто неработоспособна.
Создаётся два столбца - ФИО и Сертификат - и объявляется первичный ключ на оба поля.

Darkvar 16-07-2010 10:37 1454373

Цитата:

Цитата Delirium
Мда, задача усложнилась тем, что каждый сертификат в отдельном столбце, а Access либо выводит столбец, либо нет при создании запроса. Теоретически могу сделать запрос, который выведет результат примерно в таком виде:
Код:
Иванов Сер1-OD123, Сер2-OD121, Сер3-OD125
Т.е. В одном поле будет фио, а в другом - через зяпятую-наименование столбца с сертификатом и имя. Устроит так? »

Delirium, мне-то как раз и нужно, чтоб выводило наименование столбца с сертификатом, которого нету у человека. И да - подойдёт, если будет всего 2 столбца:
1) ФИО
2) Перечисление сертификатов, которых нету у человека через запятую. Номера сертификатов даже и не нужны, достаточно просто наименования этого сертификата.

To El Scorpio,
Ну отдаю честь Вашему "званию" :"Спасибо, Кэп" :) .
Базу, увы, переделать не могу ибо она уже полностью забита, созданы отчёты, запросы и пр. Как она до сих пор работала - загадка для всех. А человек, который "проектировал" базу - не имеет ни малейшего понятия о структуре БД.

Delirium 19-07-2010 02:13 1455792

Цитата:

Цитата Darkvar
Номера сертификатов даже и не нужны, достаточно просто наименования этого сертификата. »

Как можно вывести наименование сертификата, которого НЕТ? А если этого сертификата нет ни у одного пользователя? Можно, конечно, создать небольшое соответствие номеров названиям, но, в случае отсутствия сертификата у всех, будет тупить...


Создаем запрос, в котором пишем вот такой хитрый запрос:


Код:

SELECT Таблица1.ФИО,
IIf(Таблица1.Сер1 is null,' Серт1  ','')  +
IIf(Таблица1.Сер2 is null,' Серт2 ','')  +
IIf(Таблица1.Сер3 is null,' Серт3 ','')  +
IIf(Таблица1.Сер4 is null,' Серт4 ','')  +
IIf(Таблица1.Сер5 is null,' Серт5 ','')  +
IIf(Таблица1.Сер6 is null,' Серт6 ','')  +
IIf(Таблица1.Сер7 is null,' Серт7 ','') AS ["Сертификаты"]

FROM Таблица1
WHERE
Таблица1.Сер1 is null OR
Таблица1.Сер2 is null OR
Таблица1.Сер3 is null OR
Таблица1.Сер4 is null OR
Таблица1.Сер5 is null OR
Таблица1.Сер6 is null OR
Таблица1.Сер7 is null


Данный пример имеет таблицу (Таблица1), в которой есть 7 Столбцов:

Код:

Код        ФИО          Сер1        Сер2        Сер3        Сер4        Сер5        Сер6        Сер7

На выходе получаем вот такой результат:


Код:

ФИО        "Сертификаты"
Петров        Серт1  Серт2  Серт3  Серт4  Серт5
Сидоров        Серт7

В исходной таблице у Иванова есть все 7 сертификатов, поэтому он не выводится в результат. У Сидорова нет только 7-го сертификата.

El Scorpio, согласен, структура базы ужаснейшая, но, зачастую, увы, приходится работать и с такими вот ляпусами, куда ж деваться :)

Darkvar 20-07-2010 08:45 1456530

Delirium, гранд мерси за помощь.
Допилил немного запрос под свои нужды и вроде бы работает на достаточном уровне.

P.S. Тему пока что не закрываю, ибо скоро появится ещё 1 вопрос по этой же базе :up

El Scorpio 21-07-2010 01:06 1457149

Цитата:

Цитата Darkvar
Базу, увы, переделать не могу ибо она уже полностью забита, созданы отчёты, запросы и пр. »

Можно один раз написать программу перегрузки информации в таблицу с правильной структурой.

Delirium 21-07-2010 01:07 1457150

El Scorpio, и снова вы немного неправы. А если эта база используется клиентским приложением, в котором жестко прописаны данные поля? Переписывать клиентскую часть? Довольно хлопотное дело, особенно, если нет исходника :)


Время: 23:10.

Время: 23:10.
© OSzone.net 2001-