#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 "tpv_def.h" #define NLINEAS_PROV 9 BDatos BProv; // Base de datos de Proveedores INFO_PROVEEDORES SProv; // Estructura de Proveedores /*************************************\ | | | Parte Principal del M¢dulo | | | \*************************************/ void DuplicaBaseProveedores(void); void MuestraDatosVProv( int linea); void MuestraDatosProv( long RowStart ); void MuestraAyudaProv( char columna ); int CompruebaPulsosEstrellas( void ); void EditItemProv( char columna, int linea ); void ProvNuevoRegistro( INFO_PROVEEDORES *MSProv ); void MuestraProv( char columna, int linea, char como ); void ObtenCoordenadasProv( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ); /*************************************\ | | | Parte Secundaria del M¢dulo | | | | Secci¢n de Busqueda de proveedores | | | \*************************************/ void ObtenCoordenadasMatchProv( char Row, int *X0, int *Y0, int *X1, int *Y1 ); void MatchDrawProv( char Row, INFO_PROVEEDORES MProv, char como ); void BuscaProv( char TipoBusqueda, char *CurrRow, long *CurrProv ); int Match_Prov( INFO_PROVEEDORES *A, INFO_PROVEEDORES *B ); void EditMatchProv( char Row, INFO_PROVEEDORES * MProv ); int ObtenMatchProv( INFO_PROVEEDORES *MProv ); /*************************************\ | | | Parte Tercera del M¢dulo | | | | Secci¢n para la impresi¢n | | | \*************************************/ void MuestraImpresionesProv( void ); void ImprimeProveedores( char como ); void ImprimeCabeceraProv( char como, FILE *file_out ); // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte principal del m¢dulo Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* DuplicaBaseProveedores *| |* *| |* Descripci¢n: *| |* Dado que he elegido un sistema rigido para tratar a los *| |* proveedores, me veo obligado una vez al a¤o a clonar la *| |* base de datos de los proveedores... *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void DuplicaBaseProveedores(void) { long Regs; BDatos BPtmp; char buffer[80]; // Base a clonar sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( (FechaGestionActual.da_year-1) - ((FechaGestionActual.da_year-1)/1000)*1000 ) ); if ( BPtmp.AbrirReg( buffer, sizeof( INFO_PROVEEDORES ) ) == ERROR ) Error(0x01, BPtmp.cError); // Base clonada sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 ) ); if ( BProv.AbrirReg( buffer, sizeof( INFO_PROVEEDORES ) ) == ERROR ) Error(0x01, BProv.cError); for( Regs = 0; Regs < BPtmp.Registros(); Regs++ ) { if ( BPtmp.LeeReg( (void *)&SProv, Regs ) == ERROR ) Error(0x01, BPtmp.cError); if ( BProv.InsReg( (void *)&SProv, BProv.Registros(), ARRIBA ) == ERROR ) Error(0x01, BProv.cError); } BProv.CerrarReg(); BPtmp.CerrarReg(); } /**************************************************************************\ |* *| |* InfoProveedores *| |* *| |* Descripci¢n: *| |* Controla la introduccion de datos y muestreo asi como todo *| |* el interfaz de usuario... *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void InfoProveedores(void) { char buffer[100], ok = 0; int BPush, key; char oldCol = -1; char CurrRow; // Linea sobre la que estamos char CurrCol; // Columna sobre la que estamos long CurrProv; // 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\\Tpv.img"); // Imprime botones estaticos 'Seccion 30' sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 ) ); // Este a¤o no existe la base de datos, pero quizas exista el a¤o anterior if ( access( buffer, 0 ) != 0 ) { sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( (FechaGestionActual.da_year-1) - ((FechaGestionActual.da_year-1)/1000)*1000 ) ); if ( access( buffer, 0 ) == 0 ) { Optar( ENCUADRE, "Generando clon de Proveedores", "Atenci¢n se detecto un nuevo", "a¤o y se esta generando un", "clon de la base anterior.", NULL ); DuplicaBaseProveedores(); Optar( ENCUADRE, "Generando clon de Proveedores", "Atenci¢n se detecto un nuevo", "a¤o y se esta generando un", "clon de la base anterior.", NULL ); } } sprintf( buffer, "datos\\%s\\info_prv.%03d", NEmpresa, ( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 ) ); if ( BProv.AbrirReg( buffer, sizeof( INFO_PROVEEDORES ) ) == ERROR ) Error(0x01, BProv.cError); // Si no hay registros, creamos uno almenos. if ( BProv.Registros() == 0 ) { ProvNuevoRegistro( &SProv ); if ( BProv.InsReg( (void *)&SProv, BProv.Registros(), ARRIBA ) == ERROR ) Error(0x01, BProv.cError); } CurrProv = 0; CurrRow = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrRow + CurrProv ); if ( BProv.LeeReg( (void *)&SProv, 0 ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); CurrCol = 0; do { if ( CurrCol != oldCol ) { oldCol = CurrCol; MuestraAyudaProv( CurrCol ); } MuestraProv( CurrCol, CurrRow, INTENSO ); BPush = Comprueba_Secuencia( 2, NULL ); MuestraProv( CurrCol, CurrRow, NORMAL ); switch ( BPush ) { case 0: // No se pulso ningun BOTON while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER if ( ( BPush = CompruebaPulsosEstrellas() ) != 0 ) { MuestraProv( BPush, CurrRow, INTENSO ); if ( BProv.EscribeReg( (void *)&SProv, (CurrRow + CurrProv) ) == ERROR ) Error(0x01, BProv.cError); } break; case -2: // Hay una tecla normal en BUFFER #ifndef DEMOSTRACION if ( VisualMode == OK ) { while( kbhit() ) getch(); } else { if ( ( key = getch() ) != 27 ) { if ( key != 13 ) ungetch( key ); EditItemProv( CurrCol, CurrRow ); if ( BProv.EscribeReg( (void *)&SProv, (CurrRow + CurrProv) ) == ERROR ) Error(0x01, BProv.cError); MuestraProv( CurrCol, CurrRow, NORMAL ); CurrCol++; if ( CurrCol > 14 ) CurrCol = 14; } } #else while( kbhit() ) getch(); Optar( 0, "VERSION DEMOSTRACION", "En esta versi¢n no se", "permiten m¢dificar los campos,", "de los proveedores...", NULL ); #endif break; case -1: // Hay una tecla especial en BUFFER switch( getch() ) { // Flecha Izquierda case 75: case 15: CurrCol--; if ( CurrCol < 0 ) CurrCol = 14; break; // Flecha Derecha case 77: case 9: CurrCol++; if ( CurrCol > 14 ) CurrCol = 0; break; // Flecha Arriba case 72: if ( CurrCol < 4 ) { if ( (CurrRow + CurrProv) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_PROV - 1; CurrProv -= NLINEAS_PROV; if ( CurrProv < 0 ) CurrProv = 0; while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrProv > 0 ) CurrProv++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrProv ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } } if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); } else { CurrCol--; if ( CurrCol < 0 ) CurrCol = 14; } break; // Flecha Abajo case 80: if ( CurrCol < 4 ) { if ( ( CurrRow + CurrProv ) < BProv.Registros() - 1 ) { if ( ( CurrRow ) >= NLINEAS_PROV - 1 ) { CurrRow = 0; CurrProv += NLINEAS_PROV; while ( (CurrProv + CurrRow) >= BProv.Registros() ) CurrProv--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrProv ); } else CurrRow++; } if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); } else { CurrCol++; if ( CurrCol > 14 ) CurrCol = 0; } break; // Inicio case 71: CurrRow = 0; if ( CurrProv != 0 ) { CurrProv = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrProv ); } if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); break; // Fin case 79: CurrRow = 0; if ( CurrProv != BProv.Registros() - NLINEAS_PROV ) { CurrProv = BProv.Registros() - NLINEAS_PROV; if ( CurrProv < 0 ) { CurrProv = 0; CurrRow = BProv.Registros()-1; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrProv ); } if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); break; } break; // Imprimir Proverencias case 1: MuestraImpresionesProv(); break; // Menu Principal case 2: ok = 1; break; #ifndef DEMOSTRACION // Eliminar case 3: if ( VisualMode == OK ) { while( kbhit() ) getch(); } else { if ( Optar( 1, "ATENCION", "Eliminar el proveedor", "provoc ra la perdida de datos", "para los informaes!!!", NULL ) ) { if ( BProv.DelReg( CurrProv + CurrRow ) == ERROR ) Error(0x01, BProv.cError); if ( BProv.Registros() == 0 ) { ProvNuevoRegistro( &SProv ); if ( BProv.InsReg( (void *)&SProv, BProv.Registros(), ARRIBA ) == ERROR ) Error(0x01, BProv.cError); CurrRow = 0; } else // Si he borrado el £ltimo registro subo una linea if ( (CurrProv+CurrRow) >= ( BProv.Registros() - 2 ) ) { if ( (CurrRow + CurrProv) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_PROV - 1; CurrProv -= NLINEAS_PROV; if ( CurrProv < 0 ) CurrProv = 0; while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrProv > 0 ) CurrProv++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrProv ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } } if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrProv ); if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); } } break; // Insertar case 4: if ( VisualMode == OK ) { while( kbhit() ) getch(); } else { ProvNuevoRegistro( &SProv ); if ( BProv.InsReg( (void *)&SProv, (CurrProv + CurrRow), ARRIBA ) == ERROR ) Error(0x01, BProv.cError); if ( ( CurrRow + CurrProv ) < BProv.Registros() - 1 ) { if ( ( CurrRow ) >= NLINEAS_PROV - 1 ) { CurrRow = 0; CurrProv += NLINEAS_PROV; while ( (CurrProv + CurrRow) >= BProv.Registros() ) CurrProv--; } else CurrRow++; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrProv ); if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); } break; #else // insertar//eliminar case 3: case 4: Optar( 0, "VERSION DEMOSTRACION", "En esta versi¢n no se", "permiten eliminar ni insertar", "nuevos registros...", NULL ); break; #endif // Retroceso R pido case 5: #ifndef DEMOSTRACION CurrRow = NLINEAS_PROV - 1; CurrProv -= NLINEAS_PROV; if ( CurrProv < 0 ) CurrProv = 0; while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrProv ) >= BProv.Registros() && CurrProv > 0 ) CurrProv++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrProv ); if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); #endif break; // Busqueda Atras case 6: BuscaProv( ATRAS, &CurrRow, &CurrProv ); break; // Buscar case 7: BuscaProv( NUEVA_BUSQUEDA, &CurrRow, &CurrProv ); break; // Busqueda Adelante case 8: BuscaProv( ADELANTE, &CurrRow, &CurrProv ); break; // AvanceR pido case 9: #ifndef DEMOSTRACION CurrRow = 0; CurrProv += NLINEAS_PROV; while ( (CurrProv + CurrRow) >= BProv.Registros() ) CurrProv--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( CurrProv ); if ( BProv.LeeReg( (void *)&SProv, (CurrProv + CurrRow) ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( CurrRow ); #endif break; default: break; } } while( !ok ); BProv.CerrarReg(); } /**************************************************************************\ |* *| |* MuestraDatosProv *| |* *| |* 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 MuestraDatosProv( long RowStart ) { int linea, campo; char dev; int X0, Y0, X1, Y1; // Imprimo la NLINEAS_PROV que caben en la pantalla dev = OK; for ( linea=0; linea < NLINEAS_PROV && (RowStart + linea) < BProv.Registros()/*dev == OK*/; linea++ ) { dev = BProv.LeeReg( (void *)&SProv, RowStart + linea ); if ( dev == OK ) // Por cada linea hay 4 campos, ehhh!!! for ( campo=0; campo < 4; campo++ ) MuestraProv( campo, linea, NORMAL ); } // Ahora limpio los restantes huecos si los hay if ( linea < NLINEAS_PROV ) //dev != OK ) { //linea--; setfillstyle( SOLID_FILL, Config.TxtBgN ); for ( ; linea < NLINEAS_PROV; linea++ ) for ( campo=0; campo < 4; campo++ ) { ObtenCoordenadasProv( campo, linea, &X0, &Y0, &X1, &Y1 ); bar( X0, Y0, X1, Y1 ); } } } void MuestraDatosVProv( int linea ) { int campo; // Mostramos los campos que faltan, ( 1¦ Linea ) // mas 5 que pertenecen a las estrellas for ( campo=4; campo < 18+5; campo++ ) MuestraProv( campo, linea, NORMAL ); } /**************************************************************************\ |* *| |* MuestraProv *| |* *| |* 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 MuestraProv( char columna, int linea, char como ) { char buffer[80], draw; char buffer1[80], i; int X0, Y0, X1, Y1; ObtenCoordenadasProv( columna, linea, &X0, &Y0, &X1, &Y1 ); draw = 1; switch( columna ) { // Codigo case 0: sprintf ( buffer, " %09lu", SProv.CodigoR ); break; // Nombre del proveedor case 1: sprintf ( buffer, "%30s", SProv.ActividadProveedor ); break; // N§ de Telefono case 2: sprintf ( buffer, "%15s", SProv.Telefono1 ); break; // Fax case 3: sprintf ( buffer, "%15s", SProv.Fax ); break; // Codigo case 4: sprintf ( buffer, "%09lu", SProv.CodigoR ); break; // NIF / CIF case 5: sprintf ( buffer, "%10s", SProv.Cif ); break; // Nombre Proveedor case 6: sprintf ( buffer, "%29s", SProv.Proveedor ); break; // Actividad Proveedor case 7: sprintf ( buffer, "%29s", SProv.ActividadProveedor ); break; // Direccion case 8: sprintf ( buffer, " %30s", SProv.Direccion ); break; // Localidad case 9: sprintf ( buffer, "%15s", SProv.Poblacion ); break; // Provincia case 10: sprintf ( buffer, "%15s", SProv.Provincia ); break; // Codigo Postal case 11: formatea_long( SProv.CodPost, buffer1 ); sprintf ( buffer, "%7s", buffer1 ); break; // Telefono case 12: sprintf ( buffer, " %15s", SProv.Telefono1 ); break; // Fax case 13: sprintf ( buffer, "%15s", SProv.Fax ); break; // Comentario case 14: 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, SProv.Notas[i] ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // Estellas case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: if ( ( SProv.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 ); } } /**************************************************************************\ |* *| |* MuestraAyudaProv *| |* *| |* Descripci¢n: *| |* Muestra una peque¤a descripcion del contenido para el campo *| |* *| |* Entradas: *| |* columna campo ha mostar su ayuda *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraAyudaProv( char columna ) { char buffer1[80]; switch( columna ) { // Codigo case 0: sprintf ( buffer1, "Introduzca el codigo que desea asignar al proveedor" ); break; // Nombre del proveedor case 1: sprintf ( buffer1, "Actividad del proveedor" ); break; // Telefono case 2: sprintf ( buffer1, "N£mero de tel‚fono del proveedor" ); break; // N§ de Fax case 3: sprintf ( buffer1, "N£mero de Fax (necesario para enviarlos)" ); break; // Codigo case 4: sprintf ( buffer1, "C¢digo de proveedor" ); break; // Nif / Cif case 5: sprintf ( buffer1, "N.I.F. o C.I.F. del proveedor" ); break; // Nombre del proveedor case 6: sprintf ( buffer1, "Nombre del proveedor" ); break; // Actividad del proveedor case 7: sprintf ( buffer1, "Actividad del Proveedor" ); break; // Direccion case 8: sprintf ( buffer1, "Direccion completa del proveedor" ); break; // Poblacion case 9: sprintf ( buffer1, "Localidad del proveedor" ); break; // Provincia case 10: sprintf ( buffer1, "Provincia" ); break; // C¢digo postal case 11: sprintf ( buffer1, "C¢digo Postal" ); break; // Telefono case 12: sprintf ( buffer1, "N£mero de tel‚fono del proveedor" ); break; // Fax case 13: sprintf ( buffer1, "Fax o segundo tel‚fono del proveedor" ); break; case 14: sprintf ( buffer1, "Breves notas sobre el proveedor" ); break; } // Ayuda reducida setfillstyle( SOLID_FILL, EGA_BLACK ); bar( 7, 457, 498, 473 ); // Imprime la ayudita setcolor( EGA_WHITE ); outtextxy( 7, 457, buffer1 ); } #ifndef DEMOSTRACION /**************************************************************************\ |* *| |* EditItemProv *| |* *| |* 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 EditItemProv( char columna, int linea ) { char buffer[80]; int X0, Y0, X1, Y1; ObtenCoordenadasProv( columna, linea, &X0, &Y0, &X1, &Y1 ); switch( columna ) { // Codigo Real case 0: case 4: sprintf ( buffer, "%lu", SProv.CodigoR ); if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SProv.CodigoR = atol( buffer ); MuestraProv( 0, linea, NORMAL ); MuestraProv( 4, linea, NORMAL ); break; // Nombre del proveedor // case 1: case 6: strcpy ( buffer, SProv.Proveedor ); if ( !( InputCadenaG( buffer, 0, 29, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SProv.Proveedor, buffer ); MuestraProv( 1, linea, NORMAL ); MuestraProv( 6, linea, NORMAL ); break; // Telefono case 2: case 12: sprintf ( buffer, "%s", SProv.Telefono1 ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SProv.Telefono1, buffer ); MuestraProv( 2, linea, NORMAL ); MuestraProv( 12, linea, NORMAL ); break; // Fax case 3: case 13: sprintf ( buffer, "%s", SProv.Fax ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SProv.Fax, buffer ); MuestraProv( 3, linea, NORMAL ); MuestraProv( 13, linea, NORMAL ); break; // CIF / NIF case 5: sprintf ( buffer, "%s", SProv.Cif ); if ( !( InputCadenaG( buffer, 0, 10, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SProv.Cif, buffer ); break; // Actividad proveedor case 1: case 7: sprintf ( buffer, "%s", SProv.ActividadProveedor ); if ( !( InputCadenaG( buffer, 0, 29, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SProv.ActividadProveedor, buffer ); break; // Direccion case 8: sprintf ( buffer, "%s", SProv.Direccion ); if ( !( InputCadenaG( buffer, 0, 30, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SProv.Direccion, buffer ); break; // Poblaci¢n case 9: sprintf ( buffer, "%s", SProv.Poblacion ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SProv.Poblacion, buffer ); break; // Provincia case 10: sprintf ( buffer, "%s", SProv.Provincia ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SProv.Provincia, buffer ); break; // C¢digo Postal case 11: sprintf ( buffer, "%lu", SProv.CodPost ); if ( !( InputCadenaG( buffer, 0, 5, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SProv.CodPost = atol ( buffer ); break; // Comentario case 14: settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); EditComentario( (char *)(&SProv.Notas[0][0]), 3, 37, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1, 14 ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; } } #endif /**************************************************************************\ |* *| |* ObtenCoordenadasProv *| |* *| |* 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 ObtenCoordenadasProv( 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 = 98; break; case 1: *X0 = 107; *X1 = 358; break; case 2: *X0 = 367; *X1 = 495; break; case 3: *X0 = 505; *X1 = 633; break; case 4: *X0 = 67; *Y0 = 37; *X1 = 148; *Y1 = 58; break; case 5: *X0 = 247; *Y0 = 37; *X1 = 388; *Y1 = 58; break; case 6: *X0 = 152; *Y0 = 62; *X1 = 390; *Y1 = 83; break; case 7: *X0 = 152; *Y0 = 87; *X1 = 390; *Y1 = 108; break; case 8: *X0 = 92; *Y0 = 112; *X1 = 388; *Y1 = 133; break; case 9: *X0 = 92; *Y0 = 137; *X1 = 223; *Y1 = 158; break; case 10: *X0 = 312; *Y0 = 137; *X1 = 438; *Y1 = 158; break; case 11: *X0 = 522; *Y0 = 137; *X1 = 598; *Y1 = 158; break; case 12: *X0 = 92; *Y0 = 162; *X1 = 245; *Y1 = 183; break; case 13: *X0 = 255; *Y0 = 162; *X1 = 388; *Y1 = 183; break; case 14: *X0 = 402; *Y0 = 165; *X1 = 633; *Y1 = 221; break; case 15: case 16: case 17: case 18: case 19: case 20: case 21: case 22: *X0 = 90 + 30 * ( columna - 15 ); *Y0 = 190; *X1 = *X0 + 25; *Y1 = 215; break; } *X0 += 2; *X1 -= 2; } /**************************************************************************\ |* *| |* ProvNuevoRegistro *| |* *| |* Descripci¢n: *| |* Limpia el buffer, para un nuevo registro. *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ProvNuevoRegistro( INFO_PROVEEDORES *NSProv ) { char i, j; NSProv -> CodigoR = 0; // Codigos asiignados a los proveedores strcpy( NSProv -> Proveedor, "" ); // Nombre del proveedor // Nombre del proveedor strcpy( NSProv -> ActividadProveedor, "" ); strcpy( NSProv -> Telefono1, "" ); // Tel‚fono y fax del proveedor strcpy( NSProv -> Fax, "" ); // strcpy( NSProv -> Direccion, "" ); // Direccion strcpy( NSProv -> Numero, "" ); // Numero strcpy( NSProv -> Poblacion, "" ); // Poblacion strcpy( NSProv -> Provincia, "" ); // Provincia NSProv -> CodPost = 0; // C¢digo Postal NSProv -> Estrellas = 0; // Estrellas ( lo que imagina el cliente ) for ( i = 0; i < 12; i++ ) for ( j = 0; j < 31; j++ ) NSProv -> Compras[i][j] = 0; for ( i = 0; i < 4; i++ ) SProv.Notas[i][0] = '\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 ( SProv.Estrellas & ( 0x01 << i ) ) SProv.Estrellas -= ( 0x01 << i ); else SProv.Estrellas += ( 0x01 << i ); enc = 15 + i; break; } } Anclar_Raton(); return enc; } // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte secundaria del m¢dulo Û // Û Û // Û Secci¢n de Busqueda de refecencias Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* BuscaProv *| |* *| |* 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 BuscaProv( char TipoBusqueda, char *CurrRow, long *CurrProv ) { static INFO_PROVEEDORES MProv; char enc; long i; switch ( TipoBusqueda ) { case NUEVA_BUSQUEDA: if ( ObtenMatchProv( &MProv ) != OK ) return; i = 0; break; case ATRAS: case ADELANTE: i = ( *CurrRow + *CurrProv ) + TipoBusqueda; break; } Optar( ENCUADRE, "Comando: Buscar", "Ahora se inica", "la busqueda elegida", NULL ); enc = 0; while ( i < BProv.Registros() && !enc ) { if ( BProv.LeeReg( (void *)&SProv, i ) == ERROR ) Error( 0x01, BProv.cError); if ( Match_Prov( &SProv, &MProv ) ) enc = 1; else i++; } Optar( ENCUADRE, NULL ); if ( enc ) { *CurrRow = 0; *CurrProv = i; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatosProv( *CurrRow + *CurrProv ); if ( BProv.LeeReg( (void *)&SProv, *CurrProv ) == ERROR ) Error(0x01, BProv.cError); MuestraDatosVProv( *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 ( BProv.LeeReg( (void *)&SProv, (*CurrRow + *CurrProv) ) == ERROR ) Error( 0x01, BProv.cError); } /**************************************************************************\ |* *| |* Match_Prov *| |* *| |* Descripci¢n: *| |* Compara dos registros y devuelve la posible coincidencia *| |* *| |* Entradas: *| |* Registros a comparar *| |* *| |* Salidas: *| |* Resultado de la comparaci¢n *| |* *| \**************************************************************************/ int Match_Prov( INFO_PROVEEDORES *A, INFO_PROVEEDORES *B ) { if ( B -> CodigoR != 0 ) return (A -> CodigoR == B -> CodigoR); if ( B -> Proveedor[0] != '\0' ) return ( strncmpi( A -> Proveedor, B -> Proveedor, strlen( B -> Proveedor ) ) == 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; } /**************************************************************************\ |* *| |* ObtenMatchProv *| |* *| |* 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 ObtenMatchProv( INFO_PROVEEDORES *MProv ) { char Row, ok, i; int BPush, key, DEV; struct textsettingstype texttypeinfo; gettextsettings( &texttypeinfo ); Optar( ENCUADRE, "Comando: Buscar", NULL ); Imprime_Estaticos( 31, "systm\\tpv.img" ); ok = 0; Row = 0; ProvNuevoRegistro( MProv ); do { MatchDrawProv(Row, *MProv, INTENSO); BPush = Comprueba_Secuencia( SEC_OPTAR, NULL ); MatchDrawProv(Row, *MProv, 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 ); EditMatchProv( Row, MProv ); for ( i=0; i < 4; i++ ) MatchDrawProv(i, *MProv, 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 > 4 ) 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; } /**************************************************************************\ |* *| |* EditMatchProv *| |* *| |* Descripci¢n: *| |* Edita el patron de busqueda *| |* *| |* Entradas: *| |* Campo a editar, y lugar donde almacenarlo *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void EditMatchProv( char Row, INFO_PROVEEDORES * MProv ) { int X0, Y0, X1, Y1; char buffer[80]; ObtenCoordenadasMatchProv( Row, &X0, &Y0, &X1, &Y1 ); switch( Row ) { case 0: sprintf( buffer, "%lu", MProv -> CodigoR ); if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { ProvNuevoRegistro( MProv ); MProv -> CodigoR = atol(buffer); } break; case 1: sprintf( buffer, "%s", MProv -> Proveedor ); if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { ProvNuevoRegistro( MProv ); strcpy ( MProv -> Proveedor, buffer ); } break; case 2: sprintf( buffer, "%s", MProv -> Direccion ); if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { ProvNuevoRegistro( MProv ); strcpy ( MProv -> Direccion, buffer ); } break; case 3: sprintf( buffer, "%s", MProv -> Telefono1 ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { ProvNuevoRegistro( MProv ); strcpy ( MProv -> Telefono1, buffer ); } break; } } /**************************************************************************\ |* *| |* MatchDrawProv *| |* *| |* 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 MatchDrawProv( char Row, INFO_PROVEEDORES MProv, char como ) { int X0, Y0, X1, Y1; char buffer[80]; ObtenCoordenadasMatchProv( Row, &X0, &Y0, &X1, &Y1 ); switch( Row ) { case 0: sprintf( buffer, " %9lu", MProv.CodigoR ); break; case 1: strncpy( buffer, MProv.Proveedor, 25 ); buffer[26] = '\0'; break; case 2: strncpy( buffer, MProv.Direccion, 25 ); buffer[26] = '\0'; break; case 3: strncpy( buffer, MProv.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 ); } /**************************************************************************\ |* *| |* MatchDrawProv *| |* *| |* Descripci¢n: *| |* Obtiene las coordenadas relativas al campo dado. *| |* *| |* Entradas: *| |* Campo a obtener las coordenadas, y coordenadas de salida *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ObtenCoordenadasMatchProv( char Row, int *X0, int *Y0, int *X1, int *Y1 ) { switch( Row ) { case 0: *X0 = 265; *X1 = 365; *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 Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* MuestraImpresiones *| |* *| |* Descripci¢n: *| |* Muestra un cuadro con las distintas opciones de impresi¢n *| |* *| |* Entradas:(ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraImpresionesProv(void) { void far *fondo; struct textsettingstype texttypeinfo; char ok, dev; if ( ( fondo = farmalloc ( JD_imagesize( 170, 165, 470, 315 ) ) ) != NULL ) { gettextsettings( &texttypeinfo ); getimage( 170, 165, 470, 315, fondo ); Imprime_Estaticos( 22, "systm\\tpv.img" ); settextstyle( texttypeinfo.font, texttypeinfo.direction, texttypeinfo.charsize ); ok = 0; do { switch( Comprueba_Secuencia( 3, NULL ) ) { case 0: case -1: case -2: while( kbhit() ) getch(); break; // Cancelar case 1: dev = 0; ok = 1; break; // Listado r pido case 2: dev = 1; ok = 1; break; // Listado completo case 3: dev = 2; ok = 1; break; // Codigos de barra case 4: dev = 3; ok = 1; break; } } while( !ok ); putimage( 170, 165, fondo, COPY_PUT ); farfree( fondo ); ImprimeProveedores( dev ); } } /**************************************************************************\ |* *| |* ImprimeProveedores *| |* *| |* Descripci¢n: *| |* Imprime todas las referencias seg£n se le indique *| |* *| |* Entradas: *| |* Como imprimir las referencias *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ImprimeProveedores( char como ) { long i, old_reg; FILE *file_out; old_reg = BProv.RegActual(); if ( !Config.Impresora.Printer ) { if ( ( file_out = fopen( Config.Impresora.PrintTo, "w" ) ) == NULL ) return; } else file_out = stdprn; ImprimeCabeceraProv(como, file_out); for ( i=0; i