标题:求助,VFP表单程序试运行没问题,连编后老报错,求助大家
只看楼主
yunyka
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2020-8-3
结帖率:100%
已结贴  问题点数:20 回复次数:21 
求助,VFP表单程序试运行没问题,连编后老报错,求助大家
写了一个小程序,想结合表单编成exe,在VFP中试运行没问题,但是运行连编后的exe就会在一个判断数据表某个字段是否没有非空记录的地方出错,显示我预置的信息(但是预留数据完全不会报错,试运行也能过)。
报错后exe还会报“文件正在使用”的错误,无法正常退出。

我的主程序:
ON KEY LABEL ALT+F4 DO quit_program
ON SHUTDOWN DO quit_program

SET SAFETY OFF
SET TALK ON

DO FORM D:\Desktop\活动排序\活动排序界面.scx
READ EVENTS

PROCEDURE quit_program
    RELEASE ALL
    CLOSE ALL
    CLEAR EVENTS
    CLEAR ALL
    DELETE FILE *.bak
    DELETE FILE *.dbf
    QUIT
ENDPROC

表单按钮点击代码:

sjk = thisform.名单地址.Value
IF NOT FILE(sjk)
    MESSAGEBOX("请先填写或选择正确名单地址!")
    CANCEL
ENDIF

wenti_gm = thisform.规模.Value
IF INT(wenti_gm)<>wenti_gm OR wenti_gm>99 OR wenti_gm<3
    MESSAGEBOX("请先填写正确的活动规模,3~99间的整数!")
    CANCEL
ENDIF

IF thisform.方法选择.枚举.Value = 1
    my_method = 1
ELSE
    my_method = 2
ENDIF
IF my_method == 1 AND wenti_gm>7
    MESSAGEBOX("活动数量较多,请选择精确计算以保证效率!")
    CANCEL
ENDIF

DO D:\Desktop\活动排序\测算主程序.prg WITH sjk,wenti_gm,my_method

测算主程序代码片段:

PARAMETERS sjk,wenti_gm,my_method
PUBLIC ARRAY cnt_arr4(1,1), cnt_arr5(1,1),ku_chk(1,1)

CREATE TABLE 活动排序.dbf ;
    ( 活动01 c(50))
FOR i = 2 TO wenti_gm
    field_name = "活动"+RIGHT("0"+ALLTRIM(STR(i)),2)
    ALTER table 活动排序 ADD &field_name c(50)
ENDFOR
SELECT 活动排序
APPEND FROM &sjk TYPE CSV
MESSAGEBOX("导入完成!")

**创建相邻两个活动的组合库,并计算两个活动的人次变动数
CLOSE DATABASES
USE 活动排序.dbf ALIAS a IN 1
field_num = AFIELDS(field_arr,"A")
FOR i = 1 TO field_num
    field_name = FIELD(i)
    SELECT COUNT(*) FROM a WHERE ALLTRIM(&field_name)<>"" INTO ARRAY ku_chk
    IF ku_chk(1,1) = 0
        CLOSE DATABASES ALL
        MESSAGEBOX(field_name+" 没有参与人员不合规,请检查提供名单是否合规!!")        &&连编的exe到这里就会出错,无论给的原始数据是什么样
        CANCEL
    ENDIF
ENDFOR

…………
烦请大家看看问题出在什么地方
搜索更多相关主题的帖子: 排序 MESSAGEBOX 活动 运行 IF 
2020-08-03 15:53
yunyka
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2020-8-3
得分:0 
在线等,
2020-08-03 16:28
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
 因为你的代码中采用的是绝对路径。所以有可能是:EXE文档的执行路径变了,程序就报错。

建议,采用相对路径编程。

只求每天有一丁点儿的进步就可以了
2020-08-03 16:31
yunyka
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2020-8-3
得分:0 
回复 3楼 wengjl
有道理,我一会儿试试,但是我查看了一下exe终止时的文件,活动排序.dbf这个表成功生成并导入数据了,没有空白列的存在,不知道为什么会在那出错。
还有没有其它出错的可能?
2020-08-03 16:37
yunyka
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2020-8-3
得分:0 
3楼大哥的说法我试了,依旧VFP里面试运行可以,连编的exe会出错,无语了
2020-08-03 17:31
yunyka
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2020-8-3
得分:0 
我发现问题就是这句话:
SELECT COUNT(*) FROM a WHERE ALLTRIM(&field_name)<>"" INTO ARRAY ku_chk
在exe下无论怎么查,ku_chk都是0,但是我用exe运行的过程文件自己重新用这句话查了一下是有结果数据的
不知道哪位高人能解释一下为什么么?因为我程序后面还有很多类似的语句……
2020-08-03 17:54
jhcwk
Rank: 1
等 级:新手上路
帖 子:14
专家分:5
注 册:2010-2-22
得分:0 
语句 field_name = "活动"+RIGHT("0"+ALLTRIM(STR(i)),2)
wenti_gm是3~99间的整数
2020-08-03 18:02
yunyka
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2020-8-3
得分:0 
回复 7楼 jhcwk
这句话有什么问题么?不太明白
2020-08-03 18:12
xuminxz
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:40
帖 子:749
专家分:2475
注 册:2011-5-8
得分:0 
这个问题已经出现多次了,请遵守VFP基本要求。不要用a-j这10个字母单独作表名或别名,否则可能会出现无法预知的错误。
另外,CLOSE DATABASES是什么目的?它只关闭数据库不关闭数据表,注意区分数据库与数据表的概念。
调试时,你没有打开其它表,运行时可能打了其它表。打开前10个表默认别名由a-j。所以,你运行时可能会提示别名已使用。
注意,在SQL语句中内部别名,不受此规定影响。
SELECT COUNT(*) FROM a WHERE ALLTRIM(&field_name)<>"" INTO ARRAY ku_chk中的a是程序运行时第一个打开的表,不一定是你指定的表。

[此贴子已经被作者于2020-8-3 21:43编辑过]


dBase有人接盘了。
2020-08-03 21:32
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:4 
以下是引用yunyka在2020-8-3 15:53:38的发言:

写了一个小程序,想结合表单编成exe,在VFP中试运行没问题,但是运行连编后的exe就会在一个判断数据表某个字段是否没有非空记录的地方出错,显示我预置的信息(但是预留数据完全不会报错,试运行也能过)。
报错后exe还会报“文件正在使用”的错误,无法正常退出。

我的主程序:
ON KEY LABEL ALT+F4 DO quit_program
ON SHUTDOWN DO quit_program

SET SAFETY OFF
SET TALK ON

DO FORM D:\Desktop\活动排序\活动排序界面.scx
READ EVENTS

PROCEDURE quit_program
    RELEASE ALL
    CLOSE ALL
    CLEAR EVENTS
    CLEAR ALL
    DELETE FILE *.bak
    DELETE FILE *.dbf
    QUIT
ENDPROC

表单按钮点击代码:

sjk = thisform.名单地址.Value
IF NOT FILE(sjk)
    MESSAGEBOX("请先填写或选择正确名单地址!")
    CANCEL
ENDIF

wenti_gm = thisform.规模.Value
IF INT(wenti_gm)<>wenti_gm OR wenti_gm>99 OR wenti_gm<3
    MESSAGEBOX("请先填写正确的活动规模,3~99间的整数!")
    CANCEL
ENDIF

IF thisform.方法选择.枚举.Value = 1
    my_method = 1
ELSE
    my_method = 2
ENDIF
IF my_method == 1 AND wenti_gm>7
    MESSAGEBOX("活动数量较多,请选择精确计算以保证效率!")
    CANCEL
ENDIF

DO D:\Desktop\活动排序\测算主程序.prg WITH sjk,wenti_gm,my_method

测算主程序代码片段:

PARAMETERS sjk,wenti_gm,my_method
PUBLIC ARRAY cnt_arr4(1,1), cnt_arr5(1,1),ku_chk(1,1)

CREATE TABLE 活动排序.dbf ;
    ( 活动01 c(50))
FOR i = 2 TO wenti_gm
    field_name = "活动"+RIGHT("0"+ALLTRIM(STR(i)),2)
    ALTER table 活动排序 ADD &field_name c(50)
ENDFOR
SELECT 活动排序
APPEND FROM &sjk TYPE CSV
MESSAGEBOX("导入完成!")

**创建相邻两个活动的组合库,并计算两个活动的人次变动数
CLOSE DATABASES
USE 活动排序.dbf ALIAS a IN 1
field_num = AFIELDS(field_arr,"A")
FOR i = 1 TO field_num
    field_name = FIELD(i)
    SELECT COUNT(*) FROM a WHERE ALLTRIM(&field_name)<>"" INTO ARRAY ku_chk
    IF ku_chk(1,1) = 0
        CLOSE DATABASES ALL
        MESSAGEBOX(field_name+" 没有参与人员不合规,请检查提供名单是否合规!!")        &&连编的exe到这里就会出错,无论给的原始数据是什么样
        CANCEL
    ENDIF
ENDFOR

…………
烦请大家看看问题出在什么地方

SELECT COUNT(*) FROM a WHERE EVALUATE(field_name)……

只求每天有一丁点儿的进步就可以了
2020-08-04 08:56



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-502726-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.322800 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved