Qué es esto..??
Altas
Consultas
Bajas
Modificar
Buscar
Navegadores
Accesorios
Imprimir
| Volver | |
Arbol | |
Archivo | |
Agenda |
Basico | |
Cola y Pila |
| Editor | |
Editor2 | |
Fibonacci | |
Hanoi | |
Listas | |
Matriz |
| Modelo 1 | |
Modelo | |
Polimorfismo |
Punteros | |
Sobrecarga | |
Vectores |
Amigo virtual en este page podrás apreciar la aplicación de los algoritmos típicos que se requieren para procesar una base de datos compuesta por una sola tabla, que fue creada usando Visual Fox Pro. Por supuesto que la estructura de este sistema, es valido para cualquier otra tabla generada por otro entorno, tal como Access, Paradox, DBase u otro estandar.
Te propongo algoritmos para altas, bajas, consulta, búsqueda e impresión del contenido de la base de datos. Si eres novell en estos menesteres, te recomiendo editar textualmente mi programa fuente, luego compilar.
... si opinas que los links anteriores no están en tu onda, te recomiendo recordar . . . .
.. ahora si opinas que lo anterior es una WEBada y estas de acuerdo con la Caperucita, que afirma que el Lobo la tiene chica, te puedo demostrar que . . .
Si quiero comprar un boomerang nuevo, ¿cómo me deshago del viejo?
C++ BUILDER BASE de DATOS
Dado que una base de datos es el contenedor de información registrada en tablas, conexiones ODBC y procedimientos almacenados; podemos simplificar y afirmar que es el conjunto de tablas e índices pertenecientes a un mismo sistema de información.
Para utilizar una tabla determinada de la base de datos, esta debe ser abierta de manera que tanto la tabla y la base de datos queden activados.
El sistema de gestión de bases de datos incorporado en la versión de C++ Bulder 5, se utiliza como diccionario de datos para apoyar el desarrollo de aplicaciones o su uso interactivo desde la ventana de database desktop.
Por ello, si modificamos un registro, las reglas de validación están automáticamente activas. Asi, si existe una condición que impide grabar un campo determinado con igual contenido, cuando se intenta actualizar el registro actual, se produce una advertencia de validación.
C++ Builder, permite además, guardar nombres largos de campo o su descripción, evitando el problema del uso de nombres crípticos por la limitación de la longitud de los nombres de campo, como ocurría antes.
Otra característica interesante de C++ Builder, son sus vistas o consultas SQL almacenadas en la base de datos, cuya particularidad es pueden hacerse uso como una tabla, de modo que puedes, abrirlas, cerrarlas o actualizar las tablas que han intervenido en tal consulta.
De acuerdo a la ubicación física de la tabla consultada podemos tener una:
La base de datos posee los procedimientos almacenados, que permiten incluir código que pueda ser usado desde que se activa la base de datos, pudiendo utilizar tal código, por ejemplo, para incluir una rutina de numeración automática de códigos para los registros que se vayan añadiendo a la tabla.
TABLA LIBRE: Es aquella que no pertenece a una base de datos, por tanto no posee características aplicadas a las tablas pertenecientes a una base de datos.
LA BASE DE DATOS PUEDE CONTENER
Se guarda información acerca de las columnas seleccionadas, los criterios de recuperación de registros, el orden de las filas o los campos actualizables.
Se guarda información acerca de las columnas seleccionadas, los criterios de recuperación de registros, el orden de las filas o los campos actualizables.
Esta información se utiliza posteriormente para generar vistas remota.
Los procedimientos contenidos en la base de datos están disponibles en tanto en cuanto la base de datos este abierta.
Contiene, además, el código relativo a las reglas de validación.
Por tanto, cada vez que se produce algún evento de inserción, modificación o eliminación, se ejecuta este código.
CREAR BASE DE DATOS con VISUAL FOX
Como crear una base de datos en VISUAL FOX:
Para crear una base de datos se puede seguir algunos de estos procedimientos:
Escoja del menú archivo la opción nuevo (CTRL-N) o escoja el botón de comando nuevo de la barra de herramientas estándar.
Visualice a continuación el cuadro de dialogo para la elección del nuevo tipo de fichero a crear.
Escoja base de datos.
USO de BASE DE DATOS
Crear y mantener la información del contenedor de bases de datos se realiza mediante los comandos CREATE DATABASE NombreArchivo y MODIFY DATABASE [NombreBaseDatos], respectivamente.
El primero crea la base de datos y abre el diseñador de base de datos.
El segundo necesita una base de datos abierta y activa. Si no es así, muestra el cuadro de dialogo Abrir para elegir la base de datos a modificar.
Para que se pueda acceder a la información de un contenedor de base de datos, es necesario, en primer lugar, abrir la base de datos mediante el comando OPEN DATABASE NombreArchivo.
Se puede abrir varias bases de datos a la vez.
Cuando se abre una base de datos, esta queda disponible, pero no activa. Esto quiere decir que algunos comandos y funciones no actuaran correctamente.
La razón es que trabajan sobre la base de datos activa; por tanto, no basta con abrir solo la base de datos, hay que activarla.
Para este ultimo cometido se ha de utilizar SET DATABASE TO [NombreBaseDatos].
Cerrar la base de datos activa es tan sencillo como utilizar el comando CLOSE DATABASE.
Cuando se abre y activa una base de datos, la función DBC() devuelve el nombre de la base de datos activa.
Si existe la seguridad de que una base de datos esta abierta, aunque no este activa, se puede confirmar mediante la función DBUSED (NombreBaseDatos).
De todos modos, aun se puede ir un poco mas allá y almacenar en una matriz todas las bases de datos abiertas. Este resultado se obtiene mediante la función ADATABASES().
Para eliminar físicamente del disco una base de datos se utiliza el comando DELETE DATABASE NombreBaseDatos. Este comando elimina los ficheros DBC, DCT y DCX relacionado con la base de datos. También elimina toda referencia a la base de datos en las tabas que contenía; por tanto, estas pasan a ser tablas libres.
CREAR BASE DE DATOS desde C++Builder
Para efectuar este proceso, proceda de la siguiente forma:
También puede pulsar el botón derecho en cualquier zona libre de la ventana del generador y escoger del menú subsiguiente la opción Nueva Tabla.
CREAR BASE DE DATOS desde C++ Builder
CREAR TABLA de DATOS desde C++ Builder
USAR TABLA de DATOS desde C++ Builder
///////////////////////////////////////////////// // C++ BUILDER 5 BASE de DATOS // Con una tabla dbf // Wilo Carpio 30/11/20001 ///////////////////////////////////////////////// /////////////////////////////////////////////////// // DECLARACION DE VARIABLES GLOBALES /////////////////////////////////////////////////// AnsiString DatoBuscado;
Puedo guardar el ratón de mi PC en el baúl del coche con el gato del auto.??
Sonrie tu novia nos ama..!!
CREANDO NUEVA FICHA
Para generar un nuevo tregistro puedes usar los procedimientos SQL o simplemente recurrir a la función Append() cuya sintaxis puedes apreciar en las siguientes lineas.
/////////////////////////////////////////////////// // ACTIVANDO BOTON ALTAS /////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonAltasClick(TObject *Sender) { MiFormulario->Caption = "ALTA DE REGISTROS"; PanelAltas->Caption="Digita los datos, luego graba"; ActivoPanelAltas(); MuestroBoxDatos(); LimpioLosBoxes(); HabilitoBoxDatos(); BoxNombre->SetFocus(); }; /////////////////////////////////////////////////// // GRABACION DE UN REGISTRO EN LA TABLA /////////////////////////////////////////////////// void __fastcall TMiFormulario::GrabarDatosClick(TObject *Sender) { GrabarDatos->Visible=false; AceptarDatos->Visible=false; if (MiFormulario->Caption == "ALTA DE REGISTROS") { TLocateOptions Resultado; Resultado = Resultado < < loPartialKey; if (MiTabla - > Locate ( "nombre",BoxNombre->Text,Resultado)) { ShowMessage("Ese Mono Ya Está Grabado"); LimpioLosBoxes(); BoxNombre->SetFocus(); } else { MiTabla->Append(); LeoDatosDeBoxes(); MiTabla->Post(); LimpioLosBoxes(); BoxNombre->SetFocus(); } } else if (MiFormulario->Caption =="MODIFICAR REGISTRO") { MiTabla->Edit(); LeoDatosDeBoxes(); MiTabla->Post(); } else if (MiFormulario->Caption =="BAJA DE REGISTRO") { MiTabla->Delete(); MiTabla->Refresh(); }; }; /////////////////////////////////////////////////// // CERRANDO PANEL DE ALTAS /////////////////////////////////////////////////// void __fastcall TMiFormulario::CerrarAltasClick(TObject *Sender) { ActivoPanelABM(); }
Sonrie yo te amo..!!
¿Por qué no hay comida para gatos 'con sabor a ratón'?
GRILLAS DE DATOS
La manera más simple de visualizar el contenido de tu tabla es recurrir a la grilla de datos
/////////////////////////////////////////////////// // ACTIVANDO PANEL CON LA GRILLA DE DATOS /////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonGrillaClick(TObject *Sender) { ActivoPanelGrilla(); }; void ActivoPanelGrilla(void) { MiFormulario->Caption="'GRILLA DE DATOS"; MiFormulario->PanelGrilla->Visible=true; MiFormulario->PanelABM->Visible=false ; }; /////////////////////////////////////////////////// // CERRANDO LA GRILLA /////////////////////////////////////////////////// void __fastcall TMiFormulario::CerrarGrillaMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { ActivoPanelABM(); }
¿Hasta dónde se lavan la cara los pelados?
¿Por qué apretamos más fuerte los botones del control remoto cuando tiene poca batería??
ELIMINACION DE UNA FICHA
Para borrar un registro puedes recurrir a la función Delete()
/////////////////////////////////////////////////// // ACTIVANDO BOTON DE BAJAS /////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonBajaClick(TObject *Sender) { MiFormulario->Caption="BAJA DE REGISTRO"; ActivoPanelAltas(); HabilitoBoxDatos(); CargoComboNombre(); } /////////////////////////////////////////////////// // ELIMINACION DE UN REGISTRO /////////////////////////////////////////////////// void __fastcall TMiFormulario::BorrarDatosClick(TObject *Sender) { MuestroBoxDatos(); BorrarDatos->Visible=false; if (Application->MessageBox("¿Deseas borrar estos datos..??","ELIMINACION DE UN REGISTRO",MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION ) == IDYES) { MiTabla->Delete(); MiTabla->Refresh(); ComboNombre->Text=""; LimpioLosBoxes(); }; };
¿Por qué la luz negra no es negra?
¿Por qué los Kamikazes usaban cascos.??
MODIFICAR REGISTROS
Para editar y modificar el contenido de una ficha de la tabla puedes usar la función Edit()
/////////////////////////////////////////////////// // ACTIVANDO BOTON DE MODIFICACIONES /////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonCambiosClick(TObject *Sender) { MiFormulario->Caption="MODIFICAR REGISTRO"; ActivoPanelAltas(); HabilitoBoxDatos(); CargoComboNombre(); } /////////////////////////////////////////////////// // CAMBIO DE CONTENIDO DE UN BOX /////////////////////////////////////////////////// void __fastcall TMiFormulario::BoxNombreChange(TObject *Sender) { if ((MiFormulario->Caption == "ALTA DE REGISTROS")||(MiFormulario->Caption =="MODIFICAR REGISTRO")) if (BoxNombre->Text == "") { GrabarDatos->Visible=false; } else { GrabarDatos->Visible=true; } };
Al mundo redondo lo llamamos planeta. Si fuese plano... ¿lo llamaríamos redondeta.??
Si un abogado enloquece... ¿pierde el juicio?
BUSCANDO FICHAS
La manera más eficiente de buscar una ficha, ya sea para consultas o para modificaciones o para bajas es usar un Combo Box, cuyos algoritmos podras ver en los siguientes renglones.
/////////////////////////////////////////////////// // OPCIONES DE OPTION GRUP PARA BUSCAR /////////////////////////////////////////////////// void __fastcall TMiFormulario::OpcionBuscarClick(TObject *Sender) { OpcionBuscar->Visible=false; if (OpcionBuscar->Items->Strings[OpcionBuscar->ItemIndex] == "Por Combo" ) { CargoComboNombre(); } else { PanelAltas->Caption="Digita nombre buscado"; ComboNombre->Visible=true; ComboNombre->SetFocus(); DatoBuscado=ComboNombre->Text; }; }; /////////////////////////////////////////////////// // ACTIVANDO BOTON DE BUSQUEDA /////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonBuscarClick(TObject *Sender) { MiFormulario->Caption="BUSCAR REGISTRO"; PanelAltas->Caption="Clikea Opción de Buscar"; ActivoPanelAltas(); OpcionBuscar->Visible= true; } /////////////////////////////////////////////////// // CAMBIO DEL CONTENIDO DEL DISPLAY DEL COMBO /////////////////////////////////////////////////// void __fastcall TMiFormulario::ComboNombreChange(TObject *Sender) { if (MiFormulario->Caption =="BUSCAR REGISTRO") { VerDato->Visible=true; } else { AceptarDatos->Visible=true; }; } /////////////////////////////////////////////////// // FUNCION DE BUSQUEDA POR COMBO /////////////////////////////////////////////////// void BuscoMono(void) { LimpioLosBoxes(); MuestroBoxDatos(); MiFormulario->AceptarDatos->Visible=false; MiFormulario->VerDato->Visible=false; TLocateOptions Resultado; Resultado = Resultado<MiTabla->Locate("nombre",MiFormulario->ComboNombre->Text,Resultado)) { MiFormulario->BoxNombre->Text = MiFormulario->MiTabla->FieldByName("Nombre")->AsString; MiFormulario->BoxEmail->Text = MiFormulario->MiTabla->FieldByName("Email")->AsString; } else { ShowMessage("Ese mono NO EXISTE!!!"); }; MiFormulario->ComboNombre->Text=""; }; /////////////////////////////////////////////////// // CARGA DEL COMBO CON UN CAMPO /////////////////////////////////////////////////// void CargoComboNombre(void) { bool B; B=false; MiFormulario->PanelAltas->Caption="Selecciona Dato del combo"; MiFormulario->ComboNombre->Visible=true; MiFormulario->ComboNombre->Clear(); MiFormulario->ComboNombre->SetFocus(); MiFormulario->MiTabla->First(); while (B==False) { if (MiFormulario->MiTabla->Eof) { B=true; } else { MiFormulario->ComboNombre->Items->Add(MiFormulario->MiTabla->FieldValues["nombre"]); MiFormulario->MiTabla->Next(); } } }; /////////////////////////////////////////////////// // ACEPTAR DATO DEL DISPLAY DEL COMBO /////////////////////////////////////////////////// void __fastcall TMiFormulario::AceptarDatosClick(TObject *Sender) { AceptarDatos->Visible=false; BuscoMono(); if (MiFormulario->Caption =="BAJA DE REGISTRO") { BorrarDatos->Visible=true; }; } /////////////////////////////////////////////////// // MOSTRAR DATO DEL DISPLAY DEL COMBO /////////////////////////////////////////////////// void __fastcall TMiFormulario::VerDatoClick(TObject *Sender) { BuscoMono(); DesabilitoBoxDatos(); }
¿Los infantes disfrutan la infancia tanto como los adultos el adulterio.??
NAVEGANDO por la TABLA
Corresponden a los algoritmos de los típicos cuatro botones de navegación
/////////////////////////////////////////////////// // NAVEGADORES DE LA GRILLA /////////////////////////////////////////////////// void __fastcall TMiFormulario::PrimeroClick(TObject *Sender) { MiTabla->First(); } //--------------------------------------------------------------------------- void __fastcall TMiFormulario::AnteriorClick(TObject *Sender) { MiTabla->Prior(); } //--------------------------------------------------------------------------- void __fastcall TMiFormulario::SiguienteClick(TObject *Sender) { MiTabla->Next(); } //--------------------------------------------------------------------------- void __fastcall TMiFormulario::UltimoClick(TObject *Sender) { MiTabla->Last(); }
Si el pez nada... ¿la vaca todo..???
¿Qué tiempo verbal es "no debería haber pasado"?... ¿preservativo imperfecto.??
FUNCIONES COMUNES
En todos tus programas te haran falta alguno de estos algoritmos.
/////////////////////////////////////////////////// // FUNCIONES COMUNES DE CONTROL DEL PROGRAMA /////////////////////////////////////////////////// void ActivoPanelABM(void) { MiFormulario->Caption="PROGRAMA MODELO C++Builder: Wilo Carpio "+Date(); MiFormulario->PanelABM->Visible=true ; MiFormulario->PanelGrilla->Visible=false ; MiFormulario->PanelTeoria->Visible=false ; MiFormulario->PanelAltas->Visible=false; HabilitoBoxDatos(); MiFormulario->ComboNombre->Text=""; }; void ActivoPanelAltas(void) { MiFormulario->PanelABM->Visible=false ; MiFormulario->PanelGrilla->Visible=false ; MiFormulario->PanelTeoria->Visible=false ; MiFormulario->PanelAltas->Visible=true; MiFormulario->OpcionBuscar->Visible= false; MiFormulario->OpcionBuscar->ItemIndex=-1; MiFormulario->ComboNombre->Visible= false; MiFormulario->VerDato->Visible= false; MiFormulario->ComboNombre->Text=""; DesabilitoBoxDatos(); LimpioLosBoxes(); OcultarIconosABM(); OcultoBoxDatos(); }; void DesabilitoBoxDatos(void) { MiFormulario->BoxNombre->Enabled=false; MiFormulario->BoxEmail->Enabled=false; }; void HabilitoBoxDatos(void) { MiFormulario->BoxNombre->Enabled= true; MiFormulario->BoxEmail->Enabled= true; }; void OcultoBoxDatos(void) { MiFormulario->BoxNombre->Visible=false; MiFormulario->BoxEmail->Visible=false; }; void MuestroBoxDatos(void) { MiFormulario->BoxNombre->Visible=true; MiFormulario->BoxEmail->Visible= true; }; void OcultarIconosABM(void) { MiFormulario->GrabarDatos->Visible=false; MiFormulario->BorrarDatos->Visible=false; MiFormulario->AceptarDatos->Visible=false; MiFormulario->ComboNombre->Visible=false; }; void LeoDatosDeBoxes(void) { MiFormulario->MiTabla->FieldByName("Nombre")->AsString = MiFormulario->BoxNombre->Text; MiFormulario->MiTabla->FieldByName("Email")->AsString = MiFormulario->BoxEmail->Text; }; void LimpioLosBoxes(void) { MiFormulario->BoxNombre->Text=""; MiFormulario->BoxEmail->Text=""; }; /////////////////////////////////////////////////// // FUNCION DE SALIDA DEL PROGRAMA /////////////////////////////////////////////////// void __fastcall TMiFormulario::ChauMouseUp(TObject *Sender, TShiftState Shift, int X, int Y) { if (Application->MessageBox("Deseas cerrar el programa?","ESTAS POR CERRAR ESTE SISTEMA",MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION ) == IDYES) { MiFormulario->Close(); }; };
Si la piscina es honda, ¿el mar es Toyota.???
¿Debería cortarme las venas o dejármelas largas.??
MODOS de IMPRIMIR
En los siguientes párrafos te propongo las alternativas más usuales para imprimir distintos tipos de archivos.
/////////////////////////////////////////////////// // ACTIVANDO BOTON DEL PANEL CON TEORIA /////////////////////////////////////////////////// void __fastcall TMiFormulario::BotonTeoriaClick(TObject *Sender) { PanelTeoria->Visible=true; PanelABM->Visible=false; Autor->Visible=true; } /////////////////////////////////////////////////// // CERRANDO PANEL DE TEORIA /////////////////////////////////////////////////// void __fastcall TMiFormulario::CerrarAutorClick(TObject *Sender) { PanelABM->Visible=true; PanelTeoria->Visible=false; } /////////////////////////////////////////////////// // ACTIVANDO IMPRESION DE TEORIA /////////////////////////////////////////////////// void __fastcall TMiFormulario::ImprimoTeoriaClick(TObject *Sender) { MiFormulario->Caption="ESTAS POR IMPRIMIR LA TEORIA"; if (Application->MessageBox("¿Deseas imprimir estos datos.??","IMPRESION DE DATOS DE LA TEORIA",MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION ) == IDYES) { if (Application->MessageBox("¿Está activada tu impresora.??","IMPRESION DE DATOS DE LA TEORIA", MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION ) == IDYES) { PrintDialog->Execute(); BoxConTeoria->Print("MyApp.exe - readme.txt"); }; }; MiFormulario->Caption="ESTAS POR IMPRIMIR DATOS DE LA GRILLA"; if (Application->MessageBox("¿Deseas imprimir estos datos.??","IMPRESION DE DATOS DE LA GRILLA",MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION ) == IDYES) { if (Application->MessageBox("¿Está activada tu impresora.??","IMPRESION DE DATOS DE LA GRILLA",MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION ) == IDYES) { PrintDialog->Execute(); TPrinter *Prntr = Printer(); Graphics::TBitmap *bmp = new Graphics::TBitmap(); bmp->LoadFromFile("c:\Archivos de programa\Borland\CBuilder5\Projets\BDB2001Wilo\BebeWilo.bmp"); Prntr->BeginDoc(); Prntr->Canvas->Draw((Prntr->PageWidth - bmp->Width),(Prntr->PageHeight - bmp->Height),bmp); Prntr->EndDoc(); delete bmp; }; }; } /////////////////////////////////////////////////// // IMPRESION DE LA TABLA CON Quick REPORT /////////////////////////////////////////////////// void __fastcall TMiFormulario::ImprimoGrillaClick(TObject *Sender) { MiFormulario->Caption="ESTAS POR IMPRIMIR EL CONTENIDO DE LA TABLA"; if (Application->MessageBox("¿Deseas imprimir estos datos.??","IMPRESION DE DATOS DE LA TABLA", MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION ) == IDYES) { if (Application->MessageBox("¿Está activada tu impresora.??","IMPRESION DE DATOS DE LA TABLA", MB_YESNO + MB_DEFBUTTON2 + MB_ICONQUESTION ) == IDYES) { MiReporte->QuickRep1->Preview(); }; }; }
Cuando se 'reproduce' un disco... ¿queda 'encinta'?