se infringe la unicidad del indice.. AYUDAAAA

2,825 views
Skip to first unread message

jcarlos

unread,
Mar 17, 2011, 1:02:30 AM3/17/11
to Comunidad de Visual Foxpro en Español
hola buen dia..

tengo un problema queno puedo solucionar por favor ayuda..!

SOY NUEVO EN FOXPRO me sale este error "se infringe la unicidad del
indice idcliente" cuando quiero dar de alta un cliente nuevo..

CODIGO:

select clientes
append blank

replace clientes.idcliente with val(thisform.idclientetxt.value)

replace clientes.nombre with thisform.nombretxt.value
replace clientes.apaterno with thisform.apaternotxt.value
replace clientes.amaterno with thisform.amaternotxt.value
replace clientes.dir with thisform.dirtxt.value
replace clientes.tel with thisform.teltxt.value

thisform.grid1.refresh()

ALGUIEN ME PUEDE SUGERIR UN TUTORIAL DE ABM PORFAVOR..!

GRASIAS

Ricardo Martinez

unread,
Mar 17, 2011, 1:25:49 AM3/17/11
to publice...@googlegroups.com
Hola Yo tambienb soy algo nuevo usando Fox y Append Blank no te sugiero que lo uses.
en este caso te sugiero las sentencias :
INSERT INTO
DELETE FROM
UPDATE..
Veras que es muy sencillo y sobre todo muy practico.
por ejemplo para agregar un nuevo registro seri algo asi :

A = THISFORM.NOMBRETXT.VALUE
B = THISFORM.TELEFONOTXT.VALUE

INSERT INTO CLIENTE (NOMBRE,TELEFONO) VALUES (A,B)

THISFORM.GRID1.REFRESH()

ahh y es gracias...no grasias. digo solo como observacion jejeje.




--
Saludos. Ricardo Mtz

ricardo peña

unread,
Mar 17, 2011, 6:12:41 AM3/17/11
to publice...@googlegroups.com
Hola:
 
Todo parece indicar que estás intentando grabar un id de cliente
que ya está en el archivo.  Si el indice idcliente ya tiene el valor
id que intentas grabar, deja de ser un índice unique.
Es decir, estás grabando un duplicado.
 
Ricardo Luis Peña
Analista de Sistemas
BA - Argentina
 
> Date: Wed, 16 Mar 2011 22:02:30 -0700
> Subject: [vfp] se infringe la unicidad del indice.. AYUDAAAA
> From: jcarl...@gmail.com
> To: publice...@googlegroups.com

Irlandes 1960

unread,
Mar 17, 2011, 10:59:00 AM3/17/11
to publice...@googlegroups.com
NO USES APPEND BLANK
Para añadir un registro nuevo a una tabla, primero verifica que el nro de identificacion sea nuevo.
esto simplemente con algo asi como 
IF SEEK(val(thisform.idclientetxt.value),'clientes',idcliente')
    messagebox('Ese id de cliente ya existe',16,'CLAVE DUPLICADA')
    RETURN
ENDIF
luego si podes hacer el añadido del nuevo registro
sele clientes
insert into clientes (idcliente,nombre, apaterno,amaterno,dir,tel);
value (val(thisform.idclientetxt.value), thisform.nombretxt.value,.....
 
Algo asi por el estilo.
Tenes Variantes usando la propiedad controlsource de los objetos, que te dan la ventaja adicional de que los objetos "copian" ciertos comportamientos de los campos que tienen asociados, como cantidad de caracteres que podes escribir, cantidad de enteros y decimales si son numericos. Yo he usado dos variantes.
 
a) Solo en casos muy simples, directamente de la tabla a actualizar, en ese caso usa el buffering en 5 y solo confirmar la grabacion al final

=

cursorsetprop('buffering',5,lctabla)  && al comienzo

=tableupdate

(1,.t.,lctabla) && al terminar, para descargar los cambios

b) Yo suelo crear una tabla auxiliar similar a la tabla que quiero actualizar, algo asi como en el entorno de datos crear el auxiliar

lctabla = 'C:\TEMPORALES\AUXCLIENTE'

sele clientes.* from clientes into dbf (lctabla) where .f.

append blank

Y todos mis objetos con la propiedad controlsource contra esa tabla auxcliente
Al grabar,
IF SEEK(auxcliente.idcliente,'clientes',idcliente')
    messagebox('Ese id de cliente ya existe',16,'CLAVE DUPLICADA')
    RETURN
ENDIF
sele auxcliente
scatter to lacampos
sele clientes
insert into clientes from array lacampos
 
espero que te sirva. Suerte y larga vida al Zorro
2011/3/17 ricardo peña <rl...@hotmail.com>

IVAN MARTINEZ

unread,
Mar 17, 2011, 11:28:43 AM3/17/11
to publice...@googlegroups.com
Tienes que crear un indice para que no vea los borrados. deleted()
Si se ha borrado un registro el motor lo sigue viendo si no creas es filtro.
 
Ivan Martinez
 


De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de ricardo peña
Enviado el: Jueves, 17 de Marzo de 2011 05:43 a.m.
Para: publice...@googlegroups.com
Asunto: RE: [vfp] se infringe la unicidad del indice.. AYUDAAAA

Marcos Godoy

unread,
Mar 17, 2011, 11:47:09 AM3/17/11
to publice...@googlegroups.com
en realidad el error te da cuando haces el append blank, por la siguiente razon
en el archivo tienes un registro borrado que tiene el id de cliente en blanco
es por esto que cuando haces append blank, el fox te lo rebota, en este caso lo mejor es usar el insert de sql como te indican en algunos comentarios, y además
 
con las instruccion
set deleted off
buscar el registro borrado  y ponerle cualquier id de cliente que nunca se repita
(esto en caso de que sea un archivo que este siendo usado por los usuarios)
si lo puedes abrir en forma exclusiva hazle un pack , esto borrara definitivamente los registros borrados
y un append blank no generara un duplicado
 
saludos

Roberto Olivas

unread,
Mar 17, 2011, 2:35:44 PM3/17/11
to publice...@googlegroups.com
Lo primero que debes de revisar es que el índice que utilizas como llave
primaria esté filtrado. Para ello ve a la casilla filtro y especifica la
expresión Not deleted(). Con esto, todos aquellos registros que estén
marcados para eliminación no formarán parte del índice y evitaras el error.
Por otro lado, debes asegurarte que el identificador que intentas utilizar,
en este caso para el cliente, no haya sido registrado previamente.


-----Mensaje original-----
De: publice...@googlegroups.com
[mailto:publice...@googlegroups.com] En nombre de jcarlos
Enviado el: miércoles, 16 de marzo de 2011 10:03 p.m.
Para: Comunidad de Visual Foxpro en Español
Asunto: [vfp] se infringe la unicidad del indice.. AYUDAAAA

Alan Sanier

unread,
Mar 17, 2011, 11:08:40 AM3/17/11
to publice...@googlegroups.com
Si usas este código deberías sumarle al idcliente una unidad mas para que se diferencia de la que ya está.
 
debería ser así.
 
varcliente = val(thisform.idclientetxt.value) + 1
 replace clientes.idcliente with varcliente

 
replace clientes.nombre with thisform.nombretxt.value
 replace clientes.apaterno with thisform.apaternotxt.value
 replace clientes.amaterno with thisform.amaternotxt.value
 replace clientes.dir with thisform.dirtxt.value
 replace clientes.tel with thisform.teltxt.value
 
thisform.grid1.refresh()
 
Animaciones GRATIS para tu correo electrónico - ¡Por IncrediMail! ¡Haz clic aquí!
faint_grain.jpg
stampa_girl_line_sp.gif

Roberto Olivas

unread,
Mar 17, 2011, 6:15:49 PM3/17/11
to publice...@googlegroups.com

Eso lo resuelves con integridad referencial, de tal manera que si el registro de un cliente tiene registros relacionados en otras tablas el mismo motor de base de datos no te va a permitir eliminarlo. En ese caso el siguiente paso sería aplicar lo que mencionas. Filtrar los índices es buena práctica, pues los hace más compactos al no haber referencia a los registros que no cumplen la condición.

 

 

 

De: publice...@googlegroups.com [mailto:publice...@googlegroups.com] En nombre de Irlandes 1960
Enviado el: jueves, 17 de marzo de 2011 02:40 p.m.
Para: publice...@googlegroups.com
Asunto: Re: [vfp] se infringe la unicidad del indice.. AYUDAAAA

 

Si estas con registros deleteados, antes que filtrar los indices te conviene visibilizar esos registros con el set deleted on/off

y nunca usar el deleted para eliminar un registro, sino condiciones de bajas con campos que sean a su vez indices, ya sea un campo logico o una fecha de baja.

en tus entornos de datos, cuando agregas la tabla al formulario, le indicas la condicion de filtro con empty(baja) para que en el formulario no se vean esos registros marcados como  bajas.

Considera que cualquier registros incorporado en una tabla de configuracion o padron, como es el caso del cliente, puede tener una historia de registros en otras tablas, por ejemplo facturas y recibos, por lo cual no puede ser eliminado fisicamente, sino solo marcado como que esta en desuso.

es más, muchos de mis generadores de informes, en la pantalla de filtros, suelen tener un doble combo de seleccion, con los activos y con los dados de baja, ya que a veces justamente lo que se quiere encontrar es una historia de algo que ya no esta.

Suerte , y larga vida al zorro.

Irlandes 1960

unread,
Mar 17, 2011, 5:40:07 PM3/17/11
to publice...@googlegroups.com
Si estas con registros deleteados, antes que filtrar los indices te conviene visibilizar esos registros con el set deleted on/off
y nunca usar el deleted para eliminar un registro, sino condiciones de bajas con campos que sean a su vez indices, ya sea un campo logico o una fecha de baja.
en tus entornos de datos, cuando agregas la tabla al formulario, le indicas la condicion de filtro con empty(baja) para que en el formulario no se vean esos registros marcados como  bajas.
Considera que cualquier registros incorporado en una tabla de configuracion o padron, como es el caso del cliente, puede tener una historia de registros en otras tablas, por ejemplo facturas y recibos, por lo cual no puede ser eliminado fisicamente, sino solo marcado como que esta en desuso.
es más, muchos de mis generadores de informes, en la pantalla de filtros, suelen tener un doble combo de seleccion, con los activos y con los dados de baja, ya que a veces justamente lo que se quiere encontrar es una historia de algo que ya no esta.
Suerte , y larga vida al zorro.

El 17 de marzo de 2011 15:35, Roberto Olivas <rolivas...@megared.net.mx> escribió:

Jairo Miranda

unread,
Mar 17, 2011, 6:29:45 PM3/17/11
to publice...@googlegroups.com

El desencadénate que da ese error es cuando se define dentro del la tabla una llave de índice primario  o  candidato eso es bueno si se desea controlar que no se entren o creen

Registros con un  campo duplicado

 para que eso no pase define en la tabla un campo ID de tipo integer y Autoincrement  , ese si se puede definir como llave única y permitirá  eu nunca tengas un registro duplicado

 

jairo

juan carlos caballero huerta

unread,
Mar 17, 2011, 8:36:20 PM3/17/11
to publice...@googlegroups.com
GRASSSSSSIAS A TODOS YA SOLUCIONE EL PROBLEMA CON SU VALIOSA AYUDA..

AHORA TENGO OTRO OTRO PROBLEMITA
CON EL SET DEFAULT TO

LO PASA ESQUE GUARDE CADA COSA EN UNA CARPETA (LA BD EN UNA CARPETA,
LAS TABLAS EN OTRA CARPETA, LOS FORM EN OTRA CARPETA.. ETC)
y no reconce la ruta que yo le estoy especificando

ES UN FORM DE ACCESO
este es el codigo del form_load:

set echo off
set talk off
set date to mdy
set default to C:\Archivos de programa\Microsoft Visual
Studio\Vfp98\PVUjed\Bd\tablasPV

public _idusuario,_usuario,_contraseña
_idusuario=space(5)
_usuario=space(20)
_contraseña=space(20)

select usuarios
use usuarios order tag idusuario

y este el de el boton aceptar (ACEPTARBTN):
*verificar informacion

select usuarios
use usuarios order tag idusuario
index on idusuario to idusuario

_idusuario=alltrim(thisform.idusuariotxt.value)
*busca un dato en un campo clave
set order to tag idusuario
seek _idusuario
* funcion para saber si la busque fue exitosa
if found()
use usuarios
_usuario=alltrim(thisform.usuariotxt.value)
seek _usuario
if found()
*verificar clave
_contraseña=alltrim(thisform.contraseñatxt.value)
if alltrim(usuarios.contraseña)=_contraseña
*dejar entrar al sistema
release thisform
else
wait window "clave incorrecta" nowait
endif
*no existe usuario
else
wait window "usuario no existe" nowait
endif
*no existe idusuario

else
wait window "no exite id de usuario" nowait
endif
++++++++++++++++++++++++++++++++++++++++
YASE QUE ESTOY ABUSANDO PERO ME ES MUY DIFICIL ENTENDER SI EL PROFE NO
EXPLICA NADA, AUNQ ESTOY APRENDIENDO MEJOR YO SOLO.


GRACIASS... ESPERO ME AYUDEN

UN TUTO DE ABM EN FOX?????

El 17/03/11, Jairo Miranda <ja...@vidapanama.com> escribió:

> thisform.dirtxt.value replace clientes.tel <http://clientes.tel/> with

IVAN MARTINEZ

unread,
Mar 17, 2011, 9:06:57 PM3/17/11
to publice...@googlegroups.com

Carlos Caballero escribio: GRASSSSSSIAS A TODOS YA SOLUCIONE EL PROBLEMA CON
SU VALIOSA AYUDA..

Carlos que bueno seria que ademas de dar GRACIAAAAsssss nos contaras como lo
solucinaste.????????

Ivan Martinez von Halle

>>>-----Mensaje original-----
>>>De: publice...@googlegroups.com
>>>[mailto:publice...@googlegroups.com] En nombre de juan
>>>carlos caballero huerta
>>>Enviado el: Jueves, 17 de Marzo de 2011 08:06 p.m.

Irlandes 1960

unread,
Mar 17, 2011, 10:01:23 PM3/17/11
to publice...@googlegroups.com
Juan carlos, veo varias inconsistencias en tu codigo.
1)
cuando buscas la tabla pones un selec y luego un use, tanto en el load del formulario como en el click del boton
select USUARIOS
use usuarios ...
 
Si todavia no abriste la tabla, para abrirla deberias poner
select 0
use usuarios....
 
Si la tabla ya esta abierta, alcanza con posicionarse en el area de trabajo que corresponde a la tabla
select usuarios
 
2) Pones por ahi
index on idusuario to idusuario
esto es para crear un indice, no tendria sentido ya que se supone que las tablas ya estan indexadas
La instruccion en todo caso seria
set order to tag idusuario
que de hecho usas mas adelante. Además ¿para que la doble lectura por idusuario y usuario?

Ahora, en lo especifico de tu consulta, me hace mucho ruido que estes usando el set default para posicionar tus tablas.
y mas aún que ese set default haga referencia a tu disco C:
¿Como pensas hacerlo funcionar en un cliente?
si estas usando el DBC deberias en la apertura de la tabla poner algo asi como
use INICIAL!USUARIOS  in 0 shared
 
Ademas, la apertura de archivos deberias apuntar a no hacerla en el Load del formulario, sino en el entorno de datos del formulario, que para eso está. Incluso no tenes que escribir nada, simplemente agregarlo en dicho entorno con boton derecho del mouse, que se encarga automaticamente de abrir las tablas, ya que viene en forma nativa con la propiedad autoopentable = .t.
Incursionar en ese tipo de tecnicas es lo que te permite ganar en productividad con la herramienta.
Suerte, y larga vida al Zorro
Reply all
Reply to author
Forward
0 new messages