Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2

Кроме Locate что использовать для поиска записи в TDataSet?


sniknik ©   (13.01.17 18:01[20]

> to [16] Index  выражение -просто название поля , поле типа String?
это ты отвечаешь или спрашиваешь? FoxPro CDX позволяет выражения/функции в индексе, а в таблице в Index указывается не название поля, а название индекса. почему и вопрос в [16].


Inovet ©   (13.01.17 21:33[21]

Вот так работает достаточно быстро

Main.pas

unit Main;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGrids,
 Data.DB, adsdata, adsfunc, adstable, adsset, adscnnct;

type
 TForm1 = class(TForm)
   DB: TAdsConnection;
   AdsSettings: TAdsSettings;
   tbStreet: TAdsTable;
   dsStreet: TDataSource;
   dbgrStreet: TDBGrid;
   btCreateIdx: TButton;
   btDropIdx: TButton;
   btLocate: TButton;
   edKey: TEdit;
   qTmp: TAdsQuery;
   procedure FormCreate(Sender: TObject);
   procedure btCreateIdxClick(Sender: TObject);
   procedure btDropIdxClick(Sender: TObject);
   procedure btLocateClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 tbStreet.Open;
end;

procedure TForm1.btCreateIdxClick(Sender: TObject);
begin
 // Если таблицы добавить в словарь данных,
 // то можно выполнять запрос без TAdsQuery
 // DB.Execute('...');

 // Можно создавать индекс методом TAdsTable TAdsQuery
 // AdsCreateIndex

 // Обычный синтаксис
 {
 qTmp.SQL.Text :=
   'CREATE INDEX NAME ON STREET (NAME);';
 }

 // Для индексных выражений FoxPro
 // Здесь строка в индексе сразу приводится к верхнему регистру
 qTmp.SQL.Text :=
   'EXECUTE PROCEDURE sp_CreateIndex90(''STREET.DBF'', ''STREET.CDX'', ''NAME'', ''UPPER(NAME)'', '''',  2, 512, NULL);';
 tbStreet.Close;
 try begin
   qTmp.ExecSQL;
   qTmp.SQL.Clear;
   tbStreet.IndexName := 'NAME';
 end;
 finally
   tbStreet.Open;
 end;
end;

procedure TForm1.btDropIdxClick(Sender: TObject);
begin
 qTmp.SQL.Text :=
   'DROP INDEX STREET.NAME;';
 tbStreet.Close;
 try begin
   qTmp.ExecSQL;
   qTmp.SQL.Clear;
   tbStreet.IndexName := '';
 end;
 finally
   tbStreet.Open;
 end;
end;

procedure TForm1.btLocateClick(Sender: TObject);
begin
 if not tbStreet.Locate('NAME', edKey.Text, [loCaseInsensitive, loPartialKey]) then begin
   ShowMessage('Не найдено');
 end;
end;

end.


Main.dfm


object Form1: TForm1
 Left = 0
 Top = 0
 Caption = 'Ads Test Locate'
 ClientHeight = 461
 ClientWidth = 625
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'Tahoma'
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 PixelsPerInch = 96
 TextHeight = 13
 object dbgrStreet: TDBGrid
   Left = 8
   Top = 88
   Width = 609
   Height = 361
   DataSource = dsStreet
   TabOrder = 4
   TitleFont.Charset = DEFAULT_CHARSET
   TitleFont.Color = clWindowText
   TitleFont.Height = -11
   TitleFont.Name = 'Tahoma'
   TitleFont.Style = []
 end
 object btCreateIdx: TButton
   Left = 16
   Top = 16
   Width = 75
   Height = 25
   Caption = 'btCreateIdx'
   TabOrder = 0
   OnClick = btCreateIdxClick
 end
 object btDropIdx: TButton
   Left = 97
   Top = 16
   Width = 75
   Height = 25
   Caption = 'btDropIdx'
   TabOrder = 1
   OnClick = btDropIdxClick
 end
 object btLocate: TButton
   Left = 176
   Top = 16
   Width = 75
   Height = 25
   Caption = 'btLocate'
   TabOrder = 2
   OnClick = btLocateClick
 end
 object edKey: TEdit
   Left = 8
   Top = 61
   Width = 609
   Height = 21
   TabOrder = 3
   Text = #1052#1072#1088#1089
 end
 object DB: TAdsConnection
   ConnectPath = 'D:\WORK\AdsTestLocate'
   AdsServerTypes = [stADS_LOCAL]
   LoginPrompt = False
   StoreConnected = False
   Left = 352
   Top = 8
 end
 object AdsSettings: TAdsSettings
   DateFormat = 'dd.MM.ccyy'
   ShowDeleted = False
   AdsServerTypes = [stADS_LOCAL]
   Left = 400
   Top = 8
 end
 object tbStreet: TAdsTable
   DatabaseName = 'DB'
   StoreActive = False
   AdsConnection = DB
   AdsTableOptions.AdsLockType = Compatible
   AdsTableOptions.AdsCharType = OEM
   TableName = 'STREET'
   TableType = ttAdsCDX
   Left = 456
   Top = 8
 end
 object dsStreet: TDataSource
   DataSet = tbStreet
   Left = 504
   Top = 8
 end
 object qTmp: TAdsQuery
   StoreActive = False
   AdsTableOptions.AdsLockType = Compatible
   AdsTableOptions.AdsCharType = OEM
   SourceTableType = ttAdsCDX
   AdsConnection = DB
   Left = 560
   Top = 8
   ParamData = <>
 end
end


Inovet ©   (13.01.17 21:37[22]

Никаких AV на loCaseInsensitive не было.

Свойство
AdsTableOptions.AdsLockType = Compatible
ставить, если оно надо. Быстрее будет
AdsTableOptions.AdsLockType = Proprietary


Inovet ©   (13.01.17 21:42[23]

Да, забыл. Тестировал на таблице Street из Кладр по полю Name
http://gnivc.ru/inf_provision/classifiers_reference/kladr/
Больше миллиона записей, не то чтобы много, ну и ничё так. Проверь на своих, где медленно работало.


Inovet ©   (13.01.17 21:55[24]

> [21] Inovet ©   (13.01.17 21:33)
> // Если таблицы добавить в словарь данных,
> // то можно выполнять запрос без TAdsQuery
> // DB.Execute('...');

В этом я засомневался, что-то там он будет всё-равно свои ADT пытаться искать. Проверять не хочу. А таблицы лучше всё-таки добавить в словарь.


Abcdef123 ©   (14.01.17 07:20[25]

Извиняюсь за опечатку! Вопроса в моем последнем сообщении не должно быть! Это был ответ. Я имела в виду, что в таблице поле, например FieldName1 String (20), и Index по этому полю FieldName1.


Abcdef123 ©   (14.01.17 07:32[26]

To [24] Должна признаться, что мы работаем чисто с таблицами, словари пока не использовали. Поэтому простите, если вопрос окажется слишком уж примитивным: вот вы сказали "таблицы лучше всё-таки добавить в словарь", если начать испольвать словарь, это значит ВМЕСТО отдельных таблиц, что мы используем сейчас, или ДОПОЛНИТЕЛЬНО, как бы дублируя таблицы в словарь?
To [21] Большое спасибо за приведенный код и все другие комментарии, я в понедельник обязательно всё попробую!


Inovet ©   (14.01.17 11:11[27]

> [26] Abcdef123 ©   (14.01.17 07:32)

Дополнительно, но таблицы не дублируются в словарь, только метаданные. Сами файлы таблиц не изменяются при этом.


Inovet ©   (16.01.17 12:05[28]

Т.е. словарь Data Dictionary в терминологии ADS - это по-другому база данных, там можно создавать триггеры, хранимые процедуры, представления, контроль целостности, ещё кое-какие удобства. Только для старых dbf не из VFP многое не возможно, хотя бы потому, что Primary Key просто так не сделать, потому что в Фоксе уникальный индекс совсем другой смысл уникальности имеет. Ну и вообще, естественно, можно снаружи залезть чем-нибудь и всё испортить.


Inovet ©   (16.01.17 13:12[29]

Перечитал ещё раз свой код. Мелкий ньанс не относящийся к обсуждаемой теме: раз уж подчищаем ресурсы в виде текста запроса, то надо это делать в блоке finally
qTmp.SQL.Clear;


Страницы: 1 2 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо