Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.20;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.045 c
14-1130405707
Prohodil Mimo
2005-10-27 13:35
2005.11.20
Вопрос по WMWare


2-1130440338
KaTH
2005-10-27 23:12
2005.11.20
массивы в делфи


3-1128661433
syte_ser78
2005-10-07 09:03
2005.11.20
Перевод БД на другой язык


2-1130953198
getttr
2005-11-02 20:39
2005.11.20
Как разместить форму в правом нижнем углу десктопа?


2-1130455887
Blur
2005-10-28 03:31
2005.11.20
Как сделать имеджу небольшой блюр ?