注册 登录
编程论坛 VFP论坛

求助各位大佬一个prg

dbf永动机 发布于 2023-09-12 09:21, 773 次点击
首先我知道这个prg挺简单的,奈何我不会写啊
现有一个文件夹,里面有20个dbf表,每个表的字段一样,如下:

xuhao(数值型,3位,小数位0) tihao(数值型,6位,小数位0) ans(字符型,40位) fs(数值型,6位,小数位2)
1                         1                        A                 1.00
2                         2                        B                 1.00
3                         3                        B                 2.00
.......................................................................

现在要做的就是写一个循环,把文件件的里dbf处理一下,处理效果如下:
1.删除xuhao列
2.将fs列名改成mf,并将小数位由2增加到3位,原来的内容也跟着增加,比如1.00,变成1.000
3.添加bit字段(数值型,1,0),并将内容全部替换成1
4.添加xxdf字段(数值型,8,3),并将内容全部替换成0.000
5.添加bfdf字段(数值型,8,3),并将内容全部替换成0.000
6.添加sxkf字段(数值型,8,3),并将内容全部替换成0.000
7.添加dkf字段(数值型,8,3),并将内容全部替换成0.000
8.添加emu字段(数值型,1,0),并将内容全部替换成0
9.添加zdf字段(字符型,100)

至此结束,循环处理文件夹中所有dbf文件,文件名保持不变。

13 回复
#2
sdta2023-09-12 10:34
看不出这样做有什么意义
#3
dbf永动机2023-09-12 10:49
回复 2楼 sdta
肯定有意义啊,只有处理后的表才能用,我这个程序必须要有这些字段才能运行。
#4
laowan0012023-09-12 11:49
循环是对多个dbf的
既然结果表的结构是一样的,那就单独按要求建立一个空表
循环内只需把需要的数据通过append from 传进来,然后删除旧表,建立新的dbf表
#5
dbf永动机2023-09-12 12:14
回复 4楼 laowan001
道理我都懂啊,关键就是我的水平只会写单句vfp语句,不会写prg
#6
laowan0012023-09-12 13:52
以下是引用dbf永动机在2023-9-12 12:14:00的发言:

道理我都懂啊,关键就是我的水平只会写单句vfp语句,不会写prg


程序代码:
LOCAL xfiles[1],xfile,xii,xfilename
* 建立结果表结构
xfile = SYS(2015)
CREATE CURSOR &xfile (;
tihao numeric(6,0),;
ans varchar(40),;
mf numeric(6,3),;
bit numeric(1,0),;
xxdf numeric(8,3),;
bfdf numeric(8,3),;
sxkf numeric(8,3),;
dkf numeric(8,3),;
emu numeric(1,0),;
zdf varchar(100);
)

adir(xfiles,SYS(5)+SYS(2003)+'\*.dbf')        && 获取当前目录下所有dbf文件

FOR xii=1 TO alen(xfiles,1)
    SELECT * FROM &xfile WHERE 1=2 INTO CURSOR &xfile READWRITE     && 清除结果表记录
   
    xfilename = xfiles[xii,1]        && 取一个DBF文件名
    INSERT INTO &xfile (tihao,ans,mf) SELECT tihao,ans,fs FROM &xfilename        && 把dbf表中的记录传入结果表
    SELECT &xfile
    REPLACE ALL bit WITH 1        && 其他新加的字段,数值型缺省就是0,字符型缺省就是空,不需要单独替换
   
    USE IN &xfilename        && 关闭旧表
   
    DELETE FILE &xfilename    && 删除旧表
   
    COPY TO &xfilename        && 拷贝新表(同名DBF)
   
    * 不建议在程序中使用上面的方法(或者是改名的方法),因为如果执行过程中遇到问题,则有可能破坏原来的文件!!!   
ENDFOR

* 结束

试试看
#7
easyppt2023-09-12 13:55
程序代码:

Close Dbf
Adir(myarray,'*.dbf')
For lnX = 1 To Alen(myarray,1)
    lcFileName = Juststem(myarray(lnX,1))
    If !Used(lcFileName)
        Use (lcFileName) In 0 Excl
    Endif
    If !Empty(Field('xuhao',lcFileName))
        Alter Table (lcFileName) Drop Column xuhao
    Endif
    If !Empty(Field('fs',lcFileName))
        Alter Table (lcFileName) Rename Column fs To mf
        Alter Table (lcFileName) Alter mf N(3,0)
    Endif
    If Empty(Field('bt',lcFileName))
        Alter Table (lcFileName) Add Column bt N(1)  && Default 1
        Repl All bt With 1
    Endif
*   添加其他字段的方法一样,自己加吧...
Endfor

#8
laowan0012023-09-12 14:04
7楼的方法更安全
#9
dbf永动机2023-09-12 14:12

这是我问人工智能的给出的代码,不会没什么反应,请各位指出一下这代码是否正确

LOCAL lcPath, lnHandle, lnCount, lnI

lcPath = "C:\YourFolderPath\"  && 文件夹路径

SET EXCLUSIVE OFF
SET SAFETY OFF
SET DELETED OFF

lnHandle = ADIR(laTables, lcPath + "*.dbf")  && 获取文件夹中的所有表

lnCount = lnHandle[1]

FOR lnI = 1 TO lnCount  && 循环处理每个表
    USE (lcPath + laTables[lnI, 1])  && 打开表

    * 删除 xuhao 列
    DELETE FIELD xuhao

    * 修改 fs 列名为 mf,并增加小数位
    ALTER TABLE ADD COLUMN mf (6, 3)
    UPDATE ALL SET mf = TRANSFORM(fs, "@ ,.000")

    * 添加 bit 字段,并设置为 1
    ALTER TABLE ADD COLUMN bit (1, 0)
    UPDATE ALL SET bit = 1

    * 添加 xxdf,bfdf,sxkf,dkf 字段,并设置为 0.000
    ALTER TABLE ADD COLUMN xxdf (8, 3)
    UPDATE ALL SET xxdf = 0.000
    ALTER TABLE ADD COLUMN bfdf (8, 3)
    UPDATE ALL SET bfdf = 0.000
    ALTER TABLE ADD COLUMN sxkf (8, 3)
    UPDATE ALL SET sxkf = 0.000
    ALTER TABLE ADD COLUMN dkf (8, 3)
    UPDATE ALL SET dkf = 0.000

    * 添加 emu 字段,并设置为 0
    ALTER TABLE ADD COLUMN emu (1, 0)
    UPDATE ALL SET emu = 0

    * 添加 zdf 字段
    IF !USED("zdf")
        CREATE CURSOR zdf (zdf C(100))
        APPEND BLANK
        REPLACE zdf WITH ""
    ENDIF

    USE IN SELECT("all")  && 关闭当前表
ENDFOR

SET EXCLUSIVE ON
SET SAFETY ON
SET DELETED ON

WAIT WINDOW "处理完成!"  && 显示处理完成消息
#10
dbf永动机2023-09-12 14:26
回复 7楼 easyppt
这是添加好的完整代码,但是没什么反应,请帮我看看哪里有问题


Close Dbf
Adir(myarray,'*.dbf')
For lnX = 1 To Alen(myarray,1)
    lcFileName = Juststem(myarray(lnX,1))
    If !Used(lcFileName)
        Use (lcFileName) In 0 Excl
    Endif
    If !Empty(Field('xuhao',lcFileName))
        Alter Table (lcFileName) Drop Column xuhao
    Endif
    If !Empty(Field('fs',lcFileName))
        Alter Table (lcFileName) Rename Column fs To mf
        Alter Table (lcFileName) Alter mf N(3,0)
    Endif
    If Empty(Field('bit',lcFileName))
        Alter Table (lcFileName) Add Column bit N(1)  && Default 1
        Repl All bit With 1
    Endif
    If Empty(Field('xxdf',lcFileName))
        Alter Table (lcFileName) Add Column xxdf N(8,3)  && Default 1
        Repl All xxdf With 0.000
    Endif
     If Empty(Field('bfdf',lcFileName))
        Alter Table (lcFileName) Add Column bfdf N(8,3)  && Default 1
        Repl All bfdf With 0.000
    Endif
    If Empty(Field('sxkf',lcFileName))
        Alter Table (lcFileName) Add Column sxkf N(8,3)  && Default 1
        Repl All sxkf With 0.000
    Endif
    If Empty(Field('dkf',lcFileName))
        Alter Table (lcFileName) Add Column dkf N(8,3)  && Default 1
        Repl All dkf With 0.000
    Endif
    If Empty(Field('emu',lcFileName))
        Alter Table (lcFileName) Add Column emu N(1,0)  && Default 1
        Repl All emu With 0
    Endif
    If Empty(Field('zdf',lcFileName))
        Alter Table (lcFileName) Add Column zdf C(100)  && Default 1
    Endif
*   添加其他字段的方法一样,自己加吧...
Endfor
#11
dbf永动机2023-09-12 14:31
回复 7楼 easyppt
我刚又试了一下,文件夹里放了两个表,有一个成功,另一个表的字段都对了,但是替换的1 和0.000什么的都没替换进去
#12
easyppt2023-09-12 14:38
可能是 Repl all  语句 没加工作区,加一下 试试:

Repl All bt With 1 in (lcFileName)
#13
easyppt2023-09-12 14:53
我写的代码本身还是有瑕疵的,比如开头 close dbf,以及文件路径问题,还有程序处理完,如何收尾,这些都未考虑。
你理解代码的意思后,可以根据你的环境来优化。
#14
dbf永动机2023-09-12 15:01
回复 13楼 easyppt
刚才改完已经成功执行了,没什么问题,感谢哈
1