祝愿大家身体健康!

 站点注册  找回密码
 站点注册

QQ登录

只需一步,快速开始

查看: 6391|回复: 0

PB实现报表字体放大缩小功能

[复制链接]

PB实现报表字体放大缩小功能

[复制链接]
ehxz

主题

0

回帖

59万

积分

管理员

积分
590891
贡献
在线时间
小时
2008-6-12 15:14:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?站点注册

×
所众周知PB的绝活是datawindow,可以说通过datawindow能够完成任何一切对数据库的操作,因此介绍PB对数据库的操作的文章与例子可以说"比比皆是"。今天我为大家介绍一个用datawindow的Describe函数实现实现"报表字体放大缩小功能"。
  在日常应用中我们的报表往往因为一二行数据而不得不打印成二张纸,而且这样的情况时常发生,这样时间长了对公司的资源造成了很大的浪费,而且原本一张完整的报表就因为一二行数据而分成二张纸,从整体上来说也不太"雅观"。出于上述因素我用PB开发了一个"报表字体放大缩小功能"的模板,供我所有的报表所继承。

  下面把这功能向大家介绍一下:   
  开发具为PB7.0,连接的数据库为"EAS Demo DB"。

  1、首先我们先建一个application命名为"datawindowprint",再建一个window命名为"w_main",建一个  datawindw明名为"d_emp";

  2、在windows"w_main"建一个"DropDownListBox"控件命名"ddlb_1"用于控制"字体"的大小,一个"editmask"控件命名"em_1"用于控制"行距",一个"datawindow"命名为"dw_1";
  3、我们主要代码在如图如示的"确定"按钮中,主要代码如下:
  int li_font,li_width   
  string ls_height   
  ls_height=dw_1.object.datawindow.detail.height//首先得到报表中原始的行高,这样可以为我们在往下的报表缩放中起参照作用。   
  messagebox(','当前行距为:'+string(ls_height))
  li_font=integer(trim(ddlb_1.text))*(-1)//控制字体大小   
  string ls_ObjString,ls_object[],ls_ObjHolder,ll,ls_font[],ls_cfont[],ls_width[],ls_widtht[]   
  int li_Tab,li_Start,li_Count=1   
  ls_ObjString = dw_1.Describe("Datawindow.Objects")   
  li_Tab = Pos(ls_ObjString, "~t", 1)   
  //下面我们通过循环得到每一列的列名及每一列的标题名   
  Do While li_Tab > 0
  ls_ObjHolder = Mid(ls_ObjString, li_Start, (li_Tab - li_Start))
  If (dw_1.Describe(ls_ObjHolder + ".type") = "column" Or "column" = "*") And &
     (dw_1.Describe(ls_ObjHolder + ".band") = "detail" Or "detail" = "*")  Then
        li_Count ++
        ls_object[li_Count] = ls_ObjHolder
  End if
  li_Start = li_Tab + 1
  li_Tab = Pos(ls_ObjString, "~t", li_Start)   
  Loop   
  ls_object[li_Count+1]=mid(ls_ObjString,li_Start)//保证最后一列也在里面   
  int li_upp,i   
  li_upp=UpperBound(ls_object[])//得到列数   
  string ls_tempw,ls_tempw1
  //下面实现每一列字体的缩放   
  for i=1 to li_upp
  ls_font=trim(ls_object)+".font.height="+string(li_font)
  ls_cfont=trim(ls_object)+"_t.font.height="+string(li_font)
  ls_tempw=dw_1.Describe(trim(ls_object)+".x")
  ls_tempw1=dw_1.Describe(trim(ls_object)+"_t.x")
  dw_1.Modify(ls_font)
  dw_1.Modify(ls_cfont)   
  next   
  string ls_data   
  ls_data =trim(em_1.text)   
  dw_1.object.datawindow.detail.height=ls_data//控制行距   
  dw_1.SetTransObject(SQLCA)



PB开发在商业POS中的应用
--------------------------------------------------------------------------------

   几年前我们的商场内的POS系统可以基本上都是C的杰作,但是用C开发系统的周期大家皆知很长,随着PB应用的日益完美,商业POS机硬件的不断长级,我们现行的商场中的POS机跑WIN95已经不成问题,这样为我们开发POS应用程序提供了一个十分完善的前提,而用PB开发系统的开发周期比其它一些开发工具要快的多,而和C比较的话开发周期至少也能缩短三分之二,如至大的诱惑我相信无论谁都会心动。

  大家都知道现在商品的名称的越来越长,而我们POS机的打印纸一般都在8厘米左右,我们的收款一般打印的为商品代码、商品名称、单价、数量、金额,然而8厘米的宽只打印"商品名称"都不够,这样在打印前必须对"商品名称"进行折行处理。下面我为大家叙述一下我对"商品名称"是如何处理的。

  由于POS机的主要任务是收款,所以我们在应用的窗口中要建一个datawindow,有人肯定会说这样我们可以通过设置datawindow的属性就可以完成对"商品名称"的折行处理。不行,折行处理的datawindow为grid时可以但打印时打出来的收款小票一种情况会有一个个网格另一种情况是"一串字符给截掉了",这样会非常难看而且没有一个商家的收款小票是这样,如果datawindow为group则会很费纸而且也不好看。我们建的datawindow为grid类型的,其作用只是暂存数据而已。

  datawindow的列有s_gdsno(商品代码)、s_gdsname(商品名称)、d_price(单价)、d_count(数量)、d_amt(金额)
  此函数用于在PB中任意取子串(其中含有汉字,数字,字母,符号等),在此的功能是完成对"商品名称"的折行
  /*********as_input为一字符串,as_len为从起始位置开始的长度********/
  function wf_midstring(string as_input,long as_len) return string
  string ls_strret,ls_str[]
  long ll_lens,i
  ll_lens=len(as_input)
  for i=1 to ll_lens
    if asc(mid(as_input,i,1))<128 then
      ls_str=mid(as_input,i,1)
    else
      ls_str=mid(as_input,i,2)
      i++
    end if
  next
  for i=1 to as_len
    ls_strret=ls_strret+ls_str
  next
  return ls_strret
  /*************下面打印的具体实现**************************/
  string ls_name,ls_namestr
  ll_file = fileopen("lpt1",linemode!,write!)
  ll_rows=dw_1.rowcount()
  filewrite(ll_file,'代码 商品名称        单价  数量   金额')
  for i=1 to ll_rows
    ls_name=dw_1.GetItemString(i, "s_gdsname")
    if len(ls_name)>30 then
     ls_namestr=wf_midstring(ls_name,30)
     filewrite(ll_file,dw_1.GetItemString(i,             "s_gdsno")+'
  '+wf_midstring(ls_name,30)+'       '+string(dw_1.GetItemNumber(i,d_price))+'         
  '+string(dw_1.GetItemNumber(i,d_count))+string(dw_1.GetItemNumber(i,d_amt))+'~n')
    if len(ls_namestr)<>30 then
     filewrite(ll_file,'      '+wf_midstring(ls_name,32,100)+'~n')
    else
     filewrite(ll_file,' '+wf_midstring(ls_name,31,100)+'~n')
    end if
     else
    filewrite(ll_file,dw_1.GetItemString(i,    "s_gdsno")+'    '+ls_name+'  
  '+string(dw_1.GetItemNumber(i,d_price))+'  
  '+string(dw_1.GetItemNumber(i,d_count))+string(dw_1.GetItemNumber(i,d_amt))+'~n')
    end if
  next
  fileclose(ll_file)
   wf_midstring(string as_input,long as_len)这个函数也可以给其它应用所调用,用其实现对任意字符串的截取任意位置的子串
共享共进共赢Sharing And Win-win Results
SYBASEBBS - 免责申明1、欢迎访问“SYBASEBBS.COM”,本文内容及相关资源来源于网络,版权归版权方所有!本站原创内容版权归本站所有,请勿转载!
2、本文内容仅代表作者观点,不代表本站立场,作者自负,本站资源仅供学习研究,请勿非法使用,否则后果自负!请下载后24小时内删除!
3、本文内容,包括但不限于源码、文字、图片等,仅供参考。本站不对其安全性,正确性等作出保证。但本站会尽量审核会员发表的内容。
4、如本帖侵犯到任何版权问题,请立即告知本站 ,本站将及时删除并致以最深的歉意!客服邮箱:admin@sybasebbs.com
您需要登录后才可以回帖 登录 | 站点注册

本版积分规则

免责声明:
本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:Admin@SybaseBbs.com

QQ|Archiver|PowerBuilder(PB)BBS社区 ( 鲁ICP备2021027222号-1 )

GMT+8, 2024-12-23 05:03 , Processed in 0.028367 second(s), 8 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表