First commit 27/02/2001
This commit is contained in:
232
expansor.cpp
Normal file
232
expansor.cpp
Normal file
@ -0,0 +1,232 @@
|
||||
#include <vcl\math.hpp>
|
||||
#include <vcl\DB.hpp>
|
||||
#include <vcl\DBTables.hpp>
|
||||
|
||||
#include <iostream.h>
|
||||
#include <condefs.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <io.h>
|
||||
|
||||
#pragma hdrstop
|
||||
|
||||
int file_exists(char *filename);
|
||||
void Expande( char *Texto, char *Origen );
|
||||
int findTAG( FILE *handle, char *TAG );
|
||||
char * scanUntil( char *text, char Terminador );
|
||||
char * scanUntil( FILE *handle, char Terminador, char *buffer );
|
||||
|
||||
bool SinDecimales;
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
#pragma argsused
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
if ( argc < 3 )
|
||||
{
|
||||
cout << "Expansor de Datos\n";
|
||||
cout << "-----------------\n\n";
|
||||
cout << "Par<EFBFBD>metros insuficientes: [documento_a_expandir] [origen_de_datos] \n\n";
|
||||
cout << "<EXT ID=\"campo del id\" IDV=\"valor de concordancia\" C=\"campo a mostrar\"></EXT>\n\n";
|
||||
} else {
|
||||
|
||||
if ( argc == 4 ) SinDecimales = false; else SinDecimales = true;
|
||||
|
||||
if ( !file_exists( argv[1] ) )
|
||||
{
|
||||
cout << "El documento a expandir no existe: " << argv[1];
|
||||
} else {
|
||||
if ( !file_exists( argv[2] ) )
|
||||
{
|
||||
cout << "El origen de datos no existe: " << argv[2];
|
||||
} else
|
||||
Expande( argv[1], argv[2] );
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int file_exists(char *filename)
|
||||
{
|
||||
return (access(filename, 0) == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
<EXT ID="nombre del ID" IDV="valor que debe tener" C="campo de resultados"></EXT>
|
||||
|
||||
opcionalmente: F="1.16" (factor de multiplicaci<63>n)
|
||||
*/
|
||||
void Expande( char *Texto, char *Origen )
|
||||
{
|
||||
FILE *handle; char digit, buffer[80], *buff;
|
||||
AnsiString IDnombre, IDvalor, Campo_n, FactorM, dev;
|
||||
float Factor;
|
||||
|
||||
buffer[79] = '\0';
|
||||
|
||||
TTable *TbOrigen;
|
||||
|
||||
TbOrigen = new TTable(0);
|
||||
|
||||
TbOrigen->TableName = AnsiString( Origen );
|
||||
try {
|
||||
TbOrigen->Active = true;
|
||||
} catch(...) {
|
||||
puts( "\nERROR GRABE ABRIENDO ORIGEN\n" );
|
||||
return;
|
||||
}
|
||||
|
||||
if ( (handle = fopen( Texto, "r") ) == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
while ( !feof( handle ) )
|
||||
{
|
||||
if ( findTAG( handle, "<EXT ID=\"" ) )
|
||||
{
|
||||
IDnombre = AnsiString( scanUntil( handle, '\"', buffer ) );
|
||||
findTAG( handle, "IDV=\"" );
|
||||
IDvalor = AnsiString( scanUntil( handle, '\"', buffer ) );
|
||||
findTAG( handle, "C=\"" );
|
||||
Campo_n = AnsiString( scanUntil( handle, '\"', buffer ) );
|
||||
|
||||
scanUntil( handle, '>', buffer ); // Buscamos en buffer si hay par<61>metros opcionales
|
||||
FactorM = AnsiString( buffer );
|
||||
digit = FactorM.Pos( "F=\"" );
|
||||
|
||||
|
||||
if ( TbOrigen->FindField( Campo_n ) == NULL )
|
||||
{
|
||||
dev = "ERROR ACCEDIENDO AL DESTINO: " + Campo_n + " ";
|
||||
} else {
|
||||
|
||||
// Buscamos en la base de datos y...
|
||||
try {
|
||||
if ( !TbOrigen->Locate( IDnombre, IDvalor, TLocateOptions() << loCaseInsensitive ) )
|
||||
dev = "Valor: " + IDvalor + " no encontrado en: " + IDnombre + " ";
|
||||
} catch(...) {
|
||||
dev = "ERROR ACCEDIENDO AL CAMPO: " + IDnombre + " ";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ( digit )
|
||||
{
|
||||
StrLCopy( buffer, (FactorM.SubString( digit+3, FactorM.Length() - digit+1 ) ).c_str(), 79 );
|
||||
scanUntil( buffer, '\"' );
|
||||
try {
|
||||
Factor = atof( buffer );
|
||||
}catch(...){
|
||||
dev = "El campo FACTOR debe ser num<75>rico";
|
||||
}
|
||||
|
||||
//Aplicamos el Valor del campo deseado X el factor de escala
|
||||
try {
|
||||
if ( TbOrigen->FindField( Campo_n ) != NULL )
|
||||
{
|
||||
dev = TbOrigen->FieldByName( Campo_n )->AsString;
|
||||
if ( SinDecimales )
|
||||
dev = FormatCurr( "###,###,##0;0; ", dev.ToDouble() * Factor );
|
||||
//AnsiString( Ceil( dev.ToDouble() * Factor) );
|
||||
else
|
||||
dev = FormatCurr( "###,###,###.#0;0; ", dev.ToDouble() * Factor );
|
||||
}
|
||||
} catch( ... ) {
|
||||
dev = "El campo: "+Campo_n+" no es NUMERICO ";
|
||||
}
|
||||
|
||||
} else {
|
||||
//Soltamos el Valor del campo deseado
|
||||
if ( TbOrigen->FindField( Campo_n ) != NULL )
|
||||
dev = TbOrigen->FieldByName( Campo_n )->AsString;
|
||||
}
|
||||
|
||||
printf( "%s", dev.c_str() );
|
||||
|
||||
findTAG( handle, "</EXT>" );
|
||||
}
|
||||
}
|
||||
|
||||
fclose(handle);
|
||||
|
||||
TbOrigen->Active = false;
|
||||
delete TbOrigen;
|
||||
|
||||
}
|
||||
|
||||
char * scanUntil( FILE *handle, char Terminador, char *buffer )
|
||||
{
|
||||
char digit;
|
||||
char *buff;
|
||||
int count;
|
||||
|
||||
count = 0;
|
||||
buff = buffer;
|
||||
digit = fgetc( handle );
|
||||
while ( !feof( handle ) && digit != Terminador && count<32 )
|
||||
{
|
||||
*buff = digit;
|
||||
buff ++;
|
||||
count ++;
|
||||
digit = fgetc( handle );
|
||||
}
|
||||
*buff = '\0';
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
char * scanUntil( char *text, char Terminador )
|
||||
{
|
||||
char *buff;
|
||||
|
||||
buff = text;
|
||||
|
||||
while ( *buff != '\0' && *buff != Terminador )
|
||||
buff++;
|
||||
|
||||
*buff = '\0';
|
||||
|
||||
return buff;
|
||||
}
|
||||
|
||||
int findTAG( FILE *handle, char *TAG )
|
||||
{
|
||||
char digit; char *TAG2, *TAG3;
|
||||
|
||||
do {
|
||||
TAG2 = TAG;
|
||||
digit = fgetc( handle );
|
||||
while( digit != *TAG2 && !feof(handle) )
|
||||
{
|
||||
fputchar( digit );
|
||||
digit = fgetc( handle );
|
||||
}
|
||||
|
||||
while( digit == *TAG2 && !feof( handle ) )
|
||||
{
|
||||
TAG2++;
|
||||
if ( *TAG2 != '\0' )
|
||||
digit = fgetc( handle );
|
||||
}
|
||||
|
||||
if ( *TAG2 != '\0' )
|
||||
{
|
||||
TAG3 = TAG;
|
||||
while ( TAG3 != TAG2 )
|
||||
{
|
||||
fputchar( *TAG3 );
|
||||
TAG3++;
|
||||
}
|
||||
fputchar( digit );
|
||||
if ( feof( handle ) )
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
} while( 1 );
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user