Crystal reports

Antes de nada darte las gracias por las molestias que te pueda ocasionar.
Bien, mi caso es el siguiente, estoy realizando un informe con crystal report destinado a ser impreso en una plantilla, para lo cual tengo que determinar las posiciones de los campos según dicha plantilla, bueno, el problema que tengo es que hay un campo que a veces ocupa 2 lineas, si le doy formato a la cadena para que me ocupe 2 lineas, cuando ocupa las 2 lineas (perdona tanta repetición) me arrastra todo el informe una linea hacia abajo entonces me estropea el diseño de plantilla. Lo que yo quería hacer es poner el campo en dos campos de fórmula de esta forma:
campoformula1: {tabla.campo}[1 to 30]
campoformula2: {tabla.campo}[31 to 60]
Si hago esto me parte el campo literalmente, incluso palabras, lo que me seria útil es buscar el ultimo espacio en el campoformula1 y llevar el resto del campo al campoformula2, para que no separe palabras.
Bueno, espero haberme explicado bien, si me falta algo, por favor comunícamelo, [email protected]
Muchísimas gracias, ah! Y enhorabuena, que cantidad de puntos tienes, a ver si me solucionas lo mio y ahí te van por lo menos 100 más,
un cordial saludo
Ana
1

1 Respuesta

33.325 pts.
Para realizar lo que quieres, es necesario hacer 3 campos fórmula. La división del campo en este código es suponiendo que el campo original es de 40 posiciones de longitud y lo vas a dividir en 2 campos de 20 posiciones(máximo) cada uno.
Hay varias formas de hacerlo, pero como no me indicaste la versión de Crystal que estás utilizando, utilicé el código para que pueda funcionar en cualquier versión(De la versión 8 en adelante reconoce sintaxis Visual Basic).
Primero definimos una fórmula llamada "Campo1" con el siguiente código:
stringVar Cadena := ""; //declaramos una variable
numberVar Posicion := InStrRev ({Productos.Descripcion} [1 to 21]," ") - 1; //buscamos el último espacio en la cadena de 21 posiciones. Aqui es importante destacar que si quieres cambiar la longitud de los campos, por ejemplo que fueran de 40 posiciones cambiarias 41 por 21
if len({Productos.Descripcion}) > 20 then //si la longitud total del campo es mayor al primer segmente que vamos a formar, adelante, sino, el primer campo es igual a la totalidad del campo.
if Posicion > 0 then
Cadena := {Productos.Descripcion} [1 to Posicion]
else
Cadena := ""
else
Cadena := {Productos.Descripcion};
Cadena; //asignamos el valor de la variable a la fóruma
Segundo, definimos una fórmula llamada "Posicion" con el siguiente código:
//Obtenemos el número de posición desde el cual habrá de asignarse el segundo segmento.
numberVar Posicion := InStrRev ({Productos.Descripcion} [1 to 21]," ") - 1;
if len({Productos.Descripcion}) > 20 then
if Posicion < 1 then
0
else
Posicion := Posicion + 1
else
Posicion := 0;
Posicion;
Tercero, definimos una fórmula llamada "Campo2" con el siguiente código:
//Asignamos el texto restante para el segundo segmento
if {@Posicion} > 0 then
Mid ({Productos.Descripcion},{@Posicion},20)
Else
"";
Si tienes algún problema con el código no cierres la pregunta y dímelo, también me dices que versión estás utilizando.
Hasta pronto.
Perdona que te moleste de nuevo Marcos, el caso es que no me reconoce la función "InStrRev", la única parecida en la sintaxis es "StdDev",¿sabes si existe otra función equivalente?
Según el "acerca de.." de la ayuda de crystal mi versión es la 4.6, en castellano
Gracias otra vez
Un cordial saludo
Pensé que tenías una versión 6 o mayor. No me acuerdo si la versión que tienes ya contemplaba los ciclos For Next o Do While, por favor dime si los tiene para hacer la búsqueda por medio de ellos.
Muchas gracias por tu ayuda marcos, pero quizá te lo estoy poniendo un poco difícil,¿sabrías dónde puedo conseguir "freeware" alguna version mayor? Muchas gracias de nuevo y te pido disculpa por las molestias que te estoy pudiendo causar
ana
La verdad es que si no tiene ciclos es difícil hacer lo que necesitas ya que no hay como hacer una búsqueda de caracteres.
Debe haber algo. Podrías probar haciendo un campo fórmula con un Do Loop sencillo solo para ver que sucede.
Por ejemplo:
NumberVar Contador;
While Contador < 5 Do
Contador := Contador + 1
;
Y sobre lo que me dices de un Freeware la verdad no conozco ningún sitio de donde puedas bajar la aplicación. Lo que si te recomendaría es que te actualices de ser posible a la versión 8.0 o mayor(8.5) ya que hay muchísima diferencia entre esas versiones y la que tú estás utilizando, te ahorrará mucho trabajo y te dejará hacer mucho más.
Muchas gracias por todo marcos, he conseguido arreglar el problemilla de una forma un poco primitiva pero que funciona, en la base de datos he creado un campo adicional, de forma que en un campo están los primeros 30 caracteres y en el segundo los restantes, al entrar un nuevo registro el usuario escribe en dos campos el texto para el campo y el se encarga de que si el campo ocupa mucho dividirlo en dos. Por lo menos funciona... je je, bueno, pues lo dicho muchísimas gracias y de nuevo te pido disculpas por las molestias, si no te importa te añadiré a favoritos.
Recibe un cordial saludo.
Ana

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas