Конференция "Начинающим" » Кроме 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;
 
Конференция "Начинающим" » Кроме Locate что использовать для поиска записи в TDataSet?
Есть новые Нет новых   [118230   +17][b:0][p:0.003]