De momento he encontrado una solución temporal en dos pasos. Necesito usar dos DataSets, uno creado en código y el otro en diseño.
Necesito el objeto dataset porque el crystal Report no puede acceder al dataset creado en código (que es con el que trabajo en toda la aplicación) y entonces no puedo acceder a la estructura de las tablas y mucho menos a sus campos para crear el diseño.
Bien, el truco está en crear el dataset con la misma estructura de datos con la que trabajas, sin molestarte en rellenarlo tabla a tabla, asignarselo al informe.
Con esto podrás sacar todos los campos sin muchas dificultades y diseñar la estructura del formulario.
A la hora de llamar al informe, solo hay que asignarle el dataset creado en código (que es el que está relleno con todos los datos) al informe.
Supongamos que tenemos el dataset DS con todos los datos, un informe llamado Reporte.rpt y que le hemos establecido como origen de datos el otro dataset.
El código a grandes rasgos sería este:
Dim Informe As ReportDocument
Informe = New Reporte
Informe.SetDataSource(DS)
Me.CrystalReportViewer1.ReportSource = Informe
Ahí está, no hace falta especificar absolutamente ninguna dirección de ninguno de los ficheros del programa, asi que evitamos que nos reviente cuando lo instalemos en el equipo de nuestro cuñao.
Aun así no me termina de convencer este arreglo. Seguro que hay una forma de usar el dataset creado por código y con eso ahorrarse el segundo.
Bueno, de momento dejemoslo así. Ahora solo falta solucionar el extraño fallo que me da si alguno de los campos del formulario recibe un valor nulo.