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
Ir a la versión completa