Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / тип возвращаемого значения функции eval / 25 сообщений из 29, страница 1 из 2
17.03.2004, 16:52
    #32445870
andy753
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Есть замечательная функция Eval у DW. Все хорошо, но возвращает всегда исключительно строку. А нужно кастовать, к сожалению.

Может у кого есть мысли, как это сделать. Вариант с попытками кастования результата методом перебора понятен, но как то некрасиво.

С Уважением.
...
Рейтинг: 0 / 0
17.03.2004, 18:46
    #32446105
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Никакой eval нет, есть
Код: plaintext
Describe("Evaluate('

По вполне понятным причинам, всё что может Evaluate, может делать compute object внутри dataobjectа.
compute object может быть только 2х типов - string или numeric, соответственно о каком "методе перебора" говорим, не очень понятно, или string или number , всех дел.
...
Рейтинг: 0 / 0
17.03.2004, 19:07
    #32446142
andy753
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Сори за некорректное название - недописал :)

Пример date: dw_1.Describe("Evaluate('today()', 1)") вернет дату сконвертированную в строку. Хотелось бы ее получить в виде типа datetime в данном случае.

хотя мысль насчет computed field - интересна.
...
Рейтинг: 0 / 0
17.03.2004, 19:41
    #32446173
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Для этого существует IsDate(...)
...
Рейтинг: 0 / 0
17.03.2004, 21:13
    #32446239
PL99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
ФилиппДля этого существует IsDate(...)
Вероятно, опечатка?
Или имелось в виду нечто вроде

Код: plaintext
1.
2.
3.
4.
5.
6.
string ls_Ret
datetime ldt
ls_ret = Describe("Evaluate('...
if IsDate(ls_ret) then 
   ldt=datetime(ls_ret)
end if
...
Рейтинг: 0 / 0
17.03.2004, 22:45
    #32446274
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Какая опечатка?
...
Рейтинг: 0 / 0
18.03.2004, 10:05
    #32446572
Сотников
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
string ls_Ret
datetime ldt
ls_ret = Describe("Evaluate('...
if IsDate(ls_ret) then
ldt=datetime(ls_ret)
end if


Я думаю так будет без ошибок:


string ls_Ret
datetime ldt
ls_ret = dw_1.Describe("Evaluate('today()', 1)");
if IsDate(ls_ret) then
ldt=datetime(date(ls_ret), time(ls_ret))
end if
...
Рейтинг: 0 / 0
18.03.2004, 12:09
    #32446950
andy753
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Народ... я что непонятно писал???

Тогда попробую переформулировать: "В общем случае выражение, задаваемое функции Evaluate - ПРОИЗВОЛЬНОЕ!!! То есть я не знаю наперед, что будет подано на расчет. И второе - путь ТУПОГО перебора функций типа Is... понятен и щас работает... И спрашивалось, не знаете ли Вы БОЛЕЕ элегантного способа?"

С Уважением :)
...
Рейтинг: 0 / 0
18.03.2004, 12:10
    #32446955
andy753
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
А вариант с today() был приведен исключительно как пример, что функция возвращает больше, чем 2 типа, но кастованных к строке. :(
...
Рейтинг: 0 / 0
18.03.2004, 19:40
    #32448121
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Нет, andy753 , опять терминологические проблемы.
Функция Describe("Evaluate возвращает только ОДИН тип - string.
Результат Evaluate может быть только ДВУХ типов - string или number (смотри объяснение про compute objects).
Как интерпретировать то, что возвращает Describe("Evaluate - ваше дело, никаких коротких, generic путей НЕТ.
Вот это авторя не знаю наперед, что будет подано на расчет звучит несколько абсурдно, вы же строите интерфейс, в котором будет подано на расчет
...
Рейтинг: 0 / 0
18.03.2004, 22:04
    #32448238
andy753
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Филипп: Огромное спасибо за формулирование вопроса по новой... У вас это просто здорово получается. Если не знаешь - так не выступай. Зануда страшная. Я спрашивал про новые способы - нечего мне читать нотации при этом тупо пересказывая старое... утомил. Нечего нового донести - просто промолчи.
Огромная просьба тебе - не отвечай плиз больше на мои вопросы. И мне и тебе легче будет. Тебе от моих формулировок, а мне от твоего высокомерия и занудства.
...
Рейтинг: 0 / 0
18.03.2004, 22:48
    #32448266
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
andy753, вы ко всему прочему ещё и хам . Следить надо за манерами. Привычки из виртуала быстро и незаметно перепозают в реал. Так и по хамской харе получить можно.

Вот это авторКак интерпретировать то, что возвращает Describe("Evaluate - ваше дело, никаких коротких, generic путей НЕТ. есть конкретный (и скорее всего единственный) ответ на ваш вопрос.

А отвечать на вопросы, или нет, это позвольте мне решать (естественно в рамках того, что модератор сочтёт нужным).
...
Рейтинг: 0 / 0
18.03.2004, 22:51
    #32448269
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Честно говоря я не знаю ни одного языка программирования, в котором можно было бы из строго определенного типа (в данном случае string) сразу определить, какой тип на самом деле. Это только variant или any для PB для такого предназначены, но в данном случае раз Evaluate возвращает string, то он всегда string и действительно кроме явного использования функций проверки и проведения типа по другому не получится. Так что Филипп все правильно и точно написал, причем самым первым ответил на поставленный вопрос, поводов для обид честно говоря не вижу.

Хотелось бы узнать, для чего все это надо, честно говоря мне кажется, что функция Evaluate используется не по назначению - то есть не вычислению выражений, а проведению расчетных операций бизнес-логики. В таком случае скорее всего просто нужно менять подход, или я ошибаюсь ? :)
...
Рейтинг: 0 / 0
23.03.2004, 13:20
    #32452969
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Филиппcompute object может быть только 2х типов - string или numeric
можно узнать откуда такое утверждение/ограничение?

смотрим Help: Using DataWindow painter and InfoMaker functions
где явно указано, что:

Return values for functions and expressions
DataWindow painter and InfoMaker expressions can return the following data types:

Double

String

DateTime

Time

Within an expression, a function can return other data types (such as boolean, date, or integer) but the final value of an expression is converted to one of the four data types.


проверяем:
создадим DataWindow

добавим compute object с именем cf_today и выражением today()

добавим другой compute object с выражением string(date( cf_today ), 'YYYYMMDD') + ' / ' + string(time( cf_today ), 'hh:mm:ss')

откроем просмотр DW и видим что:
в первом compute object результат: 23.03.2004 13:06:57:08
во втором compute object результат: 20040323 / 13:06:57

следовательно тип возвращаемого значения compute object с именем cf_today является DateTime.

PS
Добавить compute object в существующий DW/DS можно с помощью dwcontrol.Modify ( modstring ) и modstring типа: "create compute(...)"

а потом уже можно получить его тип с помощью обычного свойства ColType

удалить с помощью: "destroy objectname"


===
Гришин Дмитрий
...
Рейтинг: 0 / 0
23.03.2004, 18:59
    #32453797
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Гришин Дмитрий авторхотел узнать откуда такое утверждение/ограничение (compute object может быть только 2х типов - string или numeric)?
Когда не надо, вот тогда авторсмотрим не в тот Help :-)

compute object имеет property ColType . Так вот если посмотреть в тот Help, то там ясно написано, что для compute object ColType возвращает string или numeric .
...
Рейтинг: 0 / 0
24.03.2004, 10:42
    #32454313
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Филипп compute object имеет property ColType. Так вот если посмотреть в тот Help, то там ясно написано, что для compute object ColType возвращает string или numeric.

Филипп, неужели трудно попробовать? :) всего три действия:

Создай external DW,

в нем создай compute object c именем cf_today и expression равным today()

создай второй compute object с expression как describe( "cf_today.ColType" )

и что ты увидишь в результате второго compute objecta ? :)) Думаешь string или numeric?
Хоть убей, но у меня в результате datetime :)

Или по твоему cf_today это не compute object? и describe( "cf_today.ColType" ) возвращает не его property?

PS
если не сложно, кинь ссылочку на тот Help, где
Филиппясно написано, что для compute object ColType возвращает string или numeric.
===
Гришин Дмитрий
...
Рейтинг: 0 / 0
24.03.2004, 19:06
    #32455653
Филипп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
О да, есть некоторые аномалии с DateTime, причём интересно, что если expression вот такой - Date(Today()), то ругаться не будет, но всё равно вернёт DateTime. А если Time(Today()), то вернёт Time.
Во всех остальных случаях вернёт или string или number.

Ну что же, это сильно упрощает поставленную задачу, особенно в свете Evaluate... :-)
То есть для любого вычисляемого выражения нужно не Evaluate использовать, а создавать на лету compute object, делать его expression = любого вычисляемого выражения (что само по себе не тривиально, тилды там всякие и т.п.), потом делать describe("на лету compute object.ColType" ) и вуаля - один из 3 (сорри ЧЕТЫРЁХ вариантов, считая Time) мы получим и сможем сделать правильный GetItemxxx(...). :-)
А с учетом того, что по большей части compute objectы в которых участвуют Date/Time чаще всего используют форматирование внутри выражения и так или иначе превращаются в stringи (собственно поэтому я особо о них и не думал), то вообще здорово...
...
Рейтинг: 0 / 0
25.03.2004, 11:31
    #32456392
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
ФилиппО да, есть некоторые аномалии с DateTime, причём интересно, что если expression вот такой - Date(Today()), то ругаться не будет, но всё равно вернёт DateTime. А если Time(Today()), то вернёт Time.
Во всех остальных случаях вернёт или string или number.
Никаких аномалий нет - поведение ожидаемое , согласно:
HelpWithin an expression, a function can return other data types (such as boolean, date, or integer) but the final value of an expression is converted to one of the four data types.

А на счет чем лучше пользоваться Describe(Evaluate... или подключать на лету compute object - решать разработчику. Главное что бы был выбор.

Могу сказать, что в моем проекте использование подключаемых compute object'ов до начала обработки DS и использование GetItemxxx(...) в процессе обработки позволило повысить производительность на 50%. И это только на тестовом примере, в котором DS состоит из 75 строк + 40 определяемых пользователем вычислимых полей. Что в общем-то объяснимо - быстрее получить готовое значение, чем постоянно его вычислять.

Мысли вслухнебольшое отступление
немного странно, что в PFC (до 6.5.1, дальше не смотрел ) используют постоянный перерасчет expression для compute object'а в функциях of_GetItemxxx(...)
Единственное объяснение этого - что Sybase не гарантирует, что в данный момент в этом compute object'e находится правильный результат, и расчитывает его заново, на всякий случай...
Неужели в compute object'е может храниться неактуальное значение? Может такое быть?

Согласен с тем, что Филипппо большей части compute objectы в которых участвуют Date/Time чаще всего используют форматирование внутри выражения и так или иначе превращаются в stringи, но все-таки, иногда приходится работать с вычислимыми полями с возвращамыми значениями не только string & numeric, хотя бы для использования результата одного compute в другом без лишних cast'ов и преобразований.

===
Гришин Дмитрий
...
Рейтинг: 0 / 0
25.03.2004, 12:44
    #32456634
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
авторМогу сказать, что в моем проекте использование подключаемых compute object'ов до начала обработки DS и использование GetItemxxx(...) в процессе обработки позволило повысить производительность на 50%. И это только на тестовом примере, в котором DS состоит из 75 строк + 40 определяемых пользователем вычислимых полей. Что в общем-то объяснимо - быстрее получить готовое значение, чем постоянно его вычислять.
Люди, обьясните вы мне недогадливому, чего с этой evaluate так много делаете и зачем так много computed column в DW ? Я честно говоря кроме как через Evaluate получить текущее значение некоего свойства, у которого на него стоит expression, другого использования этой функции не придумал.
...
Рейтинг: 0 / 0
25.03.2004, 13:13
    #32456721
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
ASCRUS Люди, обьясните вы мне недогадливому, чего с этой evaluate так много делаете и зачем так много computed column в DW ? Я честно говоря кроме как через Evaluate получить текущее значение некоего свойства, у которого на него стоит expression, другого использования этой функции не придумал.
Да много чего можно делать. Допустим - есть SetDetailHeight, а о GetDetailHeight PowerSoft/Sybase почему-то (что вообще-то в их стиле :) ) забыл. evaluate только и спасает. Или вот
evaluate('sum(if(col_name<100,0,col_name) for all)',1)
и компактнее и быстрее чем соответствующий скрипт.
А про 40 computed object'ов - так это разве много? Помесячный отчет типа crosstab с подведением итогов по 2 группам - уже не менее 36 штук.
...
Рейтинг: 0 / 0
25.03.2004, 13:29
    #32456761
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Здесь ключевые слова "определяемых пользователем"
а пользователь их может определить сколько его душе угодно, и нельзя его в этом ограничивать...

Локшин МаркДа много чего можно делать.
Это точно.

2 Локшин Марк
Локшин Марка о GetDetailHeight PowerSoft/Sybase почему-то (что вообще-то в их стиле :) ) забыл. evaluate только и спасает.
разве rowheight() не спасет?

===
Гришин Дмитрий
...
Рейтинг: 0 / 0
25.03.2004, 14:10
    #32456905
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
dGrichine разве rowheight() не спасет?
Ну, а вычислять ее вы как собираетесь? evaluate('rowheight()',row_number)
...
Рейтинг: 0 / 0
25.03.2004, 14:34
    #32456974
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
Локшин МаркНу, а вычислять ее вы как собираетесь?

HelpThis expression for a computed field in the detail band displays the height of each row:
RowHeight()

dw.getItemNumber(dw.GetRow(), <compute object name> )

т.е. так же как и получаем значение любой другой колонки с использованием функций getItem

===
Гришин Дмитрий
...
Рейтинг: 0 / 0
25.03.2004, 14:54
    #32457031
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
dGrichinedw.getItemNumber(dw.GetRow(), <compute object name> )
т.е. так же как и получаем значение любой другой колонки с использованием функций getItem
А если такого <compute object name> нет? Создавать его? Ну просто замечательно.
Или вы про то, что принципиально без evaluate можно?
...
Рейтинг: 0 / 0
25.03.2004, 15:22
    #32457088
dGrichine
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
тип возвращаемого значения функции eval
авторА если такого <compute object name> нет? Создавать его? Ну просто замечательно.
Или вы про то, что принципиально без evaluate можно?

Все зависит от того где вы и зачем используете эквивалент своей GetDetailHeight.

Можно создать на этапе разработки, можно добавить перед обработкой, можно не создавать и рассчитывать постоянно через evaluate, когда необходимо, а можно и вообще не создавать, если определение высоты строки используется для форматирования высоты других объектов в строке...

Так зачем вам высота строки?

===
Гришин Дмитрий
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / тип возвращаемого значения функции eval / 25 сообщений из 29, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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