#include #include #include #include #include #include #include "c:\program\src_dos\libs\make_bot\make_bot.h" #include "c:\program\src_dos\libs\bdatos\bdatos.hh" #include "alum_def.h" #define NLINEAS_Alum 9 BDatos BAlum; AntiguosAlumnos SAlum; // Estructura de Nombrees /*************************************\ | | | Parte Principal del M¢dulo | | | \*************************************/ void DuplicaBaseNombrees(void); void MuestraDatosVAlum( int linea); void MuestraDatosAlum( long RowStart ); void MuestraAyudaAlum( char columna ); //int CompruebaPulsosEstrellas( void ); void EditItemAlum( char columna, int linea ); void AlumNuevoRegistro( AntiguosAlumnos *MSAlum ); void MuestraAlum( char columna, int linea, char como ); void ObtenCoordenadasAlum( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ); /*************************************\ | | | Parte Secundaria del M¢dulo | | | | Secci¢n de Busqueda de Nombrees | | | \*************************************/ void ObtenCoordenadasMatchAlum( char Row, int *X0, int *Y0, int *X1, int *Y1 ); void MatchDrawAlum( char Row, AntiguosAlumnos MAlum, char como ); void BuscaAlum( char TipoBusqueda, char *CurrRow, long *CurrAlum ); int Match_Alum( AntiguosAlumnos *A, AntiguosAlumnos *B ); void EditMatchAlum( char Row, AntiguosAlumnos * MAlum ); int ObtenMatchAlum( AntiguosAlumnos *MAlum ); /*************************************\ | | | Parte Tercera del M¢dulo | | | | Secci¢n para la impresi¢n | | | \*************************************/ void ImprimeFichaAAlum(void); void ImprimeNombrees( char como ); void ImprimeCabeceraAlum( char como, FILE *file_out ); // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte principal del m¢dulo Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* InfoAlumnos *| |* *| |* Descripci¢n: *| |* Controla la introduccion de datos y muestreo asi como todo *| |* el interfaz de usuario... *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void GstAlumnos(void) { char buffer[100], ok = 0, i; int BPush, key; char oldCol = -1; char CurrRow; // Linea sobre la que estamos char CurrCol; // Columna sobre la que estamos long CurrAlum; // Producto sobre el que estamos posicionados a golpes // Rellenamos la pantalla con un fondo atractivo... setfillstyle( Config.FillBgS, Config.FillBgC ); bar( 0, 0, 640, 480 ); Imprime_Estaticos( 30, "systm\\alum.img"); // Imprime botones estaticos 'Seccion 30' sprintf( buffer, "datos\\alum.dbf" ); if ( BAlum.AbrirReg( buffer, sizeof( AntiguosAlumnos ) ) == ERROR ) Error(0x01, BAlum.cError); // Si no hay registros, creamos uno almenos. if ( BAlum.Registros() == 0 ) { AlumNuevoRegistro( &SAlum ); if ( BAlum.InsReg( (void *)&SAlum, BAlum.Registros(), ARRIBA ) == ERROR ) Error(0x01, BAlum.cError); } CurrAlum = 0; CurrRow = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrRow + CurrAlum ); if ( BAlum.LeeReg( (void *)&SAlum, 0 ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); CurrCol = 0; do { if ( CurrCol != oldCol ) { oldCol = CurrCol; MuestraAyudaAlum( CurrCol ); } // Si estamos en la parte de arriba, dejamos ver sobre que linea nos encontramos for ( i = 0; i < 4; i++ ) MuestraAlum( i, CurrRow, (CurrCol >= 4) ? INTENSO : NORMAL ); MuestraAlum( CurrCol, CurrRow, INTENSO ); BPush = Comprueba_Secuencia( 1, NULL ); MuestraAlum( CurrCol, CurrRow, NORMAL ); switch ( BPush ) { case 0: // No se pulso ningun BOTON while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER /* if ( ( BPush = CompruebaPulsosEstrellas() ) != 0 ) { MuestraAlum( BPush, CurrRow, INTENSO ); if ( BAlum.EscribeReg( (void *)&SAlum, (CurrRow + CurrAlum) ) == ERROR ) Error(0x01, BAlum.cError); } */ break; case -2: // Hay una tecla normal en BUFFER if ( ( key = getch() ) != 27 ) { if ( key != 13 ) ungetch( key ); EditItemAlum( CurrCol, CurrRow ); if ( BAlum.EscribeReg( (void *)&SAlum, (CurrRow + CurrAlum) ) == ERROR ) Error(0x01, BAlum.cError); MuestraAlum( CurrCol, CurrRow, NORMAL ); CurrCol++; if ( CurrCol > 17 ) CurrCol = 17; } break; case -1: // Hay una tecla especial en BUFFER switch( getch() ) { // Flecha Izquierda case 75: case 15: CurrCol--; if ( CurrCol < 0 ) CurrCol = 17; break; // Flecha Derecha case 77: case 9: CurrCol++; if ( CurrCol > 17 ) CurrCol = 0; break; // Flecha Arriba case 72: if ( CurrCol < 4 ) { if ( (CurrRow + CurrAlum) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_Alum - 1; CurrAlum -= NLINEAS_Alum; if ( CurrAlum < 0 ) CurrAlum = 0; while( ( CurrRow + CurrAlum ) >= BAlum.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrAlum ) >= BAlum.Registros() && CurrAlum > 0 ) CurrAlum++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrAlum ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } } if ( BAlum.LeeReg( (void *)&SAlum, (CurrAlum + CurrRow) ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); } else { CurrCol--; if ( CurrCol < 0 ) CurrCol = 17; } break; // Flecha Abajo case 80: if ( CurrCol < 4 ) { if ( ( CurrRow + CurrAlum ) < BAlum.Registros() - 1 ) { if ( ( CurrRow ) >= NLINEAS_Alum - 1 ) { CurrRow = 0; CurrAlum += NLINEAS_Alum; while ( (CurrAlum + CurrRow) >= BAlum.Registros() ) CurrAlum--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrAlum ); } else CurrRow++; } if ( BAlum.LeeReg( (void *)&SAlum, (CurrAlum + CurrRow) ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); } else { CurrCol++; if ( CurrCol > 17 ) CurrCol = 0; } break; // Inicio case 71: CurrRow = 0; if ( CurrAlum != 0 ) { CurrAlum = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrAlum ); } if ( BAlum.LeeReg( (void *)&SAlum, (CurrAlum + CurrRow) ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); break; // Fin case 79: CurrRow = 0; if ( CurrAlum != BAlum.Registros() - NLINEAS_Alum ) { CurrAlum = BAlum.Registros() - NLINEAS_Alum; if ( CurrAlum < 0 ) { CurrAlum = 0; CurrRow = BAlum.Registros()-1; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrAlum ); } if ( BAlum.LeeReg( (void *)&SAlum, (CurrAlum + CurrRow) ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); break; } break; // Imprimir Alumerencias case 1: ImprimeFichaAAlum(); break; // Menu Principal case 2: ok = 1; break; // Eliminar case 3: if ( Optar( 1, "ATENCION", "Esta seguro que desea", "eliminar al Alumno actual.", NULL ) ) { if ( BAlum.DelReg( CurrAlum + CurrRow ) == ERROR ) Error(0x01, BAlum.cError); if ( BAlum.Registros() == 0 ) { AlumNuevoRegistro( &SAlum ); if ( BAlum.InsReg( (void *)&SAlum, BAlum.Registros(), ARRIBA ) == ERROR ) Error(0x01, BAlum.cError); CurrRow = 0; } else // Si he borrado el £ltimo registro subo una linea if ( (CurrAlum+CurrRow) >= ( BAlum.Registros() - 2 ) ) { if ( (CurrRow + CurrAlum) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_Alum - 1; CurrAlum -= NLINEAS_Alum; if ( CurrAlum < 0 ) CurrAlum = 0; while( ( CurrRow + CurrAlum ) >= BAlum.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrAlum ) >= BAlum.Registros() && CurrAlum > 0 ) CurrAlum++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrAlum ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } } if ( BAlum.LeeReg( (void *)&SAlum, (CurrAlum + CurrRow) ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrAlum ); if ( BAlum.LeeReg( (void *)&SAlum, (CurrAlum + CurrRow) ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); } break; // Insertar case 4: AlumNuevoRegistro( &SAlum ); if ( BAlum.InsReg( (void *)&SAlum, (CurrAlum + CurrRow), ARRIBA ) == ERROR ) Error(0x01, BAlum.cError); CurrCol = 5; if ( ( CurrRow + CurrAlum ) < BAlum.Registros() - 1 ) { if ( ( CurrRow ) >= NLINEAS_Alum - 1 ) { CurrRow = 0; CurrAlum += NLINEAS_Alum; while ( (CurrAlum + CurrRow) >= BAlum.Registros() ) CurrAlum--; } else CurrRow++; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrAlum ); if ( BAlum.LeeReg( (void *)&SAlum, (CurrAlum + CurrRow) ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); break; // Retroceso R pido case 5: CurrRow = NLINEAS_Alum - 1; CurrAlum -= NLINEAS_Alum; if ( CurrAlum < 0 ) CurrAlum = 0; while( ( CurrRow + CurrAlum ) >= BAlum.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrAlum ) >= BAlum.Registros() && CurrAlum > 0 ) CurrAlum++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrAlum ); if ( BAlum.LeeReg( (void *)&SAlum, (CurrAlum + CurrRow) ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); break; // Busqueda Atras case 6: BuscaAlum( ATRAS, &CurrRow, &CurrAlum ); break; // Buscar case 7: BuscaAlum( NUEVA_BUSQUEDA, &CurrRow, &CurrAlum ); break; // Busqueda Adelante case 8: BuscaAlum( ADELANTE, &CurrRow, &CurrAlum ); break; // AvanceR pido case 9: CurrRow = 0; CurrAlum += NLINEAS_Alum; while ( (CurrAlum + CurrRow) >= BAlum.Registros() ) CurrAlum--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( CurrAlum ); if ( BAlum.LeeReg( (void *)&SAlum, (CurrAlum + CurrRow) ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( CurrRow ); break; default: break; } } while( !ok ); BAlum.CerrarReg(); } /**************************************************************************\ |* *| |* MuestraDatosAlum *| |* *| |* Descripci¢n: *| |* Dado un registro, se muestran sucesivamente este y todos *| |* los que hay por debajo de ‚l, hasta que se agote la base *| |* o no quepan mas en la pantalla. *| |* *| |* Entradas: Registro por el que comenzar *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraDatosAlum( long RowStart ) { int linea, campo; char dev; int X0, Y0, X1, Y1; // Imprimo la NLINEAS_Alum que caben en la pantalla dev = OK; for ( linea=0; linea < NLINEAS_Alum && (RowStart + linea) < BAlum.Registros()/*dev == OK*/; linea++ ) { dev = BAlum.LeeReg( (void *)&SAlum, RowStart + linea ); if ( dev == OK ) // Por cada linea hay 4 campos, ehhh!!! for ( campo=0; campo < 4; campo++ ) MuestraAlum( campo, linea, NORMAL ); } // Ahora limpio los restantes huecos si los hay if ( linea < NLINEAS_Alum ) //dev != OK ) { //linea--; setfillstyle( SOLID_FILL, Config.TxtBgN ); for ( ; linea < NLINEAS_Alum; linea++ ) for ( campo=0; campo < 4; campo++ ) { ObtenCoordenadasAlum( campo, linea, &X0, &Y0, &X1, &Y1 ); bar( X0, Y0, X1, Y1 ); } } } void MuestraDatosVAlum( int linea ) { int campo; // Mostramos los campos que faltan, ( 1¦ Linea ) // mas 5 que pertenecen a las estrellas for ( campo=4; campo < 18; campo++ ) MuestraAlum( campo, linea, NORMAL ); } /**************************************************************************\ |* *| |* MuestraAlum *| |* *| |* Descripci¢n: *| |* Reescribe el campo dado, seg£n la fila, y la intensidad *| |* *| |* Entradas: *| |* columna campo ha mostar *| |* linea linea en la que nos encontramos *| |* como intensidad del texto (NORMAL/INTENSO) *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraAlum( char columna, int linea, char como ) { char buffer[80], draw; char buffer1[80], i; int X0, Y0, X1, Y1; ObtenCoordenadasAlum( columna, linea, &X0, &Y0, &X1, &Y1 ); draw = 1; switch( columna ) { // Nombre del Alumno case 0: draw = 0; settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, "%15s", SAlum.Nombre ); setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); outtextxy( X0+2, Y0, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // Apellidos case 1: draw = 0; settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, "%30s", SAlum.Apellidos ); setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); outtextxy( X0+2, Y0, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // Direccion case 2: draw = 0; settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, "%30s", SAlum.Direccion ); setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); outtextxy( X0+2, Y0, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // Telefono1 case 3: sprintf ( buffer, "%15s", SAlum.Telefono1 ); break; // Codigo case 4: sprintf ( buffer, " %08ld", BAlum.RegActual() ); break; // Nombre del Alumno case 5: sprintf ( buffer, "%29s", SAlum.Nombre ); break; // Apellidos case 6: sprintf ( buffer, "%29s", SAlum.Apellidos ); break; // Direcci¢n case 7: sprintf ( buffer, "%29s", SAlum.Direccion ); break; // Localidad case 8: sprintf ( buffer, "%15s", SAlum.Localidad ); break; // Provincia case 9: sprintf ( buffer, "%15s", SAlum.Provincia ); break; // Codigo Postal case 10: sprintf ( buffer, "%09lu", SAlum.CodPostal ); break; // Telefono1 case 11: sprintf ( buffer, "%15s", SAlum.Telefono1 ); break; // Fax case 12: sprintf ( buffer, "%15s", SAlum.Fax ); break; // CuentaBancaria 1 / 4 case 13: draw = 0; settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, " %04d", SAlum.CC.Oficina ); setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); outtextxy( X0+2, Y0, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // CuentaBancaria 2 / 4 case 14: draw = 0; settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, " %04d", SAlum.CC.Sucursal ); setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); outtextxy( X0+2, Y0, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // CuentaBancaria 3 / 4 case 15: draw = 0; settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, " %02d", (int)SAlum.CC.DigControl ); setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); outtextxy( X0+2, Y0, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // CuentaBancaria 4 / 4 case 16: draw = 0; settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, " %010.0f", SAlum.CC.NumCuenta ); setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); outtextxy( X0+2, Y0, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // Comentario case 17: draw = 0; setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); for ( i = 0; i < 4; i++ ) outtextxy( X0, Y0 + 14*i, SAlum.Notas[i] ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; /* // Estrellas case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: if ( ( SAlum.Estrellas & ( 0x01 << (columna - 15) ) ) >> (columna - 15 ) ) ponicono( X0+5, Y0+5, led_on, 1 ); else ponicono( X0+5, Y0+5, led_off, 1 ); // En las estrellas no hay que imprimir nada draw = 0; break; */ } if ( draw ) { setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); outtextxy( X0+2, Y0, buffer ); } } /**************************************************************************\ |* *| |* MuestraAyudaAlum *| |* *| |* Descripci¢n: *| |* Muestra una peque¤a descripcion del contenido para el campo *| |* *| |* Entradas: *| |* columna campo ha mostar su ayuda *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraAyudaAlum( char columna ) { char buffer1[80]; switch( columna ) { // Nombre del Alumno case 0: sprintf ( buffer1, "Nombre del Antiguo alumno" ); break; // Apellidos case 1: sprintf ( buffer1, "1er y 2do Apellido del antiguo alumno" ); break; // Telefono 1 case 2: sprintf ( buffer1, "N£mero de tel‚fono del antiguo Alumno" ); break; // Fax case 3: sprintf ( buffer1, "Fax o segundo tel‚fono del antiguo Alumno" ); break; // Codigo case 4: sprintf ( buffer1, "Codigo secuencial. ( DATO PARA EL BANCO )" ); break; // Nombre del Alumno case 5: sprintf ( buffer1, "Nombre del Antiguo alumno" ); break; // Apellidos case 6: sprintf ( buffer1, "1er y 2do Apellido del antiguo alumno" ); break; // Direccion case 7: sprintf ( buffer1, "Direcci¢n, calle, n§..." ); break; // Localidad case 8: sprintf ( buffer1, "Localidad" ); break; // Provincia case 9: sprintf ( buffer1, "Provincia" ); break; // C¢digo postal case 10: sprintf ( buffer1, "C¢digo Postal" ); break; // Telefono 1 case 11: sprintf ( buffer1, "N£mero de tel‚fono del antiguo Alumno" ); break; // Fax case 12: sprintf ( buffer1, "Fax o segundo tel‚fono del antiguo Alumno" ); break; // Codigo Cuenta Cliente // Oficina case 13: sprintf ( buffer1, "Oficina 4 dig." ); break; // Sucursal case 14: sprintf ( buffer1, "Sucursal 4 dig." ); break; // Digito Control. case 15: sprintf ( buffer1, "D¡gito control 2 dig." ); break; // N§ Cuenta case 16: sprintf ( buffer1, "N£mero de cuenta 10 dig." ); break; case 17: sprintf ( buffer1, "Breves notas sobre el antiguo alumno" ); break; } // Ayuda reducida setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 ); // Imprime la ayudita setcolor( EGA_WHITE ); outtextxy( 7, 457, buffer1 ); } /**************************************************************************\ |* *| |* EditItemAlum *| |* *| |* Descripci¢n: *| |* Se encarga de editar y validar el campo. *| |* *| |* Entradas: *| |* columna campo ha editar *| |* linea linea en la que nos encontramos *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void EditItemAlum( char columna, int linea ) { char buffer[80]; int X0, Y0, X1, Y1; ObtenCoordenadasAlum( columna, linea, &X0, &Y0, &X1, &Y1 ); switch( columna ) { // Codigo Real case 4: /* sprintf ( buffer, "%lu", SAlum.CodigoR ); if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SAlum.CodigoR = atol( buffer ); MuestraAlum( 0, linea, NORMAL ); MuestraAlum( 4, linea, NORMAL ); */ break; // Nombre del Alumno case 5: strcpy ( buffer, SAlum.Nombre ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SAlum.Nombre, buffer ); MuestraAlum( 0, linea, NORMAL ); // MuestraAlum( 5, linea, NORMAL ); break; // 1er y 2do Apellidos case 6: strcpy ( buffer, SAlum.Apellidos ); if ( !( InputCadenaG( buffer, 0, 28, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SAlum.Apellidos, buffer ); MuestraAlum( 1, linea, NORMAL ); // MuestraAlum( 6, linea, NORMAL ); break; // Direccion case 7: sprintf ( buffer, "%s", SAlum.Direccion ); if ( !( InputCadenaG( buffer, 0, 28, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SAlum.Direccion, buffer ); MuestraAlum( 2, linea, NORMAL ); break; // Poblaci¢n case 8: sprintf ( buffer, "%s", SAlum.Localidad ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SAlum.Localidad, buffer ); break; // Provincia case 9: sprintf ( buffer, "%s", SAlum.Provincia ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SAlum.Provincia, buffer ); break; // C¢digo Postal case 10: sprintf ( buffer, "%lu", SAlum.CodPostal ); if ( !( InputCadenaG( buffer, 0, 5, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SAlum.CodPostal = atol ( buffer ); break; // Telefono case 11: sprintf ( buffer, "%s", SAlum.Telefono1 ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SAlum.Telefono1, buffer ); MuestraAlum( 3, linea, NORMAL ); break; // Fax case 12: sprintf ( buffer, "%s", SAlum.Fax ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SAlum.Fax, buffer ); // MuestraAlum( 3, linea, NORMAL ); break; // Codgio Cuenta // Oficina case 13: settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, "%d", SAlum.CC.Oficina ); if ( !( InputCadenaG( buffer, 0, 4, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SAlum.CC.Oficina = atoi ( buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // Sucursal case 14: settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, "%d", SAlum.CC.Sucursal ); if ( !( InputCadenaG( buffer, 0, 4, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SAlum.CC.Sucursal = atoi ( buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // Dig.Control case 15: settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, "%d", (int)SAlum.CC.DigControl ); if ( !( InputCadenaG( buffer, 0, 2, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SAlum.CC.DigControl = (char)atoi ( buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // C¢digo Cuenta Cliente case 16: settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, "%Ld", SAlum.CC.NumCuenta ); if ( !( InputCadenaG( buffer, 0, 10, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SAlum.CC.NumCuenta = atof ( buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // Comentario case 17: settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); EditComentario( (char *)(&SAlum.Notas[0][0]), 3, 37, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1, 14 ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; } } /**************************************************************************\ |* *| |* ObtenCoordenadasAlum *| |* *| |* Descripci¢n: *| |* Obtiene las coordenadas de acotacion para el campo pedido *| |* *| |* Entradas: *| |* columna campo del que obtener las coordenadas *| |* linea linea en la que nos encontramos *| |* X0 Y0 X1 Y1 Punteros para devolver las coordenadas *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ObtenCoordenadasAlum( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ) { // Calculamos la Y0, Y1 para la linea dada ( SOLO columna < 6 ) *Y0 = 264 + 19*linea; *Y1 = *Y0 + 17; switch( columna ) { case 0: *X0 = 7; *X1 = 108; break; case 1: *X0 = 107; *X1 = 298; break; case 2: *X0 = 307; *X1 = 495; break; case 3: *X0 = 505; *X1 = 633; break; case 4: *X0 = 67; *Y0 = 7; *X1 = 148; *Y1 = 28; break; case 5: *X0 = 152; *Y0 = 42; *X1 = 390; *Y1 = 63; break; case 6: *X0 = 152; *Y0 = 67; *X1 = 390; *Y1 = 88; break; case 7: *X0 = 152; *Y0 = 112; *X1 = 390; *Y1 = 133; /* *X0 = 92; *Y0 = 112; *X1 = 388; *Y1 = 133; */ break; case 8: *X0 = 92; *Y0 = 137; *X1 = 223; *Y1 = 158; break; case 9: *X0 = 312; *Y0 = 137; *X1 = 438; *Y1 = 158; break; case 10: *X0 = 522; *Y0 = 137; *X1 = 598; *Y1 = 158; break; case 11: *X0 = 92; *Y0 = 162; *X1 = 245; *Y1 = 183; break; case 12: *X0 = 255; *Y0 = 162; *X1 = 388; *Y1 = 183; break; case 13: *X0 = 10; *Y0 = 209; *X1 = 60; *Y1 = 220; break; case 14: *X0 = 65; *Y0 = 209; *X1 =115; *Y1 = 220; break; case 15: *X0 =120; *Y0 = 209; *X1 =145; *Y1 = 220; break; case 16: *X0 =150; *Y0 = 209; *X1 =250; *Y1 = 220; break; case 17: *X0 = 402; *Y0 = 165; *X1 = 633; *Y1 = 221; break; } *X0 += 2; *X1 -= 2; } /**************************************************************************\ |* *| |* AlumNuevoRegistro *| |* *| |* Descripci¢n: *| |* Limpia el buffer, para un nuevo registro. *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void AlumNuevoRegistro( AntiguosAlumnos *NSAlum ) { int i, j; NSAlum -> CodigoR = 0; // Codigos asignados a los Alumnos strcpy( NSAlum -> Nombre , "" ); // Nombre del Nombre // Nombre del Nombre strcpy( NSAlum -> Apellidos, "" ); strcpy( NSAlum -> Telefono1, "" ); // Tel‚fono y fax del Nombre strcpy( NSAlum -> Fax, "" ); // strcpy( NSAlum -> Direccion, "" ); // Direccion strcpy( NSAlum -> Localidad, "" ); // Localidad strcpy( NSAlum -> Provincia, "" ); // Alumincia NSAlum -> CodPostal = 0; // C¢digo Postal NSAlum -> CC.Oficina = 0; // Oficina NSAlum -> CC.Sucursal = 0; // Sucursal NSAlum -> CC.DigControl = 0; // DC NSAlum -> CC.NumCuenta = 0; // NumCuenta // NSAlum -> Estrellas = 0; // Estrellas ( lo que imagina el cliente ) for ( i = 0; i < 1024; i++ ) NSAlum -> FuturaAmpliacion[i] = '\0'; for ( i = 0; i < 4; i++ ) for ( j = 0; j < 37; j++ ) SAlum.Notas[i][j] = '\0'; } /* int CompruebaPulsosEstrellas(void) { char enc, i; enc = 0; for ( i=0; i < 8; i++ ) { if ( y_raton > 190 && y_raton < 215 && x_raton > ( 90 + 30 * i ) && x_raton < ( 90 + 30 * i + 25 ) ) { if ( SAlum.Estrellas & ( 0x01 << i ) ) SAlum.Estrellas -= ( 0x01 << i ); else SAlum.Estrellas += ( 0x01 << i ); enc = 15 + i; break; } } Anclar_Raton(); return enc; } */ // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte secundaria del m¢dulo Û // Û Û // Û Secci¢n de Busqueda de refecencias Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* BuscaAlum *| |* *| |* Descripci¢n: *| |* Busca una referencia por su n§ o descripcion *| |* *| |* Entradas: *| |* ATRAS Busca otra coincidencia hacia atras *| |* NUEVA_BUSQUEDA Inicia una nueva busqueda *| |* ADELANTE Busca otra coincidencia hacia delante *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void BuscaAlum( char TipoBusqueda, char *CurrRow, long *CurrAlum ) { static AntiguosAlumnos MAlum; char enc; long i; switch ( TipoBusqueda ) { case NUEVA_BUSQUEDA: if ( ObtenMatchAlum( &MAlum ) != OK ) return; i = 0; break; case ATRAS: case ADELANTE: i = ( *CurrRow + *CurrAlum ) + TipoBusqueda; break; } Optar( ENCUADRE, "Comando: Buscar", "Ahora se inica", "la busqueda elegida", NULL ); enc = 0; while ( i < BAlum.Registros() && !enc ) { if ( BAlum.LeeReg( (void *)&SAlum, i ) == ERROR ) Error( 0x01, BAlum.cError); if ( Match_Alum( &SAlum, &MAlum ) ) enc = 1; else i++; } Optar( ENCUADRE, NULL ); if ( enc ) { *CurrRow = 0; *CurrAlum = i; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosAlum( *CurrRow + *CurrAlum ); if ( BAlum.LeeReg( (void *)&SAlum, *CurrAlum ) == ERROR ) Error(0x01, BAlum.cError); MuestraDatosVAlum( *CurrRow ); } else switch( TipoBusqueda ) { case NUEVA_BUSQUEDA: Optar( 0, "Comando: Buscar", "No se encontr¢", "ninguna coincidencia", NULL ); break; case ATRAS: case ADELANTE: Optar( 0, "Comando: Buscar", "No se encontr¢", "ninguna coincidencia", NULL ); break; } if ( BAlum.LeeReg( (void *)&SAlum, (*CurrRow + *CurrAlum) ) == ERROR ) Error( 0x01, BAlum.cError); } /**************************************************************************\ |* *| |* Match_Alum *| |* *| |* Descripci¢n: *| |* Compara dos registros y devuelve la posible coincidencia *| |* *| |* Entradas: *| |* Registros a comparar *| |* *| |* Salidas: *| |* Resultado de la comparaci¢n *| |* *| \**************************************************************************/ int Match_Alum( AntiguosAlumnos *A, AntiguosAlumnos *B ) { if ( B -> Nombre[0] != '\0' ) return ( strncmpi( A -> Nombre, B -> Nombre, strlen( B -> Nombre ) ) == 0 ); if ( B -> Apellidos[0] != '\0' ) return ( strncmpi( A -> Apellidos, B -> Apellidos, strlen( B -> Apellidos ) ) == 0 ); if ( B -> Direccion[0] != '\0' ) return ( strncmpi( A -> Direccion, B -> Direccion, strlen( B -> Direccion ) ) == 0 ); if ( B -> Telefono1[0] != '\0' ) return ( strncmpi( A -> Telefono1, B -> Telefono1, strlen( B -> Telefono1 ) ) == 0 ); return 0; } /**************************************************************************\ |* *| |* ObtenMatchAlum *| |* *| |* Descripci¢n: *| |* Obtine los patrones de busqueda necesarios *| |* *| |* Entradas: *| |* Estructura donde guardar el patron de busqueda *| |* *| |* Salidas: *| |* OK La entrada es correcta *| |* ERROR El usuario interrumpio la busqueda *| |* *| \**************************************************************************/ int ObtenMatchAlum( AntiguosAlumnos *MAlum ) { char Row, ok, i; int BPush, key, DEV; struct textsettingstype texttypeinfo; gettextsettings( &texttypeinfo ); Optar( ENCUADRE, "Comando: Buscar", NULL ); Imprime_Estaticos( 31, "systm\\alum.img" ); ok = 0; Row = 0; AlumNuevoRegistro( MAlum ); do { MatchDrawAlum(Row, *MAlum, INTENSO); BPush = Comprueba_Secuencia( SEC_OPTAR, NULL ); MatchDrawAlum(Row, *MAlum, NORMAL); switch ( BPush ) { case 0: // No se pulso ningun BOTON while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER case -2: if ( ( key = getch() ) != 13 && key != 27 ) ungetch( key ); EditMatchAlum( Row, MAlum ); for ( i=0; i < 4; i++ ) MatchDrawAlum(i, *MAlum, NORMAL); break; case -1: switch ( getch() ) { // Flecha Izquierda case 75: case 15: // Flecha Arriba case 72: Row--; if ( Row < 0 ) Row = 3; break; // Flecha Derecha case 77: case 9: // Flecha Abajo case 80: Row++; if ( Row > 3 ) Row = 0; break; } break; case 1: DEV = OK; ok = 1; break; case 2: DEV = ERROR; ok = 1; break; } } while ( !ok ); Optar( ENCUADRE, NULL ); settextstyle( texttypeinfo.font, texttypeinfo.direction, texttypeinfo.charsize ); return DEV; } /**************************************************************************\ |* *| |* EditMatchAlum *| |* *| |* Descripci¢n: *| |* Edita el patron de busqueda *| |* *| |* Entradas: *| |* Campo a editar, y lugar donde almacenarlo *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void EditMatchAlum( char Row, AntiguosAlumnos * MAlum ) { int X0, Y0, X1, Y1; char buffer[80]; ObtenCoordenadasMatchAlum( Row, &X0, &Y0, &X1, &Y1 ); switch( Row ) { case 0: sprintf( buffer, "%s", MAlum -> Nombre ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { AlumNuevoRegistro( MAlum ); strcpy( MAlum -> Nombre, buffer ); } break; case 1: sprintf( buffer, "%s", MAlum -> Apellidos ); if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { AlumNuevoRegistro( MAlum ); strcpy ( MAlum -> Apellidos, buffer ); } break; case 2: sprintf( buffer, "%s", MAlum -> Direccion ); if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { AlumNuevoRegistro( MAlum ); strcpy ( MAlum -> Direccion, buffer ); } break; case 3: sprintf( buffer, "%s", MAlum -> Telefono1 ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { AlumNuevoRegistro( MAlum ); strcpy ( MAlum -> Telefono1, buffer ); } break; } } /**************************************************************************\ |* *| |* MatchDrawAlum *| |* *| |* Descripci¢n: *| |* Escribe los distintos campos seg£n se le indique *| |* *| |* Entradas: *| |* Campo a mostrar, lugar donde se encuentra, y como mostrarlo *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MatchDrawAlum( char Row, AntiguosAlumnos MAlum, char como ) { int X0, Y0, X1, Y1; char buffer[80]; ObtenCoordenadasMatchAlum( Row, &X0, &Y0, &X1, &Y1 ); switch( Row ) { case 0: sprintf( buffer, "%15s", MAlum.Nombre ); break; case 1: strncpy( buffer, MAlum.Apellidos, 25 ); buffer[26] = '\0'; break; case 2: strncpy( buffer, MAlum.Direccion, 25 ); buffer[26] = '\0'; break; case 3: strncpy( buffer, MAlum.Telefono1, 15 ); buffer[15] = '\0'; break; } setfillstyle( SOLID_FILL, ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI ); bar( X0, Y0, X1, Y1 ); setcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI ); outtextxy( X0+2, Y0, buffer ); } /**************************************************************************\ |* *| |* MatchDrawAlum *| |* *| |* Descripci¢n: *| |* Obtiene las coordenadas relativas al campo dado. *| |* *| |* Entradas: *| |* Campo a obtener las coordenadas, y coordenadas de salida *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ObtenCoordenadasMatchAlum( char Row, int *X0, int *Y0, int *X1, int *Y1 ) { switch( Row ) { case 0: *X0 = 265; *X1 = 465; *Y0 = 200; *Y1 = 220; break; case 1: *X0 = 265; *X1 = 465; *Y0 = 225; *Y1 = 245; break; case 2: *X0 = 265; *X1 = 465; *Y0 = 250; *Y1 = 275; break; case 3: *X0 = 265; *X1 = 465; *Y0 = 280; *Y1 = 305; break; case 4: *X0 = 385; *X1 = 465; *Y0 = 250; *Y1 = 275; break; case 5: *X0 = 330; *X1 = 365; *Y0 = 275; *Y1 = 300; break; } (*X0) ++; (*Y0) ++; (*X1) --; (*Y1) --; } // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte secundaria del m¢dulo Û // Û Û // Û Secci¢n de Busqueda de refecencias Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* ImprimeNombrees *| |* *| |* Descripci¢n: *| |* Imprime todas las referencias seg£n se le indique *| |* *| |* Entradas: *| |* Como imprimir las referencias *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ImprimeNombrees( char como ) { long i, old_reg; char buffer[80]; char Pag=0; FILE *file_out; old_reg = BAlum.RegActual(); if ( !Config.Impresora.Printer ) { if ( ( file_out = fopen( Config.Impresora.PrintTo, "w" ) ) == NULL ) return; } else { file_out = stdprn; while ( !Comprueba_Impresora() ) { if ( !Optar( 1, "ERROR IMPRESORA", "Encienda la impresora", "y pulse ACEPTAR para continuar", NULL ) ) return; } } ImprimeCabeceraAlum(como, file_out); for ( i=0; i Config.Impresora.Lineas ) { Pag = 1; fputc( 12, file_out ); } BAlum.LeeReg( (void *)&SAlum, i ); switch( como ) { // Listado General case 1: sprintf( buffer, "%s %s", SAlum.Nombre, SAlum.Apellidos ); buffer[31] = '\0'; fprintf( file_out, "%-30s %-28s %-15s\n\r", buffer, SAlum.Direccion, SAlum.Telefono1 ); break; // Listado Etiquetas case 2: sprintf( buffer, "%s, %s", SAlum.Nombre, SAlum.Apellidos ); buffer[31] = '\0'; fprintf( file_out, "%30s\n", buffer ); fprintf( file_out, "%30s\n", SAlum.Direccion ); fprintf( file_out, "%15s (%15s)\n", SAlum.Localidad, SAlum.Provincia ); fprintf( file_out, "C¢d. Postal: %lu\n", SAlum.CodPostal ); fprintf( file_out, "\n" ); break; // Facturas Bancarias ( IMPRESO ) case 3: fprintf( file_out, " %04d %04d %02d %010.0f", SAlum.CC.Sucursal, SAlum.CC.Oficina, SAlum.CC.DigControl, SAlum.CC.NumCuenta ); fprintf( file_out, " %-15s, %s\n", SAlum.Nombre, SAlum.Apellidos ); break; } } if ( !Config.Impresora.Printer ) fclose( file_out ); BAlum.LeeReg( (void *)&SAlum, old_reg ); } void ImprimeCabeceraAlum( char como, FILE *file_out ) { switch( como ) { // Listado R pido case 1: fprintf( file_out, "Nombre y Apellidos Direcci¢n Tel‚fono\n\r" ); fprintf( file_out, "------------------------------------------------------------------------\n\r" ); // 123456789-123456789-123456789 123456789-123456789-123456789- 123456789-12345 // 123456789-123456789-123456789-123456789-123456789-123456789-123456789-123456789- break; // Listado Completo case 2: // C¢digos de banco case 3: fprintf( file_out, "Sucursal Ofic. DC. Num Cuenta Nombre, Apellidos\n\r" ); fprintf( file_out, "------------------------------------------------------------------------\n\r" ); break; } } void ImprimeFichaAAlum(void) { int i; FILE *file_out; if ( !Config.Impresora.Printer ) { if ( ( file_out = fopen( Config.Impresora.PrintTo, "w" ) ) == NULL ) return; } else file_out = stdprn; if ( Config.Impresora.Printer && !Optar( 1, "­ Prepare la impresora !", "Prepare y encienda la", "impresora, y pulse ACEPTAR", "cuando este lista...", NULL ) ) return; fprintf( file_out, "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n" ); fprintf( file_out, "³ Ficha: %05ld ³\n", BAlum.RegActual() ); fprintf( file_out, "³----------------ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\n" ); fprintf( file_out, "³ ³\n" ); fprintf( file_out, "³ Nombre: %-30s, %-15s ³\n", SAlum.Apellidos, SAlum.Nombre ); fprintf( file_out, "³ ³\n" ); fprintf( file_out, "³ Direcci¢n: %-30s ³\n", SAlum.Direccion ); fprintf( file_out, "³ Localidad: %-15s Provincia: %-15s Cod.Post: %05lu ³\n", SAlum.Localidad, SAlum.Provincia, SAlum.CodPostal ); fprintf( file_out, "³ ³\n" ); fprintf( file_out, "³ Telefono: %-15s %-15s ³\n", SAlum.Telefono1, SAlum.Fax ); fprintf( file_out, "³ ³\n" ); fprintf( file_out, "³ CC: Sucursal Oficina D.C. Num Cuenta ³\n" ); fprintf( file_out, "³ %04d %04d %02d %010.0f ³\n", SAlum.CC.Sucursal, SAlum.CC.Oficina, SAlum.CC.DigControl, SAlum.CC.NumCuenta ); fprintf( file_out, "³ ³\n" ); fprintf( file_out, "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\n" ); fprintf( file_out, "\n" ); fprintf( file_out, " Notas:\n" ); for ( i=0; i < 4; i++ ) fprintf( file_out, " %s\n", SAlum.Notas[i] ); if ( !Config.Impresora.Printer ) fclose ( file_out ); }