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.

| |||
![]() 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. ![]() |
| ||||
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. |
| |||
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) |
| ||||
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 |
| |||
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. |
| ||||
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... |
| ||||
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. |
| ||||
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. |
| ||||
Cita: 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...
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. |
| ||||
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. |