后端的表的结构是这样这样的
有个自增型主键。
正常我们保存的代码是这样的
代码语言:javascript复制Select ui_nav
cUpJson=JsonUpdateGram("ui_nav",.T.)
cUrl=serverurl "ctl_mainform.fsp?proc=saveNav"
Qiyu_HttpClient =Newobject("Qiyu_HttpClient","Qiyu_HttpClient.prg")
Qiyu_HttpClient.method="post"
cResult = Qiyu_HttpClient.Send(cUrl,cUpJson)
If Isnull(cResult )
Messagebox(Qiyu_HttpClient.msg,0 16,"系统提示")
Return 0
Endif
oReturn=foxjson_parse(cResult)
If oReturn.Item("errno")!=0
Messagebox(oReturn.Item("errmsg"),16,Thisform.Caption)
Return
Endif
Tableupdate(1,.T.) &&这个命令会影响指针
保存,如果中间层返回保存成功,临时表是用TABLEUPDATE把缓冲状态保存起来了,但是ID这个值却是0,这样如果发生了修改,就会更新不到正确的值。
方法一
直接重新刷当前数据,优点是不用多加考虑,直接下载就好。但是如果有分页存在的,新增的记录,如果不在分页范围之内,便看不见了。
方法二
像VFP的CursorAdpater自动刷新ID,经过猫猫的思考和取舍,最终采用了一种比较巧妙的方式实现了,而且封装成了类库。
- 中间层DAL_CA类增加一个字段 select 语句增加了trecno字段
PROCEDURE setupCA
Text to This.SelectCmd noshow
select ID,USERNAME,USERPWD,USERTEL,USEREML,USERBZ,LPAUSE,ROLEID,0 trecno from sy_User
EndText
Text to This.CursorSchema noshow
ID I(4) , USername C(100) , USerpwd C(100) , USertel C(100) , USereml C(100) , USerbz C(100) , LPause L(1) , ROleid I(4) ,trecno I(4)
EndText
Text to This.UpdatableFieldList noshow
ID,USERNAME,USERPWD,USERTEL,USEREML,USERBZ,LPAUSE,ROLEID
EndText
Text to This.UpdateNameList noshow
ID sy_User.ID,USERNAME sy_User.USERNAME,USERPWD sy_User.USERPWD,USERTEL sy_User.USERTEL,USEREML sy_User.USEREML,USERBZ sy_User.USERBZ,LPAUSE sy_User.LPAUSE,ROLEID sy_User.ROLEID
EndText
ENDPROC
- 中间层sy_user增删查改代码
Define Class ctl_user As Session
*--获取导航信息
Procedure getlist
oDBSQLhelper=Newobject("MSSQLhelper","MSSQLHelper.prg")
If oDBSQLhelper.SQLQuery("select * from sy_user","sy_user")<0
Error oDBSQLHelper.errmsg
Endif
Return cursortojson("sy_user")
ENDPROC
*--保存
Procedure save
Local cPostData
cPostData=HttpGetPostData()
* _cliptext=cPostData
oDal=Newobject("dal_sy_user","dal_sy_user.prg")
oDal.parsejson(cPostData,"rows",0)
If !oDal.Save()
Error odal.msg
Endif
Return cursortojson(odal.alias)
Endproc
Enddefine
- 前端加载中间层表
oDAL=NEWOBJECT("Qiyu_MidderCursor","Qiyu_MidderCursor.prg")
oDAL.loadurl=serverurl "ctl_user.fsp?proc=getlist"
oDAL.saveurl=serverurl "ctl_user.fsp?proc=save"
oDAL.keylist="id" &&主键字段,支持复合主键
oDAL.root="rows" &&数据所处的位置
oDAL.alias="sy_user" &&表别名
oDAL.IDKey="id"
TEXT TO oDAL.cursorstruct NOSHOW TEXTMERGE
USername C(100) , USerpwd C(100) , USertel C(100) , USereml C(100) , USerbz C(100) , LPause L(1) , ID I(4) , ROleid I(4)
ENDTEXT
IF !oDAL.open()
MESSAGEBOX(oDAL.msg,0 16,thisform.Caption)
RETURN .f.
ENDIF
thisform.Oca=oDal
- 前端保存到中间层代码 其实操作跟平常框架开发没什么两样了,就一句save保存所有。
If !Thisform.Oca.Save()
Messagebox(Thisform.Oca.msg,0 16,Thisform.Caption)
Return
Endif
Wait Windows "保存成功" Timeout 3
这样就可以实现自增型ID自动刷新到前端,是不是爽?
猫框为什么好用,因为我自己也在用,猫猫把坑都填了,语言只是工具,你的思维才是第一生产力。
全新的中间层框架预计很快就能落地了,增删查改就是这么简单。