Power Builder - sqlca en Powerbuilder

 
Vista:

sqlca en Powerbuilder

Publicado por Javier (7 intervenciones) el 05/05/2007 00:03:57
Hola, ¿por qué cuando ejecuto una sentencia sqlca en un IF para que me verifique que se han insertado correctamente los datos funciona perfectamente con una base de datos Access pero no con una MySQL?¿Hay que cambiar algo?

Saludos.
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:sqlca en Powerbuilder

Publicado por Jancarlo (890 intervenciones) el 05/05/2007 00:35:39
Depende como hayas elaborado tu bloque IF ... recuerda q el código de error q te arroja el objeto SQLCA ( sqlca.sqldbcode ) no es siempre el mismo depende de la BD q uses.

Verifica y nos comentas

Saludos!
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

RE:sqlca en Powerbuilder

Publicado por Ricardo (37 intervenciones) el 05/05/2007 02:48:36
Hola podria ser algo como esto (esto es con una BD de access)

///////////////////
String l_nombre_ciudad
Long l_codigo_ciudad

l_codigo_ciudad = 10

SELECT ciudades.nombre_ciudad
INTO :l_nombre_ciudad
FROM ciudades
WHERE ciudades.codigo_ciudad = :l_codigo_ciduad
USING SQLCA;

//Access devuelve 100 si no encontro el dato
IF SQLCA.SQLCode = 100 Then
Messagebox("Adevertencia","No se encontro ciudad")
Else
//Access devuelve 0 si el select encontro el dato, aqui creo existe ua excepcion
//(ver abajo)
IF SQLCA.SQLCode = 0 THEN
Messagebox("Ciudad","La ciudad existe")
Else
Messagebox("Ciudad","Problemas en la base de datos al buscar la ciudad ")
End If
End If

///////////////////

Si el select tiene un funcion agregada como MAX(), MIN(), COUNT (), etc; el
valor que devuelve la variable SQLCA.SQLcode es 0 (cero), por eso alli
se pregunta por el cotenido de la varible del select, en este caso l_cuantos

String l_nombre_ciudad
Long l_codigo_ciudad, l_cuantos

l_codigo_ciudad = 10

SELECT COUNT(*)
INTO :l_cuantos
FROM ciudades
WHERE ciudades.codigo_ciudad = :l_codigo_ciduad
USING SQLCA;

IF l_cuantos > 0 Then
Messagebox("Ciudad","La ciudad existe")
Else
Messagebox("Adevertencia","No se encontro ciudad")
End If

//Me cuentas
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

RE:sqlca en Powerbuilder

Publicado por Javier (7 intervenciones) el 05/05/2007 12:36:19
Este es el código que tengo y que no me funciona:

SELECT COUNT(*)
INTO :ll_num_nombr
FROM usuario
WHERE usuario = :sle_usuario.text
USING LOG;

If ll_num_nombr = 0 THEN
Insert into usuario (usuario,departamento,id_rol,centro)
values (:sle_usuario.text, :sle_departamento.text, :sle_rol.text, :ddlb_centros.text)
using LOG;

If LOG.SqlCode <> 0 then
sql_error = LOG.SqlErrText
RollBack using LOG;
MessageBox('Error','No se ha podido insertar el usuario')
end if
commit using LOG;
close(parent)
else
MessageBox("Atención","El nombre de usuario que está intentando insertar ya existe")
sle_usuario.Text = ""
sle_usuario.SetFocus()
RETURN
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

RE:sqlca en Powerbuilder

Publicado por Javier (7 intervenciones) el 05/05/2007 12:38:08
Este es el código que tengo y que no me funciona:

SELECT COUNT(*)
INTO :ll_num_nombr
FROM usuario
WHERE usuario = :sle_usuario.text
USING SQLCA;

If ll_num_nombr = 0 THEN
Insert into usuario (usuario,departamento,id_rol,centro)
values (:sle_usuario.text, :sle_departamento.text, :sle_rol.text, :ddlb_centros.text)
using SQLCA;

If SQLCA.SqlCode <> 0 then
sql_error = SQLCA.SqlErrText
RollBack using SQLCA;
MessageBox('Error','No se ha podido insertar el usuario')
end if
commit using SQLCA;
close(parent)
else
MessageBox("Atención","El nombre de usuario que está intentando insertar ya existe")
sle_usuario.Text = ""
sle_usuario.SetFocus()
RETURN
end if

Espero que sea suficiente para averiguar el error. El hecho es que este mismo código en Access si que funciona pero no así en MySQL
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

RE:sqlca en Powerbuilder

Publicado por Jancarlo (890 intervenciones) el 05/05/2007 19:43:50
Haz probado usando variables dentro del INSERT INTO en ves de tomar los mismos controles. Carga primero las variables y luego las asignas en el INSERT INTO ... otra cosa, agregale un return luego q muestra el mensaje de error para q ya no ejecute el COMMIT

If SQLCA.SqlCode <> 0 then
sql_error = SQLCA.SqlErrText
RollBack using SQLCA;
MessageBox('Error','No se ha podido insertar el usuario')
return // <-- ESTO AGREGA
end if
commit using SQLCA;
close(parent)
else
.....

Nos comentas.

Saludos!
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

RE:sqlca en Powerbuilder

Publicado por Javier (7 intervenciones) el 08/05/2007 23:39:43
Hola, ya he probado lo que me habeis dicho, pero sigue sin funcionar. ¿Alguna otra idea?

Saludos.
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

RE:sqlca en Powerbuilder

Publicado por RICARDO (2 intervenciones) el 09/05/2007 01:03:25
Hola te pregunto ya has hecho un paso a paso (debugger) y has visto los valor que te te retornan?

Donde es el error especificamente en el count(*); o evaluando el SQLCA del INSERT?
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

RE:sqlca en Powerbuilder

Publicado por Javier (7 intervenciones) el 09/05/2007 01:27:09
Hola, no he hecho un debug, y exactamente no se donde es el error. Creo que no me lee la cadena que escribo en el cuadro de texto. Puedo modificar y eliminar, pero no insertar, aunque en otras tablas inserto sin problema con el mismo codigo, asi que es algo muy extraño.

Saludos.
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

RE:sqlca en Powerbuilder

Publicado por Ricardo (37 intervenciones) el 09/05/2007 02:21:28
Podrias enviarme un sql de modificacion (update) y otro de borrado (delete)
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

RE:sqlca en Powerbuilder

Publicado por Jancarlo (890 intervenciones) el 09/05/2007 06:06:59
Si aun no identificas donde es el error pues entonces sería bueno q realices un debugger a tu código para ubicar la raiz del problema.

Suerte!
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

RE:sqlca en Powerbuilder

Publicado por Javier (7 intervenciones) el 09/05/2007 09:57:42
Bueno aqui os dejo todo el código del script:

string sql_error
LONG ll_num_nombr

If sle_usuario.text = "" or sle_departamento.text = "" or sle_rol.text = "" or ddlb_centros.text = "" then
MessageBox("Atención","Todos los campos deben rellenarse")
return
end if

If is_accion = 'alta' then

SELECT COUNT(*)
INTO :ll_num_nombr
FROM usuario
WHERE usuario = :sle_usuario.text
USING LOG;

If ll_num_nombr = 0 THEN
Insert into usuario (usuario,departamento,id_rol,centro)
values (:sle_usuario.text, :sle_departamento.text, :sle_rol.text, :ddlb_centros.text)
using LOG;

If LOG.SqlCode <> 0 then
sql_error = LOG.SqlErrText
RollBack using LOG;
MessageBox('Error','No se ha podido insertar el usuario')
end if
commit using LOG;
close(parent)
else
MessageBox("Atención","El nombre de usuario que está intentando insertar ya existe")
sle_usuario.Text = ""
sle_usuario.SetFocus()
RETURN
end if

elseif is_accion = 'modificacion' then

update usuario
set usuario = :sle_usuario.text,
departamento = :sle_departamento.text,
id_rol = :sle_rol.text,
centro = :ddlb_centros.text
where id_usuario = :parametro.id_user
using LOG;

If LOG.SqlCode <> 0 then
RollBack using LOG;
MessageBox('Error','No se ha podido modificar el usuario')
end if
commit using LOG;
close(parent)

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

RE:sqlca en Powerbuilder

Publicado por Ricardo (37 intervenciones) el 09/05/2007 21:27:24
Hola, como es la estrucutra de la tabla Usuario, te lo pregunto por que en el insert tienes estos campos :
usuario
departamento
id_rol
centro

pero para el update tienes estos campos:
usuario
departamento
id_rol
centro
id_usuario

Es decir, tienes un campo mas en el Update que es id_usuario (creo que faltaria este en el Insert), dime de que tipo es id_usuario; te comento si es de tipo SERIAL debes incluirlo en el Insert y por defecto (creo!) debes enviarle un cero (0), entonces la instruccion quedaria de la sgte forma:

Insert into usuario
(id_usuario, usuario,departamento,id_rol,centro)
values (0, :sle_usuario.text, :sle_departamento.text, :sle_rol.text, :ddlb_centros.text)
using LOG;

Por favor verifica esto.

Otro punto es que despues del INSERT y antes del IF coloques 2 messagebox
para que te muestre el valor que lleva la variable LOG

//Muestra el codigo de error
MessageBox("Nro. error", String(LOG.SqlCode))
//Muestra el mensaje de error
MessageBox("Msg error", LOG.SqlErrText )

Me cuentas, pero creo estoy casi seguro que en la sentencia del Insert falta un campo.
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

RE:sqlca en Powerbuilder

Publicado por Javier (7 intervenciones) el 11/05/2007 01:49:03
Hola, ya me funciona. El problema era que no ponía el campo id_usuario. En Access no hace falta ponerlo, pero si en MySQL.

Ya puedo seguir con la aplicación.

Muchas gracias y un saludo!!!
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