La cara oculta de c++ builder prev

21

Transcript of La cara oculta de c++ builder prev

La cara oculta de

C++ Builder

Un gato camina sobre el borde del tejado;Tras él, el Sol se pone.

Gira su cara hacia mí, y creo que me sonríe.Luego, de un salto, pasa sobre la línea del horizonte.

Dedicado a Vivian, dondequiera que esté.Ian �

INDICEINDICE

PRÓLOGO DEL AUTOR 17

CONTENIDO DEL LIBRO 17AGRADECIMIENTOS 19

EL LENGUAJE SQL 21

1. SISTEMAS DE BASES DE DATOS 23

ACERCA DEL ACCESO TRANSPARENTE A BASES DE DATOS 23BASES DE DATOS RELACIONALES 24INFORMACIÓN SEMÁNTICA = RESTRICCIONES 26RESTRICCIONES DE UNICIDAD Y CLAVES PRIMARIAS 27INTEGRIDAD REFERENCIAL 28¿QUÉ TIENE DE MALO EL MODELO RELACIONAL? 29BASES DE DATOS LOCALES Y SERVIDORES SQL 31CARACTERÍSTICAS GENERALES DE LOS SISTEMAS SQL 33EL FORMATO PARADOX 34EL FORMATO DBF7 37CRITERIOS PARA EVALUAR UN SERVIDOR SQL 39INTERBASE 41MICROSOFT SQL SERVER 43ORACLE 45OTROS SISTEMAS DE USO FRECUENTE 46

2. BREVE INTRODUCCIÓN A SQL 49

LA ESTRUCTURA DE SQL 49PARA SEGUIR LOS EJEMPLOS DE ESTE LIBRO… 50LA CREACIÓN Y CONEXIÓN A LA BASE DE DATOS 52TIPOS DE DATOS EN SQL 53REPRESENTACIÓN DE DATOS EN INTERBASE 54CREACIÓN DE TABLAS 55COLUMNAS CALCULADAS 56VALORES POR OMISIÓN 57RESTRICCIONES DE INTEGRIDAD 57CLAVES PRIMARIAS Y ALTERNATIVAS 58INTEGRIDAD REFERENCIAL 60ACCIONES REFERENCIALES 61NOMBRES PARA LAS RESTRICCIONES 62

4 La Cara Oculta de C++ Builder

DEFINICIÓN Y USO DE DOMINIOS 63CREACIÓN DE ÍNDICES 64MODIFICACIÓN DE TABLAS E ÍNDICES 65CREACIÓN DE VISTAS 66CREACIÓN DE USUARIOS 66ASIGNACIÓN DE PRIVILEGIOS 68ROLES 69UN EJEMPLO COMPLETO DE SCRIPT SQL 70

3. CONSULTAS Y MODIFICACIONES 73

LA INSTRUCCIÓN SELECT: EL LENGUAJE DE CONSULTAS 73LA CONDICIÓN DE SELECCIÓN 75OPERADORES DE CADENAS 75YO SÓLO QUIERO LOS DIEZ PRIMEROS... 76EL VALOR NULO: ENFRENTÁNDONOS A LO DESCONOCIDO 77ELIMINACIÓN DE DUPLICADOS 78PRODUCTOS CARTESIANOS Y ENCUENTROS 79ORDENANDO LOS RESULTADOS 81EL USO DE GRUPOS 82FUNCIONES DE CONJUNTOS 83LA CLÁUSULA HAVING 84EL USO DE SINÓNIMOS PARA TABLAS 85SUBCONSULTAS: SELECCIÓN ÚNICA 86SUBCONSULTAS: LOS OPERADORES IN Y EXISTS 87SUBCONSULTAS CORRELACIONADAS 88EQUIVALENCIAS DE SUBCONSULTAS 89ENCUENTROS EXTERNOS 91LA CURIOSA SINTAXIS DEL ENCUENTRO INTERNO 93LAS INSTRUCCIONES DE ACTUALIZACIÓN 94LA SEMÁNTICA DE LA INSTRUCCIÓN UPDATE 95VISTAS 96

4. PROCEDIMIENTOS ALMACENADOS Y TRIGGERS 99

¿PARA QUÉ USAR PROCEDIMIENTOS ALMACENADOS? 99CÓMO SE UTILIZA UN PROCEDIMIENTO ALMACENADO 101EL CARÁCTER DE TERMINACIÓN 102PROCEDIMIENTOS ALMACENADOS EN INTERBASE 103PROCEDIMIENTOS QUE DEVUELVEN UN CONJUNTO DE DATOS 106RECORRIENDO UN CONJUNTO DE DATOS 108TRIGGERS, O DISPARADORES 109LAS VARIABLES NEW Y OLD 111MÁS EJEMPLOS DE TRIGGERS 111GENERADORES 113

Indice 5

SIMULANDO LA INTEGRIDAD REFERENCIAL 116EXCEPCIONES 117ALERTADORES DE EVENTOS 119FUNCIONES DE USUARIO EN INTERBASE 121

5. TRANSACCIONES 125

¿POR QUÉ NECESITAMOS TRANSACCIONES? 125EL ÁCIDO SABOR DE LAS TRANSACCIONES 127TRANSACCIONES SQL Y EN BASES DE DATOS LOCALES 128TRANSACCIONES IMPLÍCITAS Y EXPLÍCITAS 128NIVELES DE AISLAMIENTO DE TRANSACCIONES 131REGISTROS DE TRANSACCIONES Y BLOQUEOS 133LECTURAS REPETIBLES MEDIANTE BLOQUEOS 136VARIACIONES SOBRE EL TEMA DE BLOQUEOS 138EL JARDÍN DE LOS SENDEROS QUE SE BIFURCAN 139¿BLOQUEOS O VERSIONES? 141NIVELES DE AISLAMIENTO Y TRANSACCIONES IMPLÍCITAS 143

6. MICROSOFT SQL SERVER 145

HERRAMIENTAS DE DESARROLLO EN EL CLIENTE 145CREACIÓN DE BASES DE DATOS CON MS SQL SERVER 146BASES DE DATOS EN LA VERSIÓN 7 148TIPOS DE DATOS PREDEFINIDOS 149TIPOS DE DATOS DEFINIDOS POR EL PROGRAMADOR 150CREACIÓN DE TABLAS Y ATRIBUTOS DE COLUMNAS 151INTEGRIDAD REFERENCIAL 152INDICES 153SEGURIDAD EN MS SQL SERVER 153PROCEDIMIENTOS ALMACENADOS 154CURSORES 155TRIGGERS EN TRANSACT-SQL 157INTEGRIDAD REFERENCIAL MEDIANTE TRIGGERS 159TRIGGERS ANIDADOS Y TRIGGERS RECURSIVOS 161

7. ORACLE 163

SOBREVIVIENDO A SQL*PLUS 163INSTANCIAS, BASES DE DATOS, USUARIOS 165TIPOS DE DATOS 166CREACIÓN DE TABLAS 167INDICES EN ORACLE 168ORGANIZACIÓN FÍSICA DE LAS TABLAS 169PROCEDIMIENTOS ALMACENADOS EN PL/SQL 171CONSULTAS RECURSIVAS 172

6 La Cara Oculta de C++ Builder

PLANES DE OPTIMIZACIÓN EN ORACLE 173CURSORES 174TRIGGERS EN PL/SQL 176LA INVASIÓN DE LAS TABLAS MUTANTES 177PAQUETES 179ACTUALIZACIÓN DE VISTAS MEDIANTE TRIGGERS 181SECUENCIAS 182TIPOS DE OBJETOS 184

8. DB2 UNIVERSAL DATABASE 189

ARQUITECTURA Y PLATAFORMAS 189AISLAMIENTO DE TRANSACCIONES 190TIPOS DE DATOS 191CREACIÓN DE TABLAS Y RESTRICCIONES 193INDICES 194TRIGGERS 195CONSULTAS RECURSIVAS 196PROCEDIMIENTOS ALMACENADOS 198

9. EL MOTOR DE DATOS DE BORLAND 199

QUÉ ES, Y CÓMO FUNCIONA 200CONTROLADORES LOCALES Y SQL LINKS 201ACCESO A FUENTES DE DATOS ODBC 202¿DÓNDE SE INSTALA EL BDE? 202EL ADMINISTRADOR DEL MOTOR DE DATOS 204CONFIGURACIÓN DEL REGISTRO E INFORMACIÓN DE VERSIÓN 204EL CONCEPTO DE ALIAS 206PARÁMETROS DEL SISTEMA 206PARÁMETROS DE LOS CONTROLADORES PARA BD LOCALES 208BLOQUEOS OPORTUNISTAS 210PARÁMETROS COMUNES A LOS CONTROLADORES SQL 211CONFIGURACIÓN DE INTERBASE 214CONFIGURACIÓN DE MS SQL SERVER 216CONFIGURACIÓN DE ORACLE 217CONFIGURACIÓN DE OTROS SISTEMAS 219CREACIÓN DE ALIAS PARA BASES DE DATOS LOCALES Y SQL 219ALTERNATIVAS AL MOTOR DE DATOS 220

C++ BUILDER: NAVEGACIÓN Y BÚSQUEDAS 221

10. CONJUNTOS DE DATOS: TABLAS 223

LA JERARQUÍA DE LOS CONJUNTOS DE DATOS 223

Indice 7

LA ARQUITECTURA DE OBJETOS DEL MOTOR DE DATOS 225¿TABLA O CONSULTA? 227TABLAS (POR EL MOMENTO) 229EXCLUSIVIDAD Y BLOQUEOS 231CONEXIÓN CON COMPONENTES VISUALES 232NAVEGANDO POR LAS FILAS 234MARCAS DE POSICIÓN 235ENCAPSULAMIENTO DE LA ITERACIÓN 236LA RELACIÓN MASTER/DETAIL 239NAVEGACIÓN Y RELACIONES MASTER/DETAIL 242EL ESTADO DE UN CONJUNTO DE DATOS 247

11. ACCESO A CAMPOS 249

CREACIÓN DE COMPONENTES DE CAMPOS 249CLASES DE CAMPOS 251NOMBRE DEL CAMPO Y ETIQUETA DE VISUALIZACIÓN 253ACCESO A LOS CAMPOS POR MEDIO DE LA TABLA 254EXTRAYENDO INFORMACIÓN DE LOS CAMPOS 255LAS MÁSCARAS DE FORMATO Y EDICIÓN 256LOS EVENTOS DE FORMATO DE CAMPOS 258CAMPOS CALCULADOS 259CAMPOS DE BÚSQUEDA 261LA CACHÉ DE BÚSQUEDA 263EL ORDEN DE EVALUACIÓN DE LOS CAMPOS 264EXTENSIONES PARA LOS TIPOS DE OBJETOS DE ORACLE 8 265INFORMACIÓN SOBRE CAMPOS 268CREACIÓN DE TABLAS 269

12. VALIDACIONES Y EL DICCIONARIO DE DATOS 273

VALIDACIÓN A NIVEL DE CAMPOS 273PROPIEDADES DE VALIDACIÓN 274EL DICCIONARIO DE DATOS 275CONJUNTOS DE ATRIBUTOS 276IMPORTANDO BASES DE DATOS 277EVALUANDO RESTRICCIONES EN EL CLIENTE 278

13. CONTROLES DE DATOS Y FUENTES DE DATOS 281

CONTROLES DATA-AWARE 281LOS ENLACES DE DATOS 283CREACIÓN DE CONTROLES DE DATOS 284LOS CUADROS DE EDICIÓN 285EDITORES DE TEXTO 286TEXTOS NO EDITABLES 287

8 La Cara Oculta de C++ Builder

COMBOS Y LISTAS CON CONTENIDO FIJO 287COMBOS Y LISTAS DE BÚSQUEDA 290ESENCIA Y APARIENCIA 292CASILLAS DE VERIFICACIÓN Y GRUPOS DE BOTONES 292IMÁGENES EXTRAÍDAS DE BASES DE DATOS 293LA TÉCNICA DEL COMPONENTE DEL POBRE 293PERMITIENDO LAS MODIFICACIONES 295BLOB, BLOB, BLOB… 297LA CLASE TBLOBSTREAM 298

14. REJILLAS Y BARRAS DE NAVEGACIÓN 301

EL USO Y ABUSO DE LAS REJILLAS 301EL FUNCIONAMIENTO BÁSICO DE UNA REJILLA DE DATOS 302OPCIONES DE REJILLAS 304COLUMNAS A LA MEDIDA 304GUARDAR Y RESTAURAR LOS ANCHOS DE COLUMNAS 307LISTAS DESPLEGABLES Y BOTONES DE EDICIÓN 308NÚMEROS VERDES Y NÚMEROS ROJOS 309MÁS EVENTOS DE REJILLAS 312LA BARRA DE DESPLAZAMIENTO DE LA REJILLA 313REJILLAS DE SELECCIÓN MÚLTIPLE 313BARRAS DE NAVEGACIÓN 314HABÍA UNA VEZ UN USUARIO TORPE, MUY TORPE… 315AYUDAS PARA NAVEGAR 316EL COMPORTAMIENTO DE LA BARRA DE NAVEGACIÓN 316REJILLAS DE CONTROLES 318

15. INDICES 321

CON QUÉ ÍNDICES PODEMOS CONTAR 321ESPECIFICANDO EL ÍNDICE ACTIVO 323INDICES EN DBASE 325ESPECIFICANDO UN ORDEN EN TABLAS SQL 326BÚSQUEDA BASADA EN ÍNDICES 327IMPLEMENTACIÓN DE REFERENCIAS MEDIANTE FINDKEY 329BÚSQUEDAS UTILIZANDO SETKEY 330EXPERIMENTANDO CON SETKEY 330¿POR QUÉ EXISTE SETKEY? 332RANGOS: DESDE EL ALFA A LA OMEGA 333EL EJEMPLO DE RANGOS DE CASI TODOS LOS LIBROS 335MÁS PROBLEMAS CON LOS ÍNDICES DE DBASE 336CÓMO CREAR UN ÍNDICE TEMPORAL 337

Indice 9

16. MÉTODOS DE BÚSQUEDA 341

FILTROS 341ESTO NO LO DICE LA DOCUMENTACIÓN… 342UN EJEMPLO CON FILTROS RÁPIDOS 343EL EVENTO ONFILTERRECORD 346LOCALIZACIÓN Y BÚSQUEDA 347UN DIÁLOGO GENÉRICO DE LOCALIZACIÓN 350FILTROS LATENTES 352FILTER BY EXAMPLE 354BÚSQUEDA EN UNA TABLA DE DETALLES 358

17. NAVEGACIÓN MEDIANTE CONSULTAS 361

EL COMPONENTE TQUERY COMO CONJUNTO DE DATOS 361¿QUIÉN EJECUTA LAS INSTRUCCIONES? 362CONSULTAS ACTUALIZABLES 363SIEMPRE HACIA ADELANTE 365CONSULTAS PARAMÉTRICAS 368CONSULTAS DEPENDIENTES 370LA PREPARACIÓN DE LA CONSULTA 371VISUAL QUERY BUILDER 373

18. COMUNICACIÓN CLIENTE/SERVIDOR 377

NUESTRA ARMA LETAL: SQL MONITOR 377APERTURA DE TABLAS Y CONSULTAS 378LA CACHÉ DE ESQUEMAS 380OPERACIONES DE NAVEGACIÓN SIMPLE 380BÚSQUEDAS EXACTAS CON LOCATE 381BÚSQUEDAS PARCIALES 382UNA SOLUCIÓN PARA BÚSQUEDAS PARCIALES RÁPIDAS 383BÚSQUEDAS CON FILTROS LATENTES 384

C++ BUILDER: ACTUALIZACIONES Y CONCURRENCIA 387

19. ACTUALIZACIONES 389

LOS ESTADOS DE EDICIÓN Y LOS MÉTODOS DE TRANSICIÓN 389ASIGNACIONES A CAMPOS 390CONFIRMANDO LAS ACTUALIZACIONES 392DIFERENCIAS ENTRE INSERT Y APPEND 393COMO POR AZAR… 394MÉTODOS ABREVIADOS DE INSERCIÓN 395EL GRAN EXPERIMENTO 396

10 La Cara Oculta de C++ Builder

EL GRAN EXPERIMENTO: TABLAS LOCALES 397EL GRAN EXPERIMENTO: TABLAS SQL 398PESIMISTAS Y OPTIMISTAS 399EL MODO DE ACTUALIZACIÓN 400LA RELECTURA DEL REGISTRO ACTUAL 402ELIMINANDO REGISTROS 404ACTUALIZACIÓN DIRECTA VS VARIABLES EN MEMORIA 404AUTOMATIZANDO LA ENTRADA DE DATOS 406ENTRADA DE DATOS CONTINUA 408

20. ACTUALIZACIONES MEDIANTE CONSULTAS 411

INSTRUCCIONES DEL DML 411ALMACENAR EL RESULTADO DE UNA CONSULTA 412¿EJECUTAR O ACTIVAR? 413NUEVAMENTE COMO POR AZAR.... 416ACTUALIZACIÓN SOBRE CURSORES DE CONSULTAS 417UTILIZANDO PROCEDIMIENTOS ALMACENADOS 418

21. EVENTOS DE TRANSICIÓN DE ESTADOS 421

CUANDO EL ESTADO CAMBIA… 421REGLAS DE EMPRESA: ¿EN EL SERVIDOR O EN EL CLIENTE? 422INICIALIZACIÓN DE REGISTROS: EL EVENTO ONNEWRECORD 423VALIDACIONES A NIVEL DE REGISTROS 424ANTES Y DESPUÉS DE UNA MODIFICACIÓN 425PROPAGACIÓN DE CAMBIOS EN CASCADA 427ACTUALIZACIONES COORDINADAS MASTER/DETAIL 428ANTES Y DESPUÉS DE LA APERTURA DE UNA TABLA 429TIRANDO DE LA CADENA 430LOS EVENTOS DE DETECCIÓN DE ERRORES 431LA ESTRUCTURA DE LA EXCEPCIÓN EDBENGINEERROR 432APLICACIONES DE LOS EVENTOS DE ERRORES 436UNA VEZ MÁS, LA ORIENTACIÓN A OBJETOS… 438

22. BASES DE DATOS Y TRANSACCIONES 439

EL COMPONENTE TDATABASE 439OBJETOS DE BASES DE DATOS PERSISTENTES 440CAMBIANDO UN ALIAS DINÁMICAMENTE 441BASES DE DATOS Y CONJUNTOS DE DATOS 443PARÁMETROS DE CONEXIÓN 444LA PETICIÓN DE CONTRASEÑAS 445EL DIRECTORIO TEMPORAL DE WINDOWS 447COMPARTIENDO LA CONEXIÓN 448CONTROL EXPLÍCITO DE TRANSACCIONES 449

Indice 11

ENTRADA DE DATOS Y TRANSACCIONES 450

23. SESIONES 453

¿PARA QUÉ SIRVEN LAS SESIONES? 453ESPECIFICANDO LA SESIÓN 454CADA SESIÓN ES UN USUARIO 454EL INICIO DE SESIÓN Y LA INICIALIZACIÓN DEL BDE 455SESIONES E HILOS PARALELOS 457INFORMACIÓN SOBRE ESQUEMAS 460EL MINIEXPLORADOR DE BASES DE DATOS 461GESTIÓN DE ALIAS A TRAVÉS DE TSESSION 463DIRECTORIOS PRIVADOS, DE RED Y CONTRASEÑAS 464

24. ACTUALIZACIONES EN CACHÉ 467

¿CACHÉ PARA QUÉ? 467ACTIVACIÓN DE LAS ACTUALIZACIONES EN CACHÉ 468CONFIRMACIÓN DE LAS ACTUALIZACIONES 469MARCHA ATRÁS 471EL ESTADO DE ACTUALIZACIÓN 472EL FILTRO DE TIPOS DE REGISTROS 473UN EJEMPLO INTEGRAL 474EL GRAN FINAL: EDICIÓN Y ENTRADA DE DATOS 476COMBINANDO LA CACHÉ CON GRABACIONES DIRECTAS 478PROTOTIPOS Y MÉTODOS VIRTUALES 482CÓMO ACTUALIZAR CONSULTAS “NO” ACTUALIZABLES 483EL EVENTO ONUPDATERECORD 486DETECCIÓN DE ERRORES DURANTE LA GRABACIÓN 487¿TABLAS ... O CONSULTAS EN CACHÉ? 489

PROGRAMACIÓN DISTRIBUIDA 491

25. CONJUNTOS DE DATOS CLIENTES 493

CREACIÓN DE CONJUNTOS DE DATOS 493CÓMO EL TCLIENTDATASET OBTIENE SUS DATOS 495NAVEGACIÓN, BÚSQUEDA Y SELECCIÓN 496FILTROS 497EDICIÓN DE DATOS 498CONJUNTOS DE DATOS ANIDADOS 499CAMPOS CALCULADOS INTERNOS 502INDICES, GRUPOS Y VALORES AGREGADOS 503

12 La Cara Oculta de C++ Builder

26. EL MODELO DE OBJETOS COMPONENTES 507

UN MODELO BINARIO DE OBJETOS 507¡YO QUIERO VER CÓDIGO! 508CLASES, OBJETOS E INTERFACES 509EL LENGUAJE DE DESCRIPCIÓN DE INTERFACES 511IDENTIFICADORES GLOBALES ÚNICOS 513INTERFACES 514LA INTERFAZ IUNKNOWN 516TIEMPO DE VIDA 517INTROSPECCIÓN 518CÓMO OBTENER UN OBJETO COM 520PUNTEROS INTELIGENTES A INTERFACES 521

27. SERVIDORES COM 525

INTERCEPTANDO OPERACIONES EN DIRECTORIOS 525DENTRO DEL PROCESO, EN LA MISMA MÁQUINA, REMOTO... 526CARGA Y DESCARGA DE LA DLL 529OLE Y EL REGISTRO DE WINDOWS 530REGISTRANDO EL SERVIDOR 532IMPLEMENTACIÓN DE INTERFACES 534EL HUEVO, LA GALLINA Y LAS FÁBRICAS DE CLASES 536IMPLEMENTANDO LA FÁBRICA DE CLASES 538

28. AUTOMATIZACIÓN OLE: CONTROLADORES 541

¿POR QUÉ EXISTE LA AUTOMATIZACIÓN OLE? 541CONTROLADORES DE AUTOMATIZACIÓN CON VARIANTES 543PROPIEDADES OLE Y PARÁMETROS POR NOMBRE 544INTERFACES DUALES 545BIBLIOTECAS DE TIPOS 546IMPORTACIÓN DE BIBLIOTECAS DE TIPOS 547EVENTOS 549ESCUCHANDO A WORD 552

29. AUTOMATIZACIÓN OLE: SERVIDORES 557

INFORMES AUTOMATIZADOS 557EL OBJETO DE AUTOMATIZACIÓN 559LA PARTE CLIENTE 563DECLARANDO UNA INTERFAZ COMÚN 564MODELOS DE INSTANCIACIÓN 566MODELOS DE CONCURRENCIA 568UN SERVIDOR DE BLOQUEOS 570LA IMPLEMENTACIÓN DE LA LISTA DE BLOQUEOS 572

Indice 13

CONTROL DE CONCURRENCIA 574PONIENDO A PRUEBA EL SERVIDOR 577

30. MIDAS 579

¿QUÉ ES MIDAS? 579CUÁNDO UTILIZAR Y CUÁNDO NO UTILIZAR MIDAS 581MIDAS Y LAS BASES DE DATOS DE ESCRITORIO 583MÓDULOS DE DATOS REMOTOS 584PROVEEDORES 587SERVIDORES REMOTOS Y CONJUNTOS DE DATOS CLIENTES 589GRABACIÓN DE DATOS 591RESOLUCIÓN 594CONTROL DE ERRORES DURANTE LA RESOLUCIÓN 596RECONCILIACIÓN 599RELACIONES MASTER/DETAIL Y TABLAS ANIDADAS 601ENVÍO DE PARÁMETROS 601EXTENDIENDO LA INTERFAZ DEL SERVIDOR 602ALGUIEN LLAMA A MI PUERTA 604LA METÁFORA DEL MALETÍN 606TIPOS DE CONEXIÓN 606BALANCE DE CARGA SIMPLE 609INTERFACES DUALES EN MIDAS 610COGE EL DINERO Y CORRE: TRABAJO SIN CONEXIÓN 611

31. SERVIDORES DE INTERNET 617

EL MODELO DE INTERACCIÓN EN LA WEB 617APRENDA HTML EN 14 MINUTOS 618EXTENSIONES DEL SERVIDOR Y PÁGINAS DINÁMICAS 620¿QUÉ NECESITO PARA ESTE SEGUIR LOS EJEMPLOS? 622MÓDULOS WEB 623ACCIONES 626RECUPERACIÓN DE PARÁMETROS 628GENERADORES DE CONTENIDO 629GENERADORES DE TABLAS 631MANTENIMIENTO DE LA INFORMACIÓN DE ESTADO 632¿LE APETECE UNA GALLETA? 634UN SIMPLE NAVEGADOR 635AL OTRO LADO DE LA LÍNEA... 639ACTIVEFORMS: FORMULARIOS EN LA WEB 640

14 La Cara Oculta de C++ Builder

LEFTOVERTURE 645

32. IMPRESIÓN DE INFORMES CON QUICKREPORT 647

LA HISTORIA DEL PRODUCTO 647LA FILOSOFÍA DEL PRODUCTO 648PLANTILLAS Y EXPERTOS PARA QUICKREPORT 649EL CORAZÓN DE UN INFORME 650LAS BANDAS 652EL EVENTO BEFOREPRINT 654COMPONENTES DE IMPRESIÓN 655EL EVALUADOR DE EXPRESIONES 656UTILIZANDO GRUPOS 657ELIMINANDO DUPLICADOS 659INFORMES MASTER/DETAIL 661INFORMES COMPUESTOS 662PREVISUALIZACIÓN A LA MEDIDA 663LISTADOS AL VUELO 665ENVIANDO CÓDIGOS BINARIOS A UNA IMPRESORA 667

33. ANÁLISIS GRÁFICO 671

GRÁFICOS Y BIORRITMOS 671EL COMPONENTE TDBCHART 675COMPONENTES NO VISUALES DE DECISION CUBE 677REJILLAS Y GRÁFICOS DE DECISIÓN 679USO Y ABUSO DE DECISION CUBE 681MODIFICANDO EL MAPA DE DIMENSIONES 682

34. DESCENSO A LOS ABISMOS 685

INICIALIZACIÓN Y FINALIZACIÓN DEL BDE 685EL CONTROL DE ERRORES 687SESIONES Y CONEXIONES A BASES DE DATOS 688CREACIÓN DE TABLAS 690REESTRUCTURACIÓN 693ELIMINACIÓN FÍSICA DE REGISTROS BORRADOS 695CURSORES 696UN EJEMPLO DE ITERACIÓN 698PROPIEDADES 700LAS FUNCIONES DE RESPUESTA DEL BDE 702

35. CREACIÓN DE INSTALACIONES 705

LOS PROYECTOS DE INSTALLSHIELD EXPRESS 705LA PRESENTACIÓN DE LA INSTALACIÓN 707

Indice 15

LAS MACROS DE DIRECTORIOS 708GRUPOS Y COMPONENTES 709INSTALANDO EL BDE Y LOS SQL LINKS 711CONFIGURACIÓN ADICIONAL DEL BDE 713INSTALACIÓN DE PAQUETES 713INTERACCIÓN CON EL USUARIO 714LAS CLAVES DEL REGISTRO DE WINDOWS 716CÓMO SE REGISTRAN LOS COMPONENTES ACTIVEX 717ICONOS Y CARPETAS 718GENERANDO Y PROBANDO LA INSTALACIÓN 719LA VERSIÓN COMPLETA DE INSTALLSHIELD EXPRESS 720LAS EXTENSIONES DE INSTALLSHIELD EXPRESS 721

36. EJEMPLOS: LIBRETAS DE AHORRO 723

DESCRIPCIÓN DEL MODELO DE DATOS 723LIBRETAS DE AHORRO EN MS SQL SERVER 729AHORA, EN ORACLE 733EL MÓDULO DE DATOS 736TRANSACCIONES EXPLÍCITAS 739GESTIÓN DE LIBRETAS Y OPERACIONES 740ENTRADA DE APUNTES 742LA VENTANA PRINCIPAL 744CORRIGIENDO EL IMPORTE DE UN APUNTE 746

37. EJEMPLOS: UN SERVIDOR DE INTERNET 749

BÚSQUEDA DE PRODUCTOS 749EL MOTOR DE BÚSQUEDAS 751CREANDO LA EXTENSIÓN WEB 754GENERANDO LA TABLA DE RESULTADOS 756DOCUMENTOS HTML Y SUSTITUCIÓN DE ETIQUETAS 757RESPONDIENDO A LAS ACCIONES 759

APENDICE: EXCEPCIONES 761

SISTEMAS DE CONTROL DE ERRORES 761CONTRATOS INCUMPLIDOS 762CÓMO SE INDICA UN ERROR 763LA EJECUCIÓN DEL PROGRAMA FLUYE EN DOS DIMENSIONES 764PAGAMOS NUESTRAS DEUDAS 765LA DESTRUCCIÓN DE OBJETOS DINÁMICOS 766EL BLOQUE DE PROTECCIÓN DE RECURSOS 768CÓMO TRANQUILIZAR A UN PROGRAMA ASUSTADO 770EJEMPLOS DE CAPTURA DE EXCEPCIONES 771CAPTURANDO EL OBJETO DE EXCEPCIÓN 772

16 La Cara Oculta de C++ Builder

CAPTURA Y PROPAGACIÓN DE EXCEPCIONES DE LA VCL 773DISTINGUIR EL TIPO DE EXCEPCIÓN 773LAS TRES REGLAS DE MARTEENS 774CICLO DE MENSAJES Y MANEJO DE EXCEPCIONES 775EXCEPCIONES A LA TERCERA REGLA DE MARTEENS 777EL EVENTO ONEXCEPTION 778LA EXCEPCIÓN SILENCIOSA 781CONSTRUCTORES Y EXCEPCIONES 782

INDICE ALFABETICO 787

Prólogo del AutorPrólogo del Autor“The day must come - if the world last long enough -” said Arthur,

“when every possible tune will have been composed - every possible pun perpetrated ...and, worse than that, every possible book written! For the number of words is finite.”

“It’ll make very little difference to the authors,” I suggested. “Instead of saying ‘what book shall Iwrite?’ an author will ask himself ‘which book shall I write?’ A mere verbal distinction!”

Lady Muriel gave me an approving smile. “But lunatics would always write new books, surely?”she went on. “They couldn’t write the sane books over again!”

Lewis Carroll - Sylvie and Bruno Concluded

O CREO EN LAS ENCICLOPEDIAS; de hecho, nunca he podido terminar deleer alguna. Sin embargo, cada vez que hojeo un nuevo libro sobre C++Builder o Delphi me da la impresión de que el autor ha intentado preci-

samente escribir una enciclopedia; lástima que, en la mayoría de los casos, el volumendel libro se limita a lo sumo a un tomo de no más de 1000 páginas.

Este libro no pretende ni puede abarcar todos los temas relacionados con la pro-gramación en C++ Builder; su objetivo concreto son LAS TÉCNICAS DE PROGRAMA-CIÓN DE BASES DE DATOS UTILIZANDO C++ BUILDER, con énfasis especial en eldesarrollo de aplicaciones cliente/servidor y de múltiples capas, tarea para la que losentornos de programación de Borland están particularmente bien preparados.

Por lo tanto, asumiré cierta familiaridad del lector con C++, bastante común entrelos programadores de hoy día; sería impensable intentar suplantar a clásicos de talenvergadura como “El Lenguaje de Programación C++” del creador del lenguaje, BjarneStroustrup.

Contenido del libro

El libro se divide en cinco partes, que son las siguientes:

• La Parte 1 – “El lenguaje SQL” – ofrece una extensa presentación de loselementos de SQL, tanto en lo referente a las instrucciones básicas del estándarANSI 92, como en todo lo relacionado con la programación del lado delservidor: el lenguaje de triggers y procedimientos almacenados. En este últimoaspecto, los conceptos se presentan utilizando la sintaxis de InterBase, elservidor SQL de Borland. Posteriormente, presentamos por separado lascaracterísticas distintivas de los tres sistemas cliente/servidor más utilizados hoy:Microsoft SQL Server, IBM DB2 Universal Database y Oracle.

N

18 La Cara Oculta de C++ Builder

• La Parte 2 – “Navegación y búsqueda” – describe las facilidades básicas queofrecen los componentes VCL incluidos en C++ Builder para querepresentemos los conjuntos de datos con los que vamos a trabajar y nosdesplacemos por los registros que los componen. Esta parte se encarga tambiénde presentar la filosofía de utilización de controles visuales con conexión a datos(data-aware controls) y de mostrar ejemplos de cómo obtener interfaces de usuarioatractivas para mostrar la información. Para concluir esta parte, “Comunicacióncliente/servidor” describe las técnicas generales que deben tenerse en cuenta alinteractuar con bases de datos remotas; en este capítulo mostramos lainconsistencia de varios mitos de amplia difusión entre la comunidad deprogramadores.

• En la Parte 3 – “Actualizaciones y concurrencia” – se describen en detalle lasposibilidades que ofrece C++ Builder a la hora de actualizar el contenido denuestras bases de datos. En estos capítulos se hace especial énfasis en todo lorelacionado con la optimización del acceso concurrente a las bases de datos, deforma que sea posible minimizar la contención entre aplicaciones que se ejecutensimultáneamente desde diferentes clientes, y se describen las posibilidades queofrece el Motor de Datos de Borland (Borland Database Engine - BDE) para laimplementación de transacciones y las ventajas y limitaciones en este sentido delos diferentes sistemas SQL con los que el BDE puede comunicarse.

• La Parte 4 – “Programación Distribuida” – es, técnicamente hablando, la máscompleja del libro. En esta parte describiré inicialmente en detalle las posibili-dades del componente TClientDataSet, la clase sobre la que se basa la programa-ción de clientes delgados para el desarrollo de aplicaciones de múltiples capas enC++ Builder. Luego introduciré los conceptos fundamentales del Modelo deObjetos Componentes (COM) de Microsoft, la base sobre la que se apoya laprogramación de servidores de capa intermedia; inmediatamente después, unamplio capítulo describe en detalle las posibilidades de la tecnología que Borlandha llamado MIDAS y se presentan ejemplos de aplicaciones de tres capas. Perotodavía le quedará mucho más por ver en esta parte: el siguiente capítulo muestracómo utilizar los asistentes y componentes que incluye C++ Builder para crearextensiones de servidores de Internet que construyan dinámicamente páginasHTML a partir del contenido de bases de datos.

• En la Parte 5, que he denominado “Leftoverture”1, se aglutina toda una serie decapítulos que en principio no tienen una conexión directa entre sí. Aquíencontrará todo lo relacionado con cómo utilizar QuickReport, la herramienta degeneración de informes que se incluye en C++ Builder, cómo incluir en sus apli-caciones tablas de análisis multidimensional de datos a partir de los componentesDecision Cube, o cómo generar instalaciones con InstallShield Express for C++

1 “Leftoverture” es el nombre de un álbum producido en 1976 por Kansas. El nombre esuna combinación de las palabras “leftover” (remanente, residuo) y “overture” (obertura). Lapieza clave del álbum fue compuesta mezclando trozos de otras canciones que habían sidodescartadas por el grupo.