Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос к firebird из vs2008 
:(
    Опции темы
Toras
Дата 24.6.2011, 05:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.6.2011

Репутация: нет
Всего: нет



Предистория.
Есть база по энергоучету на firebird 2.0, нужно из этой базы выбрать значения потребления энергии за смену (с 8:30 по 20:30 и с 20:30 по 8:30) и вывести в виде графика на сайте. 
Пытаюсь сделать это в vs2008 через ODBC-драйвер. 
Запрос сделал в Dataset поместил, внимание вопрос:

 - Как передать в этот запрос параметры? В качестве параметров используются датавремя начала первой смены периода (период = месяцу) и датавремя окончания последней смены периода.

 - Либо как это сделать на vc и вывести график?

Это сообщение отредактировал(а) Toras - 24.6.2011, 06:13
PM MAIL   Вверх
Frees
Дата 24.6.2011, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 1
Всего: 54



проблема как написать такой запрос, или проблема только в передаче параметров?


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Toras
Дата 24.6.2011, 06:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.6.2011

Репутация: нет
Всего: нет



запрос написан криво, но с явным указанием периодов работает как надо, проблема как вместо явного указания передать параметры.
Код

SELECT     Date_Smena, Smena, SUM(Rashod) AS Rashod, A_DateTime, B_DateTime
FROM         (SELECT     Smena, ID_ADAPTER, 
                                              CASE WHEN ID_ADAPTER = 4 THEN Rashod * 60 WHEN ID_ADAPTER = 7 THEN Rashod * 40 WHEN ID_ADAPTER = 8 THEN Rashod * 60 WHEN
                                               ID_ADAPTER = 10 THEN Rashod * 40 END AS Rashod, A_Time, B_Time, Date_Smena, A_DateTime, B_DateTime
                       FROM          (SELECT     A.ID_PARAMETER, A.ID_DEVICE, A.ID_ADAPTER, B.MEASURE_VALUE - A.MEASURE_VALUE AS Rashod, 
                                                                      { fn CONVERT(A.RECORD_TIME, SQL_TYPE_DATE) } AS Date_Smena, CASE WHEN (A.A_Time - B.B_Time) 
                                                                      <= 0 THEN 'd' WHEN (A.A_Time - B.B_Time) > 0 THEN 'n' END AS Smena, A.A_Time, B.B_Time, A.RECORD_TIME AS A_DateTime,
                                                                       B.RECORD_TIME AS B_DateTime
                                               FROM          (SELECT     ID_RECORD, ID_PARAMETER, ID_DEVICE, ID_ADAPTER, PARAM_VALUE, MEASURE_VALUE, METHOD_TYPE, 
                                                                                              RECORD_TIME, { fn CONVERT(RECORD_TIME, SQL_TYPE_TIME) } AS A_Time
                                                                       FROM          (SELECT     FDB_DATA.ID_RECORD, FDB_DATA.ID_PARAMETER, FDB_DATA.ID_DEVICE, FDB_DATA.ID_ADAPTER, 
                                                                                                                      FDB_DATA.PARAM_VALUE, FDB_DATA.MEASURE_VALUE, FDB_RECORDS.METHOD_TYPE, 
                                                                                                                      FDB_RECORDS.RECORD_TIME
                                                                                               FROM          (SELECT     ID_RECORD, ID_PARAMETER, ID_DEVICE, ID_ADAPTER, PARAM_VALUE, 
                                                                                                                                              MEASURE_VALUE
                                                                                                                       FROM          FDB_DATA FDB_DATA_1) FDB_DATA,
                                                                                                                          (SELECT     ID_RECORD, ID_DEVICE, ID_ADAPTER, METHOD_TYPE, RECORD_TIME, STATUS, 
                                                                                                                                                   RECORD_INDEX, WINTER_SEASON
                                                                                                                            FROM          FDB_RECORDS FDB_RECORDS_1) FDB_RECORDS
                                                                                               WHERE      FDB_DATA.ID_RECORD = FDB_RECORDS.ID_RECORD AND ((FDB_DATA.ID_ADAPTER = 4) AND 
                                                                                                                      (FDB_DATA.ID_PARAMETER = 122) OR
                                                                                                                      (FDB_DATA.ID_ADAPTER = 7) AND (FDB_DATA.ID_PARAMETER = 248) OR
                                                                                                                      (FDB_DATA.ID_ADAPTER = 8) AND (FDB_DATA.ID_PARAMETER = 290) OR
                                                                                                                      (FDB_DATA.ID_ADAPTER = 10) AND (FDB_DATA.ID_PARAMETER = 374))) A_2
                                                                       WHERE      ({ fn CONVERT(RECORD_TIME, SQL_TYPE_TIME) } = '08:30:00' OR
                                                                                              { fn CONVERT(RECORD_TIME, SQL_TYPE_TIME) } = '20:30:00') AND (RECORD_TIME >= { fn CONVERT(?, 
                                                                                              SQL_TIMESTAMP) }) AND (RECORD_TIME <= { fn CONVERT(?, SQL_TIMESTAMP) })) A,
                                                                          (SELECT     ID_RECORD, ID_PARAMETER, ID_DEVICE, ID_ADAPTER, PARAM_VALUE, MEASURE_VALUE, METHOD_TYPE, 
                                                                                                   RECORD_TIME, { fn CONVERT(RECORD_TIME, SQL_TYPE_TIME) } AS B_Time
                                                                            FROM          (SELECT     FDB_DATA_2.ID_RECORD, FDB_DATA_2.ID_PARAMETER, FDB_DATA_2.ID_DEVICE, 
                                                                                                                           FDB_DATA_2.ID_ADAPTER, FDB_DATA_2.PARAM_VALUE, FDB_DATA_2.MEASURE_VALUE, 
                                                                                                                           FDB_RECORDS_2.METHOD_TYPE, FDB_RECORDS_2.RECORD_TIME
                                                                                                    FROM          (SELECT     ID_RECORD, ID_PARAMETER, ID_DEVICE, ID_ADAPTER, PARAM_VALUE, 
                                                                                                                                                   MEASURE_VALUE
                                                                                                                            FROM          FDB_DATA FDB_DATA_1) FDB_DATA_2,
                                                                                                                               (SELECT     ID_RECORD, ID_DEVICE, ID_ADAPTER, METHOD_TYPE, RECORD_TIME, STATUS, 
                                                                                                                                                        RECORD_INDEX, WINTER_SEASON
                                                                                                                                 FROM          FDB_RECORDS FDB_RECORDS_1) FDB_RECORDS_2
                                                                                                    WHERE      FDB_DATA_2.ID_RECORD = FDB_RECORDS_2.ID_RECORD AND ((FDB_DATA_2.ID_ADAPTER = 4) AND 
                                                                                                                           (FDB_DATA_2.ID_PARAMETER = 122) OR
                                                                                                                           (FDB_DATA_2.ID_ADAPTER = 7) AND (FDB_DATA_2.ID_PARAMETER = 248) OR
                                                                                                                           (FDB_DATA_2.ID_ADAPTER = 8) AND (FDB_DATA_2.ID_PARAMETER = 290) OR
                                                                                                                           (FDB_DATA_2.ID_ADAPTER = 10) AND (FDB_DATA_2.ID_PARAMETER = 374))) A_1
                                                                            WHERE      ({ fn CONVERT(RECORD_TIME, SQL_TYPE_TIME) } = '20:30:00' OR
                                                                                                   { fn CONVERT(RECORD_TIME, SQL_TYPE_TIME) } = '08:30:00') AND (RECORD_TIME >= { fn CONVERT(?, 
                                                                                                   SQL_TIMESTAMP) }) AND (RECORD_TIME <= { fn CONVERT(?, SQL_TIMESTAMP) })) B
                                               WHERE      A.ID_ADAPTER = B.ID_ADAPTER) C
                       WHERE      (B_DateTime - A_DateTime = 0.5)) D
GROUP BY Date_Smena, Smena, A_DateTime, B_DateTime
ORDER BY Date_Smena, Smena


я так понимаю, что параметры обозначаются символом "?", но если после "?" писать переменную, то при запуске выдает ошибку, если оставить так, то при тесте из конструктора в диалоге для параметров параметры вводятся и запрос работает, но в результате пусто. А при вызове уже из dataseta, после ввода параметров, выдает ошибку типа "не знаю функцию CONVERT"

PM MAIL   Вверх
Frees
Дата 24.6.2011, 07:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 1
Всего: 54



Может простым запросам выбрать все за нужный период, а делить на смены уже на клиентской стороне?

Цитата(Toras @  24.6.2011,  09:27 Найти цитируемый пост)
не знаю функцию CONVERT

а она точно есть?
возьми IB Expert и проверь свой запрос


Это сообщение отредактировал(а) Frees - 24.6.2011, 07:33


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Toras
Дата 24.6.2011, 07:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.6.2011

Репутация: нет
Всего: нет



Цитата(Frees @  24.6.2011,  10:33 Найти цитируемый пост)
Может простым запросам выбрать все за нужный период, а делить на смены уже на клиентской стороне?


Проблема не в делении на смены, а в указании начала и конца нужного периода параметрами.

Есть, с явно указанными параметрами работает.

Это сообщение отредактировал(а) Toras - 24.6.2011, 07:43
PM MAIL   Вверх
Akella
Дата 24.6.2011, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Цитата(Toras @  24.6.2011,  06:27 Найти цитируемый пост)
проблема как вместо явного указания передать параметры.

Цитата(Toras @  24.6.2011,  06:27 Найти цитируемый пост)
 WHERE      ({ fn CONVERT(RECORD_TIME, SQL_TYPE_TIME) } = '08:30:00' OR


Вот так:
Код
WHERE      ({ fn CONVERT(RECORD_TIME, SQL_TYPE_TIME) } = :dtStart OR


а вот уже в датасете (в Delphi так бы это выглядело)
Код
DataSet1.ParamByName('dtStart').asTime := StrTiTime('08:30:00');


PM MAIL   Вверх
Toras
Дата 24.6.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.6.2011

Репутация: нет
Всего: нет



Цитата(Akella @  24.6.2011,  11:52 Найти цитируемый пост)
а вот уже в датасете (в Delphi так бы это выглядело)

а в vs2008?
PM MAIL   Вверх
Akella
Дата 24.6.2011, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Ну и задавай вопрос в соответствующем разделе. Почему ты в разделе по FB задаёшь вопросы по С++?
PM MAIL   Вверх
Toras
Дата 29.6.2011, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 24.6.2011

Репутация: нет
Всего: нет



Не вели банить, Модератор-батюшко, но ветку по Visual Studio на форуме не нашел я. Подскажи куда лучше вопрос про нее задать?
PM MAIL   Вверх
Frees
Дата 29.6.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 1
Всего: 54



Цитата(Toras @  29.6.2011,  15:24 Найти цитируемый пост)
ветку по Visual Studio на форуме не нашел я.

http://forum.vingrad.ru/forum/s/ab518839f7...mp;showforum=97


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.