Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 15.11.2013, 20:53
govorun govorun вне форума
Новичок
 
Регистрация: 30.10.2013
Сообщения: 60
Версия Delphi: delphi 7
Репутация: 10
По умолчанию ADOQuery.SQL.Text

Кинул на форму ADOQuery, в String list editor написал
SELECT SUM(AAA) FROM BBB WHERE [CCC]=100
Подключчил - работает.

Пытаюсь добавить туда же еще две аналогичные строчки:
SELECT SUM(AAA) FROM BBB WHERE [CCC]=200
SELECT SUM(AAA) FROM BBB WHERE [CCC]=300

Вопрос: как разделить (чем) разделить эти три строки, чтобы запрос работал. Ставил в конце строк '+', ';' , еще чета пытался ставить - не работает.

Идея взята у "POLI-SMEN" в теме

http://www.delphisources.ru/forum/sh...ad.php?t=25317

Или в String list editor так делать нельзя?
Ответить с цитированием
  #2  
Старый 15.11.2013, 21:06
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Код:
select ...
union all
select ...

По идее правильно было бы так:
Код:
SELECT SUM(AAA) FROM BBB WHERE [CCC]=100 or [CCC]=200 or [CCC]=300
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 15.11.2013, 21:10
govorun govorun вне форума
Новичок
 
Регистрация: 30.10.2013
Сообщения: 60
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Код:
select ...
union all
select ...

По идее правильно было бы так:
Код:
SELECT SUM(AAA) FROM BBB WHERE [CCC]=100 or [CCC]=200 or [CCC]=300

Должны вычисляться 3 разных значения, которые потом размещу в 3 разных Editа. Информация будет отображаться на форме как статистика.
Ответить с цитированием
  #4  
Старый 15.11.2013, 21:41
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Вроде бы так можно.
Код:
select (SELECT SUM(AAA) FROM BBB WHERE [CCC]=100) as FOO, 
(SELECT SUM(AAA) FROM BBB WHERE [CCC]=200) as BAR,
(SELECT SUM(AAA) FROM BBB WHERE [CCC]=300) as BAZ from faketable
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 16.11.2013, 12:31
govorun govorun вне форума
Новичок
 
Регистрация: 30.10.2013
Сообщения: 60
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Помучался и сделел отдельные ADOQuery.
Возникла другая беда.
Результат запроса вывожу в Edit
Edit1.Text := FloatToStr(ADOQuery1.Fields[0].AsFloat);

Если вычисленное значение 15,54 то в Editе показывает 15,54
Если вычисленное число 15,00 то в Editе показывает 15 без нолей.
Как исправить, чтоб целое число показывалось с двумя нолями.

В базе (Access) свойство поля - с плавающей точкой
DispleyFormat и Editformat везде стоят ,0.00
Ответить с цитированием
  #6  
Старый 16.11.2013, 12:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от govorun
Помучался и сделел отдельные ADOQuery.
Почему в одном ADOQuery не получилось?
Цитата:
Сообщение от govorun
Возникла другая беда.
Результат запроса вывожу в Edit
Edit1.Text := FloatToStr(ADOQuery1.Fields[0].AsFloat);

Если вычисленное значение 15,54 то в Editе показывает 15,54
Если вычисленное число 15,00 то в Editе показывает 15 без нолей.
Как исправить, чтоб целое число показывалось с двумя нолями.
Либо при выводе в TEdit используй функции форматирования (Format, FloatToStrF), либо вместо TEdit используй TMaskEdit.
Цитата:
Сообщение от govorun
В базе (Access) свойство поля - с плавающей точкой
DispleyFormat и Editformat везде стоят ,0.00
Это форматирование говорит только о том как числа будут отображаться в самом Access'e. Само же число кроме собственно числа естественно не содержит никакого форматирования. Например если скопировать это число в Excel, то оно будет отображаться в том формате как указано в ячейке Excel, а не в Access. Если скопировать в калькулятор, то будет отображаться так, как принято в калькуляторе, а не в Access'е. Ну и т.д.
Ответить с цитированием
  #7  
Старый 16.11.2013, 13:21
govorun govorun вне форума
Новичок
 
Регистрация: 30.10.2013
Сообщения: 60
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Почему в одном ADOQuery не получилось?

Либо при выводе в TEdit используй функции форматирования (Format, FloatToStrF), либо вместо TEdit используй TMaskEdit.

Это форматирование говорит только о том как числа будут отображаться в самом Access'e. Само же число кроме собственно числа естественно не содержит никакого форматирования. Например если скопировать это число в Excel, то оно будет отображаться в том формате как указано в ячейке Excel, а не в Access. Если скопировать в калькулятор, то будет отображаться так, как принято в калькуляторе, а не в Access'е. Ну и т.д.

Писал выше - не смог разделить строки.
Пробую с TMaskEdit, тоже пока не получается маску установить
Ответить с цитированием
  #8  
Старый 16.11.2013, 13:45
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от govorun
Писал выше - не смог разделить строки.
Я же в другой теме уже писал как разделять строки:
PHP код:
SELECT
(SELECT SUM(Поле2FROM Таблица WHERE Поле1 100),
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 200),
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 300
Если же нужно не по столбцам, а по записям (т.е. не по горизонтали, а по вертикали), то используй UNION как здесь выше предлагал M.A.D.M.A.N.
Цитата:
Сообщение от govorun
Пробую с TMaskEdit, тоже пока не получается маску установить
Наверное в твоём случае TMaskEdit не сильно подойдёт. Делай через функции форматирования Format или FloatToStrF.
Ответить с цитированием
  #9  
Старый 16.11.2013, 13:59
govorun govorun вне форума
Новичок
 
Регистрация: 30.10.2013
Сообщения: 60
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Уже понял, пытаюсь разобраться с FloatToStrF

Написал вот так

Edit3.Text := FloatToStrf(ADOQuery3.Fields[0].AsFloat,ffNumber,12,2);

Вроде работает

Цитата:
Сообщение от poli-smen
Я же в другой теме уже писал как разделять строки:
PHP код:
SELECT
(SELECT SUM(Поле2FROM Таблица WHERE Поле1 100),
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 200),
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 300
Если же нужно не по столбцам, а по записям (т.е. не по горизонтали, а по вертикали), то используй UNION как здесь выше предлагал M.A.D.M.A.N.

Я писал в ADOQuery в String list editor вот это:
SELECT
(SELECT SUM(Поле2) FROM Таблица WHERE Поле1 = 100),
(SELECT SUM(Поле2) FROM Таблица WHERE Поле1 = 200),
(SELECT SUM(Поле2) FROM Таблица WHERE Поле1 = 300)

и получал ошибку вроде "нет входной таблицы" или синтаксис или еще чего...
Идея мне очень понравилась, но реализовать ее цивилизованным способом я не смог. (ТЕМА ДЛЯ НАЧИНАЮЩИХ). Как говорится если не можеш перелезть через забор попробуй его обойди или сделай подкоп
Может я не то и не туда писал?

Последний раз редактировалось M.A.D.M.A.N., 16.11.2013 в 18:32.
Ответить с цитированием
  #10  
Старый 16.11.2013, 14:43
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от govorun
Я писал в ADOQuery в String list editor вот это:
SELECT
(SELECT SUM(Поле2) FROM Таблица WHERE Поле1 = 100),
(SELECT SUM(Поле2) FROM Таблица WHERE Поле1 = 200),
(SELECT SUM(Поле2) FROM Таблица WHERE Поле1 = 300)

и получал ошибку вроде "нет входной таблицы" или синтаксис или еще чего...
Идея мне очень понравилась, но реализовать ее цивилизованным способом я не смог. (ТЕМА ДЛЯ НАЧИНАЮЩИХ). Как говорится если не можеш перелезть через забор попробуй его обойди или сделай подкоп
Может я не то и не туда писал?
Этот запрос я проверял на MS SQL Server'е - он нормально работал. Сейчас попробовал в Access'е - не работает.
M.A.D.M.A.N. оказался прав - Access зачем-то требует явного указания какой-либо "левой" таблицы для этого запроса, да ещё и выводит одинаковых записей в количестве равном как у этой "левой" таблицы.
Вобщем вот так должно работать (для непустой таблицы):
PHP код:
SELECT TOP 1
(SELECT SUM(Поле2FROM Таблица WHERE Поле1 100),
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 200),
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 300FROM Таблица 
Ответить с цитированием
  #11  
Старый 16.11.2013, 15:11
govorun govorun вне форума
Новичок
 
Регистрация: 30.10.2013
Сообщения: 60
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Этот запрос я проверял на MS SQL Server'е - он нормально работал. Сейчас попробовал в Access'е - не работает.
M.A.D.M.A.N. оказался прав - Access зачем-то требует явного указания какой-либо "левой" таблицы для этого запроса, да ещё и выводит одинаковых записей в количестве равном как у этой "левой" таблицы.
Вобщем вот так должно работать (для непустой таблицы):
PHP код:
SELECT TOP 1
(SELECT SUM(Поле2FROM Таблица WHERE Поле1 100),
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 200),
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 300FROM Таблица 

А это останется в силе?
Edit3.Text := FloatToStrf(ADOQuery3.Fields[0].AsFloat,ffNumber,12,2);
Edit3.Text := FloatToStrf(ADOQuery3.Fields[1].AsFloat,ffNumber,12,2);
Edit3.Text := FloatToStrf(ADOQuery3.Fields[2].AsFloat,ffNumber,12,2);
я имею ввиду 0, 1, 2 (это номера строк ?)
Ответить с цитированием
  #12  
Старый 16.11.2013, 15:49
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от govorun
А это останется в силе?
Edit3.Text := FloatToStrf(ADOQuery3.Fields[0].AsFloat,ffNumber,12,2);
Edit3.Text := FloatToStrf(ADOQuery3.Fields[1].AsFloat,ffNumber,12,2);
Edit3.Text := FloatToStrf(ADOQuery3.Fields[2].AsFloat,ffNumber,12,2);
я имею ввиду 0, 1, 2 (это номера строк ?)
Нет. Это номера полей (т.е. колонок).
Вообще не все провайдеры гарантируют, что в результате вернутся поля в том порядке в котором были перечислены в запросе, поэтому для надёжности лучше их именовать прямо в запросе и потом обращаться к ним по именам.

Пример запроса:
PHP код:
SELECT TOP 1
(SELECT SUM(Поле2) AS Sum100 FROM Таблица WHERE Поле1 100),
(
SELECT SUM(Поле2) AS Sum200 FROM Таблица WHERE Поле1 200),
(
SELECT SUM(Поле2) AS Sum300 FROM Таблица WHERE Поле1 300FROM Таблица 
И потом в программе:
Код:
Edit1.Text := FloatToStrF(ADOQuery3.FieldByName('Sum100').AsFloat, ffNumber, 12, 2);
Edit2.Text := FloatToStrF(ADOQuery3.FieldByName('Sum200').AsFloat, ffNumber, 12, 2);
Edit3.Text := FloatToStrF(ADOQuery3.FieldByName('Sum300').AsFloat, ffNumber, 12, 2);
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
govorun (16.11.2013)
  #13  
Старый 16.11.2013, 19:32
govorun govorun вне форума
Новичок
 
Регистрация: 30.10.2013
Сообщения: 60
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Нет. Это номера полей (т.е. колонок).

Пример запроса:
PHP код:
SELECT TOP 1
(SELECT SUM(Поле2) AS Sum100 FROM Таблица WHERE Поле1 100),
(
SELECT SUM(Поле2) AS Sum200 FROM Таблица WHERE Поле1 200),
(
SELECT SUM(Поле2) AS Sum300 FROM Таблица WHERE Поле1 300FROM Таблица 
И потом в программе:
Код:
Edit1.Text := FloatToStrF(ADOQuery3.FieldByName('Sum100').AsFloat, ffNumber, 12, 2);
Edit2.Text := FloatToStrF(ADOQuery3.FieldByName('Sum200').AsFloat, ffNumber, 12, 2);
Edit3.Text := FloatToStrF(ADOQuery3.FieldByName('Sum300').AsFloat, ffNumber, 12, 2);

Попробовал, компилируется. Но при попытке программы обратиться к форме, на которой это дело размещено, пишет, что поле 'SUM100' не найдено. И я почему-то согласен с программой. Возможно этот способ хорош когда расчетные данные заносятся в какую-то таблицу с полями типа 'SUM100'. У меня данные просто расчитываются и показываются при обращении к форме.
Идея хорошая. Но, пока строю забор из ADOQuery.
Ответить с цитированием
  #14  
Старый 16.11.2013, 19:42
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от govorun
Попробовал, компилируется. Но при попытке программы обратиться к форме, на которой это дело размещено, пишет, что поле 'SUM100' не найдено.
Тьфуты. Это просто я не в том месте поставил именования полей.
Вот правильный запрос:
PHP код:
SELECT TOP 1 
(SELECT SUM(Поле2FROM Таблица WHERE Поле1 100) AS Sum100,
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 200) AS Sum200,
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 300) AS Sum300 FROM Таблица 
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
govorun (16.11.2013)
  #15  
Старый 16.11.2013, 20:13
govorun govorun вне форума
Новичок
 
Регистрация: 30.10.2013
Сообщения: 60
Версия Delphi: delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Тьфуты. Это просто я не в том месте поставил именования полей.
Вот правильный запрос:
PHP код:
SELECT TOP 1 
(SELECT SUM(Поле2FROM Таблица WHERE Поле1 100) AS Sum100,
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 200) AS Sum200,
(
SELECT SUM(Поле2FROM Таблица WHERE Поле1 300) AS Sum300 FROM Таблица 

Ну вот, совсем другое дело....
Почет и уважуха....
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 23:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter