Конференция "Базы" » Создать запрос из списка значений полей [D7, Access]
 
  • Труп Васи Доброго © (01.11.11 09:19) [20]
    Тогда продумай нормальную архитектуру базы данных. В одной таблице должно быть только то, что относится только к этому объекту. Таблица стран, таблица районов, таблица городов, то есть 3 таблицы, а не одна. Так же и с именами(позывными), если одному имени соответствует строго один позывной, то это в одну таблицу, если у одного тела могут быть разные позывные, то это две разные таблицы. После этого твой вопрос скорее всего решится сам собой.
  • Труп Васи Доброго © (01.11.11 09:27) [21]
    Вообще почитай о нормализации БД, это крайне полезно. Заведи правило - не работать с БД, пока не приведёшь её к третьей нормальной форме. Потом это войдёт в привычку, втянешься и пойдёт поедет. Бывало по нескольку дней сидишь, но до пятой формы дотянешь :)
  • Ega23 © (01.11.11 10:02) [22]

    > куда вносятся Позывной, Имя, Город, Район, Страна ... <Еще
    > некоторые специфические данные>, дале поля Диапазон и Модуляция


    Таблица "Страны" -> таблица "Регионы" -> таблица "Районы"-> таблица "Города".
    Связаны "один ко многим".

    Таблица "Радиолюбители" (
     ID,
     CityID,
     Codename,
     <Еще некоторые специфические данные>
     Диапазон и Модуляция (вполне возможно, что тоже ссылки на справочные таблицы)
    )
  • Alex_C (01.11.11 10:02) [23]

    > Таблица стран, таблица районов, таблица городов, то есть
    > 3 таблицы, а не одна.


    Да совершенно верно! Я так и предполагаю. Для каждого варианта запроса (т.к. они могут быть ну очень разные) создавать свою таблицу. Т.е. у меня будет грубо говоря award.mdb, содержащий таблицы для каждого варианта запроса или как вариант таблица одна, но ввести поле указывающее к какому запросу относится эти данные. Здесь понятно.

    Теперь к конкретике. Я хочу получить статистику по сработанным районам США и Канады. Создаю таблицу с полями Страна, город, район. Вношу в таблицу данные. Ок!
    Теперь нужно получить из таблицы связей и этой таблицы итоговую таблицу статистики с полями Страна, Город, Район, Диапазон1..ДиапазонN. В ячейках Диапазон указывается количество связей/количество отправленных запросов на подтверждение/количество полученных подтверждений.
    Вопрос: как правильно сформировать запрос?
  • Ega23 © (01.11.11 10:35) [24]

    > Вопрос: как правильно сформировать запрос?


    Тебе сначала нужно нормализовать базу.
  • Труп Васи Доброго © (01.11.11 10:39) [25]

    > Для каждого варианта запроса (т.к. они могут быть ну очень
    > разные) создавать свою таблицу.

    Ты сам понял что сказал??? Это как??? Таблицы данных создаются один раз потом этими самыми данными заполняются. После этого строишь любые (какие в голову взбредёт запросы) и получаешь результат. НО для этого сначала (с самого начала) вообще забыть о программировании и идти читать о БД (вообще, а не о конкретной СУБД), потом курить SQL (знакомые буквы?). И только после этого пытаться работать с базами. Иначе получится нечто геммороидальное вроде упомянутого КЛАДРа.
  • DiamondShark © (01.11.11 10:59) [26]

    > Alex_C   (01.11.11 10:02) [23]

    Не парься. Загрузи свою мегатаблицу в Эксель, тыкни в "Автофильтр" и наслаждайся результатом.

    А местные гуру тебе ничем не помогут, дельфи отшибает мозги почище водки, многие, кстати, совмещают.
  • Alex_C (01.11.11 11:18) [27]

    > потом курить SQL


    Именно этим сейчас и занимаюсь: Введение в SQL Грабер Мартин.


    > А местные гуру тебе ничем не помогут


    Зра ты так! Очень даже помогают!
  • Ega23 © (01.11.11 11:25) [28]

    >  Введение в SQL Грабер Мартин.


    Хорошая, годная книга.


    > Зра ты так! Очень даже помогают!


    Don't feed the trolls.
  • Alex_C (01.11.11 16:09) [29]
    Сейчас для начала разбирательства с SQL сдела пробную программу. Взял с готовой программы базы.
    Возник такой вопрос: как между собой связать таблицы, если они находятся в разных MDB файлах?
  • Alex_C (01.11.11 16:18) [30]
    Директива IN. Сам нашел :)
  • Ega23 © (01.11.11 16:19) [31]

    > Возник такой вопрос: как между собой связать таблицы, если
    > они находятся в разных MDB файлах?


    Зачем такое извращение???
  • sniknik © (01.11.11 18:35) [32]
    > Зачем такое извращение???
    почему извращение? само по себе вещь полезная, обычный гетерогенный запрос, еще с BDE...
    ну к примеру делал так, т.к. у jet-а ограничение на размер, то держал архивы в отдельных базах... ну и т.к. запрос к архивам может "пересечься", и данные нужны в "одним куском" (скажем сегодня и вчера, а вчера это прошлый месяц и его скинули в архив). и что делать? мастрячить доп рекордсет в памяти и туда перекладывать? вот это извращение, а так один запрос, на все про все.
  • Ega23 © (01.11.11 20:16) [33]

    > почему извращение? само по себе вещь полезная


    Само по себе - возможно.
    Но, насколько я понял, автор отнюдь не архивирование имел ввиду...  :)
  • Alex_C (02.11.11 08:46) [34]

    > Зачем такое извращение???


    Опять же из-за специфики программы: сама база (она максимум тыс 150 записей) должна храниться допустим на флешке. Пользователь установил программу на ноуте, дома на компе. Базу переносит на флешке и работает с ней из разных мест. Это обязательное условие для программы.
  • Ega23 © (02.11.11 08:52) [35]

    > Опять же из-за специфики программы: сама база (она максимум
    > тыс 150 записей) должна храниться допустим на флешке. Пользователь
    > установил программу на ноуте, дома на компе. Базу переносит
    > на флешке и работает с ней из разных мест. Это обязательное
    > условие для программы.
    >


    Это всё понятно. Нахрена каждую таблицу держать в отдельном mdb?
  • sniknik © (02.11.11 08:59) [36]
    > Базу переносит на флешке и работает с ней из разных мест.
    ну подключайся прямо к ней, зачем посредники?

    или не умеешь работать/менять настройки в рантайме, всегда подключаешься в "дизайне", и думаешь что так и надо?

    > Зачем такое извращение???
    ты был прав.
  • sniknik © (02.11.11 09:03) [37]
    > Нахрена каждую таблицу держать в отдельном mdb?
    скажем так, по другому.
    1 у тебя есть таблицы такого размера, что не помещаются в 1 mdb?
    2 у тебя есть запросы объединения, данных с например справочниками, лежащих в разных базах?
    3 и последнее. 2 пункт, если такое есть, оно логически оправдано?
  • Труп Васи Доброго © (02.11.11 09:32) [38]
    В корне неверный подход к хранению данных!!!
    Поверь моему опыту, при таком таскании наступит "светлый" момент, когда ты поймёшь, что изменял данные на одном компе, а на флешку забыл базу сбросить, а потом менял данные на другом компе. В итоге у тебя будет таки две, а то и три базы с разными данными и придётся как то их объединять. Или откажись от таскания всей базы (зачем оно вообще нужно???) или предусмотри способ сливания двух баз в одну.
    Базу лучше никогда не таскать в рабочем режиме, только при первой установке, а потом переносить только изменения. В идеале база вообще должна быть одна и в одном месте. Организуй хранилище и используй клиент-серверную технологию, так будет правильнее.
  • Alex_C (02.11.11 11:20) [39]
    Опять же оговорюсь - с точки зрения программиста то как организовано хранение БД - не правильно согласен. Но есть объективная реальность увлечения радио, накладывающая свой отпечаток. Поверьте мне - таких программ, какую пишу я уже море, существуют они по 20 лет и в итоге пришли к некой идеологии, непонятной программистам, но удобной радиолюбителям. :)


    > Поверь моему опыту, при таком таскании наступит "светлый"
    > момент


    ...и он постоянно наступает. :) Для этого в базе у меня предусмотрено не просто копирование таблиц, а именно слияние.


    > зачем оно вообще нужно???


    Радиоэкспедиция.


    > предусмотри способ сливания двух баз в одну.


    Это конечно есть. Я писал выше.


    > Нахрена каждую таблицу держать в отдельном mdb?


    Приехал с радиоэкспедиции - привез свою базу. Нужно слить все данные в "основную" базу на компе дома.


    > Организуй хранилище и используй клиент-серверную технологию


    Ридоэкпедиции делаются в такие районы, что не то что интернета, даже электричества не бывает :) Какая тут "технология".

    А в итоге я разобрался. SQL - как везде написано, очень простой язык запросов. Проблема немного понять его идеологию. Ниже приведу пример, который думаю поможет начинающим в написании сложных запросов.
    Специально для себя все по полочам разложит - по моему так более понятно.
    Прошу сильно не пиннать :) А замечания приветствуются!


    procedure TForm1.Button1Click(Sender: TObject);
    var
     DiplomSelect,
     LogSelect,
     DataCells,
     FirstCols,
     GroupFields,
     DataCols,
     WhereData,
     TotalStr: string;
    begin
     with ADOQueryLog do
     begin
       SQL.Clear;
       // Начало запроса
       TotalStr := 'TRANSFORM ';
       // Формируем что будет отображаться в столбцах таблицы
       DataCells := 'Str(Count(*))+\"/\"+Trim(Str(Sum(L.QSLSent))) +\"/\"+' +
         'Trim(Str((Sum(L.QSLRec))+(Sum(L.LoTWRec))+(Sum(L.QSLReceQSLcc)))) ';
       // Формируем первые столбцы, после AS - то что будет в названии столбца
       FirstCols := 'SELECT D.AKey AS Country, D.Description, Count(*)
    As Total '
    ;
       // Выбираем данные по логу
       LogSelect := '(SELECT * FROM ' + LogTable + ') AS L ';
       // Выбираем данные по диплому
       DiplomSelect := '(SELECT * FROM [awards.mdb].Diplom AS Dpl WHERE Dpl.Awards = 1) AS D ';
       // Выбираем поля для группировки
       GroupFields := 'GROUP BY D.AKey, D.Description ';
       // Какие данные станут заголовком таблицы
       DataCols := 'PIVOT L.DigiBand IN (3.5,7,10,14,18,21,24,28)';
       // Условие объединения таблиц
       WhereData := 'L.DXCCPrefix = D.AKey ';
       // Итоговая строка запроса
       TotalStr := TotalStr + DataCells + FirstCols +
         // Объединяем данные диплома и лога.
         // В какой последовательности указывать названия объединения - значение в данном случае не имеет
         'FROM ' + LogSelect + ' RIGHT JOIN ' + DiplomSelect + 'ON ' +  WhereData +
         GroupFields + DataCols;
       SQL.Add(TotalStr);
       Active := True;
     end;
    end;



    Небольшие пояснения.
    LogTable - имя как раз основной базы, где хранятся связи.
    [awards.mdb].Diplom - таблица, где хранятся данные по статистике, которую мы хотим получить.
    На сейчас остался один момент - [awards.mdb] - это если база хранится в папке программы. А как прописать полный путь к файлу? По разному пробовал - выдает ошибку.
 
Конференция "Базы" » Создать запрос из списка значений полей [D7, Access]
Есть новые Нет новых   [134431   +10][b:0][p:0.002]