none
Ayuda con numeración en Tablas Relacionadas RRS feed

  • Pregunta

  • Buenas tardes a todos,

    Estoy tratando de crear dos tablas relacionadas para hacer más efectivo el trabajo. Supongamos que cuento ahora con 10 tablas idénticas (TABLA1, TABLA2, TABLA3, TABLA4) con estos campos: Registro (incrementa de uno en uno), Nombre, Fecha, Factura.

    He creado una TABLAPADRE con ID_Proyecto, Proyecto

    y una TABLAHIJO con Registro, Nombre, Fecha, Factura

    Estas tablas, ya que antes mi Primary Key era Registro, las relacioné entre Registro e ID_Proyecto

    Ahora bien, el problemas es que para cada proyecto la numeración (Registro) es independiente, es decir para Proyecto1 la numeración puede ir por la 54 pero para Proyecto2 está por la 96. Esto es porque cada factura que nos llega tiene su proyecto que la paga y para identificarla dentro de la empresa se usa el número de Registro. De esa manera están los 10 proyectos.

    Cómo puedo hacer para que Registro siga siendo independiente para cada proyecto usando las tablas TABLAPADRE y TABLAHIJO?

    Tengo en un formulario 1 DataGridView, 1 BindingNavigator, 3 Textboxes, 1 Combobox y 1 DateTimePicker.

    El Combobox contiene el datasource, displaymember (Proyecto), valuemember y selected value, con los datos de la TABLAPADRES. Quiero que al seleccionar el Proyecto pueda editar solamente los elementos correspondientes a ese proyecto y luego guardar los cambios.

    Muchas gracias!


    • Editado joyi6388 viernes, 17 de noviembre de 2017 19:01 Agregar más información
    viernes, 17 de noviembre de 2017 18:34

Respuestas

  • Hola:
    En un Form como el de la imagen que utilizo para el mantenimiento de la siguiente tabla

    DISCO
    ======
    autor          Numero     PK y FK
    numero         Numero     PK
    descripcion    Caracter

    Esta tabla es la equivalente a tu TABLA_HIJO

    > Lo que no sé cómo hacer es que al seleccionar el un proyecto en el combobox, filtre el datagridview para trabajar solo sobre ese proyecto <

    En el groupbox que pone BUSQUEDA, se puede escribir en el TextBox Descripcion y/o seleccionar algo del ComboBox Autor.
    El codigo para buscar seria:

        Private Sub lP_Buscar()
            Dim lbHayFiltro As Boolean = False
            Dim msQuery As String="Select * From DISCO"
            If Me.txtBDescripcion.Text <> "" Then
                msQuery &=" Where DESCRIPCION Like '%" & Me.txtBDescripcion.Text & "%'"
                lbHayFiltro = True
            End If
            If Me.cboBAutor.Text <> "" Then
                If lbHayFiltro = True Then
                    msQuery &= " And "
                Else
                    msQuery &=" Where "
                End If
                msQuery &="AUTOR=" & Cstr(Me.cboBAutor.SelectedValue)
            End If
            msQuery &=" Order By DESCRIPCION"
        End Sub

    Si seleccionas algo del ComboBox Autor, solo tendras registros de ese autor.

    > donde al añadir una nueva factura, el campo Registro añada 1, es como tener la autonumeración en sql pero lo hago por código <

    El codigo para añadir 1 nuevo registro (usando el groupbox que pone DETALLE) seria:

        Private Sub lP_Nuevo()
            Me.txtNumero.Text = ""
            Me.txtDescripcion.Text = ""
            Me.cboAutor.SelectedIndex = -1
        End Sub

    Cuando seleccionas el autor, se desencadena el siguiente evento

        Private Sub cboAutor_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboAutor.SelectionChangeCommitted
            Dim lsQuery As String = "Select ISNull(Max(NUMERO),0)+1 As MAXIMO From DISCO WHERE autor=" & Cstr(Me.cboAutor.SelectedValue)
            Using loConexion As New SqlConnection(vsCadConexion)
                Using loComando As New SqlCommand(lsQuery, loConexion)
                    loConexion.Open()
                    Me.txtNumero.Text = Cstr(loComando.ExecuteScalar())
                End Using
            End Using
        End Sub

    Asi se consigue numerar por autor, es decir cada autor tiene su "propia" numeracion

    P.D.
    Adaptalo a tus necesidades

    Un saludo desde Bilbo
    Carlos

    lunes, 20 de noviembre de 2017 20:08

Todas las respuestas

  • Hola:

    TABLA_PADRE
    ===========
    ID_REGISTRO      NUMERICO    PK
    DESCRIPCION      CARACTER(50)

    TABLA_HIJO
    ==========
    REGISTRO         NUMERO      PK y FK
    NUMERO           NUMERO      PK
    NOMBRE
    FECHA
    FACTURA

    En el ComboBox de Registro, se muestra el campo TABLA_PADRE.DESCRIPCION (DisplayMember) y se graba el campo TABLA_PADRE.ID_REGISTRO (ValueMember)

    Al añadir un nuevo registro a la TABLA_HIJO, despues de seleccionar el ID_REGISTRO del combobox, se hace la siguiente consulta:
    SELECT MAX(numero) AS numeromax FROM TABLA_HIJO WHERE registro=@Registro
    @Registro es igual al valor seleccionado del comboBox

    Espero que se entienda

    Un saludo desde Bilbo
    Carlos
    viernes, 17 de noviembre de 2017 20:29
  • Gracias Carlos, he estado afuera el fin de semana por eso mi respuesta tardía. He diseñado las tablas correctamente, creo, siguiendo tu ejemplo, me han quedado así:

    TABLA:PADRE

    =========

    ID_PROYECTO              NUMERO    PK

    NOMBRE_PROYECTO    CARACTER(50)

    TABLA HIJO

    ==========

    ID_PROYECTO    NUMERO     PK Y FK

    REGISTRO         NUMERO      PK

    NOMBRE

    FECHA

    FACTURA

    en el form tengo un bindingnavigator, 1 combobox, 3 textboxs, 1 datetimepicker y 1 datagridview

    el combobox lo seteo asi:

    Origen de datos: TABLA_PADREbindingsource

    display member: NOMBRE_PROYECTO

    value member: ID_PROYECTO

    selected value: TABLA_HIJObindingsource.ID_PROYECTO

    Lo que no sé cómo hacer es que al seleccionar el un proyecto en el combobox, filtre el datagridview para trabajar solo sobre ese proyecto, donde al añadir una nueva factura, el campo Registro añada 1, es como tener la autonumeración en sql pero lo hago por código, y que el bindingnavigator también solo contenga los registros de ese DGV filtrado. Los textboxes tiene su binding a la TABLA.HIJO:

    txt1.text = TABLA_HIJObindingsource.REGISTRO

    txt2.text = TABLA_HIJObindingsource.NOMBRE

    txt3.text = TABLA_HIJObindingsource.FACTURA

    datetimepicker1.text = TABLA_HIJObindingsource.FECHA

    Gracias!


    • Editado joyi6388 lunes, 20 de noviembre de 2017 15:43 explicación más acertada
    lunes, 20 de noviembre de 2017 15:42
  • Hola:
    En un Form como el de la imagen que utilizo para el mantenimiento de la siguiente tabla

    DISCO
    ======
    autor          Numero     PK y FK
    numero         Numero     PK
    descripcion    Caracter

    Esta tabla es la equivalente a tu TABLA_HIJO

    > Lo que no sé cómo hacer es que al seleccionar el un proyecto en el combobox, filtre el datagridview para trabajar solo sobre ese proyecto <

    En el groupbox que pone BUSQUEDA, se puede escribir en el TextBox Descripcion y/o seleccionar algo del ComboBox Autor.
    El codigo para buscar seria:

        Private Sub lP_Buscar()
            Dim lbHayFiltro As Boolean = False
            Dim msQuery As String="Select * From DISCO"
            If Me.txtBDescripcion.Text <> "" Then
                msQuery &=" Where DESCRIPCION Like '%" & Me.txtBDescripcion.Text & "%'"
                lbHayFiltro = True
            End If
            If Me.cboBAutor.Text <> "" Then
                If lbHayFiltro = True Then
                    msQuery &= " And "
                Else
                    msQuery &=" Where "
                End If
                msQuery &="AUTOR=" & Cstr(Me.cboBAutor.SelectedValue)
            End If
            msQuery &=" Order By DESCRIPCION"
        End Sub

    Si seleccionas algo del ComboBox Autor, solo tendras registros de ese autor.

    > donde al añadir una nueva factura, el campo Registro añada 1, es como tener la autonumeración en sql pero lo hago por código <

    El codigo para añadir 1 nuevo registro (usando el groupbox que pone DETALLE) seria:

        Private Sub lP_Nuevo()
            Me.txtNumero.Text = ""
            Me.txtDescripcion.Text = ""
            Me.cboAutor.SelectedIndex = -1
        End Sub

    Cuando seleccionas el autor, se desencadena el siguiente evento

        Private Sub cboAutor_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles cboAutor.SelectionChangeCommitted
            Dim lsQuery As String = "Select ISNull(Max(NUMERO),0)+1 As MAXIMO From DISCO WHERE autor=" & Cstr(Me.cboAutor.SelectedValue)
            Using loConexion As New SqlConnection(vsCadConexion)
                Using loComando As New SqlCommand(lsQuery, loConexion)
                    loConexion.Open()
                    Me.txtNumero.Text = Cstr(loComando.ExecuteScalar())
                End Using
            End Using
        End Sub

    Asi se consigue numerar por autor, es decir cada autor tiene su "propia" numeracion

    P.D.
    Adaptalo a tus necesidades

    Un saludo desde Bilbo
    Carlos

    lunes, 20 de noviembre de 2017 20:08
  • Gracias J. Carlos! He estado probando y funciona perfectamente todo entre dos tablas relacionadas. La propia numeración corre sin problemas. Uso Visual Studio 2017 y le asigno los valores al combobox que he detallado arriba. Lo del DataGridView lo solucioné poniendo como DataSource la relación entre la TablaPadre y TablaHijo. Ahora la inquietud es:

    ¿Cómo añado una tercer tabla o un tercer factor que es el Año?

    Con el 2018 acercándose, me gustaría poder incluir la posibilidad de añadir años a la consulta, y así también quedaría como historial todo lo registrado en este 2017. Cómo podría hacer esto? De modo que el 1/enero/2018, los proyectos continúen pero las numeraciones de las facturas volverlas a 0, para que comiencen desde el 1 con la primera factura que llegue.

    Me gustaría tener otro combobox donde seleccionar el año, y supongo que para cada año crearía todos los proyectos nuevamente no? y añadir el campo Año en TablaPadre y TablaHijo y crear la TablaAño.

    O cuál sería la solución? Ya he intentado eso, pero no sé cómo relacionar los combobox con el datagridview.

    Saludos!

    miércoles, 22 de noviembre de 2017 12:52
  • Hola:

    Una cosa es que las numeraciones de los discos dependan del autor, y otra es como se numeran las facturas de una empresa

    Te sugiero que leas  el siguiente enlace
    https://social.msdn.microsoft.com/Forums/es-ES/c893cc45-3680-46f0-a410-655b0b76b75f/ayuda-consecutivo-factura?forum=vbes

    Un saludo desde Bilbo
    Carlos
    miércoles, 22 de noviembre de 2017 20:57