加菲猫思考了许久,解决VFP中间层自增型ID开发的一大难题

2022-04-07 19:49:21 浏览数 (1)

前端发送一个表的JSON到后端保存,但是ID却是自增型的,如果把这个ID值取回更新前端相应的值,这是一个难题。

后端的表的结构是这样这样的

有个自增型主键。

正常我们保存的代码是这样的

代码语言: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,经过猫猫的思考和取舍,最终采用了一种比较巧妙的方式实现了,而且封装成了类库。

  1. 中间层DAL_CA类增加一个字段 select 语句增加了trecno字段
代码语言:javascript复制
    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
  1. 中间层sy_user增删查改代码
代码语言:javascript复制
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
  1. 前端加载中间层表
代码语言:javascript复制
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
  1. 前端保存到中间层代码 其实操作跟平常框架开发没什么两样了,就一句save保存所有。
代码语言:javascript复制
If !Thisform.Oca.Save()
    Messagebox(Thisform.Oca.msg,0 16,Thisform.Caption)
    Return
Endif

Wait Windows "保存成功" Timeout 3

这样就可以实现自增型ID自动刷新到前端,是不是爽?

猫框为什么好用,因为我自己也在用,猫猫把坑都填了,语言只是工具,你的思维才是第一生产力。

全新的中间层框架预计很快就能落地了,增删查改就是这么简单。

0 人点赞