Гость
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FindKey ( и динамическое изменение IndexFieldNames и параметра) / 8 сообщений из 8, страница 1 из 1
05.08.2021, 11:39
    #40088819
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindKey ( и динамическое изменение IndexFieldNames и параметра)
Рабочий код:
Код: pascal
1.
2.
3.
4.
      id := Table1.fieldbyname('id').asinteger;
      name := table1.fieldbyname('name').asstring;
      Table2.IndexFieldNames := 'id;name';
      if not Table2.FindKey([id, name]) then


Необходимо ДИНАМИЧЕСКИ делать тоже самое.
Никак не получается.
Типа
Код: pascal
1.
2.
      Table2.IndexFieldNames := FieldsString;
      if not Table2.FindKey( FieldsArray ) then


Спасибо
...
Рейтинг: 0 / 0
05.08.2021, 11:48
    #40088824
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindKey ( и динамическое изменение IndexFieldNames и параметра)
Трудность в том, что параметр требуется типа array of TVarRec
...
Рейтинг: 0 / 0
05.08.2021, 13:32
    #40088879
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindKey ( и динамическое изменение IndexFieldNames и параметра)
Код: pascal
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.
program Project1;

{$APPTYPE CONSOLE}

procedure someProc(AParams : array of const);
begin

 for var i := 0 to High(AParams) do
  case AParams[i].VType of

   vtInteger       : WriteLn('#', i:3, 'Integer ':15, AParams[i].VInteger);
   vtAnsiString    : WriteLn('#', i:3, 'AnsiString ':15, '"', AnsiString(AParams[i].VAnsiString), '"');
   vtUnicodeString : WriteLn('#', i:3, 'UnicodeString ':15, '"', UnicodeString(AParams[i].VUnicodeString), '"');

  end;

end;

procedure FinalizeVarRec(Var AVarRec : TVarRec);
begin

 case AVarRec.VType of
  vtAnsiString    : AnsiString(AVarRec.VAnsiString) := '';
  vtUnicodeString : UnicodeString(AVarRec.VUnicodeString) := '';
 end;

end;

var

 params : array of TVarRec;

begin

 SetLength(params, 3);

 params[0].VType    := vtInteger;
 params[0].VInteger := 1024;

 params[1].VType                   := vtAnsiString;
 AnsiString(params[1].VAnsiString) := 'AnsiString. Hello!';

 params[2].VType                         := vtUnicodeString;
 UnicodeString(params[2].VUnicodeString) := 'Unicode string. Привет!';

 someProc(params);

 for var i := 0 to High(params) do
  FinalizeVarRec(params[i]);

 ReadLn;

end.
...
Рейтинг: 0 / 0
05.08.2021, 14:39
    #40088910
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindKey ( и динамическое изменение IndexFieldNames и параметра)
Kazantsev Alexey
Код: pascal
1.
procedure FinalizeVarRec(Var AVarRec : TVarRec);

А само оно не умеет?
...
Рейтинг: 0 / 0
05.08.2021, 15:41
    #40088935
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindKey ( и динамическое изменение IndexFieldNames и параметра)
_Vasilisk_
А само оно не умеет?

Умеет, когда компилятор сам параметры формирует.
...
Рейтинг: 0 / 0
05.08.2021, 22:25
    #40089026
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindKey ( и динамическое изменение IndexFieldNames и параметра)
Спасибо большое.
Код рабочий, проверил.

Но моя проблема намного шире - параметры могут любого типа по полю базы данных. То есть проверять и тип ещё - это слишком ( скажем, дата или деньги ).

Буду пользоваться Locate. Там параметры нормального вида ( первый - текст с названием полей и второй - нормальный массив ).
Заметил правда, что FindKey перебирает 100.000 записей за 5 секунд, а Locate - за 10. Тот же самый набор.
Непонятна-а-а.

Спасибо большое.
...
Рейтинг: 0 / 0
05.08.2021, 23:54
    #40089036
Kazantsev Alexey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindKey ( и динамическое изменение IndexFieldNames и параметра)
bzums
Но моя проблема намного шире - параметры могут любого типа по полю базы данных. То есть проверять и тип ещё - это слишком ( скажем, дата или деньги ).

Достаточно написать функцию FieldValueToVarRec и заполнять массив параметров с её помощью.

Ещё можно попробовать вариант с вариантами :)
Код: pascal
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.
program Project2;

{$APPTYPE CONSOLE}

uses
 System.SysUtils, System.Variants;

procedure someProc(const AParams : array of const);
begin
 for var i := 0 to High(AParams) do
  WriteLn(VarTypeAsText(PVarData(AParams[i].VVariant).VType):15, ' "', VarToStrDef(PVariant(AParams[i].VVariant)^, 'whoops'), '"');
end;

var

 vparams : array of Variant;
 params : array of TVarRec;

begin

 SetLength(vparams, 5);
 SetLength(params, Length(vparams));

 for var i := 0 to high(Params) do
  begin
   params[i].VType := vtVariant;
   params[i].VVariant := @vparams[i];
  end;

 // vparams[n] := FieldByName('xxx').AsVariant;
 vparams[0] := Integer(1024);
 vparams[1] := Now();
 vparams[2] := 'hello';
 vparams[3] := StrToCurr('10.56');
 vparams[4] := pi;

 someProc(params);

 ReadLn;

end.
...
Рейтинг: 0 / 0
06.08.2021, 08:39
    #40089064
bzums
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
FindKey ( и динамическое изменение IndexFieldNames и параметра)
Kazantsev Alexey, Спасибо тебе, добрый человек. Работает. Вариант с вариантами корректно разбирает все типы полей (по крайней мере, FindKey, корректно принимает и обрабатывает параметр). Спасибо большое.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FindKey ( и динамическое изменение IndexFieldNames и параметра) / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]