Como guardar el valor de un combobox en una tabla

1,017 views
Skip to first unread message

Azael Allan Malvaez Monterrubio

unread,
Oct 5, 2012, 12:36:03 PM10/5/12
to publice...@googlegroups.com
Hola comunidad aprovecho la ocacion para enviarles un cordial saludo.
 
Tengo el siguiente problema, tengo un txtNom_pr, un txtDir_pr y un txtEstado_pr al guardalos no tengo problema alguno, pero quisiera que el txtNom_pr sea un combobox (cmbNom_pr) donde haga una consulta con los proyectos que tengo registrados y al escribir en el combo me muestre los resultados y con esto evitar la duplicidad de los proyectos, el problema que al querer guardar lo que escribo en el combo me marca error y no me deja guardarlo, les muestro el codigo que utilizo para los txt y con este no tengo problema alguno, pero quisiera saber que tengo que cambiar pues ya intente todo y no logro mi objetivo, espero puedan ayudarme, desde ya muchas gracias.
 
 
DO CASE
  CASE (LENC(TRIM(thisform.pageframe1.proyecto.txtNom_pr.Value))) = 0
  MESSAGEBOX("FAVOR DE COLOCAR EL PROYECTO",0+48,"ERROR, CONTROL DE ALTAS")
  thisform.pageframe1.proyecto.txtNom_pr.SetFocus
  
 CASE (LENC(TRIM(thisform.pageframe1.prOYECTO.txtDir_pr.Value))) = 0
  MESSAGEBOX("FAVOR DE COLOCAR LA DIRECCION DEL PROYECTO",0+48,"ERROR, CONTROL DE ALTAS")
  thisform.pageframe1.prOYECTO.txtDir_pr.SetFocus
  
 CASE (LENC(TRIM(thisform.pageframe1.proYECTO.txtEstado_pr.Value))) = 0
  MESSAGEBOX("FAVOR DE COLOCAR EL ESTADO",0+48,"ERROR, CONTROL DE ALTAS")
  thisform.pageframe1.proYECTO.txtEstado_pr.SetFocus
  
 OTHERWISE
 
 prNombre = trim(thisform.pageframe1.proyecto.txtNom_pr.value)
 prDireccion= TRIM(thisform.pageframe1.prOYECTO.txtDir_pr.Value)
 prEstado= TRIM(thisform.pageframe1.proYECTO.txtEstado_pr.Value)
 
 INSERT INTO inventarioA!proyecto (nom_pr, dir_pr, estado_pr) ;
  VALUES (prNombre,prDireccion,prEstado)
  
  IF _tally >= 0 THEN
       pMesa = "SE DIO DE ALTA CORRECTAMENTE EL PROYECTO " + prNombre
       MESSAGEBOX(pMesa,0+64,"REGISTRO DADO DE ALTA CORRECTAMENTE")
       *THISFORM.CAncela.Click
      ELSE
       MESSAGEBOX("POR FAVOR VERIFIQUE EL INSERT DEL ALTA",0+48,"ERROR, CONTROL DE ALTAS")      
       
     ENDIF
  
  
ENDCASE
 
 
 
Message has been deleted

Azael Allan Malvaez Monterrubio

unread,
Oct 5, 2012, 1:20:50 PM10/5/12
to publice...@googlegroups.com
ok una disculpa si no me exprese bien.
 
El codigo que puse es para guardar 3 campos en mis tablas, eso ya lo tengo, lo que quisiera es que el primer campo no fuera una caja de texto, quiero que sea un combobox o un listbox (no se con cual se pueda hacer), pero cuando cambio de txt a cmb me marca error y no me deja guardar, lo que pretendo es que al escribir en el combo me vaya mostrando los resultados que tengo almacenados en ese campo para ver si existe o no el registro y de no existir pueda guardar el nombre que escribi en mi tabla.
 
Espero esta vez haberme dado a entender, desde ya muchas gracias
 

Date: Fri, 5 Oct 2012 10:14:32 -0700
From: thenewin...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: Como guardar el valor de un combobox en una tabla

Me mareé con la primera leida y no te capte amigo..

Cuál es el problema ? .. Un poco mas específico..

Saludos!

--
 
 
 
Message has been deleted

FidelJ

unread,
Oct 5, 2012, 2:38:58 PM10/5/12
to publice...@googlegroups.com
Por partes.
1) La consulta de los proyectos registrados la puedes hacer perfectamente desde un TextBox, en el Evento Valid. 
Locate for trim(nom_pr)==alltrim(this.value)    && if !indexseek(alltrim(this.value),.f.,"Proyecto","Etiqueta") 
                                                                  && si hay un índice sobre nom_pr
if found()
   Messagebox("Proyecto ya ingresado")
   this.value=""
   return 0
endif

2) La utilidad del ComboBox, podría consistir, en tu caso, en tener en el combo los proyectos registrados (si no son muchos, digamos, no más de 20 ó 30). 
3) Un ListBox funciona de un modo similar a un ComboBox con la propiedad Style=2. No se pueden introducir directamente nuevos valores. Claro que necesitas más espacio.
4) Para el caso del ComboBox, Style=0, el valor introducido se refleja en la propiedad DisplayValue. 

En resumen,
Utilizamos ComboBox Style=2 ó ListBox cuando queremos obligar al usuario a seleccionar ciertos valores dados.
Podemos utilizar ComboBox Style=0, cuando queremos obligar al usuario a seleccionar entre ciertos valores dados, pero también le queremos dar la posibilidad de agregar nuevos. 

En cambio, resultaría algo tosco utilizar un comboBox para obligar al usuario a no seleccionar. 
Si no hay una lista para selección, se debería utilizar el Textbox, cuestiones de gusto al margen.
Para introducción de valores, evidentemente el TextBox es un control muy flexible. El ComboBox es un tanto duro.
Message has been deleted

Azael Allan Malvaez Monterrubio

unread,
Oct 5, 2012, 3:36:24 PM10/5/12
to publice...@googlegroups.com
Hola Fidel muchas gracias por responder a mi peticion, ahora me queda un poco mas claro y efectivamente busco hacer una consulta para que el usuario verifique si el proyecto que pretende dar de alta ya existe en la tabla, esto con el proposito de no duplicar los proyectos.
 
Ahora bien como puedo hacerlo en el TexBox? en el evento Valid, o bien podrias explicarme el codigo que pusiste, te lo agradeceria infinitamente.
 
Desde ya muchas gracias
 

Date: Fri, 5 Oct 2012 11:38:58 -0700
From: fjch...@gmail.com

To: publice...@googlegroups.com
Subject: [vfp] Re: Como guardar el valor de un combobox en una tabla

--
 
 
 
Message has been deleted

FidelJ

unread,
Oct 5, 2012, 4:32:58 PM10/5/12
to publice...@googlegroups.com
De acuerdo a lo que entiendo, si el valor ingresado en el TextBox del nombre del proyecto ya existe en la tabla Proyectos, no se debe permitir que se agregue (aunque podría dar lugar a una edición ó modificación de los restantes valores: dirección y estado.)
Para saber si el proyecto ya está incluido se ejecuta una búsqueda. 
Alternativas:
1) Busqueda secuencial (tablas no indexadas ó campo de búsqueda no indexado)
Objeto: thisform.pageframe1.proyecto.txtNom_pr
Evento Valid
IF !EMPTY(THIS.VALUE)
       SELECT PROYECTO
      && Se establece una búsqueda exacta en la tabla para lo cual eliminamos blancos inicial y final
       LOCATE FOR ALLTRIM(Nom_pr)==alltrim(this.value)
       IF FOUND()    && El nombre de proyecto ya está en la tabla Proyecto
                Messagebox("Nombre de Proyecto ya grabado")
                THIS.VALUE=""  && Limpia el valor del TextBox
                RETURN 0          && Logra que el cursor vuelva al Textbox para ingresar otro nombre
      ENDIF
ENDIF

2) Búsqueda Indexada
Supone que hay una etiqueta de índice sobre el campo Nom_Pr de la tabla PROYECTO.
Por ejemplo, se hubiera creado   INDEX ON nom_pr TAG iNom_Pr
Objeto: thisform.pageframe1.proyecto.txtNom_pr
Evento Valid
IF !EMPTY(THIS.VALUE)
       IF INDEXSEEK(Alltrim(This.Value),.F.,"PROYECTO","INOM_PR")  
                 && Indexseek() en este caso, no mueve el puntero de la tabla y no necesita estar seleccionada
                 && Si devuelve Verdadero, el proyecto ya fue incluido en la tabla.
                 Messagebox("Nombre de Proyecto ya grabado")
                THIS.VALUE=""  && Limpia el valor del TextBox
                RETURN 0          && Logra que el cursor vuelva al Textbox para ingresar otro nombre
      ENDIF
ENDIF

El evento Valid sucede justo antes del Evento Lostfocus, lo que permite realizar la validación correctamente.
En el evento LostFocus se puede habilitar o no el botón de "Grabar" ó similar donde tenés el código que remitiste.
Por ejemplo
Thisform.PageFrame1.Proyecto.CmdGrabar.Enabled=!empty(this.value)

Sugerencias:
1) LENC() se utiliza para Strings de doble bytes. Si escribimos en castellano, inglés, italiano, etc., esta función equivale a LEN()
2) En lugar de determinar si la cadena tiene tamaño Cero [ if Len(cString)=0 ], te sugiero:
if Empty(cString) ó CASE Empty(cString)

3) Guardar los valores en la Tabla. Puedes ahorrarte el Trim(). Incluso puedes colocar las referencias a los objetos directamente dentro de la cláusula VALUES (Thisform.... )
Esta escritura es igualmente eficiente y mucho más legible (además es más rápida porque hay solo una búsqueda de referencia de objeto).
With Thisform.PageFrame1.Proyecto
    prNombre =.txtNom_pr.value
    prDireccion=.txtDir_pr.Value
    prEstado=.txtEstado_pr.Value
ENDWITH

 
 INSERT INTO inventarioA!proyecto (nom_pr, dir_pr, estado_pr) ;
  VALUES (prNombre,prDireccion,prEstado
Reply all
Reply to author
Forward
0 new messages