Продолжение теста

Средство повышения производительности информационных систем

Продолжение теста

Сообщение sancho19 30 янв 2011, 23:28

Пересобрал на обновленных компонентах.
Получил следуюшие ошибки в работе.


Не работает метод QueryValueAsStr, QueryValues
К примеру
S := pFIBDBMiniOffice.QueryValueAsStr('SELECT D.User_Name FROM S_Users D WHERE D.User_Name = ''SYSDBA''', 0);
'SYSBDA' is no valid date


не генерит RefreshSQL
SELECT S.*
FROM SECTION_LIST S
WHERE
(S.ITEM_NO > 0)
ORDER BY S.SECTION_NAME
Unable to generate RefreshSQL because fiels for "Section_List" do not exist in dataset

На запрос
SELECT R.*
FROM MO_FRX_REPORT R
where
(R.App_No = :App_No) and (R.REPORT_GRP_NO = :REPORT_GRP_NO) and
(('PUBLIC' = R.USER_LIST) or (CURRENT_ROLE = 'USER_FULL') or
(R.USER_LIST CONTAINING CURRENT_USER || ',' ) or
(R.USER_LIST CONTAINING CURRENT_ROLE || ',') or (:Designer > 0))
ORDER BY R.ITEM_NAME
Поле CURRENT_USER не найдено ни в каком источнике данных
и далее Источник данных RDB$RELATIONS не найден в базе

На вызове
moProdEbedSize := pFIBDSSklad.Database.QueryValue('select PROD_TREE_EBED_SIZE from SK_OPTION', 0);
MDT transaction alredy open
и в отладке зависает приложение и после Reset(F2) вешается Delphi7
А отделно запущенное, загружается дальше
sancho19
 
Сообщения: 25
Зарегистрирован: 18 янв 2011, 16:04

Re: Продолжение теста

Сообщение Мишенков Александр 31 янв 2011, 09:06

Саша, пришли пожалуста на почту базу или скрипт создание методанных под эти запросы.
Мишенков Александр
 
Сообщения: 25
Зарегистрирован: 05 фев 2010, 17:31

Re: Продолжение теста

Сообщение sancho19 31 янв 2011, 09:54

Саша, пришли пожалуста на почту базу или скрипт создание методанных под эти запросы.


База та же, что высылал ранее. Если не найдете, то сообщите. Тогда сделаю и вышлю новую.
sancho19
 
Сообщения: 25
Зарегистрирован: 18 янв 2011, 16:04

Re: Продолжение теста

Сообщение Мишенков Александр 31 янв 2011, 12:14

Саша, база у нас есть, разбираемся
sancho19 писал(а):Пересобрал на обновленных компонентах.
Получил следуюшие ошибки в работе.
Не работает метод QueryValueAsStr, QueryValues
К примеру
S := pFIBDBMiniOffice.QueryValueAsStr('SELECT D.User_Name FROM S_Users D WHERE D.User_Name = ''SYSDBA''', 0);
'SYSBDA' is no valid date

Ты эту ошибку можешь видеть только в отладчике, она подавляется и на уровень приложения никогда не доходит.
Приведенный запрос успешно обрабатывается MDT-движком.
Ты отключи у себя Stop on delphi exception и смотри только те ошибки, которые у тебя поднимаются до уровня приложения.

sancho19 писал(а):не генерит RefreshSQL
SELECT S.*
FROM SECTION_LIST S
WHERE
(S.ITEM_NO > 0)
ORDER BY S.SECTION_NAME
Unable to generate RefreshSQL because fiels for "Section_List" do not exist in dataset

Уточни, как это воспроизвести?

sancho19 писал(а):На запрос
SELECT R.*
FROM MO_FRX_REPORT R
where
(R.App_No = :App_No) and (R.REPORT_GRP_NO = :REPORT_GRP_NO) and
(('PUBLIC' = R.USER_LIST) or (CURRENT_ROLE = 'USER_FULL') or
(R.USER_LIST CONTAINING CURRENT_USER || ',' ) or
(R.USER_LIST CONTAINING CURRENT_ROLE || ',') or (:Designer > 0))
ORDER BY R.ITEM_NAME
Поле CURRENT_USER не найдено ни в каком источнике данных
и далее Источник данных RDB$RELATIONS не найден в базе

Опять же, ты здесь имеешь дело с ошибкой, которая потом подавляется и на уровень приложения не выходит! Но в этом запросе есть особенность, он пока не может быть выполнен MDT-движком, так как в нем нет реализации для CURRENT_ROLE , CURRENT_USER. Мы этот недочет устраним. Пока же такой запрос, согласно общей методологии MDT, передается на сервер, что обеспечивает работоспособность приложения.
Сведения о запросах которые не отрабатываются в MDT и передаются на сервер фиксируются в таблице MDTWarning.
Мишенков Александр
 
Сообщения: 25
Зарегистрирован: 05 фев 2010, 17:31

Re: Продолжение теста

Сообщение Мишенков Александр 31 янв 2011, 12:20

sancho19 писал(а):
Саша, пришли пожалуста на почту базу или скрипт создание методанных под эти запросы.


База та же, что высылал ранее. Если не найдете, то сообщите. Тогда сделаю и вышлю новую.

В ней нет таблицы MO_FRX_REPORT, которую ты используешь в одном из запросов.
Мишенков Александр
 
Сообщения: 25
Зарегистрирован: 05 фев 2010, 17:31

Re: Продолжение теста

Сообщение Мишенков Александр 31 янв 2011, 13:17

sancho19 писал(а):На вызове
moProdEbedSize := pFIBDSSklad.Database.QueryValue('select PROD_TREE_EBED_SIZE from SK_OPTION', 0);
MDT transaction alredy open

Это очень сложная проблема, имеющая ряд простых решений.
Грубо говоря - проблема в том, что MDT не может обеспечивать две и более параллельно открытых пишущих транзакций работающих с локальными данными.
На эту тему есть даже прилично сложный документ, но сейчас нет особого смысла в него тебе упираться. Потом, если захочешь, я тебе его вышлю.
Таким образом, в данном случае проблема не в запросе как таковом, а в том, что ты его выполнешь без указания транзакции. При этом одна из твоих пишущих транзакций находится в активном состоянии. А FIB+ для выполнения запроса без указания транзакции берет и активирует еще одну, свою внутреннею, причем пишущую транзакцию - вот и возникает конфликт. Если принять во внимание то, что выше названое ограничение MDT снять пока нельзя, то есть следующие варианты решений:
1. Всегда при выполнении Database.QueryValue указывать в какой из своих транзакций необходимо выполнить запрос, таким образом, внутренняя транзакция никогда не будет активироваться. Это самый лучший вариант.
2. Изменить свойства внутренней транзакции таким образом чтобы она не конфликтовала. Есть два варианта.
2.1. Присвоить ей свойство MDTTransactionRole=mtrSeparateTransaction
2.2. Сделать ее читающей, если есть уверенность, что нет пишущих запросов
К сожалению есть проблема, vInternalTransaction не опубликована и добраться к ней на прямую пока невозможно, нужно наследование. Надо обсудить эту проблему с Бузаджи. Пока можно просто самому внести правки в исходный код
Мишенков Александр
 
Сообщения: 25
Зарегистрирован: 05 фев 2010, 17:31


Вернуться в MDT

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 1

cron