猫猫的VFP三层开发框架,跟江兴太仓金属,这是一个台资企业签了维护合同,现在框架已经在好多公司应用了,我们社群是做实事的,做好更好用的框架,用VFP不局限于VFP,用VFP混合一切。
今年的社群还会有新的变化,大家都知道猫猫在学主持,其实学主持和当初学自媒体写作是一样的,看似毫不相关,但目标其实一样的,更好的为社群成员服务。2020年社群将会有新的变化,请大家期待吧。
TableUpate命令的使用
上一篇文章更新了如何开启缓冲,这一篇讲如何提交缓冲表的修改。
TableUpdate 在FS架构下,是保存到DBF,而在CS架构下是直接生成SQL更新到数据库的方式。
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 参数,当发生错误时,将创建一个包含错误信息的一个数组。 |
注意划重点:
来看一下开启缓冲来修改的示例。
SET MULTILOCKS ON
USE 教师
CURSORSETPROP("Buffering", 4,"教师")
append blank
replace name with 'test'
TABLEUPDATE(1,“教师”) &&提交修改
那如果我要不保存,需要撤消怎么办呢?
TABLEREVERT( [lAllRows [, cTableAlias | nWorkArea] ] )
参数 lAllRows 决定是否放弃数据表或临时表的所有修改,下表描述了lAllRows的取值情况:
lAllRows | 说明 |
---|---|
假 (.F.) | 如果启用表缓冲,则只放弃对数据表或临时表中的当前记录的修改 默认) |
真 (.T.) | 如果启用表缓冲, 则将放弃对数据表或临时表的所有记录的修改。 |
如果启用行缓冲,Visual FoxPro将忽略lAllRows的值,并且放弃对数据表或临时表中当前记录所做的修改。
cTableAlias 指定要放弃修改的数据表或临时表的别名。 nWorkArea 指定要放弃修改的数据表或临时表所在的工作区。
返回值 数值型。TABLEREVERT( )返回放弃修改的记录的数目
来看示例代码:
SET MULTILOCKS ON
USE 教师
CURSORSETPROP("Buffering", 4,"教师")
append blank
replace name with 'test'
?TABLEREVERT(.t.,“教师”) &&撤消修改,返回撤消的记录数
还真有,在缓冲模式下,新增行的记录号是负数
SET MULTILOCKS ON
USE 教师
CURSORSETPROP("Buffering", 4,"教师")
append blank
replace name with 'test'
?recon() &&输出记录号
从负一开始,一直增长。 编辑记录行,记录号不变。
编辑和追加记录后的缓冲
删除记录行,记录号也不变,但可以用deleted()函数获取删除状态。
编辑、删除一个添加记录并追加另外记录后的缓冲
那还没有一个函数可以全部判定状态呢? 还真有。
返回一个数值,标明表或临时表中的字段是否已被编辑,或是否有追加的记录,或者指明当前记录的删除状态是否已更改。
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,则返回当前选定工作区中打开的表或临时表的编辑或删除状态。
示例
SET MULTILOCKS ON
USE 教师
=CURSORSETPROP("Buffering",5,"教师")
APPEND BLANK
?GETFLDSTATE("name") && 返回 3, 记录增加且此字段未被修改
字段的任何修改都会造成 GETFLDSTATE() 返回一个值显示字段已修改, 无论是明确的还是隐含的修改。一个明确修改的例子是包括字段到 REPLACE 或 INSERT INTO 命令中。隐含修改发生在有默认值的字段在使用任何添加新记录的命令时。
也就是说,新增的记录,如果有默认值,状态不同。
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, 记录增加,且字段被修改
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的人,有专业的,有非专业了,很多人其实是小白,问出的问题是小白,如果问题不对,我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看,这么简单的问题都不会,嘲笑别人不行,而无法提出建设性答案,是很low的。