TPV/TPV_FCLT.CPP
2021-09-08 21:44:52 +02:00

1849 lines
67 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <io.h>
#include <dir.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <graphics.h>
#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 telfono (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 telfono del Cliente" );
break;
// Fax
case 12:
sprintf ( buffer1, "Fax o segundo telfono 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: // Telfono
*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: // Telfono 1
*X0 = 91; *Y0 = 173;
*X1 = 239; *Y1 = 194;
break;
case 12: // Telfono 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, "" ); // Telfono 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<BClt1.Registros(); i++ )
{
BClt1.LeeReg( (void *)&SClt1, i );
switch( como )
{
// Listado R pido
case 1:
fprintf( file_out, "%9lu %-30s %-15s %-15s\n\r", SClt1.Codigo, SClt1.Nombre, SClt1.Telefono1, SClt1.Fax );
break;
// Listado Completo
case 2:
fprintf( file_out, "\n\r" );
fprintf( file_out, "\n\r" );
fprintf( file_out, "N§ Nombre: %9lu\n\r", SClt1.Codigo );
fprintf( file_out, "\n\r" );
fprintf( file_out, "Nombre Nombre: %s\n\r", SClt1.Nombre );
fprintf( file_out, "\n\r" );
fprintf( file_out, "Telefono: %-15s Fax: %-15s\n\r", SClt1.Telefono1, SClt1.Fax );
fprintf( file_out, "\n\r" );
fprintf( file_out, "Direccion: %s %s\n\r", SClt1.Direccion );
fprintf( file_out, "\n\r" );
fprintf( file_out, "\n\r" );
break;
// C¢digos de barra
case 3:
break;
}
}
if ( !Config.Impresora.Printer )
fclose( file_out );
BClt1.LeeReg( (void *)&SClt1, old_reg );
}
void ImprimeCabeceraClt( char como, FILE *file_out )
{
switch( como )
{
// Listado R pido
case 1:
fprintf( file_out, "Codigo Cltvedor Telfono Fax\n\r");
break;
// Listado Completo
case 2:
// C¢digos de barra
case 3:
break;
}
}
/*************************************************************************\
|* *|
|* MatchCliente *|
|* *|
|* Descripci¢n: *|
|* Busca al cliente requerido. *|
|* *|
|* *|
|* Entradas: *|
|* Codigo del Cliente *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\*************************************************************************/
int MatchCliente( long CodigoCliente )
{
char enc;
long i;
if ( SClt1.Codigo == CodigoCliente )
return OK;
enc = ERROR;
BClt1.LeeReg( (void *)&SClt1, 0 );
for ( i = 0; i < BClt1.Registros() && enc == ERROR; i++ )
{
if ( SClt1.Codigo == CodigoCliente )
{
enc = OK;
} else {
BClt1.LeeReg( (void *)&SClt1, i );
}
}
return enc;
}
/*************************************************************************\
|* *|
|* MatchCCliente *|
|* *|
|* Descripci¢n: *|
|* Busca la compra del cliente requerido *|
|* *|
|* *|
|* Entradas: *|
|* Codigo de enlace del cliente *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\*************************************************************************/
int MatchCCliente( long CodigoEnlace )
{
char enc = ERROR;
long i;
/*
if ( SClt2[0].CodigoR == CodigoEnlace )
return OK;
enc = ERROR;
BClt2.LeeReg( (void *)&SClt2, 0 );
for ( i = 0; i < BClt2.Registros() && enc == ERROR; i++ )
{
if ( SClt2[0].CodigoR == CodigoEnlace )
{
enc = OK;
} else {
BClt2.LeeReg( (void *)&SClt2, i );
}
}
*/
return enc;
}