a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 138|回复: 2

[Visual Basic] 2011年计算机等考二级VB辅导知识技巧总结(3)

[复制链接]
发表于 2012-7-31 22:10:12 | 显示全部楼层 |阅读模式
 ADO记录集和水晶报表  在使用水晶报表时,经常会感到数据不是很好控制,最后只好使用这个终极绝招咯。那就是使用数据定义文件(TTX),把得到的ADO记录集传送给水晶报表。" a: w7 ~) x2 R) o2 l
  通常情况下,水晶报表是从物理的数据库上创建出来的,但是现在有了32位的Active Data Driver-- P2smon.dll,水晶就可以不用再事先连接到一个数据库上咯。
6 k9 B9 j% z& m! a* Q) V8 e  首先,需要创建一个TTX文件,进入数据源选择窗体后
; [' x, D2 Q) M, r  再单击了前面的“+”后弹出数据源窗体# U" C5 c* n4 Y" e3 j! t
  此时,我们使用“New”按钮创建一个新的数据定义文件(TTX),格式如下
! y' i( n! D9 Y  保存后,我们打开这个文本文件,就会发现TTX文件的格式,原来中间是TAB分割符来的。
, r5 b! o' ]( l6 A* ~  接着,我们就按照水晶报表的老套路画式样,剩下的就是传递记录机集了。, F# o3 b" ^) z6 I- |% t0 V# w! `! d
  下面,我们要声明好传递ADO记录集需要的Api,9 [0 A! p7 J! G: ?, u0 u
  Public Declare Function PEOpenEngine Lib "crpe32.dll" () As Integer+ j3 x+ l+ }( ]# a* l- E8 Y& W
  Public Declare Function PEGetErrorCode Lib "crpe32.dll" (ByVal printJob As Integer) As Integer
+ t' Y7 s: ^8 p; P! i; [' c" x* u  Public Declare Function PEOpenPrintJob Lib "crpe32.dll" (ByVal RptName As String) As Integer
" b3 m. C  G+ b  Public Declare Function PEOutputToWindow Lib "crpe32.dll" ( _/ t8 K- v" [: t2 ]3 B
  ByVal printJob As Integer, _( r4 H! J1 {7 ^/ `' z" S0 E, k
  ByVal Title As String, _+ c/ B' h% h% ~9 I. @" ^
  ByVal Left As Long, _
4 M; r) A( F9 s4 @6 }  ByVal Top As Long, _0 a( Y# N/ M5 R& D7 r( o) d
  ByVal Width As Long, _' T" l! K7 E& o+ `7 O; _* D
  ByVal Height As Long, _, }' n& r/ ^' h, B
  ByVal style As Long, _$ E$ R) L- n3 A1 g0 k
  ByVal PWindow As Long) As Integer
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:13 | 显示全部楼层

2011年计算机等考二级VB辅导知识技巧总结(3)

 Public Declare Function PEOutputToPrinter Lib "crpe32.dll" ( _  ByVal printJob As Integer, _
9 B, T4 M8 Z* L  O$ k  ByVal nCopies As Integer) As Integer
9 F- a  w9 x$ E2 e9 N, c  Public Declare Function PEStartPrintJob Lib "crpe32.dll" ( _
3 s! U' z' P- |) E! _; ~  ByVal printJob As Integer, _& z6 ~0 m. e/ `: _* F
  ByVal WaitOrNot As Integer) As Integer0 k2 z9 e) D( c3 E0 c
  Public Declare Function PEClosePrintJob Lib "crpe32.dll" (ByVal printJob As Integer) As Integer' O& m' r' ^5 p* C; i: q) f
  Public Declare Sub PECloseEngine Lib "crpe32.dll" ()
4 e- @9 T; D$ ?% v" Q) e  Public Declare Function CreateFieldDefFile Lib "p2smon.dll" ( _- @  D. [* q/ |- w6 x% J3 s
  lpUnk As Object, ByVal _
4 E  P8 U# d" q" n  fileName As String, _6 z+ n& @7 s2 T: o* E. `/ g
  ByVal bOverWriteExistingFile As Long) As Long
" \) J/ c5 }3 ?: S  Public Declare Function vbEncodelPtr Lib "p2smon.dll" (x As Object) As String
3 c7 Y. \3 J+ H  Public Declare Function SetActiveDataSource Lib "p2smon.dll" ( _$ |6 y' @- h0 M6 w
  ByVal printJob As Integer, _. O# ~: _, r# d2 I
  ByVal tableNum As Integer, _/ Q3 O- g, {2 v; F
  x As Object) As Long
9 f; D0 Y2 G, y5 I- s  最后给出的是报表的打印代码
) U# c, \8 a7 \- a. h  Dim Job As Integer
6 l# m  m% N) m; e) Y2 B8 R9 Y  Dim Handle As Integer
' x" C' r8 ^: @! _  '打开打印引擎
8 U! O0 u4 B. T' Q/ {6 P7 P  Handle = PEOpenEngine
3 Y0 E0 L$ Z; v( V2 O; h. j  '水晶的错误处理
' n& F/ v" N; T8 |8 Z0 K3 `1 I' }# z  If Handle = 0 Then
5 J* U2 o& h& _+ k) @6 S3 v/ O# q* P  ErrorNum = PEGetErrorCode(Handle)
1 A2 M! R8 h- Q# W* M  MsgBox "打印引擎出错!"0 r9 K! a; f) I; X1 f7 C) s
  MsgBox "错误代号:" & ErrorNum
! H- f& ?. |8 U8 |  End If
6 \0 W8 W. O+ N8 [1 y: x- i* g  '打开打印作业
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:14 | 显示全部楼层

2011年计算机等考二级VB辅导知识技巧总结(3)

 Job = PEOpenPrintJob(App.Path & "\New.rpt")  '水晶的错误处理
4 j8 q6 ?  L3 P  If Job = 0 Then/ {0 l5 f" ]3 Y0 p0 [6 n
  ErrorNum = PEGetErrorCode(Job)- C, }. M5 N0 }  H2 T
  MsgBox "打开作业New.rpt 失败!"4 S; o) [0 {  ~) W( `( |( i
  MsgBox "错误代号:" & ErrorNum
" {1 f* W! D: P' ^8 Q  End If
" ^; O2 J+ ^7 v$ k, u. B" S3 L: Q; }  '给水晶报表传送ADO记录集,AdoRecordset的生成就不再多说了
" a% N6 k$ X* T4 [; N# O/ h* K: N, S  Handle = SetActiveDataSource(Job, 0, ADOrs)* {0 d2 `' N4 f0 z, u! |
  '输出到打印预览窗口
- V; ?' ^7 \* v7 O  Handle = PEOutputToWindow(Job, "New.rpt", 0, 0, 520, 520, WS_MAXIMIZE, 0)2 P- d7 G$ H: o0 X! f" l
  ‘直接输出到打印机  z1 P2 H; X4 J- w$ K! ?" {6 T# ]
  Handle = PEOutputToPrinter(Job,1)
4 f5 y* X  z. G1 S+ F5 r! ~  '水晶的错误处理
! }+ J+ R, N) Z; s/ _8 G) u8 @) w  If Handle  0 Then
2 w* v; A+ {( i2 D% q- m! l& S0 \  Handle = PEStartPrintJob(Job, True)
+ S: q! S; Y9 C2 Z  If Handle  0 Then2 f2 }4 b5 K2 a8 R9 U5 c/ V# c$ ^
  MsgBox "打印完毕"
* Y3 M) d& Q5 [' x2 J7 \  Else
7 h+ }1 ~7 a3 ?% v$ _  ErrorNum = PEGetErrorCode(Job)* I2 q$ h0 k) X+ o; ^
  MsgBox "打印失败!"
6 U( o" n1 ~8 w6 d+ p( e  MsgBox "错误代号:" & ErrorNum
) I8 Y5 \* Q* ^; v. i8 Z3 `  End If( |) r0 C/ _, Q( Q2 f9 j* ?
  Else! Q8 K/ W8 }; y  o. \
  ErrorNum = PEGetErrorCode(Job), U/ }3 i: i  a0 D6 k% D, L" ?
  MsgBox "无法输出到窗体或打印机"' j1 z2 k7 B' J" t& B5 ^
  MsgBox "错误代号:" & ErrorNum) r2 H( I- n5 J5 U" F
  End If: t) I1 n; @+ n, I/ l9 N: h
  '关闭打印作业7 A2 Y. f  J4 Q& u& n! t
  PEClosePrintJob (Job)
' K) D; \( ~8 f  '关闭打印引擎9 Y4 G, @. x; B: e9 z; A$ V; V
  PECloseEngine) u, S" J; r- V5 @4 Z  \$ ?
  我使用的是VB6+水晶报表8.5,感觉这种方式比较灵活好用,同时解决了水晶报表补空行的问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-21 15:28 , Processed in 0.364786 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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