Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Множественное использование параметров, ADO + MSAccess 
V
    Опции темы
Keeper89
Дата 4.5.2009, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Доброго времени суток!

Пишу следующий запрос:
Код

    with SQL do
    begin
      Clear;
      Add('SELECT Заказы.Код, Заказы.Заказчик, Заказы.Начало_работы,');
      Add('       Заказы.Конец_работы, Заказы.День_с, Заказы.День_до');
      Add('FROM Заказы INNER JOIN [Заказы-Сотрудники] ');
      Add('     ON Заказы.Код=[Заказы-Сотрудники].Код_заказа');
      Add('WHERE ([Заказы-Сотрудники].Код_сотрудника = :SotrID) AND');
      Add('      ((Заказы.Начало_работы BETWEEN :dateStart AND :dateEnd) OR');
      Add('        (Заказы.Конец_работы BETWEEN :dateStart AND :dateEnd) OR');
      Add('       ((Заказы.Начало_работы <= :dateStart) AND');
      Add('         (Заказы.Конец_работы >= :dateEnd)))');
    end;

    Parameters.ParseSQL(SQL.Text, True);
    Parameters.ParamByName('SotrID').Value := SotrID; // String
    Parameters.ParamByName('dateStart').Value := dateStart; // TDate
    Parameters.ParamByName('dateEnd').Value := dateEnd; // TDate
    Open;


При этом при выполнении запроса происходит ошибка:
Код

Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения.

Если оставить только одно условие (например, строку 8), все работает отлично.

В чем может быть проблема?

Спасибо.

Это сообщение отредактировал(а) Keeper89 - 4.5.2009, 13:59


--------------------
PM MAIL WWW   Вверх
Keeper89
Дата 4.5.2009, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Плюс к вышесказанному, в Access этот запрос работает отлично.


--------------------
PM MAIL WWW   Вверх
Rodman
Дата 4.5.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



Код

with SQL do
    begin
      Clear;
      Add('SELECT Заказы.Код, Заказы.Заказчик, Заказы.Начало_работы,');
      Add('       Заказы.Конец_работы, Заказы.День_с, Заказы.День_до');
      Add('FROM Заказы INNER JOIN [Заказы-Сотрудники] ');
      Add('     ON Заказы.Код=[Заказы-Сотрудники].Код_заказа');
      Add('WHERE ([Заказы-Сотрудники].Код_сотрудника = :SotrID) AND');
      Add('      ((Заказы.Начало_работы BETWEEN :dateStart AND :dateEnd) OR');
      Add('        (Заказы.Конец_работы BETWEEN :dateStart AND :dateEnd) OR');
      Add('       ((Заказы.Начало_работы <= :dateStart) AND');
      Add('         (Заказы.Конец_работы >= :dateEnd)))');
    end;
    Parameters.ParseSQL(SQL.Text, True);
    Parameters.ParamByName('SotrID').Value := SotrID; // String
    Parameters.ParamByName('dateStart').Value := StringReplace(DateToStr(dateStart), '.', '/', [rfReplaceAll]); // TDate
    Parameters.ParamByName('dateEnd').Value := StringReplace(DateToStr(dateEnd), '.', '/', [rfReplaceAll]); // TDate
    Open;
суть в том что в Access данные типа ДАТА хранятся в формате 12/12/2000... т.е. через слеши...



PM MAIL WWW Skype GTalk YIM MSN   Вверх
Keeper89
Дата 4.5.2009, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Rodman, но ведь с типом TDate тоже работает. Ошибка идет только при множественном использовании одних и тех же параметров.


--------------------
PM MAIL WWW   Вверх
Rodman
Дата 4.5.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



я не знаю чем эту обсуловлено, но я юзаю два метода... 
1. Как ты делал.
2. вот
Код

with SQL do
    begin
      Clear;
      Add('SELECT Заказы.Код, Заказы.Заказчик, Заказы.Начало_работы,');
      Add('       Заказы.Конец_работы, Заказы.День_с, Заказы.День_до');
      Add('FROM Заказы INNER JOIN [Заказы-Сотрудники] ');
      Add('     ON Заказы.Код=[Заказы-Сотрудники].Код_заказа');
      Add('WHERE ([Заказы-Сотрудники].Код_сотрудника = '+SotrID+') AND');
      Add('      ((Заказы.Начало_работы BETWEEN '+StringReplace(DateToStr(dateStart), '.', '/', [rfReplaceAll])+' AND '+StringReplace(DateToStr(dateEnd), '.', '/', [rfReplaceAll]);+') OR');
      Add('        (Заказы.Конец_работы BETWEEN '+StringReplace(DateToStr(dateStart), '.', '/', [rfReplaceAll])+' AND '+StringReplace(DateToStr(dateEnd), '.', '/', [rfReplaceAll]);+') OR');
//      Add('       ((Заказы.Начало_работы <= :dateStart) AND');
 //     Add('         (Заказы.Конец_работы >= :dateEnd)))');
    end;
    Parameters.ParseSQL(SQL.Text, True);
//    Parameters.ParamByName('SotrID').Value := SotrID; // String
  //  Parameters.ParamByName('dateStart').Value := StringReplace(DateToStr(dateStart), '.', '/', [rfReplaceAll]); // TDate
    //Parameters.ParamByName('dateEnd').Value := StringReplace(DateToStr(dateEnd), '.', '/', [rfReplaceAll]); // TDate
    Open;

PM MAIL WWW Skype GTalk YIM MSN   Вверх
ViktorSCH
Дата 4.5.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Обратите внимание на исходник функции ParseSQL, после её работы в тексте запроса вместо имён параметров знаки вопросов. Реально Вы имеете не три параметра (как Вы думаете) , а множество, просто они с одинаковыми именами и все "хотят значения". Вы и должны все заполнить и лучше в цикле, то есть если имя параметра совпадает с предполагаемым Вами именем - присаиваете значение
PM MAIL   Вверх
Rodman
Дата 4.5.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



ParseSQL - да... это тоже может быть трабла..

я тока со второго топика заметил что там две строки повторяется или еще парс делаешь до параметров
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Keeper89
Дата 4.5.2009, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ViktorSCH, Rodman, т.е. надо дописать параметры?
Код

    with SQL do
    begin
      Clear;
      Add('SELECT Заказы.Код, Заказы.Заказчик, Заказы.Начало_работы,');
      Add('       Заказы.Конец_работы, Заказы.День_с, Заказы.День_до');
      Add('FROM Заказы INNER JOIN [Заказы-Сотрудники] ');
      Add('     ON Заказы.Код=[Заказы-Сотрудники].Код_заказа');
      Add('WHERE ([Заказы-Сотрудники].Код_сотрудника = :SotrID) AND');
      Add('      ((Заказы.Начало_работы BETWEEN :dateStart AND :dateEnd) OR');
      Add('        (Заказы.Конец_работы BETWEEN :dateStart1 AND :dateEnd1) OR');
      Add('       ((Заказы.Начало_работы <= :dateStart2) AND');
      Add('         (Заказы.Конец_работы >= :dateEnd2)))');
    end;

    Parameters.ParseSQL(SQL.Text, True);
    Parameters.ParamByName('SotrID').Value := SotrID; // String
    Parameters.ParamByName('dateStart').Value := dateStart; // TDate
    Parameters.ParamByName('dateEnd').Value := dateEnd; // TDate
    Parameters.ParamByName('dateStart1').Value := dateStart; // TDate
    Parameters.ParamByName('dateEnd1').Value := dateEnd; // TDate
    Parameters.ParamByName('dateStart2').Value := dateStart; // TDate
    Parameters.ParamByName('dateEnd2').Value := dateEnd; // TDate

Что-то вроде такого?


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


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



я чесно говоря его вооще не юзаю..
но я думаю так лучше
Код

    with SQL do
    begin
      Clear;
      Add('SELECT Заказы.Код, Заказы.Заказчик, Заказы.Начало_работы,');
      Add('       Заказы.Конец_работы, Заказы.День_с, Заказы.День_до');
      Add('FROM Заказы INNER JOIN [Заказы-Сотрудники] ');
      Add('     ON Заказы.Код=[Заказы-Сотрудники].Код_заказа');
      Add('WHERE ([Заказы-Сотрудники].Код_сотрудника = :SotrID) AND');
      Add('      ((Заказы.Начало_работы BETWEEN :dateStart AND :dateEnd) OR');
      Add('        (Заказы.Конец_работы BETWEEN :dateStart1 AND :dateEnd1) OR');
      Add('       ((Заказы.Начало_работы <= :dateStart2) AND');
      Add('         (Заказы.Конец_работы >= :dateEnd2)))');
    end;
    Parameters.ParamByName('SotrID').Value := SotrID; // String
    Parameters.ParamByName('dateStart').Value := dateStart; // TDate
    Parameters.ParamByName('dateEnd').Value := dateEnd; // TDate
    Parameters.ParamByName('dateStart1').Value := dateStart; // TDate
    Parameters.ParamByName('dateEnd1').Value := dateEnd; // TDate
    Parameters.ParamByName('dateStart2').Value := dateStart; // TDate
    Parameters.ParamByName('dateEnd2').Value := dateEnd; // TDate
    Parameters.ParseSQL(SQL.Text, True);
    Open;

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Keeper89
Дата 4.5.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Rodman @  4.5.2009,  23:07 Найти цитируемый пост)
я чесно говоря его вооще не юзаю..

всмысле ParseSQL?


--------------------
PM MAIL WWW   Вверх
Rodman
Дата 5.5.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

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



да

Это сообщение отредактировал(а) Rodman - 5.5.2009, 16:51
PM MAIL WWW Skype GTalk YIM MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


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

1. Базы данных (Paradox, Oracle и т.п.)

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


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


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

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


 




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


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

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