數(shù)據(jù)庫(kù)報(bào)表程序是經(jīng)常使用的,現(xiàn)在很多用戶都使用報(bào)表設(shè)計(jì)器設(shè)計(jì)報(bào)表,且簡(jiǎn)單方便;但筆者在工作中遇到要對(duì)成百個(gè)數(shù)據(jù)庫(kù)打印的情況,這些數(shù)據(jù)庫(kù)除了字段名不相同外,其他結(jié)構(gòu)信息基本相同,因此筆者就編制了如下的一個(gè)通用程序,供同行參考。
set talk off
hh1=printstatus()
set print on
do while .not.hh1
?"打印機(jī)未準(zhǔn)備好,請(qǐng)準(zhǔn)備好打印機(jī)"
hh1=printstatus()
enddo
set talk off
set device to print
clear
a1=getfile("dbf") &&打開(kāi)打開(kāi)文件對(duì)話框
use "&a1" &&打開(kāi)指定的文件
n1=fcount() &&獲取打開(kāi)的庫(kù)中的字段數(shù)
dimension a(n1) &&定義一個(gè)存放字段名的數(shù)組
dimension b(n1) &&定義一個(gè)存放字段寬度的數(shù)組
k=1
do while k<=n1
a(k)=field(k)
k=k+1
enddo &&將字段名賦給數(shù)組
w=1
do while w<=n1
b(w)=fsize(a(w)) &&獲取字段的長(zhǎng)度
if b(w)<6
b(w)=8
else
b(w)=b(w)+2
endif
w=w+1
enddo
do while not eof()
r1=1 &&顯示表頭的第一行
m=1
col1=1
do while m<=n1
if m=1
@r1,col1 say "┌"+replicate("-",b(m))
else
if m=n1
@r1,col1 say "┬"+replicate("-",b(m))+"┐"
else
@r1,col1 say "┬"+replicate("-",b(m))
endif
endif
col1=col1+b(m)
m=m+1
enddo
m=1 &&顯示字段名行
col1=1
do while m<=n1
if m=1
@r1+1,col1 say "∣"+substr(a(m),1,6)+replicate(" ",(b(m)-len(a(m))))
else
if m=n1
@r1+1,col1 say "∣"+substr(a(m),1,6)+replicate(" ",(b(m)-len(substr(a(m),1,6))))+"∣"
else
@r1+1,col1 say "∣"+substr(a(m),1,6)+replicate(" ",(b(m)-len(substr(a(m),1,6))))
endif
endif
col1=col1+b(m)
m=m+1
enddo
m=1 &&由于字段多,一行不能完全顯示整個(gè)行,因此分為兩行顯示字段名行
col1=1
do while m<=n1
if m=1
@r1+2,col1 say "∣"+substr(a(m),7)
else
if m=n1
@r1+2,col1 say "∣"+substr(a(m),7)+replicate(" ",(b(m)-len(substr(a(m),7))))+"∣"
else
@r1+2,col1 say "∣"+substr(a(m),7)
endif
endif
set talk off
hh1=printstatus()
set print on
do while .not.hh1
?"打印機(jī)未準(zhǔn)備好,請(qǐng)準(zhǔn)備好打印機(jī)"
hh1=printstatus()
enddo
set talk off
set device to print
clear
a1=getfile("dbf") &&打開(kāi)打開(kāi)文件對(duì)話框
use "&a1" &&打開(kāi)指定的文件
n1=fcount() &&獲取打開(kāi)的庫(kù)中的字段數(shù)
dimension a(n1) &&定義一個(gè)存放字段名的數(shù)組
dimension b(n1) &&定義一個(gè)存放字段寬度的數(shù)組
k=1
do while k<=n1
a(k)=field(k)
k=k+1
enddo &&將字段名賦給數(shù)組
w=1
do while w<=n1
b(w)=fsize(a(w)) &&獲取字段的長(zhǎng)度
if b(w)<6
b(w)=8
else
b(w)=b(w)+2
endif
w=w+1
enddo
do while not eof()
r1=1 &&顯示表頭的第一行
m=1
col1=1
do while m<=n1
if m=1
@r1,col1 say "┌"+replicate("-",b(m))
else
if m=n1
@r1,col1 say "┬"+replicate("-",b(m))+"┐"
else
@r1,col1 say "┬"+replicate("-",b(m))
endif
endif
col1=col1+b(m)
m=m+1
enddo
m=1 &&顯示字段名行
col1=1
do while m<=n1
if m=1
@r1+1,col1 say "∣"+substr(a(m),1,6)+replicate(" ",(b(m)-len(a(m))))
else
if m=n1
@r1+1,col1 say "∣"+substr(a(m),1,6)+replicate(" ",(b(m)-len(substr(a(m),1,6))))+"∣"
else
@r1+1,col1 say "∣"+substr(a(m),1,6)+replicate(" ",(b(m)-len(substr(a(m),1,6))))
endif
endif
col1=col1+b(m)
m=m+1
enddo
m=1 &&由于字段多,一行不能完全顯示整個(gè)行,因此分為兩行顯示字段名行
col1=1
do while m<=n1
if m=1
@r1+2,col1 say "∣"+substr(a(m),7)
else
if m=n1
@r1+2,col1 say "∣"+substr(a(m),7)+replicate(" ",(b(m)-len(substr(a(m),7))))+"∣"
else
@r1+2,col1 say "∣"+substr(a(m),7)
endif
endif

