elmaf08
Usuario (Colombia)

¿Que es un arreglo de dos dimensiones? Un arreglo de dos dimensiones es una colección de datos para una misma variable en dos dimensiones comúnmente llamados renglones y columnas. Arreglo 12 -4 0 28 -3 -3 -5 2 189 -2 1 0 9 -4 12 Para poder guardar un valor u obtener alguno del arreglo de dos dimensiones (también llamado matriz) es ahora necesario utilizar dos dimensiones, el renglón y la columna. Declaración de arreglos de dos dimensiones Para declarar un arreglo de dos dimensiones se utiliza el siguiente formato: tipo nombre_arreglo [][] = new tipo[ numero renglones][ numero columnas]; donde tipo es el tipo de los datos que almacenará el arreglo de dos dimensiones. Es importante recordar que se pueden declarar arreglos de los tipos primitivos de Java (int, double, char, etc) o bien de tipos definidos por el usuario (Cuenta, Alumno, etc). Tamaño representa la cantidad de casillas que se reservan para el arreglo. En Java todos los arreglos empiezan en el subíndice 0 y llegan al subíndice tamaño-1. Por ejemplo: int arr[][] = new int ; // arreglo de 5 renglones y 6 columnas enteros char cad[][] = new char[10] ; // arreglo de 10 renglones por 5 columnas tipo carácter Uso e inicialización de los elementos del arreglo de dos dimensiones Para usar los elementos individuales de un arreglo se usa el siguiente formato: arreglo[subíndice-renglon] [subíndice-columna] Como un elemento de un arreglo de dos dimensiones es también un dato, se puede usar como cualquier variable de ese tipo, debemos recordar que tanto el índice de renglón como el índice de columna toman como base el primer elemento cero: int arr[][] = new int ; arr[4] = 12; arr[1][0]= Integer.parseInt(t1.getText()); t2.setText("" + arr[0][1]); arr[0][0] = arr[0][1] + arr[0]; int k = 2; int l = 3 arr[k+1] = 20; Ejemplo: En este siguiente ejemplo, tenemos una aplicación que define un arreglo de enteros de dos dimensiones, con 3 renglones y 5 columnas, y los inicializa con el valor de 1 a 15, de acuerdo a cada renglón, empezando por 1 en el renglón 1, luego por 6 en el renglón 2 y 11 en el renglón 3. Después de inicializar la matriz, la despliega, desplegando los valores de un mismo renglón en la misma línea, como lo muestra la figura: La aplicación es como se muestra a continuación: public class AplicacionMatrices1 { public static void main(String[] args) { int arreglo[][] = new int ; for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { arreglo = i*5+j+1; } } for (int i=0; i<3; i++) { for (int j=0; j<5; j++) { System.out.print(" " + arreglo + " "; } System.out.println(); } } } Inicializar matriz en la declaración En Java es posible inicializar una matriz al declararla, tal y como sucede con los arreglos; esto se hace sin definir el número de renglones y columnas, colocando un operador de asignación y después entre llaves la lista de valores para cada renglón del arreglo, el arreglo separando con llaves para cada valor por columna, separado por comas, veamos los siguientes ejemplos: double arreglo[][] = { {3.5, 5.4, -2.3 }, {22.3, 78.5, -9.4}}; char cadena[][] = {{‘a’, ‘g’, ‘u’, ‘a’}, {‘r’, ‘o’, ‘j’, ‘a’}} ; En Java es posible saber el número de renglones de una matriz, solo escribiendo el nombre de la matriz un punto y la palabra length, también se puede saber el número de elementos de un renglón, dando el nombre del arreglo , el renglón entre corchetes y un punto y la palabra length, como se muestra en el siguiente ejemplo: public class AplicacionMatrices2 { public static void main(String[] args) { int arreglo[][] = {{1,2,3}, {4,5,6}, {7,8,9}}; for (int i=0; i<arreglo.length; i++) { for (int j=0; j<arreglo[0].length; j++) { System.out.print(" " + arreglo + " "; } System.out.println(); } } } El cual al ejecutar mostrará lo siguiente: Es importante observar como se escriben los renglones por columna, recordando que se utiliza el print() para desplegar el valor, esto permitirá no cambiar de renglón, pero tampoco saldrá a la pantalla hasta encontrar un println(), el cual se hace después del ciclo de adentro que despliega todos los renglones de una columna. Ahora vamos a observar como se pueden introducir los datos para meterlos a una matriz en una aplicación, debemos observar que hay un nuevo objeto que es creado que lo hemos llamado in, por input, ya que es un objeto que es de entrada de datos, este objeto es de la clase BufferedReader, la cual nos ayuda a tomar datos en forma de carácter de un InputStreamReader, el cual toma todo los datos que vienen de consola al usar System.in, observemos la aplicación: import java.io.*; public class AplicacionMatrices3 { public static void main(String[] args) throws IOException { int arreglo[][] = new int; // definiendo un objeto de entrada para tomar datos del teclado BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // pidiendo los datos del teclado for (int i=0; i<arreglo.length; i++) { for (int j=0; j<arreglo[0].length; j++) { System.out.print("Da elemento " + (i+1)+ " , " + (j+1) + " : "; arreglo = Integer.parseInt(in.readLine()); } System.out.println(); } //desplegando los valores por renglon for (int i=0; i<arreglo.length; i++) { for (int j=0; j<arreglo[0].length; j++) { System.out.print(" " + arreglo + " "; } System.out.println(); } } } La cual se visualiza asi: Esta aplicación utiliza primero un ciclo anidado (un ciclo dentro de otro ciclo) para pedir los datos, utilizando para ello el objeto in, el objeto in no se te explicará en este momento su uso, solo debes utilizar el objeto tal y como esta declarado y cada vez que quieras leer algo del teclado utilizar in.readLine(), esto substituye al t.getText() de un applet, por eso tenemos arreglo = Integer.parseInt(in.readLine()); ya que estamos tomando lo que se leyo del teclado, se pasa a entero, ayudándonos por la clase Integer y finalmente se asigna esto en la matriz arreglo dentro del renglón (i-1) columna (j-1). Usando mal los Índices Al igual que en un arreglo, cuando utilizamos mal los índices de una matriz, Java arroja un error de ejecución llamado de excepción, el cual es ArrayIndexOutOfBoundsException, debemos tener cuidado en esto, pues la aplicación se cancela y no continua, como se muestra en la siguiente aplicación: import java.io.*; public class AplicacionMatrices4 { public static void main(String[] args) throws IOException { int arreglo[][] = new int; // definiendo un objeto de entrada para tomar datos del teclado BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); // pidiendo los datos del teclado for (int i=0; i<arreglo.length; i++) { for (int j=0; j<arreglo[0].length; j++) { System.out.print("Da elemento " + (i+1)+ " , " + (j+1) + " : "; arreglo = Integer.parseInt(in.readLine()); } System.out.println(); } //desplegando los valores por renglon for (int i=0; i<4; i++) { for (int j=0; j<3; j++) { System.out.print(" " + arreglo + " "; } System.out.println(); } } } La ejecución que muestra la aplicación es: Podemos observar como la aplicación alcanza a mostrar todos los renglones desplegados, pero como queremos continuar con el renglón 3, el cual no existe pues el último fue 2 (empezando en cero), arroja la excepción ArrayIndexOutofBoundsException.

________________________________________ En esta ocasión veremos la manera de mostrar un reporte sencillo. La apariencia final de nuestra aplicación será la siguiente: Al presionar el botón Imprimir, se abrirá la siguiente pantalla: Nuestro proyecto de llama proReportes, y deberá quedar organizado de la siguiente manera: Utilizamos una base de datos llamada dbPrac.mdb, la cual contiene una tabla llamada CAT_CLIENTES. En el archivo adjunto viene tal base de datos. Por adelantado te digo que esta conformada (la tabla) de la siguiente manera: Campo Tipo Descripción ID_CLIENTE TEXTO Campo llave PATERNO Texto Apellido paterno MATERNO Texto Apellido materno NOMBRE Texto Nombre RFC Texto RFC DIRECCION Texto Dirección TELEFONO Texto Telefono LIM_CRED Doble Límite de crédito Al formulario frmCatClientes, le agregamos 8 TextBox y 8 Label, con las siguientes características: Objeto(nombre) Tipo Propiedad Valor txtID_CLIENTE TextBox Text (vacío) txtPATERNO TextBox Text (vacío) txtMATERNO TextBox Text (vacío) txtNOMBRE TextBox Text (vacío) txtRFC TextBox Text (vacío) txtDIRECCION TextBox Text (vacío) txtTELEFONO TextBox Text (vacío) txtLIM_CRED TextBox Text (vacío) lblID_CLIENTE Label Text Clave lblPATERNO Label Text Paterno: lblMATERNO Label Text Materno: lblNOMBRE Label Text Nombre: lblRFC Label Text RFC lblDIRECCION Label Text Dirección: lblTELEFONO Label Text Teléfono: lblLIM_CRED Label TExt Límite de crédito Images ImageList barBotones ToolBar Agrega imágenes al ImageList y botones al ToolBar (que se parezcan a las arriba mostradas). En el archivo adjunto incluiré las imágenes (en realidad son iconos) que utilice para este ejemplo. Agrega también un MainMenu como se muestra: Al formulario frmReportes, agrega un CrystalReportViewer y ponle como nombre crvReportes, y el la propiedad Dock del Viewer selecciona Fill. El formulario debe quedar como se muestra: Ahora agregaremos un DataSet, este nos servirá para enlazar nuestro reporte con los datos. Pon mucha atención a lo que a continuación se muestra: 1. Agrega un nuevo elemento(DataSet ): Aparece algo como lo siguiente: 2. Selecciona Explorador de Servidores. 3. Con el botón derecho del mouse, sobre Conexiones de datos, selecciona Agregar conexión... 4. Conéctate a la base de datos de Access: 5. Después de lo anterior, aparece (más o menos) así el Explorador de servidores: 6. Expande la conexión (tal como se muestra en la figura) y arrastra la tabla CAT_CLIENTES como se muestra: 7. Cierra el Explorador de servidores, graba los cambios y ¡listo!, terminamos el DataSet. Ahora crearemos nuestro reporte: 1. Agrega un nuevo elemento al proyecto (CrystalReports ). Pon el nombre rptCatClientes y presiona Abrir: 2. Selecciona Mediante el asistente de informes y presiona Aceptar: 3. Expande como se muestra a continuación: 4. Selecciona la tabla CAT_CLIENTES y presiona el botón Insertar tabla. Presiona Siguiente. 5. Agrega todos los campos (con el botón Agregar). Ve a la casilla Estilo, escribe el título del reporte (Catalogo de Clientes) y presiona Finalizar. Ahora vamos a programar ... Código: Primero el código de clsMain: Public Class clsMain ''Esta es la cadena de conexión ''Es necesaria para obtener conectividad con la base de datos Public CnnStr As String = _ "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=..DatadbPrac.mdb;" & _ "Persist Security Info=False " End Class Después del código del formulario (frmCatClientes): ''Programador: JUAN GABRIEL CASTILLO TURRUBIATES(poner tu nombre) '' las instrucciones Imports, van antes de cualquier otra instrucción Imports System.Data.OleDb Imports CrystalDecisions.CrystalReports.Engine Public Class frmCatClientes Inherits System.Windows.Forms.Form ''una instancia a la clase clsMain Dim miClsMain As New clsMain() ''Declaramos una conexión Dim cnnCatClientes As New OleDbConnection(miClsMain.CnnStr) ''Declaramos un Comando Dim cmdCatClientes As New OleDbCommand("SELECT * " & _ "FROM CAT_CLIENTES", cnnCatClientes) ''Declaramos un Data Adapter Dim daCatClientes As New OleDbDataAdapter(cmdCatClientes) ''Un DataSet Dim dsCatClientes As New DataSet() ''''y por último, el importantísimo Command Builder Dim cbCatClientes As New OleDbCommandBuilder(daCatClientes) Private Sub frmCatClientes_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Inicializar() HabilitaBotones(True) HabilitaCaptura(False) End Sub Private Sub Imprimir() Try 'Código para mostrar el reporte 'Lo primero que hacemos es declarar una instancia 'del data set dsRepCatClientes Dim mi_dsRepCatclientes As New dsRepCatClientes() 'Lo llenamos con el contenido de la tabla CAT_CLIENTES daCatClientes.Fill(mi_dsRepCatclientes, "CAT_CLIENTES" 'Declaramos una instancia del Reporte Dim mi_rptCatClientes As New rptCatClientes() 'Le indicamos al reporte que tome los datos 'del DataSet mi_rptCatClientes.SetDataSource(mi_dsRepCatclientes) 'Delcaramos una instancia del formulario frmReprotes Dim miForma As New frmReportes() 'Le indicamos que debe mostrar mi_rptCatClientes miForma.crvReportes.ReportSource = mi_rptCatClientes 'que muestre el titulo "Reporte de Clientes" miForma.Text = "Reporte de Clientes" 'Mostramos el formulario (el cual contiene el reporte) miForma.Show() Catch ex As Exception MessageBox.Show(ex.Message, "Imprimir", _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub Private Function BuscarRegistro(ByVal prmPos As Integer) As Integer 'Código para buscar un registro 'Recibe como parámetro la posición actual en el DataSet 'para, en el caso de no encontrar el registro solicitado, 'regresar la posición del registro antes de iniciar. 'Lo que hace este procedimiento es 'regresar la posición en la que se encuentra el registro 'solicitado, en caso de no encontrarlo, regresa la posición 'antes de iniciar la búsqueda Try Dim dvCatClientes As DataView = _ New DataView(dsCatClientes.Tables(0), "", _ "ID_CLIENTE", DataViewRowState.CurrentRows) 'Declaramos varID_CLIENTE Dim varID_CLIENTE As String = "" 'Preguntamos la clave del cliente que se desea buscar varID_CLIENTE = InputBox("Introduce la clave a buscar", "Buscar" If Not varID_CLIENTE = "" Then 'Regresamos el index del cliente encontrado Return dvCatClientes.Find(varID_CLIENTE) Exit Function Else 'Si no se especificó el cliente, regresamos la 'posición (index) del cliente original(prmPos) MessageBox.Show("La búsqueda no se puede realizar", _ "Información del sistema", MessageBoxButtons.OK, _ MessageBoxIcon.Information) Return prmPos Exit Function End If Catch ex As Exception 'En caso de error, suponiendo que no se encontró el cliente, 'regresamos la posición original del cliente(prmPos) MessageBox.Show(ex.Message, "Error", _ MessageBoxButtons.OK, MessageBoxIcon.Error) Return prmPos Exit Function End Try End Function Private Sub Actualizar() Try dsCatClientes.Clear() 'Limpiar el DataSet daCatClientes.Fill(dsCatClientes, "CAT_CLIENTES" Catch ex As Exception MessageBox.Show(ex.Message, "Información del sistema", _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub Private Sub Inicializar() Try With cnnCatClientes ''Verificamos el estado de la conexión If .State = 1 Then 'si esta abierta .Close() 'cerramos End If .Open() '' abrimos la conexión End With ''Cargamos el DataSet Con los datos de La tabla daCatClientes.Fill(dsCatClientes, "CAT_CLIENTES" ''Enlazamos los Objetos txtID_CLIENTE.DataBindings.Add("Text", dsCatClientes, _ "CAT_CLIENTES.ID_CLIENTE" txtPATERNO.DataBindings.Add("Text", dsCatClientes, _ "CAT_CLIENTES.PATERNO" txtMATERNO.DataBindings.Add("Text", dsCatClientes, _ "CAT_CLIENTES.MATERNO" txtNOMBRE.DataBindings.Add("Text", dsCatClientes, _ "CAT_CLIENTES.NOMBRE" txtRFC.DataBindings.Add("Text", dsCatClientes, _ "CAT_CLIENTES.RFC" txtDIRECCION.DataBindings.Add("Text", dsCatClientes, _ "CAT_CLIENTES.DIRECCION" txtTELEFONO.DataBindings.Add("Text", dsCatClientes, _ "CAT_CLIENTES.TELEFONO" txtLIM_CRED.DataBindings.Add("Text", dsCatClientes, _ "CAT_CLIENTES.LIM_CRED" Catch ex As Exception ''Esto ocurriría solo en el caso de que ocurra un error MessageBox.Show(ex.Message, "Info del Sistema", _ MessageBoxButtons.OK, MessageBoxIcon.Error) End Try End Sub Private Sub Grabar() Try 'Indicamos que termine la edición actual Me.BindingContext(dsCatClientes, _ "CAT_CLIENTES".EndCurrentEdit() 'Actializamos la Base de datos daCatClientes.Update(dsCatClientes, "CAT_CLIENTES" HabilitaBotones(True) HabilitaCaptura(False) Catch ex As Exception MsgBox(ex.Source & "; " & ex.Message, _ MsgBoxStyle.OKOnly, "Ocurrió un error" End Try End Sub Private Sub Nuevo() Try 'Indicamos que termine la edición actual Me.BindingContext(dsCatClientes, _ "CAT_CLIENTES".EndCurrentEdit() 'Preparamos al DataSet para aceptar un Registro nuevo Me.BindingContext(dsCatClientes, "CAT_CLIENTES".AddNew() HabilitaBotones(False) HabilitaCaptura(True) Catch ex As Exception MsgBox(ex.Source & "; " & ex.Message) End Try End Sub Private Sub Eliminar() ''Este procedimiento es el encargado de eliminar un registro. ''Lo que hacemos es obtener la posición en la que nos encontramos ''Y después eliminamos el registro que se encuentra en esa posición ''Otra manera de eliminar seria ejecutar una instrucción SQL que ''elimine el registro (de acuerdo con la ID_CLIENTE) ''y después ejecutar el procedimiento Inicializar. Dim Resp As String Try Resp = MsgBox("¿Esta seguro de eliminar el registro? " & _ vbCrLf & "Nota: Eliminar registros puede perjudicar " & _ "la ejecución.", MsgBoxStyle.OKCancel, "Eliminar Registro" If Resp = vbOK Then Dim Registro As Integer Registro = Me.BindingContext(dsCatClientes, _ "CAT_CLIENTES".Position Me.BindingContext(dsCatClientes, _ "CAT_CLIENTES".EndCurrentEdit() Me.BindingContext(dsCatClientes, _ "CAT_CLIENTES".RemoveAt(Registro) daCatClientes.Update(dsCatClientes, "CAT_CLIENTES" Me.BindingContext(dsCatClientes, _ "CAT_CLIENTES".Position = 0 End If Catch ex As Exception MsgBox(ex.Source & "; " & ex.Message, _ MsgBoxStyle.OKOnly, "Ocurrió un error" End Try End Sub Private Sub Cancelar() Try 'Cancelamos Me.BindingContext(dsCatClientes, _ "CAT_CLIENTES".CancelCurrentEdit() HabilitaBotones(True) HabilitaCaptura(False) Catch ex As Exception MsgBox(ex.Source & "; " & ex.Message, _ MsgBoxStyle.OKOnly, "Ocurrió un error" End Try End Sub Private Sub HabilitaBotones(ByVal Habilitar As Boolean) btnInicio.Enabled = Habilitar btnAnterior.Enabled = Habilitar btnSiguiente.Enabled = Habilitar btnFinal.Enabled = Habilitar btnNuevo.Enabled = Habilitar mnuNuevo.Enabled = Habilitar btnModificar.Enabled = Habilitar mnuModificar.Enabled = Habilitar btnEliminar.Enabled = Habilitar mnuEliminar.Enabled = Habilitar btnBuscar.Enabled = Habilitar mnuBuscar.Enabled = Habilitar btnActualizar.Enabled = Habilitar btnImprimir.Enabled = Habilitar btnGrabar.Enabled = Not Habilitar mnuGrabar.Enabled = Not Habilitar btnCancelar.Enabled = Not Habilitar mnuCancelar.Enabled = Not Habilitar btnSalir.Enabled = Habilitar mnuSalir.Enabled = Habilitar End Sub Private Sub HabilitaCaptura(ByVal Habilitar As Boolean) txtID_CLIENTE.Enabled = Habilitar txtPATERNO.Enabled = Habilitar txtMATERNO.Enabled = Habilitar txtNOMBRE.Enabled = Habilitar txtRFC.Enabled = Habilitar txtDIRECCION.Enabled = Habilitar txtTELEFONO.Enabled = Habilitar txtLIM_CRED.Enabled = Habilitar End Sub Private Sub barBotones_ButtonClick(ByVal sender As System.Object, _ ByVal e As System.Windows.Forms.ToolBarButtonClickEventArgs) _ Handles barBotones.ButtonClick Select Case barBotones.Buttons.IndexOf(e.Button) Case Is = 0 Try Me.BindingContext(dsCatClientes, "CAT_CLIENTES".Position = 0 Catch ex As Exception MsgBox(ex.Source & "; " & ex.Message) End Try Case Is = 1 Try Me.BindingContext(dsCatClientes, "CAT_CLIENTES".Position -= 1 Catch ex As Exception MsgBox(EX.Source & "; " & EX.Message) End Try Case Is = 2 Try Me.BindingContext(dsCatClientes, "CAT_CLIENTES".Position += 1 Catch ex As Exception MsgBox(EX.Source & "; " & EX.Message) End Try Case Is = 3 Try Me.BindingContext(dsCatClientes, "CAT_CLIENTES".Position = _ Me.BindingContext(dsCatClientes, "CAT_CLIENTES".Count - 1 Catch ex As Exception MsgBox(EX.Source & "; " & EX.Message) End Try Case Is = 6 Nuevo() Case Is = 7 'Modificar HabilitaBotones(False) HabilitaCaptura(True) Case Is = 8 Eliminar() Case Is = 9 'Buscar registro Me.BindingContext(dsCatClientes, "CAT_CLIENTES".Position = _ BuscarRegistro(Me.BindingContext(dsCatClientes, "CAT_CLIENTES".Position) Case Is = 10 Actualizar() Case Is = 11 Imprimir() Case Is = 12 Grabar() Case Is = 13 Cancelar() Case Is = 14 'Salir(cerrar el formulario) Me.Close() End Select End Sub End Class Cualquier duda o comentario, mandame un mail a [email protected] ________________________________________ Espacios de nombres usados en el código de este artículo: System.Data.OleDb CrystalDesisions.CrystalReports.Engine ________________________________________ Fichero con el código de ejemplo: TheKin_proReportes.zip - 44 KB