1 00:00:00,000 --> 00:00:02,359 yo creo que más probable es la tuya 2 00:00:02,359 --> 00:00:02,859 venga 3 00:00:02,859 --> 00:00:06,740 no, porque vosotros 4 00:00:06,740 --> 00:00:08,580 sois muy buenos, vale, habíamos puesto 5 00:00:08,580 --> 00:00:10,480 recordáis para habilitar, para ponerlo 6 00:00:10,480 --> 00:00:12,560 del radio button y usarlo, una nueva 7 00:00:12,560 --> 00:00:14,800 característica en factura 8 00:00:14,800 --> 00:00:16,399 que era, si era de empresa o de particular 9 00:00:16,399 --> 00:00:18,940 eso lo podemos recoger 10 00:00:18,940 --> 00:00:19,980 por ejemplo 11 00:00:19,980 --> 00:00:22,320 en un int que tenga 01 12 00:00:22,320 --> 00:00:24,800 así lo hacemos cambio, si lo complicamos 13 00:00:24,800 --> 00:00:26,339 vale 14 00:00:26,339 --> 00:00:28,359 tipo factura 15 00:00:28,359 --> 00:00:30,859 ala, ya está, entonces vamos a añadir 16 00:00:30,859 --> 00:00:31,679 un get y un set 17 00:00:31,679 --> 00:00:43,340 y listo, y vamos a ponerlo aquí 18 00:00:43,340 --> 00:00:45,079 a mano en el constructor porque sabemos 19 00:00:45,079 --> 00:00:47,179 hacer las cosas a mano, no somos tontitos 20 00:00:47,179 --> 00:00:53,479 porque a lo que no genere el eclipse 21 00:00:53,479 --> 00:00:54,640 ya parece que no 22 00:00:54,640 --> 00:01:00,890 ¿Hubo eclipse el domingo? 23 00:01:01,890 --> 00:01:02,390 Sí hubo eclipse 24 00:01:02,390 --> 00:01:04,329 No me enteré 25 00:01:04,329 --> 00:01:07,730 Vale, tipo factura 26 00:01:07,730 --> 00:01:29,609 Bueno, nuestra aplicación de facturas. Antes de empezar a hacer nada, datos. Hemos dicho que un map, como la factura, tiene un elemento que claramente funciona como clave de las facturas, que es el número, estructura de datos más eficiente y más práctica a la hora de programar, un map. 27 00:01:29,609 --> 00:01:31,670 ¿dónde me vamos a meter los datos? 28 00:01:32,090 --> 00:01:34,150 pues hombre, aquí ya tenemos un montón de 29 00:01:34,150 --> 00:01:36,290 morraya, vamos a ponerlo en otra 30 00:01:36,290 --> 00:01:40,069 clase, ¿no? vamos a hacernos 31 00:01:40,069 --> 00:01:43,670 aquí, nuestra clase 32 00:01:43,670 --> 00:01:45,349 con los datos y ya está 33 00:01:45,349 --> 00:01:49,859 y aquí 34 00:01:49,859 --> 00:01:50,900 nuestras facturas 35 00:01:50,900 --> 00:01:55,790 ¿cómo has metido lo del botón radio? 36 00:01:55,890 --> 00:01:56,950 ¿podemos verlos en un vídeo? 37 00:01:59,670 --> 00:02:00,349 ¿ahora mismo? 38 00:02:01,650 --> 00:02:02,129 sí 39 00:02:02,129 --> 00:02:06,030 vamos a hacer una cosa, vamos a hacer la aplicación y luego ya 40 00:02:06,030 --> 00:02:07,829 efectivamente como solo hay dos tipos 41 00:02:07,829 --> 00:02:08,990 pero en un int 42 00:02:08,990 --> 00:02:11,530 lo añadimos a funcionalidad 43 00:02:11,530 --> 00:02:12,430 cuando ya 44 00:02:12,430 --> 00:02:15,569 para no meterlo del object string 45 00:02:15,569 --> 00:02:16,409 y el uno a la vez 46 00:02:16,409 --> 00:02:20,030 map será 47 00:02:20,030 --> 00:02:21,949 el número de facturas entero 48 00:02:21,949 --> 00:02:23,270 pues integer 49 00:02:23,270 --> 00:02:28,210 y la factura 50 00:02:28,210 --> 00:02:30,689 facturas 51 00:02:30,689 --> 00:02:35,900 joder 52 00:02:35,900 --> 00:02:38,639 perdonad 53 00:02:38,639 --> 00:02:42,639 venga 54 00:02:42,639 --> 00:02:43,960 vamos a poner un trimap 55 00:02:43,960 --> 00:02:47,400 para variar, para que repaséis todo. 56 00:02:49,719 --> 00:02:51,139 No llores, Cristian. 57 00:02:56,139 --> 00:02:59,759 Porque está grabada en el cerebro como una taladradora. 58 00:03:02,860 --> 00:03:03,539 Vale. 59 00:03:04,699 --> 00:03:05,879 Venga, pues ya está. 60 00:03:05,960 --> 00:03:08,439 Vamos a directamente hacer el comportamiento de la aplicación. 61 00:03:09,199 --> 00:03:09,960 Y se acabó. 62 00:03:09,960 --> 00:03:14,180 vale, entonces 63 00:03:14,180 --> 00:03:16,599 estos radiobutton, si habéis hecho 64 00:03:16,599 --> 00:03:18,460 alguno de los ejercicios con radiobutton 65 00:03:18,460 --> 00:03:20,180 pues están los pobres por libre 66 00:03:20,180 --> 00:03:21,759 normalmente los radio 67 00:03:21,759 --> 00:03:26,939 a ver, es un map 68 00:03:26,939 --> 00:03:29,020 de integer, que es la clave 69 00:03:29,020 --> 00:03:29,680 y factura 70 00:03:29,680 --> 00:03:33,000 y un trimap en particular 71 00:03:33,000 --> 00:03:34,979 vale, estos 72 00:03:34,979 --> 00:03:37,120 radiobutton los hemos puesto por libre 73 00:03:37,120 --> 00:03:39,860 pero normalmente 74 00:03:39,860 --> 00:03:40,780 no funcionan así 75 00:03:40,780 --> 00:03:59,289 claro, ahora mismo como están por libre 76 00:03:59,289 --> 00:04:01,189 yo puedo marcar 77 00:04:01,189 --> 00:04:03,370 los dos a la vez, el marcar uno no desmarca 78 00:04:03,370 --> 00:04:04,509 el otro automáticamente 79 00:04:04,509 --> 00:04:07,490 van por libre, no es el funcionamiento 80 00:04:07,490 --> 00:04:09,050 habitual de los radiobutton, podríamos 81 00:04:09,050 --> 00:04:11,229 dejarlos así y es un radiobutton del cual yo puedo 82 00:04:11,229 --> 00:04:13,169 extraer la información de si está seleccionado 83 00:04:13,169 --> 00:04:15,370 o si no lo está y trabajar con él 84 00:04:15,370 --> 00:04:17,829 pero no es una interfaz muy amigable 85 00:04:17,829 --> 00:04:19,269 entonces 86 00:04:19,269 --> 00:04:21,550 para que vayan asociados 87 00:04:21,550 --> 00:04:23,829 y cuando activemos uno se desactive el otro 88 00:04:23,829 --> 00:04:26,389 tenemos que meterlos en un grupo de botones 89 00:04:26,389 --> 00:04:28,230 tenemos que meterlos en un grupo de botones 90 00:04:28,230 --> 00:04:29,370 eso os he dicho en el ejercicio 91 00:04:29,370 --> 00:04:30,209 y lo habéis buscado 92 00:04:30,209 --> 00:04:31,850 pues lo habéis encontrado 93 00:04:31,850 --> 00:04:34,110 entonces 94 00:04:34,110 --> 00:04:37,149 estos dos radio botón de aquí 95 00:04:37,149 --> 00:04:40,550 vamos a meterlo en un grupo de botones 96 00:04:40,550 --> 00:04:42,589 que era 97 00:04:42,589 --> 00:04:46,689 no sé si era con 98 00:04:46,689 --> 00:04:53,980 vale 99 00:04:53,980 --> 00:04:56,800 corregidme o si no 100 00:04:56,800 --> 00:04:58,980 miramos la chuleta porque no sé si era 101 00:04:58,980 --> 00:05:00,620 button group o j button group 102 00:05:00,620 --> 00:05:04,180 button group 103 00:05:04,180 --> 00:05:04,879 era 104 00:05:04,879 --> 00:05:08,410 vale 105 00:05:08,410 --> 00:05:11,129 button group 106 00:05:11,129 --> 00:05:12,009 vale 107 00:05:12,009 --> 00:05:14,750 y ahora a ver 108 00:05:14,750 --> 00:05:16,670 los que tienen j son para 109 00:05:16,670 --> 00:05:18,649 distinguirlo de la versión antigua porque todos 110 00:05:18,649 --> 00:05:20,829 estos componentes el j button el j label 111 00:05:20,829 --> 00:05:23,269 de Swing, existían 112 00:05:23,269 --> 00:05:25,129 también en el paquete antiguo, que es 113 00:05:25,129 --> 00:05:27,110 el AWT, como 114 00:05:27,110 --> 00:05:28,689 Button, Label, entonces 115 00:05:28,689 --> 00:05:31,569 el paquete AWT no se ha eliminado 116 00:05:31,569 --> 00:05:33,069 porque sigue teniendo la gestión 117 00:05:33,069 --> 00:05:35,110 de eventos. Entonces, para que 118 00:05:35,110 --> 00:05:37,290 los nuevos componentes de Swing no se confundan 119 00:05:37,290 --> 00:05:38,709 pues se les ha puesto J delante 120 00:05:38,709 --> 00:05:41,110 y ya está. Entonces, Button Group no tiene 121 00:05:41,110 --> 00:05:43,230 su equivalente en AWT, por eso no se le ha 122 00:05:43,230 --> 00:05:44,829 puesto la J, aunque es de Swing también. 123 00:05:44,990 --> 00:05:46,490 A lo mejor es que al revés, porque 124 00:05:46,490 --> 00:05:48,930 no tenía su equivalente en AWT, por lo tanto 125 00:05:48,930 --> 00:05:50,290 se han ahorrado la J. 126 00:05:50,290 --> 00:05:51,709 Justo lo acabo de decir 127 00:05:51,709 --> 00:05:54,490 No, no, este es de swing 128 00:05:54,490 --> 00:05:55,610 Entonces como este no tenía 129 00:05:55,610 --> 00:05:57,350 Su equivalente no le han puesto la j 130 00:05:57,350 --> 00:06:00,230 Entonces al grupo le podemos añadir 131 00:06:00,230 --> 00:06:01,149 Ya nuestros botones 132 00:06:01,149 --> 00:06:02,529 Que como no les he cambiado el nombre 133 00:06:02,529 --> 00:06:04,189 En la aplicación tiene un nombre horroroso 134 00:06:04,189 --> 00:06:06,889 Pero bueno, como nos gusta ir rápidos 135 00:06:06,889 --> 00:06:08,949 Las cosas bonitas ya las hacéis vosotros 136 00:06:08,949 --> 00:06:12,110 Entonces añadimos el botón 1 137 00:06:12,110 --> 00:06:13,389 Y el botón 2 138 00:06:13,389 --> 00:06:16,089 Bueno, no, 1 es el que no tiene nada 139 00:06:16,089 --> 00:06:18,050 Es el 1 y el sin nada 140 00:06:18,050 --> 00:06:21,509 y ahora ya 141 00:06:21,509 --> 00:06:23,389 se supone que 142 00:06:23,389 --> 00:06:25,649 ahora ya sí 143 00:06:25,649 --> 00:06:27,230 que esto ya nos gusta más 144 00:06:27,230 --> 00:06:29,750 esto es simplemente una cuestión de funcionamiento de la interfaz 145 00:06:29,750 --> 00:06:30,889 nada más 146 00:06:30,889 --> 00:06:31,990 vale 147 00:06:31,990 --> 00:06:39,319 pues ahora ya, evento de insertar factura 148 00:06:39,319 --> 00:06:40,959 pues muy fácil 149 00:06:40,959 --> 00:06:48,810 insertar factura 150 00:06:48,810 --> 00:06:50,930 ¿qué tiene que hacer? crear una factura nueva 151 00:06:50,930 --> 00:06:52,889 con los datos y ya está 152 00:06:52,889 --> 00:06:54,709 pero crear una factura nueva 153 00:06:54,709 --> 00:06:56,350 implicará crear también 154 00:06:56,350 --> 00:06:59,269 el número de factura 155 00:06:59,269 --> 00:07:01,269 claro, y el 156 00:07:01,269 --> 00:07:03,230 no, aquí no, porque cada factura tiene el suyo 157 00:07:03,230 --> 00:07:07,350 claro, entonces 158 00:07:07,350 --> 00:07:08,930 pero cuando lo creemos, claro 159 00:07:08,930 --> 00:07:11,589 entonces, esto no se 160 00:07:11,589 --> 00:07:13,350 mete desde la aplicación, el número de factura 161 00:07:13,350 --> 00:07:15,589 lo genera, o sea, no lo mete el usuario 162 00:07:15,589 --> 00:07:17,490 lo genera la aplicación, entonces tenemos que pensar 163 00:07:17,490 --> 00:07:18,790 un mecanismo para generarlo 164 00:07:18,790 --> 00:07:21,529 pues ya lo hemos hecho algunas veces, vamos a poner 165 00:07:21,529 --> 00:07:23,470 en algún sitio donde pegue 166 00:07:23,470 --> 00:07:25,389 y donde pega, pues aquí donde tengo 167 00:07:25,389 --> 00:07:27,410 los datos en algún sitio donde 168 00:07:27,410 --> 00:07:29,350 pegue, pues 169 00:07:29,350 --> 00:07:31,430 vamos a poner una variable 170 00:07:31,430 --> 00:07:32,750 que nos sirva como secuencia. 171 00:07:35,930 --> 00:07:36,449 Secuencia 172 00:07:36,449 --> 00:07:38,529 para numFactura. 173 00:07:40,029 --> 00:07:41,589 ¿Vale? Las secuencias 174 00:07:41,589 --> 00:07:43,490 se usan en muchos contextos, 175 00:07:43,490 --> 00:07:45,110 en el contexto de las bases de datos también, 176 00:07:45,290 --> 00:07:46,569 porque como las claves primarias 177 00:07:46,569 --> 00:07:49,350 necesitamos que sean distintas, tú te haces 178 00:07:49,350 --> 00:07:51,310 una secuencia en SQL. ¿Habéis hecho 179 00:07:51,310 --> 00:07:52,550 ya secuencias en SQL? 180 00:07:52,550 --> 00:07:54,970 pues es un procedimiento 181 00:07:54,970 --> 00:07:56,990 en SQL que te genera un número 182 00:07:56,990 --> 00:07:58,610 cuando tú se lo pides 183 00:07:58,610 --> 00:08:00,870 directamente desde SQL, entonces para hacer las claves 184 00:08:00,870 --> 00:08:03,009 primarias viene muy bien 185 00:08:03,009 --> 00:08:04,709 tú llamas a la secuencia y ya te mete 186 00:08:04,709 --> 00:08:07,129 un identificador único 187 00:08:07,129 --> 00:08:08,790 entonces inicialmente 188 00:08:08,790 --> 00:08:10,889 lo podemos poner pues a 1 189 00:08:10,889 --> 00:08:12,509 la primera factura que sea la 1 190 00:08:12,509 --> 00:08:15,449 y ahora ya 191 00:08:15,449 --> 00:08:18,730 el evento este de aquí 192 00:08:18,730 --> 00:08:20,870 pues ya está, es crear una 193 00:08:20,870 --> 00:08:21,470 factura 194 00:08:21,470 --> 00:08:35,309 Claro, pero estás incrementando este 195 00:08:35,309 --> 00:08:38,909 Bueno, es que la que vamos a incrementar es esta 196 00:08:38,909 --> 00:08:44,200 Entonces, como no tengo el constructor sin parámetros 197 00:08:44,200 --> 00:08:46,460 Que vamos a ponerlo 198 00:08:46,460 --> 00:08:49,279 Porque a mí me es más cómodo que el otro 199 00:08:49,279 --> 00:08:49,940 Que lo tengo que meter 200 00:08:49,940 --> 00:08:51,639 Prefiero hacerlo set después 201 00:08:51,639 --> 00:08:53,840 Pues vamos a ponerle 202 00:08:53,840 --> 00:08:55,360 El constructor 203 00:08:55,360 --> 00:09:01,279 ala, y ahora ya 204 00:09:01,279 --> 00:09:03,740 le ponemos los datos 205 00:09:03,740 --> 00:09:06,850 venga 206 00:09:06,850 --> 00:09:08,330 el número de factura 207 00:09:08,330 --> 00:09:10,509 pues está claro que va a ser 208 00:09:10,509 --> 00:09:13,269 datos 209 00:09:13,269 --> 00:09:14,850 punto 210 00:09:14,850 --> 00:09:16,389 secuencia en un factura 211 00:09:16,389 --> 00:09:18,649 y vamos a dejarla ya incrementada 212 00:09:18,649 --> 00:09:19,409 para la siguiente 213 00:09:19,409 --> 00:09:24,340 y ahora factura 214 00:09:24,340 --> 00:09:26,899 pues la cantidad va a ser lo que haya 215 00:09:26,899 --> 00:09:27,899 en el área de texto 216 00:09:27,899 --> 00:09:30,759 de factura, que vete a saber 217 00:09:30,759 --> 00:09:32,580 cómo se llama ese textfield 218 00:09:32,580 --> 00:09:33,940 la cantidad 219 00:09:33,940 --> 00:09:37,039 textfield 220 00:09:37,039 --> 00:09:37,879 barra baja 1 221 00:09:37,879 --> 00:09:41,259 bueno, no me cuesta nada 222 00:09:41,259 --> 00:09:42,899 cambiarlo, ni a vosotros tampoco 223 00:09:42,899 --> 00:09:44,080 cantidad y ya está 224 00:09:44,080 --> 00:09:47,960 y ya de paso cambiamos el de arriba 225 00:09:47,960 --> 00:09:49,500 a dirección 226 00:09:49,500 --> 00:09:57,799 bueno, pues entonces el área de texto 227 00:09:57,799 --> 00:09:58,379 tiene 228 00:09:58,379 --> 00:10:04,679 cantidad.gettest 229 00:10:04,679 --> 00:10:08,059 y aquí con double parse double 230 00:10:08,059 --> 00:10:12,269 claro, de nuevo 231 00:10:12,269 --> 00:10:14,230 no le estamos haciendo nada robusta 232 00:10:14,230 --> 00:10:16,110 aquí idealmente habría que 233 00:10:16,110 --> 00:10:18,289 mirar que antes de hacer esto 234 00:10:18,289 --> 00:10:19,070 de hacer el set 235 00:10:19,070 --> 00:10:21,929 que este área de texto tenga algo dentro 236 00:10:21,929 --> 00:10:23,649 y si no lo tiene 237 00:10:23,649 --> 00:10:25,649 sacarle un jOptionPane 238 00:10:25,649 --> 00:10:27,490 introduzca un valor para la cantidad 239 00:10:27,490 --> 00:10:28,409 ¿vale? 240 00:10:29,169 --> 00:10:31,889 pero todos esos detallitos son hacer lo mismo 241 00:10:31,889 --> 00:10:33,370 una y otra vez que se pueden incorporar 242 00:10:33,370 --> 00:10:36,090 cantidad.vectest 243 00:10:36,090 --> 00:10:37,990 double parse double y ¿qué pasa? que me falta 244 00:10:37,990 --> 00:10:38,690 un paréntesis 245 00:10:38,690 --> 00:10:43,940 la dirección 246 00:10:43,940 --> 00:10:44,740 y luego el tipo 247 00:10:44,740 --> 00:10:58,980 y ahora el tipo 248 00:10:58,980 --> 00:11:01,340 cero si es particular, uno si es empresa 249 00:11:01,340 --> 00:11:03,740 por ejemplo, cero si particular 250 00:11:03,740 --> 00:11:04,580 uno si es empresa 251 00:11:04,580 --> 00:11:08,559 ¿por qué la he puesto yo de Abel? 252 00:11:08,659 --> 00:11:10,759 porque me admito céntimos 253 00:11:10,759 --> 00:11:16,539 ¿qué otra cosa podría ser? 254 00:11:16,539 --> 00:11:17,580 al precio 255 00:11:17,580 --> 00:11:20,279 cantidad de producto 256 00:11:20,279 --> 00:11:25,899 Bueno, podía ser un producto y medio 257 00:11:25,899 --> 00:11:27,080 Pero no, no sería 258 00:11:27,080 --> 00:11:29,759 Bueno, pues aquí, claro 259 00:11:29,759 --> 00:11:32,299 Vamos a ver qué botón está seleccionado 260 00:11:32,299 --> 00:11:37,200 Vamos a ver qué botón está seleccionado 261 00:11:37,200 --> 00:11:39,600 El radiobutón este 262 00:11:39,600 --> 00:11:40,740 Espera, no 263 00:11:40,740 --> 00:11:43,500 Tenía un nombre horrible, vamos a cambiarle de nombre 264 00:11:43,500 --> 00:11:53,899 boot empresa 265 00:11:53,899 --> 00:11:56,120 le estoy llamando y a este boot particular 266 00:11:56,120 --> 00:11:58,039 porque es que si no 267 00:11:58,039 --> 00:12:00,259 queda horrible, boot particular 268 00:12:00,259 --> 00:12:01,960 vale 269 00:12:01,960 --> 00:12:04,059 pues entonces si este está activado 270 00:12:04,059 --> 00:12:05,940 le pondremos a cero y si no 271 00:12:05,940 --> 00:12:06,860 le pondremos a uno 272 00:12:06,860 --> 00:12:09,480 bueno, vamos aquí otra vez 273 00:12:09,480 --> 00:12:10,460 entonces 274 00:12:10,460 --> 00:12:13,340 boot punto 275 00:12:13,340 --> 00:12:15,240 boot empresa 276 00:12:15,240 --> 00:12:17,240 punto 277 00:12:17,240 --> 00:12:19,779 como está abajo 278 00:12:19,779 --> 00:12:21,600 no lo reconoce, ¿vale? 279 00:12:21,620 --> 00:12:23,240 ya con estas cosas, como se han unido otra vez 280 00:12:23,240 --> 00:12:25,620 luego en el examen, que es, repito 281 00:12:25,620 --> 00:12:26,860 la única herramienta que tenemos 282 00:12:26,860 --> 00:12:29,419 oficial para evaluaros, pues como estas cosas 283 00:12:29,419 --> 00:12:31,580 se han unido otra vez, que nos quiten tiempo 284 00:12:31,580 --> 00:12:33,120 ¿por qué no me lo detecta? 285 00:12:33,220 --> 00:12:35,440 pues porque está abajo, y el compilador funciona 286 00:12:35,440 --> 00:12:37,639 como un pseudo intérprete, va línea por línea 287 00:12:37,639 --> 00:12:39,580 lo más rápido, pasarlo 288 00:12:39,580 --> 00:12:41,480 fuera, de variable de 289 00:12:41,480 --> 00:12:43,480 ah, claro, si no tiene error de 290 00:12:43,480 --> 00:12:51,860 compilación el designer no te lo abre bien. Entonces vamos a quitar el error de compilación 291 00:12:51,860 --> 00:13:02,000 para que se abre el designer y ahora a este botón le vamos a pasar de variable local a variable de 292 00:13:02,000 --> 00:13:08,399 clase y a este le vamos a pasar a variable de clase también. Así ya es accesible desde cualquier lado 293 00:13:08,399 --> 00:13:10,299 aunque esté instanciado 294 00:13:10,299 --> 00:13:10,639 abajo 295 00:13:10,639 --> 00:13:13,820 ahora ya sí 296 00:13:13,820 --> 00:13:15,700 en el evento en el que estábamos 297 00:13:15,700 --> 00:13:16,539 que era este 298 00:13:16,539 --> 00:13:24,679 ahora ya sí que lo debería reconocer 299 00:13:24,679 --> 00:13:26,779 y me da 300 00:13:26,779 --> 00:13:28,759 y tendrá un método para ver si está seleccionado 301 00:13:28,759 --> 00:13:30,039 o no 302 00:13:30,039 --> 00:13:30,340 que 303 00:13:30,340 --> 00:13:35,340 is selected 304 00:13:35,340 --> 00:13:37,919 a ver el que lo haya hecho que me lo diga 305 00:13:37,919 --> 00:13:39,059 y no me estoy aquí todo el rato 306 00:13:39,059 --> 00:13:41,100 is selected 307 00:13:41,100 --> 00:13:43,320 Is 308 00:13:43,320 --> 00:13:51,139 Selected, efectivamente 309 00:13:51,139 --> 00:13:53,600 ¿Está seleccionado? 310 00:13:55,179 --> 00:13:56,820 Pues entonces 311 00:13:56,820 --> 00:14:08,440 A tipo le daremos el 0 312 00:14:08,440 --> 00:14:15,679 Ahora lo que no 313 00:14:15,679 --> 00:14:16,919 Pues le daremos el 1 314 00:14:16,919 --> 00:14:19,100 Uy, dos puntos 315 00:14:19,100 --> 00:14:21,679 Y ahora ya hacemos el set 316 00:14:21,679 --> 00:14:22,200 ¿Vale? 317 00:14:25,360 --> 00:14:26,000 Venga 318 00:14:26,000 --> 00:14:28,639 Y ahora ya 319 00:14:28,639 --> 00:14:37,879 como están en un grupo, sí 320 00:14:37,879 --> 00:14:40,259 a menos que sea al arrancar 321 00:14:40,259 --> 00:14:41,919 claro, a menos que sea al arrancar 322 00:14:41,919 --> 00:14:43,419 por eso, es otra 323 00:14:43,419 --> 00:14:46,139 es otra cosa en la que es 324 00:14:46,139 --> 00:14:48,460 poco robusta, igual que no está verificando 325 00:14:48,460 --> 00:14:50,360 que tú hayas puesto realmente en los campos 326 00:14:50,360 --> 00:14:52,039 dirección o cantidad, lo está tomando sin más 327 00:14:52,039 --> 00:14:53,580 y habría que verificarlo para decirle 328 00:14:53,580 --> 00:14:55,480 pues aquí habría que verificar 329 00:14:55,480 --> 00:14:57,879 que alguno de los dos está 330 00:14:57,879 --> 00:15:00,120 para así no avisarle 331 00:15:00,120 --> 00:15:03,220 nosotros asumimos que él ha dado a todo 332 00:15:03,220 --> 00:15:04,379 entonces al haber dado a todo 333 00:15:04,379 --> 00:15:06,960 si este no está, es que está el otro 334 00:15:06,960 --> 00:15:09,740 pero efectivamente 335 00:15:09,740 --> 00:15:11,700 nos va a dar errores de ejecución 336 00:15:11,700 --> 00:15:13,340 si le damos a añadir factura 337 00:15:13,340 --> 00:15:16,139 y no ha metido los datos 338 00:15:16,139 --> 00:15:17,500 entonces habría que hacer 339 00:15:17,500 --> 00:15:19,919 una validación antes para ver si todo está relleno 340 00:15:19,919 --> 00:15:21,519 pero esa validación es comprobar 341 00:15:21,519 --> 00:15:23,980 claro, entonces 342 00:15:23,980 --> 00:15:25,440 aquí lo ideal sería 343 00:15:25,440 --> 00:15:26,379 hacer un método 344 00:15:26,379 --> 00:15:29,559 adicional 345 00:15:29,559 --> 00:15:30,419 que fuera 346 00:15:30,419 --> 00:15:33,179 validar, así 347 00:15:33,179 --> 00:15:38,450 algo así 348 00:15:38,450 --> 00:15:40,889 que la validación 349 00:15:40,889 --> 00:15:43,149 de dado falso, pues le decimos simplemente 350 00:15:43,149 --> 00:15:44,590 j 351 00:15:44,590 --> 00:15:46,850 option pane punto 352 00:15:46,850 --> 00:15:49,450 introduzca 353 00:15:49,450 --> 00:15:50,490 todos los datos 354 00:15:50,490 --> 00:15:52,049 así nos vamos uno por uno 355 00:15:52,049 --> 00:15:58,769 ah no, es que he cogido una versión 356 00:15:58,769 --> 00:16:00,850 en la que esta sería el padre 357 00:16:00,850 --> 00:16:03,350 pero no hace falta poner el padre 358 00:16:03,350 --> 00:16:04,649 porque solo hay un padre que es el frame 359 00:16:04,649 --> 00:16:06,470 entonces voy a poner directamente el mensaje 360 00:16:06,470 --> 00:16:07,610 es que tiene varias 361 00:16:07,610 --> 00:16:12,309 introduzca todos los datos 362 00:16:12,309 --> 00:16:16,120 vale 363 00:16:16,120 --> 00:16:17,940 y el show message dialogue 364 00:16:17,940 --> 00:16:20,440 creo que si te obliga 365 00:16:20,440 --> 00:16:21,779 a poner el padre 366 00:16:21,779 --> 00:16:24,059 eso, este si te obliga 367 00:16:24,059 --> 00:16:26,419 a poner al que está asociado 368 00:16:26,419 --> 00:16:28,360 pero es el que pone null que es el por defecto 369 00:16:28,360 --> 00:16:32,600 y me vais a permitir 370 00:16:32,600 --> 00:16:34,539 de nuevo con 371 00:16:34,539 --> 00:16:35,980 si 372 00:16:35,980 --> 00:16:38,679 porque vais a estar 373 00:16:38,679 --> 00:16:40,379 calladitos y no lo vais a decir 374 00:16:40,379 --> 00:16:42,840 me vais a permitir 375 00:16:42,840 --> 00:16:44,019 poner un retorno 376 00:16:44,019 --> 00:16:47,200 porque vosotros ya sabéis 377 00:16:47,200 --> 00:16:49,299 ya sabéis que un código estructurado 378 00:16:49,299 --> 00:16:50,919 se intenta 379 00:16:50,919 --> 00:16:52,740 que salga solo por un sitio 380 00:16:52,740 --> 00:16:54,419 y no salga solo por varios 381 00:16:54,419 --> 00:16:57,120 pero también tenemos que sobrevivir 382 00:16:57,120 --> 00:16:58,840 y no estar aquí escribiendo 383 00:16:58,840 --> 00:17:00,480 no retorno porque salimos del método 384 00:17:00,480 --> 00:17:02,919 si no están todos los datos, tú ya sales 385 00:17:02,919 --> 00:17:05,039 no haces factura ni nada, entonces él verá el mensajito 386 00:17:05,039 --> 00:17:06,660 marcará los datos 387 00:17:06,660 --> 00:17:08,480 y volverá a dar insertar factura 388 00:17:08,480 --> 00:17:10,240 entonces otra vez volveremos a entrar 389 00:17:10,240 --> 00:17:12,539 entonces validar lo vamos a dejar en blanco 390 00:17:12,539 --> 00:17:14,680 pero aquí 391 00:17:14,680 --> 00:17:16,180 validar 392 00:17:16,180 --> 00:17:18,299 y este método validar ahora mismo 393 00:17:18,299 --> 00:17:21,160 que nos dé true todo el rato, que valide siempre 394 00:17:21,160 --> 00:17:22,900 pero sería interesante 395 00:17:22,900 --> 00:17:24,720 que validara que todos los campos 396 00:17:24,720 --> 00:17:26,960 están rellenos, lo que hace Javascript 397 00:17:26,960 --> 00:17:28,380 en una aplicación web 398 00:17:28,380 --> 00:17:30,619 lo que hace javascript 399 00:17:30,619 --> 00:17:31,779 esa validación 400 00:17:31,779 --> 00:17:35,519 una de las cosas 401 00:17:35,519 --> 00:17:36,740 para las que usamos javascript 402 00:17:36,740 --> 00:17:38,339 porque programar una validación 403 00:17:38,339 --> 00:17:40,119 en el lado servidor de la aplicación 404 00:17:40,119 --> 00:17:40,779 es una locura 405 00:17:40,779 --> 00:17:43,559 porque hay un tránsito de datos por la red todo el rato 406 00:17:43,559 --> 00:17:45,660 entonces las validaciones se programan 407 00:17:45,660 --> 00:17:46,640 en el lado cliente 408 00:17:46,640 --> 00:17:47,720 que es en el propio navegador 409 00:17:47,720 --> 00:17:49,000 y para eso está javascript 410 00:17:49,000 --> 00:17:51,259 que está ahí en tu cliente validando 411 00:17:51,259 --> 00:17:53,960 vale pues entonces ahora ya si 412 00:17:53,960 --> 00:17:56,559 le ponemos el tipo s 413 00:17:56,559 --> 00:18:00,079 y ya está 414 00:18:00,079 --> 00:18:01,559 y metemos la factura en el map 415 00:18:01,559 --> 00:18:05,170 imagino que en el lado del servidor 416 00:18:05,170 --> 00:18:06,609 también va a salir algún tipo de validación 417 00:18:06,609 --> 00:18:09,609 si necesitas que sean 418 00:18:09,609 --> 00:18:11,250 contra la base de datos 419 00:18:11,250 --> 00:18:11,549 sí 420 00:18:11,549 --> 00:18:15,109 esa palabra no me gusta nada 421 00:18:15,109 --> 00:18:17,390 pero es la que se usa 422 00:18:17,390 --> 00:18:19,309 porque para la base de datos 423 00:18:19,309 --> 00:18:20,230 solo tiene acceso 424 00:18:20,230 --> 00:18:22,230 el servidor 425 00:18:22,230 --> 00:18:23,369 entonces si esas validaciones 426 00:18:23,369 --> 00:18:24,670 necesitas campos de la base de datos 427 00:18:24,670 --> 00:18:26,230 las tienes que mandar al servidor 428 00:18:26,230 --> 00:18:27,789 y el servidor ya accede a la base de datos 429 00:18:27,789 --> 00:18:30,789 Bueno, al menos que estés usando 430 00:18:30,789 --> 00:18:33,269 librerías de Javascript 431 00:18:33,269 --> 00:18:35,049 o que le estés pasando tú 432 00:18:35,049 --> 00:18:36,130 la información a Validad 433 00:18:36,130 --> 00:18:37,690 A ver, lo puedes hacer de muchas maneras 434 00:18:37,690 --> 00:18:40,390 Nadie usa Javascript 435 00:18:40,390 --> 00:18:41,549 parece que se usa mucho JQuery 436 00:18:41,549 --> 00:18:45,130 Sí, bueno, JQuery son librerías para Javascript 437 00:18:45,130 --> 00:18:45,809 Claro 438 00:18:45,809 --> 00:18:49,150 Bueno, a ver, cuando yo digo Javascript básico 439 00:18:49,150 --> 00:18:50,849 no me refiero al básico, en realidad hablo de 440 00:18:50,849 --> 00:18:52,809 Javascript y todo el acceso a todos esos 441 00:18:52,809 --> 00:18:54,890 paquetes de librerías que tienen, entre ellos Javacuery 442 00:18:54,890 --> 00:18:56,509 o AJAX o todas esas cosas 443 00:18:56,509 --> 00:18:59,869 venga, pues ahora ya en facturas 444 00:18:59,869 --> 00:19:02,109 ya le ponemos, no en facturas, no, en datos 445 00:19:02,109 --> 00:19:03,230 punto 446 00:19:03,230 --> 00:19:05,109 facturas 447 00:19:05,109 --> 00:19:07,170 ahora ya sí 448 00:19:07,170 --> 00:19:09,250 le ponemos a este 449 00:19:09,250 --> 00:19:14,009 punto put 450 00:19:14,009 --> 00:19:21,220 el número de factura 451 00:19:21,220 --> 00:19:22,559 y 452 00:19:22,559 --> 00:19:24,940 el número de factura 453 00:19:24,940 --> 00:19:26,920 que es factura 454 00:19:26,920 --> 00:19:27,980 punto 455 00:19:27,980 --> 00:19:31,140 getNumFactura y la factura en sí 456 00:19:31,140 --> 00:19:37,799 y fact 457 00:19:37,799 --> 00:19:42,069 vale, de nuevo 458 00:19:42,069 --> 00:19:43,690 no estamos haciendo ninguna validación 459 00:19:43,690 --> 00:19:45,769 si la factura está, si no está 460 00:19:45,769 --> 00:19:48,329 todas esas comprobaciones, validaciones 461 00:19:48,329 --> 00:19:50,150 para avisar de posibles 462 00:19:50,150 --> 00:19:51,490 errores, pues bueno 463 00:19:51,490 --> 00:19:54,009 sería interesante hacerlas pero no tenemos tiempo 464 00:19:54,009 --> 00:19:56,190 vale, entonces la aplicación ya tiene 465 00:19:56,190 --> 00:19:58,089 datos, ¿qué pasa si yo ahora cierro la 466 00:19:58,089 --> 00:20:00,430 aplicación? pues si cierro la aplicación 467 00:20:00,430 --> 00:20:02,130 la factura que he metido se va 468 00:20:02,130 --> 00:20:04,230 a la basura y cuando arranco la aplicación 469 00:20:04,230 --> 00:20:06,150 no tengo facturas, jolín, yo quiero 470 00:20:06,150 --> 00:20:08,329 poder cerrar la aplicación, irme 471 00:20:08,329 --> 00:20:10,150 a dormir y cuando la arranque 472 00:20:10,150 --> 00:20:12,410 ver en mi desplegable las facturas que tenía ayer. 473 00:20:12,509 --> 00:20:14,190 Y no solo eso, sino que la secuencia en un factura 474 00:20:14,190 --> 00:20:14,730 se vuelve a 1. 475 00:20:18,029 --> 00:20:18,470 Efectivamente, 476 00:20:18,730 --> 00:20:19,569 muy bien pensado. 477 00:20:20,190 --> 00:20:22,109 Claro, aquí además de volcar los datos, 478 00:20:22,650 --> 00:20:24,390 tendríamos que volcar el último 479 00:20:24,390 --> 00:20:25,750 número de factura generado 480 00:20:25,750 --> 00:20:28,170 para inicializar con el en un factura. 481 00:20:28,430 --> 00:20:30,190 Efectivamente. Vale, entonces 482 00:20:30,190 --> 00:20:32,150 aquí, en cuanto ya vemos que tenemos 483 00:20:32,150 --> 00:20:34,170 datos, decimos, a ver, si esta aplicación es 484 00:20:34,170 --> 00:20:42,690 persistente cuando yo la cierre quiero que pase algo que quiero que pase guardar los objetos 485 00:20:42,690 --> 00:20:49,230 entonces vamos a ver cuándo vamos a cerrar la aplicación en nuestro caso cuando le demos a la 486 00:20:49,230 --> 00:20:57,029 equis está vale nosotros como ya le hemos puesto el close window no sé que cuando le damos a la 487 00:20:57,029 --> 00:21:03,670 equis sale cierra sin más pues pero no es eso lo único que queremos entonces vamos a hacer otra 488 00:21:03,670 --> 00:21:05,390 cosa. Vamos a capturar 489 00:21:05,390 --> 00:21:07,029 el evento de darle a la X. 490 00:21:07,430 --> 00:21:09,730 Porque si capturamos el evento de darle a la X, 491 00:21:09,950 --> 00:21:11,609 yo en ese evento puedo meter lo que me dé la 492 00:21:11,609 --> 00:21:13,549 gana. Entre esas 493 00:21:13,549 --> 00:21:15,569 cosas podré meter llevar todas las 494 00:21:15,569 --> 00:21:17,589 facturas a un fichero de objetos. 495 00:21:18,549 --> 00:21:19,529 Vale, pues ¿cómo podamos 496 00:21:19,529 --> 00:21:21,730 capturar ese evento? Bueno, pues el frame 497 00:21:21,730 --> 00:21:23,650 igual que cualquier otro 498 00:21:23,650 --> 00:21:25,670 componente, se le 499 00:21:25,670 --> 00:21:26,789 pueden asociar listener. 500 00:21:27,369 --> 00:21:28,609 Se le pueden asociar listener. 501 00:21:29,109 --> 00:21:31,549 En el caso del frame son, no se 502 00:21:31,549 --> 00:21:32,910 llaman listener, se llaman adapters. 503 00:21:32,910 --> 00:21:34,829 ¿vale? entonces 504 00:21:34,829 --> 00:21:35,650 vamos a hacerlo 505 00:21:35,650 --> 00:21:37,890 vamos a aquí 506 00:21:37,890 --> 00:21:40,789 vamos a crearnos una clase 507 00:21:40,789 --> 00:21:41,529 interna 508 00:21:41,529 --> 00:21:44,970 para no hacer tantas clases 509 00:21:44,970 --> 00:21:46,970 este método se cierra aquí 510 00:21:46,970 --> 00:21:50,650 vamos a 511 00:21:50,650 --> 00:21:51,930 crearnos 512 00:21:51,930 --> 00:21:53,269 class 513 00:21:53,269 --> 00:21:58,420 listener del frame 514 00:21:58,420 --> 00:22:00,779 este es el que escucha el frame porque la 515 00:22:00,779 --> 00:22:01,799 x está en el frame 516 00:22:01,799 --> 00:22:04,279 vale 517 00:22:04,279 --> 00:22:06,180 que este va a heredar de 518 00:22:06,180 --> 00:22:08,819 A ver si me acuerdo sin mirar la chuleta 519 00:22:08,819 --> 00:22:11,559 De window adapter 520 00:22:11,559 --> 00:22:12,980 A ver 521 00:22:12,980 --> 00:22:17,759 Si 522 00:22:17,759 --> 00:22:20,099 Vale, window adapter 523 00:22:20,099 --> 00:22:20,799 De event 524 00:22:20,799 --> 00:22:24,119 ¿Veis que dice ahí? 525 00:22:24,460 --> 00:22:25,019 Vale 526 00:22:25,019 --> 00:22:27,680 Venga, pues window adapter 527 00:22:27,680 --> 00:22:30,359 Es de Java, WT, igual que los listener 528 00:22:30,359 --> 00:22:32,000 Y que todos, window adapter 529 00:22:32,000 --> 00:22:32,480 Vale 530 00:22:32,480 --> 00:22:35,400 ¿Eh? 531 00:22:35,400 --> 00:22:36,299 ¿Lo puedes repetir? 532 00:22:36,299 --> 00:22:40,140 A ver, ¿cómo funciona 533 00:22:40,140 --> 00:22:42,000 la captura de un evento sobre un componente? 534 00:22:42,119 --> 00:22:43,779 Tú te haces una clase listener donde 535 00:22:43,779 --> 00:22:45,240 en los métodos que tiene dentro 536 00:22:45,240 --> 00:22:47,960 pones la 537 00:22:47,960 --> 00:22:49,779 respuesta al evento que tú estás 538 00:22:49,779 --> 00:22:51,819 capturando. En nuestro caso, aquí lo que queremos 539 00:22:51,819 --> 00:22:53,819 capturar es un evento 540 00:22:53,819 --> 00:22:55,700 pero ¿sobre quién? Sobre el frame. 541 00:22:55,920 --> 00:22:57,319 No sobre un botón ni sobre nada. 542 00:22:58,579 --> 00:22:59,880 Una clase listener hay que hacer 543 00:22:59,880 --> 00:23:01,640 igualmente. Pero 544 00:23:01,640 --> 00:23:03,920 las clases que escuchan al frame 545 00:23:03,920 --> 00:23:05,779 son adapter y 546 00:23:05,779 --> 00:23:14,079 Y en particular es esta, es decir, no vamos a implementar ActionListener, sino que vamos a heredar de WindowAdapter. 547 00:23:14,539 --> 00:23:18,500 Pero es lo mismo, esto es una clase que es capaz de estar conectada escuchando el frame. 548 00:23:19,039 --> 00:23:25,839 Lo que pasa es que en lugar de ser una clase que implemente ActionListener, pues es una clase que hereda de WindowAdapter. 549 00:23:25,839 --> 00:23:27,920 ya está, pero eso la convierte 550 00:23:27,920 --> 00:23:29,980 también en clase escuchadora 551 00:23:29,980 --> 00:23:31,940 en clase listener, que es capaz 552 00:23:31,940 --> 00:23:33,420 de responder 553 00:23:33,420 --> 00:23:35,839 de despertarse cuando pase 554 00:23:35,839 --> 00:23:37,740 lo que digamos, pero claro, hay que asociarla 555 00:23:37,740 --> 00:23:39,539 al frame, vale 556 00:23:39,539 --> 00:23:41,920 pues el frame nuestro, que lo estamos construyendo 557 00:23:41,920 --> 00:23:43,319 aquí, ya le quitamos esto 558 00:23:43,319 --> 00:23:47,579 le vamos a quitar esto, cuando le demos a la x 559 00:23:47,579 --> 00:23:50,079 ya no queremos exit, tal cual, no queremos exit 560 00:23:50,079 --> 00:23:51,859 le vamos a 561 00:23:51,859 --> 00:23:53,539 decir a nuestro frame 562 00:23:53,539 --> 00:23:55,299 que es a dis 563 00:23:55,299 --> 00:23:58,019 vamos a añadirle 564 00:23:58,019 --> 00:24:00,039 un window adapter 565 00:24:00,039 --> 00:24:01,440 o 566 00:24:01,440 --> 00:24:04,339 un window listener 567 00:24:04,339 --> 00:24:05,240 ¿vale? 568 00:24:05,859 --> 00:24:07,299 y le vamos a 569 00:24:07,299 --> 00:24:09,539 un new 570 00:24:09,539 --> 00:24:13,619 creo que sí 571 00:24:13,619 --> 00:24:15,140 si no lo cambiamos a window listener 572 00:24:15,140 --> 00:24:16,259 a listener frame 573 00:24:16,259 --> 00:24:18,400 vamos a ponerle un new 574 00:24:18,400 --> 00:24:20,200 listener frame 575 00:24:20,200 --> 00:24:26,740 ¿vale? 576 00:24:30,829 --> 00:24:33,190 es decir, window adapter está en la jerarquía de window 577 00:24:33,190 --> 00:24:34,710 listener, entonces 578 00:24:34,710 --> 00:24:37,309 ahora ya, cuando yo le dé a la 579 00:24:37,309 --> 00:24:39,710 x, lo que se va a ejecutar 580 00:24:39,710 --> 00:24:41,210 es lo que yo ponga en el 581 00:24:41,210 --> 00:24:42,789 método que sobrescriba aquí dentro 582 00:24:42,789 --> 00:24:45,210 como veis, window adapter tiene métodos 583 00:24:45,210 --> 00:24:47,529 pero como estoy heredando y no estoy sobrescribiendo 584 00:24:47,529 --> 00:24:48,690 no me obliga 585 00:24:48,690 --> 00:24:51,309 si estuviéramos implementando window listener 586 00:24:51,309 --> 00:24:53,109 sí, entonces igual así no lo pones más fácil 587 00:24:53,109 --> 00:24:55,289 porque si no me lo tengo que aprender de memoria que creo que era 588 00:24:55,289 --> 00:24:56,869 window closet 589 00:24:56,869 --> 00:24:58,089 pero no estoy muy segura 590 00:24:58,089 --> 00:25:00,630 public void 591 00:25:00,630 --> 00:25:09,769 y aquí sería 592 00:25:09,769 --> 00:25:11,730 window 593 00:25:11,730 --> 00:25:13,670 action event o window event 594 00:25:13,670 --> 00:25:17,670 claro, vamos a ponerlo 595 00:25:17,670 --> 00:25:19,789 a listener que así me va a obligar 596 00:25:19,789 --> 00:25:21,210 ya y va a ser más fácil 597 00:25:21,210 --> 00:25:23,930 porque si no tenemos que preguntárselo a HGPT o mirar la documentación 598 00:25:23,930 --> 00:25:24,509 y da pereza 599 00:25:24,509 --> 00:25:39,710 Vale, entonces quitamos esto, importamos, efectivamente ahora me dice como estás implementando 600 00:25:39,710 --> 00:25:45,630 una interfaz tienes que sobreescribir los métodos que, este se ha quedado tan ancho 601 00:25:45,630 --> 00:25:49,089 lógicamente como era de esperar, yo le puedo añadir tanto un window listener como un window 602 00:25:49,089 --> 00:25:50,410 adapter, está en la misma jerarquía 603 00:25:50,410 --> 00:25:52,630 pero nos hemos ahorrado trabajo 604 00:25:52,630 --> 00:25:58,990 este, se llamaba window close 605 00:25:58,990 --> 00:25:59,970 ah, pues iba bien 606 00:25:59,970 --> 00:26:06,710 porque lo tengo que instanciar 607 00:26:06,710 --> 00:26:08,569 claro 608 00:26:08,569 --> 00:26:12,240 vale, pues entonces 609 00:26:12,240 --> 00:26:13,660 esto es 610 00:26:13,660 --> 00:26:16,400 lo que va a pasar cuando el frame 611 00:26:16,400 --> 00:26:16,980 se abra 612 00:26:16,980 --> 00:26:19,420 cuando el frame 613 00:26:19,420 --> 00:26:20,640 ya esté cerrado 614 00:26:20,640 --> 00:26:22,799 y cuando el frame se esté cerrando 615 00:26:22,799 --> 00:26:24,680 no acabo de entender muy bien el matiz 616 00:26:24,680 --> 00:26:25,980 pero un matiz de diferencia habrá 617 00:26:25,980 --> 00:26:29,079 entonces, en nuestro caso, cuando demos a la X 618 00:26:29,079 --> 00:26:31,339 se despertará 619 00:26:31,339 --> 00:26:32,440 este, asumo 620 00:26:32,440 --> 00:26:34,880 y aquí es cuando 621 00:26:34,880 --> 00:26:36,799 queremos guardar los objetos 622 00:26:36,799 --> 00:26:38,960 ¿vale? queremos guardar los objetos 623 00:26:38,960 --> 00:26:40,579 y además que la aplicación termine 624 00:26:40,579 --> 00:26:43,019 que la aplicación termine es muy fácil 625 00:26:43,019 --> 00:26:44,140 porque para eso tenemos 626 00:26:44,140 --> 00:26:46,960 este, no, el de antes 627 00:26:46,960 --> 00:26:48,480 esta propia sentencia 628 00:26:48,480 --> 00:26:50,400 SystemExit 629 00:26:50,400 --> 00:26:52,279 que cierra la aplicación 630 00:26:52,279 --> 00:26:55,480 SystemExit te cierra la aplicación 631 00:26:55,480 --> 00:26:57,140 y además le devuelve el valor 632 00:26:57,140 --> 00:26:58,420 de retorno al sistema operativo 633 00:26:58,420 --> 00:26:59,220 el sistema operativo 634 00:26:59,220 --> 00:27:03,000 como sabéis pues guarda un registro 635 00:27:03,000 --> 00:27:04,380 de los procesos que se han cerrado 636 00:27:04,380 --> 00:27:05,660 un entero de retorno 637 00:27:05,660 --> 00:27:09,140 si te ha devuelto un cero se supone que se ha cerrado por la vía correcta 638 00:27:09,140 --> 00:27:10,740 si no te devuelve un cero 639 00:27:10,740 --> 00:27:11,579 se ha cerrado raro 640 00:27:11,579 --> 00:27:14,960 vale pues entonces esto lo va a hacer 641 00:27:14,960 --> 00:27:18,700 Pero antes de eso, va a guardar los objetos en un fichero. 642 00:27:19,200 --> 00:27:21,140 Pues, ¿cómo se guardan objetos en un fichero? 643 00:27:21,519 --> 00:27:24,140 La clase Object Output String. 644 00:27:28,190 --> 00:27:30,690 Estas para escribir objetos en un fichero. 645 00:27:31,970 --> 00:27:33,490 Tenemos que instanciarlos. 646 00:27:40,450 --> 00:27:43,049 Vale, Object Output String, ¿a quién se asocia? 647 00:27:43,529 --> 00:27:48,970 No al fichero directamente, sino a un File Output String que ya sí que esté asociado al fichero. 648 00:27:48,970 --> 00:27:52,089 file output stream es el flujo básico 649 00:27:52,089 --> 00:27:54,089 y object output stream se monta 650 00:27:54,089 --> 00:27:55,849 por encima, entonces para que no me quede una línea 651 00:27:55,849 --> 00:27:56,670 larguísima 652 00:27:56,670 --> 00:28:00,130 no, no puedes poner 653 00:28:00,130 --> 00:28:02,069 un file a secas, tienes que poner un file output stream 654 00:28:02,069 --> 00:28:03,509 y sobre él ya el object output stream 655 00:28:03,509 --> 00:28:05,470 entonces podría poner la misma línea 656 00:28:05,470 --> 00:28:07,369 new file output stream del fichero 657 00:28:07,369 --> 00:28:09,950 pero para que no me quede una línea enorme 658 00:28:09,950 --> 00:28:12,170 voy a hacerlo aparte 659 00:28:12,170 --> 00:28:14,150 solo para que 660 00:28:14,150 --> 00:28:16,089 no me quede la línea enorme, no por nada más 661 00:28:16,089 --> 00:28:18,150 vamos a 662 00:28:18,150 --> 00:28:19,470 hacer un file output string 663 00:28:19,470 --> 00:28:21,589 f cualquiera 664 00:28:21,589 --> 00:28:23,990 asociado al 665 00:28:23,990 --> 00:28:24,950 fichero de objetos. 666 00:28:30,160 --> 00:28:31,059 Vamos a 667 00:28:31,059 --> 00:28:33,940 un nombre, a nivel interno 668 00:28:33,940 --> 00:28:35,579 ya está. A ver, podríamos 669 00:28:35,579 --> 00:28:37,779 hacer que la aplicación cuando arranque te diga 670 00:28:37,779 --> 00:28:39,579 en qué fichero tiene las facturas. 671 00:28:40,099 --> 00:28:41,720 Pero bueno, que sea transparente para el usuario. 672 00:28:41,819 --> 00:28:43,740 Que él tenga su fichero interno, lo habla, lo cierra y el usuario 673 00:28:43,740 --> 00:28:45,640 ni se entere de que está abriendo y cerrando un fichero. 674 00:28:46,700 --> 00:28:47,259 Pues venga. 675 00:28:47,920 --> 00:28:49,640 Facturas.dat por ponerle una 676 00:28:49,640 --> 00:28:51,180 extensión o cualquier cosa. 677 00:28:54,420 --> 00:28:56,680 file output string, hay que importarlo 678 00:28:56,680 --> 00:28:58,000 lógicamente de java.io 679 00:28:58,000 --> 00:29:00,480 y ya está. 680 00:29:01,740 --> 00:29:02,240 ¿Vale? Entonces, 681 00:29:02,819 --> 00:29:04,680 si el fichero no existe, lo va a crear 682 00:29:04,680 --> 00:29:05,880 nuevo, como file writer. 683 00:29:06,460 --> 00:29:08,680 Este es el equivalente a file writer, pero para mandar bytes. 684 00:29:09,079 --> 00:29:10,660 Si el fichero no existe, lo crea nuevo. 685 00:29:10,660 --> 00:29:12,779 Y si existiera, 686 00:29:13,480 --> 00:29:14,720 en función de si después 687 00:29:14,720 --> 00:29:16,000 hemos puesto true o false, 688 00:29:16,799 --> 00:29:18,460 o añade o sobrescribe. 689 00:29:18,579 --> 00:29:20,160 Pero a este file output string sí le puedes 690 00:29:20,160 --> 00:29:22,259 pasar un file, un objeto file. 691 00:29:22,259 --> 00:29:24,079 justo, a file output string 692 00:29:24,079 --> 00:29:25,559 o bien le paso el string 693 00:29:25,559 --> 00:29:27,859 o bien le paso un objeto file 694 00:29:27,859 --> 00:29:30,619 asociado a ese 695 00:29:30,619 --> 00:29:36,750 créate 696 00:29:36,750 --> 00:29:37,170 no 697 00:29:37,170 --> 00:29:41,460 yo creo que te coge la hecho 698 00:29:41,460 --> 00:29:45,980 sí, sí, pero tenemos las dos posibilidades 699 00:29:45,980 --> 00:29:46,579 entonces lo que 700 00:29:46,579 --> 00:29:49,700 es que me da una rabia cuando no me hace lo de los 701 00:29:49,700 --> 00:29:50,339 import 702 00:29:50,339 --> 00:29:54,380 pero no pasa nada 703 00:29:54,380 --> 00:30:02,099 hacemos aquí un 704 00:30:02,240 --> 00:30:06,309 ¿Dónde está él? 705 00:30:08,049 --> 00:30:09,910 Al lado del file output stream 706 00:30:09,910 --> 00:30:10,269 Para 707 00:30:10,269 --> 00:30:15,930 Bueno, las de ficheros 708 00:30:15,930 --> 00:30:17,210 Son todas de javaio 709 00:30:17,210 --> 00:30:18,890 Pero esas ya son 710 00:30:18,890 --> 00:30:20,529 Vale, file 711 00:30:20,529 --> 00:30:23,589 Ya lo tenemos ahí, el window adapter ya 712 00:30:23,589 --> 00:30:24,690 Nos sobra 713 00:30:24,690 --> 00:30:27,390 Javaio 714 00:30:27,390 --> 00:30:28,250 Ya está ahí 715 00:30:28,250 --> 00:30:30,470 Y 716 00:30:30,470 --> 00:30:33,309 Entonces, o bien le pasamos el file 717 00:30:33,309 --> 00:30:34,609 o este, en este caso 718 00:30:34,609 --> 00:30:36,789 es más corto pasar el nombre del fichero 719 00:30:36,789 --> 00:30:39,130 lo que pasa es que normalmente a este 720 00:30:39,130 --> 00:30:41,170 método podríamos haber llegado habiéndole 721 00:30:41,170 --> 00:30:43,309 pasado un parámetro o que lo coge 722 00:30:43,309 --> 00:30:44,410 el de otro sitio 723 00:30:44,410 --> 00:30:47,230 y cuando un fichero se pasa por parámetros eso le pasa 724 00:30:47,230 --> 00:30:48,970 al objeto file, no a la cadena 725 00:30:48,970 --> 00:30:50,950 pero bueno, entonces file output string 726 00:30:50,950 --> 00:30:52,990 me dirá, oye cuidado 727 00:30:52,990 --> 00:30:54,769 que puede que haya una excepción 728 00:30:54,769 --> 00:30:57,390 como veis, ni se plantea 729 00:30:57,390 --> 00:30:59,250 ofrecerme el throws, porque yo no 730 00:30:59,250 --> 00:31:01,210 puedo poner el throws aquí, porque si lo pusiera aquí 731 00:31:01,210 --> 00:31:02,890 estaría cambiando la cabecera del método 732 00:31:02,890 --> 00:31:30,240 Y este es un método sobrescrito, entonces no puedo tocar la cabecera, entonces ni me lo ofrece. En algunas cosas sí es relativamente listo Eclipse. Vale, FileOutputString, ahora ya sí, vamos a meterlo todo en el mismo try-catch, ahora ya sí que podemos asociar el ObjectOutputString a este, al F. 733 00:31:30,240 --> 00:31:34,869 e importamos 734 00:31:34,869 --> 00:31:36,049 object output string 735 00:31:36,049 --> 00:31:37,269 de java.io 736 00:31:37,269 --> 00:31:39,349 y ahora 737 00:31:39,349 --> 00:31:41,450 y de nuevo la excepción 738 00:31:41,450 --> 00:31:43,569 pero añadimos un catch 739 00:31:43,569 --> 00:31:44,730 ahora ya tiene dos catch 740 00:31:44,730 --> 00:31:48,509 y ahora ya 741 00:31:48,509 --> 00:31:50,130 hay que escribir el archivo 742 00:31:50,130 --> 00:31:52,329 hay que escribir las facturas 743 00:31:52,329 --> 00:31:54,250 todas, entonces en este caso 744 00:31:54,250 --> 00:31:56,569 estamos poniendo que si el archivo 745 00:31:56,569 --> 00:31:57,750 ya existía de antes 746 00:31:57,750 --> 00:31:59,869 lo elimine y empiece de nuevo 747 00:31:59,869 --> 00:32:02,309 vale, pero es que esa opción nos vale 748 00:32:02,309 --> 00:32:04,329 porque cuando la aplicación ha arrancado ha cargado 749 00:32:04,329 --> 00:32:06,309 ya todas las que había, luego en el map están todas 750 00:32:06,309 --> 00:32:08,109 entonces yo quiero volver a escribirlas todas 751 00:32:08,109 --> 00:32:10,230 y lo que había antes en el fichero lo elimino 752 00:32:10,230 --> 00:32:11,250 entonces 753 00:32:11,250 --> 00:32:14,309 en este caso no pondríamos el 754 00:32:14,309 --> 00:32:16,430 true después, vale, ahora ya simplemente 755 00:32:16,430 --> 00:32:17,369 recorremos el map 756 00:32:17,369 --> 00:32:20,369 e incluso 757 00:32:20,369 --> 00:32:21,130 podríamos 758 00:32:21,130 --> 00:32:24,150 tratar el map, es un objeto a su vez 759 00:32:24,150 --> 00:32:26,269 pues podríamos escribir el 760 00:32:26,269 --> 00:32:28,150 map de golpe, no hace falta que vayamos 761 00:32:28,150 --> 00:32:30,269 objeto por objeto del map y escribir 762 00:32:30,269 --> 00:32:32,190 uno por uno, podríamos, podríamos mandar 763 00:32:32,190 --> 00:32:34,230 el propio map, ¿vale? pero vamos a escribir 764 00:32:34,230 --> 00:32:35,609 los objetos uno por uno para 765 00:32:35,609 --> 00:32:37,009 que veamos una cosa 766 00:32:37,009 --> 00:32:40,049 podría, ¿vale? 767 00:32:40,109 --> 00:32:41,869 pero vamos a enviar los objetos uno por uno 768 00:32:41,869 --> 00:32:44,250 entonces, así, vamos a recorrer 769 00:32:44,250 --> 00:32:45,849 el map, te estás durmiendo, Pablo 770 00:32:45,849 --> 00:32:53,950 ¿cómo recorremos el map? vamos a 771 00:32:53,950 --> 00:32:56,309 ir sencillo, vamos a sacar 772 00:32:56,309 --> 00:32:58,650 vamos a sacar 773 00:32:58,650 --> 00:33:00,450 un set 774 00:33:00,450 --> 00:33:01,230 con las claves 775 00:33:01,230 --> 00:33:05,069 Vamos a sacar un set con las claves 776 00:33:05,069 --> 00:33:06,809 Y ya está 777 00:33:06,809 --> 00:33:10,410 En 778 00:33:10,410 --> 00:33:17,049 Datos.facturas.keyset 779 00:33:17,049 --> 00:33:18,450 ¿Vale? 780 00:33:18,630 --> 00:33:20,470 Este es un set con las claves 781 00:33:20,470 --> 00:33:21,690 Pues vamos clave por clave 782 00:33:21,690 --> 00:33:22,849 Y añadimos 783 00:33:22,849 --> 00:33:23,970 A 784 00:33:23,970 --> 00:33:25,450 Objet.outputString 785 00:33:25,450 --> 00:33:26,329 Tiene un método 786 00:33:26,329 --> 00:33:27,950 Estupendo 787 00:33:27,950 --> 00:33:28,730 Que es el método 788 00:33:28,730 --> 00:33:29,549 WriteObject 789 00:33:29,549 --> 00:33:31,289 Para mandar el objeto a mogollón 790 00:33:31,289 --> 00:33:33,190 ¿Y qué objeto queremos enviar? 791 00:33:33,630 --> 00:33:35,690 Pues de datos.facturas 792 00:33:35,690 --> 00:33:37,910 queremos enviar el get 793 00:33:37,910 --> 00:33:39,630 numfactura. 794 00:33:40,289 --> 00:33:41,769 Ese es el que queremos enviar. 795 00:33:43,809 --> 00:33:45,029 Numfact, efectivamente. 796 00:33:46,329 --> 00:33:47,329 ¡Hala! Ya hemos guardado 797 00:33:47,329 --> 00:33:49,069 todas las facturas una por una 798 00:33:49,069 --> 00:33:51,230 y ahora ya lo único que tenemos que hacer es 799 00:33:51,230 --> 00:33:53,450 como tenemos 800 00:33:53,450 --> 00:33:55,049 los dos flujos, uno por 801 00:33:55,049 --> 00:33:57,589 abiertos, pues vamos a cerrar los dos 802 00:33:57,589 --> 00:34:02,589 y ya está. 803 00:34:03,289 --> 00:34:04,410 Entonces se van a ver quedados 804 00:34:04,410 --> 00:34:06,450 todos guardados y salimos de la aplicación. 805 00:34:06,670 --> 00:34:13,250 y el propio map como es un objeto 806 00:34:13,250 --> 00:34:14,869 te lo guarda todo a mogollón 807 00:34:14,869 --> 00:34:16,809 eso luego nos va a facilitar la lectura 808 00:34:16,809 --> 00:34:17,969 porque haríamos un solo real 809 00:34:17,969 --> 00:34:19,809 pero vamos a dejarlo así 810 00:34:19,809 --> 00:34:22,530 entonces vamos a ejecutar a ver si al cerrar 811 00:34:22,530 --> 00:34:24,530 realmente nos aparece un archivo 812 00:34:24,530 --> 00:34:26,570 que no vamos a poder leer porque tiene información rara 813 00:34:26,570 --> 00:34:28,210 y 814 00:34:28,210 --> 00:34:32,780 adiós 815 00:34:32,780 --> 00:34:33,239 hasta luego 816 00:34:38,300 --> 00:34:41,460 pero si estás disfrutando 817 00:34:41,460 --> 00:34:42,619 Pablo, que lo sé yo 818 00:34:42,619 --> 00:34:46,349 vale, vamos a ver 819 00:34:46,349 --> 00:34:48,449 cuántas cosas hemos hecho mal 820 00:34:48,449 --> 00:34:49,630 venga 821 00:34:49,630 --> 00:34:51,730 dirección 822 00:34:51,730 --> 00:34:54,170 pues dónde va a estar la factura 823 00:34:54,170 --> 00:34:55,210 en Madrid 824 00:34:55,210 --> 00:34:58,309 ¿cuánto? 300 euros 825 00:34:58,309 --> 00:35:00,849 va a ser una factura 826 00:35:00,849 --> 00:35:03,190 a la empresa, porque 300 euros es mucha pasta 827 00:35:03,190 --> 00:35:04,969 venga 828 00:35:04,969 --> 00:35:06,929 insertamos factura 829 00:35:06,929 --> 00:35:08,130 a ver qué pasa 830 00:35:08,130 --> 00:35:10,789 No ha salido nada rojo 831 00:35:10,789 --> 00:35:12,110 Eso no significa nada 832 00:35:12,110 --> 00:35:13,289 Claro, nos falta 833 00:35:13,289 --> 00:35:16,230 En el evento de insertar factura 834 00:35:16,230 --> 00:35:17,869 Deberíamos añadir esto 835 00:35:17,869 --> 00:35:19,250 Pero ahora lo hacemos, no pasa nada 836 00:35:19,250 --> 00:35:21,289 Venga, vamos a insertar otra 837 00:35:21,289 --> 00:35:23,150 Claro 838 00:35:23,150 --> 00:35:25,369 Vale, eso 839 00:35:25,369 --> 00:35:28,250 Vamos a insertar una particular a Barcelona 840 00:35:28,250 --> 00:35:29,969 Insertar factura 841 00:35:29,969 --> 00:35:31,269 Vale 842 00:35:31,269 --> 00:35:34,349 Ahí están, pero como no tenemos todavía 843 00:35:34,349 --> 00:35:35,510 Lo de recuperar, pues nada 844 00:35:35,510 --> 00:35:36,809 Ahora vamos a cerrar 845 00:35:36,809 --> 00:35:38,710 cerramos 846 00:35:38,710 --> 00:35:41,329 ha salido un error 847 00:35:41,329 --> 00:35:42,190 a ver 848 00:35:42,190 --> 00:35:44,349 al evento ha tenido que llamar 849 00:35:44,349 --> 00:35:46,670 porque si no ha llamado al evento habría cerrado 850 00:35:46,670 --> 00:35:47,610 tan ricamente 851 00:35:47,610 --> 00:35:50,050 al evento ha llamado y que nos ha dicho 852 00:35:50,050 --> 00:35:52,909 cuidado que factura 853 00:35:52,909 --> 00:35:54,869 no es un objeto serializable 854 00:35:54,869 --> 00:35:57,150 como pretende serializarlo 855 00:35:57,150 --> 00:35:58,650 un archivo si no es serializable 856 00:35:58,650 --> 00:35:59,510 por dios 857 00:35:59,510 --> 00:36:02,809 eso muy bien 858 00:36:02,809 --> 00:36:04,570 veis como ya vais dando las respuestas 859 00:36:04,570 --> 00:36:07,309 ya vais dando 860 00:36:07,309 --> 00:36:09,469 los pensamientos informáticos 861 00:36:09,469 --> 00:36:10,969 que es que si este tío te dice 862 00:36:10,969 --> 00:36:12,590 no eres serializable 863 00:36:12,590 --> 00:36:14,829 que tiene que hacer una clase, no pasa nada 864 00:36:14,829 --> 00:36:17,650 me convierto en alguien serializable 865 00:36:17,650 --> 00:36:19,090 como acaba enable 866 00:36:19,090 --> 00:36:21,050 automáticamente hacemos la conexión 867 00:36:21,050 --> 00:36:22,230 de que va a ser una interfaz 868 00:36:22,230 --> 00:36:24,309 al acabar enable 869 00:36:24,309 --> 00:36:27,250 hacemos la, vale, pues ya está 870 00:36:27,250 --> 00:36:29,550 decimos, ah, vale 871 00:36:29,550 --> 00:36:30,650 no pasa nada 872 00:36:30,650 --> 00:36:32,789 ¿cómo te conviertes en serializable? 873 00:36:32,789 --> 00:36:35,789 Implementando la interfaz que te dé ese comportamiento 874 00:36:35,789 --> 00:36:37,489 Pues ya está 875 00:36:37,489 --> 00:36:41,550 Implement serializable 876 00:36:41,550 --> 00:36:43,530 Y serializable 877 00:36:43,530 --> 00:36:45,630 Pues lo importamos de javallo también 878 00:36:45,630 --> 00:36:47,909 Ah, la ya es serializable 879 00:36:47,909 --> 00:36:49,869 Sí 880 00:36:49,869 --> 00:36:55,389 No, ya van a estar serializados 881 00:36:55,389 --> 00:36:56,409 Sí, sí 882 00:36:56,409 --> 00:36:58,949 Vale, entonces vamos a volver a 883 00:36:58,949 --> 00:37:01,010 Pero a ver 884 00:37:01,010 --> 00:37:04,750 ya es serializable 885 00:37:04,750 --> 00:37:06,329 con lo cual ya la puedo serializar 886 00:37:06,329 --> 00:37:13,570 bajo el criterio de soy serializable 887 00:37:13,570 --> 00:37:15,610 con lo cual eres capaz de coger todas mis propiedades 888 00:37:15,610 --> 00:37:17,269 ponerlas en fillete y meterlas en el fichero 889 00:37:17,269 --> 00:37:18,630 no hace falta más 890 00:37:18,630 --> 00:37:22,409 claro 891 00:37:22,409 --> 00:37:25,510 porque para que un objeto 892 00:37:25,510 --> 00:37:27,570 pueda ser sacado de una tubería 893 00:37:27,570 --> 00:37:29,630 os acordáis que la tubería la he dibujado así 894 00:37:29,630 --> 00:37:32,130 eso significa que las cosas tienen que entrar en fila 895 00:37:32,130 --> 00:37:34,550 entonces, entrar en fila 896 00:37:34,550 --> 00:37:36,809 es un bit detrás de otro serializa 897 00:37:36,809 --> 00:37:37,869 eso es serializar 898 00:37:37,869 --> 00:37:40,309 entonces un objeto no está serializado 899 00:37:40,309 --> 00:37:42,650 pero la interfaz serializable 900 00:37:42,650 --> 00:37:43,349 no te obliga a informar 901 00:37:43,349 --> 00:37:45,670 no necesita más informar 902 00:37:45,670 --> 00:37:48,309 no, no, no, no, el hecho de que 903 00:37:48,309 --> 00:37:49,369 algo implemente serializable 904 00:37:49,369 --> 00:37:52,329 ya coge dentro de sí para implementarlo 905 00:37:52,329 --> 00:37:53,769 todo lo que serializable tiene 906 00:37:53,769 --> 00:37:55,849 y todo lo que serializable ya tiene 907 00:37:55,849 --> 00:37:57,750 que tú has heredado por implementar 908 00:37:57,750 --> 00:38:00,170 ya es lo único que necesita 909 00:38:00,170 --> 00:38:02,130 el output stream para serializarte 910 00:38:02,130 --> 00:38:04,030 no necesita que tú implementes ningún 911 00:38:04,030 --> 00:38:05,369 método, necesita nada más 912 00:38:05,369 --> 00:38:10,030 claro, depende de la interfaz 913 00:38:10,030 --> 00:38:11,929 y para qué sirva, esta no te obliga a nada 914 00:38:11,929 --> 00:38:13,789 tú ya coges lo que tengas 915 00:38:13,789 --> 00:38:15,869 serializable y el output stream no le hace 916 00:38:15,869 --> 00:38:17,750 falta nada, lo que tenías serializable es suficiente 917 00:38:17,750 --> 00:38:19,829 venga, hemos insertado una 918 00:38:19,829 --> 00:38:20,610 ya nos vamos 919 00:38:20,610 --> 00:38:24,090 ya no, no nos vamos 920 00:38:24,090 --> 00:38:25,409 no, cerramos la 921 00:38:25,409 --> 00:38:27,730 uy, estoy a punto de quedarme 922 00:38:27,730 --> 00:38:29,070 sin batería 923 00:38:29,070 --> 00:38:30,650 y no lo sé 924 00:38:30,650 --> 00:38:34,670 que repetimos 925 00:38:34,670 --> 00:38:38,969 vale, a ver 926 00:38:38,969 --> 00:38:41,849 claro, o sea, entiendes 927 00:38:41,849 --> 00:38:43,670 que ahora el frame 928 00:38:43,670 --> 00:38:45,809 también recibe eventos 929 00:38:45,809 --> 00:38:47,929 entre ellos, pues esto es un evento 930 00:38:47,929 --> 00:38:49,750 esto es un evento 931 00:38:49,750 --> 00:38:52,449 y darle a que es un evento 932 00:38:52,449 --> 00:38:54,110 hasta ahora no hemos querido 933 00:38:54,110 --> 00:38:55,090 capturar ninguno 934 00:38:55,090 --> 00:38:56,949 porque poniendo 935 00:38:56,949 --> 00:38:58,550 el window on closing con esto 936 00:38:58,550 --> 00:39:00,949 era un atajo para que 937 00:39:00,949 --> 00:39:02,789 al darle a la X se hiciera un 938 00:39:02,789 --> 00:39:04,849 system exit, no teníamos que hacer 939 00:39:04,849 --> 00:39:06,670 un listener específico, es un atajo para que sea 940 00:39:06,670 --> 00:39:08,670 un system exit, pero es que ahora no nos vale solo el 941 00:39:08,670 --> 00:39:10,690 system exit, ahora queremos que además 942 00:39:10,690 --> 00:39:12,650 se lea un map, se pasa, con lo cual tenemos 943 00:39:12,650 --> 00:39:14,750 que capturar el evento, los eventos de 944 00:39:14,750 --> 00:39:16,570 frame no se capturan con action listener 945 00:39:16,570 --> 00:39:18,710 sino con window listener, pues 946 00:39:18,710 --> 00:39:20,489 por eso hemos hecho una clase interna 947 00:39:20,489 --> 00:39:22,289 window listener 948 00:39:22,289 --> 00:39:24,670 aquí, que podía haber sido 949 00:39:24,670 --> 00:39:25,710 windowAdapter también 950 00:39:25,710 --> 00:39:28,309 porque una herida de la otra 951 00:39:28,309 --> 00:39:30,010 pues por eso hemos hecho una clase interna 952 00:39:30,010 --> 00:39:32,929 windowListener que tiene unos métodos 953 00:39:32,929 --> 00:39:34,889 y en particular el método 954 00:39:34,889 --> 00:39:36,670 windowClosing es el que se ejecuta 955 00:39:36,670 --> 00:39:38,030 cuando tú le das a la X 956 00:39:38,030 --> 00:39:40,610 pues entonces hemos metido en este método 957 00:39:40,610 --> 00:39:42,429 lo que queríamos, escribir el objeto 958 00:39:42,429 --> 00:39:43,710 ¿había otro método que tenía el closing? 959 00:39:44,130 --> 00:39:46,230 sí, no sé muy bien cuál es la diferencia 960 00:39:46,230 --> 00:39:49,170 la tendrá evidentemente 961 00:39:49,170 --> 00:39:50,550 esto es algo que pasa 962 00:39:50,550 --> 00:39:52,389 una vez que está cerrado, a lo mejor esto es cuando 963 00:39:52,389 --> 00:39:54,190 le das a la X y esto es 964 00:39:54,190 --> 00:39:56,670 si has tenido éxito y has podido soltar 965 00:39:56,670 --> 00:39:57,989 y se ha cerrado 966 00:39:57,989 --> 00:39:59,590 no lo sé, se podría comprobar 967 00:39:59,590 --> 00:40:02,309 entonces claro 968 00:40:02,309 --> 00:40:04,409 nos falta asociarle 969 00:40:04,409 --> 00:40:06,250 al frame un objeto 970 00:40:06,250 --> 00:40:08,010 de estos, que es lo que hemos hecho con esta línea 971 00:40:08,010 --> 00:40:10,489 el frame 972 00:40:10,489 --> 00:40:12,590 que es this, el objeto this es el propio frame 973 00:40:12,590 --> 00:40:14,230 pues le hemos añadido un window 974 00:40:14,230 --> 00:40:16,449 laser que es un objeto de la clase interna que hemos hecho 975 00:40:16,449 --> 00:40:17,730 entonces 976 00:40:17,730 --> 00:40:20,210 nos habrá tenido que aparecer 977 00:40:20,210 --> 00:40:22,010 aquí un objeto 978 00:40:22,010 --> 00:40:25,369 pues justo, nos ha aparecido 979 00:40:25,369 --> 00:40:26,650 facturas.dat 980 00:40:26,650 --> 00:40:28,510 que es el que tiene los archivos 981 00:40:28,510 --> 00:40:30,949 pero claro, este no es un fichero de texto 982 00:40:30,949 --> 00:40:32,949 es un fichero de bits serializados 983 00:40:32,949 --> 00:40:35,469 entonces si le dais a noble click 984 00:40:35,469 --> 00:40:37,590 pues aquí no veis nada 985 00:40:37,590 --> 00:40:39,329 porque que hace el editor del eclipse 986 00:40:39,329 --> 00:40:41,389 lo interpreta como haste 987 00:40:41,389 --> 00:40:43,150 y se va uno por uno y como haste le sale 988 00:40:43,150 --> 00:40:44,230 esta cosa 989 00:40:44,230 --> 00:40:47,610 pero esto no vale para nada 990 00:40:47,610 --> 00:40:48,469 ¿vale? 991 00:40:49,010 --> 00:40:50,449 a ver, los stream 992 00:40:50,449 --> 00:40:52,570 los ha traducido bien, pero el resto 993 00:40:52,570 --> 00:40:53,429 no lo ha traducido bien. 994 00:40:54,469 --> 00:40:56,190 Entonces, ¿para qué sirve este archivo 995 00:40:56,190 --> 00:40:58,570 facturas.dat? Sirve 996 00:40:58,570 --> 00:41:00,730 única y exclusivamente 997 00:41:00,730 --> 00:41:02,389 para que una aplicación lo abra. 998 00:41:03,449 --> 00:41:03,610 ¿Vale? 999 00:41:04,630 --> 00:41:06,230 Luego, luego, 1000 00:41:07,449 --> 00:41:08,469 ¿cómo podríamos ya 1001 00:41:08,469 --> 00:41:10,409 modificar esta aplicación? Pues 1002 00:41:10,409 --> 00:41:11,670 en el momento de arrancar, 1003 00:41:12,389 --> 00:41:14,989 mirar si existe un fichero que se llama facturas.dat. 1004 00:41:14,989 --> 00:41:16,769 Y si el fichero existe, 1005 00:41:16,969 --> 00:41:17,610 cargarlo. 1006 00:41:17,610 --> 00:41:20,630 Vale, efectivamente 1007 00:41:20,630 --> 00:41:23,150 Entonces, aquí cuando estamos arrancando 1008 00:41:23,150 --> 00:41:24,530 La aplicación de mi constructor 1009 00:41:24,530 --> 00:41:26,769 Pues vamos a hacer aquí, por ejemplo 1010 00:41:26,769 --> 00:41:28,170 Antes que nada, esa parte 1011 00:41:28,170 --> 00:41:30,610 Vamos a ver si existe un fichero así 1012 00:41:30,610 --> 00:41:33,050 Pues vamos primero a crearnos un objeto 1013 00:41:33,050 --> 00:41:33,610 File 1014 00:41:33,610 --> 00:41:36,889 Que sea un new file 1015 00:41:36,889 --> 00:41:39,329 Con facturas 1016 00:41:39,329 --> 00:41:40,349 Punto dat 1017 00:41:40,349 --> 00:41:42,449 Vale 1018 00:41:42,449 --> 00:41:44,590 Vale, vamos a ver 1019 00:41:44,590 --> 00:41:49,389 No, no, es que esto no es para escribir 1020 00:41:49,389 --> 00:41:51,349 Esto es solamente un objeto file 1021 00:41:51,349 --> 00:41:52,829 Que nos permite extraer información 1022 00:41:52,829 --> 00:41:53,869 Pero no su contenido 1023 00:41:53,869 --> 00:41:57,070 En particular queremos la información de si existe o no existe 1024 00:41:57,070 --> 00:41:59,869 Vale, pues si este fichero file 1025 00:41:59,869 --> 00:42:01,369 Existe 1026 00:42:01,369 --> 00:42:02,929 Si existe 1027 00:42:02,929 --> 00:42:04,269 Entonces 1028 00:42:04,269 --> 00:42:06,469 Vamos a tener que cargar los datos 1029 00:42:06,469 --> 00:42:08,550 En lugar de meterlo aquí, que esto ya nos está quedando 1030 00:42:08,550 --> 00:42:09,550 Un constructor horrible 1031 00:42:09,550 --> 00:42:11,409 Vamos a hacernos un método 1032 00:42:11,409 --> 00:42:14,070 Que sea cargar los datos 1033 00:42:14,070 --> 00:42:14,869 y ya está 1034 00:42:14,869 --> 00:42:18,070 pues vamos a hacernos un método privado 1035 00:42:18,070 --> 00:42:19,849 auxiliar, cargar datos 1036 00:42:19,849 --> 00:42:23,960 porque esto es solamente 1037 00:42:23,960 --> 00:42:25,320 para leer del fichero y pasar al map 1038 00:42:25,320 --> 00:42:27,619 lo demás se hace sí o sí 1039 00:42:27,619 --> 00:42:32,909 como file new file 1040 00:42:32,909 --> 00:42:34,010 no hombre, porque yo necesito 1041 00:42:34,010 --> 00:42:36,849 hacer el exist y para eso necesito que le exista 1042 00:42:36,849 --> 00:42:37,389 no te entiendo 1043 00:42:37,389 --> 00:42:44,469 vale 1044 00:42:44,469 --> 00:42:46,630 solo te falta decir, porque tengo que esperar que me la soluciones 1045 00:42:46,630 --> 00:42:47,010 tú 1046 00:42:47,010 --> 00:42:51,670 Vale, pues vamos a hacer el cargar datos 1047 00:42:51,670 --> 00:42:54,010 Venga, creamos el método cargar datos 1048 00:42:54,010 --> 00:42:55,650 Y aquí ya sí que aplica 1049 00:42:55,650 --> 00:42:58,110 Cargar datos está aquí abajo 1050 00:42:58,110 --> 00:43:00,309 Recordad que validar 1051 00:43:00,309 --> 00:43:01,949 Se os ha quedado a vosotros si lo queréis 1052 00:43:01,949 --> 00:43:04,449 Cargar datos ahora ya sí que 1053 00:43:04,449 --> 00:43:06,949 Ah, ya entiendo lo que dices 1054 00:43:06,949 --> 00:43:08,329 Que por acá te haces un cargar datos 1055 00:43:08,329 --> 00:43:10,409 Y dentro haces, si el fichero existe 1056 00:43:10,409 --> 00:43:11,449 Lo cargas, si no, no 1057 00:43:11,449 --> 00:43:14,269 Usadlo como quieras, ¿por qué no? 1058 00:43:14,869 --> 00:43:15,269 Pues 1059 00:43:15,269 --> 00:43:17,309 o sea 1060 00:43:17,309 --> 00:43:19,610 la máquina virtual va a ejecutar el mismo 1061 00:43:19,610 --> 00:43:20,849 código sí o sí 1062 00:43:20,849 --> 00:43:27,250 venga, cargar datos 1063 00:43:27,250 --> 00:43:28,289 ahora vamos a leer 1064 00:43:28,289 --> 00:43:30,710 aquí ya asumimos que el fichero existe 1065 00:43:30,710 --> 00:43:32,829 Ana no lo asume, con lo cual Ana se habrá hecho 1066 00:43:32,829 --> 00:43:34,409 aquí su file y si 1067 00:43:34,409 --> 00:43:36,730 no existe habrá hecho un retun 1068 00:43:36,730 --> 00:43:37,710 ¿verdad? 1069 00:43:38,769 --> 00:43:40,849 vale, y entonces ya 1070 00:43:40,849 --> 00:43:42,969 la cosa se empieza 1071 00:43:42,969 --> 00:43:44,849 a poner fea, no le enseñéis 1072 00:43:44,849 --> 00:43:46,170 a Rosa nuestras aplicaciones 1073 00:43:46,170 --> 00:43:48,730 No, si con preguntarle una duda 1074 00:43:48,730 --> 00:43:49,289 ya se cabrea 1075 00:43:49,289 --> 00:43:52,349 Objet 1076 00:43:52,349 --> 00:43:53,610 ¿Eh? 1077 00:43:55,869 --> 00:43:56,789 ¿Pero qué hacéis? 1078 00:43:56,849 --> 00:43:57,849 ¿Qué hacéis? Por Dios 1079 00:43:57,849 --> 00:44:04,610 Pues no te dejes copiar 1080 00:44:04,610 --> 00:44:06,630 Eso es de primero de estudiante 1081 00:44:06,630 --> 00:44:08,489 No te dejes copiar porque 1082 00:44:08,489 --> 00:44:10,070 la copia tienen culpa los dos 1083 00:44:10,070 --> 00:44:11,250 El que copia y el copiado 1084 00:44:11,250 --> 00:44:14,889 ¿Cómo que no es culpa tuya? 1085 00:44:15,010 --> 00:44:15,869 Tú no dejes copiarte 1086 00:44:15,869 --> 00:44:18,210 vale, pues el 1087 00:44:18,210 --> 00:44:20,369 object input string es para llevar objetos 1088 00:44:20,369 --> 00:44:22,289 del fichero al map, que es lo que queremos 1089 00:44:22,289 --> 00:44:24,269 object input string 1090 00:44:24,269 --> 00:44:28,690 hay que pasarle un file input string 1091 00:44:28,690 --> 00:44:30,349 lo voy a poner ya 1092 00:44:30,349 --> 00:44:30,829 en línea 1093 00:44:30,829 --> 00:44:37,039 lo voy a poner ya en línea, un new file input string 1094 00:44:37,039 --> 00:44:38,539 asociado 1095 00:44:38,539 --> 00:44:40,739 cargar datos, vamos a pasarle el 1096 00:44:40,739 --> 00:44:41,000 file 1097 00:44:41,000 --> 00:44:43,360 de antes 1098 00:44:43,360 --> 00:44:46,699 vamos a pasarle el file a cargar datos 1099 00:44:46,699 --> 00:44:49,000 ahora es cuando subo y bajo 1100 00:44:49,000 --> 00:44:49,639 y os agobiáis 1101 00:44:49,639 --> 00:44:51,719 pues no os agobiéis 1102 00:44:51,719 --> 00:44:54,139 cargar datos necesita 1103 00:44:54,139 --> 00:44:56,780 el fichero sobre el que cargarlos 1104 00:44:56,780 --> 00:44:58,500 entonces se lo voy a pasar como parámetro 1105 00:44:58,500 --> 00:44:59,559 el fichero que tengo aquí 1106 00:44:59,559 --> 00:45:02,320 Ana no lo necesita, pero nosotros sí 1107 00:45:02,320 --> 00:45:06,559 bueno, sí, porque toda esta línea 1108 00:45:06,559 --> 00:45:07,719 ves ahí un cargar datos 1109 00:45:07,719 --> 00:45:10,739 ¿por qué puede tener esto? 1110 00:45:10,960 --> 00:45:12,920 ¿qué sentido podría tener si se lo queremos 1111 00:45:12,920 --> 00:45:14,840 buscar? que el que lo está mirando 1112 00:45:14,840 --> 00:45:17,019 contempla 1113 00:45:17,019 --> 00:45:18,820 interioriza, que no es una tontería 1114 00:45:18,820 --> 00:45:20,800 que podría no haber datos de partida 1115 00:45:20,800 --> 00:45:23,019 ¿vale? podría no haber datos 1116 00:45:23,019 --> 00:45:24,619 de partida, el que esté arreglando este código 1117 00:45:24,619 --> 00:45:25,280 está haciendo cosas 1118 00:45:25,280 --> 00:45:28,960 pero ya está, y no se tiene que meter a cargar datos 1119 00:45:28,960 --> 00:45:30,280 a ver que pinta eso 1120 00:45:30,280 --> 00:45:32,539 es el único sentido que podría tener 1121 00:45:32,539 --> 00:45:34,400 venga, pues, sí 1122 00:45:34,400 --> 00:45:36,039 que sí, que ya me voy 1123 00:45:36,039 --> 00:45:38,559 vale, entonces, cargar datos, le pasamos el fichero 1124 00:45:38,559 --> 00:45:39,900 nos vamos a cargar datos 1125 00:45:39,900 --> 00:45:41,679 y ahora ya 1126 00:45:41,679 --> 00:45:44,659 asociamos el file input string a este 1127 00:45:44,659 --> 00:45:45,519 que hemos pasado. 1128 00:45:48,320 --> 00:45:49,360 No hay ninguna rayada. 1129 00:45:50,280 --> 00:45:52,360 Obvio, input string necesita un objeto 1130 00:45:52,360 --> 00:45:54,079 file input string que a su vez 1131 00:45:54,079 --> 00:45:56,679 necesita el file o el 1132 00:45:56,679 --> 00:45:58,039 nombre del fichero. Da igual. 1133 00:45:58,679 --> 00:46:00,320 Una cosa o la otra. Le pasamos el file. 1134 00:46:01,000 --> 00:46:02,920 Ya nos ponemos a importar a saco. 1135 00:46:07,480 --> 00:46:08,639 Importamos a saco 1136 00:46:08,639 --> 00:46:09,619 y capturamos 1137 00:46:09,619 --> 00:46:11,280 con el try. 1138 00:46:12,420 --> 00:46:14,039 Multicatch porque hay varias excepciones. 1139 00:46:14,039 --> 00:46:16,699 vale, ya hemos abierto 1140 00:46:16,699 --> 00:46:18,360 para leer, ahora 1141 00:46:18,360 --> 00:46:20,420 leer no es tan fácil como escribir 1142 00:46:20,420 --> 00:46:22,460 porque cuando uno escribe, escribe y se despreocupa 1143 00:46:22,460 --> 00:46:24,380 de lo demás, porque ya el fichero 1144 00:46:24,380 --> 00:46:26,039 se irá haciendo grande, pero irá albergando 1145 00:46:26,039 --> 00:46:28,019 leer no sabemos 1146 00:46:28,019 --> 00:46:30,320 hasta cuando tenemos que leer, entonces hay que hacer 1147 00:46:30,320 --> 00:46:32,239 un bucle de lectura, que es lee 1148 00:46:32,239 --> 00:46:34,400 mientras no hayas llegado al final, lee mientras no hayas 1149 00:46:34,400 --> 00:46:35,920 llegado al final, claro 1150 00:46:35,920 --> 00:46:38,139 hay un hash 1151 00:46:38,139 --> 00:46:39,880 next, pero 1152 00:46:39,880 --> 00:46:44,639 si hay una bailable 1153 00:46:44,639 --> 00:46:46,519 que te dice sí 1154 00:46:46,519 --> 00:46:48,860 pero bueno, vamos a hacerlo 1155 00:46:48,860 --> 00:46:50,840 mucho más general, que nos valga 1156 00:46:50,840 --> 00:46:52,800 para cualquier flujo 1157 00:46:52,800 --> 00:46:54,840 de asociado a un fichero, para cualquiera 1158 00:46:54,840 --> 00:46:58,800 porque el 1159 00:46:58,800 --> 00:47:00,599 método bailable hay veces que 1160 00:47:00,599 --> 00:47:02,460 no funciona muy bien y no 1161 00:47:02,460 --> 00:47:04,820 bueno, en cualquier caso 1162 00:47:04,820 --> 00:47:06,900 vamos a una solución más general, para cualquier 1163 00:47:06,900 --> 00:47:09,000 flujo, ¿qué pasa cuando 1164 00:47:09,000 --> 00:47:10,800 leemos 1165 00:47:10,800 --> 00:47:12,880 de un archivo 1166 00:47:12,880 --> 00:47:15,019 habiéndonos salido ya fuera 1167 00:47:15,019 --> 00:47:17,320 que sale 1168 00:47:17,320 --> 00:47:18,739 una excepción de tipo 1169 00:47:18,739 --> 00:47:20,019 en odd file 1170 00:47:20,019 --> 00:47:23,059 exception, se va a lanzar 1171 00:47:23,059 --> 00:47:24,820 esta excepción, en odd file 1172 00:47:24,820 --> 00:47:27,420 esa misma 1173 00:47:27,420 --> 00:47:29,420 entonces vamos a capturarla 1174 00:47:29,420 --> 00:47:31,159 y vamos, lee 1175 00:47:31,159 --> 00:47:33,500 mientras no haya saltado 1176 00:47:33,500 --> 00:47:35,119 esa excepción, es decir 1177 00:47:35,119 --> 00:47:36,079 vamos a hacer algo así 1178 00:47:36,079 --> 00:47:40,800 vamos a hacernos un boolean 1179 00:47:40,800 --> 00:47:43,420 que sea fin archivo 1180 00:47:43,420 --> 00:47:46,659 por ejemplo, inicialmente no hemos llegado a fin archivo 1181 00:47:46,659 --> 00:47:49,659 inicialmente no hemos llegado a fin archivo 1182 00:47:49,659 --> 00:47:53,599 ahora, mientras no hayas llegado 1183 00:47:53,599 --> 00:47:54,539 a fin archivo 1184 00:47:54,539 --> 00:47:59,300 mientras no hayas llegado a fin de archivo 1185 00:47:59,300 --> 00:48:01,480 ¿qué tienes que hacer mientras no hayas llegado a fin archivo? 1186 00:48:02,000 --> 00:48:04,500 intenta hacer la lectura de un objeto, inténtalo 1187 00:48:04,500 --> 00:48:10,480 y en el caso de que te salga la excepción 1188 00:48:10,480 --> 00:48:12,320 en not file exception, captúramela 1189 00:48:12,320 --> 00:48:14,940 si te sale not file exception 1190 00:48:14,940 --> 00:48:17,039 me la capturas 1191 00:48:17,039 --> 00:48:19,420 y en el momento 1192 00:48:19,420 --> 00:48:21,139 de capturarmela porque ha salido 1193 00:48:21,139 --> 00:48:22,739 me pones fin archivo a true 1194 00:48:22,739 --> 00:48:27,190 entonces esto es más general 1195 00:48:27,190 --> 00:48:29,110 no dependemos de conocer 1196 00:48:29,110 --> 00:48:30,550 ningún método 1197 00:48:30,550 --> 00:48:32,989 y ahora ya cuando sale la excepción 1198 00:48:32,989 --> 00:48:35,369 he llegado al fin del flujo, esto se ha puesto a true 1199 00:48:35,369 --> 00:48:37,329 el while ya no va a intentar hacer más 1200 00:48:37,329 --> 00:48:39,849 vale, importamos 1201 00:48:39,849 --> 00:48:41,150 en not file exception 1202 00:48:41,150 --> 00:48:43,210 y ahora aquí que tenemos que hacer 1203 00:48:43,210 --> 00:48:44,630 mientras no hayamos llegado a fin archivo 1204 00:48:44,630 --> 00:48:46,969 hacemos la lectura del flujo 1205 00:48:46,969 --> 00:48:48,949 pues el OIS este tiene un método 1206 00:48:48,949 --> 00:48:51,050 como no podía ser de otra manera 1207 00:48:51,050 --> 00:48:52,389 readObject 1208 00:48:52,389 --> 00:48:55,190 que te va leyendo los objetos 1209 00:48:55,190 --> 00:48:56,449 secuencialmente desde el primero 1210 00:48:56,449 --> 00:48:57,809 luego se queda presionado y se viene así 1211 00:48:57,809 --> 00:49:01,110 readObject te devuelve 1212 00:49:01,110 --> 00:49:02,409 un objeto 1213 00:49:02,409 --> 00:49:04,030 como él no sabe lo que hay ahí 1214 00:49:04,030 --> 00:49:05,730 te lo devuelve como object 1215 00:49:05,730 --> 00:49:07,590 pero nosotros sabemos que hay facturas 1216 00:49:07,590 --> 00:49:08,849 entonces no pasaría nada 1217 00:49:08,849 --> 00:49:11,969 no lo puedes parametrizar 1218 00:49:11,969 --> 00:49:40,760 Entonces, lo hacemos un casting a factura y no pasaría nada, pero la idea es que queremos hacer con este, pues lo queremos meter en el map. Entonces, en nuestro map de datos, que como acabamos de arrancar la aplicación, está limpito y vacío, en nuestro map de datos, pues vamos a meter, bueno, vamos a, como tenemos que meter el número de la factura primero y luego eso, pues nos leemos primero la factura. 1219 00:49:40,760 --> 00:49:42,800 esto de nuevo es una excepción 1220 00:49:42,800 --> 00:49:44,139 que lo añadimos en una 1221 00:49:44,139 --> 00:49:45,519 en una 1222 00:49:45,519 --> 00:49:48,239 en una catch añadido 1223 00:49:48,239 --> 00:49:48,900 vale 1224 00:49:48,900 --> 00:49:51,559 y ahora 1225 00:49:51,559 --> 00:49:55,219 que pasa 1226 00:49:55,219 --> 00:49:56,900 vale y ahora ya si que podemos 1227 00:49:56,900 --> 00:49:57,719 poner en el map 1228 00:49:57,719 --> 00:50:03,300 datos.facturas.put 1229 00:50:03,300 --> 00:50:07,239 la factura que acabamos de leer 1230 00:50:07,239 --> 00:50:09,139 .get no factura 1231 00:50:09,139 --> 00:50:11,199 y la factura enterita 1232 00:50:11,199 --> 00:50:15,639 vale, entonces los leemos todos y los metemos 1233 00:50:15,639 --> 00:50:17,980 y ahora hay que actualizar 1234 00:50:17,980 --> 00:50:19,380 claro, y ahora 1235 00:50:19,380 --> 00:50:21,079 cuando ya hemos terminado de leer el archivo 1236 00:50:21,079 --> 00:50:23,619 aquí, vamos a coger el último 1237 00:50:23,619 --> 00:50:25,579 número de factura, le sumamos uno 1238 00:50:25,579 --> 00:50:27,219 y actualizamos datos en un factura 1239 00:50:27,219 --> 00:50:28,019 entonces 1240 00:50:28,019 --> 00:50:33,460 el último, para sacar 1241 00:50:33,460 --> 00:50:35,500 el último, no tenemos la clave de lul 1242 00:50:35,500 --> 00:50:37,039 no, pero vas actualizando con cada uno 1243 00:50:37,039 --> 00:50:39,300 como ya vas a recordarlo 1244 00:50:39,300 --> 00:50:42,199 sí, pero lo que podemos hacer es 1245 00:50:42,199 --> 00:50:44,179 sacar 1246 00:50:44,179 --> 00:50:46,199 factura, declararlo fuera 1247 00:50:46,199 --> 00:50:47,480 la pregunta, ¿cuándo está en orden? 1248 00:50:47,840 --> 00:50:48,900 ¿se guarda en orden bien? 1249 00:50:49,739 --> 00:50:50,820 la última puede salir 1250 00:50:50,820 --> 00:50:54,320 a ver, con el orden de iteración del map 1251 00:50:54,320 --> 00:50:55,900 recordad que es un trimap 1252 00:50:55,900 --> 00:50:58,099 con lo cual el orden de 1253 00:50:58,099 --> 00:51:00,340 interacción es el orden del integer 1254 00:51:00,340 --> 00:51:01,920 porque la clave es integer 1255 00:51:01,920 --> 00:51:04,179 y el integer tiene 1256 00:51:04,179 --> 00:51:05,960 un comparable con el orden natural 1257 00:51:05,960 --> 00:51:08,159 entonces se va a guardar con el orden de los enteros 1258 00:51:08,159 --> 00:51:09,320 Sí, en este caso sí, pero... 1259 00:51:09,320 --> 00:51:11,179 Claro, pero es una pregunta que tiene sentido, 1260 00:51:11,320 --> 00:51:13,699 porque recordad que las facturas están en un trimap. 1261 00:51:13,800 --> 00:51:14,500 ¿Eso qué significa? 1262 00:51:15,260 --> 00:51:18,659 Que, claro, da igual los puts que yo haga. 1263 00:51:18,900 --> 00:51:21,420 Si hago primero el put de 7, luego el put de 5, da igual. 1264 00:51:21,559 --> 00:51:23,940 Cuando yo itere, por el map, cuando itere, 1265 00:51:24,739 --> 00:51:28,480 el orden de iteración va a ser el orden que marca la clave. 1266 00:51:29,019 --> 00:51:32,079 Y la clave tiene que ser comparable, como ya sabemos, 1267 00:51:32,079 --> 00:51:34,000 porque es un trimap, e integer lo es, 1268 00:51:34,280 --> 00:51:35,960 porque por definición lo es, 1269 00:51:35,960 --> 00:51:37,980 y su comparable en particular 1270 00:51:37,980 --> 00:51:39,960 sigue el orden natural de los enteros 1271 00:51:39,960 --> 00:51:42,139 entonces cuando iteremos por el map 1272 00:51:42,139 --> 00:51:44,340 da igual que hayamos guardado primero la factura 7 1273 00:51:44,340 --> 00:51:46,300 y luego la 5, que se van a guardar 1274 00:51:46,300 --> 00:51:47,619 todas en el fichero por orden 1275 00:51:47,619 --> 00:51:49,320 entonces eso nos facilita 1276 00:51:49,320 --> 00:51:52,139 el último, porque si no tendríamos que sacar el máximo 1277 00:51:52,139 --> 00:51:53,639 podríamos, si no 1278 00:51:53,639 --> 00:51:56,099 si esto fuera un haset, con lo cual 1279 00:51:56,099 --> 00:51:57,559 no iría por el orden natural 1280 00:51:57,559 --> 00:52:00,320 no tiene por qué, haríamos el máximo 1281 00:52:00,320 --> 00:52:01,719 no es tan complicado 1282 00:52:01,719 --> 00:52:03,920 hacer el máximo de todas las claves 1283 00:52:03,920 --> 00:52:06,079 haríamos un algoritmo para sacar el máximo y ya está 1284 00:52:06,079 --> 00:52:07,920 pero en este caso lo tenemos muy fácil 1285 00:52:07,920 --> 00:52:09,619 porque lo va a guardar por orden de entero 1286 00:52:09,619 --> 00:52:11,019 entonces nos vamos a quedar con el último 1287 00:52:11,019 --> 00:52:14,119 entonces el último para facilitarnos 1288 00:52:14,119 --> 00:52:16,039 la vida, vamos a declarar 1289 00:52:16,039 --> 00:52:16,880 factura afuera 1290 00:52:16,880 --> 00:52:22,079 y la última factura 1291 00:52:22,079 --> 00:52:23,820 leída, la última factura 1292 00:52:23,820 --> 00:52:26,099 leída es la última 1293 00:52:26,099 --> 00:52:27,980 del fichero, la última 1294 00:52:27,980 --> 00:52:28,739 factura leída 1295 00:52:28,739 --> 00:52:31,579 como la tengo aquí ya declarada afuera 1296 00:52:31,579 --> 00:52:33,880 se guarda dentro del while, entonces ahora ya 1297 00:52:33,880 --> 00:52:36,119 podemos poner en datos 1298 00:52:36,119 --> 00:52:38,320 punto secuencia 1299 00:52:38,320 --> 00:52:40,000 en un factura, pues la 1300 00:52:40,000 --> 00:52:42,159 última factura que hemos leído de estas 1301 00:52:42,159 --> 00:52:43,920 le sacamos el número 1302 00:52:43,920 --> 00:52:45,679 factura y 1303 00:52:45,679 --> 00:52:48,619 más uno. 1304 00:52:49,679 --> 00:52:50,079 Vale. 1305 00:52:50,639 --> 00:52:52,059 ¿Qué hago yo aquí poniéndole 1306 00:52:52,059 --> 00:52:54,219 entre paréntesis? Así. 1307 00:52:59,150 --> 00:53:00,369 ¿Vale? Pues ya está, 1308 00:53:00,429 --> 00:53:02,550 ya están volcados. Lo que pasa es que no podemos comprobar 1309 00:53:02,550 --> 00:53:04,230 si nos los ha volcado o no porque no tenemos hecho el método 1310 00:53:04,230 --> 00:53:06,630 consultar. Por lo menos vamos a comprobar 1311 00:53:06,630 --> 00:53:07,889 si sale alguna excepción. 1312 00:53:08,010 --> 00:53:09,329 Porque hayamos usado algún método mal. 1313 00:53:11,670 --> 00:53:12,110 ¿Perdón? 1314 00:53:15,809 --> 00:53:18,170 A ver, nosotros aquí estamos 1315 00:53:18,170 --> 00:53:20,849 leyendo todas las facturas una por una del fichero. 1316 00:53:21,230 --> 00:53:21,849 Todas las que hay. 1317 00:53:22,670 --> 00:53:25,750 Entonces, en ese fichero se van a ver guardado 1318 00:53:25,750 --> 00:53:27,389 por orden de número de factura. 1319 00:53:27,730 --> 00:53:29,590 La 1, la 2, la 3, la 4, la 5. 1320 00:53:30,289 --> 00:53:33,130 Y, repito, aunque no se hubieran guardado 1321 00:53:33,130 --> 00:53:34,030 por número de factura, 1322 00:53:34,150 --> 00:53:36,369 porque cuando yo las he metido aquí en mi aplicación 1323 00:53:36,369 --> 00:53:38,750 he metido 1324 00:53:38,750 --> 00:53:40,449 que no puedo porque se va incrementando 1325 00:53:40,449 --> 00:53:42,329 primero la 7, luego he metido la 8 1326 00:53:42,329 --> 00:53:44,650 luego la 1, aunque las hubiera metido así 1327 00:53:44,650 --> 00:53:46,309 que en mi aplicación no puedo 1328 00:53:46,309 --> 00:53:48,190 porque él los va generando solitos 1329 00:53:48,190 --> 00:53:49,329 aunque las hubiera metido así 1330 00:53:49,329 --> 00:53:51,130 en el map 1331 00:53:51,130 --> 00:53:54,670 al ser el map un trimap 1332 00:53:54,670 --> 00:53:56,070 eso significa 1333 00:53:56,070 --> 00:53:58,789 que las claves se guardan en un triset 1334 00:53:58,789 --> 00:54:00,789 eso significa un trimap 1335 00:54:00,789 --> 00:54:02,170 que las claves se guardan en un triset 1336 00:54:02,170 --> 00:54:04,329 igual que un hash map significa 1337 00:54:04,329 --> 00:54:06,210 que las claves se guardan en un hash set 1338 00:54:06,210 --> 00:54:25,409 Bueno, pues al guardarse las claves que son numeritos en un triset, significa que da igual en qué orden vaya metiendo yo esas claves. Cuando luego las recorra, va a ver siempre en el orden del comparable de integer y el comparable de integer es por el orden natural. 1339 00:54:25,409 --> 00:54:28,210 luego, cuando yo estoy aquí leyendo 1340 00:54:28,210 --> 00:54:29,510 las facturas 1341 00:54:29,510 --> 00:54:32,269 la primera, la segunda, la tercera 1342 00:54:32,269 --> 00:54:33,190 para irlas metiendo 1343 00:54:33,190 --> 00:54:35,449 sé que la última que he leído 1344 00:54:35,449 --> 00:54:38,030 es la que tiene el último número de factura 1345 00:54:38,030 --> 00:54:39,610 es la que tiene el último 1346 00:54:39,610 --> 00:54:41,849 porque están todas ahí colocadas y yo voy leyendo 1347 00:54:41,849 --> 00:54:43,889 la primera, la segunda, la tercera 1348 00:54:43,889 --> 00:54:44,829 las voy metiendo en el map 1349 00:54:44,829 --> 00:54:48,110 la última que leí es la que tiene el número de factura más alto 1350 00:54:48,110 --> 00:54:49,969 vale, pues la secuencia 1351 00:54:49,969 --> 00:54:52,030 entonces la tengo que inicializar 1352 00:54:52,030 --> 00:54:54,230 a una unidad superior 1353 00:54:54,230 --> 00:54:56,489 al número de factura más alto para que la siguiente 1354 00:54:56,489 --> 00:54:57,050 factura 1355 00:54:57,050 --> 00:55:00,530 sea la que tenga un número de factura 1356 00:55:00,530 --> 00:55:02,150 una medida superior, para que no se repita 1357 00:55:02,150 --> 00:55:04,150 claro, vale 1358 00:55:04,150 --> 00:55:06,409 pues entonces podemos ejecutar 1359 00:55:06,409 --> 00:55:08,130 a ver si hay error de ejecución, pero comprobar 1360 00:55:08,130 --> 00:55:09,530 si las ha leído bien es imposible 1361 00:55:09,530 --> 00:55:10,789 porque 1362 00:55:10,789 --> 00:55:15,010 vale, de hecho 1363 00:55:15,010 --> 00:55:17,949 la aplicación, ahora 1364 00:55:17,949 --> 00:55:20,250 cuando yo la he arrancado no podemos comprobarlo 1365 00:55:20,250 --> 00:55:22,309 me habrá leído 1366 00:55:22,309 --> 00:55:23,949 datos, porque yo ya tenía un fichero 1367 00:55:23,949 --> 00:55:25,849 me los habrá leído y estarán en la aplicación 1368 00:55:25,849 --> 00:55:27,409 pero 1369 00:55:27,409 --> 00:55:28,789 no puedo 1370 00:55:28,789 --> 00:55:32,190 comprobarlo, vale, vamos a poner otra más 1371 00:55:32,190 --> 00:55:33,989 una de 1372 00:55:33,989 --> 00:55:36,210 Sevilla, por ejemplo 1373 00:55:36,210 --> 00:55:38,110 de 100, a ver si nos 1374 00:55:38,110 --> 00:55:39,889 sale errores de ejecución, pero lo hemos hecho mal 1375 00:55:39,889 --> 00:55:42,110 particular, la insertamos 1376 00:55:42,670 --> 00:55:44,409 vale, vamos a cerrar 1377 00:55:44,409 --> 00:55:46,510 me debería haber guardado 1378 00:55:46,510 --> 00:55:47,789 las dos que tenía de antes 1379 00:55:47,789 --> 00:55:48,809 que las ha volcado 1380 00:55:48,809 --> 00:55:51,750 más esta, cuando yo cierre 1381 00:55:51,750 --> 00:55:53,409 vamos a ver 1382 00:55:53,409 --> 00:55:56,269 en el fichero 1383 00:55:56,269 --> 00:55:57,489 facturas.dat 1384 00:55:57,489 --> 00:56:04,070 no me da ningún error, está Madrid 1385 00:56:04,070 --> 00:56:04,789 Sevilla 1386 00:56:04,789 --> 00:56:11,409 o sea, me ha añadido la nueva 1387 00:56:11,409 --> 00:56:12,650 a las que ya había 1388 00:56:12,650 --> 00:56:16,210 lo que pasa es que verlo aquí es complicado 1389 00:56:16,210 --> 00:56:17,650 lo ideal sería 1390 00:56:17,650 --> 00:56:20,070 visualizarlo en la aplicación 1391 00:56:20,070 --> 00:56:22,329 claro, pero tiene toda la pinta 1392 00:56:22,329 --> 00:56:23,449 de que lo estamos haciendo bien. 1393 00:56:24,769 --> 00:56:25,289 ¿Vale? 1394 00:56:27,920 --> 00:56:28,400 Vale. 1395 00:56:31,920 --> 00:56:35,800 Pero, ¿qué nos ha faltado aquí? 1396 00:56:38,099 --> 00:56:41,980 Nos ha faltado aquí en el evento de insertar factura 1397 00:56:41,980 --> 00:56:44,539 que la factura se ponga aquí. 1398 00:56:44,659 --> 00:56:45,179 Pero no solo. 1399 00:56:45,760 --> 00:56:48,039 Nos ha faltado cuando cargamos las facturas, 1400 00:56:48,599 --> 00:56:50,619 deberíamos además de cargarlas y llevarlas al map, 1401 00:56:50,820 --> 00:56:52,000 añadirlas al combo box. 1402 00:56:52,260 --> 00:56:53,079 Eso nos ha faltado. 1403 00:56:53,579 --> 00:56:57,639 Pues vámonos al método de cargar datos que está aquí. 1404 00:56:58,440 --> 00:57:00,400 y vamos a añadirlo del combo box 1405 00:57:00,400 --> 00:57:01,900 entonces el combo box 1406 00:57:01,900 --> 00:57:04,039 vamos, si no está fuera, vamos a sacarlo fuera 1407 00:57:04,039 --> 00:57:05,039 para que sea más fácil 1408 00:57:05,039 --> 00:57:06,820 no estaba fuera 1409 00:57:06,820 --> 00:57:10,300 efectivamente, en la propia que recorremos 1410 00:57:10,300 --> 00:57:11,099 efectivamente 1411 00:57:11,099 --> 00:57:14,199 vamos a, a la vez que vamos metiéndolas 1412 00:57:14,199 --> 00:57:14,800 en el map 1413 00:57:14,800 --> 00:57:18,199 el combo box estaba sin parametrizar 1414 00:57:18,199 --> 00:57:19,900 pero vamos a 1415 00:57:19,900 --> 00:57:22,159 parametrizarlo a entero, para que sea a integer 1416 00:57:22,159 --> 00:57:24,300 para que nos dé 1417 00:57:24,300 --> 00:57:26,039 en número directamente y no tengamos que 1418 00:57:26,039 --> 00:57:27,260 convertir y ya está 1419 00:57:27,260 --> 00:57:30,420 entonces el combo box que está declarado aquí arriba 1420 00:57:30,420 --> 00:57:32,760 el combo box 1421 00:57:32,760 --> 00:57:34,039 vamos a 1422 00:57:34,039 --> 00:57:36,079 parametrizarlo a ínteger 1423 00:57:36,079 --> 00:57:38,360 para irle metiendo numeritos solamente 1424 00:57:38,360 --> 00:57:40,599 y eso 1425 00:57:40,599 --> 00:57:42,440 significa que luego cuando lo instancio 1426 00:57:42,440 --> 00:57:43,239 por ahí abajo 1427 00:57:43,239 --> 00:57:46,280 que lo instancio aquí para que se me quite 1428 00:57:46,280 --> 00:57:47,860 el aviso amarillo, le ponemos esto 1429 00:57:47,860 --> 00:57:49,880 y ya está 1430 00:57:49,880 --> 00:57:52,320 ahora ya al combo box solo le podemos 1431 00:57:52,320 --> 00:57:53,500 meter números, solo 1432 00:57:53,500 --> 00:57:56,360 y que números le queremos meter, los números de las facturas 1433 00:57:56,360 --> 00:57:57,300 que estamos cargando 1434 00:57:57,300 --> 00:58:00,059 luego aquí según vamos 1435 00:58:00,059 --> 00:58:02,400 era cargar datos 1436 00:58:02,400 --> 00:58:04,360 que estaba aquí 1437 00:58:04,360 --> 00:58:06,159 ahí 1438 00:58:06,159 --> 00:58:07,820 ahí 1439 00:58:07,820 --> 00:58:12,440 después de meterlo en el map por ejemplo 1440 00:58:12,440 --> 00:58:13,840 pues ya nos vamos al 1441 00:58:13,840 --> 00:58:16,719 combo box 1442 00:58:16,719 --> 00:58:20,460 y le añadimos 1443 00:58:20,460 --> 00:58:24,420 la factura 1444 00:58:24,420 --> 00:58:25,460 que acabamos de leer 1445 00:58:25,460 --> 00:58:27,219 .getNumFactura 1446 00:58:27,219 --> 00:58:32,909 vale, addItem, perdón 1447 00:58:32,909 --> 00:58:34,250 addItem 1448 00:58:34,250 --> 00:58:37,230 y ya está 1449 00:58:37,230 --> 00:58:41,599 ¿cómo? 1450 00:58:42,619 --> 00:58:45,099 vale, aquí solo me va a dejar meter 1451 00:58:45,099 --> 00:58:46,139 un entero, que es lo que quiero 1452 00:58:46,139 --> 00:58:48,599 entonces vamos a ver 1453 00:58:48,599 --> 00:58:49,719 vamos a 1454 00:58:49,719 --> 00:58:50,900 esto 1455 00:58:50,900 --> 00:58:53,599 vamos a abrir la aplicación 1456 00:58:53,599 --> 00:58:58,079 algo falla y esto es lo bonito 1457 00:58:58,079 --> 00:58:59,340 nullPointerException 1458 00:58:59,340 --> 00:59:00,900 No puede 1459 00:59:00,900 --> 00:59:03,420 GetNumFactura porque FAT es 1460 00:59:03,420 --> 00:59:04,619 Null, vale 1461 00:59:04,619 --> 00:59:06,900 ¿En qué momento es null? En el momento 1462 00:59:06,900 --> 00:59:09,559 El fichero, vamos a empezar con un fichero limpio 1463 00:59:09,559 --> 00:59:11,159 A ver qué ocurre 1464 00:59:11,159 --> 00:59:14,989 Delete, venga 1465 00:59:14,989 --> 00:59:18,130 Vamos a empezar de cero 1466 00:59:18,130 --> 00:59:21,409 A ver, insertamos la factura 1467 00:59:21,409 --> 00:59:22,110 De Madrid 1468 00:59:22,110 --> 00:59:24,429 De 200 1469 00:59:24,429 --> 00:59:26,409 En una empresa 1470 00:59:26,409 --> 00:59:29,570 Está en el map, se supone 1471 00:59:29,570 --> 00:59:31,250 deberíamos haber puesto en el evento este 1472 00:59:31,250 --> 00:59:33,010 lo de que aparezca aquí, pero bueno, da igual 1473 00:59:33,010 --> 00:59:35,809 y vamos a insertar 1474 00:59:35,809 --> 00:59:37,570 una en Sevilla 1475 00:59:37,570 --> 00:59:39,210 de 300 1476 00:59:39,210 --> 00:59:41,809 de particular 1477 00:59:41,809 --> 00:59:43,630 lo que sea, ahora se supone 1478 00:59:43,630 --> 00:59:45,469 que hay dos en el map, suponemos 1479 00:59:45,469 --> 00:59:46,730 cerramos 1480 00:59:46,730 --> 00:59:49,469 vale, en facturas 1481 00:59:49,469 --> 00:59:51,070 no sé si ha salido algo rojo aquí 1482 00:59:51,070 --> 00:59:53,210 en facturas 1483 00:59:53,210 --> 00:59:54,550 sí 1484 00:59:54,550 --> 00:59:57,409 refresh 1485 00:59:59,570 --> 01:00:00,989 En facturas 1486 01:00:00,989 --> 01:00:03,429 tiene pinta de que aquí hay 1487 01:00:03,429 --> 01:00:05,750 Madrid, Sevilla. 1488 01:00:06,409 --> 01:00:06,630 Vale. 1489 01:00:07,190 --> 01:00:09,170 Todo esto es una cabecera que él mete. 1490 01:00:09,889 --> 01:00:11,210 Y ahora la lectura 1491 01:00:11,210 --> 01:00:12,989 es lo que parece que no la está haciendo bien 1492 01:00:12,989 --> 01:00:15,610 porque no acaba de leer el objeto factura. 1493 01:00:15,710 --> 01:00:16,469 Algo hemos hecho mal ahí. 1494 01:00:17,150 --> 01:00:19,050 Vale, vamos a volver a arrancar la aplicación. 1495 01:00:19,750 --> 01:00:20,949 Arrancamos la aplicación 1496 01:00:20,949 --> 01:00:25,199 y algo en la lectura 1497 01:00:25,199 --> 01:00:25,659 está mal. 1498 01:00:26,480 --> 01:00:26,960 Vale. 1499 01:00:28,059 --> 01:00:29,800 This combo box is null. 1500 01:00:29,800 --> 01:00:33,059 ah no, es en el combo box 1501 01:00:33,059 --> 01:00:35,000 porque this combo box 1502 01:00:35,000 --> 01:00:36,860 es null, no está instanciado el combo box 1503 01:00:36,860 --> 01:00:38,840 no tiene sentido, o sea el null pointer 1504 01:00:38,840 --> 01:00:39,559 que me ha salido 1505 01:00:39,559 --> 01:00:42,460 antes de que le inicialices estás haciendo lo de rellenar 1506 01:00:42,460 --> 01:00:46,679 tienes toda la razón 1507 01:00:46,679 --> 01:00:48,440 está inicializado abajo, claro, claro 1508 01:00:48,440 --> 01:00:49,500 es que está inicializado abajo 1509 01:00:49,500 --> 01:00:52,360 está declarado arriba pero inicializado abajo 1510 01:00:52,360 --> 01:00:53,840 vale, entonces 1511 01:00:53,840 --> 01:00:55,659 el combo box es null 1512 01:00:55,659 --> 01:00:58,119 obviamente como tiene todo el sentido del mundo 1513 01:00:58,119 --> 01:01:00,619 y ahora vamos a 1514 01:01:00,619 --> 01:01:02,900 el combo box 1515 01:01:02,900 --> 01:01:04,739 que está inicializado aquí abajo 1516 01:01:04,739 --> 01:01:06,139 pues ya está 1517 01:01:06,139 --> 01:01:07,480 esto mismo 1518 01:01:07,480 --> 01:01:10,820 lo ponemos 1519 01:01:10,820 --> 01:01:12,739 antes de cargar los datos mismo 1520 01:01:12,739 --> 01:01:15,019 ala, ahí está 1521 01:01:15,019 --> 01:01:18,360 combo box 1522 01:01:18,360 --> 01:01:20,619 vamos a volver a arrancar esto 1523 01:01:20,619 --> 01:01:24,849 vale 1524 01:01:24,849 --> 01:01:26,730 otro null pointer exception 1525 01:01:26,730 --> 01:01:30,510 this content pane is null 1526 01:01:30,510 --> 01:01:32,789 efectivamente content pan está inicializado 1527 01:01:32,789 --> 01:01:34,469 antes, la de garaje lo de cargar datos tenemos que 1528 01:01:34,469 --> 01:01:36,429 haberlo puesto abajo del todo, hubiera sido 1529 01:01:36,429 --> 01:01:38,429 más fácil, porque ahora vamos a tener que subirlo 1530 01:01:38,429 --> 01:01:38,969 todo para arriba 1531 01:01:38,969 --> 01:01:43,829 venga, vamos a 1532 01:01:43,829 --> 01:01:45,449 esto de aquí directamente 1533 01:01:45,449 --> 01:01:48,650 vamos a ponerlo abajo y punto pelota 1534 01:01:48,650 --> 01:01:50,329 porque tampoco están 1535 01:01:50,329 --> 01:01:52,429 a facturas 1536 01:01:52,429 --> 01:01:55,440 venga 1537 01:01:55,440 --> 01:01:57,320 ahí abajo 1538 01:01:57,320 --> 01:02:00,119 pues porque como lo estamos haciendo sobre la marcha 1539 01:02:00,119 --> 01:02:02,119 que os está ocurriendo, que vamos parcheando 1540 01:02:02,119 --> 01:02:03,800 y queda una aplicación muy fea 1541 01:02:03,800 --> 01:02:06,199 es un ejemplo 1542 01:02:06,199 --> 01:02:08,159 en vivo de que no se arranca 1543 01:02:08,159 --> 01:02:10,159 a programar sin tener 1544 01:02:10,159 --> 01:02:10,980 un diseño claro 1545 01:02:10,980 --> 01:02:14,320 es un ejemplo en vivo de que uno cuando arranca a programar 1546 01:02:14,320 --> 01:02:15,980 debería tener ya un diseño claro 1547 01:02:15,980 --> 01:02:18,039 de lo que quiere hacer, porque si no como vamos 1548 01:02:18,039 --> 01:02:19,880 por la marcha, pero 1549 01:02:19,880 --> 01:02:21,619 se os está moviendo el cerebro, ¿a que sí? 1550 01:02:23,159 --> 01:02:24,239 vamos a ver que dice 1551 01:02:24,239 --> 01:02:25,940 que eso es lo que más nos gusta ahora 1552 01:02:25,940 --> 01:02:27,340 ver 1553 01:02:27,340 --> 01:02:29,900 los errores que nos va dando 1554 01:02:29,900 --> 01:02:31,960 Venga, ahora ya 1555 01:02:31,960 --> 01:02:33,920 Me sigue saliendo 1556 01:02:33,920 --> 01:02:35,119 Que content pan es null 1557 01:02:35,119 --> 01:02:38,119 Ah, claro, porque el problema era aquí en el combo box 1558 01:02:38,119 --> 01:02:39,739 Claro, es que yo tenía esto que haberlo dejado 1559 01:02:39,739 --> 01:02:41,480 Donde estaba, vale 1560 01:02:41,480 --> 01:02:42,519 Control X 1561 01:02:42,519 --> 01:02:45,039 Lo voy a dejar donde estaba 1562 01:02:45,039 --> 01:02:47,639 Que está 1563 01:02:47,639 --> 01:02:49,019 Venga, aquí mismo 1564 01:02:49,019 --> 01:02:50,679 Vale 1565 01:02:50,679 --> 01:02:53,619 Ala, siguiente 1566 01:02:53,619 --> 01:02:54,300 Intento 1567 01:02:54,300 --> 01:02:56,539 Ya está, vale 1568 01:02:56,539 --> 01:02:59,280 Efectivamente ha leído perfectamente 1569 01:02:59,280 --> 01:03:00,400 Los dos que tenía 1570 01:03:00,400 --> 01:03:02,360 Vamos a ponerle uno más 1571 01:03:02,360 --> 01:03:05,239 Que esta es la parte que me ha parecido a mí rara 1572 01:03:05,239 --> 01:03:06,920 Vamos a ponerle otra factura más 1573 01:03:06,920 --> 01:03:08,380 Que 1574 01:03:08,380 --> 01:03:10,400 Ya está, pues venga 1575 01:03:10,400 --> 01:03:13,260 Esta factura en Barcelona 1576 01:03:13,260 --> 01:03:16,500 De 400, 4000 1577 01:03:16,500 --> 01:03:19,039 Empresa, muy cara Barcelona 1578 01:03:19,039 --> 01:03:20,900 Insertamos factura 1579 01:03:20,900 --> 01:03:23,099 Deberíamos haber añadido aquí lo añade 1580 01:03:23,099 --> 01:03:24,599 Pero bueno, da igual, cerramos 1581 01:03:24,599 --> 01:03:27,280 El fichero 1582 01:03:27,280 --> 01:03:29,039 Antes cuando lo hemos visto 1583 01:03:29,039 --> 01:03:31,320 A mí me ha parecido que no 1584 01:03:31,320 --> 01:03:33,559 Tenía la información como la tenía que tener 1585 01:03:33,559 --> 01:03:34,219 Vamos a ver 1586 01:03:34,219 --> 01:03:36,500 Madrid, Sevilla y Barcelona 1587 01:03:36,500 --> 01:03:38,599 La tiene como la tiene que tener 1588 01:03:38,599 --> 01:03:40,320 Vale, y entonces 1589 01:03:40,320 --> 01:03:42,880 Ahora vamos a abrirla, a ver si nos aparece con el 3 1590 01:03:42,880 --> 01:03:46,440 Magnífico 1591 01:03:46,440 --> 01:03:48,079 Ha creado Barcelona con el 3 1592 01:03:48,079 --> 01:03:50,320 Porque al cargarlo ha visto que la última era la 2 1593 01:03:50,320 --> 01:03:51,679 La ha incrementado en 1, etc 1594 01:03:51,679 --> 01:03:54,420 Genial, nos funciona muy bien 1595 01:03:54,420 --> 01:03:56,199 ¿Qué nos falta? El evento del combo box 1596 01:03:56,199 --> 01:03:58,940 Para que cuando yo seleccione, saque del map 1597 01:03:58,940 --> 01:04:01,039 una línea, un get con el map 1598 01:04:01,039 --> 01:04:01,639 y poner ahí 1599 01:04:01,639 --> 01:04:05,059 y nos falta en insertar factura 1600 01:04:05,059 --> 01:04:05,980 en este de aquí 1601 01:04:05,980 --> 01:04:08,900 que nos los añada al combo box 1602 01:04:08,900 --> 01:04:14,159 ¿el qué? 1603 01:04:14,159 --> 01:04:15,159 cargar datos 1604 01:04:15,159 --> 01:04:17,860 cargar datos, que está ahí 1605 01:04:17,860 --> 01:04:32,349 ¿qué error te sale? 1606 01:04:33,170 --> 01:04:34,070 si es que te sale algún error 1607 01:04:34,070 --> 01:04:42,039 Que FAT está a nul 1608 01:04:42,039 --> 01:04:43,019 Y 1609 01:04:43,019 --> 01:04:45,599 Aquí 1610 01:04:45,599 --> 01:04:46,500 Cuando haces esto 1611 01:04:46,500 --> 01:04:49,639 Cuando haces eso FAT está a nul 1612 01:04:49,639 --> 01:04:53,059 Y tienes FAT declarada afuera 1613 01:04:53,059 --> 01:04:53,860 Lógicamente 1614 01:04:53,860 --> 01:04:55,760 Y luego esto lo tienes fuera del while 1615 01:04:55,760 --> 01:05:02,280 Pues no sé decirte 1616 01:05:02,280 --> 01:05:04,539 Habría que verlo efectivamente 1617 01:05:04,539 --> 01:05:06,219 Ya lo has visto 1618 01:05:06,219 --> 01:05:08,320 ¿Qué era? 1619 01:05:09,380 --> 01:05:11,559 Ah, vale.