巧用DataWindwo返回计算表达式的值

liubocy 2009-08-06 08:50:39
加精
应脚本语言版主sdhylj(ss 婶婶^_^)的要求,整理了下用dw返回计算表达式值的相关文档

1、返回比较表达式如60 < 70的函数

函数f_exp_compare

//====================================================================
// 函数: f_exp_compare
//--------------------------------------------------------------------
// 描述: 返回比较表达式的结果
//--------------------------------------------------------------------
// 参数:
// value string as_str 表达式,如 60 < 70
//--------------------------------------------------------------------
// 返回值: string 比较表达试的结果 1为真,0为假,-1为表达式错误
//====================================================================
String ls_Ret
DataStore lds_Evaluate
lds_Evaluate = CREATE DataStore
lds_Evaluate.Create('release 8;~r~ntable()')
ls_Ret = lds_Evaluate.Describe("Evaluate('" + "if(" + as_str + ", 1, 0)" + "', 1)")
DESTROY lds_Evaluate
IF ls_Ret = '!' THEN ls_Ret = '-1'
RETURN ls_Ret


示例:

String ls_Exp, ls_Ret

ls_Exp = '60 < 70'
ls_Ret = f_exp_compare(ls_Exp)
MessageBox('', ls_Exp + ' --> ' + ls_Ret )


2、返回计算表达式如2 * (3+5) + 2^3的函数

//====================================================================
// 函数: f_exp_ret
//--------------------------------------------------------------------
// 描述: 返回计算表达式的值
//--------------------------------------------------------------------
// 参数:
// value string as_str 计算表达式,如 2 * (3+5) + 2^3
//--------------------------------------------------------------------
// 返回值: string 计算表达式的结果值,如果表达式不正确,返回'FALSE'
//====================================================================
String ls_Ret
DataStore lds_Evaluate
lds_Evaluate = CREATE DataStore
lds_Evaluate.Create('release 8;~r~ntable()')
ls_Ret = lds_Evaluate.Describe("Evaluate('" + as_str + "', 1)")
DESTROY lds_Evaluate
IF ls_Ret = '' OR ls_Ret = '!' THEN ls_Ret = 'FALSE'
RETURN ls_Ret


示例:

String ls_Exp, ls_Ret

ls_Exp = '60 * ( 1 + 3 ) + 2^3'
ls_Ret = f_exp_ret(ls_Exp)
MessageBox('', ls_Exp + ' --> ' + ls_Ret )


3、下面是收藏的在SQL中返回计算表达式的函数,但只能算加、减、乘、除,不能算幂:

CREATE FUNCTION dbo.GetExp(@pstrExpress AS VARCHAR(8000))
RETURNS DECIMAL(18,6) AS
BEGIN
DECLARE @i INT,@j INT
DECLARE @c1 CHAR(1),@c2 CHAR(1),@c VARCHAR(100)
DECLARE @v1 DECIMAL(18,6),@v2 DECIMAL(18,6),@v DECIMAL(18,6)
DECLARE @t TABLE(ID INT IDENTITY(1,1),s VARCHAR(100))
DECLARE @s TABLE(ID INT IDENTITY(1,1),s VARCHAR(100))
DECLARE @sv TABLE(ID INT IDENTITY(1,1),v DECIMAL(18,6))

SET @pstrExpress = REPLACE(@pstrExpress,' ','')
SELECT @i = 0,@j = LEN(@pstrExpress),@c2 = '',@c = ''
WHILE @i<@j
BEGIN
SELECT @c1 = @c2,@i = @i+1
SELECT @c2 = SUBSTRING(@pstrExpress,@i,1)
IF CHARINDEX(@c2,'.0123456789') > 0 or (@c2 = '-' and @c1 IN('','*','-','+','/','('))
BEGIN SELECT @c = @c + @c2 CONTINUE END
IF @c <> '' BEGIN INSERT @t(s) SELECT @c SELECT @c = '' END
IF CHARINDEX(@c2,')')>0
BEGIN
INSERT @t(s) SELECT s FROM @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0) ORDER BY ID DESC
DELETE @s WHERE ID >= ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0)
CONTINUE
END
IF CHARINDEX(@c2,'+-)')>0
BEGIN
INSERT @t(s) SELECT s FROM @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0) ORDER BY ID DESC
DELETE @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(')),0)
IF @c2 <> ')' INSERT @s(s) SELECT @c2
CONTINUE
END
IF CHARINDEX(@c2,'*/')>0
BEGIN
INSERT @t(s) SELECT s FROM @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(','+','-')),0) ORDER BY ID DESC
DELETE @s WHERE ID > ISNULL((SELECT MAX(ID) FROM @s WHERE s IN('(','+','-')),0)
INSERT @s SELECT @c2
CONTINUE
END
IF CHARINDEX(@c2,'(')>0 INSERT @s SELECT @c2
END
IF @c <> '' INSERT @t(s) SELECT @c
INSERT @t(s) SELECT s FROM @s ORDER BY ID DESC
SELECT @i = 0,@j = MAX(ID) FROM @t
WHILE @i < @j
BEGIN
SELECT @i = @i + 1
SELECT @c = s FROM @t WHERE ID = @i
IF @c = '(' CONTINUE
IF @c NOT IN('*','-','+','/') BEGIN INSERT @sv(v) SELECT CONVERT(float,@c) CONTINUE END
SELECT @v2 = v FROM @sv DELETE @sv WHERE ID = (SELECT MAX(ID) FROM @sv)
SELECT @v1 = v FROM @sv DELETE @sv WHERE ID = (SELECT MAX(ID) FROM @sv)
SELECT @v = CASE @c WHEN '+' THEN @v1 + @v2 WHEN '-' THEN @v1 - @v2
WHEN '*' THEN @v1 * @v2 WHEN '/' THEN @v1 / @v2 END
INSERT @sv(v) SELECT @v
END
SELECT @v = v FROM @sv
RETURN @v
END

示例:

SELECT dbo.GetExp('60 * ( 1 + 3 )')
/*结果
--------------------
240.000000

(所影响的行数为 1 行)
*/
...全文
1440 44 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
onlycdh 2011-07-14
  • 打赏
  • 举报
回复
收藏了
fuxiaoyang13 2010-12-03
  • 打赏
  • 举报
回复
高,要能带条件进去就好了
alreadydead 2009-08-17
  • 打赏
  • 举报
回复
windwo?
morphia 2009-08-12
  • 打赏
  • 举报
回复
是DataWindow吧,标题写错了么?如果是错了,那么多人没人打算改一下?
fnhuu 2009-08-12
  • 打赏
  • 举报
回复
太快了!大版出手更快.
dahaidao 2009-08-10
  • 打赏
  • 举报
回复
不错,可以好好学习一下.
x15928666119 2009-08-10
  • 打赏
  • 举报
回复
。。。。。。。。。。。。。啊 啊啊啊啊啊郁闷
zhayj 2009-08-10
  • 打赏
  • 举报
回复
收藏,呵呵
nbaabc373760794 2009-08-09
  • 打赏
  • 举报
回复
顶顶顶
toshabca 2009-08-09
  • 打赏
  • 举报
回复
高高手啊
ge2687605zyf 2009-08-08
  • 打赏
  • 举报
回复
很好,很强大
talenter 2009-08-08
  • 打赏
  • 举报
回复
sunjiakai 2009-08-08
  • 打赏
  • 举报
回复
顶一下
xcj0722 2009-08-08
  • 打赏
  • 举报
回复
看不太懂啊!!
sweetBug 2009-08-07
  • 打赏
  • 举报
回复
好高深啊,收藏了,谢谢!
liubocy 2009-08-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sjshuang 的回复:]
lds_Evaluate.Create('release 8;~r~ntable()')
这句话是什么意思?
[/Quote]
一个创建dw(ds)的语句,你可以用lds_evaluate.describe('datawindow.syntax')看看这个dw中包含什么
singsongs 2009-08-07
  • 打赏
  • 举报
回复
顶ing!
shushengzgy 2009-08-07
  • 打赏
  • 举报
回复
学习
wj19860614 2009-08-07
  • 打赏
  • 举报
回复
牛人啊,佩服
青锋-SS 2009-08-07
  • 打赏
  • 举报
回复
太快了!大版出手更快.
加载更多回复(21)
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 在计算机科学领域,编译原理是研究如何将编程语言转化为机器可执行代码的理论基础。其中,三地址代码(Three-Address Code,TAC)作为一种中间表示形式,在编译器设计中经常被使用,尤其是在生成目标代码的阶段。本文将深入探讨三地址代码的概念、生成器的工作原理及其在编译过程中的作用。 三地址代码是一种简单的低级抽象语法树(AST)表示,每条指令涉及三个操作数,通常包括两个源操作数和一个目的操作数。这种格式简化了代码优化和目标代码生成的复杂性。例如,一个简单的算术表达式“x = y + z”在三地址代码中可能表示为: 在这个例子中,“t1”是一个临时变量,存储了“y + z”的结果,然后这个结果被赋给“x”。 生成三地址代码的过程通常发生在编译器的中间阶段,即语法分析之后,语义分析之前。这个阶段称为“代码生成”或“中间代码生成”。编译器通过词法分析器处理源代码,将其转化为标记流;接着,语法分析器根据上下文无关文法将标记流解析成抽象语法树。三地址代码生成器就是在这个阶段介入,它遍历AST,为每个节点生成对应的三地址指令。 在Turbo C3.0这样的编译器环境下,开发者可以实现自己的三地址代码生成器。虽然Turbo C3.0是一款较老的编译器,但其C语言编译器设计原理依然适用于现代编译器开发。开发过程中,我们需要考虑如下关键点: 符号表管理:符号表记录了程序中所有标识符的类型、作用域和关联地址,对于生成三地址代码至关重要,因为它提供了关于操作数的类型信息。 数据类型转换:编译器必须处理不同数据类型的运算,确保它们在三地址代码中正确表示。例如,整型与浮点型之间的转换需要特别处理。

743

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧