![]() |
|
![]() ![]() ![]() |
|
ivanfr |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
При формировании запроса(Access) к таблице Table_of_key_media с TempDataFromMemory[3] содержимым, выводит пустой результат,
хотя данные в таблице есть.
Помогите разобраться, почему не работает вышеприведенный код? таблицы связаны след. образом образом ![]() В делфи таблицы тоже связаны и ДБгрид1,2,3 при переключении выводит корректные данные. Если, например, обращаюсь так -
то все работает. Это сообщение отредактировал(а) ivanfr - 8.8.2012, 05:50 |
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Нет строк, удовлетворяющих условию Like ?
|
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Ага. А в базе смотрю они есть.
|
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Чудес не бывает
![]() ![]() Прямой запрос в Access-е, с подстановкой вместо TempDataFromMemory[3] его значения, выдаст результат? Добавлено через 4 минуты и 57 секунд И кстати, может не ADOQuery1, а ADOQuery2 ? Чтобы не нарушать связи по полям? Это сообщение отредактировал(а) kami - 7.8.2012, 14:03 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
БД mssql или access? во втором случае спец-символом "любой" является * а не %
|
|||
|
||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
Кто сказал? -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
||||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Проверяли ![]()
Источник К сожалению не описано, но верно и обратное - символ '*' действует только в Access, а при работе через ADO считается литералом. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
||||
|
||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
Вот у меня работающий код:
-------------------- There's nothing left but silent epitaphs. |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Попробовал по серийному номеру ключ
Результат, пустой. Поля рисунка соответсвуют таблице бд после запроса, но данных в ней нет. ![]() Данные в БД access ![]() Все равно не работает Это сообщение отредактировал(а) ivanfr - 8.8.2012, 09:35 |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
для надежности? моя твоя понимайтен судя по скриншоту ему лайк Serial_Number... |
|||
|
||||
ivanfr |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
or - Так делать нельзя. Запрос делаю по 7 полям, если они совпадают, то я считаю, что в БД уже есть такая запись, следовательно, вносить ее повторно не нужно.
Не сообразил, что хочешь сказать?
Это сообщение отредактировал(а) ivanfr - 8.8.2012, 09:50 |
||||||
|
|||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
на скриншоте вижу кусочек данных в поле Serial_Number - 'e00...', в поле Type_Carrier - 'eToken RPC'
а в твоем запросе Type_Carrier сравнивается с e00630FGE ЗЫ:ты бы нормально показал свои данные |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Ответить там в коде ошибка.
Данные не там искал. Сейчас поправил заработало, а вот основном коде, который приведен выше не фурычит. Смотрю в Watch list данные соответсвют, тому что находится в таблице в столбцах. Это сообщение отредактировал(а) ivanfr - 8.8.2012, 09:56 |
|||
|
||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
Гы, вероятно. Я даже не заметил сейчас, а что я тогда имел в виду - кто меня знает. -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Зачем так?
И дублирующаяся строка не сможет вставиться. |
||||
|
|||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
все-таки, как выглядит итоговая строка, которая передается в ADD()? как выглядит хотя бы одна запись в базе, соответствующая этому where? ошибка где-то рядом... кстати, если в этой строчке вообще убрать where, результаты будут? |
|||
|
||||
ivanfr |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Итоговая строка выглядит так:
Тут из базы. ![]() а тут после запроса выше приведенного кода. ![]() Вот так выводит запись работает.
Как будет реагировать бд если внее будут летететь пустые
Это сообщение отредактировал(а) ivanfr - 8.8.2012, 12:00 |
||||||||
|
|||||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
||||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Смотрите выше я отредактировал предыдущее сообщение.
|
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
итоговую Вы так и не показали)))
ну да ладно а в таблице 'eToken RPC...' в общем не морочьте нам голову, проверяйте свои входные данные. еще: у Вас все поля текстовые? и еще: зачем весь этот цирк со сравнением множества полей? идентификатором записи служит id, его и используйте. Добавлено через 3 минуты и 52 секунды если это эквивалентно любому значению, нормально будет реагировать. если отсутствию значения - ненормально. лучше так не делать. используйте в предложении where только те поля, по которым сравнение действительно нужно. |
|||
|
||||
ivanfr |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Да там в столбце Type_Carrier содержится. вот рисунок из БД ![]()
Можно увидеть из этотого рисунка ![]() Весь этот цирк нужен, для того чтобы в таблицу не попали одинаковые ключевые носители. Как я программе объясню? только путём сравнения всех параметров если они совпадут, то это будет тот же ключевой носитель. особенность в том, что есть КНИ без номеров и в таблице не могу выбрать ключевое поле(уникальное). Любое из всех может повторяться, но не в совокупности вместе взятые. В бд данные попадают из xls где переодически обновляется инфа. Это сообщение отредактировал(а) ivanfr - 8.8.2012, 14:07 |
||||||
|
|||||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
если это ключ, вам требуется строгое сравнение, а не like. и почему вы сравниваете все как строки? сравнивайте числа как числа.
отключайте все свои условия, включайте по одному и выполняйте запросы - так найдете то, которое не подходит. начните с полей где дата хранится. данные для сравнения полей datetime делайте в формате 'ГГГГ/ММ/ДД' |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Я уже ответил на этот вопрос.
|
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
В дополнение (к исполнению обязательно):
Заменить всё на параметры в запросе. Хотя бы даты. Ибо по умолчанию в Access стоит формат даты "мм.дд.гггг". Соответственно, в приведенном примере TempDataFromMemory[12] интерпретируется как "8 января 2012 года"; Однако, это только на тех компьютерах, которые мне встречались, так что не факт, что где-то не встретится какой-либо другой формат. Параметр же передается вне зависимости от строкового отображения даты. |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Заменил на запрос с параметрами теперь работает, как надо!
Привожу код
Прошу рассмотреть на ошибки и внести замечания. Это сообщение отредактировал(а) ivanfr - 24.8.2012, 06:55 |
|||
|
||||
ivanfr |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Помогите с ошибкой!
В чём может быть пробмема, убираю эти строки из кода и данные из БД выбираются. Если добавляю результат пустые значения. ставлю в ячейку БД значение "1", оставляю нижеприведенный код работает.
|
||||
|
|||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Вам уже несколько раз сказали, что нужен не Y а X.
А все эти многокилометровые запросы с кучей AND - лишняя нагрузка на СУБД. Это сообщение отредактировал(а) kami - 24.8.2012, 23:36 |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Хорошо.
Объясните мне не компетентному, что это такое(нижеприведённый код SQL) и как это мне поможет в решении моей проблемы? Почему, ваше решение должно работать?
Как я программе объясню? только путём сравнения всех параметров если они совпадут, то это будет тот же ключевой носитель. особенность в том, что есть КНИ без номеров и в таблице не могу выбрать ключевое поле(уникальное). Любое из всех может повторяться, но не в совокупности вместе взятые. Я уже ответил на этот вопрос. Это сообщение отредактировал(а) ivanfr - 27.8.2012, 08:11 |
|||
|
||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
Не нужно программе ничего объяснять. Приведенный мной SQL-код создает ограничение - СУБД не сможет добавить запись в таблицу, если в ней уже есть аналогичная. По каким полям производить сравнение - подставляется вместо (Поле1, Поле2). Можете хоть все поля таблицы перечислить через запятую. Таким образом, после добавления Constraint задача будет сведена к следующему:
И всё. Не нужно никаких формирований лишних запросов, выборок, сравнений с добавляемым и так далее и тому подобное. Всю эту нагрузку возьмет на себя СУБД. А вообще, уважаемый, за столько времени можно уже было почитать справку о том, что такое CONSTRAINT и с чем его едят. Потому что прежде чем писать его сюда, я просмотрел справку к Access, увидел нужный синтаксис, создал тестовую таблицу, ввел ограничение и попробовал добавить одинаковые записи. В отличие от вас. |
||||
|
|||||
ivanfr |
|
||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Буду учиться.
Так как мне нет необходимости в создании таблицы, то я беру вот эту строку:
в Место: 1)"Таблица1" -" Table_of_key_media" 2)"myConstraint" - не понял что это такое. Смотрел в примерах стоит всегда другое значение нe связанное с таблицей, например,
3)"UNIQUE(Поле1, Поле2)" - UNIQUE(Type_Carrier, Serial_Number_Carrier, Issued_Keys, Name_Of_The_Holder_Of_The_Keys,+ 'Employee_Number_Key_Holder, Position_Or_Location_Key, Workstation_Installation_Inventory_Number,'+ 'Type_Key, Date_Of_Issue_Of_Key_Media, Date_of_delivery_of_key, Date_Of_Last_Inspection,'+ 'Integrity_Of_The_Sealing, Order_Of_The_Key_Storage_Medium, Comments )'; И должно получиться следующее: Параметры оставлять и использовать insert нужно?
![]() Не совсем понятно, как добавить в связную таблицу оставшиеся данные. По логике
Прошу Вас объяснить моменты, которые я не понимаю. Это сообщение отредактировал(а) ivanfr - 28.8.2012, 11:05 |
||||||||||
|
|||||||||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
да. А нужно смотреть не в примерах, а в описании самого оператора и особенно - в ремарках. Хелп пересказывать не буду. нет. Читаем. Смотрим еще раз на синтаксис ALTER TABLE. Думаем. Смотрим на выделенное жирным шрифтом. Опять думаем И понимаем, что этот SQL оператор нужно/можно выполнить непосредственно в Access ОДИН раз при создании БД. А потом пользоваться обычным INSERT INTO с его параметрами. Кстати, по поводу исключения могу ошибаться - возможно, ADOQuery.ExecSQL при добавлении записи в таблицу просто вернет 0 вместо 1. Но сути дела это не меняет.
Если добавление было успешно, то следующий запрос "SELECT @@IDENTITY" вернет ID добавленной записи в том случае, если ID поле - автоинкрементное. |
||||
|
|||||
ivanfr |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Ура!!! наконце получилось!
Как делал: 1)нашёл эту статью где все понятно написано ссылка:http://office.microsoft.com/ru-ru/access-h...A010341600.aspx Выполнил по пунктно
Запускаю в Delphi следующий код:
БД не дает ввносить изменение если идентичная строка в базе сущестует, если изменить 1 или два поля то данные добавить можно. Благодарю всех кто помогал, отдельное спасибо kami kami Если б сразу сказал, что нужно выполнить SQL запрос в самом Access, что в итоге позволит создать ограничение на несколько полей уже бы сделал давно. Это сообщение отредактировал(а) ivanfr - 24.9.2012, 08:12 |
||||
|
|||||
kami |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
то ли лыжи не едут,... но:
![]() |
||||
|
|||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
На всякий случай добавляю вариант с INSERT INTO
|
|||
|
||||
ivanfr |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Помогите довести данный вопрос до логического конца.
![]() Рисунок - Схема данных Сейчас данные добавляются, но не связываются, так как отсутсвуют индексы записи. Ранее я устанавливал в ДБ Гриде на запись с locate таблице persona_stor на нужную запись, а затем записывал данные. Сейчас же запись осуществляется с помощью INSERT INTO и ему нужно предоставить индекс для связи таблиц. Делаю следующим образом, передаю, пытаюсь записать данные о ключевом носителе информации. В БД сделал ограничение по 10 столбцам, если совпадают, то запись сделать не возможно. И далее обрабатывается исключительная ситуация, а именно except, - где я пытаюсь дописать информацию о ключе, если запись не совпадает - то записывается в БД. Тут возникает проблема, как узнать все ID нужных мне записей, по которым таблицы связываются друг с другом. Допустим, после записи я могу сразу получить ID текущей записи, следующим образом:
Запишу значение в следующую таблицу (в моём случае Таблица Key_User записи Id_Table_of_Key_Media), но как узнать ID записи вышестоящей таблицы, а именно таблицы persona_stor записи Id_persona_stor записав это значение в таблицу Table_of_key_media столбца Id_table_persona_stor? Есть предположение как это сделать, сформировать sql-запрос на поиск данных из него выбрать id. Есть еще вариант с помощью LOCETE установить на запись а затем извлеч ID только не пойму как. на запись перехожу так:
Помогите решить задачу. Это сообщение отредактировал(а) ivanfr - 26.9.2012, 09:29 |
||||||
|
|||||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1806 Регистрация: 25.8.2007 Где: Санкт-Петербург Репутация: 3 Всего: 72 |
После Locate:
Добавлено через 2 минуты и 56 секунд Ну и соответственно в этот гигантский Insert Into добавляем поле 'id_persona_stor' и значение id_persona_stor |
|||
|
||||
ivanfr |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Сам разобрался вчера, долго парился..
но все равно спасибо за ответ.
если так сделать, то он должен добавить индекс только в таблицу КНИ, а в таблицу КИ ничего не добавит и ключ не свяжется. я сделал так для таблицы КНИ
а для таблцы КИ след. образом
Привожу итоговый код:
Это сообщение отредактировал(а) ivanfr - 27.9.2012, 13:41 |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "Delphi: Базы данных и репортинг" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |