powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / Delphi [игнор отключен] [закрыт для гостей] / FindKey ( и динамическое изменение IndexFieldNames и параметра)
8 сообщений из 8, страница 1 из 1
FindKey ( и динамическое изменение IndexFieldNames и параметра)
    #40088819
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рабочий код:
Код: 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
FindKey ( и динамическое изменение IndexFieldNames и параметра)
    #40088824
bzums
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Трудность в том, что параметр требуется типа array of TVarRec
...
Рейтинг: 0 / 0
FindKey ( и динамическое изменение IndexFieldNames и параметра)
    #40088879
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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
FindKey ( и динамическое изменение IndexFieldNames и параметра)
    #40088910
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Код: pascal
1.
procedure FinalizeVarRec(Var AVarRec : TVarRec);

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

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

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

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

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


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