Necesito una manera eficiente de borrar registros en una tabla creada con el programa Visual Fox Pro

Hola experto, ¿podrías por favor ayudarme? Tengo una tabla que guarda datos de facturación de los clientes y necesito filtrarla para hacer un sorteo con la gente que este al día, es decir necesito verificar que todas las cuotas se hayan pagado, ya que si una no esta al día, el usuario automáticamente queda afuera, el problema es que no encuentro una manera eficiente para borrar los registros, por ejemplo uno de los filtros es por fecha de cobro, si esta vacía, significa que no pago, por lo tanto debo eliminar todos los registros de este usuario(datan desde marzo de 2008, es decir, ¿son muchos registros por cliente) que sentencia puedo utilizar para borrarlos de una manera Rápida y eficiente? Gracias!

1 respuesta

Respuesta
1
Lo que debes usar es SQL, es lo más poderoso y seguro que tienes para no borrar informaciones, haces un filtro y creas una nueva tabla o cursor y con ella trabajas sin alterar información original, por ejemplo.
select cliente,factura,saldo from cuotas where !empty(fechapagado) into cursor losPagados
En ese ejemplo ya tienes un cursor con solamente los datos de aquellos registros que tienen la fecha cargada y no vacía, puedes ponerle más opciones de filtro con AND, el cursor losPagados puedes ahora recorrerlo o sortear directamente.
Justamente con sql estoy intentando pero el problema es que no funciona, le pocngo un select de los que tienen fecha vacia y los pongo en un cursor, luego al original le intento borrar todos los agentes que estan en el primer cursor, entiendes? pero no funciona
esta seria la primera sentencia
SELECT poblacion,abonado,fec_cobro from sinfiltrar WHERE (EMPTY(fec_cobro)) INTO CURSOR sinfiltrar1 READWRITE
para borrarlos esta
DELETE FROM sinfiltrar WHERE (sinfiltrar.poblacion=sinfiltrar1.poblacion) AND (sinfiltrar.abonado=sinfiltrar1.abonado)
y no funciona, luego intenté con esta
select sinfiltrar1
SCAN
ncodigo=abonado
npob=poblacion
DELETE FROM sinfiltrar where (sinfiltrar.abonado=ncodigo) AND (sinfiltrar.poblacion=npob)
SELECT sinfiltrar1
Endscan
Pero demora muchísimo! Tanto que ni se si funciona
la idea es borrar todos los registros del agente que tenga al menos una fecha impaga, los registros datan desde el 2008 y la tabla tiene unos 400000 registros en total, agradecería muchísimo si puedes ayudarme!
Saludos!
no entendi bien, x lo que veo es que quieres borrar los registros del original, si es asi no es necesario el SQL, el sql era para trabajar mas seguro, si es asi por que directamente no borras con la sentencia
delete from xx where empty(fecha)
Y listo, las sentencias de delete que has puesto no funcionan logicamente por que estas relacionando dos tablas diferentes sin recorreras, fijate que la sentencia
where sinfiltrar1.campo=sinfiltrar2.campo
Si no es recorrido sinfiltrar1. Campo siempre el valor comparado sera el primer registro, te borrara todos los registros que cohincidan con el primer registro de la otra tabla, la segunda opción aparentemente esta bien, pero de demorar si lo hará indudablemente, no se si estoy entendiendo
Si intente hacerlo con un bucle do while pero tarda mucho! Lo mismo que el scan! Te explico que necesito, la tabla es referida a facturación por lo tanto contiene datos de los pagos realizados, por cada bimestre hay un registro del abonado, este tiene fecha de pago, si al menos una de estas fechas pertencientes al mismo abonado esta vacía o con fecha de pago>a la fecha de vencimiento del ultimo bimestre en cuestión, es decir si algún abonado pago alguna deuda de cualquier bimestre sea de este año o del anterior después de la fecha del ultimo venc en este caso 17-03 por ejemplo también hay que eliminar todos los registros que existan en la tabla de dicho abonado, y ya me quedé sin ideas porque al ser tantos registros no se como hacer la consulta para que tarde el menos tiempo posible! Por favor si tienes alguna idea te lo agradezco!
A ver si entendí, los registros son por operaciones y no precisamente por cliente, un cliente pudohaber sidobueno en una operación, pero en la siguiente tuvo atrasos, lo que no entendí es por que borrar registros, por que al principio me has hablado de sortear con los que están al día, hacer un sorteo, pues para ello solo debes filtrar los clientesque están al día, no se porque eliminar, si te refieres a eliminar aquellos que no están al día pues para ello esta el filtro sql, filtraremos todos aquellos que estén al día nada más y olvidémonos de los que no están al día con suscuotas, si estoy acertado enviame la estructura de la tabla para hacerte la sintaxis
Si, es así, lo que pasa es que trate de hacer un sql que filtrara por fecha de cobro no vacía seleccionaba todos menos los que estaban con esa condición, es decir, no podía hacer que detecte todos los registros de ese usuario y lo deje afuera del sorteo
el cruce se hace con varias tablas puesto que tienen que cumplir varias condiciones
no van fiscales, ni subsidiados, ni grandes empresas, ni gente que aunque este al día(no deba nada) haya cancelado su deuda después del vencimiento del bimestre al cual se refiere el sorteo, otro dato a tener en cuenta, es que no todos los abonados tienen la misma fecha de vencimiento, estas divididos en grupos por ciclo de facturación, los que entran el primer ciclo tienen fec de vencim=x, los del segundo ciclo fec de vencim=y, etc
los que no van;
Tabla:novan
Campos:obs(a donde pertenecen,c),pob(campo identificacion,n),abo(campo identificacion,n).
la principal:con datos historicos y actuales de facturacion
tabla:datos fact
campos:poblacion(campo identificacion,n),abonado(campo identificacion,n),fec_asocia,fec_vencim,fec_cobro,caja,estado_fac,numero_fac,tipo_fisca,tipo_recib,imp_total,ruta,familia
condiciones: (caja<9998) AND (estado_fac<>90) AND (estado_fac<>99) AND (tipo_recib<=9) AND (familia<>410) AND (familia>400006 OR familia<100000)
otra tabla contiene datos de subsidiados
campos:poblacion(campo identificacion,n),abonado(campo identificacion,n),factor_subvencion
condicion:factor_subvencion=0
Muchas gracias por tu colaboración e interés! Espero tu respuesta, muchísimas gracias!
Son muchas posibilidades, aunque aun así es posible hacer el sql, pero aparte de muchas condiciones and or tendrías necesidad de usar Filtro sobre filtro, pero según tu primer código quehas enviado, por lo que pude observar es que tenias dos alias, sinfiltrar1 y sinfiltrar, has hecho delete from sobre sinfiltrar que creo es la original, si esto es así puedes recurrir a los indices, por que es lento por que mira como funciona.
Se le sinfiltrar1
Scan
Endscan
Supongamos que el filtro tomo 100mil registros del original, Con este codigo estaras recorriendo los 100mil registros de sinfiltrar1, luego adentro tienes
delete from sinfiltrar where .......
con este codigo delete tb estaras recorriendo los 400mil registros de sinfiltrar, entonces, por cada vuelta de los 100mil haces 400mil, eso es mucho, yo creo que si usas indices puedes hacer una busqueda exacta en sinfiltrar y si lo encuentra lo borra cumpliendose la condicion, con ello recorrerias una sola vez en cada vuelta mas la busqueda seek que es muy rapida, eso si solo tienes una ocurrencia en cada vuelta, algo asi
ncodigo=abonado
sele sinfiltrar
seek ncodigo
if found()
            if npoblacion=xx and ...         and ...  &&todas las condiciones
                   delete
            endif
else
  **- Cuando no existe no se hace nada, o se alerta pero eso puede atrazar mucho puedes hacer para tu control algo así
wait wind 'No encontrado ' nowait
endif
Esto debe ser mucho más eficiente, tal vez por ahí esta la solución más rápida, pero yo sigo insistiendo en el SQL, pero necesitaría tus dbf para hacer pruebas, y un manualde los requisitos bien hecho, también va llevarme tiempo responderte.
No, tampoco funciona tarda mucho! Necesito ayuda! ¿Me podrías enviar alguna diré de mail para que te envíe los dbf por favor?, de verdad te agradecería mucho tu ayuda, estoy perdida con esta consulta!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas