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

error en rs.movelast

Estas en el tema de error en rs.movelast en el foro de ASP Clásico en Foros del Web. Hola tengo 2 tablas en una base de datos de sql: TABLA1 TABLA2 id_libro id_libro PK id_cajon nombre_libro Si inserto en TABLA2 un nombre_libro, el ...
  #1 (permalink)  
Antiguo 05/06/2007, 16:01
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 22 años, 7 meses
Puntos: 0
error en rs.movelast

Hola tengo 2 tablas en una base de datos de sql:

TABLA1 TABLA2
id_libro id_libro PK
id_cajon nombre_libro

Si inserto en TABLA2 un nombre_libro, el id_libro es autonumerico. ¿Como puedo coger mediante un recodset o variable ese id_libro que se haya generado en ese insert para después en otro insert añadirlo en Tabla1?

He probado a que no sea autonumerico e ir metiendolo cada vez desde un formulario haciendo esto (aunque preferiria que sea autonumerico):

Cita:
sql3="SELECT id_libro FROM TABLA2"
set rs3 = Conn.Execute(sql3)
rs3.movelast
Pero me da este error:

Número de argumentos erróneo o asignación de propiedad no válida: 'eof'
  #2 (permalink)  
Antiguo 05/06/2007, 23:48
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 17 años, 3 meses
Puntos: 88
Re: error en rs.movelast

cuando grabes
lo que uso en access...

entonces al realizar la rutina de insercion

Código PHP:
RS.open sSQLoCxn33
if Err=0 then
if RS.EOF=TRUE then
RS
.addnew
...........
RS.updatebatch
rn
=int(rs.Fields.Item("index").value)
response.write "index: "&rn
end 
if
end if
rs.close 
basicamente antes de que cierres el RS, puedes tomar el valor del campo

espero te ayude
suerte
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #3 (permalink)  
Antiguo 06/06/2007, 01:17
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 22 años, 7 meses
Puntos: 0
Re: error en rs.movelast

No me funciona lo que me dices. Mira yo inserto asi el campo en TABLA2:

Cita:
set rs = Conn.Execute ("insert into [tabla2] (nombre_libro) values ('"&Request.Form("nombre_libro")&"')")
Automaticamente quiero que al ser autonumerico en sql server me asigna un valor a campo1 PK.

Pues este valor que me ha asignado quiero que al mismo tiempo despues de esta consulta, haga otra para insertar ese numero en otra tabla, no se si me explico bien
  #4 (permalink)  
Antiguo 06/06/2007, 02:10
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 18 años, 5 meses
Puntos: 7
Re: error en rs.movelast

Gdeneralmente casi todas los motores de BD transaccionales tienen una funcion para eso: lastInsertId o parecido. Access no dispone de tan preciada herramienta. Pero puedes comprobar cual fue el ultimo dato de un determinado campo numérico usando la función MAX:

cnn.execute("INSERT INTO tabla1 VALUES ('', 'Nombre del libro')")
rs = conn.execute("SELECT MAX(id_libro) AS ultNumInsertado FROM tabla1")

luego no tienes mas que asignar el valor

cnn.execute("INSERT INTO tabla2 VALUES ('', " & rs("ultNumInsertado") & ",'talytal')")




Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #5 (permalink)  
Antiguo 06/06/2007, 03:41
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 22 años, 7 meses
Puntos: 0
Re: error en rs.movelast

¿Podrias aclararme esta consulta?

selecciono el número máximo de id_libro... AS ultNumInsertado (esto quiero entender)

cnn.execute("INSERT INTO tabla2 VALUES ('', " & rs("ultNumInsertado") & ",'talytal')")

No encontre nada de lastInsertId para sqlserver

Laika
  #6 (permalink)  
Antiguo 06/06/2007, 04:40
 
Fecha de Ingreso: enero-2006
Ubicación: Torroles (Costa der Só)
Mensajes: 1.017
Antigüedad: 18 años, 5 meses
Puntos: 7
Re: error en rs.movelast

MSSQL dispone de scope_identity(), ident_current() y de @@identity pero seguramente el que te interesa es la función scope_identity()

Y

SELECT MAX(id_libro) AS ultNumInsertado FROM tabla1

Significa : Selecciona el número máximo (más alto) del campo id_libro de la tabla tabla1 y llamame al resultado ultNumInsertado

devuelve un recordset con un solo campo y un solo registro. A esa celdilla la llamamos ultNumInsertado.

luego puedes hacer lo que se hace con cualquier recordset :)


Un saludo
__________________
"Tus pecados son el estiércol sobre el que florecerán las flores de tus virtudes" - Gerald Messadié -
  #7 (permalink)  
Antiguo 06/06/2007, 09:13
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 22 años, 7 meses
Puntos: 0
Re: error en rs.movelast

Ok con la función MAX correcto.

Llevo un buen rato buscando y probando y no consigo usar la función SCOPE_IDENTITY().

Cita:
set rs = Conn.Execute ("insert into [TABLA1] (nombre) values ('prueba'); SELECT @Identity = SCOPE_IDENTITY()")
Lo que quiero es que me muestre en pantalla el id_nombre que me haya generado al hacer el insert

Gracias
  #8 (permalink)  
Antiguo 06/06/2007, 09:21
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: error en rs.movelast

Cita:
Lo que quiero es que me muestre en pantalla el id_nombre que me haya generado al hacer el insert
Código:
strSQL = "Set Nocount on "
strSQL = strSQL + "insert into TABLA1 (nombre) values ('prueba')"
strSQL = strSQL + " select IdentityInsert=@@identity"
strSQL = strSQL + " set nocount off"
objRS.Open strSQL, objConn
objRS("IdentityInsert")
Saludos
  #9 (permalink)  
Antiguo 06/06/2007, 09:36
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 22 años, 7 meses
Puntos: 0
Re: error en rs.movelast

He copiado el codigo y al ejecutarlo me da error:

El sitio web no puede mostrar la página
HTTP 500
Causas más probables:
El sitio web está en mantenimiento.
El sitio web tiene un error de programación.
  #10 (permalink)  
Antiguo 06/06/2007, 09:41
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 22 años, 7 meses
Puntos: 0
Re: error en rs.movelast

Cita:
Se ha producido un error: No coinciden los tipos
  #11 (permalink)  
Antiguo 06/06/2007, 10:29
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: error en rs.movelast

Pues hay que ver el código, la linea que da el error, etc., así no se puede. Ese código funciona, lo tengo en producción, así que debe ser otra cosa.
  #12 (permalink)  
Antiguo 06/06/2007, 10:34
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 22 años, 7 meses
Puntos: 0
Re: error en rs.movelast

este es el codigo, no mas!.
No me da la lina del error.

* nombre es un campo de tipo char.

Cita:
on error resume next

Set Conn = Server.Createobject("ADODB.Connection")
conn.open "bd"

strSQL = "Set Nocount on "
strSQL = strSQL + "insert into TABLA1 (nombre) values ('prueba')"
strSQL = strSQL + " select IdentityInsert=@@identity"
strSQL = strSQL + " set nocount off"

objRS.Open strSQL, Conn
objRS("IdentityInsert")

If Err <> 0 Then
Response.Write "Se ha producido un error: " & Err.Description
End If
  #13 (permalink)  
Antiguo 06/06/2007, 10:37
Avatar de Shiryu_Libra
Colaborador
 
Fecha de Ingreso: febrero-2007
Ubicación: Cantando "Screenager" en "Kirafa Kaput"
Mensajes: 3.614
Antigüedad: 17 años, 3 meses
Puntos: 88
Re: error en rs.movelast

sensei Myakire, no tiene nada que ver que sea una tabla en ACCESS???
__________________
"Eres parte del problema, parte de la solucion o parte del paisaje"
Un Saludo desde Desierto de Altar, Sonora, MX.
Shiryu_libra
  #14 (permalink)  
Antiguo 06/06/2007, 10:49
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 22 años, 7 meses
Puntos: 0
Re: error en rs.movelast

La base de datos en es en Access es en SQl Server 2000.

Conecto a ella mediante un ODBC que tengo creado
  #15 (permalink)  
Antiguo 06/06/2007, 15:27
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: error en rs.movelast

Cita:
sensei Myakire, no tiene nada que ver que sea una tabla en ACCESS???
Access? .... diablos!!, donde se dice antes que no era sql server?

Cita:
La base de datos en es en Access es en SQl Server 2000.
eehh?, por fin, en que quedamos? es o no es en sql server?

Cita:
este es el codigo...
Solo eso? ..... mmmmm, no te falta por ejemplo, definir el objeto objRS?

Deja hago un ejemplo completo
  #16 (permalink)  
Antiguo 06/06/2007, 15:32
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: error en rs.movelast

listo ...
Código:
<%
set con = Server.CreateObject("ADODB.Connection")
ConnString = "Provider=SQLOLEDB.1;Data Source=servidor;Initial Catalog=respaldo;User Id=userx;Password=123;"
Con.CommandTimeout  = 0
con.Open  ConnString

set objRS = Server.CreateObject("adodb.recordset")

strSQL = "Set Nocount on "
strSQL = strSQL + "insert into borrame (nombre) values ('prueba')"
strSQL = strSQL + " select IdentityInsert=@@identity"
strSQL = strSQL + " set nocount off"

objRS.Open strSQL, con
response.write "Se ha ingresado el Id: " & objRS("IdentityInsert")

%>
  #17 (permalink)  
Antiguo 06/06/2007, 15:35
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Re: error en rs.movelast

Primero: Los error handlers hay que dejarlos para después de probar que el código inicial funcione.

Segundo: Trata cambiando un poco tu sentencia, cambios en negritas

Código:
'on error resume next

Set Conn = Server.Createobject("ADODB.Connection")
conn.open "bd"

strSQL = "Set Nocount on "
strSQL = strSQL + "insert into TABLA1 (nombre) values ('prueba');"
strSQL = strSQL + " select @@identity AS IdentityInsert"
strSQL = strSQL + " set nocount off"

objRS.Open strSQL, Conn
objRS("IdentityInsert")

If Err <> 0 Then
Response.Write "Se ha producido un error: " & Err.Description
End If
Edit: Si no utilizas una conexión OLEDB, no funcionará esta sentencia...oops me ganó el maestro tigurón

Salud
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #18 (permalink)  
Antiguo 07/06/2007, 01:59
Avatar de Laika  
Fecha de Ingreso: octubre-2001
Mensajes: 1.376
Antigüedad: 22 años, 7 meses
Puntos: 0
Re: error en rs.movelast

Cita:
Si no utilizas una conexión OLEDB, no funcionará esta sentencia
Debo conectarme por ODBC asi que supongo que si me dices esto no me vale de nada y no voy a poder usar esta función ¿no?.

Que raro que no s epueda con ODBC...

Gracias de todos modos.
  #19 (permalink)  
Antiguo 07/06/2007, 11:05
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 4 meses
Puntos: 146
Re: error en rs.movelast

por que debes de conectarte con ODBC?????

No he probado ese código con ODBC, aunque supongo no debe tener problemas, no me queda claro por que lo dijo U_G, cosa de probar
  #20 (permalink)  
Antiguo 07/06/2007, 11:19
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 5 meses
Puntos: 98
Re: error en rs.movelast

Alguna vez leí por ahí que solamente podrías recuperar @@IDENTITY desde una conexión OLEDB, pero ya no encuentro el link, otra manera sería definir un parámetro de salida y tratar a @@IDENTITY como una variable de T-SQL.

Salud
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #21 (permalink)  
Antiguo 07/06/2007, 17:10
Avatar de CésarBalaguer  
Fecha de Ingreso: octubre-2006
Ubicación: en mi casa
Mensajes: 181
Antigüedad: 17 años, 8 meses
Puntos: 0
Re: error en rs.movelast

hay muchas formas por la que puedes lograr eso, primero lo puedes hacer mediante un trigger, ahi en la tabla inserted està el ùltimo id generado en la columna identity, otra forma es que antes de insertar tu segunda tabla hacer un SELECT MAX(id_libro) FROM tabla2 de esa manera no necesitas hacer un movelast dado a que el query te devolverà siempre un registro con el mayor valor y que por orden debe ser el ùltimo insertado.
debes tener en cuenta que lo debes hacer todo dentro de una transacciòn para evitar que haya otra grabaciòn a la tabla y que estes recuperando el id que ha grabado otro usuario.

saludos y buena suerte
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 18:44.