![]() |
|
![]() ![]() ![]() |
|
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Значит хочу реализовать следующее (Пока не реализовано хочу пошагово разобраться)
Помогите написать SQL – Запрос. Delphi/Ассеss Есть не большая БД в ней есть таблица(persona_stor) в которой несколько столбцов ФИО (fio_work), Дата увольнения (date_uvolnenie), Значение (znachenie). Читаю на форумах рекомендуют использовать SQL – запрос, тут у меня немного проблемно. Нужно, что бы из таблицы «persona_stor», столбца «date_uvolnenie» выбрал все даты, которые удовлетворяют критерию, с 20.08.2011 по 20.09.2011, вывел всех сотрудников, кто уволился в это период. Затем дабы избежать повторного выбора этих сотрудников их нужно исключить из поиска добавив (записать в таблицу), в столбец «znachenie», каждому из найденных сотрудников значение, например, -«обработано». При выборке SQL – Запросом в следующий раз он уже должен их исключать. 1) Для начала хочу просто разобраться с отбором всех сотрудников кто уволился с 20.08.2011 по 20.09.2011 Что пытаюсь сделать.
Почему то не работает вроде правильно делаю или нет?!. SELECT * -выбираю все поля FROM persona_stor - беру таблицу WHERE критерий отбора все даты которые Есть сотрудник и его дата увольнения, мне нужно чтобы Попов Ф.А. 11.07.2011 Иванов И.П. 20.08.2011 Сидоров С.В. 30.08.2011 Петров В.Ф. 01.09.2011 Это сообщение отредактировал(а) ivanfr - 20.9.2011, 13:02 |
|||
|
||||
AndreyIQ |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
|
||||
|
|||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
Что за конструкция такая вообще? Access её явно не знает. -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
ivanfr |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Что то не с работало. А вот between :data_nach and :data_kon в коде так написал between :20.08.2011 and :20.09.2011
там нормально Ковычки. были. есть. |
||||
|
|||||
AndreyIQ |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
К сожалению с Access'ом не работаю, но в firebird нормально работает, и для access'а должно примерно так работать
|
||||||
|
|||||||
udly |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 25.3.2006 Репутация: нет Всего: 0 |
А если попробовать так:
|
|||
|
||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
Посмотри в самом Access'е, в конструкторе запросов, как оформляется дата. Там всякие ##, т.е. не всё так просто. -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
ivanfr |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Вот так помогло, только >= знак в больше, поставил не правильно сейчас вроде корректно выводит то, что я и хотел.
Ну да ладно завтра займусь продолжением решение данного вопроса. Надеюсь на вашу помощь. Как работать с полученными данными? Он их же в ДБ грид помещает. Добавлено @ 13:51 А какой лучше надёжней,... вариант использовать? 1)
2)
Это сообщение отредактировал(а) ivanfr - 21.9.2011, 05:24 |
||||||||
|
|||||||||
AndreyIQ |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
Что имено не понятно?
Первый Это сообщение отредактировал(а) AndreyIQ - 20.9.2011, 13:56 |
||||
|
|||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 35 Всего: 130 |
-------------------- There's nothing left but silent epitaphs. |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Ну он в смысле запрос. Я подключил DataSource к DataModule1.ADOQuery1. а DBGrid1 к DataSource, вот.
|
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Нашёл кусок кода где на прямую после запроса в эксель импорт данных чуть- чуть переделал, но не получилось в чем моя ошибка? Конечный результат Хотел данные полученные SQL запросом поместить в массив. а затем записать в БД. Пока хочу разобраться только с занесением данных в массив.
Выдает ошибку след содержания Access violahion at address 004C6F24 in module ... Read of address 00000004 |
|||
|
||||
AndreyIQ |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
Как минимум не заметил, гда задается размер массива MassivRezultSQL. Я делал так |
||||
|
|||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Кубическая СИЛА. Яж строку целую написать забыл SetLength(MassivRezultSQL,iRowsCount, iColumnsCount);
Это сообщение отредактировал(а) ivanfr - 21.9.2011, 09:02 |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Потестил, доработал, замечательно работает, читает данные в массив.
Спасибо за помощь. Осталось у полученных данных обновить значение столбца путем добавления в него данных. |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Всем привет, нашлась свободная минута хотел бы продолжить.
С помощью оператора UPDATE добавляются данные . UPDATE Имя_таблицы SET Имя_поля=Значение WHERE Условие выборки. Ранее с помощью SQL – Запроса получили данные выборки работников, которые уволились в определенный промежуток времени с 20.08.2011по 20.09.2011. Далее научился эти данные переносить в динамический массив, что бы можно было с ними работать. Задача 1 Теперь перед мной стоит следующая задача, как добавить отобранным работникам в столбец значение (znachenie), таблицы (persona_stor) значение «обработан»? Для чего, для того чтобы когда я буду формировать запрос выборки SQL:
ЗАДАЧА 2 В условия выборки SQL-Запроса хотел бы добавить дополнительное условие отбора, например, бери все даты, которые соответствую условию (с 20.08.2011по 20.09.2011), но если у них в столбец значение (znachenie), таблицы (persona_stor) есть значение «обработан», то исключи его из выборки. Для начала хотел бы узнать, можно ли это реализовать с помощью SQL-запроса? Это сообщение отредактировал(а) ivanfr - 29.9.2011, 06:36 |
|||
|
||||
14SatanA88 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 13.5.2010 Репутация: 1 Всего: 5 |
разумеется
здесь, может быть, надо будет еще скобки расставить. Добавлено @ 08:25 и я еще не понял, зачем динамический массив? Это сообщение отредактировал(а) 14SatanA88 - 29.9.2011, 10:14 |
||||||
|
|||||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
14SatanA88 Скажи пожалуйста SET znachenie=true когда так пишем то мы SQL запросом как бы спрашиваем, что значение "znachenie" Пустое - false или не пустое – true ( то есть в данном столбце, есть какие-то данные. если true, то не пустое если false- то данные есть), так тип "znachenie" текстовый у меня. Или логичней сделать его логическим типом? я то собирался туда записывать слова типа "Обработано". |
|||
|
||||
14SatanA88 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 13.5.2010 Репутация: 1 Всего: 5 |
имхо намного логичней ну если текст то просто SET znachenie='какой-то текст' Добавлено через 2 минуты и 10 секунд нет, SET просто поверх старого значения пишет в таблицу то, что ему указали в данном случае в логическое (!) поле пишется логическая единица |
|||
|
||||
ivanfr |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Хорошо это запрос применил работает на ура. Вот теперь что- то не соображу
- этот кусок кода, как пременить вроди бы этот код отработал:
и данные находяться в ADOQuery1, а он требует нового создания запроса. что то я не пойму как это работает? Ранее я их помещал в массив. куда какую запись вставлять(по строчка по столбика), как это сказать запросу? Объясните как это работает? Это сообщение отредактировал(а) ivanfr - 29.9.2011, 12:50 |
||||||
|
|||||||
AndreyIQ |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
Кто требует?
Что имено непонятно? Задайте конкретный вопрос. |
||||
|
|||||
ivanfr |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Отработал код
, выбрал людей, которые уволились в определнный интервал с 20.08.2011 по 20.09.2011. так вот данные поместились в ADOQuery1. Правильно. Теперь нужно обновить у найденных сотрудников столбец значение "znachenie" с записью в БД тоесть записать туда значение True изначально там находиться false. Я что то не соображу как записать обновление у этих работников с помощью след строки.
А точней в какое место поставить строку в коде. |
||||
|
|||||
AndreyIQ |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
Если я Вас правильно понял, то
Вам вообще не нужен, он только для того чтобы посмотреть список сотрудников уволеных за определенный период, а для того что бы изменить поле znachenie, необходимо просто выполнить следующее
Данный код всем сотрудникам уволеным в период с 20.08.2011 по 20.09.2011 сделает znachenie = true Это сообщение отредактировал(а) AndreyIQ - 29.9.2011, 14:55 |
||||
|
|||||
14SatanA88 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 13.5.2010 Репутация: 1 Всего: 5 |
AndreyIQ, я понял вопрос так же и ответ у меня приблизительно такой же )
ivanfr, чтобы не возникало далее вопросов типа "почему не выполянется запрос" или "почему запрос ничего не возвращает", обязательно прочитай и запомни вот это. Это сообщение отредактировал(а) 14SatanA88 - 29.9.2011, 15:35 |
|||
|
||||
14SatanA88 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 13.5.2010 Репутация: 1 Всего: 5 |
ivanfr, массив тебе не нужен точно.
Это сообщение отредактировал(а) 14SatanA88 - 29.9.2011, 15:35 |
|||
|
||||
ivanfr |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Не совсем правильно, дело в том, что список мне этот нужен для отслеживания уволенных сотрудников, а добавление данных в столбец znachenie=true, чтобы не было повторов при выводе данных из БД. Ведь в самом деле зачем мне одного и того же уволенного сотрудника проверять два раза . Стоит такая задача: 1)Делаю выборку SQL-запросом и смотрю полученные данные в ДБГриде, кто уволился в виде таблицы, - эти данные нужны. 2)Затем я их посмотрел, скопировал, поделал что либо с данными запроса... 3) Далее мне нужно добавить всем найденным (первым запросом) в столбец znachenie = true (я эти данные посмотрел в следующий раз они мне не понадобятся, но фишка в том, что в список(точней в период с 20.08.2011 по 20.09.2011) может попасть сотрудник, который был уволен в эти дни, но в БД его еще нет, а попадет в БД после обработки следующего раза и с датой (периода с 20.08.2011 по 20.09.2011), но при этом в столбце "znachenie" у него уже будет стоять false, потому что при добавлении данных в мою БД им будет по умолчанию ставиться это значение. И вот потом когда я буду делать запрос второй, третий,….. раз я всегда смогу узнать, а не добавлялись ли данные. Вы мне предлагаете использовать следующий запрос код Pascal/Delphi
, который просто добавляет данные в значение столбец "znachenie" не давая возможности предварительно посмотреть список сотрудников. Вот я и спрашиваю, как можно сделать так чтобы данные добавились в столбец "znachenie" после просмотра таблицы SQL-запроса?
Я про это уже читал.
Эт я так чтоб научиться, как из Адоквери получать данные, может пригодиться когда либо. Это сообщение отредактировал(а) ivanfr - 30.9.2011, 05:51 |
||||||||
|
|||||||||
14SatanA88 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 13.5.2010 Репутация: 1 Всего: 5 |
насколько я понял, тебе надо сперва посмотреть на таблицу со всеми сотрудниками, потом пометить уволенных, а потом опять просмотреть таблицу сотрудников, в которой уже не будет видно уволенных. тогда просто выполни последовательно 3 запроса: 1. select... 2. update... 3. select... |
|||
|
||||
AndreyIQ |
|
||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
ЗЫ В коде могут быть ошибки, с АДО не работаю. |
||||||||
|
|||||||||
ivanfr |
|
||||||||||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
В данном случае id - это название ключевого поля или поля счетчика? у меня ключевое поле - 'tabel_nomer' а счетчик id_persona_stor'. Правильно ли я понимаю описание строки обнови в таблице persona_stor значение znachenie на труе с условием совпанения id_persona_stor. Который будет одним и тем же что в запросе Адоквери1 что в таблице БД"persona_stor"? Поля БД access
я это и спрашиал как мне это делать в одном запросе или все-таки раздельно. Можно ли сразу одновремено выполнить выборку и вести на экран тутже записать значения. одним запросом. Это сообщение отредактировал(а) ivanfr - 19.7.2012, 07:28 |
||||||||||||||||
|
|||||||||||||||||
AndreyIQ |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
id_persona_stor
Все верно. |
||||
|
|||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
в данном случае нужно испоьлзовать 2 шт ADOQuery2 первый делает запрос а второй берет данные из первого и помещает в вторым в бд" правильно? Тогда мне нужно задублировать все компоненты, чтоли? Это сообщение отредактировал(а) ivanfr - 19.7.2012, 07:29 |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Вот что у меня получилось.
Огромное всем спасбо что помогли объяснить что да как работает. За примеры, код и запросы... Это сообщение отредактировал(а) ivanfr - 30.9.2011, 11:59 |
|||
|
||||
AndreyIQ |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
Внимание код с комментариями!
|
||||
|
|||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
AndreyIQ
Я конечно по другому сделал. Но так я не умел. Спасибо за пример. Это сообщение отредактировал(а) ivanfr - 30.9.2011, 12:09 |
|||
|
||||
ivanfr |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Выдает ошибку Access violation at address 42BDE073. Read of address 42BDE073. и не хочет добовлять данные бд. Мой выше код работает корректно.
Это сообщение отредактировал(а) ivanfr - 30.9.2011, 12:40 |
||||
|
|||||
AndreyIQ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
Если Вы его без изменений скопировали и не создали QrUpdate, то естественно будет выдавать ошибку. Это сообщение отредактировал(а) AndreyIQ - 30.9.2011, 12:40 |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Точно. блин я ж его не создал.
QrUpdate:=TADOQuery.Create(nil); Добавлено @ 12:51 AndreyIQ Eсть еще одна ошибка? Parameter'id_persona_stor' not found. и такая ошибка : Не возможно найти устанавливанмый ISAM Может Датасурс нужно добавить таким же образом? Это сообщение отредактировал(а) ivanfr - 30.9.2011, 13:39 |
|||
|
||||
superVad |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 735 Регистрация: 6.4.2006 Где: Черкассы, Украина Репутация: 3 Всего: 15 |
ivanfr, я не могу въехать - зачем ты вносишь изменения перебором и кучей запросов - если можно все сделать одним запросом...
|
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
superVad
Ну дык я тут пытаюсь научится. Покажи мастер класс. как это сделать одним запросом? |
|||
|
||||
AndreyIQ |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
Покажите участок кода где ругается и какой запрос в query |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
AndreyIQ
Может это важно поле id_persona_stor не является ключевым. Это сообщение отредактировал(а) ivanfr - 30.9.2011, 13:45 |
|||
|
||||
AndreyIQ |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 185 Регистрация: 5.2.2007 Репутация: 1 Всего: 8 |
Это походу с АДО связано, поэтому хз, я с адо не работаю
А в этой строчке вообще ошибка этого рода не должна вылазить, а вот здесь может
Потому что неуказан QrUpdate.Connection или как там прописывается путь к базе Это сообщение отредактировал(а) AndreyIQ - 30.9.2011, 14:03 |
||||||
|
|||||||
ivanfr |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Проблема решилась сама собой, после удаления ADOConnection1 и создания заново. Видемо что-то сбилось.
после прописания QrUpdate.Connection заработало. Код работает хорошо. привожу полученный результат.
Это сообщение отредактировал(а) ivanfr - 3.10.2011, 05:25 |
||||||
|
|||||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Всем привет!
Немного модифицировал свой код, речь, о котором идет выше. Принцип работы. 1. загружаю данные xls в массив. 2. из массива беру первую строку с данными [B]3. делаю запрос в таблицу БД. 4. пытаюсь импортировать данные из запроса в массив тут и возникает проблема. четвертом пункте в ниже приведённом коде - выдаёт ошибку, зависает Делфи. в таблица содержит следующие данные string, integer?, datatime Массив заполняется до тех пор потока не доходит до ячейки таблице с типом Дата/Время. Хотя я использую тип данных Variant При этом ему по барабану стоит там try except или нет тупо виснет. 4 хочу сравнить одинаковые данные есть или нет?
Помогите решить проблему. Это сообщение отредактировал(а) ivanfr - 19.7.2012, 07:45 |
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Народ помогите избавиться от ошибки.
|
|||
|
||||
ivanfr |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 83 Регистрация: 1.4.2009 Репутация: нет Всего: нет |
Решил проблему. в место Variant использовал WideString.
Попробовал в базе поменя тип поля с Время/Дата на Текстовый. Потом вошёл в Делфи попробал работало нормально. Но мне нужно чтоб было именно дата/время. Вернулся поставли все наместо. Запусил проект, тут выскочило окно с ошибкой, тип поля сейчас WideString, а не точто сохранено в делфе(String). Не долго думая. Заменил тип данных.
Теперь зависания не происходит данные присваиваются как надо. Это сообщение отредактировал(а) ivanfr - 24.7.2012, 13:25 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |