在VFP表单中的新增,保存按钮的代码如何写

在VFP表单中的新增,保存按钮的代码如何写

这是我的一个程序里用到的"添加/保存"和"编辑/还原"按钮的代码,仅供参考。

“添加/保存”:
LOCAL OrderSave_no,Ord_Temp_no
STORE '' TO OrderSave_no,Ord_Temp_no
SELECT &cPtbl_M
OrderSave_no=ALLTRIM(&cPKeyfld) && 将当前bh赋值给 OrderSave_no
IF '添加'$this.Caption && 如果是添加记录
IF MESSAGEBOX('要添加新记录吗?',48+0+4,"确定")=6
WAIT WINDOW '正在添加新记录,请稍候...' AT 20,50 NOWAIT && 开始添加新记录
STORE RECNO() TO nPRecNoEdit && 为还原时恢复到当前记录
Ord_Temp_no='待编号'+RIGHT(TTOC(DATETIME()),8) && 临时为新bh,避免其它用户生成bh时发生冲突
* SET ORDER TO 流程编号 && 为加快搜索速度,以bh为索引
DO CASE
CASE FIELD('开单人')='开单人' AND FIELD('下单日期')='下单日期'
INSERT INTO &cPtbl_M (&cPKeyfld,录入,录入时间,开单人,下单日期) VALUES (Ord_Temp_no,salesname,DATETIME(),salesname,DATETIME())
CASE FIELD('开单人')='开单人' AND !FIELD('下单日期')='下单日期'
INSERT INTO &cPtbl_M (&cPKeyfld,录入,录入时间,开单人,下单日期) VALUES (Ord_Temp_no,salesname,DATETIME(),salesname,DATETIME())
OTHERWISE
INSERT INTO &cPtbl_M (&cPKeyfld,录入,录入时间) VALUES (Ord_Temp_no,salesname,DATETIME())
ENDCASE
* APPEND BLANK
* REPLACE 产品编号 WITH Ord_Temp_no,录入 WITH salesname, 录入时间 WITH DATETIME()

thisformset.form1.SetAll('backcolor',RGB(255,255,255),"mygrid")
this.Caption="保存(\<S)"
this.parent.cmdadd.Picture ='&mainpath\icon\wzsave01.bmp'
this.Parent.cmdedit.Caption="还原(\<R)"
this.Parent.cmdedit.Picture = '&mainpath\icon\wzundo01.bmp'
this.Parent.SetAll('ENABLED',.F.)
this.Enabled=.T.
this.Parent.cmdedit.Enabled = .T.
this.Parent.Refresh
&& 将快捷键工具栏 mycmdbtns_shortcuts1 的可用状态调整为与本工具栏一致 2010.07.07
thisformset.form1.mycmdbtns_shortcuts1.cmdadd.Caption="保存(\<S)"
thisformset.form1.mycmdbtns_shortcuts1.cmdadd.Picture ='&mainpath\icon\wzsave01.bmp'
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Caption="还原(\<R)"
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Picture = '&mainpath\icon\wzundo01.bmp'
thisformset.form1.mycmdbtns_shortcuts1.SetAll('ENABLED',.F.)
thisformset.form1.mycmdbtns_shortcuts1.Enabled=.T.
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Enabled = .T.
thisformset.form1.mycmdbtns_shortcuts1.Refresh
&& 将快捷键工具栏 mycmdbtns_shortcuts1 的可用状态调整为与本工具栏一致

thisformset.form1.SetAll('readonly',.F.,"mygrid")
thisformset.form1.SetAll('readonly',.F.,'mytxtbox')
thisformset.form1.SetAll('readonly',.F.,'mytxtbox_keyfld')
thisformset.form1.SetAll('readonly',.F.,'combobox')
thisformset.form1.SetAll('readonly',.F.,'myeditbox')
thisformset.form1.SetAll('readonly',.F.,'myspinner')
thisformset.form1.SetAll('readonly',.F.,'mycombobox')
* WAIT WINDOW '准备click。。。。' AT 20,50

* WAIT WINDOW '准备click。。。。Click结束...' AT 20,50
thisformset.form1.mygridcontainer1.MyGrid1.SetFocus
* thisformset.form1.refresh

WAIT WINDOW '新记录已添加,请继续编辑...' AT 20,50 NOWAIT TIMEOUT 0.5 && 准备编辑添加后的新记录
cmdEdited=.T.
* thisformset.form1.cmdAutono.click
ENDIF
ELSE && 如果是保存记录
WAIT WINDOW '正在保存记录,请稍候......' AT 23,50 NOWAIT && 在子表保存之前先将父表的保存,因行缓冲下,父表可能已被保存而没有保存到修改时间等信息
SELECT &cPtbl_M
IF '3'$GETFLDSTATE(-1)=.T. AND '4'$GETFLDSTATE(-1)=.F. && 若是新添加的记录且没有更改过,则询问是否放弃该记录
IF MESSAGEBOX('您添加了一条新记录,但未做过任何编辑!'+CHR(13)+CHR(13)+'是要放弃编辑该记录吗? 此记录将不会被保存!',32+4,"确定")=6
=TABLEREVERT(.t.)
cmdEdited=.F.
ELSE
RETURN && 若选择否跳出程序
ENDIF
ELSE && 若是新添加已更改过或非新添加的记录

* SELECT lc_lcb_zb && 准备保存子表 行缓冲下无法正确保存每行的录入及修改时间
* SET EXACT ON && 忽略尾部空格
SET COLLATE TO "PINYIN" && update命令使用pinyin模式索引速度比使用machine模式索引快数百倍
UPDATE &cPtbl_D SET 录入=ALLTRIM(salesname),录入时间=DATETIME() WHERE '4'$GETFLDSTATE(-1)=.T. AND &cPKeyfld=OrderSave_no &&AND 流程编号=OrderSave_no
UPDATE &cPtbl_D SET 修改=ALLTRIM(salesname),修改时间=DATETIME() WHERE '2'$GETFLDSTATE(-1)=.T. AND !LEFT(GETFLDSTATE(-1),1)='2' AND &cPKeyfld=OrderSave_no && AND 流程编号=OrderSave_no
=tableupdate(.T.,.T.,'&cPtbl_D')
unlock

* IF ALLTRIM(流程编号)=='' OR '待编号'$流程编号=.T. && 检查bh是否为空或待编号
* IF MESSAGEBOX('编号不能为空或待编号!'+CHR(13)+CHR(13)+'是要放弃编辑该记录吗? 此记录将不会被保存!',48+0+4,"确定")=6
* =TABLEREVERT(.t.)
* ELSE
* RETURN
* ENDIF
* ELSE && 检查过记录更改状态和bh后,开始保存数据
UPDATE &cPtbl_M SET 录入=ALLTRIM(salesname),录入时间=DATETIME() WHERE '4'$GETFLDSTATE(-1)=.T. && 新添加的记录
UPDATE &cPtbl_M SET 修改=ALLTRIM(salesname),修改时间=DATETIME() WHERE '2'$GETFLDSTATE(-1)=.T. AND !LEFT(GETFLDSTATE(-1),1)='2' &&如果不是新添加记录且更改过
*=TABLEUPDATE(.T.)
=tableupdate(.T.,.T.,'&cPtbl_M')
unlock
* ENDIF
ENDIF

&& 保存后处理命令按钮及界面 Begin
this.Caption="添加(\<A)"
this.Picture ='&mainpath\icon\wznew01.bmp'
this.Parent.cmdedit.Caption="编辑(\<E)"
this.Parent.cmdedit.Picture ='&mainpath\icon\wzedit01.bmp'
this.Parent.SetAll('ENABLED',.T.)

&& 将快捷键工具栏 mycmdbtns_shortcuts1 的可用状态调整为与本工具栏一致 2010.07.07
thisformset.form1.mycmdbtns_shortcuts1.cmdadd.Caption="添加(\<A)"
this.Picture ='&mainpath\icon\wznew01.bmp'
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Caption="编辑(\<E)"
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Picture ='&mainpath\icon\wzedit01.bmp'
thisformset.form1.mycmdbtns_shortcuts1.SetAll('ENABLED',.T.)
&& 将快捷键工具栏 mycmdbtns_shortcuts1 的可用状态调整为与本工具栏一致 2010.07.07

thisformset.form1.SetAll('readonly',.t.,"mygrid")
thisformset.form1.SetAll('backcolor',RGB(245,244,235),"mygrid")
thisformset.form1.SetAll('readonly',.T.,'mytxtbox')
thisformset.form1.SetAll('readonly',.T.,'mytxtbox_keyfld')
thisformset.form1.SetAll('readonly',.T.,'combobox')
thisformset.form1.SetAll('readonly',.T.,'myeditbox')
thisformset.form1.SetAll('readonly',.T.,'myspinner')
thisformset.form1.SetAll('readonly',.T.,'mycombobox')
thisformset.form1.setall('fontbold',.F.,'mytxtbox')
this.Parent.Refresh
&& 保存后处理命令按钮及界面 End
SELECT &cPtbl_M
* SET ORDER TO &cPKeyfld && 无此句Locat运行需要1.950秒,有此句则为8.561秒(共享情况下,单机运行速度飞快)
LOCATE FOR &cPKeyfld=OrderSave_no

WAIT WINDOW '记录已保存!' AT 23,50 NOWAIT TIMEOUT 0.8
cmdEdited=.F.
ENDIF
SELECT &cPtbl_M
thisformset.form1.refresh

"编辑/还原":

SELECT &cPtbl_M
IF RECCOUNT()<1 OR BOF()=.T. OR EOF()=.T.
RETURN
ENDIF

IF "编辑"$this.Caption
WAIT WINDOW '准备编辑记录,请稍候...' AT 20,50 NOWAIT && 开始添加新记录

SELECT &cPtbl_M && 避免在子表时,有时会出现锁定失败的情况
SET FILTER TO && 执行筛选后如果没有找到记录,则此时点编辑会提示"其它用户正在编辑记录" -- 2010.6.16
unlock
IF LOCK()=.f.
WAIT WINDOW '其它用户正在编辑该记录,请稍候再试!' AT 24,50 TIMEOUT 3
ELSE
SELECT &cPtbl_M
STORE RECNO() TO nPRecNoEdit
thisformset.form1.SetAll('backcolor',RGB(255,255,255),"mygrid")
this.Caption = "还原(\<R)"
this.Picture = '&mainpath\icon\wzundo01.bmp'
this.parent.cmdadd.Caption="保存(\<S)"
this.parent.cmdadd.Picture ='&mainpath\icon\wzsave01.bmp'
this.Parent.SetAll('ENABLED',.F.)
this.Enabled = .T.
this.Parent.cmdadd.Enabled = .T. && 2007.12.19

&& 将快捷键工具栏 mycmdbtns_shortcuts1 的可用状态调整为与本工具栏一致 2010.07.07
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Caption = "还原(\<R)"
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Picture ='&mainpath\icon\wzundo01.bmp'
thisformset.form1.mycmdbtns_shortcuts1.cmdadd.Caption="保存(\<S)"
thisformset.form1.mycmdbtns_shortcuts1.cmdadd.Picture ='&mainpath\icon\wzsave01.bmp'
thisformset.form1.mycmdbtns_shortcuts1.SetAll('ENABLED',.F.)
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Enabled = .T.
thisformset.form1.mycmdbtns_shortcuts1.cmdadd.Enabled = .T.
&& 将快捷键工具栏 mycmdbtns_shortcuts 的可用状态调整为与本工具栏一致 2010.07.07

thisformset.form1.SetAll('readonly',.F.,"mygrid")
thisformset.form1.SetAll('readonly',.F.,'mytxtbox')
thisformset.form1.SetAll('readonly',.F.,'mytxtbox_keyfld')
thisformset.form1.SetAll('readonly',.F.,'combobox')
thisformset.form1.SetAll('readonly',.F.,'myeditbox')
thisformset.form1.SetAll('readonly',.F.,'myspinner')
thisformset.form1.SetAll('readonly',.F.,'mycombobox')
WAIT WINDOW '已进入编辑状态,请继续...' AT 20,50 NOWAIT TIMEOUT 0.5 && 已进入编辑状态
cmdEdited=.T.
ENDIF
ELSE
WAIT WINDOW '正在还原记录,请稍候...' AT 20,50 NOWAIT && 开始还原记录
BEGIN TRANSACTION && 为使取消还原时恢复到初始状态
LOCAL cKeyValue
STORE '' TO cKeyValue

LOCAL isedited && 判断父子表是否被修改过
SELECT &cPtbl_M
LOCATE FOR '2'$GETFLDSTATE(-1)=.T. OR '4'$GETFLDSTATE(-1)=.T.
IF FOUND()=.T.
STORE .T. TO isedited
ELSE
STORE .F. TO isedited && 如果父表没有被修改过,再判断子表是否被修改
SELECT &cPtbl_D
LOCATE FOR '2'$GETFLDSTATE(-1)=.T. OR '4'$GETFLDSTATE(-1)=.T.
IF FOUND()=.T.
STORE .T. TO isedited
ELSE
STORE .F. TO isedited
ENDIF
ENDIF

IF "还原"$this.Caption=.t. AND isedited=.T. &&若记录修改过
IF MESSAGEBOX('确实要还原记录吗?刚才所录入的数据将不被保存!'+CHR(13)+CHR(13)+'Would you like to revert? Revised part will not be saved! '+CHR(13)+CHR(13)+'注: 因主编号唯一,仅能还原到主编号生成后的位置!',32+1,'确认还原 Warning')=1
WAIT WINDOW '正在还原记录,请稍候...' AT 20,50 NOWAIT && 开始还原记录
ELSE && 取消还原
ROLLBACK && 为使取消还原时恢复到初始状态
* SELECT &cPtbl_M
* LOCATE FOR '3'$GETFLDSTATE(-1)=.T. && 如果是有新添加但未做过任何修改的记录
* IF FOUND()=.T.
* =TABLEREVERT(.T.)
* ENDIF
* SELECT &cPtbl_D
* LOCATE FOR '3'$GETFLDSTATE(-1)=.T. && 如果是有新添加但未做过任何修改的记录
* IF FOUND()=.T.
* =TABLEREVERT(.T.)
* ENDIF

* SELECT &cPtbl_M
* LOCATE FOR &cPKeyfld=cKeyValue
* thisformset.myRefreshData && 通过表单集的自定义方法myRefreshData刷新数据
RETURN
ENDIF
ENDIF

END TRANSACTION && 为使取消还原时恢复到初始状态

SELECT &cPtbl_M
=TABLEREVERT(.t.)
UNLOCK
SELECT &cPtbl_D
=TABLEREVERT(.t.)
UNLOCK
this.parent.cmdadd.Caption="添加(\<A)"
this.parent.cmdadd.Picture ='&mainpath\icon\wznew01.bmp'
this.Caption="编辑(\<E)"
this.Picture ='&mainpath\icon\wzedit01.bmp'
this.Parent.SetAll('ENABLED',.T.)
&& 将快捷键工具栏 mycmdbtns_shortcuts1 的可用状态调整为与本工具栏一致 2010.07.07
thisformset.form1.mycmdbtns_shortcuts1.cmdadd.Caption="添加(\<A)"
thisformset.form1.mycmdbtns_shortcuts1.cmdadd.Picture ='&mainpath\icon\wznew01.bmp'
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Caption="编辑(\<E)"
thisformset.form1.mycmdbtns_shortcuts1.cmdedit.Picture ='&mainpath\icon\wzedit01.bmp'
thisformset.form1.mycmdbtns_shortcuts1.SetAll('ENABLED',.T.)
&& 将快捷键工具栏 mycmdbtns_shortcuts1 的可用状态调整为与本工具栏一致 2010.07.07
thisformset.form1.SetAll('backcolor',RGB(245,244,235),"mygrid")
thisformset.form1.SetAll('readonly',.T.,"mygrid")
thisformset.form1.SetAll('readonly',.T.,'mytxtbox')
thisformset.form1.SetAll('readonly',.T.,'mytxtbox_keyfld')
thisformset.form1.SetAll('readonly',.T.,'combobox')
thisformset.form1.SetAll('readonly',.T.,'myeditbox')
thisformset.form1.SetAll('readonly',.T.,'myspinner')
thisformset.form1.SetAll('readonly',.T.,'mycombobox')
thisformset.form1.setall('fontbold',.F.,'mytxtbox')
this.Parent.Refresh

SELECT &cPtbl_M
IF RECCOUNT()>0
GOTO nPRecNoEdit
ENDIF
WAIT WINDOW '记录已还原!' AT 20,50 NOWAIT TIMEOUT 0.5 && 开始还原记录
cmdEdited=.F.
thisformset.form1.Refresh
ENDIF
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-12
新增按钮大致的写法是这样的
select 表名
go bott
apend blank 增加空白记录
thisform.text1.setfoucs 设置光标处在文本框1中
保存按钮
判断输入资料是否完整
if empty(thisform.text1.value)
messagebox("不能为空")
return
endif
messagebox("保存成功")
...
代码输入不是一成不变的,还要根据实际情况变动
如有的文本框不与表字段绑定、使用表缓冲等
具体可以与我交流[email protected]
第2个回答  2010-08-12
保存什么?
相似回答