• Jueves 2 de Mayo de 2024, 20:57

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - Crystalix

Páginas: [1]
1
Visual FoxPro / Problema con select.
« en: Viernes 21 de Noviembre de 2008, 15:02 »
Hola!, bueno , en sí, me da cosa sacar un tema de este calibre viendo lo avanzados con son los demas temas, pero la cuestion es que me trabé y no puedo seguir. Resulta que estoy haciendo un alta de tipos de telefonos. Para ello uso la correspondiente tabla "tipotelefono" que tendrá 2 campos: idtipotel, que nos permitirá identificar cada tipo univocamente (numérico, ancho = 2 -ya que no hay demasiados tipos -) , y tipotel, que sera el que nos indicara que estaremos usando. (caracter , ancho = 10). y un indice kidtipotel , de tipo "principal", ya que la idea es que sea unico cada registro,  y que se correspondera con el campo idtipotel.



 Bien, la cuestion es que cuando incio el formulario, llamo al init, que tendrá el siguiente codigo:
Código: Text
  1. *vamos a cargar la grilla "grdTipoTel" con los datos de la tabla tipotelefono
  2. *mediante una consulta SQL.
  3.  
  4. select tipotelefono.tipotel as Tipo_Telefono, idtipotel;
  5. from tipotelefono;
  6. GROUP BY tipotelefono.idtipotel;
  7. into cursor 'tipotelef'
  8.  
  9.  
  10. thisform.grdTipoTelefono.recordsource = 'tipotelef'
  11. thisform.grdTipoTelefono.columncount = 1
  12. thisform.grdTipoTelefono.refresh
  13.  

 Luego de esto, el usuario querrá hacer un alta, baja o modificación. Cuando hace clic en cualquiera de los tres, el contenedor que entra el entry field, y los botones de "cancelar" y "guardar".se hace visible y permite realizar la accion deseada. Si entro por modificar el entry ya tendra cargado el valor del registro a donde apunta el puntero.

bien, ahora viene la parte donde tengo la duda, al momento de guardar el registro:

Código: Text
  1. *antes de guardar los datos tenemos que asegurarnos de que sean validos.
  2. *--------------------------------------------------------------------------
  3. *                    VALIDACION DE REGISTROS
  4. *--------------------------------------------------------------------------
  5.  
  6.  
  7. *guardamos los datos en mayusculas
  8. palabra = upper(thisform.txtValor.value)
  9.  
  10. *vamos a usar flags, o indicadores logicos que nos ayudaran a determinar si
  11. *el dato ingresado es correcto
  12. local posible
  13. local elerror1
  14. local elerror2
  15. local tipodeerror
  16. *el campo de texto esta vacio?
  17.     if empty(thisform.txtValor.value) then
  18.         posible = .F.
  19.         elerror1 = 'el campo de texto se encuentra vacio'
  20.         tipodeerror = 1
  21.     else
  22.         posible = .T.
  23.     endif
  24.     *si la primera validacion ha pasdo con exito, seguimos con la segunda:
  25.     *¿cabe la posibilidad de duplicado?
  26.     if posible = .T. then
  27.  
  28.         eltipo = upper(alltrim(thisform.txtValor.value))
  29.  
  30.         *para evitar que se encuentre a si mismo
  31.         registroactual = tipotelef.idtipotel
  32.        
  33.  
  34.         select tipotelefono.tipotel, tipotelefono.idtipotel;
  35.         from tipotelefono;
  36.         where alltrim(tipotelefono.tipotel) = eltipo .AND. registroactual <> tipotelefono.idtipotel ;
  37.         into cursor 'test'
  38.        
  39.         *si no es fin, es decir, encontro algo, y si ese algo no es el mismo.
  40.         if  .NOT. eof('test') and .NOT. (test.idtipotel=registroactual) then
  41.             elerror2 = 'ya se encuentra ese registro'
  42.             tipodeerror = 2
  43.             posible = .F.
  44.         endif
  45.     endif
  46.    
  47. if  posible = .F. then
  48.     do case tipodeerror
  49.         case tipodeerror = 1
  50.              messagebox(elerror1, 0 + 64, 'Información')
  51.         case tipodeerror = 2
  52.              messagebox(elerror2, 0 + 48, 'Cuidado!')
  53.     endcase
  54.    
  55.     thisform.activate
  56. endif
  57.  
  58. *si todo esta bien podemos seguir      
  59. if posible = .T. then
  60.  
  61.     *--------------------------------------------------------------------------
  62.     *                       ALTA DE REGISTROS
  63.     *--------------------------------------------------------------------------
  64.  
  65.     if thisform.lalta = .T. then       
  66.         *creamos una variable local idest, la cual incrementará en 1
  67.         *el valor del campo "idtipotel", para evitar la no-unicidad.
  68.         local idest
  69.         *indicamos que lleve el cursor al ultimo registro.
  70.         set deleted off
  71.         select max(tipotelefono.idtipotel) as iddeltipo;
  72.         from tipotelefono;
  73.         into cursor 'iddeltipot'
  74.         set deleted on
  75.         idest = iddeltipo + 1
  76.        
  77.         lapalabra = thisform.txtValor.value
  78.         palabra = upper(alltrim(lapalabra))
  79.         *aca decimos que ingrese los nuevos valores dentro de la tabla
  80.         *(el estado va a ser el valor del txtValor, y el id va a ser
  81.         *el contenido de la variable idest.
  82.         insert into tipotelefono(tipotel,idtipotel) value (palabra, idest)
  83.        
  84.         thisform.activate
  85.  
  86.         *vaciamos la caja de texto para que no muestre el ultimo valor ingresado
  87.         *y volvemos a ocultar el contenedor junto con sus objetos.
  88.         thisform.txtValor.value = ''
  89.         thisform.contenedor.visible = .F.
  90.         thisform.label1.visible = .F.
  91.         thisform.txtValor.visible = .F.
  92.         thisform.cmdGuardar.visible = .F.
  93.         thisform.cmdCancelar.visible = .F.
  94.        
  95.  
  96.     endif
  97.  
  98.     *--------------------------------------------------------------------------
  99.     *                       MODIFICACION DE REGISTROS                        
  100.     *--------------------------------------------------------------------------
  101.  
  102.     if thisform.lmodificacion = .T. then
  103.         *guardamos en mayusculas.
  104.         *valor contendra el valor del campo "tipotel" al momento de actualizar.
  105.         valorTipoTel = upper(thisform.txtValor.value)
  106.         *idetipoactual va a ser el valor que indicara a cual registro modificar.
  107.         idtipoactual = tipotelef.idtipotel
  108.        
  109.        
  110.         *hacemos la actualizacion mediante el comando update
  111.         update tipotelefono;
  112.             set tipotel = valorTipoTel;
  113.                 where idtipotel = idtipoactual
  114.         *actualizamos el grid   
  115.         thisform.activate
  116.        
  117.         *vaciamos la caja de texto para que no muestre el ultimo valor ingresado
  118.         *y volvemos a ocultar el contenedor junto con sus objetos.
  119.         thisform.txtValor.value = ''
  120.         thisform.contenedor.visible = .F.
  121.         thisform.label1.visible = .F.
  122.         thisform.txtValor.visible = .F.
  123.         thisform.cmdGuardar.visible = .F.
  124.         thisform.cmdCancelar.visible = .F.
  125.  
  126.     endif
  127.  
  128. endif
  129.  

   al llamar al activate, hago de nuevo el select para refrescar la grilla:

Código: Text
  1. *actualizamos la grilla con las modificaciones hechas.
  2. select tipotelefono.tipotel as Tipo_Telefono, idtipotel;
  3. from tipotelefono;
  4. GROUP BY tipotelefono.idtipotel;
  5. into cursor 'tipotelef'
  6.  
  7.  
  8. thisform.grdTipoTelefono.recordsource = 'tipotelef'
  9. thisform.grdTipoTelefono.columncount = 1
  10. thisform.grdTipoTelefono.refresh
  11.  
  12. *reinicializamos algunas propiedades del formulario.
  13. thisform.lalta = .F.
  14. thisform.lmodificacion = .F.
  15. thisform.lbaja = .F.
  16.  
  17. thisform.contenedor.visible = .F.
  18. thisform.label1.visible = .F.
  19. thisform.txtValor.visible = .F.
  20. thisform.cmdGuardar.visible = .F.
  21. thisform.cmdCancelar.visible = .F.
  22.  
  23.  

  Por algun motivo que aun no logro comprender, cuando hago el primer alta, no me hace bien la validacion, y en las demas si lo hace. Me gustaria saber como puedo corregir mi error. Pido perdon por mi desprolijidad y mi extenso post, no sabia como explicarlo de otra manera. Agradesco toda ayuda. Saludos!

 Edit: perdon, ya corregi el error, guardaba el registro actual en el alta, y eso solo es valido para modificar, por que el puntero apunta al registro que yo quiero, lo que no pasa en las altas, gracias de todos modos!.

Páginas: [1]