Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
ВнизADO+MS SQL Найти похожие ветки
← →
Steep © (2007-01-06 11:27) [0]Вобщем возник такой вопрос Таблица (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-06 12:00) [1]> Steep (06.01.2007 11:27:00) [0]
Это вообще не из таблиц, это просто бред. Не говоря уж об таинственном проклятии сервера.
Для начала ознакомься с основами SQL, а потом с конкретным диалектом твоего сервера.
← →
Steep © (2007-01-06 12:09) [2]
> Это вообще не из таблиц, это просто бред. Не говоря уж об
> таинственном проклятии сервера.
>
> Для начала ознакомься с основами SQL, а потом с конкретным
> диалектом твоего сервера.
???
там три таблицы: Statistica, Abonent, Tarif
где в статистике указываеться ID абонента и тарифа (связка)
просто нужно вывести вместо ID ФИО у абонента и Название у тарифа (что более логично для пользователся)
это я сделал теперь нужно сделать удаление. При простых запросах (из одной таблицы) все происходит блогополучно.
как я понимаю необходимо сделать клавишу которая вытаскивает из текущей выделенной записи Statistica_ID и удаляет эту запись...
Надеюсь понятно обяснил..
ой забыл в запросе еще from добавить..
← →
Anatoly Podgoretsky © (2007-01-06 12:13) [3]
> ???
Так ты наобум из головы пишешь, вдруг получится, заработает.
Вопросы продолжаешь игнорировать.
← →
Steep © (2007-01-06 12:30) [4]
> Вопросы продолжаешь игнорировать.
Я не вижу ни одного вопроса!
> Так ты наобум из головы пишешь
Да из головы, но вчера пол-ночи над этим бился..
Вроде дажу удалять стало, но как-то глючно (через раз..)
> Для начала ознакомься с основами SQL, а потом с конкретным
> диалектом твоего сервера.
С основами я ознакомился. Все кроме удаления работает.
А что есть диалект моего сервера???
← →
Anatoly Podgoretsky © (2007-01-06 12:45) [5]> Steep (06.01.2007 12:30:04) [4]
Повторяю
Это вообще не из таблиц, это просто бред. Не говоря уж об таинственном проклятии сервера.
← →
Steep © (2007-01-06 12:52) [6]
> Это вообще не из таблиц, это просто бред
Ну может все-таки поможете? Вы же поняли.. А я вас нет...
← →
Anatoly Podgoretsky © (2007-01-06 12:56) [7]Понял? Смеешься, я пока не телепат.
← →
Steep © (2007-01-06 13:19) [8]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 строку???
← →
sniknik © (2007-01-06 13:33) [9]> А я вас нет...
попытайся еще раз. нет такой ошибки "сервер ругаеться", обычно в ошибке расшифровывается что не так/почему не выполнена команда.
вообще в запросе глюк (возможно не связанный с тем о чем вопрос) отсутствует ключевое поле, значит нет значения по которому однозначно можно идентифицировать запись для удаления например.
ну и нет указания после открытия главной таблицы, т.к. есть обледенение то удалять будет пытаться из всех связанных (ну это может так и надо...).
> Надеюсь этот запрос понятен??
про запрос никто не спрашивал... он показан, и значит догадки излишни.
> Как удалить выделенную в Table строку???
попробуй запросом... т.е. попытайся сам на основе имеющихся в выборке/записи значений составить условие для удаления одной записи... может поймешь как это делает ADO, и что ему для этого нужно.
← →
sniknik © (2007-01-06 13:34) [10]обледенение = обьеденение
;)
← →
Anatoly Podgoretsky © (2007-01-06 13:38) [11]> Steep (06.01.2007 13:19:08) [8]
В какой из трех таблиц ты хочешь удалить?
← →
Anatoly Podgoretsky © (2007-01-06 13:40) [12]> sniknik (06.01.2007 13:33:09) [9]
> про запрос никто не спрашивал... он показан, и значит догадки излишни.
Это сейчас текст запроса нормальный, а не тот бред, который изначально был представлен.
← →
Steep © (2007-01-06 13:45) [13]
> нет такой ошибки "сервер ругаеться"
Просто щас не могу сказать что конкретно он писал
> отсутствует ключевое поле
Он не нужен. тк. выводятся все элементы из таблицы Statistica (испытывал
)
> удалять будет пытаться из всех связанных
При удалении из статистики ошибок быть не должно (проверено :)
> обледенение = обьеденение
:)
> В какой из трех таблиц ты хочешь удалить?
Statistica
> Это сейчас текст запроса нормальный, а не тот бред, который
> изначально был представлен.
Извиняйте...
← →
sniknik © (2007-01-06 13:50) [14]> Это сейчас текст запроса нормальный
точно. просто не обратил внимания на отсутствие секции from...
> Просто щас не могу сказать что конкретно он писал
ну, как говорится, на нет и суда/ответа нет...
> Он не нужен. тк. выводятся все элементы из таблицы Statistica (испытывал)
ну раз так считаешь то попробуй сам составить запрос на удаление одной записи, как предлагалось, используя только выбранные в запросе значения...
← →
Steep © (2007-01-06 13:55) [15]
> ну раз так считаешь то попробуй сам составить запрос на
> удаление одной записи, как предлагалось, используя только
> выбранные в запросе значения...
Ну и я думаю как это сделать... Но препод сказал нужно именно так не выводя всяких ID...
← →
sniknik © (2007-01-06 14:05) [16]> Ну и я думаю как это сделать...
подумай подумай, это полезно. как будеш ограничивать удаление одной записью если единственное доступное в выборке (а значит и в условии на удаление) Statistica.Money будет таблице двойным/тройным/т.д. (в нескольких записях одинаковое)?
> Но препод сказал нужно именно так не выводя всяких ID...
ну значит либо он имел ввиду вывод юзеру а не выборку/проверял тебя, понимаешь или нет/сам дурак.
выбирай.
← →
MsGuns © (2007-01-06 17:36) [17]>Steep ©
У Вас в голове каша и поэтому четко Вы не представляете себе, что же Вы делаете не так.
Во-первых, вы путаете способ доступа к объектам БД и сами объекты.
Таблицу Вы называете Table, что наводит сразу на подозрение, что вы используете компоненты "табличного" типа (TTable,TADOTabe,TIDTable и т.д.)
При работе с этими компонентами, действительно, достаточно просто удалять, добавлять и изменять записи. При этом не надо "мучиться" ни с какими "запросами", SQL, транзакциями и т.д. Однако у этой технологии есть несколько существенных минусов, один из которых - жесткая привязка к единственной, причем физической таблице БД. Если, однако, возникает необходимость "подсоединять" для отображения данные из других таблиц (например, справочников, как в Вашем случае) либо вообще находящиеся непонятно в каких таблицах (представления, хранимые процедуры,функции и т.д.), то делается это вовсе не средствами SQL, а с помощью т.н. LookUp - технологии. При этом корректировать справочники нельзя,- это не входит в функционал TXXTable
Однако такой прием бывает весьма удобен (но крайне не полезен, если не сказать - вреден) новичкам, имеющим смутное представление об основах проектирования и фукционирования баз данных. Компоненты этого семейства ориентированы именно не такой, "компонентно-кидательный" уровень разработки приложений. Очевидно, что Вы пошли по этому уровню, что дополнительно доказывает использование такого безполезного для профессионального разработчика компонента, как TDBNavigator
В то же время Вы используете не табличный компонент, а запросный. Подойти к которому тытаетесь с "табличными" мерками. Однако это возможно далеко не всегда, о чем можно почитать в соответствующих справках. Возвращаемый запросом набор данных (TDataSet) может быть редактируемым (т.е. на него можно воздействовать методами Insert, Edit, Post, Delete и т.д.) только при соблюдении достаточно жестких условий, которые несколько различны для разных технологий. Например, почти всегда НД не редактируем, если в запросе имеются агрегаты (Sum,Count,Avg...) или используются связки несколько таблиц БД
В ситуациях, когда отображаемый НД не может редактироваться напрямую указанными выше методами, используют технологию "Один запрос читает, другой пишет, потом первый перечитывает", либо используют некоторые "примочки", любезно предоставленные программистам разработчиками Delphi (TUpdateObject, TUpdateSQL и т.д.), где реализуется тот же подход, но программист этого как бы "не видит" ;))
Во-вторых, у Вас путаница в первообразующих любые БД терминах:
Основная Ваша таблица не имеет уникального идентификатора, что может приводить к непредсказуемым результатам при любой правке таблицы. Возможно, именно на это "намекает" сервер, когда отказывается выполнить Вашу "команду" (скрытно от Вас переделанной делфей в запрос) на удаление или изменение записи.
В-третьих. Непонятно, почему Ваш "препод" насильно заставляет Вас итти неправильныи путем, уча работать в стиле батонокидательства, а-ля Фаронов-Архангельский.
Или Вы его неверно поняли ?
← →
MsGuns © (2007-01-06 17:40) [18]Пардон, в первом абзаце фрагмент
"либо вообще находящиеся непонятно в каких таблицах (представления, хранимые процедуры,функции и т.д.),"
писАлся для второго абзаца, где речь идет о "запросном" методе, а не о реализации "справочных ссылок", упоминаемой в абз. 1.
← →
Anatoly Podgoretsky © (2007-01-06 18:15) [19]> Steep (06.01.2007 13:45:13) [13]
> Просто щас не могу сказать что конкретно он писал
А на фига тогда пишешь, ты сначала подготовься
← →
Steep © (2007-01-07 15:28) [20]Я перепутал Table с TDBGrid :)
Не подскажете как вытащить из веделенной строке в TDBGrid Значение из колонки (если можно с заданым именем или № по порядку (слева))
← →
try (2007-01-07 15:35) [21]
> Не подскажете как вытащить из веделенной строке
> Значение из колонки
в TDBGrid нет никаких значений.
← →
sniknik © (2007-01-07 15:47) [22]выделенной
DBGrid1.SelectedField.AsString
по порядку слева
DBGrid1.Columns[0].Field.AsString
только это не из TDBGrid а по ссылкам ссылающимся на dataset (т.е. реально данные оттуда).
← →
MsGuns © (2007-01-07 15:48) [23]>Steep © (07.01.07 15:28) [20]
>Не подскажете как вытащить из веделенной строке в TDBGrid Значение из колонки (если можно с заданым именем или № по порядку (слева))
TDBGrid отображает записи связанного с ним датасета. Именно датасет "хранит" информацию, а не грид.
Чтобы получить доступ к полям записинадо соответственно и обращаться к их владельцу - датасету. Способов много, но все они "пляшут" от одного из ключевых свойств - объектов датасета, - коллекции полей (филдов). Например, FieldByName("<имя поля>") или Fields[<индекс поля в коллекции>] - при этом в переменные запишется содержимое поля ТЕКУЩЕЙ ЗАПИСИ датасета, которая в гриде выделяется как текущая.
Обратиться к содержимому поля, отображаемого в текущей ячейке грида можно и через грид, используя уже уго коллекцию стоблцов. Например,
sID := DBGrid1.Colimns[0].Field.AsString;
← →
MsGuns © (2007-01-07 15:50) [24]Вообще, я бы запрещал новичкам писать программы с БД до тех пор, пока не сдадут экзамен по TDataSet
← →
Steep © (2007-01-07 16:12) [25]Спасибо!
> MsGuns ©
Вот и скажи это преподам моего универа...
← →
Anatoly Podgoretsky © (2007-01-07 16:21) [26]> Steep (07.01.2007 16:12:25) [25]
Опять предподователи виноваты, ну кто угодно, кромя себя бедного.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.01.28;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.039 c