FoxPro/Visual FoxPro - begin transaccion

   
Vista:

begin transaccion

Publicado por Gabriela (25 intervenciones) el 25/04/2008 23:33:12
Hola, tengo un sistema para multiusuari en visual fox 7 , con SO NT, trabajo con las tablas en buffer 5 y uso este codigo para grabar:

begin transaction
do while txnlevel()<>0

* Grabar almacenamiento en bufer
aused(tablas)
n=alen(tablas,1) &&cantidad de filas
for i=1 to n
tablas(i,1)=0
if CURSORGETPROP("Buffering", tablas(i,2))>1 then
select tablas(i,2)
tablas(i,1)=CURSORGETPROP("Buffering", tablas(i,2))
for campo=1 to fcount()
if upper(alltrim(field(campo)))=='FECH_MOD' then
replace fech_mod with datetime()
endif
endfor
=tableupdate(.t.)
endif
endfor

* Ejecuta procedimientos relacionados antes de grabar.
*actualizo tabla pto_vta con ultimo corr de nro de cpte
DO WHILE .t.
ultima=0
SELECT pto_vta
IF RLOCK()
ultima=pto_vta.corr+1
replace pto_vta.corr with ultima
UNLOCK IN pto_vta
exit
ENDIF
ENDDO
IF thisform.lgenera='A'
xx1=(ALLTRIM(THISFORM.CBopto_vta.VALUE))+'-'
xx2=replicate('0',8-len(alltrim(str(ultima))))+alltrim(str(ultima))

thisform.numero=xx1+xx2
thisform.txtnum_cpte.VALUE=xx1+xx2
thisform.txtnum_cpte.DisabledBackColor=16777215
ENDIF

*completa la tabla CHEQUE_TRO
SELECT CHEQUE_TRO1
GO top
DO WHILE !EOF()
IF EMPTY(cheque_tro1.importe)
SKIP
loop
ENDIF
select cheque_tro
APPEND BLANK
replace id_cpte WITH registra.id_cpte
replace fecha_emi WITH registra.fecha
replace est_fondo WITH 1
replace pagado WITH "N"
replace nuevo WITH "S"
replace cliente WITH cheque_tro1.cliente
replace firmante WITH cheque_tro1.firmante
replace cod_bco WITH cheque_tro1.cod_bco
replace num_cheque WITH cheque_tro1.num_cheque
replace fecha_vto WITH cheque_tro1.fecha_vto
replace importe WITH cheque_tro1.importe
SELECT FONDOS
SET ORDER TO COD_FONDO
SEEK 2
INSERT INTO curconta (fecha, modulo, cod_cpte, num_cpte, numcta, debe,haber,cod_cc,cheque);
VALUES (registra.fecha,'F', registra.cod_cpte, thisform.numero,fondos.numcta, cheque_tro1.importe,0,'','Ch. N°: '+ALLTRIM(cheque_tro1.num_cheque))
SELECT CHEQUE_TRO1
IF NOT EOF()
SKIP
ENDIF
ENDDO

*completa la tabla acredit
SELECT acredit_bis
GO top
DO WHILE !EOF()
IF EMPTY(acredit_bis.importe)
SKIP
LOOP
ENDIF
SELECT acredit
APPEND BLANK
replace id_cpte WITH registra.id_cpte
replace fecha_emi WITH registra.fecha
replace cod_fondo WITH acredit_bis.cod_bco
replace cta_bco WITH acredit_bis.cta_bco
replace importe WITH acredit_bis.importe
SELECT FONDOS
SET ORDER TO COD_FONDO
SEEK 3
INSERT INTO curconta (fecha, modulo, cod_cpte, num_cpte, numcta, debe,haber,cod_cc,cheque);
VALUES (registra.fecha,'F', registra.cod_cpte, thisform.numero,fondos.numcta, acredit_bis.importe,0,'','')
SELECT acredit_bis
IF NOT EOF()
SKIP
ENDIF
ENDDO

*completa la tabla mov_fondo
SELECT mov_fondo
SET ORDER TO id_cpte
SEEK registra.id_cpte
DO WHILE !EOF() and mov_fondo.id_cpte = registra.id_cpte
IF EMPTY(mov_fondo.cod_fondo)
DELETE
SKIP
loop
ELSE
replace id_cpte WITH registra.id_cpte
replace num_cpte WITH thisform.numero
IF COMPROB.FDOS_IE=1
REPLACE INGRESO WITH mov_fondo.importe
ELSE
REPLACE EGRESO WITH mov_fondo.importe
ENDIF
SELECT FONDOS
SET ORDER TO COD_FONDO
SEEK MOV_FONDO.COD_FONDO
SELECT mov_fondo
REPLACE NUMCTA WITH FONDOS.numcta
IF mov_fondo.cod_fondo!=2 AND mov_fondo.cod_fondo!=3 AND mov_fondo.cod_fondo<50
INSERT INTO curconta (fecha, modulo, cod_cpte, num_cpte, numcta, debe,haber,cod_cc);
VALUES (mov_fondo.fecha, mov_fondo.modulo, mov_fondo.cod_cpte,thisform.numero,fondos.numcta, mov_fondo.ingreso,mov_fondo.egreso,'')
ENDIF
ENDIF
SELECT MOV_FONDO
IF NOT EOF()
SKIP
ENDIF
ENDDO

*completa la tabla mov_impu
SELECT mov_impub
GO top
DO WHILE !EOF()
IF EMPTY(mov_impub.cod_impu)
SKIP
LOOP
ENDIF
SELECT mov_impu
APPEND BLANK
replace id_cpte WITH registra.id_cpte
REPLACE MODULO WITH mov_impub.modulo
replace num_cpte WITH thisform.numero
replace cod_cpte WITH mov_impub.cod_cpte
replace fecha WITH mov_impub.fecha
replace cod_impu WITH mov_impub.cod_impu
replace impuesto WITH mov_impub.impuesto
replace cliente WITH thisform.lcod_clte
replace nom_clie WITH thisform.txtnom_Clte.value
replace nro_ret WITH mov_impub.nro_ret
replace debe WITH mov_impub.debe
replace mes_li WITH MONTH(thisform.txtFecha.Value)
replace anio_li WITH YEAR(thisform.txtFecha.Value)
SELECT impuestos
SET ORDER TO cod_impu
SEEK mov_impub.cod_impu
DO case
case mov_impub.cod_impu>=9 AND mov_impub.cod_impu<=15
ltib=ltib+mov_impub.debe
CASE mov_impub.cod_impu=20
ltgcias=ltgcias+mov_impub.debe
OTHERWISE
loreten=loreten+mov_impub.debe
ENDCASE
replace MOV_IMPU.importe WITH mov_impub.debe
ltret=ltret+mov_impub.debe
INSERT INTO curconta (fecha, modulo, cod_cpte, num_cpte, numcta, debe, cod_cc);
VALUES (mov_impub.fecha, mov_impub.modulo, mov_impub.cod_cpte, thisform.numero,impuestos.numcta_r, mov_impub.debe,'')
SELECT mov_impub
IF NOT EOF()
SKIP
ENDIF
ENDDO

*completa la tabla mov_aplianti

SELECT apli_anti
GO top
DO WHILE !EOF()
SELECT mov_aplant
APPEND BLANK
REPLACE MODULO WITH "F"
replace num_cpte WITH thisform.numero
replace id_cpte WITH registra.id_cpte
replace cod_cpte WITH 13
replace fecha WITH apli_anti.fecha
replace importe WITH apli_anti.importe
replace id_asoc WITH apli_anti.id_cpte
SELECT comprob
SET ORDER TO cod_cpte
SEEK 13
replace mov_aplant.cod_cc WITH comprob.ccosto_apa
replace mov_aplant.cod_cpto WITH comprob.cta_apa
SELECT apli_anti
replace mov_aplant.modulo_a WITH apli_anti.modulo
replace mov_aplant.cod_cpte_a WITH apli_anti.cod_cpte
replace mov_aplant.num_cpte_a WITH apli_anti.num_cpte
replace mov_aplant.importe_a WITH apli_anti.aplica
tapli=tapli+apli_anti.aplica
replace mov_aplant.pendiente WITH apli_anti.saldo - apli_anti.aplica
SELECT mov_antic
SET ORDER TO id_cpte
SEEK apli_anti.id_cpte
replace mov_antic.saldo WITH apli_anti.saldo-apli_anti.aplica
SELECT apli_anti
IF NOT EOF()
SKIP
ENDIF
ENDDO
SELECT conceptos
SET ORDER to cod_cpto
SEEK STR(mov_antic.cod_cpto)+ ALLTRIM(mov_antic.cod_cc)
INSERT INTO curconta (fecha, modulo, cod_cpte, num_cpte, numcta,debe,cod_cc);
VALUES (thisform.txtFecha.Value, mov_antic.modulo, mov_antic.cod_cpte, thisform.numero,;
conceptos.numcta,tapli,mov_antic.cod_cc)

*completa la tabla mov_aplivto

SELECT RENDIC_CC
GO top
DO WHILE !EOF()
IF RENDIC_CC.ELIGE<>0
SELECT mov_aplvto
APPEND BLANK
REPLACE MODULO WITH "F"
replace num_cpte WITH thisform.numero
replace id_cpte WITH registra.id_cpte
replace cod_cpte WITH 13
replace codigo WITH rendic_cc.codigo
replace fecha WITH thisform.txtFecha.Value
replace importe WITH ABS(rendic_cc.saldo)
replace id_asoc WITH rendic_cc.id_cpte
SELECT comprob
SET ORDER TO cod_cpte
SEEK 13
replace mov_aplvto.cod_cc WITH comprob.ccosto_apl
replace mov_aplvto.cod_cpto WITH comprob.cta_apl
SELECT rendic_cc
replace mov_aplvto.modulo_a WITH rendic_cc.modulo
replace mov_aplvto.cod_cpte_a WITH rendic_cc.cod_cpte
replace mov_aplvto.num_cpte_a WITH rendic_cc.num_cpte
replace mov_aplvto.tipo_cpte WITH rendic_cc.tipo_cpte
replace mov_aplvto.tipo WITH rendic_cc.tipo
replace mov_aplvto.fecha_vto WITH rendic_cc.fecha_vto
replace mov_aplvto.importe_a WITH ABS(rendic_cc.elige)
taplivto=taplivto+rendic_cc.elige
replace mov_aplvto.pendiente WITH ABS(rendic_cc.saldo - rendic_cc.elige)
SELECT mov_vtos
SET ORDER TO id_cpte
SEEK rendic_cc.id_cpte
replace mov_vtos.saldo WITH ABS(rendic_cc.saldo-rendic_cc.elige)
ENDIF
SELECT rendic_cc
IF NOT EOF()
SKIP
ENDIF
ENDDO
SELECT clientes
SET ORDER to cliente
SEEK mov_aplvto.codigo
INSERT INTO curconta (fecha, modulo, cod_cpte, num_cpte, numcta,haber, cod_cc);
VALUES (thisform.txtFecha.Value, mov_aplvto.modulo, mov_aplvto.cod_cpte, thisform.numero,;
clientes.numcta,taplivto,'')

*llama al metodo para cargar la tabla de mov de asientos y asiento
thisform.cargar_movasto()

*completa la tabla registra
SELECT registra
replace fecha_hoy WITH DATE()
replace agrupa WITH thisform.lagrupa
replace num_asto WITH asientos.nro_asto
replace total WITH Thisform.txtrend.value
replace t_efect WITH thisform.lsum_e
replace t_cheq WITH thisform.lsum_c
replace t_acred WITH thisform.lsum_a
replace ret_iibb WITH ltib
replace ret_gcias WITH ltgcias
replace t_reten WITH ltret
replace t_ant WITH thisform.lsum_apli
replace hora_grab WITH DATETIME()

* Grabar almacenamiento en bufer
aused(tablas)
n=alen(tablas,1) &&cantidad de filas
for i=1 to n
tablas(i,1)=0
if CURSORGETPROP("Buffering", tablas(i,2))>1 then
select tablas(i,2)
tablas(i,1)=CURSORGETPROP("Buffering", tablas(i,2))
=tableupdate(.t.)
endif
endfor

end transaction

select (thisform.tablaactiva)
go recno()
ENDDO


Ahora tengo entendido que justamente el usar este procedimiento asegura que se grabe todo o nada, entonces,mi consulta es que a veces me graba a medias, por ejemplo yo tengo una tabla REGISTRA, donde se graba la cabecera de las facturas y los movimientos de stock, fondos, impuestos, vencimientos, asiento contable, etc en otras: MOV_FONO, MOV_IMPU, MOV_VTO, MOV_ASTO y lo que hace por ahi es que graba en todas las tablas de mov y no en la principal o no graba en alguna tabla de movimiento. Etuve letyendo otras consulas y por ahi decian que la transacción no debia ser muy larga. será ese mi problema. Por favor pido ayuda URGENTE
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:begin transaccion

Publicado por Marvin Emilson Pineda (28 intervenciones) el 06/05/2008 21:07:46
el error que podria ser es de codificación, deberias de depurar todo ese metodo que almacena la información... con solo verlo me marea...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar