Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
1

Отсутствует значение одного или нескольких параметров

11.05.2013, 08:54. Показов 1216. Ответов 1
Метки нет (Все метки)

Всем доброго времени суток. В общем, имеется БД Access, подключаюсь к ней при помощи AdoConnection + AdoDataSet. В таблице есть поля Дата. Запрос к таблице формируется с параметром(data1), с помощью этого параметра я задаю условие в запросе на фильтрацию данных, чтобы отображались данные только за определённую дату. Запрос выглядит следующим образом:
SQL
1
2
3
4
5
6
7
SELECT pre_record.*, customers.name, customers.phone, performers.performer,group_brend.name_group,car.model
FROM pre_record,customers,performers,group_brend,car,
pre_record LEFT JOIN customers ON (pre_record.id_client = customers.id_сlient), 
pre_record LEFT JOIN performers ON (pre_record.id_performer = performers.id_performer),
pre_record LEFT JOIN group_brend ON (pre_record.id_brend = group_brend.id_group),
pre_record LEFT JOIN car ON (pre_record.id_model = car.id_car)
WHERE pre_record.date_record=:date1;
Значения этому параметру передаются через DateTimePicker.
Так же, в DataSet у меня есть ещё один параметр(data2), который я использую, когда нужно установить диапазон дат.
Ему так-же передаются значения из DateTimePicker(естественно с другого)
Вот такой у меня запрос на установку диапазона
SQL
1
2
3
4
5
6
7
SELECT pre_record.*, customers.name, customers.phone, performers.performer,group_brend.name_group,car.model
FROM pre_record,customers,performers,group_brend,car,
pre_record LEFT JOIN customers ON (pre_record.id_client = customers.id_сlient), 
pre_record LEFT JOIN performers ON (pre_record.id_performer = performers.id_performer),
pre_record LEFT JOIN group_brend ON (pre_record.id_brend = group_brend.id_group),
pre_record LEFT JOIN car ON (pre_record.id_model = car.id_car)
WHERE pre_record.date_record BETWEEN :date1 AND :date2;
В общем, картина получается следующая: у меня на форме 2 DateTimePicker, один всегда включен, другой можно включить/выключить, когда пользователь включает второй пикер, соответственно запрос меняется, поэтому я решил написать функцию, которая бы изменяла запрос, при включении/выключении 2го пикера.
В общем вот, что происходит когда пользователь включает 2ой пикер:
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TformPreRecord::DTPDiapason2Change(TObject *Sender)
{
    if (DTPDiapason2->Checked != oldDTPCheked)//если пользователь нажал галочку
        if (DTPDiapason2->Checked)//тогда, если она оказалось включенной...
            UpdateConditionSQL(true,false);//этой функции, которая меняет SQL запрос говорится, что значение второй даты учитывается(true), а второй параметр пока ещё не реализовал, на него можно не обращать внимания
        else
            UpdateConditionSQL(false,false);//если наоборот галка выключена, тогда мы говорим что значение второй даты не учитывается
    else
        RefreshPreRecord();//иначе просто обновляем записи с новыми значениями в пикерах
    oldDTPCheked = DTPDiapason2->Checked;//сохраняем положение галки
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void TformPreRecord::UpdateConditionSQL(bool Date, bool Performer)
{
    String condition;
    if (Date && Performer)//сейчас это условие не имеет значение
        condition = "(pre_record.date_record BETWEEN :date1 AND :date2) AND pre_record.id_performer = 10";
        else if (Date)//если дата учитывается, устанавлием диапазон
           condition = "pre_record.date_record BETWEEN :date1 AND :date2";
            else if (Performer)//ещё не реализовано - не имеет значение
                condition = "pre_record.id_performer = 10";
                else//если 2ая дата не учитывается, то формируем запрос только по одному параметру
                    condition = "pre_record.dare_record=:date1";
 
    DM->ADSPre_record->Close();
    DM->ADSPre_record->CommandText =
    "SELECT pre_record.*, customers.name, customers.phone, performers.performer,group_brend.name_group,car.model "
    "FROM pre_record,customers,performers,group_brend,car, "
    "pre_record LEFT JOIN customers ON (pre_record.id_client = customers.id_сlient), "
    "pre_record LEFT JOIN performers ON (pre_record.id_performer = performers.id_performer), "
    "pre_record LEFT JOIN group_brend ON (pre_record.id_brend = group_brend.id_group), "
    "pre_record LEFT JOIN car ON (pre_record.id_model = car.id_car) "
    "WHERE "+condition+";";
    RefreshPreRecord();//обновляем данные
}
C++
1
2
3
4
5
6
7
8
9
10
void TformPreRecord::RefreshPreRecord(void)
{
    if (DM->ADSPre_record->Active)
        DM->ADSPre_record->Close();
//присваиваем значение первой даты параметру
    DM->ADSPre_record->Parameters->ParamByName("date1")->Value = DateToStr(DTPDiapason1->Date);
    if (DTPDiapason2->Checked)//если 2ой пикер включен, тогда присваиваем и второй параметр
        DM->ADSPre_record->Parameters->ParamByName("date2")->Value = DateToStr(DTPDiapason2->Date);
    DM->ADSPre_record->Open();
}
В общем, проблема в следующем, когда я включаю второй пикер, то всё хорошо, диапазон изменяется, никаких ошибок, всё ровно. Но когда я его выключаю, то есть, запрос меняется с учётом только одного параметра, тогда выскакиевает ошибка, мол "отсутствует значение одного или нескольких требуемых параметров".
И я не могу понять, в чём проблема то, сначала я подумал, что нельзя задать параметр и не использовать его, я решил это проверить пробовал просто поставить 2 кнопки и одной из них написать вот это:
C++
1
2
3
4
5
6
7
8
9
10
11
DM->ADSPre_record->Close();
DM->ADSPre_record->CommandText = 
"SELECT pre_record.*, customers.name, customers.phone, performers.performer,group_brend.name_group,car.model "
"FROM pre_record,customers,performers,group_brend,car, "
"pre_record LEFT JOIN customers ON (pre_record.id_client = customers.id_сlient), "
"pre_record LEFT JOIN performers ON (pre_record.id_performer = performers.id_performer), "
"pre_record LEFT JOIN group_brend ON (pre_record.id_brend = group_brend.id_group), "
"pre_record LEFT JOIN car ON (pre_record.id_model = car.id_car) "
"WHERE pre_record.date_record=:date1;"
DM->ADSPre_record->Parameters->ParamByName("date1")->Value = DateToStr(DTPDiapason1->Date);
DM->ADSPre_record->Open();
А на второй это
C++
1
2
3
4
5
6
7
8
9
10
11
12
DM->ADSPre_record->Close();
DM->ADSPre_record->CommandText = 
"SELECT pre_record.*, customers.name, customers.phone, performers.performer,group_brend.name_group,car.model "
"FROM pre_record,customers,performers,group_brend,car, "
"pre_record LEFT JOIN customers ON (pre_record.id_client = customers.id_сlient), "
"pre_record LEFT JOIN performers ON (pre_record.id_performer = performers.id_performer), "
"pre_record LEFT JOIN group_brend ON (pre_record.id_brend = group_brend.id_group), "
"pre_record LEFT JOIN car ON (pre_record.id_model = car.id_car) "
"WHERE pre_record.date_record BETWEEN :date1 AND :date2;"
DM->ADSPre_record->Parameters->ParamByName("date1")->Value = DateToStr(DTPDiapason1->Date);
DM->ADSPre_record->Parameters->ParamByName("date2")->Value = DateToStr(DTPDiapason2->Date);
DM->ADSPre_record->Open();
Но такой ошибки не вылезает, всё нормально проходит, хотя по сути ведь делается одно и тоже. Объясните пожалуйста в чём проблема????
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.05.2013, 08:54
Ответы с готовыми решениями:

Ошибка в запросе с ADOQuery: "Отсутствие значения для одного или нескольких требуемых параметров"
Нужно создать в таблице Contract поиск по названию договора. Вот сам код: SELECT Contract.,...

Отсутсвует значение для одного или нескольких требуемых праметров
Здравствуйте! Подскажите что не так Form1->ADOConnection1->Execute( "update AppleClub set...

Протабулировать функции, зависящие от двух переменных или от нескольких параметров
Всем доброго времени суток. Помогите сделать задание. Вот описание задания: Необходимо...

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

1
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495
13.05.2013, 10:52  [ТС] 2
Господа форумчане, неужели никто не подскажет в чём проблема может быть??? Тема ещё актуальна...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.05.2013, 10:52

Отсутствует значение одного или нескольких параметров
Public conn As New ADODB.Connection Public rs As New ADODB.Recordset Private Sub...

Отсутствует значение для одного или нескольких параметров
Имеется БД, подключённая через datagridview. В ней мне нужно в зависимости от значения D запросом...

Отсутствует значение для одного или нескольких параметров
Доброго времени суток подскажите в чем ошибка DM.DataModule3.ADOQuery3.Close;...

Отсутствует значение для одного или нескольких параметров
cmd.CommandText = "INSERT INTO '" + table_name + "'('" + join(field_names, ", ") + "') " + ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru