主题:[请教] 如何测得N型字段的小数位数?
			
 北京惬意
				 [专家分:1330]  发布于 2010-02-08 06:55:00							
			查阅了多本VFP书和其它资料,没查到直接测得N型字段小数位数的函数。
哪位知道有没有该函数或其它解决方法?
预祝各位高手和坛友新春快乐!新的一年VFP有更大收获!
						
					 
		
			
回复列表 (共14个回复)
		
								
				沙发
				
					
wzxc [专家分:9440]  发布于 2010-02-08 08:54:00				
				AFIELDS( ) 函数
获取指定工作区中的表结构信息并存贮到一个数组中,通过表别名,或者当前选定的工作区指定,并且返回表的字段数。
 
AFIELDS( ArrayName [, nWorkArea | cTableAlias ] )
 
参数
ArrayName 
指定数组名,将表结构信息存放在这个数组中。如果指定的数组不存在,Visual FoxPro 将自动创建此数组。如果数组存在,但大小不足以包含 AFIELDS( ) 函数返回的所有信息,Visual FoxPro 将自动增加数组大小,使数组能容纳所有信息。 
nWorkArea 
指定表所在的工作区。 
cTableAlias 
指定表的别名。如果忽略 nWorkArea 和 cTableAlias,AFIELDS( ) 将获取当前选定的工作区中表的信息。 
返回值
数值型数据类型。AFIELDS( ) 返回表中的字段数。数组包含18列,行数与表中的字段数相等。
下表描述了数组第一行中每列的内容和每列信息的数据类型。与表相关的信息从第 10 列到 16 列只在表中的第一行中。各字段在表中创建一行。
列号 字段信息 数据类型 
1
 字段名
 字符型
 
2
 字段类型:
C = 字符型
Y = 货币型
D = 日期型
T = 日期时间型
B = 双精度型
F = 浮点型
G = 通用型
I = 整型
L = 逻辑型
M = 备注型
N = 数值型
Q = 可变长二进制型(Varbinary)
V = 可变长字符型(Varchar) 和可变长字符型(二进制) (Varchar (Binary))
W = 大二进制对象(Blob)
 字符
 
3
 字段宽度
 数值型
 
4
 小数位
 数值型
 
5
 允许 Null 值
 逻辑型
 
6
 不允许代码页转换
 逻辑型
 
7
 字段有效性表达式
 字符型
 
8
 字段有效性文本
 字符型
 
9
 字段默认值
 字符型
 
10
 表有效性表达式
 字符型
 
11
 表有效性文本
 字符型
 
12
 长表名
 字符型
 
13
 插入触发器表达式
 字符型
 
14
 更新触发器表达式
 字符型
 
15
 删除触发器表达式
 字符型
 
16
 表注释
 字符型
 
17
 自动增量的 NextValue 值
 数值型
 
18
 自动增量的步长
 
							 
						
				板凳
				
					
北京惬意 [专家分:1330]  发布于 2010-02-08 09:36:00				
				谢谢wzxc老弟。
现在就是用的上述方法以,我在寻找更简单函数或的方法。
							 
						
				3 楼
				
					
wuzhouhong [专家分:10890]  发布于 2010-02-08 09:38:00				
				这个是测定实际小数位数,0值不算位数
*******************************************************************************
** FileName     :  dec_length.prg
**
** Author       :  wuzhouhong
**
** LastEdit     :  2004年12月08日
**
** Action       :  返回此数字的小数个数
**
** Syntax       :  dec_length(nNumber)
**  Explanation :  nNumber=要求小数位数的数字
**
** Return       :  <N>
*******************************************************************************
Parameters nNumber
Local result , tmp_num
m.result = 0
m.tmp_num = m.nNumber-INT(m.nNumber)
do while m.tmp_num<>Int(m.tmp_num)
    m.tmp_num = m.tmp_num*10
    m.result = m.result + 1
enddo
return m.result
							 
						
				4 楼
				
					
sywzs [专家分:5650]  发布于 2010-02-08 10:02:00				
				n=AFIELDS(Array1)
FOR I=1 TO n
  IF Array1(I,2)="N"
    ?"字 段 名:",Array1(I,1)
    ?"字段类型:",Array1(I,2)
    ?"小数位数:",ALLTRIM(STR(Array1(I,4)))
  ENDIF 
NEXT 
祝各位狐坛狐友春节快乐!在新的一年里“狐假虎威”,让狐坛更加生机勃勃!
							 
						
				5 楼
				
					
北京惬意 [专家分:1330]  发布于 2010-02-08 11:09:00				
				本人的需求是:
原来软件某表里其中有“包装量1”和“包装量2”,可以由用户填写,软件可以据此换算出三级和三级数量。例如铅笔可以由支换算成捆,再换算成合。
可是原来没想到包装量能有小数,就设为了整数,好在原来就用的N型字段变量。现在软件用户多了,有的要包装量有小数。
我就做了一个补丁,如果原来小数位数为0就改为两位,如果已经改过了,就不再改了。
考虑到表中有时难免增减字段,所以两个包装量字段在表中的位置还应考虑为不确定的。
这样用获取表结构数组,再查找到位置很麻烦。
我想既然用FSIZE(cFieldName [, nWorkArea | cTableAlias] | cFileName)可以测出字段的宽度,那么是不是加一个什么参数或者有另外一个本人不知道的函数可以测出其中的小数位数?然而不找了很久也没找到,因而向各位请教。感谢以上各位的关注和回复。
							 
						
				6 楼
				
					
wuzhouhong [专家分:10890]  发布于 2010-02-08 11:41:00				
				这种更新的案例,一般做一个更新记录比较好,也就是一个表,里面记录了历次更新留下的标记,比如上次更新了数据字段宽度,做个标记:FLAG_FIELD_WIDTH-EDIT_XXXNAME,2009-12-31.下次要检查是否已经更新,不用对数据库进行实质性检查,直接检查有没有这个标记就可以了。
							 
						
				7 楼
				
					
北京惬意 [专家分:1330]  发布于 2010-02-08 12:09:00				
				多谢楼上的讲解!
还是弄不清“更新记录”写在哪里?
本人的软件里有数据备份功能,用户经常把数据备份保留。
更换升级软件前也要把数据做备份,装上升级软件后再把数据拷贝回来。
这样备份出去的数据表的表结构如与升级后对应表的表结构不一至时,就要用补丁来解决,从而我也理解了很多大型软件为什么补丁越来越多。
所以补丁要能够做到检测到需要修改表结构的改之,已经改过的就不能再去改。否则就是做无用功,即浪费机时,还有其它隐患。
不知道“更新记录”能否更好的解决这个问题?谢谢!
							 
						
				8 楼
				
					
wuzhouhong [专家分:10890]  发布于 2010-02-08 13:51:00				
				这个表可以自己设计,只要符合你做标记的要求就可以,同时在表里加入一个标记,识别数据库的版本,比如3.0,然后程序自己带一个函数,固定专门返回当前程序的版本,系统启动的时候,或者导入数据的时候,将写在表里的版本号和程序的版本号比较,如果小于程序版本,就强制转入升级处理。如大于程序版本就提出警告,提示无法处理高版本数据,然后QUIT
这样能很好解决不同版本备份文件导入的问题。
							 
						
				9 楼
				
					
北京惬意 [专家分:1330]  发布于 2010-02-08 16:35:00				
				谢谢楼上回复!
不知道自由表的哪里可以写那个标记,如果是增加一条记录或一个字段那好象更麻烦。
							 
						
				10 楼
				
					
fyyylyl [专家分:8550]  发布于 2010-02-08 16:45:00				
				copy stru exten to dbfstru
sele 0
use dbfstru
loca for field_name='包装数量1'
if field_dec=0
sele 原表   &&需独占打开
alter table ......
endif
use in dbfstru
							 
									
			
我来回复