Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Вниз

Access. Записи детала в одну строку   Найти похожие ветки 

 
msguns ©   (2005-10-06 11:49) [0]

Запросом, видимо, нельзя. А есть вообще способы сделать это на "сервере" ?

Поясню:
1. Таблица изданий (GID,..)
2. Таблица авторов (AID,FIO)
3. Таблица авторов издания (ID,GID,AID)

Надо "вытащить" всех авторов каждого издания и показать их в гриде одной строкой :

"Манифест комм.партии" ... К.Маркс,Ф.Энгельс,В.Ленин,...

Идея была: развернуть Тбл3 по типу кросса и подцепить связкой к осн.таблице. Но как это реализовать, не могу въехать, ведь кол-во "столбцов" (авторов) произвольное

Спасибо за любую помощь и советы


 
Курдль ©   (2005-10-06 12:10) [1]

Это либо на клиенте, либо спец. компонентом типа pivot, но лучше - серверной процедуриной.


 
Os ©   (2005-10-06 12:22) [2]

И как на сервере определить длину возвращаемой строки?


 
Os ©   (2005-10-06 12:24) [3]

Извиняюсь за неточность: не определить а задать. Всегда найдется запись длинней.


 
Курдль ©   (2005-10-06 12:24) [4]


> Os ©   (06.10.05 12:22) [2]
> И как на сервере определить длину возвращаемой строки?


А зачем?! 8-()


 
Курдль ©   (2005-10-06 12:25) [5]

При создании таблицы определить поле, как VARCHAR


 
sniknik ©   (2005-10-06 12:26) [6]

у Access есть специальная sql конструкция
TRANSFORM ... PIVOT ...
которой можно "перевернуть" рекордсет "на бок"

подробнее в справке по Access (или иши в мсофисе JETSQL40.CHM)


 
msguns ©   (2005-10-06 12:30) [7]

>Курдль ©   (06.10.05 12:10) [1]
>sniknik ©   (06.10.05 12:26) [6]

За наводку спасибо - уже смотрю. А вот еще, если не трудно ;)

http://delphimaster.net/view/3-1128587181/


 
Os ©   (2005-10-06 12:32) [8]


> При создании таблицы определить поле, как VARCHAR


А разве можно не указывать длину VarChar?


 
Курдль ©   (2005-10-06 12:40) [9]


> Os ©   (06.10.05 12:32) [8]
> А разве можно не указывать длину VarChar?


Смотря для какой СУБД.
Если какая-то не позволяет - можно рассчитать разумную длину.
Вряд ли список авторов превысит пару сотен байт. А уж 1000 за глаза хватит.


 
msguns ©   (2005-10-06 13:09) [10]

Блин, трансформом получается чудовище ;(
Если, к примеру, юзер захочет получить весь каталог, просто отключив фильтр, то в НД попадет все издания библиотеки (несколько десятков тыщ записей). Но это Бог с ним, можно "порезать" на куски, а вот что делать с офигительным "хвостом" из тысяч колонок на каждого автора ?
Я уже не обсуждаю тему о времени выполнения такого монстера ;)

В общем нашел такое решение:
В каталог изданий встромляю еще одно стринговое поле (255 б), куда в "клиенте" будет "интеллектуально" прописываться ФИО авторов, добавленные из справочника писателей. Т.е. не ID авторов, а прямо ФИО, разделенные запятыми. Конечно, если узер выкинет автора из справочника или поменяет ему ФИО, он так и останется в своих книгах со старым именем.
Но это, ИМХО, лучше, чем гемориться с запросом или заводить жуткие тормозищи при отображении, подтягивая из БД авторо из детала по каждому изданию


 
Seg   (2005-10-06 13:15) [11]

Последовательность действий должна быть такой:

1.Получаем список изданий
2.Сохраняем во временную таблицу.
3.Запускаем курсор по таблице
4.Для каждой строки выбираем авторов (в столбик)
5.По этому столбику запускаем второй курсор
6.склеиваем строки в одну строку через разделитель
7.добавляем полученную строку к названию издания.


 
msguns ©   (2005-10-06 13:35) [12]

>Seg   (06.10.05 13:15) [11]
>Последовательность действий должна быть такой:

И сколько вся это кухня будет дымить по времени, учитывая первую часть [10] ?


 
Seg   (2005-10-06 13:56) [13]

В Оракле можно попотеть и сделать одним запросом.

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


 
msguns ©   (2005-10-06 15:21) [14]

>Seg   (06.10.05 13:56) [13]
>В Оракле можно попотеть и сделать одним запросом.

В скл-сервере можно запросто нарисовать ХП, которая легко это сделает ;)

>Если есть возможность модифицировать базу, то можно добавить в таблицу 3 еще одно поле, где хранить в одной строке всех авторов.

Именно этот способ и описан в [10], 2-й абзац ;) Только в основную таблицу (1)


 
Seg   (2005-10-06 15:30) [15]

Конечно, если узер выкинет автора из справочника или поменяет ему ФИО, он так и останется в своих книгах со старым именем.


А если подумать и дописать триггер на редактирование/удаление и в нем найти этого автора и изменить/удалить его?


 
Курдль ©   (2005-10-06 15:33) [16]


> Seg   (06.10.05 13:56) [13]
> В Оракле можно попотеть и сделать одним запросом.


Одним запросом? Не скриптом и не процедурой?
А нельзя ли пример, а то навскидочку что-то ничего на ум не приходит...


 
msguns ©   (2005-10-06 15:37) [17]

>Seg   (06.10.05 15:30) [15]
>А если подумать и дописать триггер на редактирование/удаление и в нем найти этого автора и изменить/удалить его?

Охохонюшки.. ;((

1. В ацесе появились триггеры ?
2. Если бы был сиквель-сервер, то
 - решается ХП, ну внимательнее читайте ответы, а ?
 - если после каждого изменения в справочнике Авторов по триггеру будет вызываться ХП, ищущая по всей базе в стринговом поле контекстно ФИО автора и менять весь стринг, вырезая, вставляя и компонуя строку заново, сколько по времени будет выполняться апдэйт одной лишь записи справочника ?
Даже в горячечном бреду не додумался бы до такого ;))


 
Курдль ©   (2005-10-06 15:40) [18]


> msguns ©   (06.10.05 11:49)
> 1. Таблица изданий (GID,..)
> 2. Таблица авторов (AID,FIO)
> 3. Таблица авторов издания (ID,GID,AID)

А я вот думаю, зачем в 3. нужен ID? Ведь быть "дважды автором одной книги" как-то нелепо на мой взгляд :)


 
Danilka ©   (2005-10-06 15:44) [19]

msguns ©   (06.10.05 15:37)
2. Если бы был сиквель-сервер, то


А чего ты вообще пересел с mssql на access? :)


- если после каждого изменения в справочнике Авторов по триггеру будет вызываться ХП, ищущая по всей базе в стринговом поле контекстно ФИО автора и менять весь стринг, вырезая, вставляя и компонуя строку заново, сколько по времени будет выполняться апдэйт одной лишь записи справочника ?
Даже в горячечном бреду не додумался бы до такого ;))


вах.
1. что мешает выбрать по третьей таблице только те книги, в которых есть этот автор?
2. как часто у авторов книг меняецца ФИО?
:)


 
msguns ©   (2005-10-06 16:05) [20]

>Danilka ©   (06.10.05 15:44) [19]
>А чего ты вообще пересел с mssql на access? :)

Я не пересел, я как бы на двух стульях ;)) Точнее, четырех. Еще ИБ и старые болячки на парадоксе.
"Це жыття, сынку" ;)))

>1. что мешает выбрать по третьей таблице только те книги, в которых есть >этот автор?

Речь в [10]  идет о том, что в самом каталоге хранятся не указатели на автором, а строка, где они перечислены скопом через запятую. Эту строку правит не юзер, а программа-клиент. Он лишь выбирает нужного из справочника. Поэтому третьей таблицы не надо (а ее уже и нет - мир ее праху !)

>2. как часто у авторов книг меняецца ФИО?

При первичном заведении БД не очень опытными девочками-с-длинными-ногами-умеющими-быстро-стучать-по-клаве ошибок будет море. И только когда библиотекарь Марьиванна начнет сурьезно работать с базой, она это увидит. И будет исправлять.
А в целом меня не столько интересует решение данной траблы в текущем "библиотечном" проекте, как вообще проблема в СУБД, не располагающих возможностями ХП.


 
Seg   (2005-10-06 16:14) [21]

А нельзя ли пример, а то навскидочку что-то ничего на ум не приходит...

Конечно только одним запросом не обойтись, придется маленькую функцию написать.

Пример на тестовой базе SCOTT

текст функции:

create or replace function job_line
(
sjob in varchar2,
separator in varchar2)
return varchar2
is
 Result varchar2(1000);
 
 cursor cr1 is select t.ename from emp t where t.job=sjob;
begin
 
 for i in cr1 loop
     Result:=Result || i.ename || separator|| " ";      
 end loop;
 
 Result:=substr(Result,1,length(Result)-2);
 return(Result);
end job_line;

текст запроса:
select t.job || ": "|| job_line(t.job,",")
from emp t
group by t.job || ": "|| job_line(t.job,",")

Результат:

1 ANALYST: SCOTT, FORD
2 CLERK: SMITH, ADAMS, JAMES, MILLER
3 MANAGER: JONES, BLAKE, CLARK
4 PRESIDENT: KING
5 SALESMAN: ALLEN, WARD, MARTIN, TURNER


 
msguns ©   (2005-10-06 16:20) [22]

>Seg   (06.10.05 16:14) [21]

Ф-ция - это не совсем запрос, однако. Точнее, совсем не запрос, а скорее макрос.
Кстати, а какое отношение вся эта красота имеет к сабжу-то ? Где первым словом красным по светло-серому написано "Акцесс", т.е. СУБД БЕЗ ФУНКЦИХ И ХРАНИМЫХ ПРОЦЕДУР.


 
Seg   (2005-10-06 16:21) [23]

А в целом меня не столько интересует решение данной траблы в текущем "библиотечном" проекте, как вообще проблема в СУБД, не располагающих возможностями ХП.

СУБД - Система Управления Базой Данных.
Если нет Системы Управления - то это не СУБД, это просто База Данных.


 
Seg   (2005-10-06 16:23) [24]

Кстати, а какое отношение вся эта красота имеет к сабжу-то ?

Никакого. Пример для Курдля.


 
Курдль ©   (2005-10-06 16:29) [25]


> Seg   (06.10.05 16:23) [24]
> Никакого. Пример для Курдля.


Спасибо, но я имел в виду "одним запросом" :)


> Seg   (06.10.05 13:56) [13]
> В Оракле можно попотеть и сделать одним запросом.


Лень было попотеть? :)


 
msguns ©   (2005-10-06 16:31) [26]

>Seg   (06.10.05 16:21) [23]
>>СУБД, не располагающих возможностями ХП.
>Если нет Системы Управления - то это не СУБД, это просто База Данных

Надо понимать, что всякие там парадоксы, дибэйзы, изибэйзы и т.д. - не СУБД, а так, погулять вышли ибо ну нет у них ни триггеров, ни хранимых процедур, ни даже любимых тобою функций ?
Типа сама ОС разруливает базами.


 
Seg   (2005-10-06 16:53) [27]

парадоксы, дибэйзы, изибэйзы и т.д. - не СУБД, а так, погулять вышли

По меркам 10-ти летней давности, это может быть и СУБД, хотя больше похожи на набор файлов для хранения данных.


 
msguns ©   (2005-10-06 17:10) [28]

>Seg   (06.10.05 16:53) [27]
>По меркам 10-ти летней давности, это может быть и СУБД, хотя больше похожи на набор файлов для хранения данных.

Весьма глубокое заблуждение, говорящее о некомпетентности и пренебрежении к непознанному ;))

Да будет тебе известно, что огромное число реально действующих и поныне систем во всю используют высмеиваемый тобою "набор файлов для хранения данных". Например, 1С.

Кроме того, вполне удачный и шустрый движок BDE начал реально загибаться лишь после выхода в свет широкодоступных фриварных сиквель-серверов, а до этого эксплуатировался так, что и твоему раклу не снилось (имеется в виду к-во контор, которые им пользовались).

С твоего разрешения, один маленький совет:
Не надо позволять себе пренебрежительные выпады в адрес устаревшего, тем более такого, о котором не имеешь розового понятия.


 
Seg   (2005-10-06 17:23) [29]

"набор файлов для хранения данных". Например, 1С.

А в другой ветке мне доказывали, что 1С не работает с dbf файлами.
Кто же прав?


 
sniknik ©   (2005-10-06 17:34) [30]

ну какже не работает, работает, и с dbf и с mssql, mysql и с ораклом может, стоит только захотеть... ;)


 
Seg   (2005-10-06 17:40) [31]

Я же не сам это придумал, мне это пытаются доказать:


> и однопользовательская - на dbf файлах.

неправда


 
Seg   (2005-10-06 17:41) [32]

В "потрепаться" ветка про 1С.


 
Danilka ©   (2005-10-07 08:09) [33]

[20] msguns ©   (06.10.05 16:05)
Поэтому третьей таблицы не надо (а ее уже и нет - мир ее праху !)


Ну это ты зря, на мой взгляд.

Seg   (06.10.05 17:40)
Я же не сам это придумал, мне это пытаются доказать:

> и однопользовательская - на dbf файлах.

неправда


Ты просто не понял. Имелось ввиду то, что многопользовательские тоже довольно успешно работают на ДБФ-ках.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.11.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.039 c
3-1128673276
Kacnep
2005-10-07 12:21
2005.11.20
Последовательное открытие в АДОTABLE нескольких таблиц.


1-1130596156
FunkyByte
2005-10-29 18:29
2005.11.20
Проблема при вставке текста из буффера обмена в Memo


2-1130915853
nbab
2005-11-02 10:17
2005.11.20
Как кнопку сделать плоской, (как в панели быстрого запуска)?


14-1130228493
Ega23
2005-10-25 12:21
2005.11.20
С днем рождения! 7 октября


2-1130856983
Arazel
2005-11-01 17:56
2005.11.20
Быстрый пойск в масиве





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский