/*--------------------------------------------------------------------
 * FICHERO:  Vbdt.c
 * OBJETIVO: Probar el objeto BaseDato
 * AUTOR:    Pedro Reina
 * FECHA:    S.1.7.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "BaseDato.h"

/*--------------------------------------------------------------------
 * Declaracin de funciones
 *------------------------------------------------------------------*/

void P_Bdt_Crea();
void P_Bdt_AbreL();
void P_Bdt_AbreA();
void P_Bdt_Cierra();
void P_Bdt_NumeroDeCampo();
void P_Bdt_LeeRegistro();
void P_Bdt_EscribeRegistro();
void P_Bdt_BorraRegistro();
void P_Bdt_RecuperaRegistro();
void P_Bdt_AgregaRegistro();
void P_Bdt_CampoNumero();
void P_Bdt_PonCampoNumero();
void P_Bdt_CampoNombre();
void P_Bdt_PonCampoNombre();

/*--------------------------------------------------------------------
 * Variable global
 *------------------------------------------------------------------*/

basedato Base;

/*--------------------------------------------------------------------
 * Programa principal
 *------------------------------------------------------------------*/
void main()
  {
  int Opcion, Sigue=1;
  contador Fil, Col;

  Pan_Define (PAN_TEXTO);
  while ( Sigue )
    {
    Pan_Color (NEGRO,BLANCO);
    Pan_Limpia();
    Fil = 0, Col = 3;
    Pan_PonTexto (Fil++,Col,"Prueba del objeto BaseDato" );
    Pan_PonTexto (Fil++,Col,"==========================" );
    Fil++;
    Pan_PonTexto (Fil++,Col,"0. Fin del programa" );
    Pan_PonTexto (Fil++,Col,"1. Paso a grfico" );
    Pan_PonTexto (Fil++,Col,"2. Paso a texto" );
    Pan_PonTexto (Fil++,Col,"3. Bdt_Crea()" );
    Pan_PonTexto (Fil++,Col,"4. Bdt_Cierra()" );
    Pan_PonTexto (Fil++,Col,"5. Bdt_AbreL()" );
    Pan_PonTexto (Fil++,Col,"6. Bdt_NumeroDeCampo()" );
    Pan_PonTexto (Fil++,Col,"7. Bdt_LeeRegistro()" );
    Pan_PonTexto (Fil++,Col,"8. Bdt_AbreA()" );
    Pan_PonTexto (Fil++,Col,"9. Bdt_EscribeRegistro()" );
    Col--;
    Pan_PonTexto (Fil++,Col,"10. Bdt_BorraRegistro()" );
    Pan_PonTexto (Fil++,Col,"11. Bdt_RecuperaRegistro()" );
    Pan_PonTexto (Fil++,Col,"12. Bdt_AgregaRegistro()" );
    Pan_PonTexto (Fil++,Col,"13. Bdt_CampoNumero()" );
    Pan_PonTexto (Fil++,Col,"14. Bdt_PonCampoNumero()" );
    Pan_PonTexto (Fil++,Col,"15. Bdt_CampoNombre()" );
    Pan_PonTexto (Fil++,Col,"16. Bdt_PonCampoNombre()" );
    Fil++;
    Pan_PonTexto (Fil++,Col,"Introduce nmero de opcin: " );
    scanf ( "%d", &Opcion );
    getchar();

    switch ( Opcion )
      {
      case 0:   Sigue = 0;               break;
      case 1:   Pan_Cierra();
                Pan_Define (PAN_GRAFICO);
                break;
      case 2:   Pan_Cierra();
                Pan_Define (PAN_TEXTO);
                break;
      case 3:   P_Bdt_Crea();            break;
      case 4:   P_Bdt_Cierra();          break;
      case 5:   P_Bdt_AbreL();           break;
      case 6:   P_Bdt_NumeroDeCampo();   break;
      case 7:   P_Bdt_LeeRegistro();     break;
      case 8:   P_Bdt_AbreA();           break;
      case 9:   P_Bdt_EscribeRegistro(); break;
      case 10:  P_Bdt_BorraRegistro();    break;
      case 11:  P_Bdt_RecuperaRegistro(); break;
      case 12:  P_Bdt_AgregaRegistro();   break;
      case 13:  P_Bdt_CampoNumero();      break;
      case 14:  P_Bdt_PonCampoNumero();   break;
      case 15:  P_Bdt_CampoNombre();      break;
      case 16:  P_Bdt_PonCampoNombre();   break;
      }
    }
  Pan_Cierra();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_Crea()
 *------------------------------------------------------------------*/
void P_Bdt_Crea()
  {
  cadena NombreFich;
  static cadena   Nombre[]   = { "NOMBRE", "EDAD", "SEXO", NIL };
  static char     Tipo[]     = { 'C',      'N',    'L', };
  static contador Longitud[] = {  8,        3,      1,  };
  static contador Decimal[]  = {  0,        0,      0,  };

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_Crea()");

  NombreFich = Fch_Nombre ("Vbdt","dbf");
  Pan_PonTexto (2,0,"Creando la base de datos ");
  Pan_Texto (NombreFich);

  Base = Bdt_Crea (NombreFich, Nombre, Tipo, Longitud, Decimal);

  if ( Base ) { Pan_PonTexto (4,0,"Creada."); }
  else        { Pan_PonTexto (4,0,"No se ha creado."); }

  Cad_Destruye (NombreFich);

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_Cierra()
 *------------------------------------------------------------------*/
void P_Bdt_Cierra()
  {
  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_Cierra()");

  if ( Base )
    {
    Bdt_Cierra (Base);
    Base = NIL;
    Pan_PonTexto (2,0,"Base de datos cerrada.");
    }
  else
    { Pan_PonTexto (2,0,"No estaba abierta."); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_AbreL()
 *------------------------------------------------------------------*/
void P_Bdt_AbreL()
  {
  cadena   Propuesta, NombreFich;
  contador Tope, i;
  char     Aux[11];

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_Abre() para leer");

  Propuesta = Fch_Nombre ("","dbf");
  Pan_PonTexto (2,0,"Nombre de la base de datos para leer:");
  NombreFich = Usr_Texto (Propuesta,30,4,0,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);
  Cad_Destruye (Propuesta);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( Base = Bdt_Abre (NombreFich, BDT_LECTURA) )
      {
      Pan_PonTexto (6,0,"Fecha de la ltima actualizacin: ");
      Pan_Entero (Bdt_DiaUltimo(Base),2);
      Pan_Caracter ('.');
      Pan_Entero (Bdt_MesUltimo(Base),2);
      Pan_Caracter ('.');
      Pan_Entero (Bdt_AnoUltimo(Base),4);

      Pan_PonTexto (7,0,"Nmero de campos: ");
      Pan_Entero (Bdt_TotalCampo(Base),3);

      Pan_PonTexto (8,0,"Nmero de registros: ");
      Pan_Entero (Bdt_TotalRegistro(Base),5);

      Pan_PonTexto (10,0,"Descripcin de los campos: ");
      Pan_PonTexto (11,0,"NUM NOMBRE     TIPO LONG DEC");
      Tope = Min (9,Bdt_TotalCampo(Base));
      for ( i=0 ; i<Tope ; i++ )
        {
        Pan_PonEntero (12+i,1,i,2);
        Bdt_NombreDeCampo (Base,i,Aux);
        Pan_PonTexto (12+i,4,Aux);
        Pan_PonCar (12+i,16,Bdt_TipoDeCampo(Base,i));
        Pan_PonEntero (12+i,21,Bdt_LongitudDeCampo(Base,i),3);
        Pan_PonEntero (12+i,25,Bdt_DecimalDeCampo(Base,i),2);
        }
      }
    }

  Cad_Destruye (NombreFich);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_NumeroDeCampo()
 *------------------------------------------------------------------*/
void P_Bdt_NumeroDeCampo()
  {
  cadena   Nombre;
  contador Numero;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_NumeroDeCampo()");

  Pan_PonTexto (2,4,"Nombre del campo:");
  Nombre = Usr_Texto ("",10,4,4,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( Bdt_NumeroDeCampo (Base,&Numero,Nombre) )
      {
      Pan_PonTexto (6,4,"Nmero: ");
      Pan_Entero (Numero,2);
      }
    else
      { Pan_PonTexto (6,4,"No existe"); }
    }

  Cad_Destruye (Nombre);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_LeeRegistro()
 *------------------------------------------------------------------*/
void P_Bdt_LeeRegistro()
  {
  cadena   Regleta;
  entero   Numero;
  contador i, Tope;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_LeeRegistro()");

  Regleta = Cad_Une ("0....:....1....:....2....:....3....:....",
                     "4....:....5....:....6....:....7....:....", CAD_FIN);

  Pan_PonTexto (2,4,"Nmero de registro:");
  Numero = Usr_Entero (0,3,0,999,4,4,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( Bdt_LeeRegistro (Base,Numero) )
      {
      Pan_PonTexto (6,0,Regleta);
      Tope = Min (80,Bdt_LongitudRegistro(Base));
      Pan_Cursor (7,0);
      for ( i=0 ; i<Tope ; i++ )
        { Pan_Caracter (Bdt_InfoActual(Base)[i]); }
      Pan_PonTexto (9,4,"Estado del registro: ");

      if ( Bdt_ActivoRegistro(Base) ) { Pan_Texto ("Activo"); }
      else                            { Pan_Texto ("Borrado"); }

      Pan_PonTexto (11,4,"Nmero del registro actual: ");
      Pan_Entero (Bdt_Actual(Base),3);
      }
    else
      { Pan_PonTexto (6,4,"No existe"); }
    }

  Cad_Destruye (Regleta);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_AbreA()
 *------------------------------------------------------------------*/
void P_Bdt_AbreA()
  {
  cadena   Propuesta, NombreFich;
  contador Tope, i;
  char     Aux[11];

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_Abre() para actualizar");

  Propuesta = Fch_Nombre ("","dbf");
  Pan_PonTexto (2,0,"Nombre de la base de datos para actualizar:");
  NombreFich = Usr_Texto (Propuesta,30,4,0,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);
  Cad_Destruye (Propuesta);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( Base = Bdt_Abre (NombreFich, BDT_ACTUALIZACION) )
      { Pan_PonTexto (6,0,"Abierta"); }
    }

  Cad_Destruye (NombreFich);
  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_EscribeRegistro()
 *------------------------------------------------------------------*/
void P_Bdt_EscribeRegistro()
  {
  entero   Numero;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_EscribeRegistro()");

  Pan_PonTexto (2,4,"Nmero de registro:");
  Numero = Usr_Entero (0,3,0,999,4,4,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);

  if ( Tec_Ultima() != TEC_ESC )
    {
    Bdt_LimpiaRegistro(Base);
    if ( Bdt_EscribeRegistro (Base,Numero) )
      { Pan_PonTexto (6,4,"Limpiado"); }
    else
      { Pan_PonTexto (6,4,"No se puede"); }
    }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_BorraRegistro()
 *------------------------------------------------------------------*/
void P_Bdt_BorraRegistro()
  {
  entero   Numero;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_BorraRegistro()");

  Pan_PonTexto (2,4,"Nmero de registro:");
  Numero = Usr_Entero (0,3,0,999,4,4,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( Bdt_BorraRegistro(Base,Numero) )
      { Pan_PonTexto (6,4,"Borrado"); }
    else
      { Pan_PonTexto (6,4,"No se puede"); }
    }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_RecuperaRegistro()
 *------------------------------------------------------------------*/
void P_Bdt_RecuperaRegistro()
  {
  entero   Numero;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_RecuperaRegistro()");

  Pan_PonTexto (2,4,"Nmero de registro:");
  Numero = Usr_Entero (0,3,0,999,4,4,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( Bdt_RecuperaRegistro(Base,Numero) )
      { Pan_PonTexto (6,4,"Recuperado"); }
    else
      { Pan_PonTexto (6,4,"No se puede"); }
    }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_AgregaRegistro()
 *------------------------------------------------------------------*/
void P_Bdt_AgregaRegistro()
  {
  entero Numero;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_AgregaRegistro()");

  Bdt_LimpiaRegistro(Base);
  if ( Bdt_AgregaRegistro (Base,&Numero) )
    {
    Pan_PonTexto (6,4,"Aadido registro ");
    Pan_Entero (Numero,4);
    }
  else
    { Pan_PonTexto (6,4,"No se puede"); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_CampoNumero()
 *------------------------------------------------------------------*/
void P_Bdt_CampoNumero()
  {
  entero   Numero;
  contador Tope, i;
  cadena   Contenido;

  Contenido = Cad_Crea (Bdt_LongitudRegistro(Base));

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_CampoNumero()");

  Pan_PonTexto (2,4,"Nmero de registro:");
  Numero = Usr_Entero (0,3,0,999,4,4,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( Bdt_LeeRegistro(Base,Numero) )
      {
      Tope = Min (10,Bdt_TotalCampo(Base));
      for ( i=0 ; i<Tope ; i++ )
        {
        Bdt_CampoNumero (Base,i,Contenido);
        Pan_Color (NEGRO,BLANCO);
        Pan_PonTexto (6+i,0,"Campo ");
        Pan_Entero (i,1);
        Pan_Texto (" -> ");
        Pan_Color (ROJO,BLANCO);
        Pan_Texto (Contenido);
        }
      }
    else
      { Pan_PonTexto (6,4,"No existe"); }
    }

  Cad_Destruye (Contenido);

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_PonCampoNumero()
 *------------------------------------------------------------------*/
void P_Bdt_PonCampoNumero()
  {
  entero Numero;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_PonCampoNumero()");

  Bdt_LimpiaRegistro(Base);
  Bdt_PonCampoNumero (Base,0,"Leocadio");
  Bdt_PonCampoNumero (Base,1,"125");
  Bdt_PonCampoNumero (Base,2,"T");

  if ( Bdt_AgregaRegistro (Base,&Numero) )
    {
    Pan_PonTexto (6,4,"Aadido registro ");
    Pan_Entero (Numero,4);
    }
  else
    { Pan_PonTexto (6,4,"No se puede"); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_CampoNombre()
 *------------------------------------------------------------------*/
void P_Bdt_CampoNombre()
  {
  static cadena NombreCampo[] = {"NOMBRE", "EDAD", "SEXO", "DATE", "NAME",
                                  "LENGTH", NIL};
  entero   Numero;
  cadena   Contenido;
  contador i;
  logico   ExisteCampo;

  Contenido = Cad_Crea (Bdt_LongitudRegistro(Base));

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_CampoNombre()");

  Pan_PonTexto (2,4,"Nmero de registro:");
  Numero = Usr_Entero (0,3,0,999,4,4,BLANCO,NEGRO);
  Usr_BorraZona (NEGRO);
  Pan_Color (NEGRO,BLANCO);

  if ( Tec_Ultima() != TEC_ESC )
    {
    if ( Bdt_LeeRegistro(Base,Numero) )
      {
      for ( i=0 ; NombreCampo[i] ; i++ )
        {
        if ( Bdt_CampoNombre (Base,NombreCampo[i],Contenido) )
          { ExisteCampo = SI; }
        else
          { ExisteCampo = NO; }
        Pan_Color (NEGRO,BLANCO);
        Pan_PonTexto (6+i,0,"Campo ");
        Pan_Texto (NombreCampo[i]);
        Pan_Texto (" -> ");
        Pan_Color (ROJO,BLANCO);
        if ( ExisteCampo ) { Pan_Texto (Contenido); }
        else               { Pan_Texto ("No existe"); }
        }
      }
    else
      { Pan_PonTexto (6,4,"No existe"); }
    }

  Cad_Destruye (Contenido);

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }

/*--------------------------------------------------------------------
 * Funcin P_Bdt_PonCampoNombre()
 *------------------------------------------------------------------*/
void P_Bdt_PonCampoNombre()
  {
  entero Numero;

  Pan_Color (NEGRO,BLANCO);
  Pan_Limpia();
  Pan_PonTexto (0,0,"Prueba de Bdt_PonCampoNombre()");

  Bdt_LimpiaRegistro(Base);
  Bdt_PonCampoNombre (Base,"NOMBRE","Leopoldo");
  Bdt_PonCampoNombre (Base,"EDAD",  " 63");
  Bdt_PonCampoNombre (Base,"SEXO",  "T");

  if ( Bdt_AgregaRegistro (Base,&Numero) )
    {
    Pan_PonTexto (6,4,"Aadido registro ");
    Pan_Entero (Numero,4);
    }
  else
    { Pan_PonTexto (6,4,"No se puede"); }

  Pan_PonTexto (21,0,"Pulsa ENTER para seguir: ");
  getchar();
  }