vfp:用事务管理更新远程数据
2010-05-24 16:13
399 查看
**************************************************************
THISFORM.HIDE()
WAIT "正在读取数据库数据,请等待... ..." WINDOWS NOWAIT
*设定视图参数,读视图数据
lcUnitCode=THISFORM.PageFrame1.Page1.Text1.Value &&选择单位代码
cs_n_year=VAL(THISFORM.PageFrame1.Page2.Combo1.Value) &&选择年度
cs_n_month=THISFORM.PageFrame1.Page2.Combo2.Value &&选择月份
cs_d_date=CTOD(STR(cs_n_year,4)+"-"+STR(cs_n_month,2)+"-01")
* 判断单位级别,确定刷新人员范围。
DO CASE
CASE RIGHT(lcUnitcode,8)="00000000"
cs_c_unitcode=""
CASE RIGHT(lcUnitcode,6)="000000"
cs_c_unitcode=SUBST(lcUnitcode,1,2)
CASE RIGHT(lcUnitcode,4)="0000"
cs_c_unitcode=SUBST(lcUnitcode,1,4)
CASE RIGHT(lcUnitcode,2)="00"
cs_c_unitcode=SUBST(lcUnitcode,1,6)
OTHER
cs_c_unitcode=SUBST(lcUnitcode,1,8)
ENDCASE
c_fpfs="计时" &&分配方式
n_rxl=THISFORM.PageFrame1.Page1.Text5.Value &&月均工日
*计算日历天数
lnRlts=30
DO CASE
CASE INLIST(cs_n_month,1,3,5,7,8,10,12)
lnRlts=31
CASE INLIST(cs_n_month,4,6,9,11)
lnRlts=30
OTHE
IF MOD(cs_n_year,400)=0 OR (MOD(cs_n_year,4)=0 AND MOD(cs_n_year,100)<>0)
lnRlts=29
ELSE
lnRlts=28
ENDIF
ENDCASE
* 读入数据
SELECT st_salaryformula && 读入公式组
cs_c_groupname=alltrim(THISFORM.PageFrame1.Page3.list1.Value)
=REQUERY()
GOTO BOTT
SELECT st_gzhssj
=REQUERY()
GOTO BOTT
*开始修改事务
cViewName="st_gzhssj"
SET DATABASE TO ldgzbase &&事务需要在数据库中进行
oldBuffer=CURSORGETPROP("Buffering",cViewName) &&视图缓冲方式
=CURSORSETPROP("Buffering",5,cViewName) &&设为表缓冲
**********************************************************
BEGIN TRANSACTION &&开始本地事务**********************************
nhandle=-1 &&远程连接句柄
IF DBGETPROP(cViewName,"VIEW","SourceType")=2 &&数据源类型 1-本地视图 2-远程视图
nhandle=CURSORGETPROP("ConnectHandle",cViewName)
=SQLSETPROP(nhandle,"Transactions",2) &&开始人工事务**************************************
ENDIF
*计算工资
WAIT CLEAR
SELECT st_salaryformula
myfrm=NewObject("_thermometer","libs\tycommon","","正在进行工资核算... ...")
COUNT TO lnReccount FOR l_correct=1
myfrm.iBasis=lnReccount
myfrm.SHOW()
lnPercent=0
SCAN FOR l_correct=1 &&正确公式
lnPercent=lnPercent+1
myfrm.Update(lnPercent,"")
SELECT st_gzhssj
lcif=ALLTRIM(st_salaryformula.c_if)
lcThen=ALLTRIM(st_salaryformula.c_salaryitem)+" WITH "+ALLTRIM(st_salaryformula.c_then)
IF (NOT TYPE(lcIf)="L" AND NOT EMPTY(lcIf)) OR NOT TYPE(ALLTRIM(st_salaryformula.c_then))="N"
MESSAGEBOX("计算公式有错误,跳过!"+chr(13)+CHR(13)+ALLTRIM(st_salaryformula.c_itemname)+":"+STR(st_salaryformula.n_sxh,3),64,"操作提示")
ELSE
IF EMPTY(lcif)
REPL &lcThen ALL
ELSE
REPL &lcThen FOR &lcif
ENDIF
ENDIF
SELECT st_salaryformula
ENDSCAN
myfrm.COMPLETE()
IF TABLEUPDATE(.T.,.T.,cViewName)
IF nhandle>0
=SQLCOMMIT(nhandle) &&提交远程事务***************************
ENDIF
END TRANSACTION &&结束本地事务***************************************
MESSAGEBOX("工资数据核算操作完成!",64,"操作提示")
ELSE
IF nhandle>0
=SQLROLLBACK(nhandle) &&回滚远程事务
ENDIF
ROLLBACK &&回退本地事务*************************************************
MESSAGEBOX("工资数据核算操作失败, 请重新操作!",64,"操作提示")
ENDIF
=CURSORSETPROP("Buffering",3,cViewName) &&设为表缓冲
*刷新显示
FOR x = 1 TO _SCREEN.FormCount
IF UPPER(_SCREEN.Forms(x).NAME) = "TY_MAINFORMN1"
_SCREEN.Forms(x).RefreshData()
EXIT
ENDIF
ENDFOR
THISFORM.release()
*************** THE END **************
THISFORM.HIDE()
WAIT "正在读取数据库数据,请等待... ..." WINDOWS NOWAIT
*设定视图参数,读视图数据
lcUnitCode=THISFORM.PageFrame1.Page1.Text1.Value &&选择单位代码
cs_n_year=VAL(THISFORM.PageFrame1.Page2.Combo1.Value) &&选择年度
cs_n_month=THISFORM.PageFrame1.Page2.Combo2.Value &&选择月份
cs_d_date=CTOD(STR(cs_n_year,4)+"-"+STR(cs_n_month,2)+"-01")
* 判断单位级别,确定刷新人员范围。
DO CASE
CASE RIGHT(lcUnitcode,8)="00000000"
cs_c_unitcode=""
CASE RIGHT(lcUnitcode,6)="000000"
cs_c_unitcode=SUBST(lcUnitcode,1,2)
CASE RIGHT(lcUnitcode,4)="0000"
cs_c_unitcode=SUBST(lcUnitcode,1,4)
CASE RIGHT(lcUnitcode,2)="00"
cs_c_unitcode=SUBST(lcUnitcode,1,6)
OTHER
cs_c_unitcode=SUBST(lcUnitcode,1,8)
ENDCASE
c_fpfs="计时" &&分配方式
n_rxl=THISFORM.PageFrame1.Page1.Text5.Value &&月均工日
*计算日历天数
lnRlts=30
DO CASE
CASE INLIST(cs_n_month,1,3,5,7,8,10,12)
lnRlts=31
CASE INLIST(cs_n_month,4,6,9,11)
lnRlts=30
OTHE
IF MOD(cs_n_year,400)=0 OR (MOD(cs_n_year,4)=0 AND MOD(cs_n_year,100)<>0)
lnRlts=29
ELSE
lnRlts=28
ENDIF
ENDCASE
* 读入数据
SELECT st_salaryformula && 读入公式组
cs_c_groupname=alltrim(THISFORM.PageFrame1.Page3.list1.Value)
=REQUERY()
GOTO BOTT
SELECT st_gzhssj
=REQUERY()
GOTO BOTT
*开始修改事务
cViewName="st_gzhssj"
SET DATABASE TO ldgzbase &&事务需要在数据库中进行
oldBuffer=CURSORGETPROP("Buffering",cViewName) &&视图缓冲方式
=CURSORSETPROP("Buffering",5,cViewName) &&设为表缓冲
**********************************************************
BEGIN TRANSACTION &&开始本地事务**********************************
nhandle=-1 &&远程连接句柄
IF DBGETPROP(cViewName,"VIEW","SourceType")=2 &&数据源类型 1-本地视图 2-远程视图
nhandle=CURSORGETPROP("ConnectHandle",cViewName)
=SQLSETPROP(nhandle,"Transactions",2) &&开始人工事务**************************************
ENDIF
*计算工资
WAIT CLEAR
SELECT st_salaryformula
myfrm=NewObject("_thermometer","libs\tycommon","","正在进行工资核算... ...")
COUNT TO lnReccount FOR l_correct=1
myfrm.iBasis=lnReccount
myfrm.SHOW()
lnPercent=0
SCAN FOR l_correct=1 &&正确公式
lnPercent=lnPercent+1
myfrm.Update(lnPercent,"")
SELECT st_gzhssj
lcif=ALLTRIM(st_salaryformula.c_if)
lcThen=ALLTRIM(st_salaryformula.c_salaryitem)+" WITH "+ALLTRIM(st_salaryformula.c_then)
IF (NOT TYPE(lcIf)="L" AND NOT EMPTY(lcIf)) OR NOT TYPE(ALLTRIM(st_salaryformula.c_then))="N"
MESSAGEBOX("计算公式有错误,跳过!"+chr(13)+CHR(13)+ALLTRIM(st_salaryformula.c_itemname)+":"+STR(st_salaryformula.n_sxh,3),64,"操作提示")
ELSE
IF EMPTY(lcif)
REPL &lcThen ALL
ELSE
REPL &lcThen FOR &lcif
ENDIF
ENDIF
SELECT st_salaryformula
ENDSCAN
myfrm.COMPLETE()
IF TABLEUPDATE(.T.,.T.,cViewName)
IF nhandle>0
=SQLCOMMIT(nhandle) &&提交远程事务***************************
ENDIF
END TRANSACTION &&结束本地事务***************************************
MESSAGEBOX("工资数据核算操作完成!",64,"操作提示")
ELSE
IF nhandle>0
=SQLROLLBACK(nhandle) &&回滚远程事务
ENDIF
ROLLBACK &&回退本地事务*************************************************
MESSAGEBOX("工资数据核算操作失败, 请重新操作!",64,"操作提示")
ENDIF
=CURSORSETPROP("Buffering",3,cViewName) &&设为表缓冲
*刷新显示
FOR x = 1 TO _SCREEN.FormCount
IF UPPER(_SCREEN.Forms(x).NAME) = "TY_MAINFORMN1"
_SCREEN.Forms(x).RefreshData()
EXIT
ENDIF
ENDFOR
THISFORM.release()
*************** THE END **************
相关文章推荐
- Oracle 11g 学习五:子查询,数据更新操作,事务处理和数据伪列
- Oracle笔记(七) 数据更新、事务处理、数据伪列
- 浅谈管理事务和数据
- 第四章 管理事务和管理数据库 事务与锁
- 测试同时使用JdbcTemplate和HibernateTemplate执行数据更新的事务控制2
- VFP中连编后运行提示数据表是临时表无法更新
- PLSQL更改数据及管理事务
- 数据库的事务管理确保数据完整性
- 从远程服务器数据库中同步数据到本地数据库 sql server 2008 开启分布式事务
- spring 事务管理下的 hibernate 持久化实例操作的几点问题【查询/更新】
- 工业控制,实时监控,远程管理,数据采集,控件,VC++源代码组件库解决方案
- Oracle学习笔记(4) 在PLSQL中更改数据和管理事务
- 该伙伴事务管理器已经禁止了它对远程/网络事务的支持
- SQL2K,DTC错误:"该伙伴事务管理器已经禁止了它对远程/网络事务的支持"的解决办法
- Spring 4 官方文档学习(九)数据访问之事务管理
- PL/SQL程序控制结构及在PL/SQL中更改数据和管理事务
- spring 事务管理 3(数据连接泄漏)
- transaction manager has disabled its support for remote/network transactions. 该伙伴事务管理器已经禁止了它对远程/网络事务
- 定时从远程的数据库中取数据,然后把取出来的数据插入或更新本地的oracle数据库的表
- TransactionScope异常:该伙伴事务管理器已经禁止了它对远程/网络事务的支持