Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL: Parameter not found [D6, 2000, XP]


Fostr ©   (2006-10-12 12:41:00) 

Хелп! Есть запрос в котором несколько параметров, создающихся динамически. При выполнении запроса выплывает ошибка "PARAMETER 'P0' NOT FOUND". Прошу подсказать из-за чего (см. код ниже).

      SetLength(A_SET,DataModule1.FindByQuery1.RecordCount); //Задается длина динамического массива
      ForK:=0 TODataModule1.FindByQuery1.RecordCount-1 DO
          A_SET[K]:=DataModule1.FindByQuery1.Fields[1].AsString;//Здесь значения в виде динамического массива, которые в дальнейшем присваиваются параметрам

{Пишу запрос - не говорите, что надо SQL.Text='', мне тут это не подходит}
      DataModule1.FindByQuery2.Active:=False;
      DataModule1.FindByQuery2.SQL.Clear;
      DataModule1.FindByQuery2.SQL.Add('SELECT *');
      DataModule1.FindByQuery2.SQL.Add('FROM MainTable');
      DataModule1.FindByQuery2.SQL.Add('WHERE');
          ForK:=0 TOLength(A_SET)-1 DO
              DataModule1.FindByQuery2.SQL.Add('Key1 LIKE: P'+IntToStr(K)+',');  //Вношу в запрос параметры

          ForK:=0 TOLength(A_SET)-1 DO
              DataModule1.FindByQuery2.Parameters.ParamByName('P'+IntToStr(K)+'').Value:=A_SET[K];  //Задаю значения параметрам ТУТ И ВЫДАЕТСЯ ОШИБКА!!!
Заранее спасибо за любую подсказку.


ЮЮ   (2006-10-16 03:07:00) [1]

Ввиду закрытия
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1160770982&n=18
отвечу здесь.

Необходимо выбрать из второй таблицы только людей из проекта 564,
Как видишь, параметр здесь только один. Просто запрос надо правильно писать:

SELECT *
FROM Perons
WHERE Key IN (SELECT LinkKey FROM ProjectPersons WHERE ProjectKey = :ProjectKey)

или

SELECT p.*
FROM
 ProjectPersons pp  
 JOIN Perons p ON pp.LinkKey = p.Key
WHERE
 pp.ProjectKey = :ProjectKey


MsGuns   (2006-10-12 16:16:00) [2]

>Sergey13 ©   (12.10.06 15:25) [11]
>Ты смайлик забыл поставить. 8-)

Не забыл. Ты и представить не можешь насколько тут все серьезно


MsGuns   (2006-10-12 15:43:00) [3]

Ну, не по "ф1", но есть.
Help->Delphi Tools->Local SQL


Sergey13   (2006-10-12 15:43:00) [4]

> [12] Fostr   (12.10.06 15:40)

Если это BDE, то ищи файд LocalSQL.hlp


Fostr   (2006-10-12 15:40:00) [5]

Друзья, а ну-ка скажите, где это в Delphi по "фэ1" есть help по синтаксису SQL?
Я стараюсь про эту заветную кнопочку не забывать, если я что-то там пропустил, то пардон.


Sergey13   (2006-10-12 15:25:00) [6]

> [8] MsGuns ©   (12.10.06 15:19)

Ты смайлик забыл поставить. 8-)

> [9] Fostr   (12.10.06 15:20)
Слушай, ну Ф1 то нажми хоть раз ради разнообразия.


MsGuns   (2006-10-12 15:23:00) [7]

>Fostr   (12.10.06 15:20) [9]
>Как правильно?

BOL->Index->Select->Where||Join


Fostr   (2006-10-12 15:20:00) [8]

> Sergey13 ©   (12.10.06 15:11) [7]
> Т.е. задача сделать это именно через массив, который тут не нужен?
> Не верю! (с)
И правильно! Теперь знаю, что это можно сделать иначе.

>Сомневаюсь, хоть и не знаком с Аксесом. В запятой нет логики, а тут нужно именно логическое условие.

Как правильно?


MsGuns   (2006-10-12 15:19:00) [9]

>Sergey13 ©   (12.10.06 15:11) [7]
>Сомневаюсь, хоть и не знаком с Аксесом

Мелкомягкие недавно запатентовали новый секретный диалект T-SQL, в котором при перечислении условий в предикатах Where и Join разрешается использовать вместо OR, NOT и AND символа ",". Специальный встроенный реверпарсер разбирает всю эту тарабарщину, правильно вычисляя чего же все-таки хочет клиент.
Сделано для шифровки запросов секретными агентами. Бают, что сделано по личному заказу лидера "Хазболлы".


Sergey13   (2006-10-12 15:11:00) [10]

> [5] Fostr   (12.10.06 14:50)
> У!!! Если я сейчас начно говорить зачем перегонять записи
> первого Query в массив - это может надолго затянуться и
> запутать. Поверьте, стоит такая задача, и я ее выполняю.

Т.е. задача сделать это именно через массив, который тут не нужен?
Не верю! (с)

> Access (у мне именно эта база) врооде позволяет так делать.
Сомневаюсь, хоть и не знаком с Аксесом. В запятой нет логики, а тут нужно именно логическое условие.


MsGuns   (2006-10-12 14:58:00) [11]

Для "перегонки" параметров из "кверика" в "кверик" достаточно скопировать сиквель, а потом через Parametes нового "кверика" в цикле присвоить им  значения старого, изменив "нужные" как надо.


Fostr   (2006-10-12 14:50:00) [12]

У!!! Если я сейчас начно говорить зачем перегонять записи первого Query в массив - это может надолго затянуться и запутать. Поверьте, стоит такая задача, и я ее выполняю.
А вот насчет условия WHERE:
На самом деле мне надо во втором Query выбрать те записи, в которых значения некоторого поля соответствуют значениям перечисляемых через запятую в условии WHERE параметров.  Если я ошибаюсь в синтаксисе, то прошу указать как правильно сделать! Access (у мне именно эта база) врооде позволяет так делать.


Sergey13   (2006-10-12 13:17:00) [13]

> [0] Fostr   (12.10.06 12:41)

И зачем записи первого кверика перегонять в массив?


Desdechado   (2006-10-12 13:13:00) [14]

хм, условия WHERE через запятую?
это где такой синтаксис?


Fostr   (2006-10-12 12:50:00) [15]

Ну конечно же!!! Спасибо! Одна голова хорошо (одни глаза), а несколько -  лучше! В упор не видел!


Рамиль   (2006-10-12 12:45:00) [16]


> ('Key1 LIKE: P'+IntToStr(K)+','

('Key1 LIKE :P'+IntToStr(K)+','


Наверх

Титульная страница Поиск, карта сайта Написать письмо