|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Есть замечательная функция Eval у DW. Все хорошо, но возвращает всегда исключительно строку. А нужно кастовать, к сожалению. Может у кого есть мысли, как это сделать. Вариант с попытками кастования результата методом перебора понятен, но как то некрасиво. С Уважением. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2004, 16:52 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Никакой eval нет, есть Код: plaintext
По вполне понятным причинам, всё что может Evaluate, может делать compute object внутри dataobjectа. compute object может быть только 2х типов - string или numeric, соответственно о каком "методе перебора" говорим, не очень понятно, или string или number , всех дел. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2004, 18:46 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Сори за некорректное название - недописал :) Пример date: dw_1.Describe("Evaluate('today()', 1)") вернет дату сконвертированную в строку. Хотелось бы ее получить в виде типа datetime в данном случае. хотя мысль насчет computed field - интересна. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2004, 19:07 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Для этого существует IsDate(...) ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2004, 19:41 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
ФилиппДля этого существует IsDate(...) Вероятно, опечатка? Или имелось в виду нечто вроде Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2004, 21:13 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Какая опечатка? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.03.2004, 22:45 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
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.03.2004, 10:05 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Народ... я что непонятно писал??? Тогда попробую переформулировать: "В общем случае выражение, задаваемое функции Evaluate - ПРОИЗВОЛЬНОЕ!!! То есть я не знаю наперед, что будет подано на расчет. И второе - путь ТУПОГО перебора функций типа Is... понятен и щас работает... И спрашивалось, не знаете ли Вы БОЛЕЕ элегантного способа?" С Уважением :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2004, 12:09 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
А вариант с today() был приведен исключительно как пример, что функция возвращает больше, чем 2 типа, но кастованных к строке. :( ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2004, 12:10 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Нет, andy753 , опять терминологические проблемы. Функция Describe("Evaluate возвращает только ОДИН тип - string. Результат Evaluate может быть только ДВУХ типов - string или number (смотри объяснение про compute objects). Как интерпретировать то, что возвращает Describe("Evaluate - ваше дело, никаких коротких, generic путей НЕТ. Вот это авторя не знаю наперед, что будет подано на расчет звучит несколько абсурдно, вы же строите интерфейс, в котором будет подано на расчет ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2004, 19:40 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Филипп: Огромное спасибо за формулирование вопроса по новой... У вас это просто здорово получается. Если не знаешь - так не выступай. Зануда страшная. Я спрашивал про новые способы - нечего мне читать нотации при этом тупо пересказывая старое... утомил. Нечего нового донести - просто промолчи. Огромная просьба тебе - не отвечай плиз больше на мои вопросы. И мне и тебе легче будет. Тебе от моих формулировок, а мне от твоего высокомерия и занудства. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2004, 22:04 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
andy753, вы ко всему прочему ещё и хам . Следить надо за манерами. Привычки из виртуала быстро и незаметно перепозают в реал. Так и по хамской харе получить можно. Вот это авторКак интерпретировать то, что возвращает Describe("Evaluate - ваше дело, никаких коротких, generic путей НЕТ. есть конкретный (и скорее всего единственный) ответ на ваш вопрос. А отвечать на вопросы, или нет, это позвольте мне решать (естественно в рамках того, что модератор сочтёт нужным). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2004, 22:48 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Честно говоря я не знаю ни одного языка программирования, в котором можно было бы из строго определенного типа (в данном случае string) сразу определить, какой тип на самом деле. Это только variant или any для PB для такого предназначены, но в данном случае раз Evaluate возвращает string, то он всегда string и действительно кроме явного использования функций проверки и проведения типа по другому не получится. Так что Филипп все правильно и точно написал, причем самым первым ответил на поставленный вопрос, поводов для обид честно говоря не вижу. Хотелось бы узнать, для чего все это надо, честно говоря мне кажется, что функция Evaluate используется не по назначению - то есть не вычислению выражений, а проведению расчетных операций бизнес-логики. В таком случае скорее всего просто нужно менять подход, или я ошибаюсь ? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.03.2004, 22:51 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Филипп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.03.2004, 13:20 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Гришин Дмитрий авторхотел узнать откуда такое утверждение/ограничение (compute object может быть только 2х типов - string или numeric)? Когда не надо, вот тогда авторсмотрим не в тот Help :-) compute object имеет property ColType . Так вот если посмотреть в тот Help, то там ясно написано, что для compute object ColType возвращает string или numeric . ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2004, 18:59 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Филипп 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.03.2004, 10:42 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
О да, есть некоторые аномалии с 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.03.2004, 19:06 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
ФилиппО да, есть некоторые аномалии с 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'ов и преобразований. === Гришин Дмитрий ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 11:31 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
авторМогу сказать, что в моем проекте использование подключаемых compute object'ов до начала обработки DS и использование GetItemxxx(...) в процессе обработки позволило повысить производительность на 50%. И это только на тестовом примере, в котором DS состоит из 75 строк + 40 определяемых пользователем вычислимых полей. Что в общем-то объяснимо - быстрее получить готовое значение, чем постоянно его вычислять. Люди, обьясните вы мне недогадливому, чего с этой evaluate так много делаете и зачем так много computed column в DW ? Я честно говоря кроме как через Evaluate получить текущее значение некоего свойства, у которого на него стоит expression, другого использования этой функции не придумал. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 12:44 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
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.03.2004, 13:13 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Здесь ключевые слова "определяемых пользователем" а пользователь их может определить сколько его душе угодно, и нельзя его в этом ограничивать... Локшин МаркДа много чего можно делать. Это точно. 2 Локшин Марк Локшин Марка о GetDetailHeight PowerSoft/Sybase почему-то (что вообще-то в их стиле :) ) забыл. evaluate только и спасает. разве rowheight() не спасет? === Гришин Дмитрий ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 13:29 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
dGrichine разве rowheight() не спасет? Ну, а вычислять ее вы как собираетесь? evaluate('rowheight()',row_number) ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 14:10 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
Локшин МаркНу, а вычислять ее вы как собираетесь? 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 === Гришин Дмитрий ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 14:34 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
dGrichinedw.getItemNumber(dw.GetRow(), <compute object name> ) т.е. так же как и получаем значение любой другой колонки с использованием функций getItem А если такого <compute object name> нет? Создавать его? Ну просто замечательно. Или вы про то, что принципиально без evaluate можно? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 14:54 |
|
тип возвращаемого значения функции eval
|
|||
---|---|---|---|
#18+
авторА если такого <compute object name> нет? Создавать его? Ну просто замечательно. Или вы про то, что принципиально без evaluate можно? Все зависит от того где вы и зачем используете эквивалент своей GetDetailHeight. Можно создать на этапе разработки, можно добавить перед обработкой, можно не создавать и рассчитывать постоянно через evaluate, когда необходимо, а можно и вообще не создавать, если определение высоты строки используется для форматирования высоты других объектов в строке... Так зачем вам высота строки? === Гришин Дмитрий ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2004, 15:22 |
|
|
start [/forum/topic.php?fid=15&fpage=107&tid=1339224]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 181ms |
0 / 0 |