Power Builder - Es imposible controlar errores de conexión

 
Vista:

Es imposible controlar errores de conexión

Publicado por JOSE LUIS (1 intervención) el 16/07/2019 21:29:12
Tengo una duda que espero puedan ayudarme con su experiencia, en mi trabajo tenemos un sistema elaborado con PB y base de datos SQL, nuestra conexión es vía Internet Cliente - Servidor, ocasionalmente se generan unos problemas cuando dos documentos se enlazan con un previo cuando solo debería permitirse enlazar con uno.Nuestro programador dice que el problema es que debido a las fallas en la conexión a internet el archivo no se cerró correctamente (Grabó parte de la información pero no toda) y por eso pudo enlazarse otro documento, me dice que esto es inevitable y que no se puede controlar, si fuese posible no habría problemas en todos los sistemas. Por mi parte tengo dudas que esto sea cierto, problemas de conexión estable de internet lo tienen todos pero no creo que por eso fallen los sistemas y nos obliguen a hacer revisiones de cosas extrañas que se grabaron en la base de datos. Tengo la idea de que no está manejando correctamente los Commit y Roll Back, por eso se graba parte de la transacción pero no la deshace completamente ante una falla de conectividad. El dice que no controla lo que pasa después de lanzar un commit, si en el camino falla la conectividad ocurren cosas fuera de control ¿Estoy equivocado y es cierto que estas perdidas de conexión generan errores extraños en la base de datos que deben ser reparados
a medida que alguien los descubre?. Espero puedan compartirme algo de su conocimiento para corregir mis ideas o si es lo contrario puedan darme algunas pautas para pasarlas a nuestro programador y puedan evitarse estos errores extraños.
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
Imágen de perfil de Adolfo
Val: 250
Bronce
Ha mantenido su posición en Power Builder (en relación al último mes)
Gráfica de Power Builder

Es imposible controlar errores de conexión

Publicado por Adolfo (260 intervenciones) el 17/07/2019 15:51:59
Lo que comentas es algo muy común, mas de lo que crees, la respuesta es: SI, si se puede controlar la falta de ancho de banda que te permite la conexión-desconexión a la base de datos. La solución que te sugiero y que al menos a mi me ha funcionado, yo utilizó SqlAnywhere 16, muchos no lo utilizan porque dicen que solo permite conectar la pc donde se hospeda pero he encontrado la forma de poner una base de datos (inclusive en la nube) en red para 32,000 conexiones concurrentes (si alguien lo necesita pongase en contacto conmigo).
Esta seria la forma:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
///////////////////ESTO SERIA AL CONECTARSE AL SERVIDOR
ls_parm = "ConnectString='Driver=SQL AnyWhere 16;ServerName="+ls_servicio+";Host="+ls_host+";UID=DBA;PWD=1q2w3e4R'"
SQLCA.DBMS       = "ODBC"
SQLCA.AutoCommit = False        ///IMPORTANTE: El Autocommit debe estar en False
SQLCA.DBParm 	  = ls_parm
Connect;
 
///////////////////ESTO SERIA EN EL BOTON DE GUARDAR
string ls_query
integer li_factura, li_cliente
decimal{2} ld_importe
date ld_hoy
boolean lb_error = false
 
ld_hoy = today()
ld_importe = dec(sle_importe.text)
li_cliente = integer(sle_cli_clave.text)
li_factura = integer(sle_fac_numero.text)
 
ls_query = "BEGIN TRANSACTION"
EXECUTE IMMEDIATE :ls_query;
if sqlca.sqlcode = -1 then
	messagebox("Error","En el commando EXECUTE IMMEDIATE para BEGIN TRAN~n"+sqlca.sqlerrtext)
	lb_error = true
	goto FIN
end if
 
INSERT factura VALUES(:li_factura, :li_cliente, :ld_hoy, :ld_importe);
if sqlca.sqlcode = -1 then
	messagebox("Error","No se pudo ejecutar la query inserta factura~n~r" + sqlca.sqlerrtext, StopSign!)
	lb_error = true
	goto FIN
end if
 
INSERT factura_det VALUES(:li_factura, 1, :sle_articulo.text, :ld_importe,'sd');
if sqlca.sqlcode = -1 then
	messagebox("Error","No se pudo ejecutar la query inserta detalle factura~n~r" + sqlca.sqlerrtext, StopSign!)
	lb_error = true
	goto FIN
end if
 
UPDATE clientes
	SET cli_saldo = cli_saldo + :ld_importe
	WHERE cli_clave = :li_cliente;
if sqlca.sqlcode = -1 then
	messagebox("Error","No se pudo ejecutar la query actualiza saldo de clientes~n~r" + sqlca.sqlerrtext, StopSign!)
	lb_error = true
	goto FIN
end if
 
FIN:
if lb_error then
	ls_query = "ROLLBACK TRANSACTION"
else
	ls_query = "COMMIT TRANSACTION"
	messagebox("Informacion","Factura grabada exitosamente", Information!)
end if
EXECUTE IMMEDIATE :ls_query USING SQLCA;
if sqlca.sqlcode = -1 then
	messagebox("Error","En el commando EXECUTE IMMEDIATE " + ls_query + "~n~r" + sqlca.sqlerrtext)
end if
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