![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ADO+MS SQL [D7, XP]
Steep © (2007-01-06 11:27:00)Вобщем возник такой вопрос Таблица (Table) связано с AdoQuery в запросе я собираю данные с разных таблиц и вывожу
with ADOQuery.SQL do
begin
Clear;
Add('SELECT Statistica.Money as ''Деньги'', '+
'Abonent.Name as ''ФИО'', '+
'Tarif.Name as ''Название Тарифа'', '+
'WHERE (Statistica.Tarif_ID=Tarif.Tarif_ID, '+
'Statistica.Abonent_ID=Abonent.Abonent_ID)'
)
end;
Еще на форме есть DB.Navigator если с помощью него удалять любую строку из таблицы (сего запроса) то сервер ругаеться как я понял из-за того что это из разных таблиц...
Вопрос как коректно удалиться (можно при помощи Навигатора или отдельной кнопкой (текущую запись))
Anatoly Podgoretsky (2007-01-07 16:21:00) [1]> Steep (07.01.2007 16:12:25) [25]
Опять предподователи виноваты, ну кто угодно, кромя себя бедного.
Steep (2007-01-07 16:12:00) [2]Спасибо!
> MsGuns ©
Вот и скажи это преподам моего универа...
MsGuns (2007-01-07 15:50:00) [3]Вообще, я бы запрещал новичкам писать программы с БД до тех пор, пока не сдадут экзамен по TDataSet
MsGuns (2007-01-07 15:48:00) [4]>Steep © (07.01.07 15:28) [20]
>Не подскажете как вытащить из веделенной строке в TDBGrid Значение из колонки (если можно с заданым именем или № по порядку (слева))
TDBGrid отображает записи связанного с ним датасета. Именно датасет "хранит" информацию, а не грид.
Чтобы получить доступ к полям записинадо соответственно и обращаться к их владельцу - датасету. Способов много, но все они "пляшут" от одного из ключевых свойств - объектов датасета, - коллекции полей (филдов). Например, FieldByName('<имя поля>') или Fields[<индекс поля в коллекции>] - при этом в переменные запишется содержимое поля ТЕКУЩЕЙ ЗАПИСИ датасета, которая в гриде выделяется как текущая.
Обратиться к содержимому поля, отображаемого в текущей ячейке грида можно и через грид, используя уже уго коллекцию стоблцов. Например,
sID := DBGrid1.Colimns[0].Field.AsString;
sniknik (2007-01-07 15:47:00) [5]выделенной
DBGrid1.SelectedField.AsString
по порядку слева
DBGrid1.Columns[0].Field.AsString
только это не из TDBGrid а по ссылкам ссылающимся на dataset (т.е. реально данные оттуда).
try (2007-01-07 15:35:00) [6]
> Не подскажете как вытащить из веделенной строке
> Значение из колонки
в TDBGrid нет никаких значений.
Steep (2007-01-07 15:28:00) [7]Я перепутал Table с TDBGrid :)
Не подскажете как вытащить из веделенной строке в TDBGrid Значение из колонки (если можно с заданым именем или № по порядку (слева))
Anatoly Podgoretsky (2007-01-06 18:15:00) [8]> Steep (06.01.2007 13:45:13) [13]
> Просто щас не могу сказать что конкретно он писал
А на фига тогда пишешь, ты сначала подготовься
MsGuns (2007-01-06 17:40:00) [9]Пардон, в первом абзаце фрагмент
"либо вообще находящиеся непонятно в каких таблицах (представления, хранимые процедуры,функции и т.д.),"
писАлся для второго абзаца, где речь идет о "запросном" методе, а не о реализации "справочных ссылок", упоминаемой в абз. 1.
MsGuns (2007-01-06 17:36:00) [10]>Steep ©
У Вас в голове каша и поэтому четко Вы не представляете себе, что же Вы делаете не так.
Во-первых, вы путаете способ доступа к объектам БД и сами объекты.
Таблицу Вы называете Table, что наводит сразу на подозрение, что вы используете компоненты "табличного" типа (TTable,TADOTabe,TIDTable и т.д.)
При работе с этими компонентами, действительно, достаточно просто удалять, добавлять и изменять записи. При этом не надо "мучиться" ни с какими "запросами", SQL, транзакциями и т.д. Однако у этой технологии есть несколько существенных минусов, один из которых - жесткая привязка к единственной, причем физическойтаблице БД. Если, однако, возникает необходимость "подсоединять" для отображения данные из других таблиц (например, справочников, как в Вашем случае) либо вообще находящиеся непонятно в каких таблицах (представления, хранимые процедуры,функции и т.д.), то делается это вовсе не средствами SQL, а с помощью т.н. LookUp - технологии. При этом корректировать справочники нельзя,- это не входит в функционал TXXTable
Однако такой прием бывает весьма удобен (но крайне не полезен, если не сказать - вреден) новичкам, имеющим смутное представление об основах проектирования и фукционирования баз данных. Компоненты этого семейства ориентированы именно не такой, "компонентно-кидательный" уровень разработки приложений. Очевидно, что Вы пошли по этому уровню, что дополнительно доказывает использование такого безполезного для профессионального разработчика компонента, как TDBNavigator
В то же время Вы используете не табличный компонент, а запросный. Подойти к которому тытаетесь с "табличными" мерками. Однако это возможно далеко не всегда, о чем можно почитать в соответствующих справках. Возвращаемый запросом набор данных(TDataSet) может быть редактируемым (т.е. на него можно воздействовать методами Insert, Edit, Post, Delete и т.д.) только при соблюдении достаточно жестких условий, которые несколько различны для разных технологий. Например, почти всегда НД не редактируем, если в запросе имеются агрегаты (Sum,Count,Avg...) или используются связки несколько таблиц БД
В ситуациях, когда отображаемый НДне может редактироваться напрямую указанными выше методами, используют технологию "Один запрос читает, другой пишет, потом первый перечитывает", либо используют некоторые "примочки", любезно предоставленные программистам разработчиками Delphi (TUpdateObject, TUpdateSQL и т.д.), где реализуется тот же подход, но программист этого как бы "не видит" ;))
Во-вторых, у Вас путаница в первообразующих любые БД терминах:
Основная Ваша таблица не имеет уникального идентификатора, что может приводить к непредсказуемым результатам при любой правке таблицы. Возможно, именно на это "намекает" сервер, когда отказывается выполнить Вашу "команду" (скрытно от Вас переделанной делфей в запрос) на удаление или изменение записи.
В-третьих. Непонятно, почему Ваш "препод" насильно заставляет Вас итти неправильныи путем, уча работать в стиле батонокидательства, а-ля Фаронов-Архангельский.
Или Вы его неверно поняли ?
sniknik (2007-01-06 14:05:00) [11]> Ну и я думаю как это сделать...
подумай подумай, это полезно. как будеш ограничивать удаление одной записью если единственное доступное в выборке (а значит и в условии на удаление) Statistica.Money будет таблице двойным/тройным/т.д. (в нескольких записях одинаковое)?
> Но препод сказал нужно именно так не выводя всяких ID...
ну значит либо он имел ввиду вывод юзеру а не выборку/проверял тебя, понимаешь или нет/сам дурак.
выбирай.
Steep (2007-01-06 13:55:00) [12]
> ну раз так считаешь то попробуй сам составить запрос на
> удаление одной записи, как предлагалось, используя только
> выбранные в запросе значения...
Ну и я думаю как это сделать... Но препод сказал нужно именно так не выводя всяких ID...
sniknik (2007-01-06 13:50:00) [13]> Это сейчас текст запроса нормальный
точно. просто не обратил внимания на отсутствие секции from...
> Просто щас не могу сказать что конкретно он писал
ну, как говорится, на нет и суда/ответа нет...
> Он не нужен. тк. выводятся все элементы из таблицы Statistica (испытывал)
ну раз так считаешь то попробуй сам составить запрос на удаление одной записи, как предлагалось, используя только выбранные в запросе значения...
Steep (2007-01-06 13:45:00) [14]
> нет такой ошибки "сервер ругаеться"
Просто щас не могу сказать что конкретно он писал
> отсутствует ключевое поле
Он не нужен. тк. выводятся все элементы из таблицы Statistica (испытывал
)
> удалять будет пытаться из всех связанных
При удалении из статистики ошибок быть не должно (проверено :)
> обледенение = обьеденение
:)
> В какой из трех таблиц ты хочешь удалить?
Statistica
> Это сейчас текст запроса нормальный, а не тот бред, который
> изначально был представлен.
Извиняйте...
Anatoly Podgoretsky (2007-01-06 13:40:00) [15]> sniknik (06.01.2007 13:33:09) [9]
> про запрос никто не спрашивал... он показан, и значит догадки излишни.
Это сейчас текст запроса нормальный, а не тот бред, который изначально был представлен.
Anatoly Podgoretsky (2007-01-06 13:38:00) [16]> Steep (06.01.2007 13:19:08) [8]
В какой из трех таблиц ты хочешь удалить?
sniknik (2007-01-06 13:34:00) [17]обледенение = обьеденение
;)
sniknik (2007-01-06 13:33:00) [18]> А я вас нет...
попытайся еще раз. нет такой ошибки "сервер ругаеться", обычно в ошибке расшифровывается что не так/почему не выполнена команда.
вообще в запросе глюк (возможно не связанный с тем о чем вопрос) отсутствует ключевое поле, значит нет значения по которому однозначно можно идентифицировать запись для удаления например.
ну и нет указания после открытия главной таблицы, т.к. есть обледенение то удалять будет пытаться из всех связанных (ну это может так и надо...).
> Надеюсь этот запрос понятен??
про запрос никто не спрашивал... он показан, и значит догадки излишни.
> Как удалить выделенную в Table строку???
попробуй запросом... т.е. попытайся сам на основе имеющихся в выборке/записи значений составить условие для удаления одной записи... может поймешь как это делает ADO, и что ему для этого нужно.
Steep (2007-01-06 13:19:00) [19]Select Statistica.Money, Abonent.AName, Tarif.TName
From Statistica, Abonent, Tarif
Where (Statistica.Abonent_ID=Abonent.Abonent_ID,
Statistica.Tarif_ID=Tarif.Tarif_ID)
Выбыраем три поля из разных таблиц, где таблицы вкл. следующие поля
Statistica: Money, Abonent_ID, Tarif_ID, Statistica_ID
Abonent: Abonent_ID, AName
Tarif: Tarif_ID, TName
Надеюсь этот запрос понятен??
в Table выводяться таблица Statistica где вместо Abonent_ID и Statistica.Tarif_ID выводяться ФИО и название
Как удалить выделенную в Table строку???
Anatoly Podgoretsky (2007-01-06 12:56:00) [20]Понял? Смеешься, я пока не телепат.