none
Problema Crystal RRS feed

  • Pregunta

  • SP que se conecta con Crystal.

    create proc filtro_venta
    @IdVenta int
    as
    select cliente.Nombres,Cliente.Apellidos,Cliente.Ruc,Producto.Articulo,Producto.Tipo,Producto.Marca,Venta.Fecha_Venta,Venta.Cantidad_Vendida,Venta.Precio,Venta.SubTotal,Venta.IGV,Venta.Total
    from Venta inner join Cliente on Venta.IdCliente=Cliente.IdCliente inner join Producto on Venta.IdArticulo = Producto.IdArticulo
    where IdVenta=@IdVenta


    Boton Filtrar

            Dim mireporte As New ImprimirVenta
            If Me.ValidateChildren = True And txtFiltrar.Text <> "" Then
                mireporte.SetParameterValue("@IdVenta", Me.txtFiltrar.Text)
                Me.CrystalReportViewer1.ReportSource = mireporte
            Else
                MessageBox.Show("No Existe Codigo", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If

    2 Preguntas, la primera solucionar el tema: "introduzca el valor del parametro" Ya que aparece al iniciar el form del crystal y Tambien como validar el campo. Cuando introduce un codigo en el textbox carga el cystal con los datos respectivos, pero si el codigo no existe, que no carge el crystal. Ya que igualmente carga el crystal pero ya vacio.

    Saludos.

    lunes, 10 de febrero de 2014 2:30

Respuestas

  • Al final lo solucione.
    Primero cree un form previa donde unicamente se coloca el codigo para buscar y generar el reporte.  (segun mi gusto )
        Public Function Existe(ByVal id As Integer) As Boolean
            Using cn As New SqlConnection("Data Source=.; Initial Catalog=BDpunto; Integrated Security = true")
                Dim query = "SELECT COUNT(*) FROM VENTA WHERE IdVenta=@IdVenta"
                Dim cmd As New SqlCommand(query, cn)
                cmd.Parameters.AddWithValue("IdVenta", id)
                cn.Open()
    
                Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar())
                If count = 0 Then
                    Return False
                Else
                    Return True
                End If
            End Using
        End Function

        Private Sub filtrar()
            If (Not IsNumeric(txtFiltrar.Text)) Then
                MessageBox.Show("Ingrese Codigo de Venta", "GENERANDO COMROBANTE DE VENTA", MessageBoxButtons.OK, MessageBoxIcon.Information)
                txtFiltrar.Focus()
            Else
                If (Not Existe(Convert.ToInt32(txtFiltrar.Text))) Then
                    MessageBox.Show("No Existe Codigo", "GENERANDO COMROBANTE DE VENTA", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    txtFiltrar.Focus()
                Else
                    Dim mireporte As New ImprimirVenta
                    frmImprimirVenta.Show()
                    mireporte.SetParameterValue("@IdVenta", Me.txtFiltrar.Text)
                    frmImprimirVenta.CrystalReportViewer1.ReportSource = mireporte
                    Me.Hide()
                End If
            End If
        End Sub

    Asi me funciono muy bien.
    • Marcado como respuesta T2014 martes, 11 de febrero de 2014 23:13
    martes, 11 de febrero de 2014 23:13

Todas las respuestas

  • Podrias para este caso crear una función que busque el registro que necesitas o que queres preguntar si existe en la base ,por lo que entendí seria algo así la funcion                                       

    Public Function Existe_codigo(ByVal id As Integer) As Integer
            Dim existe_registro As Integer     
            Using cn As New SqlConnection("conecction_string")
                cn.Open()
                Dim query As String = "select count(Venta.Idventa) " _
                                    & "from Venta  " _
                                    & "where IdVenta=@IdVenta " 

                Dim cmd As New SqlCommand(query, cn)

                cmd.Parameters.AddWithValue("@IdVenta", id)
                existe_registro = CInt(cmd.ExecuteScalar)
            End Using
            Return existe_registro     

        End Function

    y luego llamar a dicha funcion asi ,agregando las dos condiciones ,que tenga algo el textbox y que exista en la base el dato

    if txt_filtrar.text <> "" and Existe_codigo(cint(txt_filtrar.text) <>0)

    con eso te aseguras que tiene algo el textbox y que exista en la base,pero queda el tema de controlar si ingresaste un varchar cuando tenias que ingresar un entero en el textbox,para eso podes agregar el codigo este en el evento keypress del textbox filtrar

     If InStr("0123456789" & Chr(8), e.KeyChar) Then
                e.Handled = False
            Else
                MsgBox("Solo se aceptan Números.", MsgBoxStyle.Exclamation, "Aviso")
                e.Handled = True
            End If

    ya teniendo eso podes agregar el else

    if txt_filtrar.text <> "" and Existe_codigo(cint(txt_filtrar.text) <>0)

    llamar al crystal y pasarle el parametro

    else

    MessageBox.Show("No Existe Codigo", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)

    Lo del msj ese que te sale "ingresar el valor del parametro",no se a que se deba,yo tambien los armo a los reportes en crystal de la misma forma,con procedimientos a la base y con parametros,pero cuando creas la conexion dentro del crystal,al comienzo te pide los parametros,pero ahi pones aceptar y que quede en null,porque al valor se lo vas a pasar por codigo,yo probaria creando la conexion de nuevo y agregando todos los campos de nuevo al reporte de crystal.

    Espero te sirva.

    Saludos.

    lunes, 10 de febrero de 2014 5:04
  • Ya solucione el aviso "ingresar el valor del parametro", Pero el validar no funciona.
        Private Sub filtrar()
            Dim mireporte As New ImprimirVenta
            If Me.ValidateChildren = True And txtFiltrar.Text <> "" And Existe_codigo(CInt(txtFiltrar.Text) <> 0) Then
                mireporte.SetParameterValue("@IdVenta", Me.txtFiltrar.Text)
                Me.CrystalReportViewer1.ReportSource = mireporte
            Else
                MessageBox.Show("No Existe Codigo", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
        End Sub

        Public Function Existe_codigo(ByVal id As Integer) As Integer
            Dim existe_registro As Integer
            Using cn As New SqlConnection("Data Source=.; Initial Catalog=BDpunto; Integrated Security = true")
                cn.Open()
                Dim query As String = "select count(Venta.Idventa) " _
                                    & "from Venta  " _
                                    & "where IdVenta=@IdVenta "
    
                Dim cmd As New SqlCommand(query, cn)
    
                cmd.Parameters.AddWithValue("@IdVenta", id)
                existe_registro = CInt(cmd.ExecuteScalar)
            End Using
            Return existe_registro
        End Function
    End Class

    Cuando inserto el codigo, directamente lanza el msgbox que el codigo no existe, aún sabiendo que si existe ese cofigo.
    martes, 11 de febrero de 2014 0:43
  • aun quitando esta condicion te da el error?

    Me.ValidateChildren = True

    Te pregunto porque no se que hace esa linea,proba primero el query en la base.con un codigo cualquiera.

    ej con un valor q exista y que no exista

    select count(venta.id_venta) from Venta where idVenta= 12 ' Este es un ej que existe ese valor en la base

    select count(venta.id_venta) from Venta where idVenta= 15 'Este es un ej., que no existe ese valor en la base

    en el primer caso te devolveria la función 1 y en el otro 0,yo te había recomendado para esas dos condiciones que tenga algo y que exista en la base,la tercer condición desconozco que hace y se puede estar yendo por esa condición al msgbox,por eso proba quitando condiciones y con la consulta a la base y con eso ya lo deberias solucionar.

    Espero te sirva.

    martes, 11 de febrero de 2014 1:18
  • Probe en consulta SQL y lanza 1 y 0 tal lo mencionado, pero en VB no realiza la acción.
    martes, 11 de febrero de 2014 1:40
  • Si queres ver si funciona la función en vb podrias agregar un boton para probar y despues borrarlo y en el evento click del mismo crear la condicion 

    if  existe_Codigo (cint(txtfiltrar.text))  <> 0 then

    msgbox("existe")

    else 

    msgbox("no existe")

    Pero por lo que comentas el error para mi esta en la primera condición que te comente antes.como es en tu caso preguntas por las 3 condiciones a la vez,no se cumple una y se va por el else, y te muestra el msg que decias.De todas formas,comenta como lo estas haciendo y para que sirve la primera condicion para ver si otro usuario del foro te puede ayudar

    Me.ValidateChildren = True

    martes, 11 de febrero de 2014 2:44
  • Hola:
    Cambia tu codigo por este otro, asi veras donde esta dando el error

    Private Sub filtrar()
            Dim mireporte As New ImprimirVenta
            If Me.ValidateChildren = False Then
                MessageBox.Show("Datos incompletos", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End If
            If txtFiltrar.Text.Length = 0 Then
                MessageBox.Show("Introduzca texto", "", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Return
            End If
            If Existe_codigo(CInt(txtFiltrar.Text) <> 0) Then
                mireporte.SetParameterValue("@IdVenta", Me.txtFiltrar.Text)
                Me.CrystalReportViewer1.ReportSource = mireporte
            Else
                MessageBox.Show("No Existe Codigo", "Guardando Registros", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End If
    End Sub

    Un saludo desde Bilbo
    Carlos

    martes, 11 de febrero de 2014 9:53
  • Al final lo solucione.
    Primero cree un form previa donde unicamente se coloca el codigo para buscar y generar el reporte.  (segun mi gusto )
        Public Function Existe(ByVal id As Integer) As Boolean
            Using cn As New SqlConnection("Data Source=.; Initial Catalog=BDpunto; Integrated Security = true")
                Dim query = "SELECT COUNT(*) FROM VENTA WHERE IdVenta=@IdVenta"
                Dim cmd As New SqlCommand(query, cn)
                cmd.Parameters.AddWithValue("IdVenta", id)
                cn.Open()
    
                Dim count As Integer = Convert.ToInt32(cmd.ExecuteScalar())
                If count = 0 Then
                    Return False
                Else
                    Return True
                End If
            End Using
        End Function

        Private Sub filtrar()
            If (Not IsNumeric(txtFiltrar.Text)) Then
                MessageBox.Show("Ingrese Codigo de Venta", "GENERANDO COMROBANTE DE VENTA", MessageBoxButtons.OK, MessageBoxIcon.Information)
                txtFiltrar.Focus()
            Else
                If (Not Existe(Convert.ToInt32(txtFiltrar.Text))) Then
                    MessageBox.Show("No Existe Codigo", "GENERANDO COMROBANTE DE VENTA", MessageBoxButtons.OK, MessageBoxIcon.Information)
                    txtFiltrar.Focus()
                Else
                    Dim mireporte As New ImprimirVenta
                    frmImprimirVenta.Show()
                    mireporte.SetParameterValue("@IdVenta", Me.txtFiltrar.Text)
                    frmImprimirVenta.CrystalReportViewer1.ReportSource = mireporte
                    Me.Hide()
                End If
            End If
        End Sub

    Asi me funciono muy bien.
    • Marcado como respuesta T2014 martes, 11 de febrero de 2014 23:13
    martes, 11 de febrero de 2014 23:13