if exists(select * from sysobjects where type='P' and name='sys_ysl_getColumnNameToArrayByTableName' )
drop procedure sys_ysl_getColumnNameToArrayByTableName
go
create procedure sys_ysl_getColumnNameToArrayByTableName
@tablename varchar(100),
@colnameArrayList varchar(1000) output
With
Encryption
as
declare @sql nvarchar(1000)
declare @colnameArray varchar(1000)
declare @colname varchar(50)
SET @sql =N'DECLARE CUR_COLNAME CURSOR FOR select a.name from syscolumns a inner join sysobjects b on a.id=b.id where b.name='''+@tablename+N''' order by a.colorder '
execute sp_executesql @sql
OPEN CUR_COLNAME
WHILE (0=0)
BEGIN
FETCH NEXT FROM CUR_COLNAME
INTO @colname
If (@@fetch_status<>0) break
IF @colnameArray<>''
set @colnameArray=@colnameArray+','+@colname
Else
set @colnameArray=@colname
END
Close CUR_COLNAME
DEALLOCATE CUR_COLNAME
set @colnameArrayList=@colnameArray
/*
print @colnameArrayList -- 供测试使用
--测试代码
DECLARE @@AA VARCHAR(100)
exec sys_ysl_getColumnNameToArrayByTableName 'SPBLA',@@AA
--结束
sp_helptext sys_ysl_getColumnNameToArrayByTableName --查看过程文本
*/
最近手里有个老板安排的做报表的活儿,按照已有的网页模板做出报表,要求很严格,
报表格式和在WORD中处理的一模一样,连文字与边框的距离,文字是否能占满整个表格,是否有落款,与落款之间的隔行,等等都得做.
对每一个模板进行编程是绝对不行的,首先是没有意思,死程序没有扩展性,再次维护较麻烦, 我想了一个比较统一的实现方式.
1 .其实主要是多行文本格式问题,计算内容在特定模板中的行列,模板中要传入文本块的区域信息
2. 查询问题,不同的模板对应着不同的一二级表,甚至还有更多级的关联表...用SQLSERVER存储过程 中的动态 SQL语句实现查询; 模板中特定的关键字要有附加信息同字段名一同传出,所以要用到SYScolumns表,取得附加信息并把字段放到一个数组里边传出.
3. 外部处理, 处理替换过程 , 会出现一些难以预料的错误, 如字段为NULL,日期格式不正确等等
4. 有可能有的模板中出现多标签共同占用一个区域的问题,要另外取得这几个标签的内容值,来处理