注册 登录
编程论坛 VFP论坛

找出某表中所有字符型字段

杂七杂八 发布于 2022-07-13 22:41, 1690 次点击
找出AAA表中的所有字符型字段,后将该字段的值
用 REPLL ALL 该字段 WITH TRIM(该字段)
能做到吗?
只有本站会员才能查看附件,请 登录


[此贴子已经被作者于2022-7-13 22:43编辑过]

18 回复
#2
zhken2022-07-13 23:06
不找也可以,加一个错误处理,直接对每个字段 REPLL 该字段 WITH TRIM(该字段)all  
#3
吹水佬2022-07-14 08:37
REPLL ALL 该字段 WITH TRIM(该字段)
如果是C型字段没什么用吧
试试
CREATE CURSOR tt (f1 C(10))
INSERT INTO tt VALUES ("abc    ")
REPLACE ALL f1 WITH TRIM(f1)
GO TOP
? LEN(f1),STRCONV(f1,15)


[此贴子已经被作者于2022-7-14 08:40编辑过]

#4
吹水佬2022-07-14 08:42
可用V型
#5
杂七杂八2022-07-14 08:56
回复 4楼 吹水佬
对一个aaa表,不知道表内有多少个字段及字母符类型
1.确认aaa 表中有多少个字段
2.按序确认字段是字符型的
3.是字型的字段,则repl all 该字段 with(该字段)
4.结束判断
#6
hu9jj2022-07-14 09:15
字符字段的宽度是建立表时就确定了的,用 REPLL ALL 该字段 WITH TRIM(该字段)命令无法改变其宽度,保存时字符长度不足的部分会自动用空格补齐的。
#7
吹水佬2022-07-14 09:28
回复 5楼 杂七杂八
用 AFIELDS() 函数可以获取表字段属性,看看帮助
如果对C型字段这做法有点多余,对V型字段可以
#8
杂七杂八2022-07-14 09:31
回复 6楼 hu9jj
Use aaa
Nrow=afield(amy,1)
   For I =1 to nrow
      If type(字段)=“C”
           Repl all 字段 with trim(字段)
       End if
    Endfor
Close all
想要这样的命令
#9
吹水佬2022-07-14 09:41
以下是引用杂七杂八在2022-7-14 09:31:03的发言:
      If type(字段)=“C”
           Repl all 字段 with trim(字段)
       End if

这几句目的为什么?
#10
吹水佬2022-07-14 09:45
回复 8楼 杂七杂八
可能没有认真思考人家的回复,上面多次提到对C型字段没必要这样做。
#11
杂七杂八2022-07-14 09:55
回复 10楼 吹水佬
Aaa.dbf数据源是从系统中导出excel后转dbf,aaa表中许多看不见的空格符,所以要对字符型字段的值进行整理。
不好意思,老是给你添麻烦
#12
吹水佬2022-07-14 10:03
回复 11楼 杂七杂八
3楼的测试代码已经说明问题了
#13
杂七杂八2022-07-14 10:13
回复 12楼 吹水佬
多个字符型字段,都要一个个去写明,有点冗长
#14
吹水佬2022-07-14 10:39
以下是引用杂七杂八在2022-7-14 10:13:52的发言:

多个字符型字段,都要一个个去写明,有点冗长

这做法,一个字段与多个字段有什么不同? 结果都是一样:多此一举,徒劳
#15
mywisdom882022-07-14 11:16
以下是引用杂七杂八在2022-7-14 09:31:03的发言:

Use aaa
Nrow=afield(amy,1)
   For I =1 to nrow
      If type(字段)=“C”
           Repl all 字段 with trim(字段)
       End if
    Endfor
Close all
想要这样的命令

VFP的C类型的,就算你写数据是,把空格去掉了,但他还是会补空格填满的,你读数据的时候,还是要处理空格
如你C类型,姓名 C(10),你写数据的时候,写了“张三”进去,长度是4,但你用 Len(姓名)是等于10的,你substr(姓名,1,4) 是张三,但substr(姓名,5)后,是空的
就你上面的语句,可以改为

Nrow=afield(ary,1)
   For I =1 to nrow
      If ary[i,2]="C"
         Repl all &ary[i,1] with TRIM(&ary[i,1])
       Endif
    Endfor
Close all
#16
mywisdom882022-07-14 11:25
上面的语句,是把空格去掉了,但存在DBF中的C字段,还是会补空格进去,还是 姓名 C(10),的长度10,
你改字段为 V字段,可变长字段,你存进去长度多少,读出来的就是多少,不会补空格。
对比C和V
CREATE CURSOR t0(序号 i,姓名 C(10))
INSERT INTO T0(序号,姓名) VALUES(1,'A1')
INSERT INTO T0(序号,姓名) VALUES(2,'AA1')
INSERT INTO T0(序号,姓名) VALUES(3,'AAA1')
SCAN
 ?LEN(姓名)
ENDSCAN
结果是
10
10
10
但V字段
CREATE CURSOR t1(序号 i,姓名 V(10))
INSERT INTO T1(序号,姓名) VALUES(1,'A1')
INSERT INTO T1(序号,姓名) VALUES(2,'AA1')
INSERT INTO T1(序号,姓名) VALUES(3,'AAA1')
SCAN
 ?LEN(姓名)
ENDSCAN
结果是
2
3
4
#17
杂七杂八2022-07-14 11:55
回复 15楼 mywisdom88
能够找出aaa 表中的历遍所有字符型字段名,并作整理。谢谢你!非常感谢🙏
#18
杂七杂八2022-07-14 11:59
回复 16楼 mywisdom88
学习了,涨知识
#19
厨师王德榜2022-07-14 16:30
对C型字段,这种操作无意义,
对V型字段,这种操作有意义,
但是,V型字段,要VFP9.0才支持.
我的大致思路是,先用Afields()取所有字段信息到数组,
然后遍历数组,当字段类型="V"时, 拼凑一个Replace 语句并执行,直到遍历结束.

[此贴子已经被作者于2022-7-14 16:33编辑过]

1