Страница 1 из 1

Примеры с SQL запросами.AdoQuery

Добавлено: 11 янв 2007, 21:51
Dr_Grizzly
Всем привет! Использую в программе adoquery и прям в рабочем состоянии накладываю фильтры с помощью sql и делаю изменения. Но не всегда все получается. Например - есть поле data формат - Дата/Время. Пытаюсь написать следующее:
Select * from fio where data='10.11.2006'
При выполнении ругается на несовпадение типов. Чего ей не хватает?? Без опострофов тоже ругается.

Второй вопрос, какой синтаксис имеют запросы Delete и Update ?

И еще вопрос:
В базе есть незаполненные поля, хочу вывести их,
пытаюсь сделать следующее:
Select * from FIO where doc =''
Результат - ничего не выводит. Зато если задать doc<>'', тогда показывает записи.
Поле doc - текстовое.

Re: Примеры с SQL запросами.AdoQuery

Добавлено: 12 янв 2007, 04:54
SergeyS

Код: Выделить всё

// у тебя
Select * from fio where data='10.11.2006'
// нужно
Select * from fio where data='2006.12.01' 
// или 
Select * from fio where data=13334
// где 13334 есть цифровое представление даты
Второй вопрос, какой синтаксис имеют запросы Delete и Update ?
Для меня это тоже вопрос :) Но эмпирическим путём удалось выяснить следующее:
- обновляются только поля имеющие изменения
- обновляются все таблицы используемые в запросе (если запрос возвращает поля более чем из одной таблицы, и значения полей изменяются более чем в одной таблице, то обновляются значения во всех изменённых таблицах)
- в TADOQuery для каждого поля можно дополнительно задать признак (не помню название атрибута), в котором указывается какую роль играет данное поле в обновлении.

А вот удаление я так и не понял как работает. Если таблица в запросе одно, то удаление осуществляется без проблем, а если их несколько у меня сложилось ощущение, что TADOQuery пытается удалить записи во всех таблицах.

Посему данный вопрос считаю актуальным и тоже хотел бы узнать мнение других.
В базе есть незаполненные поля, хочу вывести их,
пытаюсь сделать следующее:
Select * from FIO where doc =''
Результат - ничего не выводит. Зато если задать doc<>'', тогда показывает записи.
Поле doc - текстовое.
Нужно сделать так:
Select * from FIO where doc is null

Re: Примеры с SQL запросами.AdoQuery

Добавлено: 12 янв 2007, 15:10
Dr_Grizzly
// нужно
Select * from fio where data='2006.12.01'
// или
Select * from fio where data=13334
// где 13334 есть цифровое представление даты

1-й способ не работает, говорит не совпадение типов.
Второй проглатила, но ничего не вывела, а как узнать числовое представление любой другой даты?

Нужно сделать так:
Select * from FIO where doc is null

Выводит пустую строку. Равносильно - Select * from FIO where doc=null, результат такой же.
А если поменять на Select * from FIO where doc<>"" - то откидывает строки где data пустая и показывает строки где есть данные. Абсурд какой-то!!!!!

Как нужно написать чтоб удалить записи по условию? Delete <имя таблицы> where <условие>. Такой синтаксис?

Re: Примеры с SQL запросами.AdoQuery

Добавлено: 12 янв 2007, 19:54
SergeyS
код select * from fio where data='2006.12.01' у меня работает (ADO SQL Server 2000)
попробуй передать дату в таких форматах '2006/12/01', '20061201'. Попробуй указать с двойными кавычками (хотя уверен что не пойдёт)
Укажи с какой базой работаешь через ADO (SQL Server, Access, Excel ...)
По поводу приведения даты к числу: возми переменную TDateTime, приведи её к Integer вот и получишь нужное тебе число.
А лучше попробуй определить параметр у запроса типа DateTime
//select * from fio where data=:date1
где :date1 можно настроить через свойство TADOQuery.Parameters - лучшее решение

По поводу выбора пустых строк (select * from FIO where doc is null)
У тебя поле какого типа? Если varchar(100), то предыдущие коды должны работать, если char(100) то "пустая" строка на самом деле будет являться строкой из 100 пробелов. Попробуй сделать так:
select * from FIO where righttrim(isnull(doc, '')) = ''
функция righttrim должна удалить все пробелы с правой стороны строки (она может называться rtrim - не помню), isnull я добавил для полноты картины.

Удаление. Синтаксис такой:
delete from FIO where doc = 'Иванов'

P.S. У тебя хоть какой-нибудь хэлп стоит?

Re: Примеры с SQL запросами.AdoQuery

Добавлено: 13 янв 2007, 09:30
Dr_Grizzly
P.S. У тебя хоть какой-нибудь хэлп стоит?

Я уже 3-й день ковыряю и-нет в поисках хелпа, нашел SQL/89 но там не такое построение, мне нужен SQL/92. Нашел хелп по MySql но опять же не такое построение, там какие-то :== а у меня это не понимает.

Ща попробую со строками и датой

Re: Примеры с SQL запросами.AdoQuery

Добавлено: 13 янв 2007, 10:05
Dr_Grizzly
УРАААААААА!!!!! НАШЕЛ!!!НАШЕЛ!!!НАШЕЛ!!!НАШЕЛ!!!НАШЕЛ!!!НАШЕЛ!!!НАШЕЛ!!!
Select * from FIO where data=DateValue('12/10/2006') - РАБОТАЕТ!!!

Посидел, почесал репу, залез в сам Аксес (У меня 2003 офис) защел в запросы, выбрал SQL запрос, и нажал F1 А там все что мне нада да еще и на русском :)

Хе, но не могу найти как указать пустую дату ;) data=DateValue('') - не канает.

Еще проблемка, почему-то не канает дата в формате дд/мм/гг.

Вот что сказано в хелпе:

При указании аргумента условиеОтбора литералы даты (символы дат) должны вводиться в американском формате, даже если используется неамериканская версия ядра базы данных Jet. Например, дата 10 мая 1996 года записывается в России как 10.05.96, а в США как 5/10/96. Обязательно заключите даты в символы «решетки» (#), как показано в следующих примерах.

Для отбора записей с этой датой в российской базе данных необходимо использовать следующую инструкцию SQL:

SELECT *
FROM Заказы
WHERE ДатаИсполнения = #5/10/96#;

Кроме того, можно применять функцию DateValue, которая поддерживает международные стандарты, заданные в Microsoft Windows®. Например, для отбора записей в американской базе данных создайте текст программы:

SELECT *
FROM Заказы
WHERE ДатаИсполнения = DateValue('5/10/96');

Для российской базы данных текст программы будет выглядеть так:

SELECT *
FROM Заказы
WHERE ДатаИсполнения = DateValue('10.5.96');

Re: Примеры с SQL запросами.AdoQuery

Добавлено: 13 янв 2007, 10:20
Dr_Grizzly
А вот то что тебе было интересно, по поводу нескольких таблиц при удалении.

DELETE [таблица.*]
FROM таблица
WHERE условиеОтбора

Ниже перечислены аргументы инструкции DELETE:

Элемент Описание

таблица Необязательное имя таблицы, из которой удаляются записи.
таблица Имя таблицы, из которой удаляются записи.
условие Отбора Выражение, определяющее удаляемые записи.


Дополнительные сведения
Инструкция DELETE особенно удобна для удаления большого количества записей.

Чтобы удалить из базы данных целую таблицу, можно использовать метод Execute вместе с инструкцией DROP. Однако при таком удалении таблицы теряется ее структура. Если же применить инструкцию DELETE, удаляются только данные. При этом сохраняются структура таблицы и все остальные ее свойства, такие как атрибуты полей и индексы.

Инструкцию DELETE можно использовать для удаления записей из таблиц, связанных отношением «один-ко-многим» с другими таблицами. Операции каскадного удаления приводят к удалению записей из таблиц, находящихся на стороне отношения «многие», когда в запросе удаляется соответствующая им запись на стороне «один». Например, в отношении между таблицами «Клиенты» и «Заказы», таблица «Клиенты» расположена на стороне «один», а таблица «Заказы» - на стороне «многие». Если разрешено каскадное удаление, то удаление записи из таблицы «Клиенты» приводит к удалению соответствующих записей из таблицы «Заказы».

Re: Примеры с SQL запросами.AdoQuery

Добавлено: 13 янв 2007, 15:34
SergeyS
Видно когда я первый раз давал ответ, то отвечал со своей "колокольни". Просто на днях промучился с этим ADO.

Суть проблемы такова (тоже про update, insert, delete):
Есть TADOQuery. В ADO он может быть редактируемым и прекрасно редактируется (например с помощью DBGrid можно спокойно добавлять записи, изменять их и удалять).
Если в запросе одна таблица все ОК, но если в запросе участвует более одной таблицы, возникают проблемы. Например:
даны две таблицы:
[Клиенты] ([Код клиента], [ФИО], [Код города])
[Города] ([Код города], [Город])
Связи между ними понятны и так.

Делаю следующий запрос в TADOQuery:
select a.ФИО, b.Город
from [Клиенты] a, [Города] b
where a.[Код города] = b.[Код города]

Вывожу я данный результа в гридину и редактирую.
Добавление, изменение работает на ура (причем если я изменю название города и ФИО клинета то обновятся обе таблицы).
Проблема возникла при попытке удаления - удаляются записи из обоих таблиц.

Как указать ADOQuery из какой таблицы нужно удалять записи?

У стандартного Query который BDE было прекрасное расширение TQueryUpdate, где можно было однозначно указать что обновлять, что удалять, что добавлять. А в ADO сплошные потемки.

Re: Примеры с SQL запросами.AdoQuery

Добавлено: 21 янв 2007, 02:39
AiK
Видимо уже не актуально, но видимо у топикстартера есть некоторая путаница в пустых значениях (="") и неопределённых значениях (is null)