Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2009, 10:50   #11
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

гыгы
было у меня подозрение, что человек не понимает суть юзания параметров (ибо подсовывание параметров таким образом как показано в стартовом сообщении характерно для применения ХП и фунок - бывает такое когда кто-то из разработчиков загрузит из базы все параметры в дезигн-тайме и сохранит их в дфм и при добавлении новых параметров в процедуру/функу не получается увидеть добавленные параметры - но самый действенный способ - это вытаптывать параметры из дфм)

а теперь для тех кому лень вчитываться
чтобы параметры заработали в запросе нужно просто их прописать в тексте запроса
таким образом
Код:
   Query.Close();
    Query.SQL.Clear();
    Query.SQL.Add('select name,measure,quant_start_tail,sum_start_tail');
    Query.SQL.Add('from turnover ');
    Query.SQL.Add('where start_date >= :pstart_date');
    Query.SQL.Add('  and end_date < :pend_date + 1');
    Query.SQL.Add('order by name asc, measure asc;');
    
    Query.Parameters.ParamByName('pstart_date').Value:=DatePeriodStart.DateTime;    
    Query.Parameters.ParamByName('pend_date').Value:=DatePeriodEnd.DateTime;
    Query.Open();
и не забываем про бубны с указанием даты - дата обычно идет со временем - либо транкейтить, либо расширять границы отбора - в каждом конкретном случае свои способы

Последний раз редактировалось soleil@mmc; 28.08.2009 в 10:52.
soleil@mmc вне форума Ответить с цитированием
Старый 28.08.2009, 13:10   #12
reboot
 
Регистрация: 27.08.2009
Сообщений: 9
По умолчанию

спасибо, это частично помогло)) но всё же проблема ещё не решена((

насколько проще было использовать параметры в C#...

Код:
    Query.Close();
    Query.SQL.Clear();
    Query.Parameters.Clear();
    Query.Parameters.AddParameter();
    Query.Parameters[0].Name:='pstart_date';
    Query.Parameters.ParamByName('pstart_date').DataType:=ftDateTime;
    Query.Parameters.ParamByName('pstart_date').Value:=DatePeriodStart.DateTime;

    Query.Parameters.AddParameter();
    Query.Parameters[1].Name:='pend_date';
    Query.Parameters.ParamByName('pend_date').DataType:=ftDateTime;
    Query.Parameters.ParamByName('pend_date').Value:=DatePeriodEnd.DateTime;

    Query.SQL.Add('select name,measure,quant_start_tail,sum_start_tail from turnover');
    Query.SQL.Add('where start_date=:pstart_date and end_date=:pend_date order by name asc, measure asc;');
При этом у Query свойство ParamCheck=true.

Реакция на это: неправильно определён объект Parameter. Предоставлены несовместимые или неполные сведения.

Чего ещё не хватает этому объекту? Тип указан, значение указано, имя указано. Что опять не так?

Последний раз редактировалось reboot; 28.08.2009 в 13:16.
reboot вне форума Ответить с цитированием
Старый 28.08.2009, 13:29   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) СНАЧАЛА ТЕКСТ ЗАПРОСА.
Query.SQL.Add(.....

2) если я не ошибаюсь (проверять сейчас некогда, да и лениво), то после заполнения текста SQL СРАЗУ Parameters уже будут определены (самим компонентом ADOQuery), поэтому, скорее всего текст Query.Parameters.AddParameter - НЕ ПОНАДОБИТСЯ.
Оставьте только присвоение значения параметра.

НО ОБЯЗАТЕЛЬНО ПОСЛЕ ЗАПОЛНЕНИЯ ТЕКСТА ЗАПРОСА!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.08.2009, 13:43   #14
reboot
 
Регистрация: 27.08.2009
Сообщений: 9
По умолчанию

огромное спасибо что вы терпите меня так долго

но текст запроса до указания параметра приводит к "Слишком мало параметров. Требуется 2."

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

у меня есть 5 запросов в бд аксесса. один из них использует оставшиеся 4, в которых анализруются даты и принимаются параметры start_date и end_date. вот туда мне и нужно передать значения из формы.

а параметры, которые используются в дельфи, вообще не понимаю зачем нужны... вместо них я могу явно в SQL запросе присвоить значения, не заморачивая себе голову лишними и не совсем нужными познаниями.

всё ещё вопрос: как передать аксессу в запрос два параметра, которые он запрашивает?
reboot вне форума Ответить с цитированием
Старый 28.08.2009, 14:35   #15
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от reboot Посмотреть сообщение
у меня есть 5 запросов в бд аксесса. один из них использует оставшиеся 4, в которых анализруются даты и принимаются параметры start_date и end_date. вот туда мне и нужно передать значения из формы.
пример запроса в студию
soleil@mmc вне форума Ответить с цитированием
Старый 28.08.2009, 14:43   #16
reboot
 
Регистрация: 27.08.2009
Сообщений: 9
По умолчанию

Такого плана запросы вызываются внитри запроса turnover:

Код:
SELECT goods.id, count(moving_goods.id_good) AS quant_arrival, sum(moving_goods.price_arrival) AS sum_arrival
FROM moving_goods INNER JOIN goods ON moving_goods.id_good=goods.id
WHERE moving_goods.date_arrival>=start_date and moving_goods.date_arrival<=end_date
GROUP BY goods.id;
Вот этот turnover вызываю из делфи:

Код:
SELECT goods.name, goods.measure, turnover_start_tail.quant_start_tail, turnover_start_tail.sum_start_tail, turnover_arrival.quant_arrival, turnover_arrival.sum_arrival,
turnover_expense.quant_expense, turnover_expense.sum_expense, turnover_end_tail.quant_end_tail, turnover_end_tail.sum_end_tail
FROM (((goods LEFT JOIN turnover_start_tail ON goods.id=turnover_start_tail.id) LEFT JOIN turnover_arrival ON goods.id=turnover_arrival.id) LEFT JOIN turnover_expense ON
goods.id=turnover_expense.id) LEFT JOIN turnover_end_tail ON goods.id=turnover_end_tail.id;
параметры используются только в четырёх подчинённых запросах, в самом запросе turnover параметр нигде явно не указывается.

Последний раз редактировалось reboot; 28.08.2009 в 14:54.
reboot вне форума Ответить с цитированием
Старый 28.08.2009, 15:17   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну Вы и путаник! Вам же ясно написали...
запрос должен быть такой (сам запрос не трогаю, только параметры!)
Код:
SELECT goods.id, count(moving_goods.id_good) AS quant_arrival, sum(moving_goods.price_arrival) AS sum_arrival
FROM moving_goods INNER JOIN goods ON moving_goods.id_good=goods.id
WHERE moving_goods.date_arrival>=:pstart_date and moving_goods.date_arrival<=:pend_date
GROUP BY goods.id;
двоеточие ОБЯЗАТЕЛЬНО (это то, что и позволяет выделить параметры из остального текста запроса!)
а писать :start_date или :рstart_date — это Ваше дело.
но, если написали :start_date, тогда обращение к параметру по имени будет как
Query.Parameters.ParamByName('start _date')
и никак иначе!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.08.2009, 15:19   #18
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

и каким образом ты указываешь значения параметров в акссесе?

чота мне кажется, что в дельфи другая схема распознавания параметров: параметры - это все перед чем стоит двоеточие

а в твоем случае реализовано что-то по типу вьюхи с параметрами, которая потом юзается еще в нескольких местах
soleil@mmc вне форума Ответить с цитированием
Старый 28.08.2009, 15:44   #19
reboot
 
Регистрация: 27.08.2009
Сообщений: 9
По умолчанию

эти запросы написаны в accesse, и используются одним запросом, который вызывается из делфи. не думаю, что в аксессе стоит указывать параметры через двоеточие))

подобную задачу с идентичной реализацией я когда-то решил в C# следующим образом:

Код:
// передача параетров для запроса
command.Parameters.Add("@start_date",OleDbType.Date).Value=DateStart.Value;
command.Parameters.Add("@end_date",OleDbType.Date).Value=DateEnd.Value;

// вызов запроса
command.CommandText="select distinct name,weight,measure,price_arrival,price_expense,tails_start,\n";
command.CommandText+="arrival,write_off,return,realization,tails_end from maindata\n";
command.CommandText+="where start_date>=#"+start+" 00:00:00# and end_date<=#"+end+" 23:59:59#";
OleDbDataReader reader=command.ExecuteReader();
учитывая то, что библиотеки BCL почти сдёрты с VCL, в дельфи это должно работать тоже. но увы

вот аналогичная реализация на дальфи (параметры после запроса):

Код:
    Query.SQL.Add('select name,measure,quant_start_tail,sum_start_tail,quant_arrival,sum_arrival,quant_expense,sum_expense,quant_end_tail,sum_end_tail');
    Query.SQL.Add('from turnover where quant_start_tail is not null and sum_start_tail is not null and quant_arrival is not null and sum_arrival is not null');
    Query.SQL.Add('and quant_expense is not null and sum_expense is not null and quant_end_tail is not null and sum_end_tail is not null');
    Query.SQL.Add('and start_date=:start_date and end_date=:end_date order by name asc, measure asc;');

    Query.Parameters.AddParameter();
    Query.Parameters[0].Name:='start_date';
    Query.Parameters.ParamByName('start_date').DataType:=ftDateTime;
    Query.Parameters.ParamByName('start_date').Value:=DatePeriodStart.DateTime;

    Query.Parameters.AddParameter();
    Query.Parameters[1].Name:='end_date';
    Query.Parameters.ParamByName('end_date').DataType:=ftDateTime;
    Query.Parameters.ParamByName('end_date').Value:=DatePeriodEnd.DateTime;
Реакция на это:
Цитата:
Неправильно определён объект Parameter. Предоставлены несовместимые или неполные сведения.
Без AddParameter() не может определить start_date, то есть добавлять параметр нужно.

Последний раз редактировалось reboot; 28.08.2009 в 15:57.
reboot вне форума Ответить с цитированием
Старый 28.08.2009, 17:16   #20
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

а попробуй выполнить запрос
Код:
select * from turnover
и, например, до его выполнения вывести куда-нить в мемо список параметров
Код:
for i:=0 to  Query.Parameters.ParametersCount-1 do
  Memo1.Lines.add(Query.Parameters[i].Name);
просто интересно понять что оно там видит?
soleil@mmc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Параметрический запрос с логическим операторм Skolot Microsoft Office Access 8 10.03.2010 15:18
Преобразование SQL-запроса в Параметрический запрос oblachko БД в Delphi 3 05.06.2009 19:55
запрос ссылается на несвязанный с ним запрос kolebatel SQL, базы данных 0 11.06.2008 12:50
параметрический запрос с частью слова в качестве параметра yulia БД в Delphi 6 09.05.2008 20:27
Запрос Инночка БД в Delphi 1 01.05.2008 23:46