Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
 Узнать значения retrieve аргументов перед retrieve  [new]
roleks
Member

Откуда:
Сообщений: 243
Есть необходимость узнать значения retrieve аргументов перед retrieve.
Для возможной отмены retrieve.

Но в событии retrievestart их нет.
Ф-ю Retrieve(arg1, ...) билдер не ндает переопределить

Подскажите, куда копать?
24 окт 16, 11:21    [19814802]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
AIS
Member

Откуда:
Сообщений: 1695
Не совсем понятна задача, ведь вы же первоначально эти аргументы и задаете перед вызовом Retrieve(arg1, ...), а потом вдруг вы хотите их посмотреть и если что поменять.
Вызываете dw.Retrieve(arg1, ...) просто тогда, когда уже проверили аргументы, например в своем отдельном событии или функции, а не в событии constructor у DW.
24 окт 16, 17:56    [19817082]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
Локшин Марк
Member

Откуда: Воронеж
Сообщений: 3154
roleks
Есть необходимость узнать значения retrieve аргументов перед retrieve.
Для возможной отмены retrieve.

Но в событии retrievestart их нет.
Ф-ю Retrieve(arg1, ...) билдер не ндает переопределить

Подскажите, куда копать?

аргументы retrieve можно получить через evaluate, если я правильно помню.
24 окт 16, 18:38    [19817263]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
roleks
Member

Откуда:
Сообщений: 243
Уточню
Есть желание сделать кеширование данных на клиенте.
т.е. если уже был ретрив с такими параметрами - не делать новый а вместо него доставать данные из кеша.

Аргументы ретрив можно получить через евалюейт - но только после самого ретрива.
Мне же необходимо перед
25 окт 16, 09:43    [19818421]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
Riska
Member

Откуда: Израиль
Сообщений: 989
roleks,
dw_1.Describe("DataWindow.table.arguments") 

Но я тоже не совсем понимаю задачу.
Почему не проверить аргументы перед вызовом?
25 окт 16, 10:12    [19818585]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
roleks
Member

Откуда:
Сообщений: 243
Riska,

Где мне перед вызовом их можно узнать?
Переопределить Retrieve(arg...) билдер не дает
25 окт 16, 10:23    [19818629]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
pand
Member

Откуда: Украина Харьков
Сообщений: 330
roleks,

Судя по всему pfc Вы не используете .

Может Вам еще не поздно прикрутить к своему проекту. Отпадет очень много головной боли.
Там уже реализован механизам "перехвата" ретрива.
и технология кеширования (расшаривания) тоже.
25 окт 16, 11:09    [19818841]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
Raven A
Member

Откуда: Moscow
Сообщений: 117
Попробуйте анализировать не аргументы а сам запрос в SQLPreview
25 окт 16, 11:53    [19819133]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
AIS
Member

Откуда:
Сообщений: 1695
roleks
Уточню
Есть желание сделать кеширование данных на клиенте.
т.е. если уже был ретрив с такими параметрами - не делать новый а вместо него доставать данные из кеша.

Аргументы ретрив можно получить через евалюейт - но только после самого ретрива.
Мне же необходимо перед

Все равно не пойму, что мешает вам сохранить предыдущие аргументы и перед вызовом новых данных сравнить их с новыми аргументами, которые вы задали, и далее сделать, то что вам нужно.
Создается впечатление, что не вы задаете аргументы для Retrieve, иначе бы такой задачи не стояло.
25 окт 16, 12:44    [19819415]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
roleks
Member

Откуда:
Сообщений: 243
AIS
roleks
Уточню
Есть желание сделать кеширование данных на клиенте.
т.е. если уже был ретрив с такими параметрами - не делать новый а вместо него доставать данные из кеша.

Аргументы ретрив можно получить через евалюейт - но только после самого ретрива.
Мне же необходимо перед

Все равно не пойму, что мешает вам сохранить предыдущие аргументы и перед вызовом новых данных сравнить их с новыми аргументами, которые вы задали, и далее сделать, то что вам нужно.
Создается впечатление, что не вы задаете аргументы для Retrieve, иначе бы такой задачи не стояло.


Билдер не дает возможности переопределить Retrieve()
26 окт 16, 10:39    [19822726]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
pand
Member

Откуда: Украина Харьков
Сообщений: 330
roleks
AIS
пропущено...

....
Создается впечатление, что не вы задаете аргументы для Retrieve, иначе бы такой задачи не стояло.


Билдер не дает возможности переопределить Retrieve()


Вот же ж Вы настойчивый и упрямый.

Если у Вас используется библиотека pfc посмотрите на событие pfc_retrieve объекта pfc_u_dw

если нет
то попробую объяснить на пальцах

что Вам мешает создать свой объект унаследованный от datawindow
объявить там событие типа my_retrieve и в нем проверять параметры и в нем же вызывать или не вызывать retrieve.


разве что Вам достался мега проект в котором нет наследника datawindow

тогда Вам нужна лопата побольше чем у Геракла .
26 окт 16, 13:27    [19823666]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
avs63
Member

Откуда:
Сообщений: 69
В самом событии retrievestart значений аргументов нет. Но можно получить их в этот момент методом dw.Describe("Evaluate(..)", 0) и, в зависимости от результата, блокировать дальнейшую выборку. Никогда не пробовал, но, по идее, должно сработать.

Другой, более сложный вариант - добавить искусственно-созданный дополнительный числовой параметр (например, FooArg), а оператор WHERE выражения SQL несколько изменить, на что-то подобное:
...... WHERE <ваше_условие> AND 1=:FooArg..... 

В зависимости от условий передаете в fooArg либо 0, либо 1. Надеюсь, идея понятна.
Правда, в последнем случае придется делать retrieve() дважды.
26 окт 16, 14:58    [19824042]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
AIS
Member

Откуда:
Сообщений: 1695
roleks
...
Билдер не дает возможности переопределить Retrieve()

Не надо переопределять Retrieve()! ДО его вызова проверьте аргументы и тогда уже решайте вызывать или нет. Что здесь не понятного или не получается?

P.S. надеюсь, что вы понимаете, что при одинаковых аргументах спустя период времени могут быть получены назные наборы данных и ваша задача теряет всякий смысл.
26 окт 16, 15:50    [19824367]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
roleks
...
Для возможной отмены retrieve.
...
Подскажите, куда копать?

Копать можно сюда
PowerBuilder Help
SQLPreview event (DataWindows)

Description

Occurs immediately before a SQL statement is submitted to the DBMS. Functions that trigger DBMS activity are Retrieve, Update, and ReselectRow.
PowerBuilder event information
Event ID: pbm_dwnsql

Argument Description
request SQLPreviewFunction by value. The function that initiated the database activity.For a list of valid values, see SQLPreviewFunction.
sqltype SQLPreviewType by value. The type of SQL statement being sent to the DBMS.For a list of valid values, see SQLPreviewType .
sqlsyntax String by value. The full text of the SQL statement.
buffer DWBuffer by value. The buffer containing the row involved in the database activity. For a list of valid values, see DWBuffer.
row Long by value. The number of the row involved in the database activity, that is, the row being updated, selected, inserted, or deleted.
...

Return value

Set the return code to affect the outcome of the event:

0 Continue processing
1 Stop processing
2 Skip this request and execute the next request

For information on setting the return code in a particular environment, see "About return values for DataWindow events".

Usage

Some uses for the sqlsyntax argument are:

· Changing the SQL to be executed (you can get the value of sqlsyntax, modify it, and call SetSQLPreview)
· Keeping a record (you can write the SQL statement to a log file)

Reported row number The row number stored in row is the number of the row in the buffer, not the number the row had when it was retrieved into the DataWindow object.
If the row that caused the error is in the Filter buffer, you must unfilter it if you want the user to correct the problem.

...

Но я тоже не понимаю, почему вы так упорно не хотите сохранить аргументы в собственном коде, который обращается к встроенной функции билдера.
28 окт 16, 17:15    [19834945]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
кто тоc
Member

Откуда:
Сообщений: 8
А в чем проблема записать аргументы например в message свой и дальше проверять перед retrieve если в message есть значение то брать оттуда.
31 окт 16, 15:20    [19842365]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
roleks
Member

Откуда:
Сообщений: 243
AIS
roleks
...
Билдер не дает возможности переопределить Retrieve()

Не надо переопределять Retrieve()! ДО его вызова проверьте аргументы и тогда уже решайте вызывать или нет. Что здесь не понятного или не получается?

P.S. надеюсь, что вы понимаете, что при одинаковых аргументах спустя период времени могут быть получены назные наборы данных и ваша задача теряет всякий смысл.


хотелось просто обойтись малой кровью, не заменяя ретрив на свою ф-ю
7 ноя 16, 17:10    [19866741]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
AIS
Member

Откуда:
Сообщений: 1695
roleks
AIS
пропущено...

Не надо переопределять Retrieve()! ДО его вызова проверьте аргументы и тогда уже решайте вызывать или нет. Что здесь не понятного или не получается?

P.S. надеюсь, что вы понимаете, что при одинаковых аргументах спустя период времени могут быть получены назные наборы данных и ваша задача теряет всякий смысл.


хотелось просто обойтись малой кровью, не заменяя ретрив на свою ф-ю

Вы не поняли моей ремарки. Я посоветовал вообще нечего с Retrieve() не делать, т.к. при одних и тех же аргументах запрос может вернуть разные наборы данных спустя, например, час и ваша экономия времени приведет только к негативному результату - вы не получите новых данных, а будете довольствоваться устаревшими.

ПС. а про "малой кровью" вообще ничего не понял :( проще не куда у DW создать функцию (или событие), в которой проверять уж если таки надо аргументы, а потом её же дергать при нужде вызова Retrieve(). Ну, да ладно...
7 ноя 16, 18:31    [19867073]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
AIS
Я посоветовал вообще нечего с Retrieve() не делать, т.к. при одних и тех же аргументах запрос может вернуть разные наборы данных спустя, например, час и ваша экономия времени приведет только к негативному результату - вы не получите новых данных, а будете довольствоваться устаревшими.

Золотые слова! Полностью согласен.
Если только дополнить слегка. Можно ретрайвить что-то позволяющее оценить изменились или нет данные перед основным ретрайвом. В любом другом случае - все уже сказано выше.
8 ноя 16, 22:03    [19872244]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
roleks
Member

Откуда:
Сообщений: 243
AIS
roleks
пропущено...


хотелось просто обойтись малой кровью, не заменяя ретрив на свою ф-ю

Вы не поняли моей ремарки. Я посоветовал вообще нечего с Retrieve() не делать, т.к. при одних и тех же аргументах запрос может вернуть разные наборы данных спустя, например, час и ваша экономия времени приведет только к негативному результату - вы не получите новых данных, а будете довольствоваться устаревшими.

ПС. а про "малой кровью" вообще ничего не понял :( проще не куда у DW создать функцию (или событие), в которой проверять уж если таки надо аргументы, а потом её же дергать при нужде вызова Retrieve(). Ну, да ладно...


Самое простое и правильное решение- переопределение ретрива
Но, к сожалению, 'то невозможно
Все остальные варианты решений требуют изменения не только 1 обьекта ДВ, но и мест откуда вызывается ретрив, коих в коде немало
11 ноя 16, 11:45    [19882225]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
pand
Member

Откуда: Украина Харьков
Сообщений: 330
AIS
roleks
пропущено...


хотелось просто обойтись малой кровью, не заменяя ретрив на свою ф-ю

Вы не поняли моей ремарки. Я посоветовал вообще нечего с Retrieve() не делать, т.к. при одних и тех же аргументах запрос может вернуть разные наборы данных спустя, например, час и ваша экономия времени приведет только к негативному результату - вы не получите новых данных, а будете довольствоваться устаревшими.

ПС. а про "малой кровью" вообще ничего не понял :( проще не куда у DW создать функцию (или событие), в которой проверять уж если таки надо аргументы, а потом её же дергать при нужде вызова Retrieve(). Ну, да ладно...



TO roleks

Вчитайтесь в выделенные слова очень внимательно. Они не имеют смысла только если в одно рабочее место и никто и ничто не может изменить данные , кроме как из единственного экземпляра вашей программы.

Будьте благоразумны .
и судя по вашей фразе

roleks
Все остальные варианты решений требуют изменения не только 1 обьекта ДВ, но и мест откуда вызывается ретрив, коих в коде немало


pfc вы таки не используете , что добавляет Вам лишней головной боли
11 ноя 16, 14:09    [19883121]     Ответить | Цитировать Сообщить модератору
 Re: Узнать значения retrieve аргументов перед retrieve  [new]
spas2001
Member

Откуда: Тамбов--->Москва-->Тамбов-->Москва-->Тамбов
Сообщений: 2010
roleks
Самое простое и правильное решение- переопределение ретрива
Но, к сожалению, 'то невозможно
Все остальные варианты решений требуют изменения не только 1 обьекта ДВ, но и мест откуда вызывается ретрив, коих в коде немало

Ну почему невозможно? Сделайте DW на основе процедуры и переопределяйте все что хотите внутри нее.
11 ноя 16, 19:10    [19884566]     Ответить | Цитировать Сообщить модератору
Все форумы / PowerBuilder Ответить