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

202 阅读3分钟

最近疫情又开始反复了,猫猫3月5日去了一下泉州,就被通知居家隔离,三天两次核酸,社群的老李也在泉州,他所在的小区出现了确诊病例,连夜跑回了老家。阿宝水煮鱼的门面刚装修好,准备开业了,就被封区了,深感疫情之下,生活的不易。但生活总得有希望,狐友们加油!

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

后端的表的结构是这样这样的 有个自增型主键。

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

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字段
    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增删查改代码
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. 前端加载中间层表
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保存所有。
If !Thisform.Oca.Save()
	Messagebox(Thisform.Oca.msg,0+16,Thisform.Caption)
	Return
Endif

Wait Windows "保存成功" Timeout 3

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

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

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