FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour MySql Nativa Transacciones. At. Mr. Rao
Posts: 344
Joined: Sat Jul 22, 2006 09:04 PM
MySql Nativa Transacciones. At. Mr. Rao
Posted: Wed Sep 15, 2021 01:10 PM
Hola muy buenos d铆as desde Argentina, ante todo un saludo a todos.
Como bien dice el asunto estoy teniendo problemas al querer usar las transacciones usando la Nativa con MySql.
Les adjunto un trozo de codigo.
Code (fw): Select all Collapse
 聽 聽 聽 TRY
聽 聽 聽 聽 聽 聽oCn:BeginTransaction()

聽 聽 聽 聽 聽 聽//--------------------------------------------------------------
聽 聽 聽 聽 聽 聽//---Guardo los datos de la factura en el mayor de ventas
聽 聽 聽 聽 聽 聽::tHoraComprobante:=TIME()

聽 聽 聽 聽 聽 聽cCampos := "cpte_nombre,cpte_letra,cpte_ptovta,cpte_numero,cpte_fecha,cpte_hora,id_cliente,por_dcto,imp_dcto,netoNG,neto21,por_iva21,imp_iva21,neto105,por_iva105,imp_iva105,imp_ii,exento,imp_total,cotizacion,moneda,cae,caevto,caebar,nota,forma_pago,id_usuario,id_caja_maestro"
聽 聽 聽 聽 聽 聽aDatas 聽:= {::nombreComprobante,::letraComprobante,::ptoVtaComprobante,::numeroComprobante,::dFechaComprobante,::tHoraComprobante,::id_cliente,::nPorDcto,::nImpDcto,::netoNG,::neto21,::nPorIva21,::impIva21,::neto105,::nPorIva105,::impIva105,::impII,::Exento,::nTotalCpte,::CotDolarAFIP,::cCodMon,VAL(::aRepFE[1,2]),::aRepFE[1,3],::aRepFE[1,7],::nota,::forma_pago,oApp:nIdUser,::nIdCaja}
聽 聽 聽 聽 聽 聽oCn:Insert( "ventas_mayor", cCampos, aDatas )

...
// mas insert del mismo modo
...


聽 聽 聽 聽CATCH oErr
聽 聽 聽 聽 聽 聽 聽oCn:RollBack()
聽 聽 聽 聽 聽 聽 聽msgInfo("Error al intentar guardar el Comprobante","Aviso")
聽 聽 聽 聽 聽 聽 聽lSave:= .F.
聽 聽 聽 聽FINALLY
聽 聽 聽 聽 聽 聽 聽oCn:CommitTransaction()
聽 聽 聽 聽END


Si en la tabla me falta definir un campo por ejemplo cpte_hora no graba el dato , no me da error y sigue el proceso de grabaci贸n del resto como me ocurri贸.
Seguramente algo debo estar haciendo mal.
Esta forma de Insertar lo tome de un ejemplo en este Foro que nos comparti贸 el Mr Rao
Asi que quedo a la espera de los que saben.
Un abrazo a la distancia.
Marcelo
FWH - Harbour - BCC7 - PellesC
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Thu Sep 16, 2021 02:25 AM
1) What is the data type of cpte_hora? Is it CHAR(8) or VARCHAR(8)?
2) TRY/CATCH does not work. Because if there is a MySql error while inserting, no runtime error is raised. Instead, oCn:nError is set to mysql error number and oCn:cError is set to mysql error description.

So, after oCn:Insert(...), please check
Code (fw): Select all Collapse
? oCn:nError,oCn:cError

and let us know the result.
Regards



G. N. Rao.

Hyderabad, India
Posts: 389
Joined: Wed Nov 29, 2006 01:51 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Thu Sep 16, 2021 09:52 AM

Mr. Rao,

si las try/catch no funciona para detectar un error, como se hace una insercion multiple de tablas el rollback ?
Ejemplo:

oCon:insert( "tabla1".... )
oCon:insert( "tabla2".... )
oCon:insert( "tabla3".... )
oCon:insert( "tabla4".... )
if oCon:nError <> 0
? "Error "
endif
oCon:insert( "tabla5".... )

o sea, como hacemos el RollBack() de las tablas 1,2 y 3 ???
Saludos

Posts: 389
Joined: Wed Nov 29, 2006 01:51 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Thu Sep 16, 2021 07:42 PM

????

Posts: 344
Joined: Sat Jul 22, 2006 09:04 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Thu Sep 16, 2021 09:19 PM

Mr Rao,
La hora es un tipo de dato VARCHAR(8)
Saludos

FWH - Harbour - BCC7 - PellesC
Posts: 344
Joined: Sat Jul 22, 2006 09:04 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Thu Sep 16, 2021 09:27 PM
Mr Rao
Adjunto la imagen del mensaje de error

Saludos
FWH - Harbour - BCC7 - PellesC
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Thu Sep 16, 2021 10:41 PM

Me uno a la pregunta de ariel, es lo unico que me impide migrar a mysql de fwh,
por mas que le doy vuelta no lo encuentro solucion a no ser que por cada instruccion sql que se realice se este verificando si hay error, lo cual considero que rompe con la idea de las transacciones... y incrementa el codigo...
o talvez hay algo mas facil que rao ha impementado, sabiendo como se ha currado esa parte no me extra帽aria..

salu2

:-)

Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1380
Joined: Fri Oct 14, 2005 01:28 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Thu Sep 16, 2021 10:52 PM
Hola!
Solo ratificar expuesto
Hago lo siguiente
A los efectos de guardar varios documentos cheques, lo hago de la siguiente manera:
Code (fw): Select all Collapse
cFieldsBC := "id_banco,id_cuenta,FeAcredita,id_FCompra,Detalle,Monto,idTransTipo,id_user", ; 聽 // campos de la tabla Banking

luego genero un multiarray con varias l铆neas (cada una relacionada con los campos arriba mencionado)
Code (fw): Select all Collapse
lGuardo:= !( ::oConn:Insert( "banking", cFieldsBC, aChequesBC ) == 0 )

Con esta forma de expresar pasan dos cosas:
1. Mi interpretacion fue que si :Insert() devuelve el nro de registros insertados; y por el contrario, ante alguna razon deber铆a devolver 0 (cero).
Lo que no sucede... pues devuelve NIL!
2.- Si por error mio escribo cFieldsBC, sin uno de los campos de manera que escribo solo 7 campos, y el array tiene datos en los 8 campos.... GUARDA IGUAL!

Quizas esto tenga alg煤n significado con el error que provoco
cFieldsBC := "id_banco,id_cuenta,FeAcredita,id_FCompra,Detalle,Monto,idTransTipo,id_user"
lo escribo cFieldsBC := "id_banco,id_cuenta,,id_FCompra,Detalle,Monto,idTransTipo,id_user" // Falta FeAcredita
Al campo FeAcredita en la tabla lo tengo definido con DEFAULT '0000-00-00'. O sea que :Insert() lo guarda con ese dato
No obstante si el nro de campos en la variable es menor que el numero de campos en el array... no deber铆a dar error?

quedo atento
Resistencia - "Ciudad de las Esculturas"

Chaco - Argentina
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Fri Sep 17, 2021 03:52 AM
Marcelo Roggeri wrote:Mr Rao
Adjunto la imagen del mensaje de error

Saludos

Does it mean there is no field by name "cpte_hora" in the table?
Regards



G. N. Rao.

Hyderabad, India
Posts: 389
Joined: Wed Nov 29, 2006 01:51 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Fri Sep 17, 2021 10:08 AM

Mr. Rao,

ese es un ejemplo provocado por error en la programaci贸n, el tema es que el comando :insert() devuelve Nil y sigue con la ejecuci贸n de sentencias, un verdadero desastre, el m茅todo deber铆a (a mi entender y coincido con Carlos) generar el error que provoque la salida por el CATCH.
Saludos.

Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Fri Sep 17, 2021 11:15 AM
Please try:
Code (fw): Select all Collapse
local lSaved := .f.

oCn:BeginTransaction()
TRY
聽 聽if Empty( oCn:Insert( ... ) ); THROW(); endif
聽 聽if Empty( oCn:Insert( ... ) ); THROW(); endif
聽 聽if Empty( oCn:Insert( ... ) ); THROW(); endif
聽 聽lSaved := .t.
CATCH
聽 聽lSaved := .f.
聽 聽oCn:RollBack()
END
if lSaved
聽 聽oCn:CommitTransaction()
endif
Regards



G. N. Rao.

Hyderabad, India
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Fri Sep 17, 2021 05:03 PM
Hace a帽os que uso tmysql con estos cambios, y me ha funcionado bien, me gusta mucho la implementaci贸n de mysql en fwh pero veo que tengo que hacer muchos cambios :-)

Code (fw): Select all Collapse
CLASS TMySQLServer
聽 聽....
聽 聽EXPORTED:
聽 聽DATA pMySQL
聽 聽DATA cDBName, cSchema
聽 聽DATA lTraceLog
聽 聽DATA lThrowError INIT FALSE //para controlar cuando quiero que me reviente el error
聽 聽....

METHOD Execute( cSqlCmd, aParams ) CLASS TMySQLServer
聽 聽LOCAL nRet, oErr

聽 聽IF hb_IsArray( aParams )
聽 聽 聽 cSqlCmd := EvalQueryParams( cSqlCmd, aParams, ::pMySql )
聽 聽ENDIF

聽 聽IF ::lTraceLog
聽 聽 聽 TraceLog( cSqlCmd )
聽 聽ENDIF

聽 聽IF hb_isBlock( ::bOnLoadQuery )
聽 聽 聽 Eval( ::bOnLoadQuery, Self )
聽 聽ENDIF

聽 聽::lError := FALSE
聽 聽::cError := ""
聽 聽::nError := 0

聽 聽nRet := mysql_real_query( ::pMySQL, cSqlCmd )

聽 聽IF hb_isBlock( ::bOnAfterQuery )
聽 聽 聽 Eval( ::bOnAfterQuery, Self )
聽 聽ENDIF

聽 聽IF !( nRet == MYSQL_QUERY_SUCCESS )
聽 聽 聽 ::lError := TRUE
聽 聽 聽 ::cError := ::ErrorTxt()
聽 聽 聽 ::nError := ::ErrNo()
聽 聽 聽 IF ::lThrowError 聽 聽 聽 聽 聽 聽 聽 聽//aca es como lo implemento
聽 聽 聽 聽 聽oErr := ErrorNew()
聽 聽 聽 聽 聽oErr:Args 聽 聽 聽 聽 聽:= { ::pMySQL, cSqlCmd, aParams }
聽 聽 聽 聽 聽oErr:CanDefault 聽 聽:= FALSE
聽 聽 聽 聽 聽oErr:CanRetry 聽 聽 聽:= FALSE
聽 聽 聽 聽 聽oErr:CanSubstitute := FALSE
聽 聽 聽 聽 聽oErr:GenCode 聽 聽 聽 := EG_SYNTAX
聽 聽 聽 聽 聽oErr:Severity 聽 聽 聽:= ES_ERROR
聽 聽 聽 聽 聽oErr:SubSystem 聽 聽 := "TMYSQL-(EXECUTE)"
聽 聽 聽 聽 聽oErr:Operation 聽 聽 := cSqlCmd
聽 聽 聽 聽 聽oErr:SubCode 聽 聽 聽 := ::nError
聽 聽 聽 聽 聽oErr:Description 聽 := ::cError
聽 聽 聽 聽 聽Eval( ErrorBlock(), oErr )
聽 聽 聽 ENDIF
聽 聽ENDIF

RETURN !::lError

....


aca es como lo uso...

STATIC PROCEDURE NuevoPrestamo_Grabar()
聽 聽LOCAL i, cSqlDetalle := "INSERT INTO prestamosdet (num_pres,cuota_no,fecha_prog,valor_prog,estado) VALUES "
聽 聽LOCAL lGrabado := FALSE
聽 聽LOCAL cInfo

聽 聽FOR i := 1 TO Len( aTabla )
聽 聽 聽 cSqlDetalle += "( &1, " + Var2Str( aTabla[ i, TABLA_ABO_NO 聽 聽 聽] ) + 聽"," + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Var2Str( aTabla[ i, TABLA_ABO_FECHA 聽 ] ) + 聽"," + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Var2Str( aTabla[ i, TABLA_ABO_VALPROG ] ) + 聽"," + "'A'),"
聽 聽NEXT

聽 聽cSqlDetalle := hb_StrShrink( cSqlDetalle )

聽 聽oServer:lThrowError := TRUE //aca lo activo

聽 聽TRY
聽 聽 聽 oServer:BeginTransaction()

聽 聽 聽 IF ( nPresNum := IncCount( "control", "cont_pres" ) ) > 0
聽 聽 聽 聽 聽oServer:Insert2( "prestamosmas", { { "num_ruta" 聽 聽 聽, nRutaCob 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "num_clie" 聽 聽 聽, nClieNum 聽 聽}, ; /*datos de cliente*/
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "nombre" 聽 聽 聽 聽, cClieNom 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "cedula" 聽 聽 聽 聽, cClieCed 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "ciudad" 聽 聽 聽 聽, cClieCiu 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "direccion" 聽 聽 , cClieDir 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "telefonos" 聽 聽 , cClieTel 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "num_pres" 聽 聽 聽, nPresNum 聽 聽}, ; /*datos del prestamo*/
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "importe" 聽 聽 聽 , nImporte 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "interes" 聽 聽 聽 , nInteres 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "cuotas" 聽 聽 聽 聽, nCuotas 聽 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "modalidad_pago", nModalidad 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "valor_cuota" 聽 , nValorCuota }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "total" 聽 聽 聽 聽 , nTotal 聽 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "fecha_ent" 聽 聽 , dFechaEnt 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "fecha_ini" 聽 聽 , dFechaIni 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "fecha_fin" 聽 聽 , dFechaFin 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "abonado" 聽 聽 聽 , 0 聽 聽 聽 聽 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "estado" 聽 聽 聽 聽, "A" 聽 聽 聽 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "nota" 聽 聽 聽 聽 聽, cNota 聽 聽 聽 } } )

聽 聽 聽 聽 聽oServer:Execute( cSqlDetalle, { nPresNum } )

聽 聽 聽 聽 聽IF lRestructuracion
聽 聽 聽 聽 聽 聽 cInfo := "Prestamo restructurado: " + hb_NToS( nOldNumPres )
聽 聽 聽 聽 聽 聽 oServer:Execute( "UPDATE prestamosmas SET estado = &1, nota = concat( nota, &2 ) WHERE num_pres=&3", { "R", cInfo, nOldNumPres } )
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 ENDIF

聽 聽 聽 oServer:Commit()
聽 聽 聽 lGrabado := TRUE

聽 聽CATCH oError
聽 聽 聽 ShowError( oError )
聽 聽 聽 oServer:Rollback()
聽 聽END

聽 聽oServer:lThrowError := FALSE //aca lo desactivo

聽 聽IF lGrabado
聽 聽 聽 NuevoPrestamo_MostrarNumero()

聽 聽 聽 IF MsgNoYes( "Desea imprimir contrato del prestamo?" )
聽 聽 聽 聽 聽NuevoPrestamo_Imprimir()
聽 聽 聽 ENDIF

聽 聽 聽 IF lRestructuracion
聽 聽 聽 聽 聽oDlgE:End()
聽 聽 聽 ELSE
聽 聽 聽 聽 聽NuevoPrestamo_Limpiar1( TRUE )

聽 聽 聽 聽 聽oDlgE:Update()
聽 聽 聽 聽 聽oBtnSearch:SetFocus()
聽 聽 聽 ENDIF
聽 聽ENDIF

RETURN lGrabado
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 1789
Joined: Tue Oct 11, 2005 05:01 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Fri Sep 17, 2021 05:03 PM
Hace a帽os que uso tmysql con estos cambios, y me ha funcionado bien, me gusta mucho la implementaci贸n de mysql en fwh pero veo que tengo que hacer muchos cambios :-)

Code (fw): Select all Collapse
CLASS TMySQLServer
聽 聽....
聽 聽EXPORTED:
聽 聽DATA pMySQL
聽 聽DATA cDBName, cSchema
聽 聽DATA lTraceLog
聽 聽DATA lThrowError INIT FALSE //para controlar cuando quiero que me reviente el error
聽 聽....

METHOD Execute( cSqlCmd, aParams ) CLASS TMySQLServer
聽 聽LOCAL nRet, oErr

聽 聽IF hb_IsArray( aParams )
聽 聽 聽 cSqlCmd := EvalQueryParams( cSqlCmd, aParams, ::pMySql )
聽 聽ENDIF

聽 聽IF ::lTraceLog
聽 聽 聽 TraceLog( cSqlCmd )
聽 聽ENDIF

聽 聽IF hb_isBlock( ::bOnLoadQuery )
聽 聽 聽 Eval( ::bOnLoadQuery, Self )
聽 聽ENDIF

聽 聽::lError := FALSE
聽 聽::cError := ""
聽 聽::nError := 0

聽 聽nRet := mysql_real_query( ::pMySQL, cSqlCmd )

聽 聽IF hb_isBlock( ::bOnAfterQuery )
聽 聽 聽 Eval( ::bOnAfterQuery, Self )
聽 聽ENDIF

聽 聽IF !( nRet == MYSQL_QUERY_SUCCESS )
聽 聽 聽 ::lError := TRUE
聽 聽 聽 ::cError := ::ErrorTxt()
聽 聽 聽 ::nError := ::ErrNo()
聽 聽 聽 IF ::lThrowError 聽 聽 聽 聽 聽 聽 聽 聽//aca es como lo implemento
聽 聽 聽 聽 聽oErr := ErrorNew()
聽 聽 聽 聽 聽oErr:Args 聽 聽 聽 聽 聽:= { ::pMySQL, cSqlCmd, aParams }
聽 聽 聽 聽 聽oErr:CanDefault 聽 聽:= FALSE
聽 聽 聽 聽 聽oErr:CanRetry 聽 聽 聽:= FALSE
聽 聽 聽 聽 聽oErr:CanSubstitute := FALSE
聽 聽 聽 聽 聽oErr:GenCode 聽 聽 聽 := EG_SYNTAX
聽 聽 聽 聽 聽oErr:Severity 聽 聽 聽:= ES_ERROR
聽 聽 聽 聽 聽oErr:SubSystem 聽 聽 := "TMYSQL-(EXECUTE)"
聽 聽 聽 聽 聽oErr:Operation 聽 聽 := cSqlCmd
聽 聽 聽 聽 聽oErr:SubCode 聽 聽 聽 := ::nError
聽 聽 聽 聽 聽oErr:Description 聽 := ::cError
聽 聽 聽 聽 聽Eval( ErrorBlock(), oErr )
聽 聽 聽 ENDIF
聽 聽ENDIF

RETURN !::lError

....


aca es como lo uso...

STATIC PROCEDURE NuevoPrestamo_Grabar()
聽 聽LOCAL i, cSqlDetalle := "INSERT INTO prestamosdet (num_pres,cuota_no,fecha_prog,valor_prog,estado) VALUES "
聽 聽LOCAL lGrabado := FALSE
聽 聽LOCAL cInfo

聽 聽FOR i := 1 TO Len( aTabla )
聽 聽 聽 cSqlDetalle += "( &1, " + Var2Str( aTabla[ i, TABLA_ABO_NO 聽 聽 聽] ) + 聽"," + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Var2Str( aTabla[ i, TABLA_ABO_FECHA 聽 ] ) + 聽"," + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 Var2Str( aTabla[ i, TABLA_ABO_VALPROG ] ) + 聽"," + "'A'),"
聽 聽NEXT

聽 聽cSqlDetalle := hb_StrShrink( cSqlDetalle )

聽 聽oServer:lThrowError := TRUE //aca lo activo

聽 聽TRY
聽 聽 聽 oServer:BeginTransaction()

聽 聽 聽 IF ( nPresNum := IncCount( "control", "cont_pres" ) ) > 0
聽 聽 聽 聽 聽oServer:Insert2( "prestamosmas", { { "num_ruta" 聽 聽 聽, nRutaCob 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "num_clie" 聽 聽 聽, nClieNum 聽 聽}, ; /*datos de cliente*/
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "nombre" 聽 聽 聽 聽, cClieNom 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "cedula" 聽 聽 聽 聽, cClieCed 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "ciudad" 聽 聽 聽 聽, cClieCiu 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "direccion" 聽 聽 , cClieDir 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "telefonos" 聽 聽 , cClieTel 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "num_pres" 聽 聽 聽, nPresNum 聽 聽}, ; /*datos del prestamo*/
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "importe" 聽 聽 聽 , nImporte 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "interes" 聽 聽 聽 , nInteres 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "cuotas" 聽 聽 聽 聽, nCuotas 聽 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "modalidad_pago", nModalidad 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "valor_cuota" 聽 , nValorCuota }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "total" 聽 聽 聽 聽 , nTotal 聽 聽 聽}, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "fecha_ent" 聽 聽 , dFechaEnt 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "fecha_ini" 聽 聽 , dFechaIni 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "fecha_fin" 聽 聽 , dFechaFin 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "abonado" 聽 聽 聽 , 0 聽 聽 聽 聽 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "estado" 聽 聽 聽 聽, "A" 聽 聽 聽 聽 }, ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 { "nota" 聽 聽 聽 聽 聽, cNota 聽 聽 聽 } } )

聽 聽 聽 聽 聽oServer:Execute( cSqlDetalle, { nPresNum } )

聽 聽 聽 聽 聽IF lRestructuracion
聽 聽 聽 聽 聽 聽 cInfo := "Prestamo restructurado: " + hb_NToS( nOldNumPres )
聽 聽 聽 聽 聽 聽 oServer:Execute( "UPDATE prestamosmas SET estado = &1, nota = concat( nota, &2 ) WHERE num_pres=&3", { "R", cInfo, nOldNumPres } )
聽 聽 聽 聽 聽ENDIF
聽 聽 聽 ENDIF

聽 聽 聽 oServer:Commit()
聽 聽 聽 lGrabado := TRUE

聽 聽CATCH oError
聽 聽 聽 ShowError( oError )
聽 聽 聽 oServer:Rollback()
聽 聽END

聽 聽oServer:lThrowError := FALSE //aca lo desactivo

聽 聽IF lGrabado
聽 聽 聽 NuevoPrestamo_MostrarNumero()

聽 聽 聽 IF MsgNoYes( "Desea imprimir contrato del prestamo?" )
聽 聽 聽 聽 聽NuevoPrestamo_Imprimir()
聽 聽 聽 ENDIF

聽 聽 聽 IF lRestructuracion
聽 聽 聽 聽 聽oDlgE:End()
聽 聽 聽 ELSE
聽 聽 聽 聽 聽NuevoPrestamo_Limpiar1( TRUE )

聽 聽 聽 聽 聽oDlgE:Update()
聽 聽 聽 聽 聽oBtnSearch:SetFocus()
聽 聽 聽 ENDIF
聽 聽ENDIF

RETURN lGrabado
Salu2

Carlos Vargas

Desde Managua, Nicaragua (CA)
Posts: 344
Joined: Sat Jul 22, 2006 09:04 PM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Fri Sep 17, 2021 05:06 PM
Mr. Rao
Si ese campo falta lo borre intencionalmente para ocasionar el error.
Esto ultimo que usted puso anda
Code (fw): Select all Collapse
IF EMPTY( oCn:Insert( "ventas_mayor", cCampos, aDatas ) ); THROW(); endif

y por consiguiente hace el RollBack.
Otra consulta, ayer habia probado de esta manera de acuerdo a un sample
Code (fw): Select all Collapse
 oCn:Insert( "ventas_mayor", cCampos, aDatas )
if oCn:nError != 0
聽聽 BREAK
endif

y tambi茅n hace el RollBack
Muchas gracias por la ayuda.
Saludos desde Argentina
Marcelo
FWH - Harbour - BCC7 - PellesC
Posts: 10733
Joined: Sun Nov 19, 2006 05:22 AM
Re: MySql Nativa Transacciones. At. Mr. Rao
Posted: Fri Sep 17, 2021 06:26 PM

Mr. Marcelo

BREAK works for you, because you are using Harbour. You may continue using BREAK as you proposed.

It does not work with xHarbour.

Regards



G. N. Rao.

Hyderabad, India