Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO+MS SQL [D7, XP]


Страницы:   1 2

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]

Понял? Смеешься, я пока не телепат.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо