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

Откуда:
Сообщений: 260
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

Откуда:
Сообщений: 9760
Надо заменить метод:
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

Откуда:
Сообщений: 260
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

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

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

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

Откуда:
Сообщений: 260
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

Откуда:
Сообщений: 260
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

Откуда: Москва
Сообщений: 1976
Подскажите, как правильно заполнить 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 ?
18 янв 19, 15:54    [21788872]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
L_argo
Member

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

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

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

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

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

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

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

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

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

Откуда: Москва
Сообщений: 2300
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;
19 янв 19, 12:39    [21789246]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Beltar
Member

Откуда:
Сообщений: 199
D10.2.3
Получаю при работе с Access на некоторых машинах ошибку в ODBC-драйвере "Не удается открыть раздел реестра "Temporary (volatile) ACE DSN...".

Насколько я понимаю, проблема может быть и не в FireDAC, а именно с ODBC и правами юзера, но воспроизвести у меня не получается. Куда же всё-таки копать?
24 янв 19, 09:57    [21792928]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Grammton
Member

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

Дмитрий можно такой вопрос! Стоит MySQL 5.7.17, на Delphi Tokyo 10.2.3 выводится таблица через FDQuery на DBGrid. Так вот в таблице есть значение 100 миллиардов - 100000000000 (поле в MySQL определено как float), но в dbGrid выводится как 99999997952. В процедуре OnGetText для этого поля в FDQuery, Sender.AsString возвращает туже крокозябру. А Sender.ClassName возвращает TSingleField. При попытке вручную прописать DataType поля (при чем любое float, string) выходит Type mismatch for field 'Поле содержащее большое число', expecting: Float actual: Single. Как это исправить?)
24 янв 19, 15:01    [21793432]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Beltar
Member

Откуда:
Сообщений: 199
100 Млрд. в 4-хбайтный float не влезет. Никак. Будут потери точности. И похоже в базе тоже Float. Т. е. Single. Убить того, кто придумал использовать Float, вместо понятных Single и Double.
24 янв 19, 15:28    [21793502]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Grammton
Member

Откуда:
Сообщений: 5
Beltar,

Проблема не со стороны MySQL, там все норм. CAST с типом CHAR нормально выводит. Но это не дело... Я хочу узнать как решить проблему TSingleField со стороны FireDAC? Именно здесь это число толком не проходит и я не могу поле сделать в FireDAC ни float ни string
24 янв 19, 15:48    [21793545]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
flashSQL
Member

Откуда:
Сообщений: 7
Grammton
Beltar,

Проблема не со стороны MySQL, там все норм. CAST с типом CHAR нормально выводит. Но это не дело... Я хочу узнать как решить проблему TSingleField со стороны FireDAC? Именно здесь это число толком не проходит и я не могу поле сделать в FireDAC ни float ни string


"Проблема" со стороны чисел с плавающей точкой и результатов их неточного хранения и неточного вычисления.

var
R:single;
begin
R:=100000000000;
ShowMessage(FloatToStr(R));
end;
24 янв 19, 17:20    [21793671]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Beltar
Member

Откуда:
Сообщений: 199
В Delphi сам по себе метод TField.AsFloat возвращает Double.
Посмотрите, как описано поле в БД, если оно 4 байта, то увеличьте разрядность. Напоминаю, что даже в Int32 влезают числа до плюс\минус 2 млрд с копейками всего.

Single вообще применим только в двух случаях, когда в БД надо хранить массу чисто архивной информации, которая потом не будет использоваться в вычислениях, и когда нужна максимальная производительность, при допустимости потерь точности.
25 янв 19, 10:17    [21793973]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Sinemurius
Member

Откуда:
Сообщений: 82
Добрый день.
По просьбе goldmi45 описываю проблему с UTF8 исключением из FB.

Столкнулся я со следующей проблемой: подключаюсь через Firedac к базе данных Firebird. У БД charset - UTF8. В настройках соединения TFDConnection - это указано.

Таблицы открываются без проблем, поля с русскими буквами отражаются нормально. Но вот поднимаю я в процедуре БД исключение с русскими буквами и отображается оно "коряво".

По результатам анализа я пришел к следующем выводу:

1. Текст исключения из сервера передается в формате UTF8.
2. FireDac получает текст и думая, что это формат AnsiString преобразовывает его в UnicodeString и поднимает исключение с этим преобразованным текстом.

Цифры и латинские символы в UTF8 используют по 1 байту, во время преобразования к ним просто добавляется 0 и они нормально читаются в unicodestring, а двухбайтовые символы (например русские буквы) преобразовываются в два двухбайтовых символа в unicodestring и не читаются соответственно.

Я решил эту проблему с помощью поста debose в топике 18015826 примерно таким образом:
  if Correct_UTF8_Exception then
  begin
    try
      FDM.Query.Open;
    except
      on E: EIBNativeException
        do raise Exception.Create(UTF8ToString(RawByteString(E.Message)));
      else raise;
    end;
  end
  else FDM.Query.Open;


Но совершенно очевидно, что это ошибка FireDac. Было бы полезно это исправить.

Спасибо.
13 фев 19, 15:11    [21808565]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
postgresqlfun
Member

Откуда:
Сообщений: 2
При TFDQuery.CachedUpdates=true можно узнать какие именно поля изменялись и их значения?
1 мар 19, 17:18    [21822943]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Sashaua
Member

Откуда: Kiev
Сообщений: 175
Подскажите, есть обертки для выполнения запросов select/insert/update/delete, в которых динамиччески создаются компоненты парсятся передаваемые параметры составляются запросы и все это дело выполняется, используется FireDAC.
Как после insert/update/delete в гриде перечитать конкретно измененную запись не перечитывая ввесь набор данных?
5 мар 19, 19:00    [21825688]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30502

05.03.2019 19:00, Sashaua пишет:
> Как после insert/update/delete в гриде перечитать конкретно измененную запись не перечитывая ввесь набор данных?

Refresh;

Posted via ActualForum NNTP Server 1.5

6 мар 19, 14:28    [21826332]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
L_argo
Member

Откуда:
Сообщений: 936
Мимопроходящий
05.03.2019 19:00, Sashaua пишет:
> Как после insert/update/delete в гриде перечитать конкретно измененную запись не перечитывая ввесь набор данных?

Refresh;
разве не RefreshRecord() ?
6 мар 19, 17:58    [21826630]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
X11
Member

Откуда: Kharkiv, Ukraine
Сообщений: 13305
http://blog.marcocantu.com/blog/2019-february-firedac-firebird-rad1031.html
What’s New in FireDAC for Firebird in RAD Studio 10.3.1

In RAD Studio 10.3.1 we've added a couple of features in the FireDAC support for Firebird, a popular databases among our customers.
7 мар 19, 13:43    [21827284]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 36 37 38 39 40 41 42 [43] 44 45   вперед  Ctrl
Все форумы / Delphi Ответить