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

Откуда:
Сообщений: 9537
SergSni
Хочется понять, как лечить или что делаю не так...

Это баг, просто не лечится ...
12 май 18, 11:01    [21404697]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Stalker4
Member

Откуда:
Сообщений: 222
Dmitry Arefiev
Stalker4
Мне это надо делать руками или у FDMemTable все же есть для этого готовые методы ?

http://docwiki.embarcadero.com/Libraries/Tokyo/en/FireDAC.Comp.DataSet.TFDDataSet.CopyDataSet
Вопрос по свойству FDDataSet.Data.
Это интерфейс и если я правильно понимаю, он ссылается на область памяти, где хранятся данные FDDataSet.
И когда я делаю FDDataSet2.Data := FDDataSet1.Data, я просто увеличиваю счетчик ссылок интерфейса (т.е. реального копирования данных не происходит) и по сути FDDataSet1 и FDDataSet2 будут просто ссылаться на одну и туже область памяти с данными ?
А что будет, если после FDDataSet2.Data := FDDataSet1.Data, я например у FDDataSet1 установлю свойство Filter, эти данные отфильтруются и в FDDataSet2 ? Или эта часть у FDDataSet работает независимо ?

Почитал описание метода CopyDataSet, в хелпе сказано, что он работает медленнее чем присвоение свойства Data.

А нет ли у FireDAC метода который совмещал бы достоинства CopyDataSet (в частности копирование свойств TField и индексов) с скоростью копирования данных через свойство Data ?
Ограничение "Only FDDataSet" меня не смущает.
14 май 18, 15:48    [21408586]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Stalker4
Member

Откуда:
Сообщений: 222
Где можно почитать описание класса TFDDatSRow (методы, свойства) который используется для работы с внутренней структурой данных TFDDataSet напрямую ? В хелпе к Delphi 10.2.3 (включая и его on-line версию) этого нет.

Как посредством его правильно добавлять, редактировать, удалять данные в TFDDataSet, который ReadOnly = False и CachedUpdates = False ?

Правильно ли я понимаю, что работа с данными через TFDDatSRow не вызывает срабатывание обработчиков событий TFDDataSet ?

По поводу удаления: Тут приводился такой пример
FDQuery1.GetRow.Free;
FDQuery1.Resync([]);
Я сделал немного по другому
FDQuery1.GetRow().Delete();
FDQuery1.Resync([]);
Это тоже сработало нормально, но как правильнее ?

И еще небольшой вопрос: Как я понимаю класс TFDDatSRow предназначен для работы с текущей записью.

А если мне надо аналогичным способом работать со всеми строками в TFDDataSet, причем как с учетом наложенного на TFDDataSet фильтра, так и без его учета ?

Скажем пробежаться по внутренностями TFDDataSet (без изменения текущей позиции курсора и соответственно без вызова обработчиков TFDDataSet) для поиска неких данных в TFDDataSet и (или) для изменения этих данных ?
17 май 18, 09:07    [21415670]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
vavan
Member

Откуда: Казань
Сообщений: 3039
Stalker4
Где можно почитать описание класса TFDDatSRow
мне кажется это только арефьеву если моск зохавать
17 май 18, 10:05    [21415859]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
L_argo
Member

Откуда:
Сообщений: 55
Здравствуйте Дмитрий

вопрос: если использовать в запросе врем.таблицы (MSSQL) в сочетании с нередактируемыми колонками, н-р из другой таблицы, то датасет при попытке апдейта главной таблицы ругается на нередактируемые поля.
Для обычных таблиц все работает ОК.

UpdateTable и ключ. поля в соотв. свойствах указаны. Прописка соотв. свойств в TFDUpdateSQL также не помогает.
Я так понял, что ему не нравится именно врем. таблица.
Причем апдейт все таки происходит.

Апдейт поля Qty. Запрос:
SELECT  
 #vItem.ID, 
 Item.Article, 
 Item.Description, 
 #vItem.Qty
FROM    #vItem, Item
where Item.ID = #vItem.ID



Сообщение
[FireDAC][Phys][ODBC][Microsoft][SQL Server Native Client 10.0][SQL Server]Недопустимое имя столбца "Article".


Замена посторонних полей на ф-ции, чтоб избавится от второй таблицы в FROM также не помогает.
Если в селекте нет посторонних полей, то врем. таблица апдейтится нормально.
Манипуляции со свойствами UpdateOptions не помогли.

Как быть ?
Версия ФД старая. Одна из первых как файрДАК.
17 май 18, 10:27    [21415987]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9537
Stalker4
по сути FDDataSet1 и FDDataSet2 будут просто ссылаться на одну и туже область памяти с данными ?

Нет. Создается копия структуры и данных.
Что бы датасеты ссылались на одни и теже данные, надо использовать CloneCursor.
Stalker4
А нет ли у FireDAC метода который совмещал бы достоинства CopyDataSet (в частности копирование свойств TField и индексов) с скоростью копирования данных через свойство Data ?

Нет.
Stalker4
Где можно почитать описание класса TFDDatSRow (методы, свойства) который используется для работы с внутренней структурой данных TFDDataSet напрямую ?

Это внутренняя недокументированная кухня FireDAC. В примерах можно найти раздел "DatS Layer".
Stalker4
то работа с данными через TFDDatSRow не вызывает срабатывание обработчиков событий TFDDataSet ?

Да.
Stalker4
Это тоже сработало нормально, но как правильнее ?

Free физически удаляет объект записи.
Delete помечает объект как удаленный.
Stalker4
Как я понимаю класс TFDDatSRow предназначен для работы с текущей записью.

TFDDatSRow есть запись. Объект создается для каждой записи.
Stalker4
Скажем пробежаться по внутренностями TFDDataSet

for i := 0 to FDQuery1.SourceView.Rows.Count - 1 do
  FDQuery1.SourceView.Rows[i].GetData(0);
18 май 18, 09:26    [21419431]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Dmitry Arefiev
Member

Откуда:
Сообщений: 9537
L_argo
Как быть ?
Версия ФД старая. Одна из первых как файрДАК.

Обновить версию FireDAC.
18 май 18, 09:27    [21419434]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Stalker4
Member

Откуда:
Сообщений: 222
Dmitry Arefiev
Stalker4
А нет ли у FireDAC метода который совмещал бы достоинства CopyDataSet (в частности копирование свойств TField и индексов) с скоростью копирования данных через свойство Data ?
Нет.
Может стоит такой добавить ?

Dmitry Arefiev
Stalker4
Где можно почитать описание класса TFDDatSRow (методы, свойства) который используется для работы с внутренней структурой данных TFDDataSet напрямую ?
Это внутренняя недокументированная кухня FireDAC. В примерах можно найти раздел "DatS Layer".
За ссылку на примеры спасибо, но насколько я знаю, внутренняя кухня библиотек тоже меняется не часто, поэтому ее описание, даже не официальное, тоже было бы очень полезно. Если есть возможность, то сделайте его, хотя бы кратко на уровне классов внутренних структур - какой класс для чего предназначен и общее описание его возможностей.

Dmitry Arefiev
Stalker4
Скажем пробежаться по внутренностями TFDDataSet

for i := 0 to FDQuery1.SourceView.Rows.Count - 1 do
  FDQuery1.SourceView.Rows[i].GetData(0);
Это проход по внутренностям FDQuery1 с учетом возможного фильтра или без него ?
В разных ситуациях нужны оба варианта.
18 май 18, 12:42    [21419989]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
PalychXX
Member

Откуда:
Сообщений: 136
Всем привет! Работаю с SQLite3 через FireDac.
Есть таблица (упрощенно):
CREATE TABLE shopping_cart (
    idx             INTEGER         PRIMARY KEY ASC AUTOINCREMENT
                                    UNIQUE
                                    NOT NULL,
    value        DECIMAL (15, 2) NOT NULL
                                    DEFAULT (0),
    max_value    DECIMAL (15, 2) NOT NULL
                                    DEFAULT (100)
);

Хочу создать триггеры, чтобы при попытке вставить или изменить значение поля value осуществлялась проверка, что значение не превышает max_value, а в случае превышения выполнялось присваивание value = max_value.
В SQLite Studio создал пару триггеров - после вставки и после обновления, вот пример последнего:
CREATE TRIGGER mytable_after_update
         AFTER UPDATE
            ON mytable
      FOR EACH ROW
          WHEN new.value > new.max_value
BEGIN
    UPDATE mytable
       SET value = new.max_value
     WHERE idx = new.idx;
END;

Не знаю, насколько это оптимально, но работает вроде бы правильно. Загвоздка в том, что вся БД создается при старте программы динамически. С созданием таблиц проблем нет, а при выполнении запроса на создание триггера (вставляю в запрос DDL как выше или обернутые стартом транзакции и в конце ее подтверждением) FireDac выдает ошибки:
Delphi
[FireDAC][Phys][SQLite] ERROR: near "UPDATE": syntax error
[FireDAC][Phys][SQLite] ERROR: cannot start a transaction within a transaction

Странно, где тут ошибка синтаксиса?
Пытаюсь выполнить запрос в SQLite Srudio и тоже ловлю ошибки:
SQLite Studio
Ошибка при выполнении SQL запроса к базе данных 'db_Work': near "idx": syntax error
Ошибка при выполнении SQL запроса к базе данных 'db_Work': cannot commit - no transaction is active

ЧЯДНТ?
18 май 18, 15:23    [21420638]     Ответить | Цитировать Сообщить модератору
 Re: FireDAC  [new]
Stalker4
Member

Откуда:
Сообщений: 222
Работаю с сервером SQL Anywhere 12.0.1

1) В настройках соединения я пишу
FDConnection.Params.Values['ApplicationName'] := 'ver 1.0 b10';

Со стороны сервера в переменной
connection_property('UserAppInfo')
я вижу эту строку, но она почему то заключена в фигурные скобки
{ver 1.0 b10}.
Ранее я работал с библиотекой SQL Direct и когда я там передавал это значение, то скобок не было.

2) Работаю с локальной БД
На форме у меня находятся FDPhysASADriverLink с настройками
DriverID = 'MyASA'
VendorHome = 'D:\MyProg\ASA\'
VendorLib = 'dbodbc12.dll'
и
FDConnection с настройками
DriverID=MyASA
Server=MyBase
DatabaseFile=X:\BASE\MyBase.db
ODBCAdvanced=start=dbeng12.exe
User_Name=xxx
Password=yyy

В параметре ODBCAdvanced я указываю значение для запуска локального сервера.
И сервер в принципе пытается запускаться, но запускается он не по пути VendorHome, а по пути системной переменой Path.
Хотя если в этом параметре указать путь, т.е. сделать так
ODBCAdvanced=start=D:\MyProg\ASA\dbeng12.exe
тогда локальный сервер запускается по указанному пути.

В общем хотелось, что бы новых версиях FireDAC этих проблем не было.
23 май 18, 09:19    [21431071]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 27 28 29 30 31 32 33 34 35 [36]
Все форумы / Delphi Ответить