Я все продолжаю изучать ваши компоненты. Стараюсь смотреть сначала в Getting started и Architecture guide, но там не все вопросы освещены. Чертовски не хватает справки (особенно по поводу некоторых свойств): все таки искать ответ на вопрос легче и быстрее в справке. Ну да ладно, к вопросам: 1. Есть ли возможность локализации ГУИ-компонент без перекомпиляции. Т.е., можно обратиться к свойствам, например, ЛогинДиалога (ЭррорДиалога) и установить свои значения текстовых надписей (кроме заголовка)?
2. Существует ли возможность ограничить внутренний кэш для master-detail Query? Вообще ограничение (или способ управлять) у него какое-то есть, или он будет заполняться, пока будут поступать данные? Ну, вы понимаете, в чем суть возможной проблемы: память не резиновая.
3. В демке CDS_MasterDetail я обнаружил, что данные мастер докачиваются по мере необходимости, а данные детайл закачались сразу все при первом открытии мастер. Это баг или так было задумано (настроено через свойства)? Или это ограничение реализации мастер-детайл через ADCommand?
4. Я раньше использовал в своих проектах SDAC. При внедрении программ в ини-файл выносил настройки соединения, чтобы можно было править прямо на машине заказчика. Каким образом можно хранить (и легко править) данные для соединения при использовании AnyDAC? В особенности меня интересует указание не имени сервера, а IP с конкретным портом.
5. Как правильно выйти из ситуации с ЛогинДиалогом, когда пользователь неправильно ввел данные (несколько раз) или нажал кнопку отмена? В обеих случаях возникает ошибка (я в демке смотрел) с соответсвующим сообщением. Обработать ошибку в Connection.OnError, Connection.OnLogin, LoginDialog.OnLogin?
6. Допустим, есть главная форма приложения (часть меню генерируется по данным из БД в зависимости от введенного логина), на которой находится Connection и ЛогинДиалог. Как правильно в этом случае подключиться к серверу, настройки которого указаны в ини-файле, получить нужные данные, чтобы в OnCreate формы можно было построить пользовательское меню? Этот вопрос немного перекликается с 5, т.к. при неудачном соединении (или отмене соединения) данные для построения меню формы получены не будут.
7. В дополнение к 6-му вопросу, для уточнения. Приостанавливается ли Form.OnCreate на момент Connection.Open (и вызов ЛогинДиалога)? Т.е. после Connection.Open я точно могу знать, что соединение установлено (или не установлено) через его свойство Connected?
8. Что означают свойства (и их значения) Connection и на что они влияют (помните, сетовал на отсутствие справки)? В общем-то интересуют все нестандартные. Где об этом можно почитать?
Спасибо. Пока компоненты нравятся. Вот только не знаю, получится ли их использовать в текущем проекте. Самое обидное, что этап кодирования может начаться за неделю или две до выхода 2-й версии.
Re:Еще несколько вопросов в связи с переходом на AD
Posted: 2007/08/09 11:38
1. Все AnyDAC диалоги создаются при помощи DFM. Т.е. вы можете использовать стандартные для Delphi приложений подходы к локализации. При помощи свойств компонентов - нет, так как не все вынесено в свойство. 2. Вы можете влиять на кеширование детальных записей, включая/исключая fiDetails в FetchOptions.Cache. Если исключено то, то при смене записи мастера детальные записи "забываются". 3. Если задана клиентская сортировка (IndexName / IndexFieldNames), то при ее активизации или при открытии датасета, датасет выберет всю выборку. Или это ограничение реализации мастер-детайл через ADCommand? Либо select * from detail where master_id = :id, либо select * from detail с сортировкой по master_id. Это ограничение скорее всего природы мастер-детайл. Если хотите - предложите альтернативу. 4. 1) AnyDAC берет определения соединений из ADConnectionDefs.ini. Посмотрите алгоритм его поиска в AnyDAC_Architecture.doc. Так же можете задать путь явно - TADManager.ConnectionDefFileName. 2) Не все представлено в свойствах соединения с MSSQL. Но есть ODBCAdvanced. Туда вы можете поместить любые дополнительные параметры ODBC соединения. 5. Полностью свою обработку логина можно сделать только в OnLogin или посвоему реализовав IADGUIxLoginDialog интерфейс. 6. Событие ADConnection.BeforeConnect произойдет точно перед установкой соединения. 7. Да, уставка соединения происходит не асинхронно. То есть, после Connection.Open свойство Connected скажет правду. 8. Ни где. Скажите что конкретно интересует, отвечу. Параметры определения соединения или свойства TADConnection ?
Re:Еще несколько вопросов в связи с переходом на AD
Posted: 2007/08/10 04:30
Спасибо за ответ. Вы можете влиять на кеширование детальных записей, включая/исключая fiDetails в FetchOptions.Cache. Если исключено то, то при смене записи мастера детальные записи "забываются".
Это понятно. Меня интересовало немного другое: можно ли ограничить детайл-кэш, например, 1000 записями или существует только вкл/выкл?
Либо select * from detail where master_id = :id, либо select * from detail с сортировкой по master_id. Это ограничение скорее всего природы мастер-детайл. Если хотите - предложите альтернативу.
Ну, меня это не особо ограничивает. Я считаю, что ADCommand все таки для другого предназначена. Просто увидел в списке демок, решил посмотреть и обратил внимание на кэширование. Думаю, использование ADQuery для построения матер-детайл более оправдано и ожидаемо для других программистов (если работа в группе).
1) AnyDAC берет определения соединений из ADConnectionDefs.ini. Посмотрите алгоритм его поиска в AnyDAC_Architecture.doc. Так же можете задать путь явно - TADManager.ConnectionDefFileName.
Спасибо, именно то, что надо. Путь к ADConnectionDefs.ini лучше всего задавать в ADConnection.BeforeConnect? Он подхватиться автоматически (если задать имя в BeforeConnect) или нужно использовать метод типа Load? По IP на конкретный порт пока не могу присоединиться. Буду разбираться.
Ни где. Скажите что конкретно интересует, отвечу. Параметры определения соединения или свойства TADConnection ? Именно свойства и их значения. На что они влияют. 1. FetchOption - Items - fiMeta - ? 2. FormatOptions: InlineDataSize - ? MapRules - как будут представлены серверные типы данных на клиенте? А в каком случае это может пригодиться? StrsDivLen2 - ? StrsEmpty2Null - при передаче данных на сервер? StrsTrim - при передаче на сервер, на клиент или в обеих направлениях?
Re:Еще несколько вопросов в связи с переходом на AD
Posted: 2007/08/10 05:14
Меня интересовало немного другое: можно ли ограничить детайл-кэш, например, 1000 записями или существует только вкл/выкл?Только вкл/выкл, так как не понятно - какие записи оставлять, а какие выкидывать из кеша. Но у вас есть возможность его почистить в ручную. Путь к ADConnectionDefs.ini лучше всего задавать в ADConnection.BeforeConnect? Чем раньше, тем лучше. Если ADConnectionDefs.ini будет лежать в каталоге с приложнием, то ничего задвать не нужно. AnyDAC его сам найдет. Он подхватиться автоматически (если задать имя в BeforeConnect) или нужно использовать метод типа Load? По умолчанию - автоматически. 1. FetchOption - Items - fiMeta - ? Если fiMeta включено, то датасет будет обращаться к словарю СУБД, если это необходимо. В случае SELECT - за пк полями, в случае ХП - за определением параметров. Если fiMeta в Cache, то выбранная мета инфа будет кешироваться до конца сессии. 2. FormatOptions: InlineDataSize - ? До этого значения строковые поля будут храниться плоско - в буфере. После этого значения в буфере будет храниться указатель на значение, что снижает расход памяти при больших выборках. MapRules - как будут представлены серверные типы данных на клиенте? А в каком случае это может пригодиться? - вы не согласны с AnyDAC как он представляет типы полей - проапгрейдили СУБД, и она стала иначе описывать поля в кусоре - мигрируете на AnyDAC - пишете кросс-СУБД приложение StrsDivLen2 - ? Не обращайте внимания. StrsEmpty2Null - при передаче данных на сервер? И туда и обратно. StrsTrim - при передаче на сервер, на клиент или в обеих направлениях? И туда и обратно для строк фиксированной длины (CHAR)
Re:Еще несколько вопросов в связи с переходом на AD
Posted: 2007/08/11 07:30
Только вкл/выкл, так как не понятно - какие записи оставлять, а какие выкидывать из кеша.
Мои предложения (я понимаю, что это расширение функционала, и, возможно, вы сами думали над этим, поэтому это просто предложения, ни к чему вас не обязывающие ,само собой): Например, 1). самые старые - по метке времени (вытеснение новыми); 2). тоже используя по метку времени, но в вычислением дельты; если дельта превышает заданное значение - убрать из кэша; периодически - по таймеру (для случая, когда пользователь давно работает с текущей мастер-строкой и остальные ему не нужны); 3). старые, но по аналогу RowID. Из-за фиксированного размера кэша выростет расход памяти, но вырастет производительность. Если fiMeta включено, то датасет будет обращаться к словарю СУБД, если это необходимо. В случае SELECT - за пк полями, в случае ХП - за определением параметров. Если fiMeta в Cache, то выбранная мета инфа будет кешироваться до конца сессии.
Не могли бы вы немного остановится на этом вопросе. Я не совсем понимаю, разве метаданные не фиксируются на момент компиляции программы? Или это для случая ран-тайм операций с компонентами (например, программно создаю ADStoredProc, обращаюсь к ХП, которая возвращает набор записей и заполняю поля)?
FormatOptions InlineDataSize - До этого значения строковые поля будут храниться плоско - в буфере. После этого значения в буфере будет храниться указатель на значение, что снижает расход памяти при больших выборках.
Это значение одно на все датасеты (распределить между) текущего соединения или для каждого датасета (выделить каждому)? Какие ваши рекомендации по этому значению? Проводили ли вы тесты для определения оптимального значения для каких-то заранее известных условий?
MapRules - как будут представлены серверные типы данных на клиенте? А в каком случае это может пригодиться? - вы не согласны с AnyDAC как он представляет типы полей - проапгрейдили СУБД, и она стала иначе описывать поля в кусоре - мигрируете на AnyDAC - пишете кросс-СУБД приложение
Интересная фича. Нсколько я понимаю, она дает возможность не только перейти на ваши компоненты, но и обеспечить обратную совместимость после выхода новых версий СУБД.
StrsEmpty2Null - при передаче данных на сервер? И туда и обратно. Туда - понятно. А обратно - может исказить смысл данных (по-умолчанию стоит true). Или я не прав?
Re:Еще несколько вопросов в связи с переходом на AD
Posted: 2007/08/12 00:31
Не могли бы вы немного остановится на этом вопросе. Я не совсем понимаю, разве метаданные не фиксируются на момент компиляции программы? Или это для случая ран-тайм операций с компонентами (например, программно создаю ADStoredProc, обращаюсь к ХП, которая возвращает набор записей и заполняю поля)? Если fiMeta не в FetchOptions.Items, то запрос метаданных будет происходить. Если не включен, то: - первичные ключ будет определяться по наличию pfInKey в TField.ProviderFlags; - а запрос для ХП будет строиться на основе имени ХП и параметров в Params. Ваше дело, что использовать. Это так же как и что лучше - персистентные поля или динамические. В добавок, если вы используете Oracle, и ХП имеет параметры типа RECORD или BOOLEAN, то правильный PL/SQL блок может быть построен только с fiMeta. Это значение одно на все датасеты (распределить между) текущего соединения или для каждого датасета (выделить каждому)? Это значение для каждого датасета. Какие ваши рекомендации по этому значению? Проводили ли вы тесты для определения оптимального значения для каких-то заранее известных условий? Рекомендации - оставьте по умолчанию. И если на больших выборках заметите большой расход памяти, то уменьшайте значение. Если у вас длинные строковые поля и нет больших выборок, то можете увеличить. Пробуйте ... Туда - понятно. А обратно - может исказить смысл данных (по-умолчанию стоит true). Или я не прав? Скажу так - Oracle сделала мудрее. У них пустая строка эквивалента Null Но опять-таки, дело ваше - включить или выключить эту опцию.
Re:Еще несколько вопросов в связи с переходом на AD
Posted: 2007/08/13 01:07
По поводу FormatOptions InlineDataSize. Дело в том, что по-умолчанию стоит значение "-1" (Delphi 2007, AnyDAC 1122).
До этого значения строковые поля будут храниться плоско - в буфере. После этого значения в буфере будет храниться указатель на значение, что снижает расход памяти при больших выборках.
Это значение для каждого датасета.
Рекомендации - оставьте по умолчанию. И если на больших выборках заметите большой расход памяти, то уменьшайте значение. Если у вас длинные строковые поля и нет больших выборок, то можете увеличить. Пробуйте ...