当前位置:主页>销售管理软件> 列表

关于Crystal Report(水晶报表)的Delphi 找进销存账簿

进销存软件版1楼: 我使用水晶报表遇到了以下问题,向大家请教:
1.我下载了Crystal Report 9.2 中文版和Crystal Report 10 英文版,选择后安装了9.2版本。之后按网上的提示信息安装了两个Library,其中有一个提示TDataBase已存在的错误,另存为Pas文件后安装成功,在ActiveX控件栏里面多出了13个控件,其中有我在大富翁上看到的教程里面的 Application和CRViewer9两个控件,设置一个简单的报表,可以在Delphi里面调试通过并预览,现在我发现一个问题,无法使用Application.ExeName来动态获取程序路径以及无法在创建窗体的时候使用Application了,可能是和Application控件冲突了,怎么处理?
2.有一个合计金额字段是在报表里面统计的,然后现在要把这个字段转换成大写金额,如何用最简单的方法实现?
3.Delphi里面可不可以,或者说支不支持像FastReport一样动态创建CrystalReport报表?
请高手予以解答,谢谢·!·

2楼: 第一个问题,在我的机器上没有发现,可能是安装控件出现的问题。
第二个问题,需要自己写一个函数去解决,在Crystal Report中支持两种语言标准来做这
件事情,我曾经写过一个这样的函数,请见下面我的注释
第三个问题,对于Delphi调用Crystal Report,是只能调用已经做好的报表,而无法自定义
报表的。
''+----------------------------------------------------------------------------+''
''|函数 : 小写数字转换成中文大写数字 |
''|原创 : Sword Liu Email:sword.liu.sz@gmail.com |
''|声明 :如需引用,请包含此附注信息。 |
''| 对此函数的任何改动,欢迎Email与作者共同探 |
''+----------------------------------------------------------------------------+

dim x as string ''取得输入的数字并转换为不带小数点和千分位的数字字符
dim y as number ''取得被转换数字的位数
dim z as number ''取得将输入的数字每4位分割的数组个数
dim Num() as String ''取得将输入的数字每4位分割的数组
dim Result as String ''暂存转换结果
dim CNum(10) as String ''建立中文对应字符数组

dim i as number ''for循环使用
dim j as number

''建立中文对应字符数组(例:0 对应 CNum(1),1 对应 CNum(2))


CNum=Array("零","一","二","三","四","五","六","七","八","九")

''将输入的数字以每4位分割,取出对应数组个数
x = toText({?变量数字},0,"")
y = len(x)
if y mod 4 = 0 then
z = y \ 4
elseif y / 4 >=0.5 then
z = y \ 4 + 1
else
z = y \ 4
end if

''将输入的数字以每4位分割,每数组对应(第一个数组为最后4位..)
redim Num(z)
for i = z to 1 step -1
Num(i)=Right(x,4)
if i<>1 then
x=Left(x,Len(x)-4)
end if
Next

''按数组个数取出对应位关系,并转换数字为中文字符
for i = 1 to z
for j = 1 to Len(Num(i)) step 1
Result = Result + CNum(toNumber(Right(Left(Num(i),j),1))+1)
if Num(i)(j)<>"0" then
if Len(Num(i))-j+1 =2 then
Result = Result + "十"
elseif Len(Num(i))-j+1 =3 then
Result = Result + "百"
elseif Len(Num(i))-j+1 = 4 then
Result = Result + "千"
end if
end if

Next
if Right(Left(Num(i),Len(Num(i))),1)<>"0" then
''对应中文位的判断方法
if z-i+1 = 2 then
Result = Result + "万"
elseif z-i+1 = 3 then
Result = Result + "亿"
elseif z-i+1 = 4 then
for j = 1 to Len(Num(i)) Step 1
if Len(Num(i))-j+1 = 1 then
Result = Result + "十"
elseif Len(Num(i))-j+1 = 2 then
Result = Result + "百"
elseif Len(Num(i))-j+1 = 3 then
Result = Result + "千"

end if
Next
end if
else
if z-i+1 = 2 then
Result = Left(Result,Len(Result)-1) + "万"
elseif z-i+1 = 3 then
Result = Left(Result,Len(Result)-1) + "亿"
elseif z-i+1 = 4 then
for j = 1 to Len(Num(i)) Step 1
if Len(Num(i))-j+1 = 1 then
Result = Result + "十"
elseif Len(Num(i))-j+1 = 2 then
Result = Result + "百"
elseif Len(Num(i))-j+1 = 3 then
Result = Result + "千"

end if
Next
end if
end if
Next

''处理中文数字中的0(包含最后、中间多个、千位直接)的处理
for i= Len(Result) to 1 Step -1
if Right(Result,1)="零" then
Result = Left(Result,Len(Result)-1)
end if
if InStr(Result,"零零")>0 then
Result = Left(Result,InStr(Result,"零零")) + Right(Result,Len(Result)-InStr(Result,"零零")-1)
end if
if InStr(Result,"零亿")>0 then
Result = Left(Result,InStr(Result,"零亿")-1) + Right(Result,Len(Result)-InStr(Result,"零亿"))
end if
if InStr(Result,"零万")>0 then
Result = Left(Result,InStr(Result,"零万")-1) + Right(Result,Len(Result)-InStr(Result,"零万"))
end if
if InStr(Result,"亿万")>0 then
Result = Left(Result,InStr(Result,"亿万")) + Right(Result,Len(Result)-InStr(Result,"亿万")-1)
end if
Next

''取出转换结果
Formula = Result 如进销存账簿

3楼: 谢谢上面的大虾:
我重新下载了一个Crystal.Reports.VCL.v10.0,装完后没有出现Application的问题了:),其他的慢慢再看,呵呵

4楼: 上面的大虾,我还有一个问题是关于大小写转换的:
该代码我在菜单“报表”的公式工作室内增加一个报表自定义函数,然后命名为UP2,然后我无法使用该公式,因为我有一个文本对象是统计数据字段里面所有的明细记录的金额字段值的,然后我没有办法在公式编辑器(公式专家)里面给这个自定义函数定义一个函数参数,参数只支持常量或数据库字段,怎么办呢?

5楼: 这是因为下面代码中:
{?变量数字}是我在报表上定义的一个参数,所以报表是将参数直接计算成中文大写
如果需要对数据字段计算的话,将{?变量数字}修改为报表字段就行了。
=====================================


''将输入的数字以每4位分割,取出对应数组个数
x = toText({?变量数字},0,"")
y = len(x)
if y mod 4 = 0 then
z = y \ 4
elseif y / 4 >=0.5 then
z = y \ 4 + 1
else
z = y \ 4
end if

6楼: 接受答案了.