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

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

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

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

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

хотя мысль насчет computed field - интересна.
...
Рейтинг: 0 / 0
тип возвращаемого значения функции eval
    #32446173
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для этого существует IsDate(...)
...
Рейтинг: 0 / 0
тип возвращаемого значения функции eval
    #32446239
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппДля этого существует 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
тип возвращаемого значения функции eval
    #32446274
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая опечатка?
...
Рейтинг: 0 / 0
тип возвращаемого значения функции eval
    #32446572
Сотников
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
тип возвращаемого значения функции eval
    #32446950
andy753
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ... я что непонятно писал???

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

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

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

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

Хотелось бы узнать, для чего все это надо, честно говоря мне кажется, что функция Evaluate используется не по назначению - то есть не вычислению выражений, а проведению расчетных операций бизнес-логики. В таком случае скорее всего просто нужно менять подход, или я ошибаюсь ? :)
...
Рейтинг: 0 / 0
тип возвращаемого значения функции eval
    #32452969
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Филипп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
тип возвращаемого значения функции eval
    #32453797
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гришин Дмитрий авторхотел узнать откуда такое утверждение/ограничение (compute object может быть только 2х типов - string или numeric)?
Когда не надо, вот тогда авторсмотрим не в тот Help :-)

compute object имеет property ColType . Так вот если посмотреть в тот Help, то там ясно написано, что для compute object ColType возвращает string или numeric .
...
Рейтинг: 0 / 0
тип возвращаемого значения функции eval
    #32454313
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Филипп 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
тип возвращаемого значения функции eval
    #32455653
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О да, есть некоторые аномалии с 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
тип возвращаемого значения функции eval
    #32456392
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФилиппО да, есть некоторые аномалии с 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
тип возвращаемого значения функции eval
    #32456634
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМогу сказать, что в моем проекте использование подключаемых compute object'ов до начала обработки DS и использование GetItemxxx(...) в процессе обработки позволило повысить производительность на 50%. И это только на тестовом примере, в котором DS состоит из 75 строк + 40 определяемых пользователем вычислимых полей. Что в общем-то объяснимо - быстрее получить готовое значение, чем постоянно его вычислять.
Люди, обьясните вы мне недогадливому, чего с этой evaluate так много делаете и зачем так много computed column в DW ? Я честно говоря кроме как через Evaluate получить текущее значение некоего свойства, у которого на него стоит expression, другого использования этой функции не придумал.
...
Рейтинг: 0 / 0
тип возвращаемого значения функции eval
    #32456721
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
тип возвращаемого значения функции eval
    #32456761
dGrichine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь ключевые слова "определяемых пользователем"
а пользователь их может определить сколько его душе угодно, и нельзя его в этом ограничивать...

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

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

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

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

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

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

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

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


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