程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SyBase數據庫 >> SyBase綜合文章 >> 實現報表字體放大縮小功能

實現報表字體放大縮小功能

編輯:SyBase綜合文章
所眾周知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,'代碼 商品名稱        單價  數量   金額')
  f


您正在看的Sybase教程是:實現報表字體放大縮小功能。or 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)這個函數也可以給其它應用所調用,用其實現對任意字符串的截取任意位置的子串

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved