转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> SyBase >> 正文
实现报表字体放大缩小功能         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:851 更新时间:2009/4/22 23:09:18

所众周知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[i]=trim(ls_object[i])+".font.height="+string(li_font)
  ls_cfont[i]=trim(ls_object[i])+"_t.font.height="+string(li_font)
  ls_tempw=dw_1.Describe(trim(ls_object[i])+".x")
  ls_tempw1=dw_1.Describe(trim(ls_object[i])+"_t.x")
  dw_1.Modify(ls_font[i])
  dw_1.Modify(ls_cfont[i])   
  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[i]=mid(as_input,i,1)
    else
      ls_str[i]=mid(as_input,i,2)
      i++
    end if
  next
  for i=1 to as_len
    ls_strret=ls_strret+ls_str[i]
  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)这个函数也可以给其它应用所调用,用其实现对任意字符串的截取任意位置的子串


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]SYBASE dbcc
[SyBase]Sybase EA Server 在网上税务系统中的应用  [SyBase]Sybase数据仓库落户加拿大统计局
[SyBase]Sybase数据库的碎片整理(  arnold   )  [SyBase]Sybase和IBM创造了新的Linux事务处理纪录
[SyBase]tempdb(谨以此篇拜个山头)  [SyBase]利用Sybase EAServer和开发工具快速开发Web Servi…
[SyBase]SYBASE产品全面支持J2EE  [SyBase]Backup Server
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台