大家看看这个DW是怎么做的,欢迎大家多多讨论 8-)

Hanson_bati_zhu 2002-02-26 12:46:14
图片地址为:
http://cnnb.net/cgi-win/netstore_getfile.cgi?username=hanson1&path=1.JPG

http://cnnb.net/cgi-win/netstore_getfile.cgi?username=hanson1&path=2.JPG



只剩90分了
倾情奉献
8-)


...全文
491 116 打赏 收藏 转发到动态 举报
写回复
用AI写文章
116 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwb 2002-03-28
  • 打赏
  • 举报
回复
看不到网页,着急,
iltg 2002-03-22
  • 打赏
  • 举报
回复
找不到网页
您要查看的网页可能已被删除、名称已被更改,或者暂时不可用。

--------------------------------------------------------------------------------

请尝试以下操作:

如果您已经在地址栏中输入该网页的地址,请确认其拼写正确。

打开 cnnb.net 主页,然后查找指向您感兴趣信息的链接。
单击后退按钮,尝试其他链接。
单击搜索,寻找 Internet 上的信息。



HTTP 404 - 未找到文件
Internet Explorer

snowbird08 2002-03-22
  • 打赏
  • 举报
回复
怎么打不开那网址呀?
hnxyy 2002-03-22
  • 打赏
  • 举报
回复
佩服佩服~~~
am2000 2002-03-22
  • 打赏
  • 举报
回复
太长了.........
累死了
Hanson_bati_zhu 2002-03-22
  • 打赏
  • 举报
回复
后面的兄弟还在写
先把后面的编写计划跟大家说说
有什么不足之处请大家指出
谢谢


一、目的
二、整体设计思路
三、动态生成DW
四、结合程序使用
五、如何实现多层标题
六、如果实现Tabular型DW模拟GRID型DW改变标题宽度
七、如何实现区域选择
八、数据安全
九、提速

Faint~~~
照现在的速度,估计得写到明年去了
再Faint~~~
8-(
Hanson_bati_zhu 2002-03-22
  • 打赏
  • 举报
回复


column(band=detail id=2 alignment="0" tabsequence=32766 border="0" color="0" x="279" y="8" height="76" width="3511" format="[general]" name=name edit.limit=128
edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes font.face="Arial" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="0" background.mode="1" background.color="536870912" )



htmltable(border="1" )
htmlgen(clientevents="1" clientvalidation="1" clientcomputedfields="1" clientformatting="0" clientscriptable="0" generatejavascript="1" )
这两句对我们所讨论的内容没什么关系,就不讨论这个了

好了,这个DW的导出文本已经看过一遍了,应该心里有一个大致的印象,即,DW导出文本中所存储的内容实际上就是DW中的各种信息的堆积,只要根据其规律对各种属性等进行组织,同样可以自己写出这个文本来

现在还回到开始时讨论的那个可以根据一定规律组织生成的SQL语句上

SELECT 行号,
MAX(CASE WHEN 元素ID='001' THEN 字符数据列 ELSE '' END) AS 姓名,
MAX(CASE WHEN 元素ID='002' THEN 字符数据列 ELSE '' END) AS 部门,
SUM(CASE WHEN 元素ID='003' THEN 金额数据列 ELSE 0 END) AS 基本工资,
SUM(CASE WHEN 元素ID='004' THEN 金额数据列 ELSE 0 END) AS 奖金合计,
SUM(CASE WHEN 元素ID='005' THEN 金额数据列 ELSE 0 END) AS 全勤奖,
SUM(CASE WHEN 元素ID='006' THEN 金额数据列 ELSE 0 END) AS 安全奖,
SUM(CASE WHEN 元素ID='007' THEN 金额数据列 ELSE 0 END) AS 车补,
SUM(CASE WHEN 元素ID='008' THEN 金额数据列 ELSE 0 END) AS 工资总计,
SUM(CASE WHEN 元素ID='009' THEN 金额数据列 ELSE 0 END) AS 应扣金额,
SUM(CASE WHEN 元素ID='010' THEN 金额数据列 ELSE 0 END) AS 实发合计
FROM 数据存储表
GROUP BY 行号

下面我们就结合上面对DW语法的了解,根据这个SQL语句创建一个可以检索并录入数据的D

从这个SQL语句可以看出,其中总共有11列,其中有10列是可以根据其数据类型动态生成的,而剩下的一列则可以预知
所以现在开始写这个DW的语法


release 7;
datawindow(units=1 color=16777215 processing=1 selected.mouse=no )//从这句可以看出我们现在创建的这个DW的绘制单位为屏幕象素,使用Tabular方式,不可以使用鼠标选择列
header(height=17 color="536870912" ) //标题带区高为17个象素
summary(height=0 color="536870912" ) //汇总行带区高度为0(不使用)
footer(height=0 color="536870912" ) //页脚带区高度为0(不使用)
detail(height=19 color="536870912~tIF(GetRow() / 2 = INT(GetRow() / 2),RGB(245,245,245),RGB(255,255,255))" ) //数据明细行带区高度为19,背景色为各行变色,单数行为白色,偶数行为浅灰色

table( //数据源定义开始了
column=(type=long updatewhereclause=yes name=行号 dbname="行号" initial="0" )
column=(type=char(30) updatewhereclause=yes name=姓名 dbname="姓名" initial="" )
column=(type=char(30) updatewhereclause=yes name=部门 dbname="部门" initial="" )
column=(type=decimal(4) updatewhereclause=yes name=基本工资 dbname="基本工资" initial="0" )
column=(type=decimal(4) updatewhereclause=yes name=基本工资 dbname="奖金合计" initial="0" )
column=(type=decimal(4) updatewhereclause=yes name=基本工资 dbname="全勤奖" initial="0" )
column=(type=decimal(4) updatewhereclause=yes name=基本工资 dbname="安全奖" initial="0" )
column=(type=decimal(4) updatewhereclause=yes name=基本工资 dbname="车补" initial="0" )
column=(type=decimal(4) updatewhereclause=yes name=基本工资 dbname="工资总计" initial="0" )
column=(type=decimal(4) updatewhereclause=yes name=基本工资 dbname="应扣金额" initial="0" )
column=(type=decimal(4) updatewhereclause=yes name=基本工资 dbname="实发合计" initial="0" )
retrieve=" SELECT 行号,
MAX(CASE WHEN 元素ID='001' THEN 字符数据列 ELSE '' END) AS 姓名,
MAX(CASE WHEN 元素ID='002' THEN 字符数据列 ELSE '' END) AS 部门,
SUM(CASE WHEN 元素ID='003' THEN 金额数据列 ELSE 0 END) AS 基本工资,
SUM(CASE WHEN 元素ID='004' THEN 金额数据列 ELSE 0 END) AS 奖金合计,
SUM(CASE WHEN 元素ID='005' THEN 金额数据列 ELSE 0 END) AS 全勤奖,
SUM(CASE WHEN 元素ID='006' THEN 金额数据列 ELSE 0 END) AS 安全奖,
SUM(CASE WHEN 元素ID='007' THEN 金额数据列 ELSE 0 END) AS 车补,
SUM(CASE WHEN 元素ID='008' THEN 金额数据列 ELSE 0 END) AS 工资总计,
SUM(CASE WHEN 元素ID='009' THEN 金额数据列 ELSE 0 END) AS 应扣金额,
SUM(CASE WHEN 元素ID='010' THEN 金额数据列 ELSE 0 END) AS 实发合计
FROM 数据存储表
GROUP BY 行号 " sort="行号~tA")


//下面是DW中显示内容的定义,为了看起来清爽些,我把编辑风格、位置、宽度和字体风格的属性省略掉了
//行号列在这里不显示

text(band=header alignment="2" text="姓名" border="0" color="0" name=姓名_t background.mode="1" background.color="536870912" )
text(band=header alignment="2" text="部门" border="0" color="0" name=部门_t background.mode="1" background.color="536870912" )
text(band=header alignment="2" text="基本工资" border="0" color="0" name=基本工资_t background.mode="1" background.color="536870912" )
text(band=header alignment="2" text="奖金合计" border="0" color="0" name=奖金合计_t background.mode="1" background.color="536870912" )
text(band=header alignment="2" text="全勤奖" border="0" color="0" name=全勤奖_t background.mode="1" background.color="536870912" )
text(band=header alignment="2" text="安全奖" border="0" color="0" name=安全奖_t background.mode="1" background.color="536870912" )
text(band=header alignment="2" text="车补" border="0" color="0" name=车补_t background.mode="1" background.color="536870912" )
text(band=header alignment="2" text="工资总计" border="0" color="0" name=工资总计_t background.mode="1" background.color="536870912" )
text(band=header alignment="2" text="应扣金额" border="0" color="0" name=应扣金额_t background.mode="1" background.color="536870912" )
text(band=header alignment="2" text="实发合计" border="0" color="0" name=实发合计_t background.mode="1" background.color="536870912" )


column(band=detail id=2 alignment="0" tabsequence=10 border="0" color="0" name=姓名 background.mode="1" background.color="536870912" )
column(band=detail id=3 alignment="0" tabsequence=20 border="0" color="0" name=部门 background.mode="1" background.color="536870912" )
column(band=detail id=4 alignment="0" tabsequence=30 border="0" color="0" name=基本工资 background.mode="1" background.color="536870912" )
column(band=detail id=5 alignment="1" tabsequence=40 border="0" color="0" name=奖金合计 background.mode="1" background.color="536870912" )
column(band=detail id=6 alignment="1" tabsequence=50 border="0" color="0" name=全勤奖 background.mode="1" background.color="536870912" )
column(band=detail id=7 alignment="1" tabsequence=60 border="0" color="0" name=安全奖 background.mode="1" background.color="536870912" )
column(band=detail id=8 alignment="1" tabsequence=70 border="0" color="0" name=车补 background.mode="1" background.color="536870912" )
column(band=detail id=9 alignment="1" tabsequence=80 border="0" color="0" name=工资总计 background.mode="1" background.color="536870912" )
column(band=detail id=10 alignment="1" tabsequence=90 border="0" color="0" name=应扣金额 background.mode="1" background.color="536870912" )
column(band=detail id=11 alignment="1" tabsequence=100 border="0" color="0" name=实发合计 background.mode="1" background.color="536870912" )


OK,这个DW的主体框架已经基本搭好了,当然现在这个DW还没办法真正导入到PBL中或在程序中使用,因为其中的对象名还是汉字的(主要为了现在看着方便)而且还缺少很多省略掉的属性,不过我们已经能够肯定,自己用代码生成一个DW并不是什么困难的事情,只不过比较繁,属于体力活那种。 8-)

下面,我们来看看在程序中应该如何使用这个动态创建的DW语法


Hanson_bati_zhu 2002-03-22
  • 打赏
  • 举报
回复
再补充一部分
还没有写完
大家先看看
我继续努力

8-)

header(height=80 color="536870912" )
声明DW标题带区的高度和背景色信息


summary(height=0 color="536870912" )
声明DW合计带区的高度和背景色信息


footer(height=0 color="536870912" )
声明DW页脚带区的高度和背景色信息


detail(height=92 color="536870912" )
声明DW明细数据带区的高度和背景色信息



table(column=(type=decimal(0) updatewhereclause=yes name=id dbname="id" )
column=(type=char(128) updatewhereclause=yes name=name dbname="name" )
retrieve="SELECT id,name FROM sysobjects" )

又一个长句子,我们继续逐个说明
table( 这句话的开头,说明这句话是用来描述当前DW的数据结构及数据源定义
column=( 第一个列描述的开头,说明这个列的数据源、数据类型、使用的名称和查询中的名称
type=decimal(0) 类型说明,当前列的类型是没有小数位的小数型(奇怪,怎么不用LONG)
updatewhereclause=yes 始终未在正式的文档中发现过与这个项目相关的说明,把这项去掉好像也没什么影响
name=id 这个列在DW中的别名,可以与数据源中的列名不同
dbname="id" 这个列对应数据源中列名
) 这一列完毕
column=( 第二列说明的开始
type=char(128) 类型说明,说明这个列的数据类型为最长128字节的字符型列
updatewhereclause=yes 不说它了
name=name 列的别名
dbname="name" 列的数据源名
) 第二列说明结束
retrieve= 这个DW的数据源定义
"SELECT id,name FROM sysobjects" 对应的SQL语句
) 数据源定义说明结束


补充两句
从这句话的结构不难看出,列描述的顺序是与SELECT语句中各列的排列顺序是相同的
而且,在这里其实隐含着一个列ID号,标识各列的位置,这个ID号在后面将用到
另外,目前例子中的这个DW是不可以UPDATE的,如果我们把这个DW强制修改为可以UPDATE,将会发现
在列描述语句中多了一下内容:
update=yes key=yes
其中:update=yes 说明这列为可以UPDATE的列之一
key=yes 说明该列为UPDATE时对应表的主键设置之一
然后在数据源定义语句(RETRIEVE)中多了以下内容:
update="sysobjects" updatewhere=0 updatekeyinplace=no
其中
update="sysobjects" 说明需要保存的对于数据库表
updatewhere=0 对应DW中UPDATE属性定义窗口中"Where Clause for Update/Delete",这个参数将影响并发情况下数据的安全和运行效率,在讨论并发处理的帖子或文章中有介绍,在这里我们就不赘述了
updatekeyinplace=no 对应DW中UPDATE属性定义窗口中"Key Modification",在这里我们就不讨论这个了


text(band=header alignment="2" text="Id" border="0" color="0" x="9" y="8" height="64" width="261" name=id_t font.face="Arial" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="0" background.mode="1" background.color="536870912" )
很混乱的一句话,说明了一个TEXT文本对象的各种属性,下面逐个说明:
text( 一个文本对象说明的开始
band=header 该文本对象在DW中放置的带区
alignment="2" 对齐方式,目前为中央对齐
text="Id" 文本显示内容
border="0" 边框类型,目前为没有边框
color="0" 文本色,目前为黑色
x="9" 放置位置X坐标(相对于指定的带区)
y="8" 放置位置Y坐标(相对于指定的带区)
height="64" 该文本对象的高度
width="261" 宽度
name=id_t 对象的名称
font.face="Arial" 字体
font.height="-10" 字体大小
font.weight="400" 是否加粗,如果使用加粗(BOLD)则为700,如果不加粗,则为400
font.family="2" 字体的家族,由于Windows是通过使用字体名称(Font Face)和字体家族(Font Family)来决定某一个具体的字体的,所以需要指定该参数,一般情况下,中文字体(比如:宋体)对应的Family 为0(anyfont!)
font.pitch="2" 不知道该怎么翻译,一般情况下,根据具体的字体决定该属性的值,比如宋体就使用2(Variable)
font.charset="0" 字符集,根据具体的字体所决定的,比如宋体就用0就可以了
background.mode="1" 背景模式,这个属性比较重要,决定该对象是否使用透明色,如果为1则为透明,如果为0则使用下面所指定的颜色,在实际使用中还会遇到值为2的情况,这种情况下,该对象将使用系统颜色,系统颜色的对应值在下面的background.color属性中指定,比如常用的按钮表面色ButtonFace,对应值为:79741120,不过这个值在不同情况下有些区别,具体为什么没有深入研究过,希望了解或有兴趣的朋友能给讲讲
background.color="53687091" 背景色,如果背景模式为1(透明),则该值没什么作用,如果背景模式为0,则该对象的背景色为当前指定的颜色,如果背景模式为2,则为系统色对应的标识
) 这个文本对象的说明结束

text(band=header alignment="2" text="Name" border="0" color="0" x="279" y="8" height="64" width="3511" name=name_t font.face="Arial" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="0" background.mode="1" background.color="536870912" )
跟上一句类似,不再重复了


column(band=detail id=1 alignment="1" tabsequence=32766 border="0" color="0" x="9" y="8" height="76" width="261" format="[general]" name=id edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes font.face="Arial" font.height="-10" font.weight="400" font.family="2" font.pitch="2" font.charset="0" background.mode="1" background.color="536870912" )
进入正题了,列对象的说明,下面我们也来先每个属性都看一遍

column( 一个可以显示在DW中的列对象说明的开始
band=detail 这个列对象在DW中放置的带区,简单说就是放在明细行中还是放在标题或者汇总行中
id=1 这个列对象对应的数据源ID号,这个属性很重要,如果设置错误了,那么你看到的数据就将与你预期的不同,这个ID号的顺序是由数据源中列的选择顺序决定的,比如这个1,就说明对应数据源SQL语句中所选择的第一个字段(ID)
alignment="1" 对齐方式(0->左对齐 1->右对齐 2->中央对齐 3->自适应对齐,即在多行情况下,各行宽度尽量相同)
tabsequence=32766 就是TAB ORDER,32766就是TabOrder = 0,所以在取值时一定要小于这个值,并且要大于0,否则光标就不能选中这列了
border="0" 边框类型,这里设置的是没有边框
color="0" 文字颜色,根据RGB值设定
x="9" 放置位置的X值
y="8" 放置位置的Y值
height="76" 对象高度
width="261" 对象宽度
format="[general]" 数据内容显示格式
name=id 列对象命名,这个名字应该与DW数据源定义中各列的name设置相同
edit.limit=0 输入字符限制,0为不限制(实际上最多32760左右个字)
edit.case=any
edit.focusrectangle=no
edit.autoselect=yes
edit.autohscroll=yes

font.face="Arial" 字体格式说明,不详细说了
font.height="-10"
font.weight="400"
font.family="2"
font.pitch="2"
font.charset="0"

background.mode="1" 背景模式,与文本相类似
background.color="536870912" 背景颜色,与文本相类似
)



column(band=detail id=2 alignment="0" tabsequence=32766 border="0" color="0" x="279" y="8" height="76" width="3511" format="[general]" name=name edit.limit=128
edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes font.face="Arial" font.height="-10" font.weight="400" font.family="2"
iltg 2002-03-21
  • 打赏
  • 举报
回复
看不到啊!
pawly 2002-03-21
  • 打赏
  • 举报
回复
不错,收藏
Hanson_bati_zhu 2002-03-21
  • 打赏
  • 举报
回复
to: ALLTEC(风起云涌之荔枝)
别急
再等等
开夜车书写中。。。。
ALLTEC 2002-03-21
  • 打赏
  • 举报
回复


hanson 继续啊 , 我在这边干好久了 ~%¥#·#
cjh211 2002-03-15
  • 打赏
  • 举报
回复
读起来很生硬啊。
zzhhgn 2002-03-14
  • 打赏
  • 举报
回复
以前好象做过,好象不是很烦呀?!
longqiang 2002-03-14
  • 打赏
  • 举报
回复
好,好,好!
sorrow_arrow 2002-03-14
  • 打赏
  • 举报
回复
KAO,你也太牛了,我再次收藏,急盼下文
bzlj 2002-03-14
  • 打赏
  • 举报
回复
学习!收藏!
ferbruary 2002-03-14
  • 打赏
  • 举报
回复
收藏!
Hanson_bati_zhu 2002-03-14
  • 打赏
  • 举报
回复
UP
Hanson_bati_zhu 2002-03-14
  • 打赏
  • 举报
回复
to: am2000(最后一滴水)
Formula One的使用不复杂
关键在于程序流程的设计
如果要做到通用、灵活、方便确实很有难度
在兄弟所在公司
这个输出是专门有人在做
基本上个个都熬成了“阿香哥”


加载更多回复(96)

1,076

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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