Buscar registro repetido en un cursor con FOXPRO

118 views
Skip to first unread message

Danilo Jonathan Alarcon Villagran

unread,
Dec 9, 2018, 9:44:12 AM12/9/18
to Comunidad de Visual Foxpro en Español
Tengo el siguiente cursor:

CREATE CURSOR oproductos (;
codant c(150),;
marca c(15),;
modelo c(15),;
nroserie c(50),;
codfab c(15),;
nombre c(90))

SELECT oproductos
GOTO TOP

ese cursor lo lleno en una grilla con datos al importar desde excel, 

Lo que necesito, es revisar si en el cursor oproductos  tiene el codant está repetido.

La verdad soy nuevo en esto, pero necesito que la busqueda sea de los mas eficiente posible, ojala no sea necesario usar un ciclo.
desde ya, gracias

Fidel Charny

unread,
Dec 9, 2018, 10:43:52 AM12/9/18
to Comunidad de Visual Foxpro en Español
Lo más fácil es crear un indice UNIQUE sobre el campo Codant. Pero depende de lo completos que estén los restantes campos.
Lo otro es crear otro cursor de igual formato, pero con un índice sobre el campo Codant y lo vas rellenando
Podría ser algo como esto (si eres nuevo en Visual Fox, justifica todos los comandos y funciones que encuentres):
CREATE CURSOR oproductos (;
    codant c
(150),;
    marca c
(15),;
    modelo c
(15),;
    nroserie c
(50),;
    codfab c
(15),;
    nombre c
(90))
   
* Relleanado de oProductos

SELECT oproductos
GOTO TOP

lcCursor
= SYS(2015)
SELECT
* ;
    FROM oproduc
;
    WHERE
.t. ;
    INTO CURSOR
(m.lcCursor) READWRITE
SELECT reproductos
INDEX on codAnt TAG iCodant

SELECT oproductos
SCAN FOR
!EMPTY(codAnt)
   
* Acá puedo validar otros campos
   
* eje
    lDoit
= !EMPTY(marca) and !EMPTY(modelo) and !EMPTY(Nombre)
    IF m
.lDoit
       
        SCATTER TO laRecord
        lcCodant
= TRIM(codant)
        IF
!INDEXSEEK(m.lcCodant,.f.,m.lcCursor,"iCodAnt")
            INSERT INTO reproductos FROM ARRAY laRecord
        ENDIF
    ENDIF
ENDSCAN
SELECT oProductos
ZAP
APPEND FROM DBF
(m.lcCursor)
USE IN SELECT
(m.lcCursor)


syscontri EC

unread,
Dec 9, 2018, 11:36:20 AM12/9/18
to publice...@googlegroups.com


Select codant,count('') as repetidos from oproductos group by codant having count('') >1 into cursor oproductosrep

syscontri EC

unread,
Dec 9, 2018, 12:11:04 PM12/9/18
to publice...@googlegroups.com
Con solo una línea de codigo se puede tener los valores repetidos de un campo.

Select codant,count('') as repetidos from oproductos group by codant having count('') >1 into cursor oproductosrep

Luego con scan... endscan recorres el cursor principal y verás si borras el repetido.

Confirma si te sirve.

William Flores

unread,
Dec 10, 2018, 2:57:55 PM12/10/18
to publice...@googlegroups.com
Hola a todos en el foro, y le agradezco al o los administradores por haberme aceptado. Espero poder ayudar en lo que pueda.

Ahora bien respecto a la pregunta, me parece que lo mas rápido es utilizar una consulta tipo:

Select <Campo>, Count(*) From Tabla
Group by <Campo>
Having by Count(*) > 1

Saludos cordiales,

William Flores

Alexander Marquéz

unread,
Dec 11, 2018, 7:02:11 AM12/11/18
to publice...@googlegroups.com
Hola prueba 
Select codant , count(codant) as veces from oproductos having veces > 1 into cursos repetidos 

If _Tally > 1 
   Wait window “repetidos “ 
Else
    Wait window “no hay  “ 
Endif 


Enviado desde mi iPhone
Reply all
Reply to author
Forward
0 new messages