¿Cómo puedo modificar los registros directamente de mi grid?
Necesito poder habilitar la edición de registros directamente en el grid, (sin usar botones)
Si no se puede pues entonces con un botón.
2 Respuestas
Si los datos están en un dbf y suponiendo que ya tu grid los muestra en tiempo de ejecución, basta con poner la propiedad recordsourcetype=0.
- Compartir respuesta
Creas un grid en el formulario; luego haces clic sobre el mismo con el botón derecho del mouse y escoges la opción "Builder.."; aquí se presentan 2 opciones, si tienes una base de datos abierta veras todas las tablas de la misma y solo debes seleccionar la que necesitas y luego en la lista de campos escoges aquellos que quieras incluir en el grid y eso sería todo. Le das a Ok y solo te dedicas a darle el aspecto que quieras y la posición que desees...
Ahora, si por el contrario, al abrir Builder no tienes ninguna tabla solo hace un clic en el botón marcado como (...) como verás en la imagen inferior y luego escoges la tabla que necesitas y lo mismo que antes seleccionas los campos que quieras incluir en el grid.
Exitos.
Si tienes ya creado el grid puedes usar ésta opción Builder para corregirla.
En cualquier caso podrías crear un nuevo grid para ver la configuración que el propio foxpro hace en los parámetros de cada columna y valores de "Data".
¿Afecta en algo que tenga programado un InteractiveChange en un TextBox?
Lo que quiero es hacer un programa de fácil uso pero funcional, de manera que pueda buscar algún registro en el grid por medio del text box, modificar registros desde el grid, agregar registros, borrar etc.
Gracias por tu tiempo
Depende de lo que haga tu InteractiveChange. Pero a veces es preferible usar en vez de este el parámetro Valid del Textbox ya que InteractiveChange efectuará la acción cada ves que escribas al menos una palabra... pero separemos, una vez que hayas creado tu grid con los datos que se redireccionan directamente hacia la tabla quieres tener aparte un textbox que busque determinados datos, ¿es así?... (supondremos que si).
Ya sabes que en informática siempre hay diferentes maneras de hacer las cosas que deseas, solo es tratar de simplificar... Podrías hacer uso del comando SET FILTER TO para hacer ésto que quieres, veamos:
1. Supondremos que tu tabla se llama "Mitabla" y dentro de ésta tienes un campo de nombre "Campo1" (con datos tipo caracter) que es sobre el cual quieres realizar las busquedas, y el nombre del grid es "grid1".
1a. Primero creas (en el formulario donde tienes el grid) un textbox y en la propiedad "Valid" de éste escribes..
Local cFiltro
cFiltro = lower(alltrim(thisform.text1.value))
cFiltro = ["]+cFiltro+["$lower(campo1)]
set filter to &cFiltro
Thisform. Grid1. Refresh
&& ------------
Aparte creas un botón que diga por ej. "Limpiar" que quitará el filtro.
2. Dentro del método Click del boton limpiar escribes..
Set filter to
Thisform. Grid1. Refresh
Y eso sería todo.
Cuentame si te sirve.
Exitos.
Podrías ser más específico en el comando siguiente, agregando el nombre de la tabla..
cFiltro = ["]+cFiltro+["$lower(Mitabla.campo1)]
Y se pueden poner varios filtros en un solo textbox, para que así pueda buscar por nombre, teléfono, ¿etc?
Y como le hago para que en el grid me aparezca el nombre completo del campo (lo que puse en caption) y no el nombre del campo en si, no se si me explico
Mi campo se llama "contrat" pero necesito que en el grid aparezca como "contratante"
Estaba usando un cursor para el interactive change y el RecordSourceType estaba en sql
Así en el textbox escribía y automáticamente me iba filtrando los registros letra por letra en el grid, eso me gusta porque es practico, pero también deseo poder buscar por varios campos y creo que así como lo estaba haciendo eso no es posible
Al configurar el record source type como tabla ya me muestra los nombres completos de los campos (supongo que es por eso), pero no me busca lo que yo escribo
Por ahora tengo registros sencillos de prueba como pepe y pedro, y aunque escribo en el textbox "pepe" y "pedro" no los separa ni los marca ni nada, no veo ningún cambio
Lo siento si te agarro como maestro pero ya veo que si sabes, o al menos tienes más experiencia que yo jajaja
También si me puedes ayudar en la baja física, ya puedo marcar los registros como baja lógica, pero quiero agregar un botón para eliminar definitivamente pero no me deja pues aparece un mensaje diciendo algo del modo exclusivo, o que la tabla ya esta en uso
Son varias consultas; veré de responder en orden;
1. Si se puede poner varios Filtros en un solo grid, solo que para el usuario se hará muy complicado y debes considerar unos de los principios de programación, que es hacerle las cosas sencillas al usuario en un formato amigable; te muestro una idea de lo que digo en la imagen siguiente..
2. Para cambiar el nombre de las cabeceras de los grid y poner lo que quieras (por ej. en la imagen anterior); haces clic con el botón derecho del mouse y escoges la opción "Editar", luego haces un solo clic sobre el titulo que deseas cambiar y si tienes abierta la lista de propiedades verás que puedes cambiar las propiedades de las cabeceras a tu antojo; ahora si le pones un nombre largo y deseas que se distribuya dentro del tamaño de la celda, pones la propiedad WordWrap en .T.
3. Si usas SQL para mostrar datos en el grid perderás la forma de modificar directamente datos en el grid, ya que el SQL hace copia de los datos a mostrar. Puedes hacerlo si, pero sería más código.
4. Lo de los datos sencillos Pedro y Pepe no entendí bien la consulta.
5. Lo de tomarme por maestro no te preocupes, de hecho me gusta colaborar con quien lo necesita; ya que he estado en tu situación muchas veces en el pasado.
6. Lo de la baja de registros marcados para borrar, sabes que lo puedes hacer con el comando "Pack", sin embargo para que funcione debes abrir la tabla a empaquetar en modo exclusivo, para eso al abrir la tabla debes usar el comando USE; algo así..
USE Mitabla EXCLUSIVE
Ok ya entendí lo de sql, y lo de los nombres de los campos ya quedo.
Ahora solo me falta el botón borrar, pues lo hice con el comando
USE [TABLA] EXCLUSIVE
pack
Thisform.refresh
Pero aun así muestra un mensaje con "file is in use" y desaparece la tabla, solo queda la forma del grid,
Y con lo de pedro y pepe me rfiero a que tengo un registro "pedro" y otro "pepe", si busco "pe" no me filtra nada (supongo que debería de separar todos los registros que empiecen con "pe") y si busco el nombre "pedro" para encontrar el registro "pedro" tampoco pasa nada.
Otra cosa, ¿no sera que tengo que configurar un botón "buscar"? Pues después de poner en el textbox lo que voy a buscar presiono intro y nada, quizá si funciona mi filtro pero no se esta ejecutando
1. Si te dice que el archivo está en uso pues es que lo está, de hecho lo tienes abierto al momento en que abres el formulario.. prueba hacer lo siguiente:
1a. En el evento del formulario "Destroy" que se ejecuta cada vez que cierras el formularios, pon lo siguiente..
Close table all
use [Tabla] exclusive
Pack
Use
&& Con esto cada vez que cierres el formulario empaquetará la tabla sin que te des cuenta.
2. Con el tema del filtro, te he explicado más atras como localizar datos aplicando un filtro.. repasemos; pero antes decirte que para buscar un dato dentro de una cadena se usa el símbolo $, es decir que la expresión de filtro debería ser así (tomando en cuenta tu propio ejemplo): SET FILTER TO "pe" $ lower(Mitabla. Campo1).. Usamos lower para asegurarnos que si el dato introducido está en minúsculas también esté en minúsculas los valores dentro del campo: No modificará los datos de los campos solo le da el aspecto para que exista la integridad referencial.
2a. Bueno te decía que el método de Filtro debes introducirlo dentro del textbox en el método "Valid" y sería así..
1.cFiltro = lower(alltrim(thisform.text1.value)) && el textbox tiene por nombre text1
2.cFiltro = ["]+cFiltro+[" $ lower(Mitabla.campo1)]
3.set filter to &cFiltro
4. Thisform. Grid1. Refresh
Te explico el funcionamiento (por las dudas):
1. Toma el valor del textbox (que se llama text1) lo ajusta con ALLTRIM para eliminar los espacios en blanco que temga y con lower lo convierte a formato en minúsculas -por las dudas que se haya introducido algún valor en mayúsculas-
Por ej: si Introduces PE el valor de cFiltro será pe.
2. Si cFiltro = pe entonces devolverá el siguiente valor aquí en éste código: ej:
cFiltro = "pe" $ lower(Mitabla.campo1)
3. Aquí ejecutamos el Filter que será así: ej.: reemplazamos el valor contenido en &cFilter y será:
SET FILTER TO "pe" $ lower(Mitabla.campo1)
4. El ultimo punto es importante por que se debe actualizar el contenido del grid1. Este debe estar conectado a la base de datos y ser verá afectado por cualquier acción del FILTER.
Esto funciona, lo tengo funcionando así en múltiples aplicaciones y va bien; si no te da avisame y trataremos de dilucidar el por que.
Mi programa sera para un agente de seguros, y como son muchas letras y números para que sea más fácil copiar sin equivocarse, todo va con mayúsculas, pero ya lo adapte gracias a tu explicación del funcionamiento del filtro y el "lower"
Y lo del pack ya quedo gracias
Me surgió una duda, foxpro busca por default en documentos\visualFoxPro, pero yo tengo todo mi proyecto en escritorio\polizas y todas las rutas son de ahí, quiero saber que va a pasar cuando haga mi programa ejecutable, obviamente en mi maquina correrá sin problema, pero cuando lo ponga en otro equipo... las rutas no van a ser las mismas.
Realmente mi conocimiento y experiencia no incluye .EXEs así que si me puedes orientar te lo agradezco
Para que tu sistema busque en otra ruta debes usar el comando:
SET DEFAULT TO C:\Micarpeta
Adicionalmente si usas procedimientos, reportes, formularios y deseas ubicarlos en carpetas individuales puedes hacer uso de:
SET PATH TO Forms, Progs, Menu, Reports
y así..
desde que usas Set default tu ruta de busqueda será la que definas y el set path to buscará desde la ruta de set default en adelante.
Espero te sea de utilidad y por favor no olvides cerrar esta consulta. Éxitos y feliz 2016.
Ok gracias, de hecho aun necesito que me ayudes en 4 cosas.
1°-¿Cómo puedo mandar registros marcados a otra tabla? Es decir, que en mi grid marque un registro, y al salir de ese formulario lo mande a una tabla llamada "archivo muerto"
2°- Tengo un campo "vigencia" tipo fecha, ¿es posible ordenar los registros de mi grid basándose en la fecha del ordenador?, lo que necesito es que se ordenen los registros que están próximos a vencerse ejemplo:
hoy es 01/01/16, (fecha del ordenador)
[registros en el grid como quiero que se ordenen]
04/01/16
10/01/16
01/02/16
20/04/16
3°-¿Se pueden poner filtros aunque el campo sea tipo fecha?, pues para implementar una búsqueda por fecha
4°-jajaajja ¿cómo cierro la consulta?, es que es la primera consulta que hago en todoexpertos.
No se como se cierran las consultas, siempre he estado en el lugar de "respondón", ja ja.. hice 2 preguntas solamente aquí, una me la respondí yo solo y la otra nadia pudo respondérmela.
Por otro lado Rodrigo, puedo ayudarte perfectamente pero tendrías que formularla en una nueva consulta ya que estamos cambiando de tema (de hecho ya lo hicimos una vez con el tema de las rutas) y piensa que si otros llegan aquí buscando respuestas se basan en el título de la consulta. No se si me entiendes. La idea es que las respuestas y preguntas les sirvan a otros en su búsqueda de respuesta.
Fórmula tus dudas en una nueva consulta, estaré atento para respondértela.
- Compartir respuesta