Principales respuestas
Copiar datos por ID e insertarlos con nuevo ID a través de un botón desde Visual Basic

Pregunta
-
Hola a todos, espero que me puedan ayudar soy nuevo en visual basic y sql. Estoy intentando copiar por ID un dato que se relaciona con otras tablas a través de procedimientos almacenados. Al momento de copiar el dato seleccionado de un Grid, solo logro copiar todo lo que trae mi tabla principal generando un nuevo ID con su información pero no logro copiar en ese nuevo ID generado los registros que tiene mi segunda tabla que se relaciona con la tabla principal.
Anexo de el resultado de la ejecución para poder aclarar más mi idea
- Paso 1: se seleccionar un campo a copiar y abre una ventana la cual muestra su respectiva información.
- Al momento de ejecutar el programa se copia los datos de mi consulta principal generando un nuevo ID
- Al consultar la información del nuevo dato, no se logra copiar la información de la segunda tabla en el nuevo ID
- Pero al consultar el ID original, internamente se copia en el grid la información del mismo dato
De antemano muchas gracias, espero que me puedan ayudar a solucionar este problema o poderme explicar cómo solucionarlo.
Saludos
la siguiente consulta es sobre mi tabla principal la cual al ejecutar el programa en visual basic, logro copiar los datos del ID seleccionado
If @Bandera = 'i2' Begin select @IdSistema = IdSistema, @FechaPrueba = FechaPrueba, @PruebaTitulo = PruebaTitulo, @PruebaMotivo = PruebaMotivo, @FechaInicioPrueba = FechaInicioPrueba, @FechaFinPrueba = FechaFinPrueba, @IdUsuarioRegistra = IdUsuarioRegistra, @IdPruebaStatus = IdPruebaStatus, @IdPruebaModalidad = 1, @IdPruebaCierreTipo = IdPruebaCierreTipo, @FechaAlta = FechaAlta from P_Pruebas where P_Pruebas.IdPrueba = @Idprueba SET @FechaInicioPrueba = NULL SET @FechaFinPrueba = NULL SET @Activo = 1 SET @IdPruebaModalidad = 1 SET @IdPruebaStatus = 1 SET @IdPruebaCierreTipo = null SeT @PruebaMotivo = NULL SET @IdUsuarioRegistra = dbo.ufnLimpiaDominioUsuario(ORIGINAL_LOGIN()) Insert into P_Pruebas(IdSistema,FechaPrueba,PruebaTitulo,FechaInicioPrueba,FechaFinPrueba,IdPruebaModalidad,IdUsuarioRegistra,IdPruebaStatus,IdPruebaCierreTipo,FechaAlta,Activo) values(@IdSistema,@FechaPrueba,@PruebaTitulo,@FechaInicioPrueba,@FechaFinPrueba,@IdPruebaModalidad,@IdUsuarioRegistra,@IdPruebaStatus,@IdPruebaCierreTipo,@FechaAlta,@Activo) set @IdPruebaNuevo = Scope_identity() End
la siguiente consulta es sobre otro proceso almacenado que se requiere para copiar los datos relacionados con la tabla principal
If @Bandera = 'i2' Begin select @IdPruebaTipo = IdPruebaTipo, @PruebaModulo = PruebaModulo, @PruebaInstruccion = PruebaInstruccion from P_PruebasModulos where P_PruebasModulos.IdPrueba = @IdPrueba SET @IdPruebaTipo = @IdPruebaTipo SET @PruebaObservacion = NULL SET @FechaAlta = GETDATE() SET @Activo = 1 Insert into P_PruebasModulos(IdPrueba,IdPruebaTipo, IdPruebaEvaluacion, PruebaModulo, PruebaInstruccion,PruebaObservacion,FechaAlta,Activo) values (@IdPrueba,@IdPruebaTipo, @IdPruebaEvaluacion ,@PruebaModulo,@PruebaInstruccion,@PruebaObservacion,@FechaAlta,@Activo) End
Del lado de visual basic, este es el código de mi botón para efectuar el copiado de la información por el ID, hace referencia a dos librerías creadas (libpruebas que es de mi tabla principal y libmodulos). al ejecutarlo solo logro copiar los datos de mi tabla principal en un Nuevo ID y de mi segunda tabla no se copian los datos que se deben ingresar en ese nuevo ID
Protected Sub rbtnInternas_Click(sender As Object, e As EventArgs) Handles rbtnInternas.Click Try Using oDesarrollador As New libPruebas.AnceSystem.rnPruebas oDesarrollador.Activo = 1 oDesarrollador.IdPrueba = hidIdPrueba.Value oDesarrollador.ModalidadInterna() If oDesarrollador.objError.bError Then Throw oDesarrollador.objError.uException End If If oDesarrollador.dt.Rows.Count > 0 Then oDesarrollador.ValidarPruebaDesarrollo() If oDesarrollador.bValido Then oDesarrollador.InsertarDatosInternos() End If Using oModulo As New libPruebasModulos.AnceSystem.rnPruebasModulos oModulo.Activo = 1 oModulo.IdPrueba = hidIdPrueba.Value oModulo.ValidarModulo() If oModulo.objError.bError Then Throw oModulo.objError.uException End If If oModulo.bValido Then oModulo.CopiarDatosModuloInterno() rgrdPruebaModulos.Rebind() rgrdPruebaDesarrolladores.Rebind() RadMsgBox(rwinManager, "Se Copió correctamente los datos", "Guardado correcto", clssMensaje.eImgMessage.Exitoso) CloseWindow(udpCBJquery, Me.Page, rwinPruebaDesarrolladorCopiar.ClientID) hidIdPrueba.Value = oDesarrollador.IdPrueba If oDesarrollador.objError.bError Then Throw oDesarrollador.objError.uException End If Else RadMsgBox(rwinManager, "El dato ingresado ya se encuentra registrado.</p> Verifique los datos", "Advertencia de Evaluación", clssMensaje.eImgMessage.Alert) End If End Using Else RadMsgBox(rwinManager, "Problemas al copiar los datos</p>", "Problemas al Copiar", clssMensaje.eImgMessage.Alert) End If End Using Catch ex As Exception RadMsgBox(rwinManager, "Problemas al copiar el dato, intente nuevamente", "Problemas al Copiar", clssMensaje.eImgMessage.Error, ex) End Try End Sub
Este es el código para insertar los datos de mi tabla principal
Protected Sub Insertar() Dim Consecutivo As Integer = 0 Try objError.bError = False cn.Open() Using cmd As New SqlCommand cmd.CommandText = "uspPruebas" cmd.CommandType = CommandType.StoredProcedure cmd.Connection = cn cmd.Parameters.AddWithValue("@IdPrueba", IdPrueba).Direction = ParameterDirection.InputOutput cmd.Parameters.AddWithValue("@IdSistema", IdSistema) cmd.Parameters.AddWithValue("@FechaPrueba", FechaPrueba) cmd.Parameters.AddWithValue("@PruebaTitulo", PruebaTitulo) cmd.Parameters.AddWithValue("@PruebaMotivo", PruebaMotivo) cmd.Parameters.AddWithValue("@FechaInicioPrueba", FechaInicioPrueba) cmd.Parameters.AddWithValue("@FechaFinPrueba", FechaFinPrueba) cmd.Parameters.AddWithValue("@IdPruebaModalidad", IdPruebaModalidad) cmd.Parameters.AddWithValue("@IdUsuarioRegistra", IdUsuarioRegistra) cmd.Parameters.AddWithValue("@IdPruebaStatus", IdPruebaStatus) cmd.Parameters.AddWithValue("@IdPruebaCierreTipo", IdPruebaCierreTipo) cmd.Parameters.AddWithValue("@FechaAlta", FechaAlta) cmd.Parameters.AddWithValue("@Activo", Activo) ''|| TagParametros ''|| EndTagParametros cmd.Parameters.AddWithValue("@sXML", sXML) cmd.Parameters.AddWithValue("@Bandera", Bandera) cmd.ExecuteNonQuery() If Not IsDBNull(cmd.Parameters("@IdPrueba").Value) Then IdPrueba = cmd.Parameters("@IdPrueba").Value End If End Using Catch ex As Exception objError.bError = True objError.uException = ex Finally cn.Close() End Try End Sub
Es otro código es para insertar los datos de la tabla modulos que se relaciona con la tabla principal
Protected Sub Insertar() Dim Consecutivo As Integer = 0 Try objError.bError = False cn.Open() Using cmd As New SqlCommand cmd.CommandText = "uspPruebasModulos" cmd.CommandType = CommandType.StoredProcedure cmd.Connection = cn cmd.Parameters.AddWithValue("@IdPruebaModulo", IdPruebaModulo) cmd.Parameters.AddWithValue("@IdPrueba", IdPrueba) cmd.Parameters.AddWithValue("@IdPruebaTipo", IdPruebaTipo) cmd.Parameters.AddWithValue("@IdPruebaEvaluacion", IdPruebaEvaluacion) cmd.Parameters.AddWithValue("@PruebaModulo", PruebaModulo) cmd.Parameters.AddWithValue("@PruebaInstruccion", PruebaInstruccion) cmd.Parameters.AddWithValue("@PruebaObservacion", PruebaObservacion) cmd.Parameters.AddWithValue("@FechaAlta", FechaAlta) cmd.Parameters.AddWithValue("@Activo", Activo) ''|| TagParametros ''|| EndTagParametros cmd.Parameters.AddWithValue("@sXML", sXML) cmd.Parameters.AddWithValue("@Bandera", Bandera) cmd.ExecuteNonQuery() If Not IsDBNull(cmd.Parameters("@IdPrueba").Value) Then IdPruebaNuevo = cmd.Parameters("@IdPrueba").Value End If End Using Catch ex As Exception objError.bError = True objError.uException = ex Finally cn.Close() End Try End Sub
- Editado Jonathan Victorio lunes, 11 de enero de 2021 4:32
Respuestas
-
Hola Jonathan Jesús Victorio García:
Hay algunas lagunas en el código.
If @Bandera = 'i2' Begin select @IdSistema = IdSistema, @FechaPrueba = FechaPrueba, @PruebaTitulo = PruebaTitulo, @PruebaMotivo = PruebaMotivo, @FechaInicioPrueba = FechaInicioPrueba, @FechaFinPrueba = FechaFinPrueba, @IdUsuarioRegistra = IdUsuarioRegistra, @IdPruebaStatus = IdPruebaStatus, @IdPruebaModalidad = 1, @IdPruebaCierreTipo = IdPruebaCierreTipo, @FechaAlta = FechaAlta from P_Pruebas where P_Pruebas.IdPrueba = @Idprueba; -- 1ª parte Recoger valores SET @FechaInicioPrueba = NULL SET @FechaFinPrueba = NULL SET @Activo = 1 SET @IdPruebaModalidad = 1 SET @IdPruebaStatus = 1 SET @IdPruebaCierreTipo = null SeT @PruebaMotivo = NULL SET @IdUsuarioRegistra = dbo.ufnLimpiaDominioUsuario(ORIGINAL_LOGIN()); -- 2ª parte setear variables. Insert into P_Pruebas(IdSistema,FechaPrueba,PruebaTitulo,FechaInicioPrueba,FechaFinPrueba,IdPruebaModalidad,IdUsuarioRegistra,IdPruebaStatus,IdPruebaCierreTipo,FechaAlta,Activo) values(@IdSistema,@FechaPrueba,@PruebaTitulo,@FechaInicioPrueba,@FechaFinPrueba,@IdPruebaModalidad,@IdUsuarioRegistra,@IdPruebaStatus,@IdPruebaCierreTipo,@FechaAlta,@Activo); -- 3ª parte Insertar en tabla P_Pruebas set @IdPruebaNuevo = Scope_identity() -- 4ª parte recoger el nuevo id Insertado End
En esta parte del código TSQL, se distinguen 4 partes. Pero no entiendo para que recoges en la primera parte el valor que tiene para la fila de la tabla que coincide con @idPrueba si luego en la segunda parte, asignas valores a esas mismas variables que acabas de leer.
Por ejemplo si has leído, que la fila para idPrueba = 1 contiene en la columna FechaInicioPrueba = 2020-01-01, nada más leerlo, le asignas a @FechaInicioPrueba = Null.
¿Qué sentido tiene entonces?. Siempre te va a quedar con esa asignación Null.
Luego hablas de procedimientos almacenados y enseñas el código en Visual Basic con la llamada a los mismos, pero donde están los procedures, ya que solo enseñas una parte del mismo. Por ejemplo se ve como se asigna scope_identity() a una variable, pero no se ve la definición del procedure donde hay un parámetro output para saber si lo estás recibiendo correctamente. Porque del código se ve que usas @idPruebaNuevo en el, sin embargo en el código vb, se ve que usas como parámetro @idPrueba
Quizá deberías de ir paso por paso, y comprobando, de todo el código que tienes, cuál te funciona según lo que necesitas, y dividir las preguntas por bloques. Lo que no te funciona lo preguntas.
Además este es el foro de SQL Server.
La parte del código de Visual Basic, es posible que obtengas mejores respuestas en el foro para tal.
- Marcado como respuesta Jonathan Victorio lunes, 11 de enero de 2021 22:44