Evitar el error 20599 Cannot Open SQL Server de Crystal Reports


Por:Raul Macias

AyudaEn un post anterior explique cuales eran las Dlls que había encontrado para evitar el error 20599 Cannot Open SQL Server de Crystal Reports 8 y 8.5, en este post voy a tratar de un ejemplo para evitar el error.

Los puntos a tratar serán:

  1. Crear el Reporte de Crystal Reports.
  2. Tipos de conexiones en el Active X de Crystal Reports 8.5 desde Visual Basic 6.
  3. Explicación del ejemplo de Visual Basic 6, DemoCrystal.vbp.

Las herramientas que se utilizan para estos ejemplos son Crystal Reports 8.5, Visual Basic 6 SP5, SQL Server 2005.

1.- Crear el Reporte de Crystal Reports.

La forma de crear un reporte de Crystal Reports que se conecte a SQL Server es utilizando la opción nativa, esta conexión se define cuando se va a crear un reporte y comienza a pedir el wizard la forma de conectar el reporte con la base de datos y la cual es More Data Sources/Microsoft Sql Server, como se muestra en la siguiente imagen.

Cuando se selecciona el tipo de conexión, en ese momento pide el Servidor, Usuario,Pasword y Base de Datos, mostrando todas las tablas y los procedimientos almacenados que se encontraron.

Se selecciona la tabla o el procedimiento almacenado con el que se trabajara, para el procedimiento almacenado pide los valores para los parámetros que tiene definidos, en nuestro ejemplo podemos utilizar la tabla catreportedemo o el procedimiento almacenado SP_lee_catreportedemo con la operación cero y el parámetro clave sin ningún valor o vacio.

Una ves puestos los valores a mostrar en crystal reports y verificando que los esta pintando como están en la base de datos, modificaremos el Set Location del reporte, para dejarlo listo y utilizarlo desde Visual Basic, esta modificación del valor sirve para prevenir el error 20599 cuando se esta llamando un reporte con el active X de Crystal Reports en Visual Basic.

Para cambiar el valor es ingresar a el menu DataBase/Set Location…,mostrando la siguiente imagen.

El valor que se tiene que modificar es el location/Table dejando nada mas la tabla o el nombre del procedimiento almacenado(Proc(sp_Lee_CatReporteDemo)), hay que eliminar BasedeDatos.dbo.

Para el procedimiento almacenado seria.

Una ves modificados estos valores guardamos nuestro reporte.

Esto se tiene que hacer para cada procedimiento almacenado o tabla que se tenga en el listado de Databases.

2.-Tipos de conexiones en el Active X de Crystal Reports 8.5 desde Visual Basic 6.

Cuando se esta trabajando en Visual Basic y se quiere abrir un reporte de Crystal que esta ligado a SQL Server ya sea tabla o procedimiento almacenado.

Existen dos formas de abrir la conexión a SQL Server desde Crystal y son:

CrystalReports.Connect = sConexion

Donde sConexion es una variable de tipo cadena y puede ser de cualquier tipo como los que se muestran en el sitio http://www.connectionstrings.com

CrystalReports.LogOnServer “p2ssql.dll”, sServidor, _
sBaseDeDatos, sUsuario, sPSW

En esta segunda opción es utilizar la conexión con la cual creamos nuestro reporte, los parámetros son el DLL,Servidor,Base de Datos, Usuario y Pasword, todos de tipo cadena.

3.-Explicación del ejemplo de Visual Basic 6, DemoCrystal.vbp.

Para nuestro ejemplo utilizamos dos objetos en la Base de Datos una tabla catreportedemo y un procedimiento almacenado sp_Lee_CatReporteDemo el cual tiene dos operaciones, con la operación 0(cero) trae todos los registros de la tabla y con la operación 1(uno) trae los registros con que sean iguales a el parámetro clave.

Tabla
CREATE TABLE catreportedemo (
[clave] [CHAR](10) NOT NULL,
[descripcion] [VARCHAR](150) NOT NULL

)
Procedimiento Almacenado
/*
Ejemplos de como llamar el SP
EXEC sp_Lee_CatReporteDemo 0
GO

EXEC sp_Lee_CatReporteDemo 1,’001′
GO
*/

CREATE PROCEDURE Sp_lee_catreportedemo(
@Operacion INT,
@Clave CHAR(10) = NULL)
AS
/*
Trae todos los registros
*/

IF (@Operacion = 0)
BEGIN
SELECT *
FROM catreportedemo
END
/*
Filtra los registros por Clave
*/

IF (@Operacion = 1)
BEGIN
SELECT *
FROM catreportedemo
WHERE clave = @Clave
END
RETURN 0
GO

El proyecto de Visual Basic tiene la funcionalidad de primero abrir una conexión al servidor de SQL Server y leer todos los valores de la tabla catreportedemo, dando como validada la conexión.

Abrir Conexion Visual Basic

Private Sub cmdTestConexion_Click()
‘Abre y valida los datos de conexion al Servidor,Base de Datos de SQL Server

Dim sql As String
Dim conn As Object
Dim RS As Object
Dim iRegistros As Long‘Limpia los valores de control
bConexionValida = False
ListDatos.Clear
ComboClave.Clear
ComboParametro.Clear

‘Se valida que tenga el nombre del servidor
If Len(txtServidor.Text) > 0 Then

sServidor = txtServidor.Text
Else
MsgBox “Tiene que definir el servidor”, vbExclamation, Me.Caption
txtServidor.SetFocus
Exit Sub

End If
‘Se valida que tenga el nombre de la base de datos
If Len(txtBaseDeDatos.Text) > 0 Then

sBaseDeDatos = txtBaseDeDatos.Text
Else
MsgBox “Tiene que definir la Base de Datos”, vbExclamation, Me.Caption
txtBaseDeDatos.SetFocus
Exit Sub

End If
‘Se valida que tenga el usuario
If Len(txtUsuario.Text) > 0 Then

sUsuario = txtUsuario.Text
Else
MsgBox “Tiene que definir el Usuario”, vbExclamation, Me.Caption
txtUsuario.SetFocus
Exit Sub

End If
‘Se asigna el pasword
sPSW = Trim(txtPsw.Text)

‘Se arma la cadena de conexion a SQL Server

sConexion = _
“Provider=SQLOLEDB.1;Persist Security Info=False;” & _
“User ID= “ & sUsuario & _
“;Initial Catalog=” & sBaseDeDatos & _
“;Data Source=” & sServidor & _
“;Password=” & sPSW & _
“;”

‘Se crean el Objeto de conexion
Set conn = CreateObject(“ADODB.Connection”)
‘Se Crea el Objeto RecordSet
Set RS = CreateObject(“ADODB.Recordset”)

‘Se abre la conexion
conn.open sConexion

‘Query a la tabla CatReporteDemo
sql = “SELECT * FROM CatReporteDemo”
‘Se ejecuta el Query
Set RS = conn.execute(sql)

‘Se valida que regresen datos
If Not RS.EOF Then
Do While Not RS.EOF
ListDatos.AddItem _
RS.Fields.Item(“Clave”).Value & _
RS.Fields.Item(“Descripcion”).Value
ComboClave.AddItem Trim(RS.Fields.Item(“Clave”).Value)

RS.MoveNext
Loop
End If
‘Se cierran los objetos
RS.Close
conn.Close

‘Se Destruyen los objetos
Set conn = Nothing
Set RS = Nothing

‘Si existen datos de retrono se inicialican las variables de control

If ListDatos.ListCount > 0 Then
txtConexion.Text = sConexion
ComboParametro.AddItem “0”

ComboParametro.AddItem “1”
ComboParametro.ListIndex = 0
ComboClave.ListIndex = 0

bConexionValida = True
End If

End Sub

En algunas ocasiones no se abre la conexion al servidor utilizando el objeto ADODB.Connection por lo que se tiene que abrir un ODBC temporal al servidor y a la base de datos de tipo SQL Server.

Utilizando el usuario y el pasword que se esta ingresando en el proyecto de Visual Basic, en la opción de Configuración del cliente, modificar la Biblioteca de Red a TCP/IP.

Seleccionar la Biblioteca de red TCP/IP.

Ya creada la conexión y seleccionada la Base de Datos, probar el origen de datos para validar que la conexión existe.

Este OBDC configuro la conexión para ADODB.Connection utilizando TCP/IP, dado que en algunas ocaciones las máquinas recien instaladas traen la Biblioteca de Red por Canalizaciones por nombre y esto no permite encontrar el Servidor y la Base de Datos, despues de crear el ODBC puede ser borrado ya no sera utilizado.

En este proyecto se utilizan dos reportes RPT_Tabla.rpt el cual esta ligado a la tabla y RPT_SP.rpt el cual esta ligado al procedimiento almacenado.

El proyecto de Visual utiliza dos formas de llamar a estos reportes con diferente tipo de conexión, como las que ya mencione anteriormente.

El código para abrir el reporte de la tabla es el siguiente.

Abrir Reporte con una Tabla

Private Sub cmdReporteTabla_Click()
‘Opcion para ejecutar el reporte que contiene una tabla

‘Se valida la conexion
If Not bConexionValida ThenMsgBox “Conexion no valida”, vbExclamation, Me.Caption
Exit Sub
End If
‘Limpia los parametros del reporte
LimpiaParametrosReporte‘Se lee el reporte que ejecuta un procedimiento almacenado
CrystalReportTabla.ReportFileName = _
App.Path & “\” & “RPT_Tabla.rpt”

‘Se verifica el tipo de conexion para el reporte
If ComboTipoConexion.ListIndex = 0 Then
‘Cadena de conexion
CrystalReportTabla.Connect = sConexion

Else
‘Dll de conexion
CrystalReportTabla.LogOnServer “p2ssql.dll”, sServidor, _

sBaseDeDatos, sUsuario, sPSW

End If

‘Se ejecuta el reporte
CrystalReportTabla.Action = 1

End Sub

El código para abrir el reporte con el procedimiento almacenado es el siguiente.

Abrir Reporte con Procedimiento almacenado

Private Sub cmdReporteSP_Click()
‘Opcion para ejecutar el reporte que contiene un procedimiento almacenado con dos parametros

‘Se valida la conexion
If Not bConexionValida Then
MsgBox “Conexion no valida”, vbExclamation, Me.Caption
Exit Sub
End If‘Limpia los parametros del reporte
LimpiaParametrosReporte
‘Se lee el reporte que ejecuta un procedimiento almacenado
CrystalReportTabla.ReportFileName = _
App.Path & “\” & “RPT_SP.rpt”‘Se verifica el tipo de conexion para el reporte
If ComboTipoConexion.ListIndex = 0 Then
‘Cadena de conexion
CrystalReportTabla.Connect = sConexion
Else
‘Dll de conexion
CrystalReportTabla.LogOnServer “p2ssql.dll”, sServidor, _
sBaseDeDatos, sUsuario, sPSW
End If

‘Se pasan los valores para los parametros @Operacion y @Clave
‘ del procedimiento almacenado del reporte
CrystalReportTabla.ParameterFields(0) = _
“@Operacion;” & ComboParametro.Text & “;TRUE”

CrystalReportTabla.ParameterFields(1) = _
“@Clave;” & ComboClave.Text & “;TRUE”

‘Se ejecuta el reporte
CrystalReportTabla.Action = 1
End Sub

Para cuando se abre el reporte con el procedimiento almacenado se utilizan las propiedades de ParameterFields para pasarle los parámetros que capturemos en la pantalla.

El código de este programa, el script de los objetos y los reportes se encuentran aqui.

Por:Raul Macias

Acerca de

Algunos de los proyectos en los cuales me encuentro trabajando o en los cuales participe.

Tagged with: , , , , , , , , , , , , , , , , , , , , ,
Publicado en Sin Categoria
2 comments on “Evitar el error 20599 Cannot Open SQL Server de Crystal Reports
  1. arturo dice:

    Es un exito el procedimiento, solo falto la parte de que si no se quiere registrar el ocx de cristal solo debe entrar en modo de prueba de fallo y registrarlo

  2. fcueto dice:

    gracias por el aporte me sirvio de mucho, saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

De Flickr
Catrina, Día de Muertos Tlaquepaque

Catrina, Día de Muertos Tlaquepaque

Catrina, Día de Muertos Tlaquepaque

Catrinas, Día de Muertos Tlaquepaque

Catrina, Día de Muertos Tlaquepaque

Más fotos

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevos mensajes por correo.

Únete a otros 65 seguidores

Estadisticas
  • 90,206 hits
A %d blogueros les gusta esto: