LosArcosChicos/TXT_LPR.CPP
2021-09-12 20:24:08 +02:00

1089 lines
42 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 <alloc.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include "d:\program\src_dos\libs\bdatos\bdatos.hh"
#include "zorr.h"
#define NLINEAS_REF 18
BDatos BPrecios; // Base de datos de Precioserencias
INFO_ARTICULOS SPrecios; // Estructura de referencias
int OrdenPrecios;
extern CONFIG Config;
void RastreaFicheroGastosi(void);
void Error( int code );
void MuestraDatosPrecios( int RowStart );
int ComparaRegistrosPrecio( const void *A, const void *B );
void EditItemPrecios( char columna, int linea );
void PreciosNuevoRegistro( INFO_ARTICULOS *MSPrecios );
void MuestraPrecios( char columna, int linea, char como );
void ObtenCoordenadasPrecios( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 );
void OrdenaPrecios(void);
void ObtenCoordenadasMatchPr( char Row, int *X0, int *Y0, int *X1, int *Y1 );
void MatchDrawPrecios( char Row, INFO_ARTICULOS MPrecios, char como );
void BuscaPrecios( char TipoBusqueda, char *CurrRow, int *CurrPrecios );
int Match_Precios( INFO_ARTICULOS A, INFO_ARTICULOS B );
void EditMatchPrecios( char Row, INFO_ARTICULOS * MPrecios );
int ObtenMatchPrecios( INFO_ARTICULOS *MPrecios );
void ImprimePrecioserencias( char como );
void ImprimeCabeceraPrecios( char como, FILE *file_out );
void DibujaPantallaArticulos( void );
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û Parte principal del m¢dulo Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
/**************************************************************************\
|* *|
|* InfoProducto *|
|* *|
|* Descripci¢n: *|
|* Controla la introduccion de datos y muestreo asi como todo *|
|* el interfaz de usuario... *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ListaPrecios(void)
{
struct Boton_Texto BT[6];
BT[0].x = 1; BT[0].y = 1; strcpy( BT[0].Texto, " &Men£ Principal "); BT[0].ID_T1 = 0; BT[0].ID_T2 = 50;
BT[1].x = 20; BT[1].y = 1; strcpy( BT[1].Texto, " &Ins. Art."); BT[1].ID_T1 = 0; BT[1].ID_T2 = 23;
BT[2].x = 33; BT[2].y = 1; strcpy( BT[2].Texto, " &Borr. Art."); BT[2].ID_T1 = 0; BT[2].ID_T2 = 48;
BT[3].x = 47; BT[3].y = 1; strcpy( BT[3].Texto, " &Ordenar"); BT[3].ID_T1 = 0; BT[3].ID_T2 = 24;
BT[4].x = 58; BT[4].y = 1; strcpy( BT[4].Texto, " &Buscar"); BT[4].ID_T1 = 0; BT[4].ID_T2 = 48;
BT[5].x = 72; BT[5].y = 1; strcpy( BT[5].Texto, " Im&pr. "); BT[5].ID_T1 = 0; BT[5].ID_T2 = 25;
char buffer[100], ok = 0;
int BPush, key;
char oldCol;
char CurrRow; // Linea sobre la que estamos
char CurrCol; // Columna sobre la que estamos
int CurrPrecios; // Producto sobre el que estamos posicionados a golpes
_setcursortype( _NOCURSOR );
DibujaPantallaArticulos();
if ( BPrecios.AbrirReg( "Articulo.dbf", sizeof( INFO_ARTICULOS ) ) == ERROR )
Error(0x00);
// Si no hay registros, creamos uno almenos.
if ( BPrecios.Registros() == 0 )
{
PreciosNuevoRegistro( &SPrecios );
if ( BPrecios.InsReg( (void *)&SPrecios, BPrecios.Registros(), ARRIBA ) == ERROR )
Error(0x00);
}
CurrPrecios = 0; CurrRow = 0;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrRow + CurrPrecios );
if ( BPrecios.LeeReg( (void *)&SPrecios, 0 ) == ERROR )
Error(0x00);
CurrCol = 0; oldCol = -1;
do {
if ( CurrCol != oldCol )
{
oldCol = CurrCol;
}
MuestraPrecios( CurrCol, CurrRow, INTENSO );
BPush = Funcion_Botones(STD_BY, 6, BT);
MuestraPrecios( 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
if ( ( key = getch() ) != 13 && key != 27 )
ungetch( key );
EditItemPrecios( CurrCol, CurrRow );
_setcursortype( _NOCURSOR );
if ( BPrecios.EscribeReg( (void *)&SPrecios, (CurrRow + CurrPrecios) ) == ERROR )
Error(0x00);
while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER
break;
case -1: // Hay una tecla especial en BUFFER
switch( getch() )
{
// Flecha Izquierda
case 75:
case 15:
CurrCol--; if ( CurrCol < 0 ) CurrCol = 3;
break;
// Flecha Derecha
case 77:
case 9:
CurrCol++; if ( CurrCol > 3 ) CurrCol = 0;
break;
// Flecha Arriba
case 72:
if ( (CurrRow + CurrPrecios) > 0 )
{
if ( ( CurrRow ) <= 0 )
{
CurrRow = NLINEAS_REF - 1; CurrPrecios -= NLINEAS_REF;
if ( CurrPrecios < 0 ) CurrPrecios = 0;
while( ( CurrRow + CurrPrecios ) >= BPrecios.Registros() && CurrRow > 0 ) CurrRow--;
while( ( CurrRow + CurrPrecios ) >= BPrecios.Registros() && CurrPrecios > 0 ) CurrPrecios++;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrPrecios );
} else {
CurrRow --; if ( CurrRow < 0 ) CurrRow = 0;
}
}
if ( BPrecios.LeeReg( (void *)&SPrecios, (CurrPrecios + CurrRow) ) == ERROR )
Error(0x00);
break;
// Flecha Abajo
case 80:
if ( ( CurrRow + CurrPrecios ) < BPrecios.Registros() - 1 )
{
if ( ( CurrRow ) >= NLINEAS_REF - 1 )
{
CurrRow = 0; CurrPrecios += NLINEAS_REF;
while ( (CurrPrecios + CurrRow) >= BPrecios.Registros() ) CurrPrecios--;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrPrecios );
} else
CurrRow++;
}
if ( BPrecios.LeeReg( (void *)&SPrecios, (CurrPrecios + CurrRow) ) == ERROR )
Error(0x00);
break;
// Inicio
case 71:
CurrRow = 0;
if ( CurrPrecios != 0 )
{
CurrPrecios = 0;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrPrecios );
}
if ( BPrecios.LeeReg( (void *)&SPrecios, (CurrPrecios + CurrRow) ) == ERROR )
Error(0x00);
break;
// Fin
case 79:
CurrRow = 0;
if ( CurrPrecios != BPrecios.Registros() - NLINEAS_REF )
{
CurrPrecios = BPrecios.Registros() - NLINEAS_REF;
while( CurrPrecios >= BPrecios.Registros() ) CurrPrecios--;
if ( CurrPrecios < 0 )
{
CurrPrecios = 0;
CurrRow = BPrecios.Registros()-1;
}
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrPrecios );
}
if ( BPrecios.LeeReg( (void *)&SPrecios, (CurrPrecios + CurrRow) ) == ERROR )
Error(0x00);
break;
// AvanceR pido
case 81:
CurrRow = 0; CurrPrecios += NLINEAS_REF;
while ( (CurrPrecios + CurrRow) >= BPrecios.Registros() ) CurrPrecios--;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrPrecios );
if ( BPrecios.LeeReg( (void *)&SPrecios, (CurrPrecios + CurrRow) ) == ERROR )
Error(0x00);
break;
// Retroceso R pido
case 73:
CurrRow = NLINEAS_REF - 1; CurrPrecios -= NLINEAS_REF;
if ( CurrPrecios < 0 ) CurrPrecios = 0;
while( ( CurrRow + CurrPrecios ) >= BPrecios.Registros() && CurrRow > 0 ) CurrRow--;
while( ( CurrRow + CurrPrecios ) >= BPrecios.Registros() && CurrPrecios > 0 ) CurrPrecios++;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrPrecios );
if ( BPrecios.LeeReg( (void *)&SPrecios, (CurrPrecios + CurrRow) ) == ERROR )
Error(0x00);
break;
// Gastos por proveedor
case 82:
BuscaPrecios( ATRAS, &CurrRow, &CurrPrecios );
break;
// Gastos por proveedor
case 83:
BuscaPrecios( ADELANTE, &CurrRow, &CurrPrecios );
break;
}
while( kbhit() ) getch(); // Limpiamos posibles teclas en BUFFER
break;
// Imprimir Lista de socios
case 6:
// MuestraImpresionesPrecios();
break;
// Menu Principal
case 1:
ok = 1;
break;
// Eliminar
case 3:
while( kbhit() ) getch();
if ( Optar( 1, "ATENCION", "Eliminar  un articulo", "confirme eliminacion", NULL ) )
{
if ( BPrecios.DelReg( CurrPrecios + CurrRow ) == ERROR )
Error(0x00);
if ( BPrecios.Registros() == 0 )
{
PreciosNuevoRegistro( &SPrecios );
if ( BPrecios.InsReg( (void *)&SPrecios, BPrecios.Registros(), ARRIBA ) == ERROR )
Error(0x00);
CurrRow = 0;
} else
// Si he borrado el £ltimo registro subo una linea
if ( (CurrPrecios+CurrRow) >= ( BPrecios.Registros() - 2 ) )
{
if ( (CurrRow + CurrPrecios) > 0 )
{
if ( ( CurrRow ) <= 0 )
{
CurrRow = NLINEAS_REF - 1; CurrPrecios -= NLINEAS_REF;
if ( CurrPrecios < 0 ) CurrPrecios = 0;
while( ( CurrRow + CurrPrecios ) >= BPrecios.Registros() && CurrRow > 0 ) CurrRow--;
while( ( CurrRow + CurrPrecios ) >= BPrecios.Registros() && CurrPrecios > 0 ) CurrPrecios++;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrPrecios );
} else {
CurrRow --; if ( CurrRow < 0 ) CurrRow = 0;
}
}
if ( BPrecios.LeeReg( (void *)&SPrecios, (CurrPrecios + CurrRow) ) == ERROR )
Error(0x00);
}
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrPrecios );
if ( BPrecios.LeeReg( (void *)&SPrecios, (CurrPrecios + CurrRow) ) == ERROR )
Error(0x00);
}
break;
// Insertar
case 2:
PreciosNuevoRegistro( &SPrecios );
if ( BPrecios.InsReg( (void *)&SPrecios, (CurrPrecios + CurrRow), ARRIBA ) == ERROR )
Error(0x00);
if ( ( CurrRow + CurrPrecios ) < BPrecios.Registros() - 1 )
{
if ( ( CurrRow ) >= NLINEAS_REF - 1 )
{
CurrRow = 0; CurrPrecios += NLINEAS_REF;
while ( (CurrPrecios + CurrRow) >= BPrecios.Registros() ) CurrPrecios--;
} else
CurrRow++;
}
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrPrecios );
if ( BPrecios.LeeReg( (void *)&SPrecios, (CurrPrecios + CurrRow) ) == ERROR )
Error(0x00);
break;
// Ordenar
case 4:
OrdenaPrecios();
CurrPrecios = 0; CurrRow = 0;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( CurrRow + CurrPrecios );
if ( BPrecios.LeeReg( (void *)&SPrecios, 0 ) == ERROR )
Error(0x00);
CurrCol = 0;
break;
// Gastos por proveedor
case 5:
BuscaPrecios( NUEVA_BUSQUEDA, &CurrRow, &CurrPrecios );
break;
default:
while( kbhit() ) getch();
break;
}
} while( !ok );
BPrecios.CerrarReg();
}
/**************************************************************************\
|* *|
|* MuestraDatosPrecios *|
|* *|
|* 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 MuestraDatosPrecios( int RowStart )
{
int linea, campo;
char dev;
// Imprimo la NLINEAS_REF que caben en la pantalla
dev = OK;
for ( linea=0; linea < NLINEAS_REF && dev == OK; linea++ )
{
dev = BPrecios.LeeReg( (void *)&SPrecios, RowStart + linea );
if ( dev == OK )
// Por cada linea hay 4 campos, ehhh!!!
for ( campo=0; campo < 4; campo++ )
MuestraPrecios( campo, linea, NORMAL );
}
// Ahora limpio los restantes huecos si los hay
if ( dev != OK )
{
linea--;
textbackground( BLACK );
textcolor( WHITE );
for ( ; linea < NLINEAS_REF; linea++ )
gotoxy( 1, linea + 6 );
cprintf( "³ ³ ³ ³ ³");
}
}
/**************************************************************************\
|* *|
|* MuestraPrecios *|
|* *|
|* 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 MuestraPrecios( char columna, int linea, char como )
{
char buffer[80];
char buffer1[80];
int X0, Y0, X1, Y1;
ObtenCoordenadasPrecios( columna, linea, &X0, &Y0, &X1, &Y1 );
switch( columna )
{
// Articulo
case 0:
sprintf ( buffer, "%42s", (int)SPrecios.Articulo );
break;
// Precio Articulo
case 1:
formatea_u_long( SPrecios.Precio, buffer1 );
sprintf ( buffer, "%11s", buffer1 );
break;
// Precio Articulo2
case 2:
formatea_u_long( SPrecios.PrecioArt, buffer1 );
sprintf ( buffer, "%11s", buffer1 );
break;
// Ubicacion
case 3:
sprintf ( buffer, "%11s", SPrecios.Ubicacion );
break;
}
textbackground( ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI );
strnset( buffer1, 32, X1 );
textcolor( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI );
gotoxy( X0, Y0 );
cprintf( "%s", buffer );
}
/**************************************************************************\
|* *|
|* EditItemPrecios *|
|* *|
|* 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 EditItemPrecios( char columna, int linea )
{
char buffer[80];
int X0, Y0, X1, Y1;
ObtenCoordenadasPrecios( columna, linea, &X0, &Y0, &X1, &Y1 );
switch( columna )
{
// Articulo
case 0:
strcpy ( buffer, SPrecios.Articulo );
if ( !( InputCadenaG( buffer, 0, 42, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SPrecios.Articulo, buffer );
break;
// Precio Articulo
case 1:
sprintf ( buffer, "%ld", SPrecios.Precio );
if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
SPrecios.Precio = atol( buffer );
break;
// Precio Articulo
case 2:
sprintf ( buffer, "%ld", SPrecios.PrecioArt );
if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
SPrecios.PrecioArt = atol( buffer );
break;
// Ubicacion
case 3:
strcpy ( buffer, SPrecios.Ubicacion );
if ( !( InputCadenaG( buffer, 0, 11, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
strcpy ( SPrecios.Ubicacion, buffer );
break;
}
}
/**************************************************************************\
|* *|
|* ObtenCoordenadasPrecios *|
|* *|
|* 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 ObtenCoordenadasPrecios( char columna, char linea, int *X0, int *Y0, int *X1, int *Y1 )
{
// Calculamos la Y0, Y1 para la linea dada ( SOLO columna < 6 )
*Y0 = 6 + linea;
*Y1 = 6 + linea;
switch( columna )
{
case 0:
*X0 = 2; *X1 = 42;
break;
case 1:
*X0 = 45; *X1 = 11;
break;
case 2:
*X0 = 57; *X1 = 11;
break;
case 3:
*X0 = 69; *X1 = 11;
break;
}
}
/**************************************************************************\
|* *|
|* PreciosNuevoRegistro *|
|* *|
|* Descripci¢n: *|
|* Limpia el buffer, para un nuevo registro. *|
|* *|
|* Entradas: (ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void PreciosNuevoRegistro( INFO_ARTICULOS *NSPrecios )
{
NSPrecios -> Articulo[0] = '\0';
NSPrecios -> Ubicacion[0] = '\0';
NSPrecios -> Precio = 0;
NSPrecios -> PrecioArt = 0;
}
// ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
// Û Parte secundaria del m¢dulo Û
// Û Û
// Û Secci¢n de Busqueda de refecencias Û
// ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ
/**************************************************************************\
|* *|
|* MuestraImpresionesRed *|
|* *|
|* Descripci¢n: *|
|* Muestra un cuadro con las distintas opciones de impresi¢n *|
|* *|
|* Entradas:(ninguna) *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
/**************************************************************************\
|* *|
|* ImprimePrecioserencias *|
|* *|
|* Descripci¢n: *|
|* Imprime todas las referencias seg£n se le indique *|
|* *|
|* Entradas: *|
|* Como imprimir las referencias *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ImprimePrecioserencias( char como )
{
long i, old_reg;
FILE *file_out;
old_reg = BPrecios.RegActual();
if ( !Config.Printer )
{
if ( ( file_out = fopen( Config.PrintTo, "w" ) ) == NULL )
return;
} else
file_out = stdprn;
ImprimeCabeceraPrecios( como, file_out );
for ( i=0; i<BPrecios.Registros(); i++ )
{
BPrecios.LeeReg( (void *)&SPrecios, i );
switch( como )
{
/*
// Listado R pido
case 1:
formatea_u_long( (unsigned long)SPrecios.CantUnitaria, buffer );
fprintf( file_out, "%9lu %-30s %-6s ", SPrecios.CodigoR, SPrecios.Descripcion, buffer );
formatea_u_long( (unsigned long)SPrecios.PrecioCosto, buffer );
fprintf( file_out, "%-7s ", buffer );
formatea_u_long( (unsigned long)SPrecios.PrecioVenta[0], buffer );
fprintf( file_out, "%-7s %-10s\n\r", buffer, SPrecios.Combinado ? "Combinado" : "" );
break;
// Listado Completo
case 2:
formatea_u_long( (unsigned long)SPrecios.CantUnitaria, buffer );
fprintf( file_out, "%9lu %-30s %-6s ", SPrecios.CodigoR, SPrecios.Descripcion, buffer );
formatea_u_long( (unsigned long)SPrecios.PrecioCosto, buffer );
fprintf( file_out, "%-7s ", buffer );
formatea_u_long( (unsigned long)SPrecios.PrecioVenta[0], buffer );
fprintf( file_out, "%-7s %-10s\n\r", buffer, SPrecios.Combinado ? "Combinado" : "" );
if ( SPrecios.Combinado )
{
for ( j=0; j<10; j++ )
if ( SPrecios.CodigosAsociados[j] != 0 )
fprintf( file_out, " %-7s %9lu", j < 4 ? SPrecios.PrecioVenta[j+1] : 0, SPrecios.CodigosAsociados[j] );
}
break;
// C¢digos de barra
case 3:
break;
*/
}
}
if ( !Config.Printer )
fclose( file_out );
BPrecios.LeeReg( (void *)&SPrecios, old_reg );
}
void ImprimeCabeceraPrecios( char como, FILE *file_out )
{
switch( como )
{
// Listado R pido
case 1:
fprintf( file_out, "C¢digo Proveedor Cant.Unt P.Costo P.Venta Combinado\n\r" );
break;
// Listado Completo
case 2:
fprintf( file_out, "C¢digo Proveedor Cant.Unt P.Costo P.Venta Cod. Combinado\n\r" );
break;
// C¢digos de barra
case 3:
break;
}
}
void DibujaPantallaArticulos(void)
{
int i;
textcolor( WHITE );
textbackground( BLACK );
// 145678 123456789-123456789-123 12345 345.789 123.123.123 123456789-123456789-
cprintf( "\r ");
cprintf( " ");
cprintf( "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄ¿");
cprintf( "³ Articulo ³ P no Soc ³ P. Soc ³ Ubicaci¢n ³");
cprintf( "ÃÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÄ´");
for ( i=0; i<18; i++ )
cprintf( "³ ³ ³ ³ ³");
cprintf( "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÁÄÄÄÄÄÄÄÄÄÄÄÙ");
}
int ComparaRegistrosPrecio( const void *A, const void *B )
{
// Tipos de ordenaciones posibles
switch( OrdenPrecios )
{
// Por Precio
case 3:
if ( ( ((INFO_ARTICULOS *)A) -> Precio ) < ( ((INFO_ARTICULOS *)B) -> Precio ) ) return -1;
if ( ( ((INFO_ARTICULOS *)A) -> Precio ) == ( ((INFO_ARTICULOS *)B) -> Precio ) ) return 0;
if ( ( ((INFO_ARTICULOS *)A) -> Precio ) > ( ((INFO_ARTICULOS *)B) -> Precio ) ) return 1;
break;
// Por Precio
case 2:
return strcmpi( ( ((INFO_ARTICULOS *)A) -> Articulo ), ( ((INFO_ARTICULOS *)B) -> Articulo ) );
case 1:
return strcmpi( ( ((INFO_ARTICULOS *)A) -> Ubicacion ), ( ((INFO_ARTICULOS *)B) -> Ubicacion ) );
}
return -1;
}
void OrdenaPrecios(void)
{
/*
BDatos BPrecios; // Base de datos de Precioserencias
INFO_ARTICULOS SPrecios; // Estructura de referencias
int OrdenPrecios;
*/
struct Boton_Texto BT[4];
int devolver;
BT[0].x = 32; BT[0].y = 9; strcpy( BT[0].Texto, " &Ubicacion "); BT[0].ID_T1 = 0; BT[0].ID_T2 = 0;
BT[1].x = 32; BT[1].y = 11; strcpy( BT[1].Texto, " &Nombre de Articulo"); BT[1].ID_T1 = 0; BT[1].ID_T2 = 0;
BT[2].x = 32; BT[2].y = 13; strcpy( BT[2].Texto, " &Precio de Articulo"); BT[2].ID_T1 = 0; BT[2].ID_T2 = 0;
BT[3].x = 32; BT[3].y = 15; strcpy( BT[3].Texto, " &Cancelar operacion"); BT[3].ID_T1 = 0; BT[3].ID_T2 = 0;
Optar( ENCUADRE, "Elija orden a seguir", NULL );
while( ( devolver = Funcion_Botones(STD_BY, 4, BT) ) < 1 || devolver > 4 ) while ( kbhit() ) getch();
if ( devolver != 4 )
{
OrdenPrecios = devolver;
BPrecios.SortReg( ComparaRegistrosPrecio );
}
Optar( ENCUADRE, NULL );
}
/**************************************************************************\
|* *|
|* BuscaPrecios *|
|* *|
|* 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 BuscaPrecios( char TipoBusqueda, char *CurrRow, int *CurrPrecios )
{
static INFO_ARTICULOS MPrecios;
char enc; long i;
switch ( TipoBusqueda )
{
case NUEVA_BUSQUEDA:
if ( ObtenMatchPrecios( &MPrecios ) != OK )
return;
i = 0;
break;
case ATRAS:
case ADELANTE:
i = ( *CurrRow + *CurrPrecios )+TipoBusqueda;
if ( i < 0 || i >= BPrecios.Registros() ) return;
break;
}
Optar( ENCUADRE, "Comando: Buscar", "Ahora se inica", "la busqueda elegida", NULL );
enc = 0;
while ( i < BPrecios.Registros() && !enc )
{
if ( BPrecios.LeeReg( (void *)&SPrecios, i ) == ERROR )
Error( 0x00 );
if ( Match_Precios( SPrecios, MPrecios ) )
enc = 1;
else
i++;
}
Optar( ENCUADRE, NULL );
if ( enc )
{
*CurrRow = 0; *CurrPrecios = i;
// Mostramos datos hasta que se nos acabe la pantalla
MuestraDatosPrecios( *CurrRow + *CurrPrecios );
if ( BPrecios.LeeReg( (void *)&SPrecios, 0 ) == ERROR )
Error(0x00);
} 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 ( BPrecios.LeeReg( (void *)&SPrecios, (*CurrRow + *CurrPrecios) ) == ERROR )
Error( 0x00 );
}
/**************************************************************************\
|* *|
|* Match_Precios *|
|* *|
|* Descripci¢n: *|
|* Compara dos registros y devuelve la posible coincidencia *|
|* *|
|* Entradas: *|
|* Registros a comparar *|
|* *|
|* Salidas: *|
|* Resultado de la comparaci¢n *|
|* *|
\**************************************************************************/
int Match_Precios( INFO_ARTICULOS A, INFO_ARTICULOS B )
{
if ( B.Precio != 0 )
return (A.Precio == B.Precio );
if ( B.Articulo[0] != '\0' )
return ( strncmpi( A.Articulo, B.Articulo, strlen( B.Articulo ) ) == 0 );
if ( B.Ubicacion[0] != '\0' )
return ( strncmpi( A.Ubicacion, B.Ubicacion, strlen( B.Ubicacion ) ) == 0 );
return 0;
}
/**************************************************************************\
|* *|
|* ObtenMatchPrecios *|
|* *|
|* 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 ObtenMatchPrecios( INFO_ARTICULOS *MPrecios )
{
struct Boton_Texto BT[6];
BT[0].x = 22; BT[0].y = 15; strcpy( BT[0].Texto, " &Aceptar "); BT[0].ID_T1 = 00; BT[0].ID_T2 = 0;
BT[1].x = 51; BT[1].y = 15; strcpy( BT[1].Texto, " &Cancelar"); BT[1].ID_T1 = 00; BT[1].ID_T2 = 0;
char Row, ok, i;
int BPush, key, DEV;
Optar( ENCUADRE, "Comando: Buscar", "Articulo: ", "Precio: ", "Ubicaci¢n: ", NULL );
ok = 0; Row = 0;
PreciosNuevoRegistro( MPrecios );
do
{
MatchDrawPrecios(Row, *MPrecios, INTENSO);
BPush = Funcion_Botones(STD_BY, 2, BT);
MatchDrawPrecios(Row, *MPrecios, 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 );
EditMatchPrecios( Row, MPrecios );
for ( i=0; i < 6; i++ )
MatchDrawPrecios(i, *MPrecios, NORMAL);
break;
case -1:
switch ( getch() )
{
// Flecha Izquierda
case 75:
case 15:
// Flecha Arriba
case 72:
Row--; if ( Row < 0 ) Row = 2;
break;
// Flecha Derecha
case 77:
case 9:
// Flecha Abajo
case 80:
Row++; if ( Row > 2 ) Row = 0;
break;
}
break;
case 1:
DEV = OK; ok = 1;
break;
case 2:
DEV = ERROR; ok = 1;
break;
}
} while ( !ok );
Optar( ENCUADRE, NULL );
return DEV;
}
/**************************************************************************\
|* *|
|* EditMatchPrecios *|
|* *|
|* Descripci¢n: *|
|* Edita el patron de busqueda *|
|* *|
|* Entradas: *|
|* Campo a editar, y lugar donde almacenarlo *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void EditMatchPrecios( char Row, INFO_ARTICULOS * MPrecios )
{
int X0, Y0, X1, Y1;
char buffer[80];
ObtenCoordenadasMatchPr( Row, &X0, &Y0, &X1, &Y1 );
switch( Row )
{
case 1:
sprintf( buffer, "%lu", MPrecios -> Precio );
if ( !( InputCadenaG( buffer, 1, 9, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
{
PreciosNuevoRegistro( MPrecios );
MPrecios -> Precio = atol(buffer);
}
break;
case 0:
strcpy( buffer, MPrecios -> Articulo );
if ( !( InputCadenaG( buffer, 0, 20, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
{
PreciosNuevoRegistro( MPrecios );
strcpy ( MPrecios -> Articulo, buffer );
}
break;
case 2:
strcpy( buffer, MPrecios -> Ubicacion );
if ( !( InputCadenaG( buffer, 0, 15, Config.TxtBgN, Config.TxtFgN, X0, Y0, X1, Y1) >> 8 ) )
{
PreciosNuevoRegistro( MPrecios );
strcpy ( MPrecios -> Ubicacion, buffer );
}
break;
}
}
/**************************************************************************\
|* *|
|* MatchDrawPrecios *|
|* *|
|* 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 MatchDrawPrecios( char Row, INFO_ARTICULOS MPrecios, char como )
{
int X0, Y0, X1, Y1;
char buffer[80], buffer1[80];
ObtenCoordenadasMatchPr( Row, &X0, &Y0, &X1, &Y1 );
switch( Row )
{
case 1:
sprintf( buffer, " %9ld", MPrecios.Precio );
break;
case 0:
sprintf( buffer, "%15s", MPrecios.Articulo );
break;
case 2:
sprintf( buffer, "%20s", MPrecios.Ubicacion );
break;
}
textbackground( ( como == NORMAL ) ? Config.TxtBgN : Config.TxtBgI );
textcolor ( ( como == NORMAL ) ? Config.TxtFgN : Config.TxtFgI );
gotoxy( X0, Y0 );
cprintf( "%s", buffer );
}
/**************************************************************************\
|* *|
|* MatchDrawPrecios *|
|* *|
|* Descripci¢n: *|
|* Obtiene las coordenadas relativas al campo dado. *|
|* *|
|* Entradas: *|
|* Campo a obtener las coordenadas, y coordenadas de salida *|
|* *|
|* Salidas: (ninguna) *|
|* *|
\**************************************************************************/
void ObtenCoordenadasMatchPr( char Row, int *X0, int *Y0, int *X1, int *Y1 )
{
switch( Row )
{
case 0:
*X0 = 35; *X1 = 10;
*Y0 = 9; *Y1 = 9;
break;
case 1:
*X0 = 35; *X1 = 15;
*Y0 = 10; *Y1 = 10;
break;
case 2:
*X0 = 35; *X1 = 20;
*Y0 = 11; *Y1 = 11;
break;
}
}