Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 25 26 27 28 29 30 31 32 [33] 34   вперед  Ctrl
 Re: FireDAC  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9501
Arioch
Посмотри по ссылке, не будем в испорченный телефон играть.

Мало ли что на заборе написано ...
25 сен 17, 20:32    [20821846]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
hvlad
Member

Откуда:
Сообщений: 9233
Dmitry Arefiev
Arioch
Посмотри по ссылке, не будем в испорченный телефон играть.

Мало ли что на заборе написано ...
Я на заборе (FireDAC.Phys.IBBase.pas) вижу следующее:
+
  TFDPhysIBEventAlerterBase = class(TFDPhysEventAlerter)
  private
    FEvents: TIBEvents;
    FEventsConnection: IFDPhysConnection;
    procedure DoFired(AEvents: TIBEvents; ABaseIndex: Integer;
      const ACounts: TISCEventCounts);
...
procedure TFDPhysIBEventAlerterBase.InternalAllocHandle;
begin
  FEventsConnection := GetConnection.Clone;
  if FEventsConnection.State = csDisconnected then
    FEventsConnection.Open;
  FEvents := TIBEvents.Create(TIBDatabase(FEventsConnection.CliObj), Self);
  FEvents.Names.SetStrings(GetNames);
  FEvents.OnFired := DoFired;
end;

На соседней секции забора (FireDAC.Phys.IB.pas)
+
  TFDPhysIBEventAlerter = class(TFDPhysIBEventAlerterBase)
...
function TFDPhysIBConnection.InternalCreateEvent(const AEventKind: String): TFDPhysEventAlerter;
begin
  if CompareText(AEventKind, S_FD_EventKind_IB_Events) = 0 then
    Result := TFDPhysIBEventAlerter.Create(Self, AEventKind)

26 сен 17, 11:54    [20823280]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9501
Я тоже читать умею. И ?
26 сен 17, 15:28    [20824232]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
hvlad
Member

Откуда:
Сообщений: 9233
Dmitry Arefiev
Я тоже читать умею. И ?
Мой вопрос был в том, правильно ли я понимаю, что FireDAC:
а) работает через IBX, по крайней мере с ивентами
б) не даёт пользователю возможности обработать ошибку при регистрации ивентов

Если это не так, то прошу показать правильный забор с корректной работой с ISC API.
26 сен 17, 15:57    [20824339]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9501
hvlad
а) работает через IBX, по крайней мере с ивентами

Если уж взялся читать надписи на заборах, то читай уж все. TIBEvents - класс живущий в FireDAC.Phys.IBWrapper. Как и многие другие, возможно совпадающие по названию с IBX. Такой стандарт наименования классов-оберток в FireDAC / AnyDAC от рождения.
hvlad
б) не даёт пользователю возможности обработать ошибку при регистрации ивентов

Был бы благодарен за детали / шаги вопроизведения / тестовый проект.
26 сен 17, 19:52    [20824946]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
Dmitry Arefiev
hvlad
б) не даёт пользователю возможности обработать ошибку при регистрации ивентов

Был бы благодарен за детали


Внезапно (с) 20820615
27 сен 17, 13:26    [20826561]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
hvlad
Member

Откуда:
Сообщений: 9233
Я себе даже представить не мог, что TIBEvents - это не IBX ;)
Правда, читал код в notepad++, т.е. без навигации по исходникам - IDE подсказала бы.
Ок, тогда вопросы с обработкой ошибок снимаются.
27 сен 17, 14:46    [20826846]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
hvlad
тогда вопросы с обработкой ошибок снимаются.


20820719
hvlad
нет и не может быть никакого оправдания сокрытию ошибок от пользователя.


....ну, тебе виднее
27 сен 17, 14:57    [20826885]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
hvlad
Member

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

сокрытие ошибки было бы, если бы TIBEvents был из IBX.
В FireDAC другой класс с тем же именем, и ошибки там обрабатываются иначе.
Я пока не вижу, чтобы их там прятали.
27 сен 17, 15:50    [20827075]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
st90
Member

Откуда:
Сообщений: 259
Всем привет!
Заливаю записи в StringGrid руками.
Через LiveBindings загружались все записи.
Сейчас только 50.
Это из-за FetchOptions.RowsetSize в Query?
Записей всего 50. А как раньше тогда работало? ...
Все настройки по умолчанию.
28 сен 17, 15:08    [20829206]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
st90
Заливаю записи в StringGrid руками.


Ждём телепатов, чтобы они твой "ручной" код нам на ушко прошептали
28 сен 17, 17:23    [20829774]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 888
st90
Всем привет!
Заливаю записи в StringGrid руками.
Через LiveBindings загружались все записи.
Сейчас только 50.
Это из-за FetchOptions.RowsetSize в Query?
Записей всего 50. А как раньше тогда работало? ...
Все настройки по умолчанию.

FetchMode видимо стоит OnDemand - т.е. по запросу... видимо livebinding все время запрашивал пока не закончились..
а тебе надо фетчить также тогда.. или режим выстави fmAll и будет счастье
28 сен 17, 20:36    [20830159]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
st90
Member

Откуда:
Сообщений: 259
X-Cite, да, точно, спасибо!

Тут другая проблема. Изначально я убрал LiveBindings , т.к. думал тормозит заливка грида из-за него.
Запрос - результат 250 строк, есть join'ы.
Сам запрос из Delphi выполняется моментально.
А заливка даже ручная, какую я написал всё-равно тормозит и заливает в грид секунд 15-20...
Подскажите как ускорить и в чем косяк?
Delphi XE6

MainForm.StringGrid1.BeginUpdate;
try
MainForm.qClients.First;
for i:=0 to MainForm.qClients.RecordCount-1 do
  begin
    MainForm.StringGrid1.RowCount:=MainForm.StringGrid1.RowCount+1;
    MainForm.StringGrid1.Cells[0, i] :=MainForm.qClients.FieldByName('FAM').AsString;
    MainForm.StringGrid1.Cells[1, i] :=MainForm.qClients.FieldByName('IM').AsString;
    MainForm.StringGrid1.Cells[2, i] :=MainForm.qClients.FieldByName('ID').AsString;
    MainForm.zqClients.Next;
  end;

finally
    MainForm.StringGrid1.EndUpdate;
end;
29 сен 17, 08:27    [20830745]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Guest7777
Guest
st90,

Попробуй RowCount один раз сразу нужного размера установить.
29 сен 17, 09:37    [20830853]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
st90
Member

Откуда:
Сообщений: 259
Guest7777, не помогло...
29 сен 17, 09:54    [20830882]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
AX-Class
Member

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

Если FieldByName за цикл вынести, тоже чуть ускорится.
Не привязан ли MainForm.qClients к чему-нить еще?
29 сен 17, 14:32    [20831830]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
st90
    MainForm.StringGrid1.Cells[0, i] :=MainForm.qClients.FieldByName('FAM').AsString;


1. Никогда не вызывай FieldByName внутри цикла.
Вызывай его ПЕРЕД циклом

2. .AsString тут неправильно - правильнее, кажется, .DisplayText

3. Зачем вообще этот геморрой, почему не взять TDBGrid ?
29 сен 17, 14:47    [20831883]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
st90
MainForm.qClients.First;
...    MainForm.zqClients.Next;


так qClients или zqClients ?
29 сен 17, 14:54    [20831910]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
st90
Member

Откуда:
Сообщений: 259
AX-Class, вроде не привязан.

Arioch, опечатка, в коде везде одинаковое имя Query

А как вызывать FieldByName до цикла? [facepalm]
Мы же в цикле по записям ходим...
29 сен 17, 15:09    [20831963]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
st90
опечатка, в коде везде одинаковое имя Query


Другими словами, ты нам показываешь не реальный код, который тормозит, а какой-то другой код
29 сен 17, 15:15    [20831985]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
st90
Мы же в цикле по записям ходим...


ну и ходи, зачем тебе FieldByName там вызывать ?

https://ru.wikipedia.org/wiki/Переменная_(программирование)
29 сен 17, 15:16    [20831990]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
Еще можно перестать дёргать ячейки по одной.

MainForm.StringGrid1.Rows[i].Text := F1.DisplayText + ^M^J + F2.DisplayText + ^M^J + F3.DisplayText;

Но будет это быстрее или медленне - хз
29 сен 17, 15:19    [20832000]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
st90
Сам запрос из Delphi выполняется моментально.


Это он открывается мгновенно, а как долго он выполняется - надо ещё проверять.

with MainForm.qClients do try
  Close;
  Open; // First;
  while not EOF do begin
    for i := 0 to Pred( FieldCount ) do
      s := Fields[ i ].DisplayText;
    Next;
  end;
finally
  Close;
end;
29 сен 17, 15:24    [20832012]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
st90
Member

Откуда:
Сообщений: 259
Arioch
st90
Сам запрос из Delphi выполняется моментально.


Это он открывается мгновенно, а как долго он выполняется - надо ещё проверять.

with MainForm.qClients do try
  Close;
  Open; // First;
  while not EOF do begin
    for i := 0 to Pred( FieldCount ) do
      s := Fields[ i ].DisplayText;
    Next;
  end;
finally
  Close;
end;


Видимо Вы правы, Ваш код тоже медленно работает.
Тогда в чем причина?
Запрос в "MySql менеджере" выполняется 250 мс
29 сен 17, 15:32    [20832034]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Arioch
Member

Откуда:
Сообщений: 9038
1) открывается или выполняется? Первая строка запроса или последняя?
2) либо ищите профайлером, либо просматривайте ВЕСЬ код

любые ваши события на компонентах FireDAC могут начать что-то хитрое и долгое делать.
или какие-то связи между разными компонентами типа master-detail

у FD очень много автоматической функциональности, которую вы могли включи ьи забыть

как вариант - прямо в вашей процедуре создайте новую локальную FDQuery, к которой точно снаружи процедуры никто никакого доступа не имеет, и попробуйте этот запрос в новой чистенькой локальной FDQuery

Also TDataSet.DisableControls
29 сен 17, 15:37    [20832056]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 25 26 27 28 29 30 31 32 [33] 34   вперед  Ctrl
Все форумы / Delphi Ответить