前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >VFP缓冲表的记录有五种变化,揭密一键保存的核心秘密

VFP缓冲表的记录有五种变化,揭密一键保存的核心秘密

作者头像
加菲猫的VFP
发布2021-12-27 18:29:40
1.6K0
发布2021-12-27 18:29:40
举报
文章被收录于专栏:加菲猫的VFP加菲猫的VFP

猫猫的VFP三层开发框架,跟江兴太仓金属,这是一个台资企业签了维护合同,现在框架已经在好多公司应用了,我们社群是做实事的,做好更好用的框架,用VFP不局限于VFP,用VFP混合一切。

今年的社群还会有新的变化,大家都知道猫猫在学主持,其实学主持和当初学自媒体写作是一样的,看似毫不相关,但目标其实一样的,更好的为社群成员服务。2020年社群将会有新的变化,请大家期待吧。

TableUpate命令的使用

上一篇文章更新了如何开启缓冲,这一篇讲如何提交缓冲表的修改。

提交缓冲表的修改

TableUpdate 在FS架构下,是保存到DBF,而在CS架构下是直接生成SQL更新到数据库的方式。

代码语言:javascript
复制
TABLEUPDATE( [nRows [, lForce]] [, cTableAlias | nWorkArea] [, cErrorArray] )

参数说明:

nRows 指定哪些修改被提交到数据表或临时表 注意: 默认情况下,Visual FoxPro启用CursorAdapter 对像相关的临时表的行缓冲。

下表描述了nRows的值

nRows

说明

0

如果启用了表缓冲或行缓冲,仅仅提交当前行的修改到数据表或 临时表. (默认)当使用CursorAdapter objects,对像时,Visual FoxPro 仅在其InsertCmd,UpdateCmd, 或 DeleteCmd 属性中指定时才执行对当前行的修改

1

如果启用了表缓冲,提交所有记录的修改到所有数据库当使用CursorAdapter objects,对像时, Visual FoxPro 仅在其InsertCmd, UpdateCmd, and或DeleteCmd 属性中指定时才执行对当前行的修改

2

提交到表的修改和Rows = 1时相同,不过当提交修改改到数据表时,Visual FoxPro不产生错误信息,并且继续处理数据表或是临时表中的其它记录。如果指定了cErrorArray 参数,当发生错误时,将创建一个包含错误信息的一个数组。

注意划重点:

  1. 为了与早期版本的 Visual FoxPro应用兼容, nRows parameter 也可以接受 假 (.F.) 和 真(.T.) 来代替 of 0 和 1 。
  2. 因为保存是一行一行遍历下来的,当nRows指定为0 或 1时,保存失败,表的记录指针将停在不能被提交修改的记录位置。
  3. 如果要获取不能被提交修改的原因,即保存失败想知道为什么,请使用AERROR( ) 函数来获取错误信息。

来看一下开启缓冲来修改的示例。

代码语言:javascript
复制
SET MULTILOCKS ON
USE 教师
CURSORSETPROP("Buffering", 4,"教师")
append blank
replace name with 'test'
TABLEUPDATE(1,“教师”)  &&提交修改

撤消缓冲表修改

那如果我要不保存,需要撤消怎么办呢?

代码语言:javascript
复制
TABLEREVERT( [lAllRows [, cTableAlias | nWorkArea] ] )

参数 lAllRows 决定是否放弃数据表或临时表的所有修改,下表描述了lAllRows的取值情况:

lAllRows

说明

假 (.F.)

如果启用表缓冲,则只放弃对数据表或临时表中的当前记录的修改 默认)

真 (.T.)

如果启用表缓冲, 则将放弃对数据表或临时表的所有记录的修改。

如果启用行缓冲,Visual FoxPro将忽略lAllRows的值,并且放弃对数据表或临时表中当前记录所做的修改。

cTableAlias 指定要放弃修改的数据表或临时表的别名。 nWorkArea 指定要放弃修改的数据表或临时表所在的工作区。

返回值 数值型。TABLEREVERT( )返回放弃修改的记录的数目

来看示例代码:

代码语言:javascript
复制
SET MULTILOCKS ON
USE 教师
CURSORSETPROP("Buffering", 4,"教师")
append blank
replace name with 'test'
?TABLEREVERT(.t.,“教师”)  &&撤消修改,返回撤消的记录数

缓冲表下的记录有什么特征吗?

还真有,在缓冲模式下,新增行的记录号是负数

代码语言:javascript
复制
SET MULTILOCKS ON
USE 教师
CURSORSETPROP("Buffering", 4,"教师")
append blank
replace name with 'test'
?recon()   &&输出记录号

从负一开始,一直增长。 编辑记录行,记录号不变。

编辑和追加记录后的缓冲

删除记录行,记录号也不变,但可以用deleted()函数获取删除状态。

编辑、删除一个添加记录并追加另外记录后的缓冲

缓冲表记录状态全掌握

那还没有一个函数可以全部判定状态呢? 还真有。

返回一个数值,标明表或临时表中的字段是否已被编辑,或是否有追加的记录,或者指明当前记录的删除状态是否已更改。

代码语言:javascript
复制
GETFLDSTATE(cFieldName | nFieldNumber [, cTableAlias | nWorkArea])

参数 cFieldName| nFieldNumber 指定要返回其编辑状态的字段的名称或编号。字段编号 nFieldNumber 对应于字段在表或临时表结构中的位置。可以使用 DISPLAY STRUCTURE 命令或 FIELD( ) 函数确定字段的编号。指定 nFieldNumber 为 -1 可以返回一个字符串,该字符串包含表或临时表中所有字段的删除和编辑状态。例如,如果某个表有五个字段,而只编辑过第一个字段,则 GETFLDSTATE( ) 函数将返回 121111。第一个位置上的 1 表明删除状态尚未更改。也可以把 nFieldNumber 设置为 0,从而确定自表或临时表打开以来是否更改过当前记录的删除状态。注意: GETFLDSTATE() 函数只能用于判定是否更改过当前记录的删除状态。例如,如果对某个记录作了删除标记,然后又进行了恢复操作,即使此时该记录的删除状态已恢复为原始状态,GETFLDSTATE() 函数仍将指示删除状态已进行了更改。可以使用 DELETED( ) 函数确定记录当前的删除状态。

cTableAlias 指定表或者临时表的别名,函数将返回其字段的编辑状态或记录的删除状态。 nWorkArea 指定表或者临时表所在的工作区,函数将返回其字段的编辑状态或记录的删除状态。如果没有指定别名或工作区,则 GETFLDSTATE( ) 函数返回当前选定表或者临时表中字段的状态。 返回值 数值型, 字符型或 .NULL.

说明 下表列出了返回值及其相应的编辑或删除状态。

返回值

编辑或删除状态

1

字段未作编辑,或者删除状态未作更改。

2

已编辑了字段,或者更改了删除状态。

3

追加记录的字段未做编辑,或者追加记录的删除状态未做更改。

4

已编辑了追加记录的字段,或者已更改了追加记录的删除状态。

.NULL.

在 EOF()

只有表在缓冲状态下,才能使 GETFLDSTATE( ) 函数操作本地表。

如果 getfldstate( ) 函数未带可选的参数 cTableAlias 或 nWorkArea,则返回当前选定工作区中打开的表或临时表的编辑或删除状态。

示例

代码语言:javascript
复制
SET MULTILOCKS ON
USE 教师
=CURSORSETPROP("Buffering",5,"教师")

APPEND BLANK
?GETFLDSTATE("name")     && 返回 3, 记录增加且此字段未被修改

字段的任何修改都会造成 GETFLDSTATE() 返回一个值显示字段已修改, 无论是明确的还是隐含的修改。一个明确修改的例子是包括字段到 REPLACE 或 INSERT INTO 命令中。隐含修改发生在有默认值的字段在使用任何添加新记录的命令时。

也就是说,新增的记录,如果有默认值,状态不同。

代码语言:javascript
复制
SET MULTILOCKS ON
CREATE DATABASE example
CREATE TABLE customer (cust_id C(6),state C(2) DEFAULT "FL")
CLOSE TABLES
USE customer
=CURSORSETPROP("Buffering",5,"customer")

APPEND BLANK
?GETFLDSTATE("cust_id")     && 返回 3, 记录增加且此字段未被修改

?GETFLDSTATE("state")    && 返回 4, 记录增加,且字段被修改

一个一个字段判断太辛苦,全行状态可以返回吗?

代码语言:javascript
复制
GETFLDSTATE(-1)  &&返回全行记录状态

来看这张表

表状态

这个表有二个字段, 第一行修改过name,则 GETFLDSTATE(-1 ) 函数将返回 121。 第二行删除,则 GETFLDSTATE(-1 ) 函数将返回 211。 第三行增加,如果不输入值,则 GETFLDSTATE(-1 ) 函数将返回 333。 第三行增加并修改了name,age,则 GETFLDSTATE(-1 ) 函数将返回 344。 如果第三行,增加->修改->删除,则 GETFLDSTATE(-1 ) 函数将返回 444。

这一串字符就是前面字段的值拼合而成,因为状态比较多,一定要动手试一试。 掌握了缓冲表的状态变化,是不是就可以实现将状态传递给数据库(CS),变为XML,变为JSON。这才是CursorAdapter的秘密,也就是说,你也可以再造CursorAdapter。

祺佑三层开发框架(猫框)已经有封装了一个类库,非常方便从JSON变为缓冲,缓冲变为JSON,从而实现BS一键保存。

猫猫的心里话

如何帮助使用VFP的人?

用VFP的人,有专业的,有非专业了,很多人其实是小白,问出的问题是小白,如果问题不对,我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看,这么简单的问题都不会,嘲笑别人不行,而无法提出建设性答案,是很low的。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 加菲猫的VFP 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 提交缓冲表的修改
  • 撤消缓冲表修改
  • 缓冲表下的记录有什么特征吗?
  • 缓冲表记录状态全掌握
  • 一个一个字段判断太辛苦,全行状态可以返回吗?
  • 猫猫的心里话
    • 如何帮助使用VFP的人?
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档