Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
Delphi 6-7

Интересное значение filter

11.06.2018, 14:04. Показов 1548. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Начал разбираться с базами данных на Delphi 7 и столкнулся с одной интересной особенностью значения filter.
Имеется таблица в MS Access:
kodstroka chislo
1Kolya55
2Valya77

В дельфи на форму добавлены ADOTable, DataSource, DBGrid и Button.
Все подключения настроены. В DBGrid отображается таблица.
Далее код по удалению строки из таблицы:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TForm1.Button1Click(Sender: TObject);
begin
  if ADOTable1.State in [dsBrowse] then
   begin
    if MessageDlg('Удалить строку?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
      with ADOTable1 do
       begin
        ADOTable1.Filter :='chislo= '+ Quotedstr(inttostr(ADOTable1.FieldByName('chislo').AsInteger));
        ADOTable1.Filtered := True;
        while ADOTable1.RecordCount <> 0 do
         begin
          ADOTable1.Last;
          ADOTable1.Delete
        end;
       ADOTable1.Filtered := False;
       end;
   end;
end;
Код взял из одного примера и теперь пробую его понять. В частности, интересует строка:
Delphi
1
ADOTable1.Filter :='chislo= '+ Quotedstr(inttostr(ADOTable1.FieldByName('chislo').AsInteger));
Как я понял, происходит следующее: при клике на кнопку, программа считывает значение ячейки 'chislo' из выделенной строки, преобразует его в строку, добавляет перед этим строку 'chislo= ' и присваивает все это дело свойству Filter компонента ADOTable. Если выделить вторую строку и выполнить удаление, то получим значение ADOTable1.Filter равное:
Delphi
1
chislo= '77'
Я подумал: "Зачем столько кода?", и решил сократить запись оставив только:
Delphi
1
ADOTable1.Filter :=inttostr(ADOTable1.FieldByName('chislo').AsInteger);
В итоге получил ошибку при попытке выполнить удаление.
Далее сделал так:
Delphi
1
ADOTable1.Filter :='chto eto '+ Quotedstr(inttostr(ADOTable1.FieldByName('chislo').AsInteger));
и снова ошибка

А теперь вопрос: куда передается строка
Delphi
1
chislo= '77'
???
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.06.2018, 14:04
Ответы с готовыми решениями:

MixItUp: применить к селектору значение data-filter что бы работало как кнопка.
Как применить к селектору данное значение: data-filter=&quot;&quot; что бы работало как кнопка Как есть &lt;div class=&quot;controls&quot;&gt;...

Смысл функции filter. Перевести код функции filter в C++
Всем привет! у меня такая проблема. Нужно перевести код функции filter в C++. для функции y = filter (B, A, x) я нашла код в интернете: ...

ИНТЕРЕСНОЕ))
Cантехнік Петро був найнятий, щоб прокласти трубу водопостачання між двома точками міста. Мапу міста можна представити у вигляді...

15
Модератор
 Аватар для D1973
9928 / 6465 / 2457
Регистрация: 21.01.2014
Сообщений: 27,420
Записей в блоге: 3
11.06.2018, 14:23
Лучший ответ Сообщение было отмечено SashaRasha как решение

Решение

SashaRasha, прочитайте, что такое фильтр в таблицах БД и как он применяется...
Надеюсь, после этого Вы поймете, какую ерунду тут написали:
Цитата Сообщение от SashaRasha Посмотреть сообщение
ADOTable1.Filter :=inttostr(ADOTable1.FieldByName('chislo ').AsInteger);
1
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
11.06.2018, 14:49  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Надеюсь, после этого Вы поймете, какую ерунду тут написали:
ну, я присвоил значению фильтр строку из значения ячейки chislo выделенной строки.

Добавлено через 15 минут
Все, понял. Это синтаксис фильтрации таблиц в БД.
0
Модератор
 Аватар для D1973
9928 / 6465 / 2457
Регистрация: 21.01.2014
Сообщений: 27,420
Записей в блоге: 3
11.06.2018, 14:49
Я еще раз повторю: прочтите, что такое фильтр и как он строится!
1
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
11.06.2018, 14:50  [ТС]
Я немного вас опередил)
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
11.06.2018, 14:59
Непонятно, зачем нужна фильтрация при удалении строки из таблицы...

В принципе, весь код для удаления, выбранной в гриде строки, состоит лишь из следующей конструкции:
Delphi
1
2
3
4
5
6
7
procedure TForm1.Button1Click(Sender: TObject);
begin
  if (ADOTable1.State in [dsBrowse])  and
    (MessageDlg('Удалить строку?',mtConfirmation,[mbYes,mbNo],0) = mrYes) 
  then
    ADOTable1.Delete;
end;
0
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
11.06.2018, 15:04  [ТС]
Цитата Сообщение от Скандербег Посмотреть сообщение
зачем нужна фильтрация при удалении строки из таблицы
ну, к примеру, если понадобится удалить не одну строку, а все строки с одинаковыми значениями определенного столбца.
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
11.06.2018, 15:18
Цитата Сообщение от SashaRasha Посмотреть сообщение
Далее код по удалению строки из таблицы:
Кто это написал?
К тому же, в коде ясно показано, что после установки фильтра идет позиционирование на последнюю запись
отфильтрованного набора данных и только потом идет удаление этой последней строки.
И, главное, с помощью метода Delete невозможно за один раз удалить несколько строк.

Как правило, удаление нескольких строк из таблицы бывает не только как редкое исключение, но
для этого применяют SQL запрос. А эта горотьба с фильтром при удалении, который затем, после удаления строк, нужно еще и снять, вещь для пользователя весьма неудобная.
1
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
11.06.2018, 15:57  [ТС]
Цитата Сообщение от Скандербег Посмотреть сообщение
Как правило, удаление нескольких строк из таблицы бывает не только как редкое исключение, но
для этого применяют SQL запрос. А эта горотьба с фильтром при удалении, который затем, после удаления строк, нужно еще и снять, вещь для пользователя весьма неудобная.
Ну, в примере, из которого я брал этот код, удаляется инфа из 4 таблиц, в которых значение равно фильтру.

Добавлено через 13 минут
вот он:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
рrocedure TForm_Main.Btn_DelClick(Sender: TObject);
begin
  if DataModule_Stuff.Stuff.State in [dsBrowse] then 
  Begin 
    if Message Dlg('Удалить?',mtConfirmation,[mbYes,mbNo],0) = mrYes then
      with DataModule_Stuff do 
      begin 
       Family.Filter := 'Org_Num = ' + QuotedStr(IntToStr(Stuff.FieldByName('Org_Num').AsInteger));
       Family.Filtered := True;
       while Family.RecordCount <> 0 do
       begin
        Family.Last;
        Family.Delete 
       end; 
       Family.Filtered := False; 
       Educat.Filter := 'Org_Num = ' + QuotedStr(IntToStr(Stuff.FieldByName('Org_Num').AsInteger));
       Educat.Filtered := True;
       while Educat.RecordCount <> 0 do
       begin 
        Educat.Last;
        Educat.Delete
       end;
       Educat.Filtered := False; 
       Holiday.Filter := 'Org_Num = ' + QuotedStr(IntToStr(Stuff.FieldByName('Org_Num').AsInteger)); Қ
       Holiday.Filtered := True;
       while Holiday.RecordCount <> 0 do
       begin
        Holiday.Last;
        Holiday.Delete 
       end;
       Holiday.Filtered := False; 
       Moving.Filter := 'Org_Num = ' + QuotedStr(IntToStr(Stuff.FieldByName('Org_Num').AsInteger));
       Moving.Filtered := True;
       while Moving.RecordCount <> 0 do
       begin
        Moving.Last;
        Moving.Delete 
       end;
       Moving.Filtered := False;
       Stuff.Delete;
      end;
  end
end;
там через адоконекшн все настроено. но sql запросов почему-то нету
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
11.06.2018, 16:16
Лучше не брать у дилетантов коды - себе дороже.
Вся эта "нетленка", из которой скопирована фильтрация при удалении превращается в небольшой код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
рrocedure TForm_Main.Btn_DelClick(Sender: TObject);
var I : Integer;
begin
  if (DataModule_Stuff.Stuff.State in [dsBrowse]) and 
     (Message Dlg('Удалить?',mtConfirmation,[mbYes,mbNo],0) = mrYes)
  then begin
    I := Stuff.FieldByName('Org_Num').AsInteger;
 
    if Stuff.Locate('Org_Num', I, []) then
      Stuff.Delete;
    if DataModule_Stuff.Family.Locate('Org_Num', I, []) then
      DataModule_Stuff.Family.Delete;
    if DataModule_Stuff.Educat.Locate('Org_Num', I, []) then
      DataModule_Stuff.Educat.Delete;
    if DataModule_Stuff.Holiday.Locate('Org_Num', I, []) then
      DataModule_Stuff.Holiday.Delete;
  end;
end;
Ясно, что для разных таблиц надо было использовать метод Locate.
И получается, что фильтр вообще здесь ни причём.
А в случае удаления строки из одной таблицы даже Locate не нужен, т.к. выбранная для удаления строка уже та которая и требуется.
1
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
11.06.2018, 16:29  [ТС]
Цитата Сообщение от Скандербег Посмотреть сообщение
Ясно, что для разных таблиц надо было использовать метод Locate.
И получается, что фильтр вообще здесь ни причём.
А если в таблице значение 'Num_Org' встречается не один раз?
0
1076 / 989 / 340
Регистрация: 07.08.2012
Сообщений: 2,790
11.06.2018, 16:39
Если может встретиться несколько одинаковых значений в поле, то да, можно применить и этот кондовый прием.
Довольно забавный, но работающий.
Удачи!
Вначале не увидел цикла while, отсюда и дискуссия.
1
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
13.06.2018, 11:22  [ТС]
Ребята, я все же не пойму. Куда передается chislo= '77' ? И как в самом access можно искать с помощью этого? Понятно, что это работает и ищет то, что нужно, но как?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
13.06.2018, 13:17
вот сюда
SQL
1
SELECT * FROM вашатаблица WHERE chislo= '77'
но для меня неочевидно почему chislo=stroka, потому что апострофами выделяются именно строки
1
 Аватар для SashaRasha
91 / 47 / 8
Регистрация: 08.10.2008
Сообщений: 445
13.06.2018, 14:55  [ТС]
Но там числовое значение

Сейчас по быстрому накидал программку
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids;
 
type
  TForm1 = class(TForm)
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ADOTable1: TADOTable;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure ButtonClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOTable1.Append;
end;
 
 
procedure TForm1.ButtonClick(Sender: TObject);
begin
if form1.adotable1.State in [dsBrowse] then
  Begin
  {  if MessageDlg('Âû óâåðåíû?',mtConfirmation,[mbYes,mbNo],0) = mrYes then }
      with form1 do
      begin
       adotable1.Filter := 'pole2 = ' + QuotedStr(IntToStr(adotable1.FieldByName('pole2').AsInteger));
       adotable1.Filtered := True;
       while adotable1.RecordCount <> 0 do
       begin
        adotable1.Last;
        adotable1.Delete
       end;
     adotable1.Filtered := False;
       end;
    end;
    label1.Caption:=adotable1.Filter;
end;
end.
когда произвожу удаление, в label1 отображается значение фильтра. И вот еще что. Никаких sql-запросов я не создаю.
Проект Delphi 7, если понадобится:filter.rar Возможно придется перенастроить свойство ConectionString компонента ADOTable1.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
13.06.2018, 15:09
вы можете считать, что запрос выполняется внутри вашего датасета силами делфи
от этого его формат ничуть не меняется и вы можете смело думать про фильтр как SQL выражение WHERE
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.06.2018, 15:09
Помогаю со студенческими работами здесь

Интересное предложение
ОПЛАТЫ НЕ БУДЕТ Я не чего не знаю про программирование мне посоветовали этот форум.Очень нравится заставка в видио и я хотел бы что бы...

Интересное уравнение
Уравнение вида: 17*a^n=b^n, при n&gt;1. Имеет ли натуральные решения?

Интересное число
Здравствуйте, помогите пожалуйста исправит ошибку. Ошибка на reset(input, 'input.txt'); У меня есть input b output файлы. ...

интересное меню
Здравствуйте, задумался тут о модификации одного ниспадающего меню... ...

интересное наблюдение
В общем ситуация такая - есть сайтик аудиторской компании. денежка 275, причем стабильно и давно (ну если не считать недавних скачков). ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru