Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не выполняется SQL - запрос в связной таблице 
V
    Опции темы
Данкинг
Дата 8.8.2012, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

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



Цитата(baldina @  8.8.2012,  10:27 Найти цитируемый пост)
для надежности?

Гы, вероятно. Я даже не заметил сейчас, а что я тогда имел в виду - кто меня знает.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
kami
Дата 8.8.2012, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ivanfr @  8.8.2012,  09:41 Найти цитируемый пост)
Запрос делаю по 7 полям, если они совпадают, то я считаю, что в БД уже есть такая запись, следовательно, вносить ее повторно не нужно.

Зачем так?
Код

ALTER TABLE Таблица1 ADD CONSTRAINT myConstraint UNIQUE(Поле1, Поле2)
или
CREATE UNIQUE INDEX IX_TABLEINDEX ON Таблица1 (Поле1, Поле2, Поле3) WITH PRIMARY

И дублирующаяся строка не сможет вставиться.
PM MAIL WWW   Вверх
baldina
Дата 8.8.2012, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ivanfr @  7.8.2012,  12:14 Найти цитируемый пост)
DataModule1.ADOQuery1.SQL.Clear;
DataModule1.ADOQuery1.SQL.ADD('SELECT * FROM Table_of_key_media WHERE Type_Carrier LIKE "%'+TempDataFromMemory[3]+'%"');
DataModule1.ADOQuery1.Open;

все-таки, как выглядит итоговая строка, которая передается в ADD()?
как выглядит хотя бы одна запись в базе, соответствующая этому where?
ошибка где-то рядом... 
кстати, если в этой строчке вообще убрать where, результаты будут?
PM MAIL   Вверх
ivanfr
Дата 8.8.2012, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Итоговая строка выглядит так:


Код
begin 
  
  TempDataFromMemory[2]:='eToken PRO (Java)/72K CERT-1883';
  TempDataFromMemory[3]:='e00858585';
  TempDataFromMemory[5]:='Сидоров С.С.';
  TempDataFromMemory[6]:='Иванов Иван Иванович';
  TempDataFromMemory[7]:='35126';
  TempDataFromMemory[8]:='Ленина 1';
  TempDataFromMemory[9]:='ПК 1';
  TempDataFromMemory[11]:='Основной комплект';
  TempDataFromMemory[12]:='01.08.2012';
  //TempDataFromMemory[14]:='';
  //TempDataFromMemory[15]:='';
  //TempDataFromMemory[16]:='';
  TempDataFromMemory[17]:='Сейф';

DataModule1.ADOQuery1.SQL.Clear;
      DataModule1.ADOQuery1.SQL.ADD('SELECT * FROM Table_of_key_media WHERE Type_Carrier LIKE "%'+ TempDataFromMemory[2]+
                                     '%" and Serial_Number_Carrier LIKE "%'+ TempDataFromMemory[3]+
                                     '%" and Issued_Keys LIKE "%'+TempDataFromMemory[5]+
                                     '%" and Name_Of_The_Holder_Of_The_Keys LIKE "%'+ TempDataFromMemory[6]+
                                     '%" and Employee_Number_Key_Holder LIKE "%'+ TempDataFromMemory[7]+
                                     '%" and Position_Or_Location_Key LIKE "%'+ TempDataFromMemory[8]+
                                     '%" and Workstation_Installation_Inventory_Number LIKE "%'+ TempDataFromMemory[9]+
                                     '%" and Type_Key LIKE "%'+ TempDataFromMemory[11]+
                                     '%" and Date_Of_Issue_Of_Key_Media LIKE "%'+ TempDataFromMemory[12]+
                                     '%" and Date_of_delivery_of_key LIKE "%'+ TempDataFromMemory[14]+
                                     '%" and Date_Of_Last_Inspection LIKE "%'+ TempDataFromMemory[15]+
                                     '%" and Integrity_Of_The_Sealing LIKE "%'+ TempDataFromMemory[16]+
                                     '%" and Order_Of_The_Key_Storage_Medium LIKE "%'+ TempDataFromMemory[17]+
                                     '%" and Comment LIKE "%'+TempDataFromMemory[18]+'%"');
     DataModule1.ADOQuery1.Open;

Тут из базы.
user posted image
а тут после запроса выше приведенного кода.
user posted image
Вот так выводит запись работает.
 
Код

      DataModule1.ADOQuery1.SQL.ADD('SELECT * FROM Table_of_key_media');
 
Как будет реагировать бд если внее будут летететь пустые   
Код


TempDataFromMemory : Array[0..22] of WideString; 
поля  ?
Код


 '%" and Date_of_delivery_of_key LIKE "%'+ TempDataFromMemory[14]+
'%" and Date_Of_Last_Inspection LIKE "%'+ TempDataFromMemory[15]+
'%" and Integrity_Of_The_Sealing LIKE "%'+ TempDataFromMemory[16]+
  

Это сообщение отредактировал(а) ivanfr - 8.8.2012, 12:00
PM MAIL   Вверх
baldina
Дата 8.8.2012, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ivanfr @  8.8.2012,  11:30 Найти цитируемый пост)
Итоговая строка выглядит так:

это не итоговая. покажи что получается после подстановки TempDataFromMemory и соответствующую ей запись в БД
PM MAIL   Вверх
ivanfr
Дата 8.8.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Смотрите выше я отредактировал предыдущее сообщение.
PM MAIL   Вверх
baldina
Дата 8.8.2012, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



итоговую Вы так и не показали)))
ну да ладно

Цитата(ivanfr @  8.8.2012,  11:30 Найти цитируемый пост)
TempDataFromMemory[2]:='eToken PRO (Java)/72K CERT-1883';

а в таблице 'eToken RPC...'

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

еще: у Вас все поля текстовые?
и еще: зачем весь этот цирк со сравнением множества полей? идентификатором записи служит id, его и используйте.

Добавлено через 3 минуты и 52 секунды
Цитата(ivanfr @  8.8.2012,  11:30 Найти цитируемый пост)
Как будет реагировать бд если внее будут летететь пустые поля  ?

если это эквивалентно любому значению, нормально будет реагировать.
если отсутствию значения - ненормально.
лучше так не делать. используйте в предложении where только те поля, по которым сравнение действительно нужно.
PM MAIL   Вверх
ivanfr
Дата 8.8.2012, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

итоговую Вы так и не показали)))
ну да ладно
 Может я не правильно понял, объясните что вы имеете в виду, еще раз.
Цитата

Цитата(ivanfr @  8.8.2012,  11:30 )
TempDataFromMemory[2]:='eToken PRO (Java)/72K CERT-1883';
а в таблице 'eToken RPC...'

Да там в столбце  Type_Carrier  содержится.
вот рисунок из БД
user posted image

Цитата

еще: у Вас все поля текстовые?
и еще: зачем весь этот цирк со сравнением множества полей? идентификатором записи служит id, его и используйте.

Можно увидеть из этотого рисунка
user posted image

Весь этот цирк нужен, для того чтобы в таблицу не попали одинаковые ключевые носители. Как я программе объясню? только путём сравнения всех параметров если они совпадут, то это будет тот же ключевой носитель.
особенность в том, что есть КНИ без номеров и в таблице не могу выбрать ключевое поле(уникальное). Любое из всех может повторяться, но не в совокупности вместе взятые. В бд данные попадают из xls где переодически обновляется инфа.

Это сообщение отредактировал(а) ivanfr - 8.8.2012, 14:07
PM MAIL   Вверх
baldina
Дата 8.8.2012, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



если это ключ, вам требуется строгое сравнение, а не like. и почему вы сравниваете все как строки? сравнивайте числа как числа.

отключайте все свои условия, включайте по одному и выполняйте запросы - так найдете то, которое не подходит. начните с полей где дата хранится. данные для сравнения полей datetime делайте в формате 'ГГГГ/ММ/ДД'
PM MAIL   Вверх
kami
Дата 8.8.2012, 14:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ivanfr @  8.8.2012,  13:54 Найти цитируемый пост)
Как я программе объясню? только путём сравнения всех параметров если они совпадут, то это будет тот же ключевой носитель.особенность в том, что есть КНИ без номеров и в таблице не могу выбрать ключевое поле(уникальное). Любое из всех может повторяться, но не в совокупности вместе взятые. 


Я уже ответил на этот вопрос.

Код

ALTER TABLE Таблица1 ADD CONSTRAINT myConstraint UNIQUE(Поле1, Поле2)
или
CREATE UNIQUE INDEX IX_TABLEINDEX ON Таблица1 (Поле1, Поле2, Поле3) WITH PRIMARY

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


Эксперт
***


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

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



В дополнение (к исполнению обязательно):
Заменить всё на параметры в запросе. Хотя бы даты. Ибо по умолчанию в Access стоит формат даты "мм.дд.гггг". 
Соответственно, в приведенном примере TempDataFromMemory[12] интерпретируется как "8 января 2012 года";

 Однако, это только на тех компьютерах, которые мне встречались, так что не факт, что где-то не встретится какой-либо другой формат. Параметр же передается вне зависимости от строкового отображения даты.
PM MAIL WWW   Вверх
ivanfr
Дата 23.8.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Заменил на запрос с параметрами теперь работает, как надо!
Привожу код
Код

DataModule1.ADOQuery1.SQL.Text:=' SELECT *'+
    ' FROM Table_of_key_media'+
    ' WHERE Type_Carrier = :Parameters_Type_Carrier' +
    ' AND Serial_Number_Carrier = :Parameters_Serial_Number_Carrier' +
    ' AND Issued_Keys = :Parameters_Issued_Keys'+
    ' AND Name_Of_The_Holder_Of_The_Keys = :Parameters_Name_Of_The_Holder_Of_The_Keys' +
    ' AND Employee_Number_Key_Holder = :Parameters_Employee_Number_Key_Holder'+
    ' AND Position_Or_Location_Key = :Parameters_Position_Or_Location_Key'+
    ' AND Workstation_Installation_Inventory_Number = :Parameters_Workstation_Installation_Inventory_Number'+
    ' AND Type_Key = :Parameters_Type_Key'+
    ' AND Date_Of_Issue_Of_Key_Media = :Parameters_Date_Of_Issue_Of_Key_Media'+
    ' AND Order_Of_The_Key_Storage_Medium = :Parameters_Order_Of_The_Key_Storage_Medium'+
    ' AND Comment = :Parameters_Comment';
  //Параметры запроса
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Type_Carrier').Value:=TempDataFromMemory[2];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Serial_Number_Carrier').Value:=TempDataFromMemory[3];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Issued_Keys').Value:=TempDataFromMemory[5];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Name_Of_The_Holder_Of_The_Keys').Value:=TempDataFromMemory[6];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Employee_Number_Key_Holder').Value:=TempDataFromMemory[7];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Position_Or_Location_Key').Value:=TempDataFromMemory[8];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Workstation_Installation_Inventory_Number').Value:=TempDataFromMemory[9];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Type_Key').Value:=TempDataFromMemory[11];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Date_Of_Issue_Of_Key_Media').Value:= StrToDate(TempDataFromMemory[12]);
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Order_Of_The_Key_Storage_Medium').Value:=TempDataFromMemory[17];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Comment').Value:=TempDataFromMemory[18];
  //Выполнение зароса
  DataModule1.ADOQuery1.Open;


Прошу рассмотреть на  ошибки и внести замечания.

Это сообщение отредактировал(а) ivanfr - 24.8.2012, 06:55
PM MAIL   Вверх
ivanfr
  Дата 24.8.2012, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Помогите с ошибкой!
Код

DataModule1.ADOQuery1.SQL.Text:=' SELECT *'+
    ' FROM Table_of_key_media'+
    ' WHERE Type_Carrier = :Parameters_Type_Carrier' +
    ' AND Serial_Number_Carrier = :Parameters_Serial_Number_Carrier' +
    ' AND Issued_Keys = :Parameters_Issued_Keys'+
    ' AND Name_Of_The_Holder_Of_The_Keys = :Parameters_Name_Of_The_Holder_Of_The_Keys' +
    ' AND Employee_Number_Key_Holder = :Parameters_Employee_Number_Key_Holder'+
    ' AND Position_Or_Location_Key = :Parameters_Position_Or_Location_Key'+
    ' AND Workstation_Installation_Inventory_Number = :Parameters_Workstation_Installation_Inventory_Number'+
    ' AND Type_Key = :Parameters_Type_Key'+
    ' AND Date_Of_Issue_Of_Key_Media = :Parameters_Date_Of_Issue_Of_Key_Media'+
    ' AND Order_Of_The_Key_Storage_Medium = :Parameters_Order_Of_The_Key_Storage_Medium'+
    ' AND Comment = :Parameters_Comment';//Без этой строки работает.
DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Type_Carrier').Value:=TempDataFromMemory[2];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Serial_Number_Carrier').Value:=TempDataFromMemory[3];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Issued_Keys').Value:=TempDataFromMemory[5];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Name_Of_The_Holder_Of_The_Keys').Value:=TempDataFromMemory[6];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Employee_Number_Key_Holder').Value:=TempDataFromMemory[7];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Position_Or_Location_Key').Value:=TempDataFromMemory[8];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Workstation_Installation_Inventory_Number').Value:=TempDataFromMemory[9];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Type_Key').Value:=TempDataFromMemory[11];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Date_Of_Issue_Of_Key_Media').Value:= StrToDate(TempDataFromMemory[12]);
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Order_Of_The_Key_Storage_Medium').Value:=TempDataFromMemory[17];
  DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Comment').Value:=TempDataFromMemory[18];// без этой строки работает


В чём может быть пробмема, убираю эти строки из кода и данные из БД выбираются.  Если добавляю результат пустые значения. 
ставлю в ячейку БД значение "1", оставляю  нижеприведенный  код работает.  
Код

AND Comment = :Parameters_Comment';
DataModule1.ADOQuery1.Parameters.ParamByName('Parameters_Comment').Value:=TempDataFromMemory[18];// без этой строки 

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


Эксперт
***


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

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



Вам уже несколько раз сказали, что нужен не Y а X.
А все эти многокилометровые запросы с кучей AND - лишняя нагрузка на СУБД.

Это сообщение отредактировал(а) kami - 24.8.2012, 23:36
PM MAIL WWW   Вверх
ivanfr
Дата 27.8.2012, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Хорошо.
Объясните мне не компетентному, что это такое(нижеприведённый код SQL) и как это мне поможет в решении моей проблемы?
Почему, ваше решение  должно работать? 
Код

ALTER TABLE Таблица1 ADD CONSTRAINT myConstraint UNIQUE(Поле1, Поле2)
или
CREATE UNIQUE INDEX IX_TABLEINDEX ON Таблица1 (Поле1, Поле2, Поле3) WITH PRIMAR

Как я программе объясню? только путём сравнения всех параметров если они совпадут, то это будет тот же ключевой носитель. особенность в том, что есть КНИ без номеров и в таблице не могу выбрать ключевое поле(уникальное). Любое из всех может повторяться, но не в совокупности вместе взятые. 
Я уже ответил на этот вопрос.


Это сообщение отредактировал(а) ivanfr - 27.8.2012, 08:11
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

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

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


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

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

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


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

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


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

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


 




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


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

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