19.07.2019, 04:00 [+3 UTC]
в нашей команде: 3 748 чел. | участники онлайн: 0 (рекорд: 21)

:: РЕГИСТРАЦИЯ

задать вопрос

все разделы

правила

новости

участники

доска почёта

форум

блоги

поиск

статистика

наш журнал

наши встречи

наша галерея

отзывы о нас

поддержка

руководство

Версия системы:
7.77 (31.05.2019)
JS-v.1.34 | CSS-v.3.35

Общие новости:
28.04.2019, 09:13

Форум:
18.07.2019, 12:26

Последний вопрос:
19.07.2019, 02:41
Всего: 149939

Последний ответ:
18.07.2019, 12:04
Всего: 258705

Последняя рассылка:
17.07.2019, 22:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
19.09.2011, 12:02 »
Юрий
Уже несколько лет получаю Вашу рассылку. Много раз Ваши советы приносили мне пользу. И хотя у меня давно не Siemens, а Samsung GT-S5233T, я и сейчас нажожу для себя много полезного. Спасибо.
20.12.2015, 21:47 »
nal_0786
Вот это дааа. спасибо огромное!!!! прям не ожидал что это возможно решить!!!! ОГРОМНОЕ СПАСИБО!!!! [вопрос № 188463, ответ № 273092]
17.03.2010, 04:12 »
Спиридонов Данил Сергеевич
Просто и понятно. [вопрос № 177203, ответ № 260151]

РАЗДЕЛ • Pascal / Delphi / Lazarus

Создание программ на языках Pascal, Delphi и Lazarus.

[администратор рассылки: Зенченко Константин Николаевич (Старший модератор)]

Лучшие эксперты в этом разделе

Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 196
puporev
Статус: Профессионал
Рейтинг: 119
Асмик Гаряка
Статус: Советник
Рейтинг: 0

Перейти к консультации №:
 

Консультация онлайн # 143280
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: Maximus777
Отправлена: 07.09.2008, 17:20
Поступило ответов: 1

Уважаемые эксперты!
Помогите примером. Есть база db1.mdb, в ней Table1. Мне надо при помощи цикла втиснуть в таблицу столбцов, чтобы один столбец - один день календаря. В итоге 365 столбцов. Всяко пробовал, неполучается. Надо что-то типа кода в приложении. Но этот вариант не работает. Поправьте плиз.

Приложение:

Состояние: Консультация закрыта

Ответ # 228733 от Олекса aka SoW

Здравствуйте, 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. Таким образом, Вы не сможете создать отдельный столбец на каждый день года.


Консультировал: Олекса aka SoW
Дата отправки: 07.09.2008, 18:02

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 143280
Виктор Пырлик

# 1

= общий = | 07.09.2008, 20:19

365 столбцов в никаком формате делать не надо. Вы просто не разобрались что такое реляционная база данных.
Ужос, когда столбцов, например 20.. А вы говорите о 365..
Скажите что вы хотите сделать, и возможно вам будет предложено нормальное решение.

неизвестный

# 2

= общий = | 07.09.2008, 21:06

Действительно, я пока смутно понимаю что к чему в области БД. Но у меня есть исходники для работы с *.mdb, которая связана с DBGrid, в котором как раз около 20 столбцов. Поэтому я и решил просто модифицировать малость этот проект и сделать то что от меня требовалось. А задача заключается в следующем, есть медучереждение, в котором пытаются вести учёт медикаментов, при этом список препаратов (пока из 200 пунктов) должен быть резиновый, т.е. с добавлением новых, ну и идея 365 столбцов это для того чтобы каждый препарат можно было отметить как количество отпущенного в данный день. Можно конечно запоминать только дату и количество, но тогда усложняется поиск реализованного за определённый период. На крайний случай сделаю 12 таблиц (типа по месяцам), но т.к. раньше я это делал в Excell (помесячно), а теперь появилось условие делать это на год, то пришлось смотреть в сторону БД, я никак не думал что у mdb такие же ограничения. Вот такая ситуёвина.

Виктор Пырлик

# 3

= общий = | 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 - в базе данных гораздо все проще и намного больше возможностей. smile

неизвестный

# 4

= общий = | 08.09.2008, 10:39

Спасибо за урок. Если я правильно понял, то при отпуске скажем 50 лекарств в один день у меня появятся 50 строк в первой таблице, с одной и той же датой? И ещё, а как работает связь этих двух таблиц? Т.е. найдя в первой табле какой-то ID мы ищем соответствующее ему название во второй? Блин, очень не просто перестроить мозги после Excell'я.

Виктор Пырлик

# 5

= общий = | 08.09.2008, 14:33

Да, 50 строк с одной датой, хотя и не факт.. можно организовать так, что будут суммироваться одинаковые лекарства, тогда, записей будет не 50 а равное количеству разных лекарств, и для каждого лекарства будет сума.. Но это уже логика. Обычно так и есть – 50 записей.. Если нужна сумма/количество – то просто count (distinct лекарство) или сгруппировать.. В общем – читать надо SQL..
А связь.. просто, в Access откройте схему, добавьте таблицы и перетащите от дочерней к родительской поле по которому идет ключевание..

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

URL >> Вот очень маленький пример

неизвестный

# 6

= общий = | 08.09.2008, 15:53

Огромное спасибо за пример. Сам бы я точно не додумался до такого. Я схему то не сразу нашёл. Я запрос в виде текста вообще не понял как сделать. Вывернулся Импортом из вашего примера. Там маленькая ошибка, при запросе за месяц поиск в году, но это уже мелочи. Теперь бы сообразить как это всё в дельфях увязать ...

Виктор Пырлик

# 7

= общий = | 08.09.2008, 17:19

smile там нет ошибки.. Дело в том, что в каждом году имеется 12 одинаковых месяцев.. И если мы просто сделаем выборку по месяцам - то просто получим для всех годов.. Вот потому и надо точно определить год для которого нужны данные..
Текстовый запрос - ну дак это просто текстовый.. Но есть отличный конструктор - просто откройте запрос конструктором.. Не помню точно как называется, но что-то типа "изменить"..
А лучше, купите книжку по акцесу.. без книги вами никуда smile

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

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

Вадим Исаев ака sir Henry
Мастер-Эксперт

ID: 425

# 8

= общий = | 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

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

# 9

= общий = | 09.09.2008, 12:47

Спасибо за яркие примеры. Представляю сколько интересного меня ждёт впереди. Буду исследовать область под названием БД Firebird. По запросу да, действительно всё правильно. Я просто подумал раз запрос "Отчёт за месяц" то и вводить надо число месяца, поэтому мне ничего не выдавало. По остальным запросам всё предельно ясно. Один маааленький вопросец остался, раз там всё так чётко расчитывается, то наверняка можно и период задать (к примеру за неделю или за пять дней)?

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Вадим Исаев ака sir Henry
Мастер-Эксперт

ID: 425

# 10

= общий = | 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-запросом.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

# 11

= общий = | 09.09.2008, 13:42

Благодарствую. Всё, больше вопросов нет. Сохраняю данную страничку как удобный хелп.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.16281 сек.

© 2001-2019, Портал RFPRO.RU, Россия
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.77 от 31.05.2019
Версия JS: 1.34 | Версия CSS: 3.35