| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1302 人关注过本帖, 1 人收藏
标题:动态报表弄得头都大了
只看楼主 加入收藏
scilent
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:285
专家分:1399
注 册:2011-8-9
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:11 
动态报表弄得头都大了
先上文件再说,一天偶然看了一篇文章,用程序动态控制,设计任意报表,文章没有看太懂,大致意思知道了,想操练一下试试,呵呵,怎么也预览不出来,老大们看看为什么啥也显不出来?
report.zip (5.39 KB)
程序代码:
you_bb="动态报表.frx"
USE dyjl
n_zdzs =afields(ss_text)   

USE &you_bb. IN 2 EXCLUSIVE
IF n_zdzs>0         &&判断是否有字段
   FOR jsk_i=1 TO n_zdzs  &&添加标题行
       APPEND BLANK
       REPLACE objtype WITH 5
       replace objcode WITH 0
       replace expr with ["]+ss_text[jsk_i,1]+["] &&输入带双引号的
       replace fontsize WITH 12     &&标题行用小四
       replace height WITH 2000
       replace width WITH 1562.5*4   &&一个四号字是1562.5
       replace vpos WITH 12266
       replace hpos WITH 2000*jsk_i 
       replace penred WITH -1,pengreen WITH -1 ,penblue WITH -1,fillred WITH -1,fillblue WITH -1,fillgreen WITH -1
       replace timestamp WITH VAL(SYS(3)), platform WITH  "windows",supalways WITH .T.,suprpcol WITH 3
       REPLACE supvalchng WITH .f.
       replace uniqueid WITH "ziduan"+ALLTRIM(STR(jsk_i))
    ENDFOR
    FOR jsk_j=1 TO n_zdzs  &&添加细节区
       APPEND BLANK
       REPLACE objtype WITH 8
       replace objcode WITH 0
       replace name WITH ss_text[jsk_j,1]
       replace expr with "dyjl."+ss_text[jsk_j,1]
       replace fontsize WITH 11     &&内容用五号字
       replace height WITH 2000
       replace width WITH 5000
       replace vpos WITH 12266+2000
       replace hpos WITH 2000*jsk_J*2000
       replace fillchar WITH "c"
       replace stretch WITH  .T.   &&溢出时伸展
       replace penred WITH -1,pengreen WITH -1 ,penblue WITH -1,fillred WITH -1,fillblue WITH -1,fillgreen WITH -1
       replace timestamp WITH VAL(SYS(3)), platform WITH  "windows",supalways WITH .T.,suprpcol WITH 3
       REPLACE supvalchng WITH .f.
       replace uniqueid WITH "bianliang"+ALLTRIM(STR(jsk_J))
     ENDFOR
   ENDIF
    Use
    SELE dyjl
  REPORT FORM &YOU_BB TO PRINT PROMPT PREVIEW   &&打印报表
  Use &YOU_BB..FRX   
中间的宽高是我随便设的,我看其他报表文件中的不知道都是什么单位,有说MM,有说CM。还有说是点。真是搞不懂呀
搜索更多相关主题的帖子: replace 文章 动态 
2013-08-09 16:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
单位是960点/英寸

授人以渔,不授人以鱼。
2013-08-09 17:00
scilent
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:285
专家分:1399
注 册:2011-8-9
收藏
得分:0 
我也不求显示出来有多漂亮,但,为什么啥都显不出来

在没有路的地方走一条路,让别人有路可走
2013-08-09 17:07
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
需要那么复杂吗?

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-08-09 17:26
scilent
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:285
专家分:1399
注 册:2011-8-9
收藏
得分:0 
呵呵,想试试,如果这种方法可行的话,就可以随便选打印多少个字段的报表,这样报表就没有任何限制了。要不然对于未知字段个数的打印还是不行。我看过另一种方法,是用表缓冲加载字段,但还是做不到任意。

在没有路的地方走一条路,让别人有路可走
2013-08-09 18:03
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
收藏
得分:0 
you_bb="动态报表.frx"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&如果你下面用宏代换的话,你的名称应该是传递来的,应该使用Lparameter或Parameter来接收,明知文件名还用宏代换?!
USE dyjl
n_zdzs =afields(ss_text)   

USE &you_bb IN 2 EXCLUSIVE
SELECT 2&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&这里差这句哟
IF n_zdzs>0         &&判断是否有字段
   FOR jsk_i=1 TO n_zdzs  &&添加标题行
       APPEND BLANK
       REPLACE objtype WITH 5
       replace objcode WITH 0
       replace expr with ["]+ss_text[jsk_i,1]+["] &&输入带双引号的
       replace fontsize WITH 12     &&标题行用小四
       replace height WITH 2000
       replace width WITH 1562.5*4   &&一个四号字是1562.5
       replace vpos WITH 12266
       replace hpos WITH 2000*jsk_i  
       replace penred WITH -1,pengreen WITH -1 ,penblue WITH -1,fillred WITH -1,fillblue WITH -1,fillgreen WITH -1
       replace timestamp WITH VAL(SYS(3)), platform WITH  "windows",supalways WITH .T.,suprpcol WITH 3
       REPLACE supvalchng WITH .f.
       replace uniqueid WITH "ziduan"+ALLTRIM(STR(jsk_i))
    ENDFOR
    FOR jsk_j=1 TO n_zdzs  &&添加细节区
       APPEND BLANK
       REPLACE objtype WITH 8
       replace objcode WITH 0
       replace name WITH ss_text[jsk_j,1]
       replace expr with "dyjl."+ss_text[jsk_j,1]
       replace fontsize WITH 11     &&内容用五号字
       replace height WITH 2000
       replace width WITH 5000
       replace vpos WITH 12266+2000
       replace hpos WITH 2000*jsk_J*2000
       replace fillchar WITH "c"
       replace stretch WITH  .T.   &&溢出时伸展
       replace penred WITH -1,pengreen WITH -1 ,penblue WITH -1,fillred WITH -1,fillblue WITH -1,fillgreen WITH -1
       replace timestamp WITH VAL(SYS(3)), platform WITH  "windows",supalways WITH .T.,suprpcol WITH 3
       REPLACE supvalchng WITH .f.
       replace uniqueid WITH "bianliang"+ALLTRIM(STR(jsk_J))
     ENDFOR
   ENDIF
    Use
    SELE dyjl
  REPORT FORM &YOU_BB TO PRINT PROMPT PREVIEW   &&打印报表
  *Use &YOU_BB..FRX    &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&这里多了个点。
  USE
  *******************************************************************************************************************
* 1. 你这段代码只是对报表页面格局的修改,如字号,区域高度
* 2. 你没有对报表的数据环境作任何的设置,没有数据的引用,你显示的肯定的是空白,把书看一下先。
* 3. 回传修改后的程序及报表,不晓得是不是你要的结果。
report.rar (5.47 KB)
2013-08-10 12:44
scilent
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:285
专家分:1399
注 册:2011-8-9
收藏
得分:0 
谢谢老大指教
我的目的,就是想创建一个空白报表,让它能通过编程添加数据,随便显示点什么
1这段代码是从别人的代码里拷了一段下,作了些修改,有些地方没有修改到。细节问题请老大见谅
2、   REPLACE objtype WITH 8
       replace objcode WITH 0
       replace name WITH ss_text[jsk_j,1]
       replace expr with "dyjl."+ss_text[jsk_j,1]
    这个不是引用表中的数据吗?
3.数据环境用的表,在程序中是临时生成,字段个数是不固定的,所以报表要用空白,根据选择来添加。
————————————————————————
把数据表和控件在报表设计器里添加,预览时可以出现,
但是通过程序写入,预览时不会显示
我就是为这个迷糊

这是我后来又修改的,只不是从报表设计器里添加,还是不行
程序代码:
you_bb="动态报表.frx"
USE dyjl
n_zdzs =afields(ss_text)   

USE &you_bb IN 2 EXCLUSIVE
SELECT 2

IF n_zdzs>0         &&判断是否有字段
          append  BLANK
     replace platform WITH "windows",objtype WITH 26,name with 'cursor', expr WITH "alias="+["]+"dyjl"+["]+CHR(13)+"cursorsource=dyjl.dbf"+CHR(13)+"name="+["]+"cursor1"+["]  

*即使把表添加到数据环境里也不行!
*为了使表的格式与报表设计器生成的记录格式一样
    GO 4
    FOR jsk_i=1 TO n_zdzs  &&添加标题行
  
      INSERT  BLANK
       REPLACE objtype WITH 5
       replace objcode WITH 0
       replace expr with ["]+ss_text[jsk_i,1]+["] &&输入带双引号的
       replace fontsize WITH 12     &&标题行用小四
       replace fontface WITH "宋体"
       replace height WITH 2000
       replace width WITH 1562.5*4   &&一个四号字是1562.5
       replace vpos WITH 12266
       replace hpos WITH 2000*jsk_i 
       replace mode WITH 1
       replace penred WITH -1,pengreen WITH -1 ,penblue WITH -1,fillred WITH -1,fillblue WITH -1,fillgreen WITH -1
       replace timestamp WITH VAL(SYS(3)), platform WITH  "windows",supalways WITH .T.,suprpcol WITH 3
       REPLACE supvalchng WITH .f.
       replace uniqueid WITH "ziduan"+ALLTRIM(STR(jsk_i))
     &&添加细节区
       insert BLANK
       REPLACE objtype WITH 8
       replace objcode WITH 0
       replace name WITH ss_text[jsk_i,1]
       replace expr with "dyjl."+ss_text[jsk_i,1]
       replace fontsize WITH 11     &&内容用五号字
       replace fontface WITH "宋体"
       replace mode WITH 1
       replace height WITH 2000
       replace width WITH 5000
       replace vpos WITH 12266+2000
       replace hpos WITH 2000*jsk_i*2000
       replace fillchar WITH "C"
       replace stretch WITH  .T.   &&溢出时伸展
       replace penred WITH -1,pengreen WITH -1 ,penblue WITH -1,fillred WITH -1,fillblue WITH -1,fillgreen WITH -1
       replace timestamp WITH VAL(SYS(3)), platform WITH  "windows",supalways WITH .T.,suprpcol WITH 3
       REPLACE supvalchng WITH .f.
       replace uniqueid WITH "bianliang"+ALLTRIM(STR(jsk_i))
     ENDFOR
    REPLACE unique WITH "" all
    replace environ WITH "" FOR objtype=9 AND (objcode=4 OR objcode=7)
   ENDIF
    Use
    SELECT  dyjl
  REPORT FORM &YOU_BB  PREVIEW 



[ 本帖最后由 scilent 于 2013-8-11 11:03 编辑 ]

在没有路的地方走一条路,让别人有路可走
2013-08-11 10:56
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
木这样弄过
2013-08-11 13:24
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
收藏
得分:20 
回复 7楼 scilent
回来有点晚,看了下报表中的数据,修改意见如下,及修改后附件
report.rar (8.37 KB)

程序代码:
If !Used("dyjl")
    Use dyjl Alias  "dyjl"
Else
    Select "dyjl"
Endif
n_zdzs =Afields(ss_text)
Use 动态报表.frx In 2 Exclusive
Select 2
Delete All For Recno()>6&&------->删除每次运行程序产生的多余字段。
Pack
Rand(-1)&&------------>初始化生成器,生成随机值,用于timeStamp字段,保证唯一性。
If n_zdzs>0
    Local aStamp[n_zdzs],nLabelPos,nDataPos&&————>保存时间戳,标题带区和细节带区使用同一个,所以用数组。
    nLabelPos=-13000
    nDataPos=-6000            &&---------->保存前一标签或字段控件位置,估计值,仅用于测试,可能标签名称和字段内容会有遮挡。
    &&判断是否有字段
    For jsk_i=1 To n_zdzs  &&添加标题行--------------->这以下部分是向表中写标签名称(caption),所以要用引号的。
        nLabelPos=nLabelPos+16000
        nDataPos=nDataPos+14000&&---------->保存前一标签或字段控件位置,估计值,仅用于测试。
        Append Blank
        Replace objtype With 5,objcode With 0,Expr With '"'+ss_text[jsk_i,1]+'"',FontSize With 12,Height With 2000,Width With 1562.5*4
        Replace vpos With 12266
        Replace hpos With nLabelPos  &&-------------->这是横坐标位置,根据安体大小和间距来的,你自己测试。
        Replace penred With -1,pengreen With -1 ,penblue With -1,fillred With -1,fillblue With -1,fillgreen With -1
        aStamp[jsk_i]=Int(Val(Sys(3))*Rand())&&--------------->生成时间戳
        Replace Timestamp With aStamp[jsk_i], platform With  "WINDOWS",supalways With .T.,suprpcol With 3,supvalchng With .F.
        Replace uniqueid With Sys(2015)&&------------------>标签的唯一标识,必须唯一,用SYS(2015)
        **********************************************>添加细节区,下一记录为要显示的字段
        Append Blank
        Replace objtype With 8 ,objcode With 0,Name With ss_text[jsk_i,1],Expr With "dyjl."+ss_text[jsk_i,1],;
            fontsize With 11 ,Height With 2000,Width With 5000,;&&------>根据字体大小来哈
        vpos With 12266&&——————————————————>纵坐标位置,和标签是同一高度的。
        Replace hpos With nDataPos&&------------->这是横坐标位置,未改动,根据安体大小和间距来的,你自己测试。
        Replace fillchar With "c"
        Replace Stretch With  .T.   &&溢出时伸展
        Replace penred With -1,pengreen With -1 ,penblue With -1,fillred With -1,fillblue With -1,fillgreen With -1
        Replace Timestamp With aStamp[jsk_i]&&--------------------->和上面标签使用同一个值,保证对应关系。
        Replace platform With  "WINDOWS",supalways With .T.,suprpcol With 3,supvalchng With .F.
        Replace uniqueid With Sys(2015)&&&&-------------------------*>唯一标识,必须唯一,用SYS(2015)
    Endfor
    Append Blank
    Replace objtype With 5,objcode With 0&&------------------------->写入报表结束标识。
Endif
Use
Select "dyjl"
Report Form 动态报表.frx To Print Prompt Preview   &&打印报表
*出错说明:
*1.Uniqueid字段不唯一,sys(3)在100毫秒内返回的值是一样的,所以用SYS(2015) 返回的名称是以系统日期和系统时间来创建的。在同一毫秒间隔期间中不只一次地调用 SYS(2015) 返回一个唯一的字符串
*2.一个字段在标题区和细节区这两个地方使用的时间戳(timestamp)必须是成对的(一样的),你原来用SYS(3)生成,会导致几个字段使用同一个时间戳,或是本来同一字段在标题区和细节区使用的时间戳却不一样。
*3.vPOS,水平位置(纵坐标),同一条记录的几个字段(这儿是四个),应该显示在同一水平线上,你把这个值设成成倍增加了(当成横坐标了)。
*4.hPOS,从左到右的位置(横坐标),这个跟相邻字段的间距相关,理论上是等距的,你设成了2000*jsk_i,成倍增加。
*比如,1--2--3--45--6--7,如果1的起始位是100,2的hPOS就是100+3,3是100+6(或者2的位置+3)
*5.你程序中所说的增加标题行,是不对的,那个地方是报表控件中字段文本框前面的“标签名字”,所以它的水平位置跟细节内容区是一样的。
*6.程序稍作了些修改,修改处我标识出来,希望能帮助到你,谢谢。
*7.主要注意以下报表中以下参数:hPos,vPos,UniqueId,TimeStamp


[ 本帖最后由 whinda 于 2013-8-12 01:24 编辑 ]
2013-08-12 01:22
scilent
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:285
专家分:1399
注 册:2011-8-9
收藏
得分:0 
很久没有弄过vfp,假期里,一次偶然看了 一篇动态报表的文章,文章也顾上仔细看,试了试不成功,越急越是不行。得到老师的热心帮助和指点。真是让人感动!

特别是熬到夜里,可惜不能再给你加点分

[ 本帖最后由 scilent 于 2013-8-12 01:55 编辑 ]

在没有路的地方走一条路,让别人有路可走
2013-08-12 01:46
快速回复:动态报表弄得头都大了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024594 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved