#include #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_Clt 6 extern BDatos B_IVentas2; // Archivo de Ventas 2 de 3 ( Productos Vendidos ) extern INFORME2_VENTAS S_IVentas2; // Productos Vendidos ( 2 de 3 ) BDatos BClt1; // Base de datos de Clientes1: FICHAS INFO_CLIENTES1 SClt1; // Estructura de Clientes BDatos BClt2; // Base de datos de Clientes2: COMPRAS INFO_CLIENTES2 SClt2; // Estructura de Clientes /*************************************\ | | | Parte Principal del M¢dulo | | | \*************************************/ void DuplicaClientes( void ); void CltNuevoEnlace( INFO_CLIENTES1 *TmpClt ); void CltNuevoRegistro( INFO_CLIENTES1 *NSClt1 ); void MuestraDatosProductosClt( int DesdeDonde ); void MuestraDatosDiaClt( int DesdeDonde ); void MuestraDatosEnlace( long CodEnlace ); void CalculaCantProdDia( int MesDia ); void MuestraDatosVClt( int linea ); void MuestraAyudaClt( char columna ); void MuestraDatoSClt1( long RowStart ); int MatchCliente( long CodigoCliente ); int MatchCCliente( long CodigoEnlace ); void EditItemClt( char columna, int linea ); void MuestraClt( char columna, int linea, char como ); void ObtenCoordenadaSClt1( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ); /*************************************\ | | | Parte Secundaria del M¢dulo | | | | Secci¢n para las busquedas | | | \*************************************/ int ObtenMatchClt( INFO_CLIENTES1 *MClt ); void EditMatchClt( char Row, INFO_CLIENTES1 * MClt ); int Match_Clt( INFO_CLIENTES1 *A, INFO_CLIENTES1 *B ); void MatchDrawClt( char Row, INFO_CLIENTES1 MClt, char como ); void BuscaClt( char TipoBusqueda, char *CurrRow, long *CurrClt ); void ObtenCoordenadasMatchClt( char Row, int *X0, int *Y0, int *X1, int *Y1 ); /*************************************\ | | | Parte Tercera del M¢dulo | | | | Secci¢n para la impresi¢n | | | \*************************************/ void ImprimeClientes( char como ); void MuestraImpresionesClientes( void ); void ImprimeCabeceraClt( char como, FILE *file_out ); // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte principal del m¢dulo Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ int CurrProd; // Linea en el visor de productos vendidos a golpes char RowProd; // Linea en el visor de productos vendidos int CurrDias; // Linea del dia seleccionado y a inspeccionar a golpes char RowDias; // Linea del dia seleccionado y a inspeccionar int *MesDiaPosibles; // Meses y dias posibles int InicioProdDia_Clt; // Inicio del dia /**************************************************************************\ |* *| |* FichaClientes *| |* *| |* Descripci¢n: *| |* Inicializaci¢n y consultas global de la fichas de Clientes *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void FichaClientes(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 CurrClt; // Cliente sobre el que estamos posicionados a golpes // Pedimos memoria para el almacen de compras if ( // ( SClt2 = (INFO_CLIENTES2 *)malloc( sizeof( INFO_CLIENTES2 ) * TOTAL_COMPRAS_ANUAL ) ) == NULL || ( MesDiaPosibles = (int *)malloc( sizeof( int ) * 367 ) ) == NULL ) { // if ( SClt2 != NULL ) free ( SClt2 ); if ( MesDiaPosibles != NULL ) free ( MesDiaPosibles ); Optar( 0, "Eror de asignacion de Mem.", "Atenci¢n no hay suficiente", "memorial libre para ejecutar", "la acci¢n especificada.", NULL ); return; } // Rellenamos la pantalla con un fondo atractivo... setfillstyle( Config.FillBgS, Config.FillBgC ); bar( 0, 0, 640, 480 ); Imprime_Estaticos( 140, "systm\\Tpv.img"); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); sprintf( buffer, "datos\\%s\\info_clt2.%03d", NEmpresa, ( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 ) ); if ( BClt2.AbrirReg( buffer, sizeof( INFO_CLIENTES2 ) * TOTAL_COMPRAS_ANUAL ) == ERROR ) Error(0x01, BClt2.cError); /* // 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_clt2.%03d", NEmpresa, ( (FechaGestionActual.da_year-1) - ((FechaGestionActual.da_year-1)/1000)*1000 ) ); if ( access( buffer, 0 ) == 0 ) { Optar( ENCUADRE, "Generando clon de Clientes", "Atenci¢n se detecto un nuevo", "a¤o y se esta generando un", "clon de la base anterior.", NULL ); DuplicaClientes(); Optar( ENCUADRE, "Generando clon de Clientes", "Atenci¢n se detecto un nuevo", "a¤o y se esta generando un", "clon de la base anterior.", NULL ); } } */ sprintf( buffer, "datos\\%s\\info_clt1.dbf", NEmpresa ); if ( BClt1.AbrirReg( buffer, sizeof( INFO_CLIENTES1 ) ) == ERROR ) Error(0x01, BClt1.cError); CurrClt = 0; // Si no hay registros, creamos uno almenos. if ( BClt1.Registros() == 0 ) { // Guardamos el enlace como ocupado // Salva los 256 bytes de usuario BClt2.SalvaDatosUsuario( (void *)&CurrClt ); CltNuevoRegistro( &SClt1 ); CltNuevoEnlace( &SClt1 ); if ( BClt1.InsReg( (void *)&SClt1, BClt1.Registros(), ARRIBA ) == ERROR ) Error(0x01, BClt1.cError); } CurrClt = 0; CurrRow = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrRow + CurrClt ); if ( BClt1.LeeReg( (void *)&SClt1, 0 ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); // Mostramos los datos de estado inicial MuestraDatosVClt( CurrRow ); CurrCol = 0; do { if ( CurrCol != oldCol ) { oldCol = CurrCol; MuestraAyudaClt( CurrCol ); } MuestraClt( CurrCol, CurrRow, INTENSO ); BPush = Comprueba_Secuencia( 2, NULL ); MuestraClt( CurrCol, CurrRow, NORMAL ); switch ( BPush ) { case 0: // No se pulso ningun BOTON while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER break; case -2: // Hay una tecla normal en BUFFER #ifndef DEMOSTRACION if ( ( key = getch() ) != 27 ) { if ( key != 13 ) ungetch( key ); EditItemClt( CurrCol, CurrRow ); if ( BClt1.EscribeReg( (void *)&SClt1, (CurrRow + CurrClt) ) == ERROR ) Error(0x01, BClt1.cError); MuestraClt( CurrCol, CurrRow, NORMAL ); CurrCol++; if ( CurrCol > 17 ) CurrCol = 17; } #else while( kbhit() ) getch(); Optar( 0, "VERSION DEMOSTRACION", "En esta versi¢n no se", "permiten m¢dificar los campos,", "de los Clteedores...", NULL ); #endif 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 < 3 ) { if ( (CurrRow + CurrClt) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_Clt - 1; CurrClt -= NLINEAS_Clt; if ( CurrClt < 0 ) CurrClt = 0; while( ( CurrRow + CurrClt ) >= BClt1.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrClt ) >= BClt1.Registros() && CurrClt > 0 ) CurrClt++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrClt ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } } if ( BClt1.LeeReg( (void *)&SClt1, (CurrClt + CurrRow) ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); MuestraDatosVClt( CurrRow ); } else { CurrCol--; if ( CurrCol < 0 ) CurrCol = 14; } break; // Flecha Abajo case 80: if ( CurrCol < 3 ) { if ( ( CurrRow + CurrClt ) < BClt1.Registros() - 1 ) { if ( ( CurrRow ) >= NLINEAS_Clt - 1 ) { CurrRow = 0; CurrClt += NLINEAS_Clt; while ( (CurrClt + CurrRow) >= BClt1.Registros() ) CurrClt--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrClt ); } else CurrRow++; } if ( BClt1.LeeReg( (void *)&SClt1, (CurrClt + CurrRow) ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); MuestraDatosVClt( CurrRow ); } else { CurrCol++; if ( CurrCol > 17 ) CurrCol = 0; } break; // Inicio case 71: CurrRow = 0; if ( CurrClt != 0 ) { CurrClt = 0; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrClt ); } if ( BClt1.LeeReg( (void *)&SClt1, (CurrClt + CurrRow) ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); MuestraDatosVClt( CurrRow ); break; // Fin case 79: CurrRow = 0; if ( CurrClt != BClt1.Registros() - NLINEAS_Clt ) { CurrClt = BClt1.Registros() - NLINEAS_Clt; if ( CurrClt < 0 ) { CurrClt = 0; CurrRow = BClt1.Registros()-1; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrClt ); } if ( BClt1.LeeReg( (void *)&SClt1, (CurrClt + CurrRow) ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); MuestraDatosVClt( CurrRow ); break; } break; // Imprimir Informe de Clientes case 1: MuestraImpresionesClientes(); break; // Menu Principal case 2: ok = 1; break; #ifndef DEMOSTRACION // Eliminar case 3: if ( Optar( 1, "ATENCION", "Eliminar al Cliente", "Provocar  la perdida de datos", "para los informaes!!!", NULL ) ) { if ( BClt1.DelReg( CurrClt + CurrRow ) == ERROR ) Error(0x01, BClt1.cError); if ( BClt1.Registros() == 0 ) { CltNuevoRegistro( &SClt1 ); CltNuevoEnlace( &SClt1 ); if ( BClt1.InsReg( (void *)&SClt1, BClt1.Registros(), ARRIBA ) == ERROR ) Error(0x01, BClt1.cError); CurrRow = 0; } else // Si he borrado el £ltimo registro subo una linea if ( (CurrClt+CurrRow) >= ( BClt1.Registros() - 2 ) ) { if ( (CurrRow + CurrClt) > 0 ) { if ( ( CurrRow ) <= 0 ) { CurrRow = NLINEAS_Clt - 1; CurrClt -= NLINEAS_Clt; if ( CurrClt < 0 ) CurrClt = 0; while( ( CurrRow + CurrClt ) >= BClt1.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrClt ) >= BClt1.Registros() && CurrClt > 0 ) CurrClt++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrClt ); } else { CurrRow --; if ( CurrRow < 0 ) CurrRow = 0; } } if ( BClt1.LeeReg( (void *)&SClt1, (CurrClt + CurrRow) ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); MuestraDatosVClt( CurrRow ); } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrClt ); if ( BClt1.LeeReg( (void *)&SClt1, (CurrClt + CurrRow) ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); MuestraDatosVClt( CurrRow ); } break; // Insertar case 4: CltNuevoRegistro( &SClt1 ); CltNuevoEnlace( &SClt1 ); if ( BClt1.InsReg( (void *)&SClt1, (CurrClt + CurrRow), ARRIBA ) == ERROR ) Error(0x01, BClt1.cError); if ( ( CurrRow + CurrClt ) < BClt1.Registros() - 1 ) { if ( ( CurrRow ) >= NLINEAS_Clt - 1 ) { CurrRow = 0; CurrClt += NLINEAS_Clt; while ( (CurrClt + CurrRow) >= BClt1.Registros() ) CurrClt--; } else CurrRow++; } // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrClt ); if ( BClt1.LeeReg( (void *)&SClt1, (CurrClt + CurrRow) ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); MuestraDatosVClt( 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_Clt - 1; CurrClt -= NLINEAS_Clt; if ( CurrClt < 0 ) CurrClt = 0; while( ( CurrRow + CurrClt ) >= BClt1.Registros() && CurrRow > 0 ) CurrRow--; while( ( CurrRow + CurrClt ) >= BClt1.Registros() && CurrClt > 0 ) CurrClt++; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrClt ); if ( BClt1.LeeReg( (void *)&SClt1, (CurrClt + CurrRow) ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); MuestraDatosVClt( CurrRow ); #endif break; // Busqueda Atras case 6: BuscaClt( ATRAS, &CurrRow, &CurrClt ); break; // Buscar case 7: BuscaClt( NUEVA_BUSQUEDA, &CurrRow, &CurrClt ); break; // Busqueda Adelante case 8: BuscaClt( ADELANTE, &CurrRow, &CurrClt ); break; // AvanceR pido case 9: #ifndef DEMOSTRACION CurrRow = 0; CurrClt += NLINEAS_Clt; while ( (CurrClt + CurrRow) >= BClt1.Registros() ) CurrClt--; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( CurrClt ); if ( BClt1.LeeReg( (void *)&SClt1, (CurrClt + CurrRow) ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosEnlace( SClt1.CodEnlace ); MuestraDatosVClt( CurrRow ); #endif break; default: break; } } while( !ok ); BClt1.CerrarReg(); BClt2.CerrarReg(); // free( SClt2 ); free( MesDiaPosibles ); } /**************************************************************************\ |* *| |* CltNuevosEnlace *| |* *| |* Descripci¢n: *| |* Crea un nuevo enlace a las fichas de cliente *| |* *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void CltNuevoEnlace( INFO_CLIENTES1 *TmpClt ) { long Enlaces; // Recuperamos el registro de enlaces ocupados // Carga los datos de usuario BClt2.CargaDatosUsuario( (void *)&Enlaces, sizeof( long ) ); Enlaces ++; // Utilizamos el siguiente enlace en la lista TmpClt -> CodEnlace = Enlaces; // Guardamos el enlace como ocupado // Salva los 256 bytes de usuario BClt2.SalvaDatosUsuario( (void *)&Enlaces ); } /**************************************************************************\ |* *| |* MuestraDatosEnlace *| |* *| |* Descripci¢n: *| |* Dado el codigo de enlace correspondiente, lo busca y muestra*| |* *| |* *| |* Entradas: C¢digo de enlace a buscar *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraDatosEnlace( long CodEnlace ) { long i; int j; // Vemos para este cliente, cuantos dias de compra distintos posee!!! // Como m ximo poseer  365 dias! MesDiaPosibles[ 0] = 0; MesDiaPosibles[366] = 0; for ( i = 0; i < BClt2.Registros(); i++ ) { if ( BClt2.LeeReg( (void *)&SClt2, i ) == ERROR ) Error(0x01, BClt2.cError); if ( CodEnlace == SClt2.CodEnlace ) { for ( j = 0; j < MesDiaPosibles[366]; j++ ) { if ( SClt2.MesDia == MesDiaPosibles[j] ) { break; } } if ( j >= MesDiaPosibles[366] ) { MesDiaPosibles[ MesDiaPosibles[366] ] = SClt2.MesDia; MesDiaPosibles[366]++; } } } // Ordenamos los dias que puede ver -> Y un CARAILLO <-- /* if ( CodEnlace != SClt2[0].CodigoR ) { SClt2[0].CodigoR = CodEnlace; // Forzamos a que sea el c¢digo de enlace SClt2[0].Total = 0; // pero sin que existan productos... } RowProd = CurrProd = 0; // Linea en el visor de productos vendidos RowDias = CurrDias = 0; // Linea del dia seleccionado y a inspeccionar */ MuestraDatosDiaClt( CurrDias ); // Dias disponibles para visualizar // productos disponibles para el d¡a seleccionado CalculaCantProdDia( MesDiaPosibles[ CurrDias + RowDias ] ); // Productos de ese dia MuestraDatosProductosClt( CurrProd ); } #define NUM_LINEAS_DIAS_POSIBLES 15 #define NUM_LINEAS_PRODUCTOS_CLT 25 void MuestraDatosProductosClt( int DesdeDonde ) { int i; int X0, Y0, X1, Y1; for ( i = 0; i < NUM_LINEAS_PRODUCTOS_CLT && DesdeDonde + i < SClt2.Total; i++ ) { MuestraClt( 19, i, NORMAL ); } // Ahora limpio los restantes huecos si los hay for ( ; i < NUM_LINEAS_PRODUCTOS_CLT; i++ ) { setfillstyle( SOLID_FILL, Config.TxtBgN ); ObtenCoordenadaSClt1( 19, i, &X0, &Y0, &X1, &Y1 ); bar( X0, Y0, X1, Y1 ); } } void MuestraDatosDiaClt( int DesdeDonde ) { int i; int X0, Y0, X1, Y1; for ( i = 0; i < NUM_LINEAS_DIAS_POSIBLES && DesdeDonde + i < MesDiaPosibles[366]; i++ ) { MuestraClt( 18, i, NORMAL ); } // Ahora limpio los restantes huecos si los hay for ( ; i < NUM_LINEAS_DIAS_POSIBLES; i++ ) { setfillstyle( SOLID_FILL, Config.TxtBgN ); ObtenCoordenadaSClt1( 18, i, &X0, &Y0, &X1, &Y1 ); bar( X0, Y0, X1, Y1 ); } } void CalculaCantProdDia( int MesDia ) { /* int i; InicioProdDia_Clt = -1; SClt2[0].Unidades = 0; // Contamos el n£mero de productos en este d¡a for ( i = 1; i < SClt2[0].Total; i++ ) { if ( SClt2[i].MesDia == MesDia ) { if ( InicioProdDia_Clt == -1 ) InicioProdDia_Clt = i; SClt2[0].Unidades++; } } */ } /**************************************************************************\ |* *| |* DuplicaClientes *| |* *| |* Descripci¢n: *| |* Dado que he elegido un sistema rigido para tratar a los *| |* clientes, me veo obligado una vez al a¤o a clonar la *| |* base de datos de los clietnes... *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ /* void DuplicaClientes(void) { long Regs; BDatos BPtmp; char buffer[80]; // Base a clonar sprintf( buffer, "datos\\%s\\info_clt.%03d", NEmpresa, ( (FechaGestionActual.da_year-1) - ((FechaGestionActual.da_year-1)/1000)*1000 ) ); if ( BPtmp.AbrirReg( buffer, sizeof( INFO_CLIENTES1 ) ) == ERROR ) Error(0x01, BPtmp.cError); // Base clonada sprintf( buffer, "datos\\%s\\info_clt.%03d", NEmpresa, ( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 ) ); if ( BClt1.AbrirReg( buffer, sizeof( INFO_CLIENTES1 ) ) == ERROR ) Error(0x01, BClt1.cError); for( Regs = 0; Regs < BPtmp.Registros(); Regs++ ) { if ( BPtmp.LeeReg( (void *)&SClt1, Regs ) == ERROR ) Error(0x01, BPtmp.cError); if ( BClt1.InsReg( (void *)&SClt1, BClt1.Registros(), ARRIBA ) == ERROR ) Error(0x01, BClt1.cError); } BClt1.CerrarReg(); BPtmp.CerrarReg(); } */ /**************************************************************************\ |* *| |* MuestraDatoSClt1 *| |* *| |* 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 MuestraDatoSClt1( long RowStart ) { int linea, campo; char dev; int X0, Y0, X1, Y1; // Imprimo la NLINEAS_Clt que caben en la pantalla dev = OK; for ( linea=0; linea < NLINEAS_Clt && (RowStart + linea) < BClt1.Registros()/*dev == OK*/; linea++ ) { dev = BClt1.LeeReg( (void *)&SClt1, RowStart + linea ); if ( dev == OK ) // Por cada linea hay 3 campos, ehhh!!! for ( campo=0; campo < 3; campo++ ) MuestraClt( campo, linea, NORMAL ); } // Ahora limpio los restantes huecos si los hay if ( linea < NLINEAS_Clt ) //dev != OK ) { //linea--; setfillstyle( SOLID_FILL, Config.TxtBgN ); for ( ; linea < NLINEAS_Clt; linea++ ) for ( campo=0; campo < 3; campo++ ) { ObtenCoordenadaSClt1( campo, linea, &X0, &Y0, &X1, &Y1 ); bar( X0, Y0, X1, Y1 ); } } } void MuestraDatosVClt( int linea ) { int campo; // Mostramos los campos que faltan, ( 1¦ Linea ) for ( campo=3; campo < 18; campo++ ) MuestraClt( campo, linea, NORMAL ); } /**************************************************************************\ |* *| |* MuestraClt *| |* *| |* 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 MuestraClt( char columna, int linea, char como ) { char buffer[80], draw; char buffer1[80], i; int X0, Y0, X1, Y1; ObtenCoordenadaSClt1( columna, linea, &X0, &Y0, &X1, &Y1 ); draw = 1; switch( columna ) { // Codigo case 0: sprintf ( buffer, "%08lu", SClt1.Codigo ); break; // Nombre del Cliente case 1: sprintf ( buffer, " %30s", SClt1.Nombre ); break; // N§ de Telefono case 2: settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); sprintf ( buffer, "%15s", SClt1.Telefono1 ); 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 ); draw = 0; break; // Codigo case 3: sprintf ( buffer, "%09lu", SClt1.Codigo ); break; // NIF / CIF case 4: sprintf ( buffer, "%10s", SClt1.Cif ); 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 ); outtextxy( X0 + 2, Y0 + 2, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // Nombre del Cliente case 5: sprintf ( buffer, "%27s", SClt1.Nombre ); break; // DATOa01 case 6: sprintf ( buffer, "%27s", SClt1.DATOa01 ); break; // Direccion case 7: sprintf ( buffer, "%27s", SClt1.Direccion ); break; // Localidad case 8: sprintf ( buffer, "%15s", SClt1.Localidad ); break; // Provincia case 9: sprintf ( buffer, "%15s", SClt1.Provincia ); break; // Codigo Postal case 10: formatea_long( SClt1.CodPostal, buffer1 ); sprintf ( buffer, "%10s", buffer1 ); break; // Telefono case 11: sprintf ( buffer, " %15s", SClt1.Telefono1 ); break; // Fax case 12: sprintf ( buffer, " %15s", SClt1.Fax ); break; // Comentario case 13: 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 < 5; i++ ) outtextxy( X0 + 2, Y0 + 14*i, SClt1.Notas[i] ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // DATOSa(02-05) case 14: sprintf ( buffer, "%6s", SClt1.DATOa02 ); break; case 15: sprintf ( buffer, "%6s", SClt1.DATOa03 ); break; case 16: sprintf ( buffer, "%6s", SClt1.DATOa04 ); break; case 17: sprintf ( buffer, "%6s", SClt1.DATOa05 ); break; case 18: sprintf ( buffer, "%02d-%02d-%02d", (int)(MesDiaPosibles[linea]>>8), (int)(MesDiaPosibles[linea]&0x0000FFFF), (int)(( FechaGestionActual.da_year - (FechaGestionActual.da_year/1000)*1000 )) ); 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 ); outtextxy( X0 + 2, Y0 + 14*i, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; case 19: /* // Busco dentro de la base de datos B_IVentas2 el c¢digo SClt2[linea+InicioProdDia_Clt].CodigoR strcpy ( S_IVentas2.Nombre, "Esto es una prueba" ); sprintf ( buffer, "%30s %02d", S_IVentas2.Nombre, SClt2[linea+InicioProdDia_Clt].Unidades ); 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 ); outtextxy( X0 + 2, Y0 + 14*i, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); */ 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 ); } } /**************************************************************************\ |* *| |* MuestraAyudaClt *| |* *| |* Descripci¢n: *| |* Muestra una peque¤a descripcion del contenido para el campo *| |* *| |* Entradas: *| |* columna campo ha mostar su ayuda *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void MuestraAyudaClt( char columna ) { char buffer1[80]; switch( columna ) { // Codigo case 0: sprintf ( buffer1, "C¢digo de Cliente" ); break; // Nombre del Cliente case 1: sprintf ( buffer1, "Nombre del Cliente" ); break; // Telefono case 2: sprintf ( buffer1, "N£mero de tel‚fono (1§) del Cliente" ); break; // Codigo case 3: sprintf ( buffer1, "Introduzca el codigo que desea asignar al Cliente" ); break; // Nif / Cif case 4: sprintf ( buffer1, "N.I.F. o C.I.F. del Cliente" ); break; // Nombre del Cliente case 5: sprintf ( buffer1, "Introduzca el Nombre del Cliente" ); break; // DATOSa01 case 6: sprintf ( buffer1, "DATOS ampliacion 1 (a su elecci¢n)" ); break; // Direccion case 7: sprintf ( buffer1, "Direccion completa del Cliente" ); break; // Localidad case 8: sprintf ( buffer1, "Localidad del Cliente" ); break; // Provincia case 9: sprintf ( buffer1, "Provincia" ); break; // C¢digo postal case 10: sprintf ( buffer1, "C¢digo Postal" ); break; // Telefono case 11: sprintf ( buffer1, "N£mero de tel‚fono del Cliente" ); break; // Fax case 12: sprintf ( buffer1, "Fax o segundo tel‚fono del Cliente" ); break; case 13: sprintf ( buffer1, "Breves notas sobre el Cliente" ); break; case 14: sprintf ( buffer1, "DATOS ampliacion a02 (a su elecci¢n)" ); break; case 15: sprintf ( buffer1, "DATOS ampliacion a03 (a su elecci¢n)" ); break; case 16: sprintf ( buffer1, "DATOS ampliacion a04 (a su elecci¢n)" ); break; case 17: sprintf ( buffer1, "DATOS ampliacion a05 (a su elecci¢n)" ); 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 /**************************************************************************\ |* *| |* EditItemClt *| |* *| |* 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 EditItemClt( char columna, int linea ) { char buffer[80]; int X0, Y0, X1, Y1; ObtenCoordenadaSClt1( columna, linea, &X0, &Y0, &X1, &Y1 ); switch( columna ) { // Codigo Real // case 0: case 3: sprintf ( buffer, "%lu", SClt1.Codigo ); if ( !( InputCadenaG( buffer, 1, 8, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SClt1.Codigo = atol( buffer ); MuestraClt( 0, linea, NORMAL ); MuestraClt( 3, linea, NORMAL ); break; // Nombre del Cliente // case 1: case 5: strcpy ( buffer, SClt1.Nombre ); if ( !( InputCadenaG( buffer, 0, 27, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SClt1.Nombre, buffer ); MuestraClt( 1, linea, NORMAL ); MuestraClt( 5, linea, NORMAL ); break; // Telefono // case 2: case 11: sprintf ( buffer, "%s", SClt1.Telefono1 ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SClt1.Telefono1, buffer ); MuestraClt( 2, linea, NORMAL ); MuestraClt( 12, linea, NORMAL ); break; // Fax case 12: sprintf ( buffer, "%s", SClt1.Fax ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SClt1.Fax, buffer ); MuestraClt( 3, linea, NORMAL ); MuestraClt( 13, linea, NORMAL ); break; // CIF / NIF case 4: sprintf ( buffer, "%s", SClt1.Cif ); settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); if ( !( InputCadenaG( buffer, 0, 10, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SClt1.Cif, buffer ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; // DATOS a01 case 6: sprintf ( buffer, "%s", SClt1.DATOa01 ); if ( !( InputCadenaG( buffer, 0, 27, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SClt1.DATOa01, buffer ); break; // Direccion case 7: sprintf ( buffer, "%s", SClt1.Direccion ); if ( !( InputCadenaG( buffer, 0, 27, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SClt1.Direccion, buffer ); break; // Poblaci¢n case 8: sprintf ( buffer, "%s", SClt1.Localidad ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SClt1.Localidad, buffer ); break; // Provincia case 9: sprintf ( buffer, "%s", SClt1.Provincia ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) strcpy ( SClt1.Provincia, buffer ); break; // C¢digo Postal case 10: sprintf ( buffer, "%lu", SClt1.CodPostal ); if ( !( InputCadenaG( buffer, 0, 5, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) SClt1.CodPostal = atol ( buffer ); break; // Comentario case 13: settextstyle( SMALL_FONT, HORIZ_DIR, 4 ); EditComentario( (char *)(&SClt1.Notas[0][0]), 4, 30, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1, 14 ); settextstyle( SMALL_FONT, HORIZ_DIR, 5 ); break; default: while( kbhit() ) getch(); } } #endif /**************************************************************************\ |* *| |* ObtenCoordenadaSClt1 *| |* *| |* 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 ObtenCoordenadaSClt1( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 ) { // Calculamos la Y0, Y1 para la linea dada ( SOLO columna < 6 ) *Y0 = 334 + 19*linea; *Y1 = *Y0 + 17; switch( columna ) { case 0: // Codigo de Cliente *X0 = 7; *X1 = 78; break; case 1: // Nombre del Cliente *X0 = 87; *X1 = 348; break; case 2: // Tel‚fono *X0 = 352; *X1 = 451; break; case 3: // Introducir Codigo de Cliente *X0 = 66; *Y0 = 17; *X1 = 149; *Y1 = 38; break; case 4: // Nif / Cif *X0 = 246; *Y0 = 17; *X1 = 309; *Y1 = 38; break; case 5: // Nombre *X0 = 91; *Y0 = 48; *X1 = 309; *Y1 = 69; break; case 6: // DATO a01 *X0 = 91; *Y0 = 73; *X1 = 309; *Y1 = 94; break; case 7: // Direccion *X0 = 91; *Y0 = 98; *X1 = 309; *Y1 = 119; break; case 8: // Localidad *X0 = 91; *Y0 = 123; *X1 = 224; *Y1 = 144; break; case 9: // Provincia *X0 = 91; *Y0 = 148; *X1 = 224; *Y1 = 169; break; case 10: // Codigo Postal *X0 = 311; *Y0 = 148; *X1 = 394; *Y1 = 169; break; case 11: // Tel‚fono 1 *X0 = 91; *Y0 = 173; *X1 = 239; *Y1 = 194; break; case 12: // Tel‚fono 2 *X0 = 246; *Y0 = 173; *X1 = 394; *Y1 = 194; break; case 13: // NOTAS *X0 = 203; *Y0 = 215; *X1 = 392; *Y1 = 290; break; case 14: // DATOS a 02 *X0 = 91; *Y0 = 198; *X1 = 194; *Y1 = 219; break; case 15: // DATOS a 03 *X0 = 91; *Y0 = 223; *X1 = 194; *Y1 = 244; break; case 16: // DATOS a 04 *X0 = 91; *Y0 = 248; *X1 = 194; *Y1 = 269; break; case 17: // DATOS a 05 *X0 = 91; *Y0 = 273; *X1 = 194; *Y1 = 294; break; case 18: // Dias disponibles *X0 = 401; *Y0 = 143 + 10*linea; *X1 = 452; *Y1 = *Y0 + 10 ; break; case 19: // Productos adquiridos *X0 = 456; *Y0 = 163 + 10*linea; *X1 = 634; *Y1 = *Y0 + 10 ; break; } *X0 += 2; *X1 -= 2; } /**************************************************************************\ |* *| |* CltNuevoRegistro *| |* *| |* Descripci¢n: *| |* Limpia el buffer, para un nuevo registro. *| |* *| |* Entradas: (ninguna) *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void CltNuevoRegistro( INFO_CLIENTES1 *NSClt1 ) { char i; // Recogemos informaci¢n sobre el enlace de cliente (PARA CUANDO NOS HAGA FALTA) /* NSClt1 -> CodEnlace = CodSigEnlace; */ // Grabamos el nuevo siguiente c¢digo de enlace NSClt1 -> Codigo = 0; // Codigos asignados a los Clientes strcpy( NSClt1 -> Cif, "" ); // Nif / Cif del cliente strcpy( NSClt1 -> Nombre, "" ); // Nombre del Cliente strcpy( NSClt1 -> DATOa01, "" ); // DATO ampliacion 01 strcpy( NSClt1 -> Telefono1, "" ); // Tel‚fono y fax del Clteedor strcpy( NSClt1 -> Fax, "" ); // strcpy( NSClt1 -> Direccion, "" ); // Direccion strcpy( NSClt1 -> Localidad, "" ); // Localidad strcpy( NSClt1 -> Provincia, "" ); // Provincia NSClt1 -> CodPostal = 0; // C¢digo Postal for ( i = 0; i < 6; i++ ) NSClt1 -> Notas[i][0] = '\0'; strcpy( NSClt1 -> DATOa02, "" ); // DATO ampliacion 01 strcpy( NSClt1 -> DATOa03, "" ); // DATO ampliacion 01 strcpy( NSClt1 -> DATOa04, "" ); // DATO ampliacion 01 strcpy( NSClt1 -> DATOa05, "" ); // DATO ampliacion 01 } // ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß // Û Parte secundaria del m¢dulo Û // Û Û // Û Secci¢n de Busqueda de refecencias Û // ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ /**************************************************************************\ |* *| |* BuscaClt *| |* *| |* 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 BuscaClt( char TipoBusqueda, char *CurrRow, long *CurrClt ) { static INFO_CLIENTES1 MClt; char enc; long i; switch ( TipoBusqueda ) { case NUEVA_BUSQUEDA: if ( ObtenMatchClt( &MClt ) != OK ) return; i = 0; break; case ATRAS: case ADELANTE: i = ( *CurrRow + *CurrClt ) + TipoBusqueda; break; } Optar( ENCUADRE, "Comando: Buscar", "Ahora se inica", "la busqueda elegida", NULL ); enc = 0; while ( i < BClt1.Registros() && !enc ) { if ( BClt1.LeeReg( (void *)&SClt1, i ) == ERROR ) Error( 0x01, BClt1.cError); if ( Match_Clt( &SClt1, &MClt ) ) enc = 1; else i++; } Optar( ENCUADRE, NULL ); if ( enc ) { *CurrRow = 0; *CurrClt = i; // Mostramos datos hasta que se nos acabe la pantalla MuestraDatoSClt1( *CurrRow + *CurrClt ); if ( BClt1.LeeReg( (void *)&SClt1, *CurrClt ) == ERROR ) Error(0x01, BClt1.cError); MuestraDatosVClt( *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 ( BClt1.LeeReg( (void *)&SClt1, (*CurrRow + *CurrClt) ) == ERROR ) Error( 0x01, BClt1.cError); } /**************************************************************************\ |* *| |* Match_Clt *| |* *| |* Descripci¢n: *| |* Compara dos registros y devuelve la posible coincidencia *| |* *| |* Entradas: *| |* Registros a comparar *| |* *| |* Salidas: *| |* Resultado de la comparaci¢n *| |* *| \**************************************************************************/ int Match_Clt( INFO_CLIENTES1 *A, INFO_CLIENTES1 *B ) { if ( B -> Codigo != 0 ) return (A -> Codigo == B -> Codigo); if ( B -> Nombre[0] != '\0' ) return ( strncmpi( A -> Nombre, B -> Nombre, strlen( B -> Nombre ) ) == 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; } /**************************************************************************\ |* *| |* ObtenMatchClt *| |* *| |* 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 ObtenMatchClt( INFO_CLIENTES1 *MClt ) { 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; CltNuevoRegistro( MClt ); do { MatchDrawClt(Row, *MClt, INTENSO); BPush = Comprueba_Secuencia( SEC_OPTAR, NULL ); MatchDrawClt(Row, *MClt, 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 ); EditMatchClt( Row, MClt ); for ( i=0; i < 4; i++ ) MatchDrawClt(i, *MClt, 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; } /**************************************************************************\ |* *| |* EditMatchClt *| |* *| |* Descripci¢n: *| |* Edita el patron de busqueda *| |* *| |* Entradas: *| |* Campo a editar, y lugar donde almacenarlo *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void EditMatchClt( char Row, INFO_CLIENTES1 * MClt ) { int X0, Y0, X1, Y1; char buffer[80]; ObtenCoordenadasMatchClt( Row, &X0, &Y0, &X1, &Y1 ); switch( Row ) { case 0: sprintf( buffer, "%lu", MClt -> Codigo ); if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { CltNuevoRegistro( MClt ); MClt -> Codigo = atol(buffer); } break; case 1: sprintf( buffer, "%s", MClt -> Nombre ); if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { CltNuevoRegistro( MClt ); strcpy ( MClt -> Nombre, buffer ); } break; case 2: sprintf( buffer, "%s", MClt -> Direccion ); if ( !( InputCadenaG( buffer, 0, 25, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { CltNuevoRegistro( MClt ); strcpy ( MClt -> Direccion, buffer ); } break; case 3: sprintf( buffer, "%s", MClt -> Telefono1 ); if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) ) { CltNuevoRegistro( MClt ); strcpy ( MClt -> Telefono1, buffer ); } break; } } /**************************************************************************\ |* *| |* MatchDrawClt *| |* *| |* 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 MatchDrawClt( char Row, INFO_CLIENTES1 MClt, char como ) { int X0, Y0, X1, Y1; char buffer[80]; ObtenCoordenadasMatchClt( Row, &X0, &Y0, &X1, &Y1 ); switch( Row ) { case 0: sprintf( buffer, " %9lu", MClt.Codigo ); break; case 1: strncpy( buffer, MClt.Nombre, 25 ); buffer[26] = '\0'; break; case 2: strncpy( buffer, MClt.Direccion, 25 ); buffer[26] = '\0'; break; case 3: strncpy( buffer, MClt.Telefono1, 15 ); buffer[26] = '\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 ); } /**************************************************************************\ |* *| |* MatchDrawClt *| |* *| |* Descripci¢n: *| |* Obtiene las coordenadas relativas al campo dado. *| |* *| |* Entradas: *| |* Campo a obtener las coordenadas, y coordenadas de salida *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ObtenCoordenadasMatchClt( 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 MuestraImpresionesClientes(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 ); ImprimeClientes( dev ); } } /**************************************************************************\ |* *| |* ImprimeNombrees *| |* *| |* Descripci¢n: *| |* Imprime todas las referencias seg£n se le indique *| |* *| |* Entradas: *| |* Como imprimir las referencias *| |* *| |* Salidas: (ninguna) *| |* *| \**************************************************************************/ void ImprimeClientes( char como ) { long i, old_reg; FILE *file_out; old_reg = BClt1.RegActual(); if ( !Config.Impresora.Printer ) { if ( ( file_out = fopen( Config.Impresora.PrintTo, "w" ) ) == NULL ) return; } else file_out = stdprn; ImprimeCabeceraClt(como, file_out); for ( i=0; i