Foros del Web » Programando para Internet » ASP Clásico »

Comparar Registros

Estas en el tema de Comparar Registros en el foro de ASP Clásico en Foros del Web. hey amigos estoy realizando comparaciones de los registros de una contra la misma tabla, es decir, yo quiero comparar por ejemplo el primer registro de ...
  #1 (permalink)  
Antiguo 12/04/2005, 14:20
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 4 meses
Puntos: 0
Busqueda Comparar Registros

hey amigos estoy realizando comparaciones de los registros de una contra la misma tabla, es decir, yo quiero comparar por ejemplo el primer registro de la bd contra toda la bd para ver si hay alguno igual. pero no me da el resultado deseado. como hago viejos. aqui esta lo que estoy haciendo.

registro=""
rs. movefirst
do while rs.eof =false
if (registro=(rs("Registro"))) then
c=c+1
end if
registro=rs("registro")
rs.movenext
loop
response.write (c)


que estoy haciendo mal.
  #2 (permalink)  
Antiguo 12/04/2005, 14:30
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
mmm.. no te entiendo, pero tal vez haría lo siguiente (igual no sé cual es la finalidad):

SQL = "SELECT id_Registro, Count(Registro) AS CuentaDeRegistrosRepetidos WHERE Count(Registro) > 1 GROUP BY id_Registro"

Si no me confundí al escribirlo, eso debería traerte los ID's de registros que están más de una vez en tu tabla (y la cantidad de veces que se repite)
__________________
...___...
  #3 (permalink)  
Antiguo 12/04/2005, 14:32
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 3 meses
Puntos: 535
(Bueno, pero metele la cláusula FROM por allí que me la olvidé xD)
__________________
...___...
  #4 (permalink)  
Antiguo 12/04/2005, 17:45
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
bueno

Como dice Al Zuwaga hay forma de hacer ese conteo desde la consulta, que de hecho es el mejor metodo, esto de recorrer el rs para el conteo no es buena idea. Pero es util saber como en muchos casos, yo lo he tenido que hacer para varias aplicaciones. Bueno, tu codigo, solo prueba esto:

registro=""
rs.movefirst

registro= rs("Registro") 'Aqui asignas el valor del primer registro a la variable
'y siempre usas este valor paar compararlo con todo
'el rs

rs.movenext 'Lo llevas 1 espacio adelante, porque no quieres que encuentre
'que el primer registro es igual al primero jejejeje

c = 0
do while not rs.eof

if registro = rs("Registro") then
c=c+1
end if

rs.movenext

loop

response.write (c)

Prueba con eso, claro despues tienes que pensar en validaciones como, por ejemplo, si la consulta no te trajo resultados, si solamente te trajo 1 resultado, etc, pero eso.. solamente con pruebas

Pruebalo y nos dices que paso..

Bay.
  #5 (permalink)  
Antiguo 13/04/2005, 08:13
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 4 meses
Puntos: 0
yo hice mas o menos lo mismo aqui va

Set Con = Server.CreateObject("ADODB.Connection")
Con.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & SERVER.MApPath("BD\Estadisticas.mdb"))
set rr = CreateObject("ADODB.Recordset")
set rs = CreateObject("ADODB.Recordset")
rs.Open "Estadisticas_Ind", con,1
rr.Open "Estadisticas_Ind", con,1
rs.movefirst
rr.moveNext
do while rr.eof=false and rs.eof=false
if (rr("IP")<>rs("IP"))then
contador=contador+1
response.write (rs("IP"))
end if
rr.movenext
if (rr.eof=true) then
rs.movenext
rr.movefirst
end if
loop
response.write (contador)
  #6 (permalink)  
Antiguo 13/04/2005, 08:44
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 4 meses
Puntos: 0
yo lo acomode pero se me queda como guindada la pagina, le di mas tiempo de respuesta con server.scriptout pero nada se queda demaciado
  #7 (permalink)  
Antiguo 13/04/2005, 09:12
Avatar de pablinweb  
Fecha de Ingreso: julio-2003
Mensajes: 283
Antigüedad: 20 años, 10 meses
Puntos: 0
Podrías probar algo así:

Código:
Set Con = Server.CreateObject("ADODB.Connection")
Con.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & SERVER.MApPath("BD\Estadisticas.mdb"))
set rr = CreateObject("ADODB.Recordset")
set rs = CreateObject("ADODB.Recordset")
rr.Open "Estadisticas_Ind", con,1

do while not rr.eof
      rs.Open "Select Count(*) as CANTIDAD FROM Estadisticas_Ind where CAMPO_1 = " & rr("CAMPO_1") & " and CAMPO_2 = " & rr("CAMPO_2") & " and ....", con,1

      if rs("CANTIDAD") > 1 then
           response.write (rr("CAMPO_1") & ":" & rs("CANTIDAD"))
      end if
      rs.close
      rr.movenext
loop
  #8 (permalink)  
Antiguo 13/04/2005, 09:36
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 4 meses
Puntos: 0
Los datos que tiene esa BD vienen de este archivo y estoy tratando de comparar linea por linea pero al igual que la bd tengo que adelantar una linea para comparar la con la atenrior pero no se como adelantar dicha linea.

aqui va el codigo


contador=0
A=""
B=""
C=""
CC=""
Set Con = Server.CreateObject("ADODB.Connection")
Con.Open("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & SERVER.MApPath("BD\Estadisticas.mdb"))
set rs = CreateObject("ADODB.Recordset")
rs.Open "Estadisticas_Ind", con,1,2
rs.movefirst
Set FSO = Server.CreateObject("Scripting.FileSystemObject")
path = ""
path = Request.QueryString("path")
If FSO.FileExists (Server.MapPath(path & "logs/ex050410.log")) Then
Set ts = Nothing
Set ts = FSO.OpenTextFile (Server.MapPath(path & "logs/ex050410.log"))
Do While not TS.AtendOfStream
strLine = TS.ReadLine
A=mid(strLine,1,10)
B=mid(strLine,12,8)
C=mid(strLine,21,15)
rs.addnew
rs("fecha")=A
rs("Hora")=B
rs("IP")=C
rs.update
rs.movenext
loop
end if


gracias de verdad que si.
  #9 (permalink)  
Antiguo 13/04/2005, 10:15
Avatar de pablinweb  
Fecha de Ingreso: julio-2003
Mensajes: 283
Antigüedad: 20 años, 10 meses
Puntos: 0
Se supone que cuando usas ReadLine lee hasta el primer caracter de la linea siguiente sin incluirlo y en el proximo ReadLine continua desde el último anterior por lo que no necesitas adelantar con alguna instrucción. La verdad que con lo último que escribiste ya no sé que es lo que necesitas, si leer un archivo o comparar los registros de una tabla con la misma tabla y tampoco sé que error te dá uno u otro...
  #10 (permalink)  
Antiguo 13/04/2005, 10:24
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 4 meses
Puntos: 0
lo que pasa es que estoy es filtrando datos pero no hallo la manera si por la lectura del archivo o ya incluidos los datos en la BD.
  #11 (permalink)  
Antiguo 13/04/2005, 13:03
Avatar de pablinweb  
Fecha de Ingreso: julio-2003
Mensajes: 283
Antigüedad: 20 años, 10 meses
Puntos: 0
Lo mejor sería que los valides antes de ingresarlos, es decir, podrias leer una linea del archivo y consultar a la bd a ver si ya existe, de no existir la agregas y continuas y si existe pasas a la siguiente sin ingresarla.
  #12 (permalink)  
Antiguo 13/04/2005, 13:08
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Hola!

Lo que dice pablinweb es cierto, eso es lo mejor, sin embargo tu metodo actual es bueno, algo como:

1. Cosulto toda mi base de datos.

2. Leo el archivo, y miro linea por linea si ya existe en mi base de datos.

3. Si no existe, inserto.

4. Si existe no inserto.

La ventaja en esto, es que hiciste 1 sola consulta al database para consultar, de la forma que dice pablinweb, haces una consulta en cada comparacion.

Bueno, eso seria el metodo principal, ahora a eso debes sumarle, que si el archivo tiene datos repetidos ??? entonces que vas a hacer.

Te falta eso nada mas.
  #13 (permalink)  
Antiguo 13/04/2005, 13:38
Avatar de pablinweb  
Fecha de Ingreso: julio-2003
Mensajes: 283
Antigüedad: 20 años, 10 meses
Puntos: 0
Cita:
Iniciado por Neuron_376
ahora a eso debes sumarle, que si el archivo tiene datos repetidos ??? entonces que vas a hacer.

Te falta eso nada mas.
Por eso creo que es mejor consultar antes de ingresar el registro, si está repetido quiere decir que ya lo ingresé y la consultá me debolverá que el registro existe tonce no lo ingreso...
  #14 (permalink)  
Antiguo 13/04/2005, 13:50
Avatar de Neuron_376  
Fecha de Ingreso: abril-2005
Mensajes: 1.051
Antigüedad: 19 años, 2 meses
Puntos: 2
Cierto!!

Eso tienes razon, pero imgagina, tendrias un de este tipo, por ejemplo:

whie not file.eof

select --- EXISTE DATO // 1 llamada al database.

if DATO_NO_EXISTE
insertar // 2 llamadas al database.

end

Esto te da un total de accesos al database = LARGO_ARCHIVO + N_INSERTS

Entonces esto representa carga muy pesada al database, ademas, despues de cada insert la consulta es un pocquititito mas pesada que la anterior, porque tiene mas registros, ademas no puede usar los datos en el cache del database porque las tablas fueron modificadas y este cache se refrescara, lo que se puede hacer es algo como.

1. Cargar en un arreglo temporal los datos UNICOS del archivo de texto.
2. Consultar los datos de la base de datos.

3. While que compara el arreglo del archivo contra la base de datos y hacer los inserts cuando sea necesario.

Aun ahi, entre 2 y 3, podria vaciar el resultados de la consulta a un arreglo, asi no esta manteniendo ese Recordset por mucho tiempo, el cual representa tener un acceso a la base de datos abierto por tiempo indefinido, pero no creo que sea ya necesario tanto ahorro, dependiendo de la aplicacacion que le estes usando..

El metodo que dices es el mas directo y seguro a la vez, porque si varios estan haciendo lo mismo sobre la base de datos entonces habra problemas, lo siguiente es que puede crear UNIQUE INDEX sobre los campos que quiere que sean unicos en la base de datos, entonces al momento de hacer el insert, lo que va a pasar es que arroja un error de que ese dato ya existe en el database, entonces, como tu estas preparado para ese error, entonces lo ignoras y sigues adelante, seria algo como.

1. Te aseguras de tener un UNIQUE INDEX sobre el campo que sabes que nunca sera repetido.

2. En el ASP

2.1 Cargas en un arreglo los datos UNICOS que deseas insertar.
2.2 on error resume next 'Dice que ignorara los errores que se produzcan
2.3 while para insertar en la tabla el arreglo unico de datos.
2.3.1 Si hay error de que estaba repetido, etonces lo ignoras, no problem

Pero este segundo metodo te va a regresar tal vez muchos errores, porque encuentras muchos datos repetidos, pero bien, es otro metodo valido.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:10.