使用过VFP6.0编程的人都知道,在设计应用系统时,常常通过编辑框与数据表中备注字段的联接,实现输入一些信息量比较多的内容。如
我们在开发干部管理系统过程中,需要输入“德才表现”等内容,而一般情况下“德才表现”都在几千字以上,
我们就采用了备注字段来存贮德才表现的内容,但在设计打印输出时却出现了新问题,虽然使用报表设计工具中的域控件与备注字段联结可以实现打印功能。但是,由于域控件中在报表设计备注字段时,备注字段内容的字型、字号颜色等可以调整,但是字的行间距却不能调整,而且,当备注字段中的内容很多,一页显示不下的时候,就会自动剪掉多余的字符,这样使用域控件同备注字段相连,就实现不了多内容记录的输出。为了解决这个问题,笔者在实际开发应用程序过程中,编了一段小程序,将备注字段中的内容转换到一个临时数据表中字符型字段的内容,再利用这个临时数据表来打印输出,下面是具体实现的过程:
首先要新建一个临时数据表LSB.DBF,字段只有一个字段名为DYNR,类型为C型,长度为200。假如是要将数据表DYB.DBF中的德才表现进行转换,只要在相应的事件过程中执行下列这段程序即可。
IF USED(″DYB″)
SELE DYB
ELSE
SELE 0
USE DYB
ENDIF
abc=德才表现+CHR(13)+CHR(10)
IF USED(″LSB″)
SELE LSB
ELSE
SELE 0
USE LSB
ENDIF
ZAP
len1=LEN(abc)
K=1
P=0
CHAR1=′′
FOR I=1 TO len1
IF SUBS(abc,I,2)=CHR(13)+CHR(10)
IF LEN(ALLT(CHAR1))〉0
APPE BLAN
REPL DYNR WITH CHAR1
ENDIF
K=1
P=0
I=I+1
CHAR1=′′
ELSE
IF K〈〉70 &&这个值为每行打印的字数,这里为35个汉字,也可随意定,但不能超过100个汉字;
P=IIF (ASC(SUBS(abc,I,1))〈128,P+1,P)
CHAR1=CHAR1+SUBS(abc,I,1)
K=K+1
ELSE
K=1
IF MOD(P,2)=1
IF ASC(SUBS(abc,I,1))〉128
CHAR1=CHAR1+SUBS(abc,I,2)
I=I+1
ELSE
CHAR1=CHAR1+SUBS(abc,I,1)
ENDIF
ELSE
CHAR1=CHAR1+SUBS(abc,I,1)
ENDIF
APPE BLAN
REPL DYNR WITH CHAR1
CHAR1=
P=0
ENDIF
ENDIF
ENDFOR
程序设计思想如下:
首先取得备注字段内容的长度并在备注字段内容的最后加上一个回车换行符即CHR(13)+CHR(10),这是为了防止在备注字段输入时,输入最后一行时没有回车,然后根据所取得备注内容的长度建立一个循环,从备注字段第一个字符开始,一个个字符进行累加,并根据汉字字符机内码大于128的特征,对字符中的非汉字字符进行累加,进行累加主要是为了防止一行结束时取了半个汉字,造成汉字的乱码。并且每取一个字符都要判断是否为回车换行符,如果是,循环结束,将临时数据表LSB中增加一条记录,并将累加生成的字符串,替换到数据表LSB中,将各种计数器重新赋值。不是回车换行符,就一直循环到所设定的每行要打印的字数时,根据非汉字字符个数是否为奇数,并且判断最后一个字符是否为汉字。取得一个字符串,并将这个字符串增加到临时数据表LSB中,将各种计数器重新赋值,继续循环一直到备注字段的内容结束。这样就完成了备注字段内容到数据表中字符字段的转换,接下来就可以利用生成的数据表进行打印了。
首先要新建一个临时数据表LSB.DBF,字段只有一个字段名为DYNR,类型为C型,长度为200。假如是要将数据表DYB.DBF中的德才表现进行转换,只要在相应的事件过程中执行下列这段程序即可。
IF USED(″DYB″)
SELE DYB
ELSE
SELE 0
USE DYB
ENDIF
abc=德才表现+CHR(13)+CHR(10)
IF USED(″LSB″)
SELE LSB
ELSE
SELE 0
USE LSB
ENDIF
ZAP
len1=LEN(abc)
K=1
P=0
CHAR1=′′
FOR I=1 TO len1
IF SUBS(abc,I,2)=CHR(13)+CHR(10)
IF LEN(ALLT(CHAR1))〉0
APPE BLAN
REPL DYNR WITH CHAR1
ENDIF
K=1
P=0
I=I+1
CHAR1=′′
ELSE
IF K〈〉70 &&这个值为每行打印的字数,这里为35个汉字,也可随意定,但不能超过100个汉字;
P=IIF (ASC(SUBS(abc,I,1))〈128,P+1,P)
CHAR1=CHAR1+SUBS(abc,I,1)
K=K+1
ELSE
K=1
IF MOD(P,2)=1
IF ASC(SUBS(abc,I,1))〉128
CHAR1=CHAR1+SUBS(abc,I,2)
I=I+1
ELSE
CHAR1=CHAR1+SUBS(abc,I,1)
ENDIF
ELSE
CHAR1=CHAR1+SUBS(abc,I,1)
ENDIF
APPE BLAN
REPL DYNR WITH CHAR1
CHAR1=
P=0
ENDIF
ENDIF
ENDFOR
程序设计思想如下:
首先取得备注字段内容的长度并在备注字段内容的最后加上一个回车换行符即CHR(13)+CHR(10),这是为了防止在备注字段输入时,输入最后一行时没有回车,然后根据所取得备注内容的长度建立一个循环,从备注字段第一个字符开始,一个个字符进行累加,并根据汉字字符机内码大于128的特征,对字符中的非汉字字符进行累加,进行累加主要是为了防止一行结束时取了半个汉字,造成汉字的乱码。并且每取一个字符都要判断是否为回车换行符,如果是,循环结束,将临时数据表LSB中增加一条记录,并将累加生成的字符串,替换到数据表LSB中,将各种计数器重新赋值。不是回车换行符,就一直循环到所设定的每行要打印的字数时,根据非汉字字符个数是否为奇数,并且判断最后一个字符是否为汉字。取得一个字符串,并将这个字符串增加到临时数据表LSB中,将各种计数器重新赋值,继续循环一直到备注字段的内容结束。这样就完成了备注字段内容到数据表中字符字段的转换,接下来就可以利用生成的数据表进行打印了。