Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: СУБД и Delphi/Lazarus

  Все выпуски  

RusFAQ.ru: СУБД и Delphi


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / СУБД и Delphi

Выпуск № 342
от 11.06.2007, 11:35

Администратор:Gh0stik
В рассылке:Подписчиков: 333, Экспертов: 49
В номере:Вопросов: 4, Ответов: 9


Вопрос № 90094: Приветствую! Ответьте пожалуйста на такие вопосы: 1. Я работаю с SQL-сервером (MS SQL 2000) и Delphi 7 (компонент DBGrid). Не получается с удалением записи. Как удалить выделенную запись из базы SQL? Как удалить несколько выделенных записей и...
Вопрос № 90095: Здравствуйте уважаемые эксперты!!! Вы не могли бы подсказать как осуществить поиск по базе данных в Delphi, после ввода каждой буквы, что бы сортировка шла, а не сразу по целому слову, через компонент TQuery, ну или если можно через другой компон...
Вопрос № 90148: Здравствуйте! Помогите пожалуйста - есть Image1, который рисуется в виде графика. Для него надо сделать предварительный просмотр на новом Image2 с учетом задавемого коэффициента масштабирования и разделением на страницы. Затем надо вывести на пе...
Вопрос № 90181: Можно ли создать фильтр по значениям двух DateTimePicker'ов(нужны сведения о покупках за определенный период)? Очень НАДО!!! Для одного работает так: ...

Вопрос № 90.094
Приветствую!
Ответьте пожалуйста на такие вопосы:
1. Я работаю с SQL-сервером (MS SQL 2000) и Delphi 7 (компонент DBGrid). Не получается с удалением записи. Как удалить выделенную запись из базы SQL? Как удалить несколько выделенных записей из базы SQL? Как узнать текст в первой ячейке выделенной строки (независимо от столбца, на котором стоит курсор)?
Если я делаю так, то удаляются обсолютно все записи:
DM.ADOQuery1.SQL.Clear;
DM.ADOQuery1.SQL.Add('Delete from Personal');
DM.ADOQuery1.SQL.Add('where ТН = ТН');
DM.ADOQuery1.ExecSQL;
2. Есть две таблицы в SQL и два GRIDа на форме, как их можно связать между собой. Допустим, чтобы при выборе записи в первом GRIDe (соответственно таблица SQL - Table1), показывались записи во втором GRIDe (из таблицы SQL - Table2), относящиеся только к выбранной записи в первом. ID1 (в первом) = ID2 (во втором). Надеюсь задача понятна.

Заранее огромное спасибо за уделенное время.
Отправлен: 05.06.2007, 12:01
Вопрос задал: xXx (статус: 6-ой класс)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: ВладимирР.
Здравствуйте, xXx!

1. Ваша ошибка в том, что Вы указываете в условии, что "значение в поле ТН равно значению в поле ТН", естественно, что удаляются все записи.
Чтобы удалить какие-то записи, нужно правильно записать условие WHERE в SQL. Универсальным способом является использование параметров в запросе.
Например: удаляем записи с заданным именем пользователя:
-->
ADOQuery1.SQL.Add('DELETE FROM Personal WHERE UserName=:UserName');
ADOQuery1.Parameters.ParseSQL(ADOQuery1.SQL.Text, True);
ADOQuery1.Prepared := True;
<--
Мы подготовили запрос. Подготовка нужна, если Вы будете вызывать этот запрос многократно.
Теперь, чтобы выполнить запрос нужно определить значение параметра и вызвать ExecSQL:
-->
ADOQuery1.Parameters[0].Value := 'Вася';
ADOQuery1.ExecSQL;
<--
Теперь мы удалили все записи, где имя пользователя было "Вася"
Более подробно про использование параметров посмотрите в справке.

2. Для решения Вашей задачи можно использовать событие TDataSet.AfterScroll
Это событие происходит при изменении текущей записи. Напишите обработчик для dataset, который обслуживает первую таблицу, примерно такого вида:
procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
begin
ADOQuery2.Close;
ADOQuery2.Parameters.ParamByName('ID2').Value := TADOQuery(DataSet).FieldByName('ID1').Value;
ADOQuery2.Open;
end;
Это будет работать, если Вы используете параметры как в ответе 1.

Удачи.
Ответ отправил: ВладимирР. (статус: 1-ый класс)
Ответ отправлен: 05.06.2007, 13:50
Оценка за ответ: 3
Комментарий оценки:
Я знаю как удалить однотипные записи из базы (одно и тоже имя, и т.п.). Мне нужно удалить выбранную запись из базы. Допустим, я понимаю так: я выбрал запись, нажал удалить, запрос смотрит чему равно поле ID у записи, т.к. оно у меня не повторяется, и передает запрос на удаление записей с таким полем, соответственно удаляется одна запись.

Отвечает: Виктор Пырлик
Здравствуйте, xXx!
Дополню предыдущий ответ:
Для связи таблиц (синхронный просмотр) необходимо:
Для TTable и TQuery определить свойство MasterSource. В TTable есть возможность после этого определить и поля, по которым будет ключевание, в TQuery достаточно записать запрос на выборку:
SELECT * FROM TABLE WHERE ID1 = :ID2
При этом, параметр (название) ID2 должен соответствовать названию поля в «родительской» таблице, которое является ключевым (по которому мы хотим фильтровать записи в «дочерней» таблице).
Для TQuery это может быть так:
SELECT * FROM PERSONAL WHERE ID1 =:ID2
И указать в свойстве MasterSource датасет той таблицы, которая для нас главная.


---------
Надо пребывать господа, пребывать! Иначе ничего не получится!
Ответ отправил: Виктор Пырлик (статус: 3-ий класс)
Ответ отправлен: 05.06.2007, 14:17
Оценка за ответ: 4
Комментарий оценки:
Спасибо за ответ...

Отвечает: Delph
Здравствуйте, xXx!

1. Во первых - нужно заполучить значение TH. Можно использовать стандартное свойство Table и Query FieldByName('TH').AsString, например так:

str := MyTable.FieldByName('Remark').AsString; // - для числового поля или
str := #39 + MyTable.FieldByName('Remark').AsString + #39; // - для строки.

#39 здесь выступает как код одинарной кавычки (некоторые из символов мне удобнее заносить в строки через их коды). Теперь в str хранится значение TH из той строки, на которую указывает курсор Grid'а (независимо от выделенного столбца). Во вторых - слегка переделать запрос:

DM.ADOQuery1.SQL.Clear;
DM.ADOQuery1.SQL.Add('Delete from Personal');
DM.ADOQuery1.SQL.Add('where ТН = ' + str);
DM.ADOQuery1.ExecSQL;

Теперь удалится только активная строка.

2. В визуальном редакторе формы выберите Table2. Object Inspector должен отобразить все свойства компонента Table2. Выберите свойство MasterSource, в выпадающем списке выберите DataSource1 (или тот DataSource, который настроен на первую таблицу Table1). Это даст возможность привязать подчинённую таблицу к главной. Теперь выберите MasterFields (в инспекторе объектов будет прямо над MasterSource). Нажмите на маленькую кнопку с тремя точками, и у вас откроется Field Link Designer (дизайнер связей). В верхней части будет 2 списка. В левом выберите поле подчинёной таблицы, в правом - соответствующее поле главной. Должна активироваться кнопка Add. Нажмите её. Внизу отобразится связь. Нажмите кнопку Ok. Ура! Связь наложена!
Ответ отправил: Delph (статус: 3-ий класс)
Ответ отправлен: 06.06.2007, 10:50


Вопрос № 90.095
Здравствуйте уважаемые эксперты!!!
Вы не могли бы подсказать как осуществить поиск по базе данных в Delphi, после ввода каждой буквы, что бы сортировка шла, а не сразу по целому слову, через компонент TQuery, ну или если можно через другой компонент, то через другой.....Я задавал уже этот вопрос, но не моглибы вы ещё раз ответить, а то у меня винт сгорел и вся инфа полетела??
Отправлен: 05.06.2007, 12:06
Вопрос задал: Линецкий (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Timoshin A.B.
Здравствуйте, Линецкий!
Можно использовать для любого набора данных
opts : TLocateOptions;
opts:=[loPartialKey];
Query1.Locate(FieldName,Value,opts); - первое, которое содержит.

если opts:=[loCaseInsensitive] - то только полное совпадение.

---------
Борюсь с нехваткой "мозгов"...
Ответ отправил: Timoshin A.B. (статус: Студент)
Ответ отправлен: 05.06.2007, 12:45

Отвечает: Виктор Пырлик
Здравствуйте, Линецкий!
Это можно реализовать в событии визуального компонента (любого) OnKeyDown
В методе реализовать вызов процедуры любого компанента доступа к данным TTable, TQuery, TADOTable TIBTable и даже процедур – у них у всех есть метод Locate.

TQuery1.Locate('pole1', Edit1.Text, [loCaseInsensitive, loPartialKey]);

Второй вариант:
Пишем типа такого:

Query1.DisableControls;
Query.Active := false;
Query1.SQ.Clear;
Query1.SQL.Add(Format(‘SELECT * FROM MYTABLE WHERE POLE1 LIKE ‘%s%’,[Edit1.Text]));
Query.Active := true;
Query1. EnableControls;
Надо понимать, что это сильно нагружает транспортный поток м/у клиентом и базой, да и сам сервер тоже.

---------
Надо пребывать господа, пребывать! Иначе ничего не получится!
Ответ отправил: Виктор Пырлик (статус: 3-ий класс)
Ответ отправлен: 05.06.2007, 14:20


Вопрос № 90.148
Здравствуйте!
Помогите пожалуйста - есть Image1, который рисуется в виде графика. Для него надо сделать предварительный просмотр на новом Image2 с учетом задавемого коэффициента масштабирования и разделением на страницы. Затем надо вывести на печать выбранную страницу(ы).Может кто подскажет где можно посмотреть примеры аналогичных задач. Спасибо.
Отправлен: 05.06.2007, 16:31
Вопрос задала: Luchiki (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Примак Руслан Николаевич
Здравствуйте, Luchiki!

Я бы вам советовал использовать стандартный компонент TChart, который позволяет не только эффективно рисовать графики, но и осуществлять масштабирование, предпросмотр и печать. По нему очень хорошая справка с примерами - я думаю, это то что вам нужно, если только это у вас не учебная задача.

Иначе используйте следующие следующие инструменты:
Объект TPrinter - для предпросмотра и печати;
Метод Canvas.CopyRect: позволит вам скопировать исходный прямоугольник маленького размера в прямоугольник большого размера, и наоборот, при копировании происходит масштабирование.
Ответ отправил: Примак Руслан Николаевич (статус: 2-ой класс)
Ответ отправлен: 05.06.2007, 18:11
Оценка за ответ: 5
Комментарий оценки:
Спасибо большое,компонент сам для построения мне не подходит, а вот про примеры я забыла, может найду нужное мне.


Вопрос № 90.181
Можно ли создать фильтр по значениям двух DateTimePicker'ов(нужны сведения о покупках за определенный период)? Очень НАДО!!!
Для одного работает так:

Приложение:

Отправлен: 05.06.2007, 20:31
Вопрос задал: Tobz88 (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Timoshin A.B.
Здравствуйте, Tobz88!
Можно, в данном случае DateTimePicker1 - задаёт начало периода, а DateTimePicker2 - конец.
Удачи.

Приложение:

---------
Борюсь с нехваткой "мозгов"...

Ответ отправил: Timoshin A.B. (статус: Студент)
Ответ отправлен: 06.06.2007, 00:58

Отвечает: Delph
Здравствуйте, Tobz88!

Попробуйте так:
DataModule2.ADOTable7.Filter := 'дата between ' + DateToStr(DateTimePicker1.Date) + ' and ' + DateToStr(DateTimePicker2.Date);

Смысл такой: "FieldName BETWEEN Value1 AND Value2" означает выборку тех записей, значение FieldName у которых лежит между (Between) Value1 и Value2, включая границы диапазона Value1 и Value2.
Ответ отправил: Delph (статус: 3-ий класс)
Ответ отправлен: 06.06.2007, 11:19

Отвечает: Виктор Пырлик
Здравствуйте, Tobz88!
Очень удобно использовать функцию Format (аналог sprintf)
Например так:
DataModule2.ADOTable7.Filter:= Format('дата bethwen ''%s'' and ''%s''',[DateToStr(DateTimePicker1.Date),DateToStr(DateTimePicker2.Date)]);

---------
Надо пребывать господа, пребывать! Иначе ничего не получится!
Ответ отправил: Виктор Пырлик (статус: 3-ий класс)
Ответ отправлен: 06.06.2007, 14:28


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Email: support@rusfaq.ru, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.52 от 02.05.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное