powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / И снова: Как перечитать строку из базы ?
12 сообщений из 12, страница 1 из 1
И снова: Как перечитать строку из базы ?
    #33572909
PaulJB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть ДВ с мультитабличным источником.
Во всех таблицах источника есть вычисляемые (Computed) поля, которые отображаются в ДВ.
После Update значения этих полей в базе изменяются.
Как мне отобразить новые значения этих полей для текущей строки ДВ.

Конструкция типа - dw.ReselectRow(dw.getrow()) не подходит, т.к. этот метод обновляет только поля dw со статусом Update=Yes или типа TimeStamp и только для таблицы, которая имеет статус изменяемой (что в принципе - логично).

Как мне отобразить новые значения вычисляемых полей базы для текущей строки ?
Может кто уже сталкивался с этой проблемой ?
Подскажите решение или направьте на путь истинный ...
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33572965
pjanri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я для этого случая написал сервис, к. включается по потребности в DW и перечитывает: строчку, маркированные строки или все строки, используя SQL из DW.
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33572999
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulJBКак мне отобразить новые значения вычисляемых полей базы для текущей строки ?
Может кто уже сталкивался с этой проблемой ?
Выполнить весь запрос заново.
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33573238
AndrewN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pjanriя для этого случая написал сервис, к. включается по потребности в DW и перечитывает: строчку, маркированные строки или все строки, используя SQL из DW.

Делал в свое время тоже самое. IMHO, единственное универсальное решение.
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33573471
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrewNДелал в свое время тоже самое. IMHO, единственное универсальное решение.
В автоматическом режиме для любого запроса? Для этого, как минимум, нужно иметь SQL парсер + каким-то образом задавать способ идентификации строки (а его просто может и не быть).
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33573514
PaulJB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторя для этого случая написал сервис, к. включается по потребности в DW и перечитывает: строчку, маркированные строки или все строки, используя SQL из DW.
Я уже думал в этом направлении, но не знаю с какой стороны подступиться ...
Вот если бы исходничек ... :)
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33573620
Фотография urvas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А может стоит сделать мастер-деталь. В мастере редактируешь и апдейтишь, а в детали, соответственно, видишь все прямые и косвенные изменения.
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33574074
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк AndrewNДелал в свое время тоже самое. IMHO, единственное универсальное решение.
В автоматическом режиме для любого запроса? Для этого, как минимум, нужно иметь SQL парсер + каким-то образом задавать способ идентификации строки (а его просто может и не быть).
Смотря для какой СУБД. Под ASA у меня заточенный DataWindow как раз имеет метод ResynchRow, который синхронизирует запись по значению полей ключа, который описывается в DW как стринговое поле перечисления через запятую уникальных имен полей. Из DW список PK не беру, так как может быть не обновляемым или не соотвествующим. В итоге код выглядит примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
dw_1.ListField = 'Order_id, Product_id'

// Первый способ (передача ключа через коллекцию)
asc_n_Parameters n
n = CREATE asc_n_Parameters
n.Set('Order_id',  1 )
n.Set('Product_id',  100 )
dw_1.ResynchRow(n)
DESTROY n

// Второй способ (передача ключа через массив any[])
dw_1.ResynchRow({ 1 ,  100 })

// Третий способ (синхронизация существующей записи)
dw_1.ResynchRow(row)
Метод выщемляет запрос с DW, преобразует в подзапрос и накладывает условия ключа, то есть для запроса:
Код: plaintext
1.
2.
SELECT *
FROM OrderProducts
WHERE Value >  0 
метод перенесет и выполнит в DataStore следующий запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT *
FROM (
  SELECT *
  FROM OrderProducts
  WHERE Value >  0 
AS x
WHERE Order_id =  1  AND Product_id =  100 
Вот тут все и зависит от возможностей РСУБД. В ASA оптимизатор сам переведет этот запрос в простую форму и выполнит его с простым и эффективным планом запроса, перенося все сгенерированные условия поиска по ключу в WHERE оригинального запроса. Естественно, данный метод не будет работать для хранимых процедур, вызываемых через CALL/EXECUTE, однако многие СУБД поддерживают вызов SELECT * FROM StoredProc(), таким образом для них этой проблемы не существует. Последний штрих - параметры в запросе. У меня это решено наличием в DW события ue_get_Params(any p_Params[]), которое автоматически вызывается при Retrieve(), когда параметры не переданы при вызове метода и если возвращается не пустой массив параметров, то Retrieve вызывается по их значениям. Таким образом любой другой обьект может вызывать Retrieve() у DW, не особо задумываясь о значениях параметров и любой обьект может взять SQL Syntax у DW и выполнить его, получив параметры DW через событие ue_get_Params().
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33574529
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSСмотря для какой СУБД. Под ASA у меня заточенный DataWindow как раз имеет метод ResynchRow, который синхронизирует запись по значению полей ключа, который описывается в DW как стринговое поле перечисления через запятую уникальных имен полей. Из DW список PK не беру, так как может быть не обновляемым или не соотвествующим. В итоге код выглядит примерно так:
А если, например, запрос с UNION ALL ?
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33575310
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм, сгенериться:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT *
FROM (
  SELECT id, Value
  FROM Table1
  UNION ALL
  SELECT id, Value
  FROM Table2
) AS x
WHERE id =  1 
далее оптимизатор ASA преобразует запрос и в итоге по плану запроса будет выполнен эквивалент следующего запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT id, Value
FROM Table1
WHERE id =  1 
UNION ALL
SELECT id, Value
FROM Table2
WHERE id =  1 
Очень удобно, у меня есть пользовательские фильтры, где запрос описывается как группа, а его поля как аттрибуты фильтрации. Пользователь в PB выставляет на поля групп условия, через динамический SQL ХП ASA собирает запросы групп в виде подзапросов, сверху накладывает в WHERE условия фильтра, оптимизатор все это разбирает, выкидывает лишние неиспользуемые таблицы, перестраивает условия AND и OR по скобкам, если есть более удачные варианты и выполняет запрос. Есть фильтры, которые охватывают запросами почти всю БД (сотню таблиц), запрос генерится на сотни строк кода, на выходе план запроса получается как раз такой, как если бы я сам написал запрос ручками по заданным условиям фильтра (если бы конечно столько осилил), оптимизатор сам решает основываясь на метаинформации БД, какие таблицы нужны в запросе, как их соединять (кстати не забываем про KEY JOIN в ASA, позволяющий проводить автоматические неявные соединения по FK) и как оптимальнее написать условия с множеством AND и OR. В данном случае оптимизатор выступает более грамотным и умным парсером, основываясь на условиях запроса, соединениях и статистике, чем это мог бы сделать я, даже потратив значительное время на разработку такого умного парсера запросов :)

P.S. Кстати в ASA как раз есть функция REWRITE(), которой в параметре передается текст запроса и на выходе выдает версию запроса, переработанную оптимизатором - очень полезно подсматривать, как красиво и правильно писать запросы, соединять таблицы и оптимизировать условия. К примеру есть не NULL связь один ко многим PK Table1-FK Table2:
Код: plaintext
1.
2.
3.
SELECT t2.*
FROM Table1 t1
  KEY JOIN Table2 t2
WHERE (t2.Field1 =  1  OR t2.Field2 =  2 ) AND (t2.Field1 =  2  OR t2.Field2 =  2 )
функцией REWRITE() вернет следующий запрос:
Код: plaintext
1.
2.
SELECT t2.*
FROM Table2 t2
WHERE (t2.Field2 =  2 ) OR (t2.Field1 IN ( 1 ,  2 ))
где таблица Table1 будет выкинута, так как в Table2 изначально согласно FK могут содержаться только записи, присутствующие в Table1, условие перестроено, где в зависимости от статистики выборочности полей Field1 и Field2 и наличия индексов оптимизатор решит, использовать ли индекс на поле Field1 или Field2, или же сделать полный скан, что актуально, если к примеру поле Field2 = 2 в более 90% записей всей таблицы. IMHO приятный, вумный оптимизатор, на MSSQL2000 не все оптимизатор умел из того, что знаю для ASA, хотя про MSSQL2005 ничего сказать не могу, так как не видел, слышал, что он теперь гораздо умнее и сам сервер шустрее.
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33575975
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASCRUSгм, сгенериться:
Ну в принципе да. Хотя такие преобразования могут и запутать оптимизатор. На MS SQL 2000 мне удавалось его так запутать :)
...
Рейтинг: 0 / 0
И снова: Как перечитать строку из базы ?
    #33576099
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк ASCRUSгм, сгенериться:
Ну в принципе да. Хотя такие преобразования могут и запутать оптимизатор. На MS SQL 2000 мне удавалось его так запутать :)
У нас тьфу тьфу с этим все тип-топ, с выходом новых ежемесячных EBF за 2005 год я даже как то отучился план запросов смотреть, пару раз правда консультровал людей по присылаемым ими планам запросов, для ускорению выборки на таблицах с десятками миллионов записей, где соединения и фильтры запутанно накладывались и индексов подходящих не было, в итоге оптимизатор уводил большие таблицы на скан, что естественно выливалось в приличное время выполнения запроса (порядка 40 сек). Через виртуальные индексы вычислили наиболее оптимальный индекс, сделали его, переписали одно соединение, уводя его из основного плана в subquery и запрос стал летать, убрав скан с таблиц.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / И снова: Как перечитать строку из базы ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]