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

  • 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 

    1. Paso 1: se seleccionar un campo a copiar y abre una ventana la cual muestra su respectiva información.
    2. Al momento de ejecutar el programa se copia los datos de mi consulta principal generando un nuevo ID 
    3. Al consultar la información del nuevo dato, no se logra copiar la información de la segunda tabla  en el nuevo ID 
    4. 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
    lunes, 11 de enero de 2021 4:18

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.

    Foro MSDN VB.NET

    lunes, 11 de enero de 2021 4:50