Foros del Web » Programación para mayores de 30 ;) » .NET »

msj there is no row at position -1???

Estas en el tema de msj there is no row at position -1??? en el foro de .NET en Foros del Web. Estoy agregando un modulo de kardex a mi aplicacion NET 2005 y SQL 2005 trabaja con una VPN para acceder datos a la bd que ...
  #1 (permalink)  
Antiguo 28/10/2009, 17:06
 
Fecha de Ingreso: julio-2009
Mensajes: 44
Antigüedad: 14 años, 9 meses
Puntos: 0
msj there is no row at position -1???

Estoy agregando un modulo de kardex a mi aplicacion NET 2005 y SQL 2005 trabaja con una VPN para acceder datos a la bd que se encuentra en otro lugar lo extraño es QUE MUESTRA EL MENSAJE QUE ESTA EN EL TITULO EN ALGUNAS OCACIONES ESTE ES PROCEDIMIENTO DONDE SE PRESENTA EL MENSAJE:
Private Sub ActualizarStock(ByVal xDescripcion As String, ByVal xQuitar As Double)
Dim cmdSQL As String
Dim Cmd As New SqlCommand
Cmd.Connection = Cn
cmdSQL = "UPDATE Producto Set cantidad = (cantidad - " & xQuitar & ") Where Producto = '" & xDescripcion & "'"
Cmd.CommandText = cmdSQL
Cmd.ExecuteNonQuery()
'GrabarMovimientos
Dim Compra As String = "Ventas"
'ultimo
cmdSQL = "SELECT * FROM Movimientos WHERE Producto='" & xDescripcion & "' ORDER BY ID"
Dim daEncabezado As New SqlDataAdapter(cmdSQL, Cn)
Dim DsEncabezado As New DataSet
DsEncabezado.Clear()
daEncabezado.Fill(DsEncabezado, "Tabla")
Dim Ultimo As Double = DsEncabezado.Tables("Tabla").Rows(DsEncabezado.Tab les("Tabla").Rows.Count - 1)("Existencia")
Dim xexiste As Double = Ultimo - xQuitar
'grabar
cmdSQL = "INSERT INTO Movimientos(Fecha,producto,Documento,Concepto,Sali da,Existencia)" & _
" VALUES('" & Date.Now.ToString("yyyyMMdd") & "','" & xDescripcion & "', '" & "F4-" & Label6.Text & "','" & Compra & "', " & xQuitar & "," & xexiste & ")"
Cmd.CommandText = cmdSQL
Cmd.ExecuteNonQuery()
Cmd.Dispose()
End Sub

Me parece que es es en la linea :
Dim Ultimo As Double = DsEncabezado.Tables("Tabla").Rows(DsEncabezado.Tab les("Tabla").Rows.Count - 1)("Existencia")

porque el mensaje exacto es:

SE PRODUJO UN ERROR AL TRATAR DE OBTENER DATOS.there is no row at position -1

AGRADECERIA UNA RESPUESTA PRONTA
  #2 (permalink)  
Antiguo 28/10/2009, 17:32
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: msj there is no row at position -1???

deberias agregar una validacion para cuando no existe un ID

algo como

if( DsEncabezado.Tab les("Tabla").Rows.Count >0)
...... DsEncabezado.Tab les("Tabla").Rows.Count - 1....
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #3 (permalink)  
Antiguo 28/10/2009, 18:10
 
Fecha de Ingreso: septiembre-2009
Mensajes: 111
Antigüedad: 14 años, 7 meses
Puntos: 3
Respuesta: msj there is no row at position -1???

Cuando Realizas las operaciones con tu tabla.. cual es el Indice que indica la Posicion de la Fila..?? porque En tu codigo :
Cita:
Dim DsEncabezado As New DataSet
DsEncabezado.Clear()
daEncabezado.Fill(DsEncabezado, "Tabla")
Dim Ultimo As Double = DsEncabezado.Tables("Tabla").Rows(DsEncabezado.Tab les("Tabla").Rows.Count - 1)("Existencia")
me pregunto si usas esta linea como un Indicador de posicion:
Dim Ultimo As Double = DsEncabezado.Tables("Tabla").Rows(DsEncabezado.Tab les("Tabla").Rows.Count - 1)("Existencia")

De ser Así.. te recomendaria una Variable Numerica como Dim i as Int = (DsEncabezado.Tab les("Tabla").Rows.Count - 1; y asi asignarle un valor inicial... y como te menciona Peterpay validar.

De lo contrario, Debugga y verifica los valores iniciales al leer la TAbla.

Saludos.
  #4 (permalink)  
Antiguo 29/10/2009, 09:40
 
Fecha de Ingreso: julio-2009
Mensajes: 44
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: msj there is no row at position -1???

Cita:
Iniciado por mad249 Ver Mensaje
Cuando Realizas las operaciones con tu tabla.. cual es el Indice que indica la Posicion de la Fila..?? porque En tu codigo :

me pregunto si usas esta linea como un Indicador de posicion:
Dim Ultimo As Double = DsEncabezado.Tables("Tabla").Rows(DsEncabezado.Tab les("Tabla").Rows.Count - 1)("Existencia")

De ser Así.. te recomendaria una Variable Numerica como Dim i as Int = (DsEncabezado.Tab les("Tabla").Rows.Count - 1; y asi asignarle un valor inicial... y como te menciona Peterpay validar.

De lo contrario, Debugga y verifica los valores iniciales al leer la TAbla.

Saludos.

lo que hace este procedimiento es filtar por producto y ubicarse al ultimo(ultima venta) extraer la existencia del producto y asi descontar o aumentar

dim debe ser double por que trabaja con decimales
y mi pregunta porque es -1 que quiere decir menos uno porque cero es que no hay datos??
Gracias
  #5 (permalink)  
Antiguo 29/10/2009, 10:07
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: msj there is no row at position -1???

si filtra, pero imaginate q filtras por una clave q no existe el resultado sera 0 en la cuenta de elementos pero y le restas el indice porq la cuenta es absoluta en las colecciones cualesquiera que estas sean , pues por eso te dice q no puede ser menor que 0 -1 no es un indice valido.
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #6 (permalink)  
Antiguo 29/10/2009, 10:38
 
Fecha de Ingreso: julio-2009
Mensajes: 44
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: msj there is no row at position -1???

Cita:
Iniciado por peterpay Ver Mensaje
si filtra, pero imaginate q filtras por una clave q no existe el resultado sera 0 en la cuenta de elementos pero y le restas el indice porq la cuenta es absoluta en las colecciones cualesquiera que estas sean , pues por eso te dice q no puede ser menor que 0 -1 no es un indice valido.
parece ser que es cuando quiere filtrar productos por ejemplo que contiene caracteres especiales por ejemplo

codo de luz 3/4
curvas de luz 1"

parece ser que no filtra estos productos por eso es que envia cero, como seria para filtrar estos caracteres especiales?

Gracias
  #7 (permalink)  
Antiguo 29/10/2009, 10:41
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 16 años, 8 meses
Puntos: 87
Respuesta: msj there is no row at position -1???

yo seria de la idea de tomar

cmdSQL = "SELECT * FROM Movimientos WHERE Producto='" & xDescripcion & "' ORDER BY ID"

y convertirlo en algo como

cmdSQL = "SELECT * FROM Movimientos WHERE Producto=@parametro ORDER BY ID"
cmdSQL.Parameters.AddWithValue("@parametro",xDescr iption)

o algo como

cmdSQL = "SELECT * FROM Movimientos WHERE Producto like '%@parametro%' ORDER BY ID"
cmdSQL.Parameters.AddWithValue("@parametro",xDescr iption)
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #8 (permalink)  
Antiguo 29/10/2009, 11:09
Avatar de xjuanch0x  
Fecha de Ingreso: septiembre-2009
Mensajes: 125
Antigüedad: 14 años, 7 meses
Puntos: 1
Respuesta: msj there is no row at position -1???

Cita:
Iniciado por arevalowalter Ver Mensaje
Estoy agregando un modulo de kardex a mi aplicacion NET 2005 y SQL 2005 trabaja con una VPN para acceder datos a la bd que se encuentra en otro lugar lo extraño es QUE MUESTRA EL MENSAJE QUE ESTA EN EL TITULO EN ALGUNAS OCACIONES ESTE ES PROCEDIMIENTO DONDE SE PRESENTA EL MENSAJE:
Private Sub ActualizarStock(ByVal xDescripcion As String, ByVal xQuitar As Double)
Dim cmdSQL As String
Dim Cmd As New SqlCommand
Cmd.Connection = Cn
cmdSQL = "UPDATE Producto Set cantidad = (cantidad - " & xQuitar & ") Where Producto = '" & xDescripcion & "'"
Cmd.CommandText = cmdSQL
Cmd.ExecuteNonQuery()
'GrabarMovimientos
Dim Compra As String = "Ventas"
'ultimo
cmdSQL = "SELECT * FROM Movimientos WHERE Producto='" & xDescripcion & "' ORDER BY ID"
Dim daEncabezado As New SqlDataAdapter(cmdSQL, Cn)
Dim DsEncabezado As New DataSet
DsEncabezado.Clear()
daEncabezado.Fill(DsEncabezado, "Tabla")
Dim Ultimo As Double = DsEncabezado.Tables("Tabla").Rows(DsEncabezado.Tab les("Tabla").Rows.Count - 1)("Existencia")
Dim xexiste As Double = Ultimo - xQuitar
'grabar
cmdSQL = "INSERT INTO Movimientos(Fecha,producto,Documento,Concepto,Sali da,Existencia)" & _
" VALUES('" & Date.Now.ToString("yyyyMMdd") & "','" & xDescripcion & "', '" & "F4-" & Label6.Text & "','" & Compra & "', " & xQuitar & "," & xexiste & ")"
Cmd.CommandText = cmdSQL
Cmd.ExecuteNonQuery()
Cmd.Dispose()
End Sub

Me parece que es es en la linea :
Dim Ultimo As Double = DsEncabezado.Tables("Tabla").Rows(DsEncabezado.Tab les("Tabla").Rows.Count - 1)("Existencia")

porque el mensaje exacto es:

SE PRODUJO UN ERROR AL TRATAR DE OBTENER DATOS.there is no row at position -1

AGRADECERIA UNA RESPUESTA PRONTA



Man debes aprender a usar las herramientas de visual Studio...coloca un punto de interrupcion en la funcion ActualizarStock y sigues paso a paso con F11 y vas mirando los valores que toman las variables.

Y por con consejo, es una mala practica hardcodear ( Hard Coded) osea quemar las consultas en el codigo, usa Procedimientos almacenados para las inserciones, actualizaciones o busquedas.



Ing.Juan David Torres
DCE Platinum VC# y VB.NET
e-mail: [email protected]
  #9 (permalink)  
Antiguo 29/10/2009, 13:13
 
Fecha de Ingreso: julio-2009
Mensajes: 44
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: msj there is no row at position -1???

Cita:
Iniciado por Peterpay Ver Mensaje
yo seria de la idea de tomar

cmdSQL = "SELECT * FROM Movimientos WHERE Producto='" & xDescripcion & "' ORDER BY ID"

y convertirlo en algo como

cmdSQL = "SELECT * FROM Movimientos WHERE Producto=@parametro ORDER BY ID"
cmdSQL.Parameters.AddWithValue("@parametro",xDescr iption)

o algo como

cmdSQL = "SELECT * FROM Movimientos WHERE Producto like '%@parametro%' ORDER BY ID"
cmdSQL.Parameters.AddWithValue("@parametro",xDescr iption)
Gracias amigo pero mi variable cmdSQL es un string y no un cmd que pasa que este estring va al sqldataadapter como se ve en el codigo
  #10 (permalink)  
Antiguo 29/10/2009, 16:33
Avatar de xjuanch0x  
Fecha de Ingreso: septiembre-2009
Mensajes: 125
Antigüedad: 14 años, 7 meses
Puntos: 1
Respuesta: msj there is no row at position -1???

Cita:
Iniciado por arevalowalter Ver Mensaje
Gracias amigo pero mi variable cmdSQL es un string y no un cmd que pasa que este estring va al sqldataadapter como se ve en el codigo
mmmm
man si tienes este query

cmdSQL = "SELECT * FROM Movimientos WHERE Producto='" & xDescripcion & "' ORDER BY ID"

en el metodo...esta harcodeado, imagina que te toque hacer un cambio a la sentencia Sql porque el modelo de datos cambio ó por un nueva adaptacion,
te tocaria volver a corregir el metodo, compilar y entregar, ahora imaginate 10 metodos y que el modelo de datos cambie con frecuencia, hacer cambios en lo metodos y compilar, mientras que con procedimientos almacenados los cambios son mas rapidos y hace tu aplicacion mas flexible a los cambios..

no lo digo con el animo de decir que lo haces mal. sino de que aprendas buenas tecnicas de desarrollo.

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 16:17.