campo-sirio/ba/ba5300.cpp
alex 981678913a Patch level : 2.0.369
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
Riportata la versione P@rtners  2.0 patch 349


git-svn-id: svn://10.65.10.50/trunk@10709 c028cbd2-c16b-5b4b-a496-9718f37d4682
2002-12-20 17:08:30 +00:00

257 lines
6.2 KiB
C++
Executable File

#include <applicat.h>
#include <filetext.h>
#include <comuni.h>
#include "ba5300.h"
#define TABBAN_INDIR "S2"
#define TABBAN_NCIVICO "S7"
#define TABBAN_CODCOM "S5"
#define TABBAN_CAP "S3"
const char* cap2comune(const TString& field, const TString& denom);
const char* denom2comune(const TString& field, const char * stato=NULL);
const char* denom2com_alt(const TString& dencom, const char * stato=NULL);
bool confr_nomicomune(const TString & com1, const TString & com2);
class TABICAB_file : public TFile_text
{
int spezza_indirizzo(TString & indir,TString & ncivico);
protected:
// virtual void validate(TCursor& cur, TRecord_text &rec, TToken_string &val, TString& str)
virtual void preformat_field(const TFieldref&field,TString &str,TRelation& rel,const TString & tipo_tr);
virtual bool pre_writerel(TRelation& rel,const TRecord_text& rec);
public:
TABICAB_file(const char * path);
virtual ~TABICAB_file() {}
};
TABICAB_file::TABICAB_file(const char * path):
TFile_text(path, "ba5300.ini")
{
}
void TABICAB_file::preformat_field(const TFieldref&field,TString &str,TRelation& rel,const TString & tipo_tr)
{
if ((tipo_tr==TRACCIATO_ABI && field.name()=="S0") ||
(tipo_tr==TRACCIATO_DENCAB && field.name()=="S0")||
(tipo_tr==TRACCIATO_CAB && field.name()=="S3")
)
// ho già composto la chiave; cerco il record
rel.read();
}
bool TABICAB_file::pre_writerel(TRelation& rel,const TRecord_text& rec)
{
bool can_write=TRUE;
TRectype & curr_rec=rel.lfile().curr();
if (rec.type()==TRACCIATO_CAB)
{
// ***** check indirizzo/Ncivico
TString indir(rec.row(TXTCAB_INDIRIZZO));
TString nciv;
spezza_indirizzo(indir,nciv);
curr_rec.put(TABBAN_INDIR,indir);
curr_rec.put(TABBAN_NCIVICO,nciv);
// ***** check codice comune
TString codcomune(cap2comune(rec.row(TXTCAB_CAP),rec.row(TXTCAB_COMUNE)));
if (codcomune.empty())
codcomune=denom2comune(rec.row(TXTCAB_COMUNE) );
curr_rec.put(TABBAN_CODCOM, codcomune);
}
return can_write;
}
int TABICAB_file::spezza_indirizzo(TString & indir,TString & ncivico)
{
int last_c=indir.len();
//while (last_c && indir[last_c]>='0' && )
return last_c;
}
static TString16 tmp_cod_com;
// Cerca il cap e se lo trova controlla i primi caratteri della denominazione
const char* cap2comune(const TString& val_cap, const TString& dencom )
{
TString cap = val_cap;
if (!cap.empty())
{
TLocalisamfile comuni (LF_COMUNI);
bool trovato = FALSE;
bool prima_volta = TRUE;
tmp_cod_com = "";
// correzione CAP
if (cap.sub(2,3) == "1")
{
cap = cap.sub(0,3);
cap << "00";
}
comuni.setkey(3);
comuni.zero();
comuni.put(COM_CAPCOM, cap);
TRectype com (comuni.curr());
for (comuni.read(_isgteq); !comuni.eof(); comuni.next())
{
if (comuni.curr() != com) break;
TString d (comuni.get(COM_DENCOM));
if (prima_volta)
{
tmp_cod_com = comuni.get(COM_COM);
prima_volta = FALSE;
}
trovato = TRUE;
for (int i = 0; d[i]>='a' && d[i]<='z' || d[i]>='A' && d[i]<='Z' ; i++)
{
if (dencom[i] != d[i])
{
trovato = FALSE;
break;
}
}
if (trovato)
{
tmp_cod_com = comuni.get(COM_COM);
break;
}
else
continue;
}
if (!trovato)
tmp_cod_com.cut(0);
}
return tmp_cod_com;
}
const char* denom2comune(const TString& dencom, const char * stato)
{
tmp_cod_com.cut(0);
if (!dencom.empty())
{
TLocalisamfile comuni (LF_COMUNI);
comuni.setkey(2);
comuni.zero();
comuni.put(COM_DENCOM, dencom);
if (comuni.read()==NOERR
&& !((stato && comuni.get(COM_STATO)!=stato) || comuni.get(COM_STATO)!="") )
tmp_cod_com = comuni.get(COM_COM);
}
return tmp_cod_com;
}
// denominazioni di comuni alternative
const char* denom2com_alt(const TString& dencom, const char * stato)
{
tmp_cod_com.cut(0);
if (!dencom.empty())
{
bool prima_volta = TRUE;
TLocalisamfile comuni (LF_COMUNI);
comuni.setkey(2);
comuni.zero();
comuni.put(COM_DENCOM, dencom);
for (comuni.read(_isgteq); !comuni.eof(); comuni.next())
{
if (prima_volta)
{
prima_volta=FALSE;
}
if (confr_nomicomune(comuni.get(COM_DENCOM),dencom)
&& !((stato && comuni.get(COM_STATO)!=stato) || comuni.get(COM_STATO)!=""))
tmp_cod_com = comuni.get(COM_COM);
}
}
return tmp_cod_com;
}
bool confr_nomicomune(const TString & com1, const TString & com2)
{
return TRUE;
}
class TRicezioneABICAB : public TSkeleton_application
{
void ricevi(const char *, bool abi, bool cab, bool cab_futuri, const char * filtro_reg);
protected:
virtual void main_loop();
virtual bool create();
virtual bool destroy();
public:
TRicezioneABICAB()
{}
virtual ~TRicezioneABICAB()
{}
};
bool TRicezioneABICAB::create()
{
return TSkeleton_application::create();
}
bool TRicezioneABICAB::destroy()
{
return TSkeleton_application::destroy();
}
void TRicezioneABICAB::main_loop()
{
// open mask and get parameters
// receive
ricevi("c:\\piazze", TRUE, TRUE, TRUE,"RE");
}
void TRicezioneABICAB::ricevi(const char * path, bool abi, bool cab, bool cab_futuri, const char * filtro_prov)
{
TABICAB_file abicab(path);
TRecord_text txtrec;
abicab.open();
abicab.set_curr(txtrec);
while (abicab.read()==NOERR)
{
if (abicab.curr().type()==TRACCIATO_ABI && abi ||
(abicab.curr().type()==TRACCIATO_CAB || abicab.curr().type()==TRACCIATO_DENCAB) && cab
)
if (abicab.curr().type()==TRACCIATO_CAB && abi)
{
// filtro i CAB della provincia
if (filtro_prov && *filtro_prov
&& abicab.curr().row(TXTCAB_PROV)!=filtro_prov)
{
continue;
}
// filtro i CAB di prossima apertura
if (!cab_futuri && abicab.curr().row(TXTCAB_EFFICIENZA)==E_PROSS_AP)
{
continue;
}
}
abicab.autosave(LF_TABCOM);
}
abicab.close();
}
int ba5300(int argc, char* argv[])
{
TRicezioneABICAB app;
app.run(argc,argv, TR("Ricezione ABI e CAB"));
return 0;
}