-
> to [16] Index выражение -просто название поля , поле типа String? это ты отвечаешь или спрашиваешь? FoxPro CDX позволяет выражения/функции в индексе, а в таблице в Index указывается не название поля, а название индекса. почему и вопрос в [16].
-
Вот так работает достаточно быстро 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
public
end;
var
Form1: TForm1;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
tbStreet.Open;
end;
procedure TForm1.btCreateIdxClick(Sender: TObject);
begin
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
-
Никаких AV на loCaseInsensitive не было.
Свойство AdsTableOptions.AdsLockType = Compatible ставить, если оно надо. Быстрее будет AdsTableOptions.AdsLockType = Proprietary
-
-
> [21] Inovet © (13.01.17 21:33) > // Если таблицы добавить в словарь данных, > // то можно выполнять запрос без TAdsQuery > // DB.Execute('...');
В этом я засомневался, что-то там он будет всё-равно свои ADT пытаться искать. Проверять не хочу. А таблицы лучше всё-таки добавить в словарь.
-
Извиняюсь за опечатку! Вопроса в моем последнем сообщении не должно быть! Это был ответ. Я имела в виду, что в таблице поле, например FieldName1 String (20), и Index по этому полю FieldName1.
-
To [24] Должна признаться, что мы работаем чисто с таблицами, словари пока не использовали. Поэтому простите, если вопрос окажется слишком уж примитивным: вот вы сказали "таблицы лучше всё-таки добавить в словарь", если начать испольвать словарь, это значит ВМЕСТО отдельных таблиц, что мы используем сейчас, или ДОПОЛНИТЕЛЬНО, как бы дублируя таблицы в словарь? To [21] Большое спасибо за приведенный код и все другие комментарии, я в понедельник обязательно всё попробую!
-
> [26] Abcdef123 © (14.01.17 07:32)
Дополнительно, но таблицы не дублируются в словарь, только метаданные. Сами файлы таблиц не изменяются при этом.
-
Т.е. словарь Data Dictionary в терминологии ADS - это по-другому база данных, там можно создавать триггеры, хранимые процедуры, представления, контроль целостности, ещё кое-какие удобства. Только для старых dbf не из VFP многое не возможно, хотя бы потому, что Primary Key просто так не сделать, потому что в Фоксе уникальный индекс совсем другой смысл уникальности имеет. Ну и вообще, естественно, можно снаружи залезть чем-нибудь и всё испортить.
-
Перечитал ещё раз свой код. Мелкий ньанс не относящийся к обсуждаемой теме: раз уж подчищаем ресурсы в виде текста запроса, то надо это делать в блоке finally qTmp.SQL.Clear;
|