campo-sirio/at/at3600.cpp
luca faaac5e954 Patch level :
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :


git-svn-id: svn://10.65.10.50/trunk@18930 c028cbd2-c16b-5b4b-a496-9718f37d4682
2009-05-25 15:22:21 +00:00

938 lines
25 KiB
C++
Executable File

#include <applicat.h>
#include <mask.h>
#include <printer.h>
#include <progind.h>
#include <relation.h>
#include <urldefid.h>
#include <utility.h>
#include "at3.h"
// nomi campi maschera
#include "at3600a.h"
// nomi dei campi
#include "soggetti.h"
#include "donaz.h"
#include "atstatd.h"
#include "sezioni.h"
// classe per la definizione di una riga di statistica
class TRigaGruppo : public TObject
{
TString16 _gruppo, _rh;
TArray _valori;
protected:
const TRigaGruppo& copy(const TRigaGruppo& riga);
public:
const TString16 gruppo() const { return _gruppo; }
const TString16 rh() const { return _rh; }
TObject* dup() const { return new TRigaGruppo(*this); }
const TRigaGruppo& operator = (const TRigaGruppo& riga);
const real& operator [] (int colonna) const;
void aggiorna_valore(int colonna, const real& numero) ;
void azzera_valori();
// costruttore
TRigaGruppo(TString16 gruppo, TString16 rh) {_gruppo = gruppo; _rh = rh;}
// costruttore di copia
TRigaGruppo(const TRigaGruppo& riga) { copy(riga); }
virtual ~TRigaGruppo() {};
};
const TRigaGruppo& TRigaGruppo::copy(const TRigaGruppo& riga)
{
_gruppo = riga._gruppo;
_rh = riga._rh;
_valori = riga._valori;
return (*this);
}
const TRigaGruppo& TRigaGruppo::operator = (const TRigaGruppo& riga)
{
copy(riga);
return (*this);
}
const real& TRigaGruppo::operator [] (int colonna) const
{
real* valore = (real*)_valori.objptr(colonna);
if (valore == NULL)
return ZERO;
else
return *valore;
}
void TRigaGruppo::aggiorna_valore(int colonna, const real& numero)
{
real* valore = (real*)_valori.objptr(colonna);
if (valore == NULL)
_valori.add(new real(numero), colonna);
else
*valore += numero;
}
void TRigaGruppo::azzera_valori()
{
_valori.destroy();
}
class TStatDonGrRh : public TApplication
{
TMask* _msk;
TRelation* _rel;
TCursor* _cur;
TLocalisamfile* _sezioni;
TLocalisamfile* _soggetti;
TLocalisamfile* _donaz;
TLocalisamfile* _atstatd;
TDate _dataini, _datafin;
TString16 _tipodon1, _tipodon2, _tipodon3, _tipodon4, _tipodon5;
TAssoc_array* _colonne;
TArray _righe; // array per riepilogo donazioni
TString16 _sezini, _sotini, _sezfin, _sotfin;
TAssoc_array* _asoggetti;
bool _solotot, _pergruppo;
int _sezionistampate;
protected:
virtual bool create();
virtual bool destroy();
virtual bool menu(MENU_TAG m);
virtual TMask& get_mask() { return *_msk; }
virtual TRelation* get_relation() const { return _rel; }
int data2row(const TString16 gruppo, const TString16 rh);
bool riepilogo();
bool stampa();
bool crea_colonne();
bool crea_righe();
void azzera_righe();
void stampa_sezione(TString16 codsez, TString16 codsot);
void crea_intestazione();
public:
TStatDonGrRh() {}
};
HIDDEN inline TStatDonGrRh& app() { return (TStatDonGrRh&) main_app(); }
int TStatDonGrRh::data2row(const TString16 gruppo, const TString16 rh)
{
int igruppo = 0;
int irh = 0;
if (gruppo == "0")
igruppo = 1;
if (gruppo == "A")
igruppo = 2;
if (gruppo == "A1")
igruppo = 3;
if (gruppo == "A2")
igruppo = 4;
if (gruppo == "A1B")
igruppo = 5;
if (gruppo == "A2B")
igruppo = 6;
if (gruppo == "AB")
igruppo = 7;
if (gruppo == "B")
igruppo = 8;
if (rh == "POS")
irh = 1;
if (rh == "NEG")
irh = 2;
return igruppo*10 + irh;
}
bool TStatDonGrRh::crea_colonne()
{
_colonne->destroy();
real contatore(ZERO);
real* oggettodm = new real(contatore);
const char* indicedm = "DM"; // donazioni maschi
_colonne->add(indicedm,(TObject*)oggettodm);
const char* indicedf = "DF"; // donazioni femmine
contatore = contatore+1;
real* oggettodf = new real(contatore);
_colonne->add(indicedf,(TObject*)oggettodf);
const char* indicesm = "SM"; // soggetti maschi
contatore = contatore+1;
real* oggettosm = new real(contatore);
_colonne->add(indicesm,(TObject*)oggettosm);
const char* indicesf = "SF"; // soggetti femmine
contatore = contatore+1;
real* oggettosf = new real(contatore);
_colonne->add(indicesf,(TObject*)oggettosf);
return TRUE;
}
bool TStatDonGrRh::crea_righe()
{
TString16 gruppo, rh;
for (int igruppo=0;igruppo<=8;igruppo++)
{
switch (igruppo)
{
case 0 : gruppo = ""; break;
case 1 : gruppo = "0"; break;
case 2 : gruppo = "A"; break;
case 3 : gruppo = "A1"; break;
case 4 : gruppo = "A2"; break;
case 5 : gruppo = "A1B"; break;
case 6 : gruppo = "A2B"; break;
case 7 : gruppo = "AB"; break;
case 8 : gruppo = "B"; break;
}
for (int irh=0;irh <=2;irh++)
{
switch (irh)
{
case 1 : rh = "POS"; break;
case 2 : rh = "NEG"; break;
default : rh = " "; break;
}
_righe.add(new TRigaGruppo(gruppo, rh), data2row(gruppo, rh));
}
}
return _righe.items()>0;
}
bool TStatDonGrRh::create()
{
TApplication::create();
_msk = new TMask("at3600a");
_rel = new TRelation(LF_DONAZ);
_rel->add(LF_SOGGETTI, "CODICE==CODICE");
_soggetti = new TLocalisamfile(LF_SOGGETTI);
_donaz = new TLocalisamfile(LF_DONAZ);
_atstatd = new TLocalisamfile(LF_ATSTATD);
_sezioni = new TLocalisamfile(LF_SEZIONI);
_colonne = new TAssoc_array();
_asoggetti = new TAssoc_array();
dispatch_e_menu(BAR_ITEM_ID(1));
return TRUE;
}
bool TStatDonGrRh::destroy()
{
delete _asoggetti;
delete _colonne;
delete _sezioni;
delete _atstatd;
delete _donaz;
delete _soggetti;
delete _rel;
delete _msk;
return TApplication::destroy();
}
bool TStatDonGrRh::menu(MENU_TAG m)
{
TMask& msk = get_mask();
KEY tasto;
tasto = msk.run();
if (tasto == K_ENTER)
{
_dataini = msk.get(F_DATAINI);
_datafin = msk.get(F_DATAFIN);
_tipodon1 = msk.get(F_TIPODON1);
_tipodon2 = msk.get(F_TIPODON2);
_tipodon3 = msk.get(F_TIPODON3);
_tipodon4 = msk.get(F_TIPODON4);
_tipodon5 = msk.get(F_TIPODON5);
_pergruppo = msk.get_bool(F_PERGRUPPO);
_solotot = msk.get_bool(F_SOLOTOT);
_sezini = msk.get(F_SEZINI);
_sotini = msk.get(F_SOTINI);
_sezfin = msk.get(F_SEZFIN);
_sotfin = msk.get(F_SOTFIN);
if (riepilogo())
stampa();
}
return FALSE;
}
void TStatDonGrRh::crea_intestazione()
{
TPrintrow row;
TString256 sep;
sep = "STATISTICA DONAZIONI/DONATORI PER SESSO, GRUPPO E RH";
sep.center_just(80);
row.put(sep);
printer().setheaderline(2, row);
sep = "";
if (_tipodon1.not_empty())
{
sep << "Tipo ";
sep << _tipodon1;
}
if (_tipodon2.not_empty())
sep << ' ' << _tipodon2;
if (_tipodon3.not_empty())
sep << ' ' << _tipodon3;
if (_tipodon4.not_empty())
sep << ' ' << _tipodon4;
if (_tipodon5.not_empty())
sep << ' ' << _tipodon5;
if (_dataini.ok())
{
sep << " dal ";
sep << _dataini.string();
}
if (_datafin.ok())
{
sep << " al ";
sep << _datafin.string();
}
sep.center_just(80);
row.reset();
row.put(sep);
row.put("@>", 1);
row.put("Pag. @#", 70);
printer().setheaderline(3, row);
row.reset();
printer().setheaderline(4, row);
sep = "";
sep << "Gruppo/Rh Donazioni Donatori Donazioni/Donatori";
row.put(sep);
printer().setheaderline(5, row);
sep = "";
sep << " Maschi Femmine Totali Maschi Femmine Totali Maschi Femmine Totali";
row.reset();
row.put(sep);
printer().setheaderline(6, row);
sep = "";
sep.fill('-',80);
row.reset();
row.put(sep);
printer().setheaderline(7, row);
}
bool TStatDonGrRh::stampa()
{
if (printer().open())
{
_sezionistampate = 0;
crea_intestazione();
TRelation* relstat = new TRelation(LF_ATSTATD);
TCursor* curstat = new TCursor(relstat, "", 3);
TString16 oldsez = "**";
TString16 oldsot = "**";
double numero,numsog,numero2,numsog2;
TString16 actsez, actsot;
TString16 gruppo, rh;
long last = curstat->items();
for ( *curstat=0; curstat->pos() < last; ++(*curstat) )
{
actsez = curstat->curr().get(ATS_CODSEZ);
actsot = curstat->curr().get(ATS_CODSOT);
gruppo = curstat->curr().get(ATS_GRUPPO);
rh = curstat->curr().get(ATS_RH);
numero = (double)curstat->curr().get_int(ATS_NUMERO);
numsog = (double)curstat->curr().get_int(ATS_NUMPRIME);
numero2 = (double)curstat->curr().get_int(ATS_NUMERO2);
numsog2 = (double)curstat->curr().get_int(ATS_NUMPRIME2);
if (actsez != oldsez || actsot != oldsot)
{
if (oldsez != "**" && oldsot != "**")
{
stampa_sezione(oldsez,oldsot);
azzera_righe();
}
oldsez = actsez;
oldsot = actsot;
}
TRigaGruppo& riga = (TRigaGruppo&)_righe[data2row(gruppo,rh)];
const char* indicedm = "DM";
real& colonnadm = (real&)_colonne->find(indicedm);
real n = numero;
riga.aggiorna_valore((int) colonnadm.integer(),n);
const char* indicedf = "DF";
real& colonnadf = (real&)_colonne->find(indicedf);
n = numero2;
riga.aggiorna_valore((int) colonnadf.integer(),n);
const char* indicesm = "SM";
real& colonnasm = (real&)_colonne->find(indicesm);
n = numsog;
riga.aggiorna_valore((int) colonnasm.integer(),n);
const char* indicesf = "SF";
real& colonnasf = (real&)_colonne->find(indicesf);
n = numsog2;
riga.aggiorna_valore((int) colonnasf.integer(),n);
}
if (oldsez != "**" && oldsot != "**")
stampa_sezione(oldsez,oldsot);
delete curstat;
delete relstat;
printer().close();
return TRUE;
}
else
return FALSE;
}
void TStatDonGrRh::azzera_righe()
{
TString16 gruppo, rh;
for (int igruppo=0;igruppo<=8;igruppo++)
{
switch (igruppo)
{
case 0 : gruppo = ""; break;
case 1 : gruppo = "0"; break;
case 2 : gruppo = "A"; break;
case 3 : gruppo = "A1"; break;
case 4 : gruppo = "A2"; break;
case 5 : gruppo = "A1B"; break;
case 6 : gruppo = "A2B"; break;
case 7 : gruppo = "AB"; break;
case 8 : gruppo = "B"; break;
}
for (int irh=0;irh <=2;irh++)
{
switch (irh)
{
case 1 : rh = "POS"; break;
case 2 : rh = "NEG"; break;
default : rh = " "; break;
}
TRigaGruppo& riga = (TRigaGruppo&)_righe[data2row(gruppo,rh)];
riga.azzera_valori();
}
}
}
void TStatDonGrRh::stampa_sezione(TString16 codsez, TString16 codsot)
{
TPrintrow row;
TString256 rigastampa;
if (codsez == "ZZ" && codsot == "ZZ")
{
if (_sezionistampate != 1)
{
rigastampa = "";
rigastampa << "RIEPILOGO TOTALE SEZIONI DA " << _sezini << '/' << _sotini << " A " << _sezfin << '/' << _sotfin;
if (_pergruppo)
rigastampa << " - SOLO GRUPPI AZIENDALI";
}
}
else
{
_sezionistampate++;
if (_pergruppo)
{
rigastampa = "Gruppo aziendale ";
rigastampa << codsez;
rigastampa << codsot;
}
else
{
rigastampa = "Sezione: ";
rigastampa << codsez;
if (codsot.not_empty())
{
rigastampa << "/";
rigastampa << codsot;
}
rigastampa << " ";
TLocalisamfile sezioni(LF_SEZIONI);
sezioni.setkey(1);
sezioni.zero();
sezioni.put(SEZ_CODSEZ,codsez);
sezioni.put(SEZ_CODSOT,codsot);
if (sezioni.read() == NOERR)
{
TString80 den = sezioni.get(SEZ_DENSEZ);
rigastampa << den;
den = sezioni.get(SEZ_DENSOT);
if (den.not_empty())
{
rigastampa << "/";
rigastampa << den;
}
}
}
}
if ((codsez == "ZZ" && codsot == "ZZ" && _sezionistampate != 1) || (codsez != "ZZ"))
{
rigastampa.center_just(80);
row.put(rigastampa);
printer().setheaderline(1, row);
TRigaGruppo rigatotali(" "," ");
TString16 valore;
TString16 gruppo, rh;
real totsoggetti = ZERO;
real totdonazioni = ZERO;
for (int igruppo=0;igruppo<=8;igruppo++)
{
switch (igruppo)
{
case 0 : gruppo = ""; break;
case 1 : gruppo = "0"; break;
case 2 : gruppo = "A"; break;
case 3 : gruppo = "A1"; break;
case 4 : gruppo = "A2"; break;
case 5 : gruppo = "A1B"; break;
case 6 : gruppo = "A2B"; break;
case 7 : gruppo = "AB"; break;
case 8 : gruppo = "B"; break;
}
for (int irh=0;irh <=2;irh++)
{
switch (irh)
{
case 1 : rh = "POS"; break;
case 2 : rh = "NEG"; break;
default : rh = " "; break;
}
totsoggetti = ZERO;
totdonazioni = ZERO;
TRigaGruppo& riga = (TRigaGruppo&)_righe[data2row(gruppo,rh)];
row.reset();
rigastampa = "";
rigastampa << gruppo;
rigastampa << " ";
rigastampa << rh;
int pos = 12;
const char* indicedm = "DM";
real& colonnadm = (real&)_colonne->find(indicedm);
rigatotali.aggiorna_valore((int) colonnadm.integer(),riga[(int) colonnadm.integer()]);
totdonazioni+=riga[(int) colonnadm.integer()];
valore = "";
//valore.format("%8d",riga[(int) colonnadm.integer()].integer());
valore.format("%8s",riga[(int) colonnadm.integer()].string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
const char* indicedf = "DF";
real& colonnadf = (real&)_colonne->find(indicedf);
rigatotali.aggiorna_valore((int) colonnadf.integer(),riga[(int) colonnadf.integer()]);
totdonazioni+=riga[(int) colonnadf.integer()];
valore = "";
//valore.format("%8d",riga[(int) colonnadf.integer()].integer());
valore.format("%8s",riga[(int) colonnadf.integer()].string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
// stampo totale donazioni
valore = "";
//valore.format("%8d",totdonazioni.integer());
valore.format("%8s",totdonazioni.string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
const char* indicesm = "SM";
real& colonnasm = (real&)_colonne->find(indicesm);
totsoggetti+=riga[(int) colonnasm.integer()];
rigatotali.aggiorna_valore((int) colonnasm.integer(),riga[(int) colonnasm.integer()]);
valore = "";
//valore.format("%8d",riga[(int) colonnasm.integer()].integer());
valore.format("%8s",riga[(int) colonnasm.integer()].string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
const char* indicesf = "SF";
real& colonnasf = (real&)_colonne->find(indicesf);
totsoggetti+=riga[(int) colonnasf.integer()];
rigatotali.aggiorna_valore((int) colonnasf.integer(),riga[(int) colonnasf.integer()]);
valore = "";
//valore.format("%8d",riga[(int) colonnasf.integer()].integer());
valore.format("%8s",riga[(int) colonnasf.integer()].string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
// stampo totale donatori
valore = "";
//valore.format("%8d",totsoggetti.integer());
valore.format("%8s",totsoggetti.string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+14;
// percentuale
if (totsoggetti.integer()!=0)
{
// maschi
//if (riga[(int) colonnasm.integer()].integer() != 0)
if (riga[(int) colonnasm.integer()] != ZERO)
{
valore = "";
real perc = riga[(int) colonnadm.integer()] / riga[(int) colonnasm.integer()];
valore << perc.string(3,3);
rigastampa.overwrite((const char*)valore, pos);
}
pos = pos+8;
// femmine
//if (riga[(int) colonnasf.integer()].integer() != 0)
if (riga[(int) colonnasf.integer()] != ZERO)
{
valore = "";
real perc = riga[(int) colonnadf.integer()] / riga[(int) colonnasf.integer()];
valore << perc.string(3,3);
rigastampa.overwrite((const char*)valore, pos);
}
pos = pos+8;
// totale
valore = "";
real perc = totdonazioni / totsoggetti;
valore << perc.string(3,3);
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
if (totdonazioni!=0)
{
row.put((const char*) rigastampa);
printer().print(row);
}
}
}
// stampa totali per sezione
rigastampa = "";
rigastampa.fill('-',80);
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
rigastampa = "";
rigastampa = "Totale";
totsoggetti = ZERO;
totdonazioni = ZERO;
int pos = 12;
const char* indicedm = "DM";
real& colonnadm = (real&)_colonne->find(indicedm);
totdonazioni+=rigatotali[(int) colonnadm.integer()];
valore = "";
//valore.format("%8d",rigatotali[(int) colonnadm.integer()].integer());
valore.format("%8s",rigatotali[(int) colonnadm.integer()].string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
const char* indicedf = "DF";
real& colonnadf = (real&)_colonne->find(indicedf);
totdonazioni+=rigatotali[(int) colonnadf.integer()];
valore = "";
//valore.format("%8d",rigatotali[(int) colonnadf.integer()].integer());
valore.format("%8s",rigatotali[(int) colonnadf.integer()].string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
// stampo totale donazioni
valore = "";
//valore.format("%8d",totdonazioni.integer());
valore.format("%8s",totdonazioni.string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
const char* indicesm = "SM";
real& colonnasm = (real&)_colonne->find(indicesm);
totsoggetti+=rigatotali[(int) colonnasm.integer()];
valore = "";
//valore.format("%8d",rigatotali[(int) colonnasm.integer()].integer());
valore.format("%8s",rigatotali[(int) colonnasm.integer()].string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
const char* indicesf = "SF";
real& colonnasf = (real&)_colonne->find(indicesf);
totsoggetti+=rigatotali[(int) colonnasf.integer()];
valore = "";
//valore.format("%8d",rigatotali[(int) colonnasf.integer()].integer());
valore.format("%8s",rigatotali[(int) colonnasf.integer()].string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
// stampo totale donatori
valore = "";
//valore.format("%8d",totsoggetti.integer());
valore.format("%8s",totsoggetti.string());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+14;
// percentuale
//if (totsoggetti.integer()!=0)
if (totsoggetti!=ZERO)
{
// maschi
//if (rigatotali[(int) colonnasm.integer()].integer() != 0)
if (rigatotali[(int) colonnasm.integer()] != ZERO)
{
valore = "";
real perc = rigatotali[(int) colonnadm.integer()] / rigatotali[(int) colonnasm.integer()];
valore << perc.string(3,3);
rigastampa.overwrite((const char*)valore, pos);
}
pos = pos+8;
// femmine
//if (rigatotali[(int) colonnasf.integer()].integer() != 0)
if (rigatotali[(int) colonnasf.integer()] != ZERO)
{
valore = "";
real perc = rigatotali[(int) colonnadf.integer()] / rigatotali[(int) colonnasf.integer()];
valore << perc.string(3,3);
rigastampa.overwrite((const char*)valore, pos);
}
pos = pos+8;
// totale
valore = "";
real perc = totdonazioni / totsoggetti;
valore << perc.string(3,3);
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
row.put((const char*) rigastampa);
printer().print(row);
printer().formfeed();
}
}
bool TStatDonGrRh::riepilogo()
{
if (crea_colonne() && crea_righe())
{
_asoggetti->destroy();
// cancello i risultati della elaborazione precedente
TLocalisamfile stat(LF_ATSTATD);
for (stat.first(); !stat.eof(); stat.next())
stat.remove();
stat.setkey(3);
// filtro per data
TRectype da(LF_DONAZ);
TRectype a (LF_DONAZ);
if (_dataini.ok())
da.put(DON_DATADON, _dataini);
if (_datafin.ok())
a.put(DON_DATADON, _datafin);
_cur = new TCursor(_rel, "", 2, &da, &a);
TString256 filtro = "";
// filtro per sezione/sottogruppo
if (_sezini.not_empty())
{
if (_sotini.not_empty())
{
filtro << "(";
filtro << format("(92->CODSEZ > \"%s\")",(const char*)_sezini);
filtro << " || ";
filtro << "(" << format("(92->CODSEZ == \"%s\")",(const char*)_sezini);
filtro << " && ";
filtro << format("(92->CODSOT >= \"%s\")",(const char*)_sotini);
filtro << ")";
filtro << ")";
}
else
filtro << format("(92->CODSEZ >= \"%s\")",(const char*)_sezini);
}
if (_sezfin.not_empty())
{
if (filtro.not_empty())
filtro << " && ";
if (_sotfin.not_empty())
{
filtro << "(";
filtro << format("(92->CODSEZ < \"%s\")",(const char*)_sezfin);
filtro << " || ";
filtro << "(" << format("(92->CODSEZ == \"%s\")",(const char*)_sezfin);
filtro << " && ";
filtro << format("(92->CODSOT <= \"%s\")",(const char*)_sotfin);
filtro << ")";
filtro << ")";
}
else
filtro << format("(92->CODSEZ <= \"%s\")",(const char*)_sezfin);
}
// filtro per gruppi aziendali
if (_pergruppo)
{
if (filtro.not_empty())
filtro << " && ";
filtro << format("(90->GRUPPOAZIE != \"\")");
}
// filtro per tipo donazione
TString256 filtrotd = "";
if (_tipodon1.not_empty())
filtrotd << format("(92->TIPODON==\"%s\")",(const char*)_tipodon1);
if (_tipodon2.not_empty())
{
if (!filtrotd.empty())
filtrotd << " || ";
filtrotd << format("(92->TIPODON==\"%s\")",(const char*)_tipodon2);
}
if (_tipodon3.not_empty())
{
if (!filtrotd.empty())
filtrotd << " || ";
filtrotd << format("(92->TIPODON==\"%s\")",(const char*)_tipodon3);
}
if (_tipodon4.not_empty())
{
if (!filtrotd.empty())
filtrotd << " || ";
filtrotd << format("(92->TIPODON==\"%s\")",(const char*)_tipodon4);
}
if (_tipodon5.not_empty())
{
if (!filtrotd.empty())
filtrotd << " || ";
filtrotd << format("(92->TIPODON==\"%s\")",(const char*)_tipodon5);
}
if (!filtrotd.empty())
{
if (!filtro.empty())
filtro << " && ";
filtro << '(' << filtrotd << ')';
}
_cur->setfilter((const char*) filtro, TRUE);
TString16 codsez, codsot, tipodon, sesso, gruppoazie, gruppo, rh;
TDate datadon;
long numero;
bool esiste;
TRectype& recdon = _cur->curr();
TRectype& recsog = _cur->curr(LF_SOGGETTI);
long last = _cur->items();
TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30);
for ( *_cur=0; _cur->pos() < last; ++(*_cur) )
{
prg.addstatus(1);
const char* codice = recsog.get(SOG_CODICE);
if (_asoggetti->is_key(codice))
esiste = TRUE;
else
{
_asoggetti->add(codice);
esiste = FALSE;
}
if (_pergruppo)
{
gruppoazie = recsog.get(SOG_GRUPPOAZIE);
codsez = gruppoazie.sub(0,2);
codsot = gruppoazie.sub(2,4);
}
else
{
codsez = recdon.get(DON_CODSEZ);
codsot = recdon.get(DON_CODSOT);
if (codsez.empty())
{
codsez = recsog.get(SOG_CODSEZ);
codsot = recsog.get(SOG_CODSOT);
}
}
sesso = recsog.get(SOG_SESSO);
gruppo = recsog.get(SOG_GRUPPOAB0);
if (gruppo == "A1" || gruppo == "A2")
gruppo = "A";
if (gruppo == "A1B" || gruppo == "A2B")
gruppo = "AB";
rh = recsog.get(SOG_RHANTID);
if (!_solotot)
{
stat.zero();
stat.put(ATS_CODSEZ, codsez);
stat.put(ATS_CODSOT, codsot);
stat.put(ATS_GRUPPO, gruppo);
stat.put(ATS_RH, rh);
if (stat.read() == NOERR)
{
if (sesso == "1")
numero = stat.get_long(ATS_NUMERO);
else
numero = stat.get_long(ATS_NUMERO2);
numero++;
if (sesso == "1")
stat.put(ATS_NUMERO, numero);
else
stat.put(ATS_NUMERO2, numero);
if (!esiste)
{
if (sesso == "1")
numero = stat.get_long(ATS_NUMPRIME);
else
numero = stat.get_long(ATS_NUMPRIME2);
numero++;
if (sesso == "1")
stat.put(ATS_NUMPRIME, numero);
else
stat.put(ATS_NUMPRIME2, numero);
}
stat.rewrite();
}
else
{
stat.zero();
stat.put(ATS_CODSEZ, codsez);
stat.put(ATS_CODSOT, codsot);
stat.put(ATS_GRUPPO, gruppo);
stat.put(ATS_RH, rh);
numero = 1;
if (sesso == "1")
{
stat.put(ATS_NUMERO, numero);
stat.put(ATS_NUMPRIME, numero);
}
else
{
stat.put(ATS_NUMERO2, numero);
stat.put(ATS_NUMPRIME2, numero);
}
stat.write();
}
}
stat.zero();
stat.put(ATS_CODSEZ, "ZZ");
stat.put(ATS_CODSOT, "ZZ");
stat.put(ATS_GRUPPO, gruppo);
stat.put(ATS_RH, rh);
if (stat.read() == NOERR)
{
if (sesso == "1")
numero = stat.get_long(ATS_NUMERO);
else
numero = stat.get_long(ATS_NUMERO2);
numero++;
if (sesso == "1")
stat.put(ATS_NUMERO, numero);
else
stat.put(ATS_NUMERO2, numero);
if (!esiste)
{
if (sesso == "1")
numero = stat.get_long(ATS_NUMPRIME);
else
numero = stat.get_long(ATS_NUMPRIME2);
numero++;
if (sesso == "1")
stat.put(ATS_NUMPRIME, numero);
else
stat.put(ATS_NUMPRIME2, numero);
}
int err = stat.rewrite();
}
else
{
stat.zero();
stat.put(ATS_CODSEZ, "ZZ");
stat.put(ATS_CODSOT, "ZZ");
stat.put(ATS_GRUPPO, gruppo);
stat.put(ATS_RH, rh);
numero = 1;
if (sesso == "1")
{
stat.put(ATS_NUMERO, numero);
stat.put(ATS_NUMPRIME, numero);
}
else
{
stat.put(ATS_NUMERO2, numero);
stat.put(ATS_NUMPRIME2, numero);
}
int err = stat.write();
}
}
return (stat.eod() > 0);
}
else
return FALSE;
}
int at3600(int argc, char* argv[])
{
TStatDonGrRh a;
a.run(argc, argv, "Statistica donazioni/donatori");
return 0;
}