Войти

Показать полную графическую версию : [решено] MS Access. Отчёт, базирующийся на запросе с отбором данных для вывода - как сделать?


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

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

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

Delirium
14-07-2010, 01:31
Darkvar, получается, что структура такая таблицы?
КОД
ФИО
Сертификат

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

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

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

3 Петров Сер1

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

Delirium
14-07-2010, 02:14
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
А данные примерно такие(представим, что всего 2 сертификата):
Код:
1 Иванов Сер1
2 Иванов Сер2
3 Петров Сер2 »

Немножко не так.
1 Иванов Сер1 Сер2
2 Петров Сер1

И вывести должно
Петров Сер1

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

Delirium
15-07-2010, 01:33
Не понял, так у вас структура таблицы такая? :

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

Darkvar
15-07-2010, 10:14
Код:
Код
ФИО
Сер1
Сер2
Сер3
....
Сер25 »

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

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

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

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


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

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

El Scorpio
16-07-2010, 05:58
Поле ФИО в таблице уникально и не может повторяться, приходиться вот так изгаляться »
"Головы им нужно поменять, а не конституцию" ((с) Крабе)

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

Darkvar
16-07-2010, 10:37
Мда, задача усложнилась тем, что каждый сертификат в отдельном столбце, а Access либо выводит столбец, либо нет при создании запроса. Теоретически могу сделать запрос, который выведет результат примерно в таком виде:
Код:
Иванов Сер1-OD123, Сер2-OD121, Сер3-OD125
Т.е. В одном поле будет фио, а в другом - через зяпятую-наименование столбца с сертификатом и имя. Устроит так? »
Delirium, мне-то как раз и нужно, чтоб выводило наименование столбца с сертификатом, которого нету у человека. И да - подойдёт, если будет всего 2 столбца:
1) ФИО
2) Перечисление сертификатов, которых нету у человека через запятую. Номера сертификатов даже и не нужны, достаточно просто наименования этого сертификата.

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

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


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


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
Delirium, гранд мерси за помощь.
Допилил немного запрос под свои нужды и вроде бы работает на достаточном уровне.

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

El Scorpio
21-07-2010, 01:06
Базу, увы, переделать не могу ибо она уже полностью забита, созданы отчёты, запросы и пр. »
Можно один раз написать программу перегрузки информации в таблицу с правильной структурой.

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




© OSzone.net 2001-2012