Programación General > Visual FoxPro

 Problema con select.

(1/1)

Crystalix:
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 ---*vamos a cargar la grilla "grdTipoTel" con los datos de la tabla tipotelefono*mediante una consulta SQL. select tipotelefono.tipotel as Tipo_Telefono, idtipotel;from tipotelefono;GROUP BY tipotelefono.idtipotel;into cursor 'tipotelef'  thisform.grdTipoTelefono.recordsource = 'tipotelef'thisform.grdTipoTelefono.columncount = 1thisform.grdTipoTelefono.refresh 
 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 ---*antes de guardar los datos tenemos que asegurarnos de que sean validos.*--------------------------------------------------------------------------*                    VALIDACION DE REGISTROS*--------------------------------------------------------------------------  *guardamos los datos en mayusculaspalabra = upper(thisform.txtValor.value) *vamos a usar flags, o indicadores logicos que nos ayudaran a determinar si*el dato ingresado es correctolocal posiblelocal elerror1local elerror2local tipodeerror*el campo de texto esta vacio?    if empty(thisform.txtValor.value) then        posible = .F.        elerror1 = 'el campo de texto se encuentra vacio'        tipodeerror = 1    else        posible = .T.    endif    *si la primera validacion ha pasdo con exito, seguimos con la segunda:    *¿cabe la posibilidad de duplicado?    if posible = .T. then         eltipo = upper(alltrim(thisform.txtValor.value))         *para evitar que se encuentre a si mismo        registroactual = tipotelef.idtipotel                 select tipotelefono.tipotel, tipotelefono.idtipotel;        from tipotelefono;        where alltrim(tipotelefono.tipotel) = eltipo .AND. registroactual <> tipotelefono.idtipotel ;        into cursor 'test'                *si no es fin, es decir, encontro algo, y si ese algo no es el mismo.        if  .NOT. eof('test') and .NOT. (test.idtipotel=registroactual) then            elerror2 = 'ya se encuentra ese registro'            tipodeerror = 2            posible = .F.        endif    endif    if  posible = .F. then    do case tipodeerror        case tipodeerror = 1             messagebox(elerror1, 0 + 64, 'Información')        case tipodeerror = 2             messagebox(elerror2, 0 + 48, 'Cuidado!')    endcase        thisform.activateendif *si todo esta bien podemos seguir       if posible = .T. then     *--------------------------------------------------------------------------    *                       ALTA DE REGISTROS    *--------------------------------------------------------------------------     if thisform.lalta = .T. then                *creamos una variable local idest, la cual incrementará en 1         *el valor del campo "idtipotel", para evitar la no-unicidad.        local idest        *indicamos que lleve el cursor al ultimo registro.        set deleted off        select max(tipotelefono.idtipotel) as iddeltipo;        from tipotelefono;        into cursor 'iddeltipot'        set deleted on        idest = iddeltipo + 1                lapalabra = thisform.txtValor.value        palabra = upper(alltrim(lapalabra))        *aca decimos que ingrese los nuevos valores dentro de la tabla        *(el estado va a ser el valor del txtValor, y el id va a ser         *el contenido de la variable idest.        insert into tipotelefono(tipotel,idtipotel) value (palabra, idest)                thisform.activate         *vaciamos la caja de texto para que no muestre el ultimo valor ingresado        *y volvemos a ocultar el contenedor junto con sus objetos.        thisform.txtValor.value = ''        thisform.contenedor.visible = .F.        thisform.label1.visible = .F.        thisform.txtValor.visible = .F.        thisform.cmdGuardar.visible = .F.        thisform.cmdCancelar.visible = .F.             endif     *--------------------------------------------------------------------------    *                       MODIFICACION DE REGISTROS                            *--------------------------------------------------------------------------     if thisform.lmodificacion = .T. then        *guardamos en mayusculas.        *valor contendra el valor del campo "tipotel" al momento de actualizar.        valorTipoTel = upper(thisform.txtValor.value)        *idetipoactual va a ser el valor que indicara a cual registro modificar.        idtipoactual = tipotelef.idtipotel                        *hacemos la actualizacion mediante el comando update        update tipotelefono;            set tipotel = valorTipoTel;                where idtipotel = idtipoactual        *actualizamos el grid           thisform.activate                *vaciamos la caja de texto para que no muestre el ultimo valor ingresado        *y volvemos a ocultar el contenedor junto con sus objetos.        thisform.txtValor.value = ''        thisform.contenedor.visible = .F.        thisform.label1.visible = .F.        thisform.txtValor.visible = .F.        thisform.cmdGuardar.visible = .F.        thisform.cmdCancelar.visible = .F.     endif endif 
   al llamar al activate, hago de nuevo el select para refrescar la grilla:


--- Código: Text ---*actualizamos la grilla con las modificaciones hechas.select tipotelefono.tipotel as Tipo_Telefono, idtipotel;from tipotelefono;GROUP BY tipotelefono.idtipotel;into cursor 'tipotelef'  thisform.grdTipoTelefono.recordsource = 'tipotelef'thisform.grdTipoTelefono.columncount = 1thisform.grdTipoTelefono.refresh *reinicializamos algunas propiedades del formulario.thisform.lalta = .F.thisform.lmodificacion = .F.thisform.lbaja = .F. thisform.contenedor.visible = .F.thisform.label1.visible = .F.thisform.txtValor.visible = .F.thisform.cmdGuardar.visible = .F.thisform.cmdCancelar.visible = .F.  
  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!.

Navegación

[0] Índice de Mensajes

Ir a la versión completa