FoxPro/Visual FoxPro - Eliminar Lineas en Blanca de un GRID en Visual Fox pro

   
Vista:

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Ruben Dario (56 intervenciones) el 07/11/2014 09:59:04
Buenos Días

Necesito eliminar lineas en blanca de una grilla, cuando llego hasta abajo del registro me muestra siempre tres o cuatro lineas en blanco como puedo eliminar

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Mauricio Antonio

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Mauricio Antonio (1367 intervenciones) el 07/11/2014 12:16:27
puede ser que tu fuente de datos tenga datos en blanco, eliminalos y no te saldran las lineas en blanco
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Fidel José (558 intervenciones) el 07/11/2014 13:45:10
El tema es que en el control grid de Visual Fox no hay ninguna propiedad que permita controlar la cantidad de Rows (es diferente la cantidad de columnas que se manejan como un objeto y se definen por ColumCount).
Los rows visibles dependen del Height del control grid que puede definirse como:

LnRows= 12 && deseo mostrar 12 rows
with thisform.grid1
.Height=.HeaderHeight + LnRows * .RowHeight + 2 ;
+IIF(INLIST(.ScrollBars,1,3),17,0)
endwith

Al presentarse el Control Grid, se puede usar algún truco para evitar que, habiendo más registros que rows visibles, no se muestren lineas en blanco. También se puede ajustar el tamaño del grid a la cantidad de registros, hasta un máximo, por ejemplo de 20 filas visibles. De manera que si un cursor tiene 4 registros, muestre solamente 4 rows.

Sin embargo, cuando el usuario se desplace al bottom de la tabla, se verán rows en blanco.

En casos de pocos registros, cuando necesitamos que no aparezcan líneas en blanco, hay que plantearse si no es preferible un control List (con sus limitaciones).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Ruben Dario (56 intervenciones) el 07/11/2014 13:55:43
Buenas Tardes Mauricio

Muchas gracias por tu pronta respuesta

Tengo en la BD 9600 Item y sigue subiendo y con el scrollbar cuando muevo hasta el final de la grid siempre me muestra 3 lineas en blanco y eso lo que quería quitar. ademas hay algo raro que me ocurre como tengo otra grilla donde muestra el detalle, en la grilla uno si muevo hasta abajo del todo (muestra 7 lineas del 1 - 7) y el foco siempre pasa por el 7 y luego va al 1. como podría corregir eso

Muchas gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Ruben Dario (56 intervenciones) el 07/11/2014 13:56:50
Muchas gracias Fidel

Por favor si pudieras ayudarme con lo que le comente a Mauricio te agradecería

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Fidel José (558 intervenciones) el 07/11/2014 15:00:57
No entendí. Tienes dos controles grid en un form?. Uno se relaciona con el otro?. Como lo ligas?.
O no es eso, es otra cosa.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Ruben Dario (56 intervenciones) el 07/11/2014 15:14:47
El grid1 es Cabecera y el Grid2 es detalle

Supongamos que en el grid1 muestra 10 registros, al iniciar el formulario me muestra por el Item 9345- bien cuando llevo hasta abajo con el scrollbar y selecciono el 1 el siempre pasa por el 10 primero. Hay alguna forma de que el foco no pase por el item10

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Fidel José (558 intervenciones) el 07/11/2014 15:21:38
La verdad es que no entiendo bien qué significa este "pasa por el item 10 primero". Qué tienes, un flash? hace alguna cosa rara?
Mientras tanto, deberías ver qué tienes en el AfterRowColChange de ese grid.
Y también ver si tienes puestos algunos Thisform.Refresh o thisform.grid.refresh. Algunos meten refresh por todos lados cuando solo se necesita en algunos pocos casos.

Trata de describir mejor el efecto o situación que comentas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Ruben Dario (56 intervenciones) el 07/11/2014 15:26:48
Imagínate que tienes una grila de 20 registros

Te muestra 5 registros (es decir 20, 19, 18, 17, 16) al iniciar el form, luego tu te desplazas hacia abajo al final del todo y te muestra el (5,4,3,2,1) y al dar el click sobre el item 1 primero el foco cae automaticamente en el 5 y luego pasa al 1

Eso es lo que me esta ocurriendo

Aqui esta mi codigo del Afferter Row

************Se conecta Al servidor a la BD muimpefg************************************************
*- Para conectar MYSQL
SERVERMYSQL = "192.168.2.101"
USUARIO = "root"
CLAVE = "902211218"
BD = "muimpefg"
lcStringCnxLocal = "DRIVER={MySQL ODBC 3.51 Driver};" + ;
"SERVER="+SERVERMYSQL+";" + ;
"UID="+USUARIO+";" + ;
"PWD="+CLAVE+";" + ;
"DATABASE="+BD+";" + ;
"OPTIONS='';"
SQLSETPROP(0,"DispLogin" , 3 )
arte = SQLSTRINGCONNECT(lcStringCnxLocal)
IF arte < 0
AERROR(laErr)
MESSAGEBOX("No se pudo conectar a mySQL. Error: " + CHR(13) + laErr[2])
CLEAR ALL
CLOSE ALL
CANCEL
QUIT
ENDIF
*************************************************************************************************
************Se conecta Al servidor a la BD 2014fg************************************************
*- Para conectar MYSQL
SERVERMYSQL = "192.168.2.101"
USUARIO = "root"
CLAVE = "902211218"
BD = "2014fg"
lcStringCnxLocal = "DRIVER={MySQL ODBC 3.51 Driver};" + ;
"SERVER="+SERVERMYSQL+";" + ;
"UID="+USUARIO+";" + ;
"PWD="+CLAVE+";" + ;
"DATABASE="+BD+";" + ;
"OPTIONS='';"
SQLSETPROP(0,"DispLogin" , 3 )
siex = SQLSTRINGCONNECT(lcStringCnxLocal)
IF siex < 0
AERROR(laErr)
MESSAGEBOX("No se pudo conectar a mySQL. Error: " + CHR(13) + laErr[2])
CLEAR ALL
CLOSE ALL
CANCEL
QUIT
ENDIF
*************************************************************************************************

********Comprueba el valor seleccionado en la grilla*********************************************
valuategrid = EVALUATE(this.Columns(1).Controlsource)

ok=SQLEXEC(conexion, 'select p.Codigo, p.NumLinea, p.ArticuloCodigo2, p.cantidad, p.bultos, p.dto, p.subtotal ;
from pedidolinea p where p.codigo=?valuategrid ', 'consultita2')
IF ok<0
DO perror
endif
SELECT consultita2

******Se crea la consulta para la Tabla articulo y Barras de la BD 2014fg

ok = sqlexec(siex,'select a.codigo, a.nombre, a.unicaja, a.ubicacion, b.barras ;
from articulo a, barras b where a.codigo= b.articulo group by b.articulo','temarticulo')
IF ok<0
DO perror
ENDIF

SELECT temarticulo

************A partir de aqui es para comprobar la Cantidad de Caja*****************
******Se crea la consulta para la Tabla Arteunica de la BD 2014fg
ok = sqlexec(arte,'select articulo, actividad, unicaja ;
from artunica ','temartunico')
IF ok<0
DO perror
ENDIF

SELECT temartunico

*****************Unimos arteunica y barras

SELECT a.articulo, a.actividad, a.unicaja, p.ArticuloCodigo2, p.codigo ;
FROM temartunico a, consultita2 p WHERE p.ArticuloCodigo2 = a.articulo AND p.codigo=?valuategrid AND a.actividad="MI" ORDER BY p.articuloCodigo2 INTO CURSOR temp3
SELECT temp3


******Union de las dos consultas para mostrar en Grilla******************************************

SELECT ROUND(p.Codigo,0) as Codigo, p.NumLinea as Linea, p.ArticuloCodigo2 as Artículo, a.barras as Barras, a.ubicacion as Ubicación, ;
ROUND((p.cantidad/t.unicaja),1) as Bultos, ROUND(p.cantidad,0) as Cantidad, ;
a.nombre as Descripción, p.dto as Descuento, ROUND(p.subtotal,2) as Importe;
FROM temarticulo a, consultita2 p, temp3 t WHERE p.ArticuloCodigo2 = a.codigo AND t.articulo=a.codigo ORDER BY p.numlinea INTO CURSOR temp1


SELECT temp1
GO top

********Carga la grilla***************************************************************************
thisform.pageframe1.page1.Grid2.RecordSource="temp1"



********Calcula los totales***********************************************************************
thisform.calculototales

********Carga los Comentarios***********************************************************************
sqlconsultacomen=("select Codigo, Comentario from pedidocabecera where codigo=?valuategrid order by codigo DESC ")
SQLEXEC(ok, sqlconsultacomen,'comentarios')
SELECT comentarios
thisform.pageframe1.page1.edit1.Value= comentarios.comentario

sqlconsultacomentario=("select Codigo, Comentex from comentarios where codigo=?valuategrid order by codigo DESC ")
SQLEXEC(ok, sqlconsultacomentario,'comentarios2')
SELECT comentarios2
thisform.pageframe1.page1.edit2.Value= comentarios2.comentex

SCATTER memvar
thisform.Refresh

Gracias Fidel, espero poder explicarme mejor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Fidel José (558 intervenciones) el 07/11/2014 15:56:34
Lo primero que tienes que hacer es sacar ese Thisform.Refresh del AfterRowColChange. Te produce un conflicto de actualización.
En general, evita usar Thisform.Refresh (la ayuda y muchos programadores usan eso indiscriminadamente pero no es recomendable para nada).
Cuando necesites un refresh para algún objeto, utiliza el refresh del objeto y no del formulario. En general, solo necesitarás un REfresh para un objeto que esté ligado por ControlSource. Como ese es el caso del control grid (aunque no lo escribas se escribe solo), tal vez necesites un refresh. Pero ahí tendría que ser:

Thisform.Grid2.Refresh && por thisform.pageframe1.page1.Grid2.RecordSource="temp1"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Ruben Dario (56 intervenciones) el 07/11/2014 16:02:36
Thisform.Grid2.Refresh && por thisform.pageframe1.page1.Grid2.RecordSource="temp1"

Si pongo esto no carga el RecordSource se queda vacío la grilla. y he quitado el refresh de abajo del todo y nada sigue pasando por ora linea luego por la linea que selecciono
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Fidel José (558 intervenciones) el 07/11/2014 16:25:38
Perdón Rubén, no copié correctamente.
El refresh para el grid2 es

Thisform.PageFrame1.Page1.Grid2.Refresh

Luego, no sé porqué pones SCATTER MEMVAR. Tal vez tengas algunos objeto ligados a variables. Para esos objetos también debería hacer un refresh.

El tema que queda pendiente, es saber si AfterRowColChange es un buen lugar para hacer todo es trámite.
Para probar, puedes intentar una cosa:
1) Crea un método en el formulario donde pongas el código que ahora tienes en AfterRowColChange (ojo con los cambios de referencia. Ya no estarás en el objeto Grid).
2) En lugar de llamar al método creado desde el InteractiveRowColChange, coloca un botón en el form que llame a ese método.

Con esto puedes evaluar el delay de la consulta.
Lo que puedes hacer para mejorar la respuesta, es colocar las conexiones a las bases de datos en propiedades del form y haces las conexiones en el init del form (arte y siex)
Por lo menos te evitas tener que crear una conexión en cada AfterRowColChange. Para el AfterRowColChange te quedarían solamente los sqlExec()
Yo no trabajo con motores de bases de datos, pero es una cuestión de lógica.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Ruben Dario (56 intervenciones) el 12/11/2014 17:15:24
Hola Fidel

El tema que queda pendiente, es saber si AfterRowColChange es un buen lugar para hacer todo es trámite.
Para probar, puedes intentar una cosa:
1) Crea un método en el formulario donde pongas el código que ahora tienes en AfterRowColChange (ojo con los cambios de referencia. Ya no estarás en el objeto Grid).
2) En lugar de llamar al método creado desde el InteractiveRowColChange, coloca un botón en el form que llame a ese método.


Comentarte que la grilla es muy lento por lo que lleva el AfterRow
No puedo poner un botón y llamar al método, por que, lo que tiene que hacer es que cuando paso por las celdas actualice la grilla de abajo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Fidel José (558 intervenciones) el 13/11/2014 13:22:23
Rubén
Intenta colocando un set coverage to en el AfterRowColChange y ejecuta 1 vez. En el archivo designado te mostrará los tiempos que insume cada instrucción. Y de ahí, solo te queda repensar las consultas.

Alternativa:
Cuando se genera el cursor del grid principal, tal vez se puedan generar también usando el mismo rango que para el principal, uno o más cursores secundarios que luego utilizarías para buscar datos relacionados. Esto se puede plantear de acuerdo a los delay que marque el archivo generado con SET COVERAGE TO. O sea, tratar de resolver anticipando, el punto de mayor demora.

Por decir un ejemplo, si traes facturas entre dos fechas, ver la posibilidad de traer en el mismo momento, los detalles en un cursor secundario. Luego, en el AfterRowColChange del grid principal, en lugar de hacer un select a la base de datos para traer los detalles, haces el mismo select pero sobre el cursor ya generado con los detalles.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Ruben Dario (56 intervenciones) el 14/11/2014 18:05:37
Fidel

Me podrías ayudar con este cogio que esta mal, al poner el where me genera un error no se encuentra el alias detalle

valuategrid = EVALUATE(this.Columns(1).Controlsource)
SET STEP ON
lcArchivoMDB="C:\Debug\Server.accdb" && Mi base de Access .mdb
lcConnStrin="DSN=MS Access Database;Dbq="+lcArchivoMDB+";Uid=;Pwd=;" && Estos datos dependen de la configuración del ODBC
lnNHandle = SQLSTRINGCONNECT(lcConnStrin) && Realizamos la conexión
IF lnNHandle > 0 && Si el resultado no es negativo, la conexión fue exitosa

lcSQL = "select Codigo, Numlinea, CodigoPropio, Barras, Ubicacion, Caja, Cantidad, Descripcion, Dto, Importe from details where codigo= ?valuategrid " && SI LE QUITO EL WHERE FUNCIONA DE MARAVILLA
lcCursor = "detalle"
SQLEXEC(lnNHandle,lcSQL,lcCursor)
SELECT detalle
THISFORM.PAgeframe1.PAge1.GRid2.RecordSource= "detalle"
endif
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Eliminar Lineas en Blanca de un GRID en Visual Fox pro

Publicado por Fidel José (558 intervenciones) el 14/11/2014 21:12:30
Asegúrate que tienes el valor del código buscado en la columna 1 del grid.

valuategrid = EVALUATE(this.Columns(1).Controlsource)
Messagebox( valuategrid ) && te mostrará qué valor tiene la variable que envías al SELECT.

No conozco MySql por lo que no puedo ayudarte mejor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar