Antes de nada tenemos que tener nuestro JSON almacenado en una base de datos. En este caso en lugar de almacenar toda la cadena JSON en un campo, hemos optado por almacenar cada nodo en una fila de la base de datos, de tal forma que cada fila deberá saber quien es su nodo padre.
La tabla empleada es de este tipo.
Debemos tener un código para cada nodo y otro para saber quien es el nodo padre, en otra columna almacenaremos los nombres de los nodos, y sus valores si los tienen. Como extra hemos añadido si son campos mandatory, o es un array.
Leerlo desde la Base de datos y cargarlo en un Datagrid es bastante sencillo.
Creamos una pantalla de mantenimiento del DataGrid de este estilo.
Este sería el Form_Load
Imports System.IO
Imports System.Data.OleDb
Imports System.Windows.Forms
Imports System.Data.SqlClient
Dim bolPrimeraVez As Boolean
Private Sub frmMantenimientoJSON_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.grdResult.DataSource = bs
txtNodo.MaxLength = 40
DefinicionJSON()
Dim ObjetosPermitidos As Dictionary(Of String, String)
ObjetosPermitidos = ComprobarPermisos(Me.Name)
btnModificar.Visible =
IIf(ObjetosPermitidos.ContainsKey("btnModificar"), True, False)
btnBaja.Visible =
IIf(ObjetosPermitidos.ContainsKey("btnBaja"), True, False)
btnAlta.Visible = IIf(ObjetosPermitidos.ContainsKey("btnAlta"), True, False)
End Sub
Aqui es donde lee de BBDD y lo pasa a un DataViewGrid (El DataGrid de la pantalla se llama grdresult).
Sub DefinicionJSON()
' Dim dA As New OleDb.OleDbDataAdapter
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("DefinicionJSON").Clear()
End If
''***********************
strStartupPath = My.Application.Info.DirectoryPath
srSQL = New System.IO.StreamReader(strStartupPath & "\CargarEsquemaJSON.sql")
strConsulta = srSQL.ReadToEnd
cmdPD = New OleDb.OleDbCommand(strConsulta, cnxPD)
dA.SelectCommand = cmdPD
cmdbuilder = New OleDbCommandBuilder(dA)
dA.Fill(ds, "DefinicionJSON")
If Not bolPrimeraVez Then
Exit Sub
End If
bolPrimeraVez = False
dA.UpdateCommand =
cmdbuilder.GetUpdateCommand()
dA.DeleteCommand =
cmdbuilder.GetDeleteCommand()
dA.InsertCommand =
cmdbuilder.GetInsertCommand()
bs.DataSource = ds.Tables(Tabla)
Me.txtNodo.DataBindings.Add(New Binding("Text", bs, "COD_NODO_JSO"))
Me.TxtNombreNodo.DataBindings.Add(New Binding("Text", bs, "DES_NODE"))
Me.TxtNodoPadre.DataBindings.Add(New Binding("Text", bs, "COD_NODO_PAR"))
Me.CboMandatory.DataBindings.Add(New Binding("Text", bs, "XTI_MANDATOR"))
Me.CboReadOnly.DataBindings.Add(New Binding("Text", bs, "XTI_READ_ONL"))
Me.txtUsuAuditoria.DataBindings.Add(New Binding("Text", bs, "AUD_USUARIO"))
Me.txtFechaAuditoria.DataBindings.Add(New Binding("Text", bs, "AUD_TIM"
grdResult.Columns(0).MinimumWidth = 100
grdResult.Columns(1).MinimumWidth = 100
grdResult.Columns(2).MinimumWidth = 100
grdResult.Columns(3).MinimumWidth = 30
grdResult.Columns(4).MinimumWidth = 30
grdResult.Columns(5).MinimumWidth = 100
grdResult.Columns(6).MinimumWidth = 100
grdResult.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
grdResult.Columns(0).HeaderText = "Cod. Nodo"
grdResult.Columns(1).HeaderText = "Nombre Nodo"
grdResult.Columns(2).HeaderText = "Cod. Nodo Padre"
grdResult.Columns(3).HeaderText = "Mandatory"
grdResult.Columns(4).HeaderText = "Sólo lectura"
grdResult.Columns(5).HeaderText = "Usuario
Auditoria"
grdResult.Columns(6).HeaderText = "Fecha Auditoria"
grdResult.Refresh()
End Sub
La SQL vendrá en el proyecto como CargarEsquemaJSON.sql y será una SELECT de este estilo:
SELECT
COD_NODO_JSO, DES_NODE, COD_NODO_PAR, XTI_MANDATOR, XTI_READ_ONL, AUD_USUARIO, AUD_TIM, DES_VALUE,XTI_ARRAY
FROM PROPIETARIO.TJSO order by COD_NODO_JSO
Imports System.IO
Imports System.Data.OleDb
Imports System.Windows.Forms
Imports System.Data.SqlClient
Public Class frmMantenimientoJSON
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 = "DefinicionJSON"
Enum Accion
Alta = 1
Baja = 2
Modificacion = 3
End Enum
Dim TipoAccion As Accion
Private Sub frmMantenimientoJSON_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.grdResult.DataSource = bs
txtNodo.MaxLength = 40
DefinicionJSON()
Dim ObjetosPermitidos As Dictionary(Of String, String)
ObjetosPermitidos = ComprobarPermisos(Me.Name)
btnModificar.Visible =
IIf(ObjetosPermitidos.ContainsKey("btnModificar"), True, False)
btnBaja.Visible =
IIf(ObjetosPermitidos.ContainsKey("btnBaja"), True, False)
btnAlta.Visible =
IIf(ObjetosPermitidos.ContainsKey("btnAlta"), True, False)
End Sub
Sub DefinicionJSON()
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("DefinicionJSON").Clear()
End If
''***********************
strStartupPath = My.Application.Info.DirectoryPath
srSQL = New System.IO.StreamReader(strStartupPath & "\CargarEsquemaJSON.sql")
strConsulta = srSQL.ReadToEnd
cmdPD = New OleDb.OleDbCommand(strConsulta, cnxPD)
dA.SelectCommand = cmdPD
cmdbuilder = New OleDbCommandBuilder(dA)
dA.Fill(ds, "DefinicionJSON")
If Not bolPrimeraVez Then
Exit Sub
End If
bolPrimeraVez = False
dA.UpdateCommand =
cmdbuilder.GetUpdateCommand()
dA.DeleteCommand =
cmdbuilder.GetDeleteCommand()
dA.InsertCommand =
cmdbuilder.GetInsertCommand()
bs.DataSource = ds.Tables(Tabla)
Me.txtNodo.DataBindings.Add(New Binding("Text", bs, "COD_NODO_JSO"))
Me.TxtNombreNodo.DataBindings.Add(New Binding("Text", bs, "DES_NODE"))
Me.TxtNodoPadre.DataBindings.Add(New Binding("Text", bs, "COD_NODO_PAR"))
Me.CboMandatory.DataBindings.Add(New Binding("Text", bs, "XTI_MANDATOR"))
Me.CboReadOnly.DataBindings.Add(New Binding("Text", bs, "XTI_READ_ONL"))
Me.txtUsuAuditoria.DataBindings.Add(New Binding("Text", bs, "AUD_USUARIO"))
Me.txtFechaAuditoria.DataBindings.Add(New Binding("Text", bs, "AUD_TIM"))
grdResult.Columns(0).MinimumWidth = 100
grdResult.Columns(1).MinimumWidth = 100
grdResult.Columns(2).MinimumWidth = 100
grdResult.Columns(3).MinimumWidth = 30
grdResult.Columns(4).MinimumWidth = 30
grdResult.Columns(5).MinimumWidth = 100
grdResult.Columns(6).MinimumWidth = 100
grdResult.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
grdResult.Columns(0).HeaderText = "Cod. Nodo"
grdResult.Columns(1).HeaderText = "Nombre Nodo"
grdResult.Columns(2).HeaderText = "Cod. Nodo Padre"
grdResult.Columns(3).HeaderText = "Mandatory"
grdResult.Columns(4).HeaderText = "Sólo lectura"
grdResult.Columns(5).HeaderText = "Usuario Auditoria"
grdResult.Columns(6).HeaderText = "Fecha Auditoria"
grdResult.Refresh()
End Sub
Private Sub btnFiltro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFiltro.Click
Dim strFiltro As String = ""
Dim vwDefinicionJSON As DataView
If txtFiltroNodo.Text <> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "COD_NODO_JSO LIKE
'%" & txtFiltroNodo.Text
& "%'" '
Name LIKE '%jo%'"
End If
If txtFiltroNombreNodo.Text <> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "DES_NODE LIKE
'%" &
txtFiltroNombreNodo.Text & "%'" '
Name LIKE '%jo%'"
End If
If txtFiltroNodoPadre.Text <> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "COD_NODO_PAR LIKE
'%" & txtFiltroNodoPadre.Text
& "%'" '
Name LIKE '%jo%'"
End If
If Not ds.Tables("DefinicionJSON") Is Nothing Then
vwDefinicionJSON = ds.Tables("DefinicionJSON").DefaultView
vwDefinicionJSON.RowFilter =
strFiltro
End If
End Sub
Private Sub btnAlta_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAlta.Click
TipoAccion = Accion.Alta
grbDetalle.Enabled = True
grbBuscar.Enabled = False
drEdit = bs.AddNew()
bs.MoveLast()
txtUsuAuditoria.Text = Environment.UserName
txtFechaAuditoria.Text = Now
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
TipoAccion = Accion.Baja
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 Nodo
debe ser único revise los datos e intentelo 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 nodo no tiene Sub-nodos antes de
borrarlo", 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
TipoAccion = Accion.Modificacion
grbDetalle.Enabled = True
grbBuscar.Enabled = False
txtUsuAuditoria.Text = Environment.UserName
txtFechaAuditoria.Text = Now
End Sub
Private Sub btnAceptar_Click(sender As Object, e As EventArgs) Handles btnAceptar.Click
Dim drv As DataRowView
Try
drv = bs.Current
bs.EndEdit()
dA.Update(ds, Tabla)
grbBuscar.Enabled = True
grbDetalle.Enabled = False
grdResult.Refresh()
DefinicionJSON() 'refresca los cambios
bolRefrescar = False
Catch ex As Exception
If Mid(ex.Message, 1, 9) = "ORA-00001" Then
MsgBox("El código de nodo
debe ser único revise los datos e intentelo 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(1).Clear()
ds.Tables(0).Clear()
DefinicionJSON()
grdResult.Refresh()
End Sub
Private Sub txtColumna_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtNodo.TextChanged
txtNodo.MaxLength = 8
End Sub
Sub AplicarFiltro()
Dim strFiltro As String = ""
Dim vwDefinicionJSON As DataView
If txtFiltroNodo.Text <> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "COD_NODO_JSO LIKE
'%" & txtFiltroNodo.Text
& "%'" '
Name LIKE '%jo%'"
End If
If txtFiltroNombreNodo.Text <> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "DES_NODE LIKE
'%" &
txtFiltroNombreNodo.Text & "%'" '
Name LIKE '%jo%'"
End If
If txtFiltroNodoPadre.Text <> "" Then
If Not strFiltro = "" Then
strFiltro = strFiltro & " AND "
End If
strFiltro = strFiltro & "COD_NODO_PAR LIKE
'%" & txtFiltroNodoPadre.Text
& "%'" '
Name LIKE '%jo%'"
End If
If Not ds.Tables("DefinicionJSON") Is Nothing Then
vwDefinicionJSON = ds.Tables("DefinicionJSON").DefaultView
vwDefinicionJSON.RowFilter =
strFiltro
End If
End Sub
Private Sub txtFiltroNombre_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFiltroNodo.TextChanged
AplicarFiltro()
End Sub
Private Sub txtFiltroNombre_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFiltroNodo.Validated
'
AplicarFiltro()
End Sub
Private Sub txtFiltroDescripcion_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtFiltroNodoPadre.TextChanged
AplicarFiltro()
End Sub
Private Sub cboFiltroAmbito_Validated(ByVal sender As Object, ByVal e As System.EventArgs)
AplicarFiltro()
End Sub
Private Sub txtFiltroTipo_TextChanged(sender As Object, e As EventArgs) Handles txtFiltroNombreNodo.TextChanged
AplicarFiltro()
End Sub
Private Sub grbFiltro_Enter(sender As Object, e As EventArgs) Handles grbFiltro.Enter
End Sub
Private Sub btnJSON_Click(sender As Object, e As EventArgs) Handles btnJSON.Click
Dim d As New frmParseoJSON() 'envia
los datos del grid al formulario hijo
d.ShowDialog()
d.WindowState = FormWindowState.Normal
End Sub
End Class
No hay comentarios:
Publicar un comentario