Private Sub btnBaja_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBaja.Click
Dim drv As DataRowView
Dim b As Integer
Try
If MsgBox("¿Esta
usted seguro que desea borrar este registro?",
MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Confirmación de
Baja")
= MsgBoxResult.Yes Then
drv = bs.Current
b = grdResult.CurrentRow.Index
drv.Delete()
End If
dA.Update(ds, Tabla)
grbDetalle.Enabled = False
grdResult.Refresh()
Catch ex As Exception
If Mid(ex.Message, 1, 9) = "ORA-00001" Then
MsgBox("El código COD_ID debe ser único revise los datos e inténtelo
de nuevo", MsgBoxStyle.Critical, "Error al actualizar
los datos")
End If
If Mid(ex.Message, 1, 9) = "ORA-02292" Then
MsgBox("No está
permitido el borrado en cascada, asegúrese que el COD_ID no tiene Sub ID´s
antes de borrarlo", MsgBoxStyle.Critical, "Error al actualizar
los datos")
End If
Recargar()
End Try
End Sub
Botón para las modificaciones
Private Sub btnModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModificar.Click
grbDetalle.Enabled = True
grbBuscar.Enabled = False
End Sub
Botón aceptar, graba las altas, bajas o modificaciones
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceptar.Click
Dim drv As DataRowView
Try
drv = bs.Current
drv("COD_CAMPO1") =
cboLevel1.SelectedValue
drv("COD_CAMPO_SEC2") =
cboLevel2.SelectedValue
Traduce(drv) 'traduce las
descripciones a códigos
bs.EndEdit()
dA.Update(ds, Tabla)
grbBuscar.Enabled = True
grbDetalle.Enabled = False
grdResult.Refresh()
CamposAsociados() 'refresca los
cambios
bolRefrescar = False
Catch ex As Exception
If Mid(ex.Message, 1, 9) = "ORA-00001" Then
MsgBox("El código
COD_ID debe ser único revise los datos e inténtelo de nuevo",
MsgBoxStyle.Critical, "Error al actualizar los datos")
End If
bolRefrescar = True
End Try
End Sub
Botón
cancelar
Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
bs.CancelEdit()
If bolRefrescar Then
Recargar()
End If
grbDetalle.Enabled = False
grbBuscar.Enabled = True
End Sub
Botón recargar
Sub Recargar()
bolRefrescar = False
ds.Tables(0).Clear()
CamposAsociados()
grdResult.Refresh()
End Sub
Finalmente este será el código del botón que llama a la pantalla con las dos combos anidadas que cargará los dos campos asociados.
Public Sub btnPaisDom_Click(sender As Object, e As EventArgs) Handles btnPaisDom.Click
Dim d As New frmNiveles() 'envia los datos del grid al
formulario hijo
d.gID = txtColumna.Text
d.cboLevel1.Text = cboLevel1.Text
d.cboLevel2.Text = cboLevel2.Text
d.cboLevel1.SelectedItem =
cboLevel1.SelectedItem
d.cboLevel2.SelectedItem =
cboLevel2.SelectedItem
d.ShowDialog()
cboLevel1.Text = d.cboLevel1.Text
cboLevel2.Text = d.cboLevel2.Text
If Not d.cboLevel1.SelectedItem Is Nothing Then
txtNivel1.Text =
d.cboLevel1.SelectedItem.clave
End If
If Not d.cboLevel2.SelectedItem Is Nothing Then
txtNivel2.Text =
d.cboLevel2.SelectedItem.clave
End If
d.Close()
End Sub
End Class
Pasamos al código de la pantalla frmNiveles que cargará dos combos anidadas.
Public Class frmNiveles
Public gID As String
Private Sub cboLevel1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles
cboLevel1.SelectedIndexChanged
cboLevel2.Items.Clear()
cboLevel2.Text = ""
frmNiveles.Cargacombo("\CargarCampoAso2.sql", cboLevel2, DirectCast(Me.cboLevel1.SelectedItem, AddItem).Clave.ToString())
btnSeleccionar.Enabled = True
End Sub
Private Sub frmNiveles_Load(sender As Object, e As EventArgs) Handles MyBase.Load
cboLevel1.Items.Clear()
cboLevel1.Text = ""
cboLevel2.Items.Clear()
cboLevel2.Text = ""
frmNiveles.Cargacombo("\CargarCampoAso1.sql", cboLevel1, gID)
btnSeleccionar.Enabled = True
End Sub
Private Sub btnSeleccionar_Click(sender As Object, e As EventArgs) Handles btnSeleccionar.Click
Me.Hide()
End Sub
End Class
El código completo del formulario principal es este:
Imports System.IO
Imports System.Data.OleDb
Imports System.Windows.Forms
Imports System.Data.SqlClient
Public Class frmCamposAsociados
Public gDataSource As String
Dim ds As New DataSet()
Dim bs As BindingSource = New BindingSource()
Dim dA As New OleDb.OleDbDataAdapter
Dim drEdit As DataRowView
Dim bolRefrescar As Boolean
Dim bolPrimeraVez As Boolean = True
Const Tabla = "CamposAsociados"
Private Sub frmCamposaAsociados_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.grdResult.DataSource = bs
txtColumna.MaxLength = 40
CamposAsociados()
btnModificar.Visible =
IIf(ObjetosPermitidos.ContainsKey("btnModificar"), True, False)
btnBaja.Visible =
IIf(ObjetosPermitidos.ContainsKey("btnBaja"), True, False)
btnAlta.Visible =
IIf(ObjetosPermitidos.ContainsKey("btnAlta"), True, False)
cboDataSource.Text = gDataSource
btnCombosAnidadas.Enabled = False
End Sub
Dim tb As DataTable
Dim srSQL As StreamReader
Dim strConsulta As String
Dim cmdbuilder As
OleDbCommandBuilder
tb = New DataTable
'Repeticion si no es la
primera vez es que se ha llamado desde el mantenimiento y antes de cargarse
debe borrarse la grid
If Not bolPrimeraVez Then
ds.Tables("CamposAsociados").Clear()
End If
'***********************
strStartupPath =
My.Application.Info.DirectoryPath
srSQL = New System.IO.StreamReader(strStartupPath & "\CargarCamposAsociados".sql")
strConsulta = srSQL.ReadToEnd
cmdPD = New OleDb.OleDbCommand(strConsulta,
cnxPD)
dA.SelectCommand = cmdPD
cmdbuilder = New OleDbCommandBuilder(dA)
dA.Fill(ds, "CamposAsociados")
If Not bolPrimeraVez Then
Exit Sub
End If
bolPrimeraVez = False
'Codigo nuevo para primer
campo asociado
srSQL = New System.IO.StreamReader(strStartupPath & "\CargarCampoAso1.sql")
strConsulta = srSQL.ReadToEnd
cmdPD = New OleDb.OleDbCommand(strConsulta,
cnxPD)
dA.SelectCommand = cmdPD
dA.Fill(ds, "CampoAso1")
cboLevel1.ValueMember = "COD_CAMPO1"
cboLevel1.DisplayMember = "DES_CAMPO1"
cboLevel1.DataSource = ds.Tables("CampoAso1").DefaultView
'Codigo nuevo para primer
campo asociado
srSQL = New System.IO.StreamReader(strStartupPath & "\CargarCampoAso2.sql")
strConsulta = srSQL.ReadToEnd
cmdPD = New OleDb.OleDbCommand(strConsulta,
cnxPD)
dA.SelectCommand = cmdPD
dA.Fill(ds, "CampoAso2")
cboLevel1.ValueMember = "COD_CAMPO_SEC2"
cboLevel1.DisplayMember = "DES_CAMPO2"
cboLevel1.DataSource = ds.Tables("CampoAso2").DefaultView
'Código para definir las
relaciones con las tablas de los campos asociados ojo notar 'que COD_CAMPO1 se
refiere a una columna de cada tabla, es decir COD_CAMPO1 de Tabla 'Relacionada
y COD_CAMPO1 de tabla principal. Esto en la simulación por código del INNER
'JOIN
ds.Relations.Add("CampoAso1_Relacion", ds.Tables("CampoAso1").Columns("COD_CAMPO1"),
ds.Tables("CamposAsociados").Columns("COD_CAMPO1"))
ds.Relations.Add("CampoAso2_Relacion",ds.Tables("CampoAso2").Columns("COD_CAMPO_SEC2"), ds.Tables("CamposAsociados").Columns("COD_CAMPO_PRINC2"))
Dim oNivel1 As DataColumn = New
DataColumn
oNivel1.DataType = System.Type.GetType("System.String")
oNivel1.ColumnName = "CampoAso1"
oNivel1.Expression = "Parent(CampoAso1_Relacion).DES_CAMPO1"
ds.Tables(Tabla).Columns.Add(oNivel1)
Dim oNivel2 As DataColumn = New
DataColumn
oNivel2.DataType = System.Type.GetType("System.String")
oNivel2.ColumnName = "CampoAso2"
oNivel2.Expression = "Parent(CampoAso2_Relacion).DES_CAMPO2"
ds.Tables(Tabla).Columns.Add(oNivel2)
'Aquí fuerzo de nuevo la
select principal para que no me de error al realizar 'operaciones con el
formulario una vez he cargado el data GridView
dA.SelectCommand = New OleDb.OleDbCommand("SELECT COD_ID,
DES_PRINCIPAL, COD_CAMPO1, COD_CAMPO_PRINC2 FROM
PROPIETARIO.TABLA_PRINCIPAL",
cnxPD)
dA.UpdateCommand =
cmdbuilder.GetUpdateCommand()
dA.DeleteCommand =
cmdbuilder.GetDeleteCommand()
dA.InsertCommand =
cmdbuilder.GetInsertCommand()
Try
bs.DataSource = ds.Tables(Tabla)
'Aquí hacemos el binding de
los campos de la base de datos con los controles del formulario
Me.txtColumna.DataBindings.Add(New
Binding("Text", bs, "COD_ID"))
Me.txtDescripcion.DataBindings.Add(New
Binding("Text", bs, "DES_PRINCIPAL"))
Me.cboLevel1.DataBindings.Add(New
Binding("SelectedValue", bs, "COD_CAMPO1"))
Me.cboLevel2.DataBindings.Add(New
Binding("SelectedValue", bs, "COD_CAMPO_PRINC2"))
grdResult.Columns(0).MinimumWidth =
50
grdResult.Columns(1).MinimumWidth =
50 'Descripcion
grdResult.Columns(2).MinimumWidth =
30 'Campo1
grdResult.Columns(3).MinimumWidth = 200 'Campo2
grdResult.Columns(0).HeaderText = "Identificador"
grdResult.Columns(1).HeaderText = "Descripción"
grdResult.Columns(2).HeaderText = "Campo asociado 1"
grdResult.Columns(3).HeaderText
= "Campo Asociado 2"
'coloca las columnas en la
posición deseada
grdResult.Columns(0).DisplayIndex =
2 'Identificador
grdResult.Columns(1).DisplayIndex =
1 'Descripcion
grdResult.Columns(2).DisplayIndex =
4 'Campo1
grdResult.Columns(3).DisplayIndex =
3 'Campo2
grdResult.Refresh()
Catch ex As Exception
End Try
End Sub
Function BuscarCodigoRelacion() As Integer
Stop
End Function
Private Sub grdResult_RowEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles
grdResult.RowEnter
End Sub
Private Sub btnFiltro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFiltro.Click
Dim strFiltro As String = ""
Dim vwCamposAsociados As
DataView
If txtFiltroColumna.Text <> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "COD_ID LIKE '%" & UCase(txtFiltroColumna.Text) & "%'"
End If
If txtFiltroDescripcion.Text
<> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "DES_PRINCIPAL LIKE '%" & txtFiltroDescripcion.Text & "%'"
End If
If Not ds.Tables("CamposAsociados") Is Nothing Then
vwCamposAsociados =
ds.Tables("CamposAsociados").DefaultView
vwCamposAsociados.RowFilter =
strFiltro
End If
End Sub
Private Sub btnAlta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlta.Click
grbDetalle.Enabled = True
grbBuscar.Enabled = False
btnPaisDom.Enabled = False
drEdit = bs.AddNew()
bs.MoveLast()
grdResult.Refresh()
End Sub
Private Sub btnBaja_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBaja.Click
Dim drv As DataRowView
Dim b As Integer
Try
If MsgBox("¿Esta
usted seguro que desea borrar este registro?",
MsgBoxStyle.YesNo + MsgBoxStyle.Question, "Confirmación de
Baja")
= MsgBoxResult.Yes Then
drv = bs.Current
b = grdResult.CurrentRow.Index
drv.Delete()
End If
dA.Update(ds, Tabla)
grbDetalle.Enabled = False
grdResult.Refresh()
Catch ex As Exception
If Mid(ex.Message, 1, 9) = "ORA-00001" Then
MsgBox("El código
de ID debe ser único revise los datos e inténtelo de nuevo", MsgBoxStyle.Critical,
"Error al actualizar los datos")
End If
If Mid(ex.Message, 1, 9) = "ORA-02292" Then
MsgBox("No está
permitido el borrado en cascada, asegurese que el ID no tiene Sub ID´s antes de
borrarla", MsgBoxStyle.Critical, "Error al actualizar
los datos")
End If
Recargar()
End Try
End Sub
Private Sub btnModificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnModificar.Click
grbDetalle.Enabled = True
grbBuscar.Enabled = False
End Sub
Private Sub btnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAceptar.Click
Dim drv As DataRowView
Try
drv = bs.Current
drv("COD_CAMPO1") =
cboLevel1.SelectedValue
drv("COD_CAMPO_SEC2") =
cboLevel2.SelectedValue
bs.EndEdit()
dA.Update(ds, Tabla)
grbBuscar.Enabled = True
grbDetalle.Enabled = False
grdResult.Refresh()
CamposAsociados() 'refresca los
cambios
bolRefrescar = False
Catch ex As Exception
If Mid(ex.Message, 1, 9) = "ORA-00001" Then
MsgBox("El código
ID debe ser único revise los datos e inténtelo de nuevo",
MsgBoxStyle.Critical, "Error al actualizar los datos")
End If
bolRefrescar = True
End Try
End Sub
Private Sub btnCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelar.Click
bs.CancelEdit()
If bolRefrescar Then
Recargar()
End If
grbDetalle.Enabled = False
grbBuscar.Enabled = True
End Sub
Sub Recargar()
bolRefrescar = False
ds.Tables(0).Clear()
CamposAsociados()
grdResult.Refresh()
End Sub
Private Sub txtCodigo_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
End Sub
Private Sub txtColumna_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtColumna.TextChanged
txtColumna.Text =
UCase(txtColumna.Text)
txtColumna.SelectionStart =
txtColumna.TextLength + 1
txtColumna.MaxLength = 10
End Sub
Sub AplicarFiltro()
Dim strFiltro As String = ""
Dim vw CamposAsociados As
DataView
If txtFiltroColumna.Text <> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "COD_ID LIKE '%" & UCase(txtFiltroColumna.Text) & "%'"
End If
If txtFiltroDescripcion.Text
<> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "DES_PRINCIPAL LIKE '%" & txtFiltroDescripcion.Text & "%'"
End If
If Not ds.Tables("CamposAsociados") Is Nothing Then
vwCamposAsociados =
ds.Tables("CamposAsociados").DefaultView
vwCamposAsociados.RowFilter =
strFiltro
End If
End Sub
Private Sub txtFiltroColumna_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFiltroColumna.TextChanged
AplicarFiltro()
End Sub
Private Sub txtFiltroDescripcion_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFiltroFormato.TextChanged
AplicarFiltro()
End Sub
Public Sub btnPaisDom_Click(sender As Object, e As EventArgs) Handles btnPaisDom.Click
Dim d As New frmNiveles() 'envia los datos del grid al
formulario hijo
d.gID = txtColumna.Text
d.cboLevel1.Text = cboLevel1.Text
d.cboLevel2.Text = cboLevel2.Text
d.cboLevel1.SelectedItem =
cboLevel1.SelectedItem
d.cboLevel2.SelectedItem =
cboLevel2.SelectedItem
d.ShowDialog()
cboLevel1.Text = d.cboLevel1.Text
cboLevel2.Text = d.cboLevel2.Text
If Not d.cboLevel1.SelectedItem Is Nothing Then
txtNivel1.Text =
d.cboLevel1.SelectedItem.clave
End If
If Not d.cboLevel2.SelectedItem Is Nothing Then
txtNivel2.Text =
d.cboLevel2.SelectedItem.clave
End If
d.Close()
End Sub
End Class