Como Imprimir Datos de un Grid Variante

De nuevo Amigo Cristhian.. Mi nuevo problema es el siguiente..
1. Tengo una tabla con 50 campos, el primer campo(carácter) contiene nombres de clientes y los otros 49 campos(numéricos) contienen valores numéricos máximos 3 dígitos y en la tabla tengo un total de 500 registros.
2. En un Formulario tengo 3 comboboxs y un grid tipo 1 y un command "Imprimir"
Ok. Allí va el asunto: a través de los 3 combobox hago un filtrado entre los registros y los campos..
Este Resultado del filtro lo muestro y lo relaciono directamente en un Grid que contiene 5 columnas, en la primera colunmna muestro los nombres del campo clientes. Nombre y en las otras 4 columnas muestro los valores numéricos de solo 4 campos numéricos de los 49 campos numeriocos que tiene en total la tabla.
Osea: La tabla contiene estos campos:cliente. Nombre, cliente. No1, cliente. No2, cliente. No3, cliente. No4, cliente. No5... Etc. Hasta cliente. No49 y a través de los comboboxs el usuario escoge 4 campos entre los 49 que existen en la tabla y esos 4 campos se mostraran en el grid incluyendo el campo nombre.
Ojetivo de la pregunta: tal vez es sencillo pero aquí es donde me quedo "trabado o atorado" es que los datos que muestro en el grid que provienen de diferentes campos según el que se escoja en el combobox, quiero grabarlos en un CURSOR de 5 campos y luego imprimir dicho cursor en informe ya que en el informe no puedo o no quiero poner los 50 campos sino que solo los 5 del cursor y no los 50 de la tabla física.
Espero me pueda ayudar al problema, Gracias nuevamente! Y también estoy para servir!
Respuesta
1
Espero poder ayudarte.
Como sugerencia que no uso filtros del estilo set filter (ya que son extremadamente lentos, salvo el uso de rushmore e inestables si usas variables como filtros), prefiero usar consultas sql directamente.
Entonces, partiendo de ese concepto creo que tu programa es más simple de lo que parece; manos a la obra:
Es importante hacer que el grid tenga nombre y también las columnas. Entonces hagamos que el grid se llame "lista", la primera columna "Nombre" y las otras "campo1", "campo2", "Campo3" y "campo4"
Lo que vamos a hacer es directamente seleccionar solo los 4 campos que queremos, junto al nombre en una consulta sql ya lista y filtrada.
Yo no se como son tus combos pero vamos a suponer que como referencia tienes armado el valor del dato.
En un método que llamaremos "armarLista" vamos a escribir lo siguiente:
with thisform
    with .lista
          .recordSource=''
          .nombre.controlSource=''
          .campo1.controlSource=''
          .campo2.controlSource=''
          .campo3.controlSource=''
          .campo4.controlSource=''
     endwith
     dato1="no"+transf(.combo1.listItemId)
     dato2="no"+transf(.combo2.listItemId)
     dato3="no"+transf(.combo3.listItemId)
     dato4="no"+transf(.combo4.listItemId)
     select nombre, &dato1 as campo1, &dato2 as campo2,;
                              &dato3 as campo3, &dato4 as campo4;
            from clientes into cursor miCursor
     with .lista
           .recordSource="miCursor"
           .nombre.controlSource="miCursor.nombre"
           .campo1.controlSource="miCursor.campo1"
           .campo2.controlSource="miCursor.campo2"
           .campo3.controlSource="miCursor.campo3"
           .campo4.controlSource="miCursor.campo4"
           .refresh
     Endwith
Endiwth
Ahora te explico un poco como funciona este código:
Lo primero que hacemos entre el with lista y el endwith es sacarle la referencia al grid porque sino cuando se genere de nuevo miCursor se pierde la referencia y te da error al armarlo otra vez.
Después, tomamos el valor (listItemId) de cada uno de los 4 combos (suponiendo que el valor 10 corresponde al campo "clientes.no10")
Después, hacemos la consulta tomando el contenido de la variable dato1 y no su valor, es decir, en la variable dato1 tenemos "no10" (supone) entonces con & hacemos que la referencia sea a no10, quedaría algo como select no10.
Al final, armamos de nuevo el grid.
Ahora veamos como hacemos para estar seguros que esto funcione:
En el formulario pones 4 combos (combo1... combo4)
En el init del formulario escribís este código:
with this
      for cnt=1 to 49
              .Combo1.addListItem(transf(cnt), cnt, 1)
              .Combo2.addListItem(transf(cnt), cnt, 1)
              .Combo3.addListItem(transf(cnt), cnt, 1)
              .Combo4.addListItem(transf(cnt), cnt), 1)
       Endfor
Endwith
Con esto hacemos que los combos se rellenen con los valores de 1 a 49 y la propiedad listItemId quede sincronizada.
Para imprimir, simplemente haces un report que trabaje con TODOS los campos (5) del cursor miCursor.
Cada vez que el usuario modifica algún "filtro" vos lo único que haces es llamar al método armaLista por medio de thisform. Armalista()
Nota: En el sql donde se arma el cursor, podes hacer el filtro agregando la clausula WHERE y también ordenar por nombre con la clausula ORDER BY nombre, por ejemplo.
Espero haber sido de utilidad, estoy a tu disposición.. y si no funciona, no te preocupes porque tiene garantía.. ja
Un abrazo
El ultimo endwith de método armalista (en la ultima linea) esta mal escrito, fíjate porque si haces copiar y pegar te va a dar error.
Dice "endiwth" cuando debería ser "endWith"
Nos vemos
Vi tu comentario en el tema de la foto, lastima que este foro tiene algunas contras:
1. No deja rectificar o aclarar las puntuaciones una vez cerrada
2. No deja que demos segundas opiniones de otros expertos.
3. El editor no deja insertar tabs (para estructurar el código)
Por eso te respondo por acá.
¿Sabes por qué siempre muestra la misma foto?
Fox guarda en su archivo de recursos las imágenes para que tarde poco tiempo al imprimir (por ejemplo)
Antes de imprimir tu foto, deberías borrar el recurso de la memoria con:
Clear resource miarchivo.JPG (o entre comillas, no me acuerdo)
Si quieres ser un poco más amplio, no le pongas el nombre del archivo y te borra todos los bmp, jpg, etc. de la memoria.
Clear resource
Nos vemos, y te pido mil disculpas por no haberlo mencionado en la respuesta que te dí al respecto.
Nos vemos
Hola Amigazo Christian!
Bueno con el asunto del "grid variante" pues le contare que casi el 80% de lo que me explico no le entendí... pero todo por la culpa de MI cruel ignorancia en el asunto jajajajaja.. ya que casi no majejo el tema del sql pero bueno.. pero el 20% que logre entender fue mucho más que suficiente para solucionar el problema que tenia.. Increíblemente todo mi problema era simplemente que me faltaba agregar este símbolo (&) a mis commandos!
Por ejemplo basándose en la explicación anterior de los 50 campos: lo que tuve que hacer fue lo siguiente...
Una vez seleccionados los 5/50 campos que se muestran en el grid, almaceno los nombres de los campos en diferentes variables
var1=no+"1"
var2=no+"2"
var3=no+"3"
var4=no+"4"
var5=no+"5"
Dentro de un boton o command
hago lo siguiente:
creo una tabla cursor:
y paso los datos de una tabla fisica a una tabla cursor
WITH THISFORM
     CREATE CURSOR MICURSOR (NOMBRE C(50),CAMPO1 N(3),CAMPO N(3),CAMPO3 N  (3),CAMPO4 N(3))
     SELECT CLIENTES
     GO TOP
     DO WHILE !EOF()
          SELECT MICURSOR
          APPEND BLANK
          REPLACE MICURSOR.NOMBRE WITH CLIENTE.NOMBRE
          REPLACE MICURSOR.CAMPO1 WITH CLIENTE.&VAR1
          REPLACE MICURSOR.CAMPO2 WITH CLIENTE.&VAR2
          REPLACE MICURSOR.CAMPO2 WITH CLIENTE.&VAR3
          REPLACE MICURSOR.CAMPO4 WITH CLIENTE.&VAR4
          SELECT CLIENTES
          SKIP
          LOOP
     ENDDO
         REPORT FORM "X:\X\Reporte.frx" to printer prompt preview
ENDWIT
(Aviso: en el código anterior posibles errores de tabulación)
Bueno algo así es la idea y lo que me soluciono todo el problema fue este símbolo (&) que me ayudo a leer las variables ya que antes asia esto: REPLACE MICURSOR. CAMPO1 WITH CLIENTE. NO+"1" y claro me tiraba error!
Christian! Simplemente ud es un genio! Le doy 5 de 5 y mis más sinceras gratitudes! Que bueno que en el mundo haya personas tan serviciales como ud! Muchas gracias!
Desde la distancia un abrazo amigo! Atentamente. German!
Posdata.. ahora voy a investigar como hacer para mostrar el preview de un informe en un formulario o de ser posible en un control ole o image de un formulario.. pero bueno esa información la buscare por mi cuenta ya que ud ya me sirvió de mucho y me da pena molestar mucho! Pero encaso extremo de NO encontrar lo que busco, lo molestare de nuevo je je ;-)
Ultima cosa.. ¿cierro esta pregunta? ¿O la dejo activa? Ya que creo que me menciono algo sobre la pregunta anterior, sobre que no se podía hacer algunas cosas una ves cerrada.. pero bueno.. esperare su respuesta!
Por cierto.. se me olvidaba algo más jejejeje...
Porque cuando mando a imprimir el reporte solo me sale un registro del cursor "micursor" repetidamente y cuando voy al brow para visualizar los datos si salen correctos..
Me explicare mejor:
Cuando visualizo los registros o datos del cursor con el comando brow aparece así, lo cual es correcto
nombre1 1 2 3 4
nombre2 5 6 7 8
nombre3 9 10 11 12
nombre4 13 14 15 16
Pero al momento de visualizarlo en el reporte o imprimirlo aparece así, repetivo el primer registro o el ultimo..
nombre1 1 2 3 5
nombre1 1 2 3 5
nombre1 1 2 3 5
¿nombre1 1 2 3 5
sera por que en el Data Environment del reporte no tengo agregada ninguna tabla física? ¿Ya qué en el reporte uso una tabla cursor y creo que no se pueden agregar cursores en el Data Environment o si?
Te quería comentar, que por una cuestión de respeto mutuo, yo no respondo para que me des tu "solución alternativa" a mi mala respuesta. Lo que hiciste fue simplemente lo mismo de una manera menos cosmética.
Te sugiero que para tu mayor conocimiento de la herramienta con la que trabajas, basándote en mi respuesta puedas preguntar "por qué" y "para qué" las veces que sean necesarias, pero corregir mis respuestas o dar una solución alternativa sobre ellas me parece que no es necesario, ya que si estas en condiciones de solucionarlo, no haría falta que nosotros colaboremos.
Esto no es una competencia de conocimiento, es un foro de ayuda. Y no es que mi nivel sea mayor que el tuyo ni mucho menos, sino que alguna vez lo he realizado como vos y justamente prefiero lo que te propongo así escribís menos y trabajas mejor.
Con respecto a tu puntuación del tema anterior tampoco creo que sea justo que yo tenga dos puntuaciones por esfuerzo y por conocimiento. Porque yo solo tengo la puntuación por conocimiento o en todo caso por predisposición pero nunca hago un esfuerzo en mis respuestas ya que no intento. Yo no tiro una respuesta y después la empiezo a moldear a ver si te sirve. Si no lo se, o me parece una respuesta traída de los pelos, prefiero no responderla.
Por ultimo, no creo que de mi respuesta que tiene los métodos que necesitas, hayas rescatado solamente un &. Si es así, los dos estamos perdiendo tiempo.
Un abrazo, estoy a tu disposición
Con respecto a tu report que imprime siempre lo mismo te puedo decir que tu do while termina parado en "clientes"
En tu report haces referencia a miCursor en el nombre de los campos, pero estas parado en clientes y como estos dos no están relacionados, el puntero en miCursor nunca se mueve.
Antes del report asegurate que estés parado en miCursor
SELECT MICURSOR
REPORT FORM....
Nos vemos
Un abrazo
Hola Christian.. por alguna razón creo que le han molestado mis preguntas o las interpreto mal y pues me siento muy apenado por ello.. nunca fue mi intención ofender ni molestar a nadie.. y pues yo puse mis comentarios para que tal vez a otros usuarios vieran las soluciones que ud me dio; y como yo pude sololucionarlos con su ayuda..
Y con lo de los 2 puntos de valoración de la pregunta anterior, creo me esta juzgando mal por que yo lo valore en 5! Igual que esta pregunta! O tal vez es que no puedo usar la ventana de valoración.. ya que soy novato en esto...
Realmente mis más sinceras disculpas y más sinceras gratitudes!
Ok. No te preocupes. Por favor cerrá la pregunta y como siempre estoy a tu disposición.
Un abrazo

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas