Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 34 35 36 37 38 39 40 41 42 [43]
 Re: FireDAC  [new]
Stalker4
Member

Откуда:
Сообщений: 253
Dmitry Arefiev,

Delphi 10.2.3 (FireDAC штатный для этой версии)
Sybase SQL Anywhere 12.0.1

Есть FDQuery с неким запросом, открываем его (FDQuery.Open)

Далее есть такой код:
procedure TForm1.MasterFDQueryAfterScroll(DataSet: TDataSet);
begin
 ShowMessage(DataSet.Name+': AfterScroll');
end;

procedure TForm1.FilterButtonClick(Sender: TObject);
begin

 FDQuery.AfterScroll := MasterFDQueryAfterScroll;
 FDQuery.DisableControls;
 try
   FDQuery.Filtered := True;
   FDQuery.Filtered := False;
 finally
   FDQuery.EnableControls;
 end;
end;


Вызываем его.
Я ожидал, что на установке фильтра (Filtered := True) и на снятии фильтра (Filtered := False) сработает обработчик AfterScroll, но он почему то не сработал (не вызвался).

Если заменить FDQuery на SDQuery (из SQL Direct, с которой я перевожу программы на FireDAC) или на обычный TQuery (BDE), то обработчик AfterScroll срабатывает как и положено да раза - на установку фильтра и на его снятие.

Вопрос: Это ошибка FireDAC или тут надо установить (снять) какую то опцию ?
26 дек 18, 16:29    [21773995]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9672
Надо заменить метод:
procedure TFDDataSet.ResyncViews;
var
  oLastRow: TFDDatSRow;
  iNewIndex: Integer;
  lScrolled: Boolean;
begin
  if Active then begin
    oLastRow := GetRow;
    lScrolled := False;
    if oLastRow <> nil then begin
      iNewIndex := FSourceView.IndexOf(oLastRow);
      lScrolled := FRecordIndex <> iNewIndex;
      FRecordIndex := iNewIndex;
    end;
    Include(FFlags, dfLockNoBMK);
    try
      if lScrolled then
        DoBeforeScroll;
      UpdateCursorPos;
      Resync([]);
      if lScrolled then
        DoAfterScroll;
    finally
      Exclude(FFlags, dfLockNoBMK);
    end;
  end;
end;
29 дек 18, 15:39    [21776489]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Stalker4
Member

Откуда:
Сообщений: 253
Dmitry Arefiev,

Спасибо за ответ.

Это в модуле FireDAC.Comp.DataSet ? Хорошо, попробую и отпишу тут результат.

1) А в 10.3 Rio это уже исправлено или нет ?
2) А что Вы можете сказать по поводу моего вопроса 21765818 (вызов обработчика AfterOpen у Detail) ?
Это ошибка FD или надо выставить (убрать) какую то опцию ?
30 дек 18, 17:04    [21776958]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9672
автор
1) А в 10.3 Rio это уже исправлено или нет ?

10.3 уже вышел, так-что в апдейте.
автор
2) А что Вы можете сказать по поводу моего вопроса 21765818 (вызов обработчика AfterOpen у Detail) ?

Почему он должен быть вызван ? Скорее BeforeScroll / AfterScroll. Статус детального FD датасета не меняется при смене мастера.
30 дек 18, 18:28    [21776980]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Stalker4
Member

Откуда:
Сообщений: 253
Dmitry Arefiev
10.3 уже вышел, так-что в апдейте.
Есть ли возможность у лицензионных пользователей Delphi получать (качать) обновления FireDAC не дожидаясь больших Update для Delphi ?

Dmitry Arefiev
автор
2) А что Вы можете сказать по поводу моего вопроса 21765818 (вызов обработчика AfterOpen у Detail) ?

Почему он должен быть вызван ? Скорее BeforeScroll / AfterScroll. Статус детального FD датасета не меняется при смене мастера.

Как это почему, разве при движении по мастеру не происходит переоткрытия детайла, что бы прочитать новые детальные данные соответствующие новому мастеру ?
А соответственно должен срабатывать и AfterOpen.
Кроме того, это ИМНО стандартное поведение DataSet (проверенно на BDE, SQLDirect, NativeDB), так что очень хотелось бы, что бы и FireDAC следовал этому поведению.

Можно будет внести эти исправления (изменения) в FireDAC ?

А BeforeScroll / AfterScroll в этом деле не могут заменить AfterOpen, так как BeforeScroll / AfterScroll
должны срабатывать при перемещении по каждой записи, а AfterOpen должен срабатывать только один раз при каждом открытии или переоткрытии запроса.

P.S. Всех с наступающим Новый Годом !!!
31 дек 18, 23:15    [21777251]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Stalker4
Member

Откуда:
Сообщений: 253
Dmitry Arefiev
Надо заменить метод:
procedure TFDDataSet.ResyncViews;

Попробовал. В принципе код работает, хотя есть некоторая странность.

Имеется FDQuery, нем 4-ре строки и есть поле PCODE.
1-ая строка PCODE = 730
2-ая строка PCODE = 75
3-ая строка PCODE = 128
4-ая строка PCODE = 114

На кнопке есть такой код:
procedure TForm4.FilterButtonClick(Sender: TObject);
begin

 // FDQuery.First;
 FDQuery.AfterScroll := FDQueryAfterScroll;
 FDQuery.Filter := 'PCODE=128';

 with FDQuery do begin

   DisableControls;
   try
     ShowMessage('1: '+FieldByName('PCODE').AsString);
     Filtered := True;
     ShowMessage('2: '+FieldByName('PCODE').AsString);
     Filtered := False;
     ShowMessage('3: '+FieldByName('PCODE').AsString);
   finally
     EnableControls;
   end;

   ShowMessage('6: '+FieldByName('PCODE').AsString);

 end;

А так же код обработчика FDQueryAfterScroll
procedure TForm4.FDQueryAfterScroll(DataSet: TDataSet);
begin

 if DataSet.ControlsDisabled then
   ShowMessage('4: '+DataSet.FieldByName('PCODE').AsString)
 else
   ShowMessage('5: '+DataSet.FieldByName('PCODE').AsString)

end;

Открываю FDQuery и запускаю код FilterButtonClick
Результат запуска:
1: 730
2: 128
4: 128
3: 128
6: 128

Вроде бы все нормально.
До фильтра текущей строкой была с PCODE=730 (1), после установки фильтра текущей стала строка с PCODE=128 (2).

Теперь в коде FilterButtonClick удаляем комментарий у строки FDQuery.First.
Опять запускаем код с открытием FDQuery, и вызываем FilterButtonClick .
Результат запуска уже несколько другой:
1: 730
4: 128
2: 128
4: 128
3: 128
6: 128

Обратите внимание, что в первом варианте (без First) сразу после установки фильтра, обработчик AfterScroll не сработал (1,2), а во втором варианте (с First) сразу после установки фильтра, обработчик AfterScroll сработал (1,4,2). Хотя в обоих случаях порядок строк после открытия FDQuery не менялся и первой строкой в обоих случаях была строка PCODE=730.

Почему First до подключения обработчика AfterScroll так влияет на его выполнение не понятно.
ИМНО где то там все же кроется ошибка (недоработка) вызова AfterScroll.
9 янв 19, 10:25    [21780311]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1871
Подскажите, как правильно заполнить TFDMemTable ?
Например, я хочу загрузить туда данные из CSV или Json, как правильно это сделать ?

Сейчас, я делаю так:
1. Создаю FieldDefs (т.е. поля):
 FDMemTable.Close;
 FDMemTable.Fields.Clear;
 FDMemTable.FieldDefs.Clear;
 Def:=FDMemTable.FieldDefs.AddFieldDef;
 Def.Name:='ID'
 Def.DataType:=ftInteger;

2. Потом заполняю поля:
 while Condition do
  begin
   FDMemTable.Append;
   FDMemTable.FieldByName('ID').AsInteger:=GetValue;
  end;

На сколько это правильно ?
Можно сделать, что бы создав наследника от FDMemTable, класс делал это при выполнении FDMemTable.Open ?
т.е. открывал нужный мне Json(в особом формате) или CSV ?
вчера, 15:54    [21788872]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
L_argo
Member

Откуда:
Сообщений: 520
Valery_B
Можно сделать, что бы создав наследника от FDMemTable, класс делал это при выполнении FDMemTable.Open ?
т.е. открывал нужный мне Json(в особом формате) или CSV ?
Можно, но зачем ? Сделай обычную процедуру. Вдруг понадобится дописать в хвост из другого файла или еще чего...

Не надо тулить ООП, туда, где оно нафиг не надо.
вчера, 16:43    [21788924]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Valery_B
Member

Откуда: Москва
Сообщений: 1871
L_argo
Можно.

Как ?
вчера, 16:45    [21788927]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2274
Я таки победил tvp для MSSQL, они работают, сколько бы параметров и записей в них не было. TDateTimeField не годится под описание datetime поля в типе, пришлось использовать TSQLTimeStampField
сегодня, 10:58    [21789222]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9672
Michael Longneck
Я таки победил tvp для MSSQL

Что значит "победил" ?
сегодня, 12:17    [21789241]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9672
Valery_B
Например, я хочу загрузить туда данные из CSV или Json, как правильно это сделать ?

Использовать TFDBatchMove.
сегодня, 12:17    [21789243]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Michael Longneck
Member

Откуда: Москва
Сообщений: 2274
Dmitry Arefiev
Что значит "победил" ?


Это значит нашёл второй баг, из-за которого второй и далее параметры TVP не заполнялись данными. Первый баг- тотЮ что я приводил ранее.


unit FireDAC.Phys.ODBCWrapper;

Первый
   else if SQLDataType = SQL_SS_TABLE then begin
    FScale := 0;
    FColumnSize := MaxInt; //было 1
    FDataSize := 0;
  end


Второй
function TODBCCommandStatement.PutLongParams: SQLReturn;
var
  pParamNum: SQLPointer;
  oPar: TODBCParameter;
  iCurNum: SQLSmallint;
  lFirst: Boolean;
  iIndex: Integer;
begin
  iCurNum := -1;
  oPar := nil;
  FFocusedParam := nil;
  iIndex := 0;
  lFirst := True;
  repeat
    pParamNum := nil;
    Result := Lib.SQLParamData(FHandle, pParamNum);
    if Result = SQL_NEED_DATA then begin
      // MSSQL: subsequent SQLParamData calls for TVP return pParamNum=nil
      if pParamNum <> nil then
      begin
        oPar := ParamList.FindByToken(pParamNum) as TODBCParameter;
        lFirst := True; //новый параметр, заначит надо DataReader сделать Reset  
      end;
сегодня, 12:39    [21789246]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 34 35 36 37 38 39 40 41 42 [43]
Все форумы / Delphi Ответить