Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: ←Ctrl назад 1 .. 38 39 40 41 42 [43] 44 45 46 47 .. 50 вперед Ctrl→ |
Stalker4 Member Откуда: Сообщений: 279 |
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] Ответить | Цитировать Сообщить модератору |
Dmitry Arefiev Member Откуда: Сообщений: 9923 |
Надо заменить метод: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] Ответить | Цитировать Сообщить модератору |
Stalker4 Member Откуда: Сообщений: 279 |
Dmitry Arefiev, Спасибо за ответ. Это в модуле FireDAC.Comp.DataSet ? Хорошо, попробую и отпишу тут результат. 1) А в 10.3 Rio это уже исправлено или нет ? 2) А что Вы можете сказать по поводу моего вопроса 21765818 (вызов обработчика AfterOpen у Detail) ? Это ошибка FD или надо выставить (убрать) какую то опцию ? |
30 дек 18, 17:04 [21776958] Ответить | Цитировать Сообщить модератору |
Dmitry Arefiev Member Откуда: Сообщений: 9923 |
10.3 уже вышел, так-что в апдейте.
Почему он должен быть вызван ? Скорее BeforeScroll / AfterScroll. Статус детального FD датасета не меняется при смене мастера. |
||||
30 дек 18, 18:28 [21776980] Ответить | Цитировать Сообщить модератору |
Stalker4 Member Откуда: Сообщений: 279 |
Как это почему, разве при движении по мастеру не происходит переоткрытия детайла, что бы прочитать новые детальные данные соответствующие новому мастеру ? А соответственно должен срабатывать и AfterOpen. Кроме того, это ИМНО стандартное поведение DataSet (проверенно на BDE, SQLDirect, NativeDB), так что очень хотелось бы, что бы и FireDAC следовал этому поведению. Можно будет внести эти исправления (изменения) в FireDAC ? А BeforeScroll / AfterScroll в этом деле не могут заменить AfterOpen, так как BeforeScroll / AfterScroll должны срабатывать при перемещении по каждой записи, а AfterOpen должен срабатывать только один раз при каждом открытии или переоткрытии запроса. P.S. Всех с наступающим Новый Годом !!! |
||||||
31 дек 18, 23:15 [21777251] Ответить | Цитировать Сообщить модератору |
Stalker4 Member Откуда: Сообщений: 279 |
Попробовал. В принципе код работает, хотя есть некоторая странность. Имеется 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 Результат запуска:
Вроде бы все нормально. До фильтра текущей строкой была с PCODE=730 (1), после установки фильтра текущей стала строка с PCODE=128 (2). Теперь в коде FilterButtonClick удаляем комментарий у строки FDQuery.First. Опять запускаем код с открытием FDQuery, и вызываем FilterButtonClick . Результат запуска уже несколько другой:
Обратите внимание, что в первом варианте (без First) сразу после установки фильтра, обработчик AfterScroll не сработал (1,2), а во втором варианте (с First) сразу после установки фильтра, обработчик AfterScroll сработал (1,4,2). Хотя в обоих случаях порядок строк после открытия FDQuery не менялся и первой строкой в обоих случаях была строка PCODE=730. Почему First до подключения обработчика AfterScroll так влияет на его выполнение не понятно. ИМНО где то там все же кроется ошибка (недоработка) вызова AfterScroll. |
||||||
9 янв 19, 10:25 [21780311] Ответить | Цитировать Сообщить модератору |
Valery_B Member Откуда: Москва Сообщений: 2032 |
Подскажите, как правильно заполнить 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] Ответить | Цитировать Сообщить модератору |
L_argo Member Откуда: Сообщений: 1386 |
Не надо тулить ООП, туда, где оно нафиг не надо. |
||
18 янв 19, 16:43 [21788924] Ответить | Цитировать Сообщить модератору |
Valery_B Member Откуда: Москва Сообщений: 2032 |
Как ? |
||
18 янв 19, 16:45 [21788927] Ответить | Цитировать Сообщить модератору |
Michael Longneck Member Откуда: Москва Сообщений: 2326 |
Я таки победил tvp для MSSQL, они работают, сколько бы параметров и записей в них не было. TDateTimeField не годится под описание datetime поля в типе, пришлось использовать TSQLTimeStampField |
19 янв 19, 10:58 [21789222] Ответить | Цитировать Сообщить модератору |
Dmitry Arefiev Member Откуда: Сообщений: 9923 |
Что значит "победил" ? |
||
19 янв 19, 12:17 [21789241] Ответить | Цитировать Сообщить модератору |
Dmitry Arefiev Member Откуда: Сообщений: 9923 |
Использовать TFDBatchMove. |
||
19 янв 19, 12:17 [21789243] Ответить | Цитировать Сообщить модератору |
Michael Longneck Member Откуда: Москва Сообщений: 2326 |
Это значит нашёл второй баг, из-за которого второй и далее параметры 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] Ответить | Цитировать Сообщить модератору |
Beltar Member Откуда: Сообщений: 214 |
D10.2.3 Получаю при работе с Access на некоторых машинах ошибку в ODBC-драйвере "Не удается открыть раздел реестра "Temporary (volatile) ACE DSN...". Насколько я понимаю, проблема может быть и не в FireDAC, а именно с ODBC и правами юзера, но воспроизвести у меня не получается. Куда же всё-таки копать? |
24 янв 19, 09:57 [21792928] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Beltar Member Откуда: Сообщений: 214 |
100 Млрд. в 4-хбайтный float не влезет. Никак. Будут потери точности. И похоже в базе тоже Float. Т. е. Single. Убить того, кто придумал использовать Float, вместо понятных Single и Double. |
24 янв 19, 15:28 [21793502] Ответить | Цитировать Сообщить модератору |
Grammton Member Откуда: Сообщений: 5 |
Beltar, Проблема не со стороны MySQL, там все норм. CAST с типом CHAR нормально выводит. Но это не дело... Я хочу узнать как решить проблему TSingleField со стороны FireDAC? Именно здесь это число толком не проходит и я не могу поле сделать в FireDAC ни float ни string |
24 янв 19, 15:48 [21793545] Ответить | Цитировать Сообщить модератору |
flashSQL Member Откуда: Сообщений: 7 |
"Проблема" со стороны чисел с плавающей точкой и результатов их неточного хранения и неточного вычисления. var R:single; begin R:=100000000000; ShowMessage(FloatToStr(R)); end; |
||
24 янв 19, 17:20 [21793671] Ответить | Цитировать Сообщить модератору |
Beltar Member Откуда: Сообщений: 214 |
В Delphi сам по себе метод TField.AsFloat возвращает Double. Посмотрите, как описано поле в БД, если оно 4 байта, то увеличьте разрядность. Напоминаю, что даже в Int32 влезают числа до плюс\минус 2 млрд с копейками всего. Single вообще применим только в двух случаях, когда в БД надо хранить массу чисто архивной информации, которая потом не будет использоваться в вычислениях, и когда нужна максимальная производительность, при допустимости потерь точности. |
25 янв 19, 10:17 [21793973] Ответить | Цитировать Сообщить модератору |
Sinemurius Member Откуда: Сообщений: 144 |
Добрый день. По просьбе 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] Ответить | Цитировать Сообщить модератору |
postgresqlfun Member Откуда: Сообщений: 2 |
При TFDQuery.CachedUpdates=true можно узнать какие именно поля изменялись и их значения? |
1 мар 19, 17:18 [21822943] Ответить | Цитировать Сообщить модератору |
Sashaua Member Откуда: Kiev Сообщений: 182 |
Подскажите, есть обертки для выполнения запросов select/insert/update/delete, в которых динамиччески создаются компоненты парсятся передаваемые параметры составляются запросы и все это дело выполняется, используется FireDAC. Как после insert/update/delete в гриде перечитать конкретно измененную запись не перечитывая ввесь набор данных? |
5 мар 19, 19:00 [21825688] Ответить | Цитировать Сообщить модератору |
Мимопроходящий Member Откуда: бурятский тундрюк, эсквайр Сообщений: 31963 |
05.03.2019 19:00, Sashaua пишет: > Как после insert/update/delete в гриде перечитать конкретно измененную запись не перечитывая ввесь набор данных? Refresh; Posted via ActualForum NNTP Server 1.5 |
6 мар 19, 14:28 [21826332] Ответить | Цитировать Сообщить модератору |
L_argo Member Откуда: Сообщений: 1386 |
|
||
6 мар 19, 17:58 [21826630] Ответить | Цитировать Сообщить модератору |
X11 Member Откуда: Kharkiv, Ukraine Сообщений: 15026 |
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 .. 38 39 40 41 42 [43] 44 45 46 47 .. 50 вперед Ctrl→ |
Все форумы / Delphi | ![]() |