skip to main |
skip to sidebar
RSS Feeds
Un blog donde hablar de software, comics, mangas, peliculas, series, tecnología, libros, videojuegos y todo lo que se pase por nuestra procastrinadora cabeza
Un blog donde hablar de software, comics, mangas, peliculas, series, tecnología, libros, videojuegos y todo lo que se pase por nuestra procastrinadora cabeza
10:18
Publicado por Mike_HDF
Para entender el post necesitas: Tener conocimientos de SQL Server, Crystal Reports y Visual Basic 6, así como estar familiarizado con las conexiones vía ODBC.
Parece que, desde la versión 8 ó 9 de Crystal Reports, existe un problema a la hora de cambiar la base de datos a la que queremos conectar cuando lanzamos un informe, ya sea utilizando los módulos RDC o .NET de Crystal Reports. Recuerdo haberle dado muchas vueltas en su día, cuando tuve que programar un administrador de informes con sus filtros y la información de conexión vía ODBC (nombre del DSN, driver, servidor, usuario y contraseña) de modo que fuesen fácilmente configurables. Por aquel entonces cargaba (innecesariamente) los datos en un RecordSet con la sentencia SQL del informe y luego se lo asignaba al objeto CRAXDRT.Report correspondiente. Creía que el método funcionaba correctamente, hasta que tuve que hacer un pequeño lanzador de informes con el runtime de Crystal Reports XI y detectamos que siempre atacaba a la base de datos que fuese declarada en el informe origen. Después de quebraderos de cabeza varios, y hacer muchas tonterías, di con la solución al comprobar la sentencia SQL del informe (que era lo primero que tenía que haber hecho, leches).
Parece que desde la versión 8 en adelante, se les ocurrió la genial idea de dejar guardada la información de la base de datos a la que debía conectar el informe explícitamente en la clausula FROM de la dichosa sentencia SQL. De modo que, hagas lo que hagas con la cadena de conexión del informe, a éste le basta con encontrar el servidor SQL al que estaba enlazado para que deseche la nueva información o, si no la encuentra, seguramente falle sin más.
Por suerte, este problema tiene solución sin tocar la sentencia SQL. Basta con modificar los datos de conexión de las tablas utilizadas en el informe (ya sea alterando la ConnectionString o las ConnectionProperties) y alterar el origen de los datos mediante la propiedad Location de la tabla. A continuación os dejo el código fuente de una función con la que podéis atajar el problema:
Entorno utilizado: Visual Basic 6 SP6 con el runtime de Crystal Reports XI Release 2.
Base de datos: SQL Server 2000. Puede ser útil también para Oracle.
sábado, marzo 01, 2008 9:09:00 p. m.
Un ejemplo mu completo con la funcion y todo y al parecer la solucion no es muy conocida asi q a ver si la gente la encuentra aqui (un paso mas hacia la conquista del mundo) XDDD
lunes, mayo 05, 2008 5:54:00 p. m.
Mi mas sincera felicitación. Un super aporte, te lo digo yo que llevo varios días buscando información y en ningún sitio he encontrado la respuesta hasta que no he entrado en tu página.
Un saludo.
lunes, mayo 05, 2008 6:48:00 p. m.
Gracias por tu comentario, mac, me alegro que te haya sido útil.
¡Saludos!
lunes, julio 14, 2008 8:23:00 p. m.
maravilloso tu ejemplo. ahora si mi consulta en el crystal es el resultado de un store procedure, como funcionaría ??
gracias mil, hay una parte importante que me lo resolviste.
martes, julio 15, 2008 9:04:00 a. m.
Uy, ahí me pillas, nunca he trabajado con procedimientos almacenados en SQL Server; pero intentaré ayudarte. ¿Puedes poner la sentencia SQL que se almacena en el informe que utiliza el procedimiento almacenado? O del RecordSet si primero cargas los datos en uno y luego lo asignas al objeto Crystal.
Saludos.
viernes, octubre 14, 2011 5:14:00 p. m.
Disculpe y para un proyecto o sitio web
es diferente? es que no he podido y no me a funcionado con este codigo.. al cambiar la BD se que da pegada y no cambia
martes, noviembre 06, 2012 8:40:00 p. m.
uhm, para SQL Server, hice lo siguiente, bueno, solo tengo 1 "Tabla" en realidad es un SP que luego recibe parametros. Pero funciona..
Function setReport(rp As String) As CRAXDDRT.Report
Dim crApp As New CRAXDRT.Application
Dim crReport As New CRAXDRT.Report
Set crReport = crApp.OpenReport(rp, 1)
With crReport.Database.Tables(1)
.SetLogOnInfo Conf.bdServidor, Conf.bdBase, Conf.bdUsuario, Conf.bdPass
.Location = Conf.bdBase & ".dbo." & .Location
End With
Set setReport = crReport
End Function
espero que le sirva a alguien, ya que estuve rompiendome la cabeza con este problema y al fin se solucionó.