Консультация № 143280
07.09.2008, 17:20
0.00 руб.
0 12 1
Уважаемые эксперты!
Помогите примером. Есть база db1.mdb, в ней Table1. Мне надо при помощи цикла втиснуть в таблицу столбцов, чтобы один столбец - один день календаря. В итоге 365 столбцов. Всяко пробовал, неполучается. Надо что-то типа кода в приложении. Но этот вариант не работает. Поправьте плиз.

Приложение:
d:=EncodeDate(2008,1,1);
BookName.Edit;
for i := 1 to 365 do
begin
n:=IntToStr(DayOf(d))+'m'+IntToStr(MonthOf(d));
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('alter table Table1 add column '+n+' integer');
ADOQuery1.ExecSQL;
d:=d+1;
end;
BookName.Post;

Обсуждение

Неизвестный
07.09.2008, 18:02
общий
это ответ
Здравствуйте, Maximus777!
Здравствуйте, Maximus777!

К сожалению Вы подробно не описали что именно не удается Вам сделать.

Если проанализировать код программы, то есть ошибка в строке: »ADOQuery1.SQL.Add('alter table Table1 add column '+n+' integer');»
Нужно написать «ADOQuery1.SQL.Add('alter table Table1 add '+n+' integer');» (без слова «column»)


Кроме того, если Вы используете Microsoft Access то у нее есть ограничение на количество столбцов – где-то около 250. Таким образом, Вы не сможете создать отдельный столбец на каждый день года.
Неизвестный
07.09.2008, 20:19
общий
365 столбцов в никаком формате делать не надо. Вы просто не разобрались что такое реляционная база данных.
Ужос, когда столбцов, например 20.. А вы говорите о 365..
Скажите что вы хотите сделать, и возможно вам будет предложено нормальное решение.
Неизвестный
07.09.2008, 21:06
общий
Действительно, я пока смутно понимаю что к чему в области БД. Но у меня есть исходники для работы с *.mdb, которая связана с DBGrid, в котором как раз около 20 столбцов. Поэтому я и решил просто модифицировать малость этот проект и сделать то что от меня требовалось. А задача заключается в следующем, есть медучереждение, в котором пытаются вести учёт медикаментов, при этом список препаратов (пока из 200 пунктов) должен быть резиновый, т.е. с добавлением новых, ну и идея 365 столбцов это для того чтобы каждый препарат можно было отметить как количество отпущенного в данный день. Можно конечно запоминать только дату и количество, но тогда усложняется поиск реализованного за определённый период. На крайний случай сделаю 12 таблиц (типа по месяцам), но т.к. раньше я это делал в Excell (помесячно), а теперь появилось условие делать это на год, то пришлось смотреть в сторону БД, я никак не думал что у mdb такие же ограничения. Вот такая ситуёвина.
Неизвестный
07.09.2008, 21:45
общий
во первых, смотрите на данные как на строки а не столбцы..
т.е. на прнимер:
1 таблица - дата (день.месяц.год) id_лекарства количество
2 таблица - id_лекарства название_лекарства другие поля (столбцы) которые описывают одно лекарство

id_лекарство - это уникальный ключ, автоинкрементный (счётчик), он будет однозначно указывать на конкретное лекарство. Таким образом, количество лекарств в принципе не ограничено - все они будут в одной таблице в виде строк.

1-я таблица связана со 2-й по ключу id_лекарство, таким образом, можно изо дня в день, неограниченное количество добовлять сколько отпушено и чего..
Поиск простейший: SELECT * FROM ТАБЛИЦА1 WHERE DATA > '31.12.2007' - вернет все за 2008 год..
Почитайте о базах данных и в частности SQL - это очень гибкий язык запросов.
Как видите, всего 3 столбца в одной таблице и ещё пару в другой..

В отличие от Excel - в базе данных гораздо все проще и намного больше возможностей.
Неизвестный
08.09.2008, 10:39
общий
Спасибо за урок. Если я правильно понял, то при отпуске скажем 50 лекарств в один день у меня появятся 50 строк в первой таблице, с одной и той же датой? И ещё, а как работает связь этих двух таблиц? Т.е. найдя в первой табле какой-то ID мы ищем соответствующее ему название во второй? Блин, очень не просто перестроить мозги после Excell'я.
Неизвестный
08.09.2008, 14:33
общий
Да, 50 строк с одной датой, хотя и не факт.. можно организовать так, что будут суммироваться одинаковые лекарства, тогда, записей будет не 50 а равное количеству разных лекарств, и для каждого лекарства будет сума.. Но это уже логика. Обычно так и есть – 50 записей.. Если нужна сумма/количество – то просто count (distinct лекарство) или сгруппировать.. В общем – читать надо SQL..
А связь.. просто, в Access откройте схему, добавьте таблицы и перетащите от дочерней к родительской поле по которому идет ключевание..

В Delphi это просто, назначить MasterSource и всё. :)

URL >> Вот очень маленький пример
Неизвестный
08.09.2008, 15:53
общий
Огромное спасибо за пример. Сам бы я точно не додумался до такого. Я схему то не сразу нашёл. Я запрос в виде текста вообще не понял как сделать. Вывернулся Импортом из вашего примера. Там маленькая ошибка, при запросе за месяц поиск в году, но это уже мелочи. Теперь бы сообразить как это всё в дельфях увязать ...
Неизвестный
08.09.2008, 17:19
общий
там нет ошибки.. Дело в том, что в каждом году имеется 12 одинаковых месяцев.. И если мы просто сделаем выборку по месяцам - то просто получим для всех годов.. Вот потому и надо точно определить год для которого нужны данные..
Текстовый запрос - ну дак это просто текстовый.. Но есть отличный конструктор - просто откройте запрос конструктором.. Не помню точно как называется, но что-то типа "изменить"..
А лучше, купите книжку по акцесу.. без книги вами никуда

И, лучше еще по базам данных вообще. И для Delphi - что-то типа "разработка баз данных в Delphi"..

PS: рекомендую использовать БД - Firebird.. Вы только начинаете, так начинайте с нормальных вещей..
URL >>Название: Firebird: руководство разработчика баз данных : Хелен Борри
URL >> Книги Delphi

давно
Мастер-Эксперт
425
4118
09.09.2008, 11:29
общий
Maximus777
Обычно связи между таблицами, которые для просмотра, делают прямо в запросе, например:
Код:
SELECT таблица2.название_лекарства, таблица1.количество
FROM таблица2 INNER JOIN таблица1 ON таблица2.id_лекарства=таблица1.id_лекарства
ORDER BY таблица1.дата, таблица2.название_лекарства

даст Вам полный список названий лекарств проданых за всё время ведения таблицы с сортировкой по дате продаже и внутри её - по названию лекарств.
Ключевые слова INNER JOIN образуют связь между двумя таблицами, а ключевое слово ON указывает, между какими полями связь.
Если нужно вывести список продаж за определённую дату, то добавляем условие к запросу:
Код:
SELECT таблица2.название_лекарства, таблица1.количество
FROM таблица2 INNER JOIN таблица1 ON таблица2.id_лекарства=таблица1.id_лекарства
WHERE таблица1.дата=#01.01.2008#
ORDER BY таблица2.название_лекарства

выведет список лекарств проданных первого января 2008 года отсортированный по наименованию.
Чтобы получить общий список проданных лекарств с количеством по каждому наименованию, вводят дополнительную операцию - группировку:
Код:
SELECT таблица2.название_лекарства, SUM(таблица1.количество)
FROM таблица2 INNER JOIN таблица1 ON таблица2.id_лекарства=таблица1.id_лекарства
GROUP BY таблица2.название_лекарства
ORDER BY таблица2.название_лекарства

теперь в полученом списке названий каждого лекарства будет по одному, а в столбце "количество" будет указано общее кол-во проданного лекарства именно по этому названию. В запрос добавлена оперция группировки - GROUP BY и функция суммирования столбца "Количество" - SUM(таблица1.количество).
Вообще общее количество проданных лекарств можно узнать так:
Код:
SELECT SUM(количество) FROM таблица1
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
09.09.2008, 12:47
общий
Спасибо за яркие примеры. Представляю сколько интересного меня ждёт впереди. Буду исследовать область под названием БД Firebird. По запросу да, действительно всё правильно. Я просто подумал раз запрос "Отчёт за месяц" то и вводить надо число месяца, поэтому мне ничего не выдавало. По остальным запросам всё предельно ясно. Один маааленький вопросец остался, раз там всё так чётко расчитывается, то наверняка можно и период задать (к примеру за неделю или за пять дней)?
давно
Мастер-Эксперт
425
4118
09.09.2008, 13:30
общий
Период будет что-то вроде этого:
Код:
SELECT таблица2.название_лекарства, SUM(таблица1.количество)
FROM таблица2 INNER JOIN таблица1 ON таблица2.id_лекарства=таблица1.id_лекарства
WHERE таблица1.дата BETWEEN #01.01.2007# AND #01.02.2007#
GROUP BY таблица2.название_лекарства
ORDER BY таблица2.название_лекарства

В условии ключевой слово BETWEEN задаёт участок значений между начальным и конечным. В данном случае от 1 января по 1 февраля 2007 года включая и эти даты.
Вообще, практически любое чётко сформулированное и непротиворечивое условие можно выразить SQL-запросом.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
09.09.2008, 13:42
общий
Благодарствую. Всё, больше вопросов нет. Сохраняю данную страничку как удобный хелп.
Форма ответа