Вопрос № 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'а (независимо от выделенного столбца). Во вторых - слегка переделать запрос:
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.
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