Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PowerBuilder Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 тип возвращаемого значения функции eval  [new]
andy753
Member

Откуда: Moscow
Сообщений: 368
Есть замечательная функция Eval у DW. Все хорошо, но возвращает всегда исключительно строку. А нужно кастовать, к сожалению.

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

С Уважением.
17 мар 04, 16:52    [583378]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Никакой eval нет, есть
Describe("Evaluate('

По вполне понятным причинам, всё что может Evaluate, может делать compute object внутри dataobjectа.
compute object может быть только 2х типов - string или numeric, соответственно о каком "методе перебора" говорим, не очень понятно, или string или number, всех дел.
17 мар 04, 18:46    [583716]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
andy753
Member

Откуда: Moscow
Сообщений: 368
Сори за некорректное название - недописал :)

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

хотя мысль насчет computed field - интересна.
17 мар 04, 19:07    [583763]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Для этого существует IsDate(...)
17 мар 04, 19:41    [583800]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
PL99
Member

Откуда: Moscow
Сообщений: 1367
Филипп
Для этого существует IsDate(...)

Вероятно, опечатка?
Или имелось в виду нечто вроде


string ls_Ret
datetime ldt
ls_ret = Describe("Evaluate('...
if IsDate(ls_ret) then
ldt=datetime(ls_ret)
end if
17 мар 04, 21:13    [583889]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Какая опечатка?
17 мар 04, 22:45    [583936]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
Сотников
Member

Откуда: Санкт-Петербург
Сообщений: 188


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
18 мар 04, 10:05    [584294]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
andy753
Member

Откуда: Moscow
Сообщений: 368
Народ... я что непонятно писал???

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

С Уважением :)
18 мар 04, 12:09    [584776]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
andy753
Member

Откуда: Moscow
Сообщений: 368
А вариант с today() был приведен исключительно как пример, что функция возвращает больше, чем 2 типа, но кастованных к строке. :(
18 мар 04, 12:10    [584781]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
Нет, andy753, опять терминологические проблемы.
Функция Describe("Evaluate возвращает только ОДИН тип - string.
Результат Evaluate может быть только ДВУХ типов - string или number (смотри объяснение про compute objects).
Как интерпретировать то, что возвращает Describe("Evaluate - ваше дело, никаких коротких, generic путей НЕТ.
Вот это
автор
я не знаю наперед, что будет подано на расчет
звучит несколько абсурдно, вы же строите интерфейс, в котором будет подано на расчет
18 мар 04, 19:40    [586203]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
andy753
Member

Откуда: Moscow
Сообщений: 368
Филипп: Огромное спасибо за формулирование вопроса по новой... У вас это просто здорово получается. Если не знаешь - так не выступай. Зануда страшная. Я спрашивал про новые способы - нечего мне читать нотации при этом тупо пересказывая старое... утомил. Нечего нового донести - просто промолчи.
Огромная просьба тебе - не отвечай плиз больше на мои вопросы. И мне и тебе легче будет. Тебе от моих формулировок, а мне от твоего высокомерия и занудства.
18 мар 04, 22:04    [586341]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
Филипп
Member

Откуда: Boston, MA, USA (c 1989 ) б. Москва
Сообщений: 1880
andy753, вы ко всему прочему ещё и хам. Следить надо за манерами. Привычки из виртуала быстро и незаметно перепозают в реал. Так и по хамской харе получить можно.

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

А отвечать на вопросы, или нет, это позвольте мне решать (естественно в рамках того, что модератор сочтёт нужным).
18 мар 04, 22:48    [586373]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
Честно говоря я не знаю ни одного языка программирования, в котором можно было бы из строго определенного типа (в данном случае string) сразу определить, какой тип на самом деле. Это только variant или any для PB для такого предназначены, но в данном случае раз Evaluate возвращает string, то он всегда string и действительно кроме явного использования функций проверки и проведения типа по другому не получится. Так что Филипп все правильно и точно написал, причем самым первым ответил на поставленный вопрос, поводов для обид честно говоря не вижу.

Хотелось бы узнать, для чего все это надо, честно говоря мне кажется, что функция Evaluate используется не по назначению - то есть не вычислению выражений, а проведению расчетных операций бизнес-логики. В таком случае скорее всего просто нужно менять подход, или я ошибаюсь ? :)
18 мар 04, 22:51    [586376]     Ответить | Цитировать Сообщить модератору
 Re: тип возвращаемого значения функции eval  [new]
dGrichine
Member

Откуда: Москва
Сообщений: 135
Филипп
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"


    ===
    Гришин Дмитрий
  • 23 мар 04, 13:20    [592069]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    Филипп
    Member

    Откуда: Boston, MA, USA (c 1989 ) б. Москва
    Сообщений: 1880
    Гришин Дмитрий
    автор
    хотел узнать откуда такое утверждение/ограничение (compute object может быть только 2х типов - string или numeric)?

    Когда не надо, вот тогда
    автор
    смотрим не в тот Help
    :-)

    compute object имеет property ColType. Так вот если посмотреть в тот Help, то там ясно написано, что для compute object ColType возвращает string или numeric.
    23 мар 04, 18:59    [593094]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    dGrichine
    Member

    Откуда: Москва
    Сообщений: 135
    Филипп
    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.

    ===
    Гришин Дмитрий
  • 24 мар 04, 10:42    [593758]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    Филипп
    Member

    Откуда: Boston, MA, USA (c 1989 ) б. Москва
    Сообщений: 1880
    О да, есть некоторые аномалии с 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и (собственно поэтому я особо о них и не думал), то вообще здорово...
    24 мар 04, 19:06    [595404]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    dGrichine
    Member

    Откуда: Москва
    Сообщений: 135
    Филипп
    О да, есть некоторые аномалии с DateTime, причём интересно, что если expression вот такой - Date(Today()), то ругаться не будет, но всё равно вернёт DateTime. А если Time(Today()), то вернёт Time.
    Во всех остальных случаях вернёт или string или number.

    Никаких аномалий нет - поведение ожидаемое, согласно:
    Help
    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.


    А на счет чем лучше пользоваться 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'ов и преобразований.

    ===
    Гришин Дмитрий
    25 мар 04, 11:31    [596274]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    ASCRUS
    Member

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

    Люди, обьясните вы мне недогадливому, чего с этой evaluate так много делаете и зачем так много computed column в DW ? Я честно говоря кроме как через Evaluate получить текущее значение некоего свойства, у которого на него стоит expression, другого использования этой функции не придумал.
    25 мар 04, 12:44    [596563]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    Локшин Марк
    Member

    Откуда: Воронеж
    Сообщений: 3154
    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 штук.
    25 мар 04, 13:13    [596672]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    dGrichine
    Member

    Откуда: Москва
    Сообщений: 135
    Здесь ключевые слова "определяемых пользователем"
    а пользователь их может определить сколько его душе угодно, и нельзя его в этом ограничивать...

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

    Это точно.

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

    разве rowheight() не спасет?

    ===
    Гришин Дмитрий
    25 мар 04, 13:29    [596725]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    Локшин Марк
    Member

    Откуда: Воронеж
    Сообщений: 3154
    dGrichine
    разве rowheight() не спасет?

    Ну, а вычислять ее вы как собираетесь? evaluate('rowheight()',row_number)
    25 мар 04, 14:10    [596899]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    dGrichine
    Member

    Откуда: Москва
    Сообщений: 135
    Локшин Марк
    Ну, а вычислять ее вы как собираетесь?


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


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

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

    ===
    Гришин Дмитрий
    25 мар 04, 14:34    [597002]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    Локшин Марк
    Member

    Откуда: Воронеж
    Сообщений: 3154
    dGrichine
    dw.getItemNumber(dw.GetRow(), <compute object name> )
    т.е. так же как и получаем значение любой другой колонки с использованием функций getItem

    А если такого <compute object name> нет? Создавать его? Ну просто замечательно.
    Или вы про то, что принципиально без evaluate можно?
    25 мар 04, 14:54    [597081]     Ответить | Цитировать Сообщить модератору
     Re: тип возвращаемого значения функции eval  [new]
    dGrichine
    Member

    Откуда: Москва
    Сообщений: 135
    автор
    А если такого <compute object name> нет? Создавать его? Ну просто замечательно.
    Или вы про то, что принципиально без evaluate можно?


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

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

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

    ===
    Гришин Дмитрий
    25 мар 04, 15:22    [597173]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
    Все форумы / PowerBuilder Ответить