当前位置: 代码迷 >> VFP >> VFP9中删除的有关问题
  详细解决方案

VFP9中删除的有关问题

热度:4309   发布时间:2013-02-26 00:00:00.0
VFP9中删除的问题
sele a
use e:\pts\mainprogram\datatable\济南
dele from e:\pts\mainprogram\datatable\济南 where subs(账号,1,4)="9531".and.类型=" "
pack

我想删除账号前四位是9531,且类型记录为空的数据。这条语言在VFP6中可行,但为什么在9中就把整个表的内容全部删除了?
在vfp9的环境下,应该怎么做?

------解决方案--------------------------------------------------------
开发工具:Microsoft Visual FoxPro 9.0

USE "E:\pts\mainprogram\datatable\济南.dbf" AGAIN EXCLUSIVE
BROWSE LAST
dele from e:\pts\mainprogram\datatable\济南 where subs(账号,1,4)="9531".and.类型=" "
BROWSE
pack

删除前

账号 类型
95310
95311 9
95312 3
95313
95314 234
95315
95316
95317 23423
95318
95319
95320
95321
85313 2342
85312
85312
85312 234234
85312


删除后

账号 类型
95311 9
95312 3
95314 234
95317 23423
95320
95321
85313 2342
85312
85312
85312 234234
85312

------解决方案--------------------------------------------------------
Sele a
Use e:\pts\mainprogram\datatable\济南
Dele From e:\pts\mainprogram\datatable\济南 Where Subs(账号,1,4)="9531".And.类型=" "
Pack

改为

Delete From e:\pts\mainprogram\datatable\济南 Where Left(账号,4)=="9531" And Empty(类型)
Pack In '济南'



Use e:\pts\mainprogram\datatable\济南 In 0 Exclusive
Select 济南
Delete All For Left(账号,4)=="9531" And Empty(类型)
Pack

------解决方案--------------------------------------------------------
SQL code
        Visual FoxPro 9.0 语言参考 DELETE - SQL 命令 注意: 除非发出 PACK 命令,否则标记为删除部分的记录不会从表中物理删除。可以使用 RECALL 命令取消做(取消标记)了删除标记的记录。更多的信息,请参见 PACK 命令 和 RECALL 命令。    DELETE [Target] FROM [FORCE] Table_List [[, Table_List ...] | [JOIN [ Table_List]]]   [WHERE FilterCondition1 [AND | OR FilterCondition2 ...]] 参数DELETE [Target] *NEW为删除操作指定目标表、临时表、表或临时表的别名、或文件。如果 FROM 指定了多于一张的表,则必须包含 Target 参数。Target 可以用下列语法:[DatabaseName!]TableNameDatabaseName! 如果表不在当前数据库中,用来指定包含表的数据库名。如果表不在当前数据库中,则必须包含数据库名。在数据库名后面、表名前面使用一个惊叹号(!)作为分隔符。TableName 为删除操作指定表名。AliasAlias 为删除操作指定一个别名,该别名与 FROM 子句中的表或当前数据工作期中的临时表相匹配。FileNameFileName 为删除操作指定文件名。FROM [FORCE] Table_List[[, Table_List...] | [JOIN [Table_List]]] *NEW FORCE & JOIN为删除操作指定一个或多个包含数据的表。与 SQL SELECT 命令中的 FROM 子句语法相同,除了以下限制: 目标表或临时表不能包含在一个 OUTER 连接中作为一个次级表或临时表。在目标表上执行一个 JOIN 操作前,它将可能对所有其他 JOIN 操作求值。目标临时表不能由子查询(subquery)产生。更多的信息,请参见 SELECT - SQL 命令。FORCE 指定 Table_List 中的表将加入顺序,显示在 FROM 子句中。 注意: 如果省略 FORCE,则 Visual FoxPro 试图优化删除操作。但是,通过包含 FORCE 关键字禁止对 Visual FoxPro 删除进行优化来执行删除操作,可能更快。   Table_List 可以使用下列语法:*NEW[DatabaseName!]Table [[AS] Local_Alias]DatabaseName! 如果表不在当前数据库中,用来指定包含表的数据库名。如果表不在当前数据库中,在必须包含数据库名。在数据库名后面、表名前面使用一个惊叹号(!)作为分隔符。Table 指定想要从中获取数据的表或临时表名。如果没有表打开,Visual FoxPro 显示打开对话框,您可以指定文件位置。打开表之后,保持打开一直到查询完成。Local_Alias 为 Table 中指定的表指定一个临时名。如果指定了一个本地别名,则必须在整个 DELETE 语句中用本地别名代替表名。别名可以表示一张表或一个临时表。JOIN 指明了可以容纳多少指定的一个或多个次级表。在每条 DELETE 语句中都不限制表、别名、或 JOIN 子句的数量。(Subquery) AS Subquery_AliasSubquery 指定一个 SELECT 语句在另一个 SELECT 语句中。有关 SELECT 语句中子查询的更多信息,请参见 SELECT - SQL 命令 - FROM 子句。WHERE FilterCondition1 [AND | OR FilterCondition2...] 指定一个或多个筛选条件,记录必须符合条件才会被删除。此处不限定 WHERE 子句中筛选条件的数量。要对逻辑表达式求反,可使用 NOT 操作副。要防止空字段,可使用 EMPTY( ) 函数。更多的信息,请参见 EMPTY( ) 函数。 说明若 SET DELETED 命令设置为 ON,则所有命令都忽略带有删除标记的记录。更多的信息,请参见 SET DELETED 命令。要确定被更新的记录数量,可以在运行 SQL DELETE 命令之后,立即检查 _TALLY 系统内存变量的值。更多的信息,请参见 _TALLY 系统内存变量。提示: 与 DELETE 命令不同,在为以共享方式打开的表中的多条记录做删除标记时,SQL DELETE 使用记录锁。这回在多用户情况下减少记录竞争,但可能会降低性能。要获得最佳性能,可用独占方式打开表或使用 FLOCK( ) 函数锁定表。更多的信息,请参见 DELETE 命令 和 FLOCK( ) 函数。   示例 1说明下例用 OPEN DATABASE 命令打开 Visual FoxPro 示例数据库 TestData.dbc。用 USE 命令打开 TestData.dbc 中的 Customer 表。用 SQL DELETE 语句为 Country 字段内容为"USA"的记录标记删除。用 CLEAR 命令清除 Visual FoxPro 主窗口。用 LIST 命令列出所有标记为删除的记录。LIST 命令之后,如果执行了 PACK 命令,标记了的记录将被删除。用 RECALL ALL 命令取消所有记录的删除标记。用 COUNT 命令统计有删除标记的记录数。用 WAIT WINDOW 显示有删除标记的记录数。代码  复制代码 CLOSE DATABASESCLEAROPEN DATABASE HOME(2)+"Data\TestData"USE Customer DELETE FROM Customer WHERE country = "USA"  CLEARLIST FIELDS company, country FOR DELETED( )  WAIT WINDOW "当前有删除标记的记录"+CHR(13) + ;   "按任意键恢复..."RECALL ALLCLEARCOUNT FOR DELETED( )=.T. TO nDeletedWAIT WINDOW ALLTRIM(STR(nDeleted)) + " 条记录有删除标记." 注释更多的信息,请参见 OPEN DATABASE 命令,USE 命令,LIST 命令,CLEAR 命令,COUNT 命令 和 WAIT 命令。示例 2 *NEW说明下面代码演示了一个关联删除,MyProducts 临时表中的记录基于 MSRPList 临时表中的 Discontinued 字段的值添加删除标记。WHERE 子句指定了如何匹配记录以及标记记录的条件值。代码  复制代码 CLOSE DATABASES ALL CREATE CURSOR MyProducts (ProdID I , OurPrice Y NULL) INSERT INTO MyProducts VALUES (1,1.10) && matches but is not marked for deletionINSERT INTO MyProducts VALUES (2,2.20) && matches and is markedINSERT INTO MyProducts VALUES (3,3.30) && matches and is markedCREATE CURSOR MSRPList (ProdID I , ProdCategory I Null, MSRP Y, Discontinued L) INSERT INTO MSRPList VALUES (1, 9, 1.00, .f.) INSERT INTO MSRPList VALUES (2, 8, 2.00, .t.) INSERT INTO MSRPList VALUES (3, 7, 3.00, .t.) DELETE  MyProducts FROM MSRPList ;   WHERE MSRPList.ProdID = MyProducts.ProdID;  &&译者注:指定 MSRPList 和 MyProducts 通过 ProdID 字段关联      AND MSRPList.discontinued = .t.  &&译者注:指定删除条件SELECT MyProducts BROWSE
  相关解决方案