Aggiornamento versione al 4 febrraio 1998

git-svn-id: svn://10.65.10.50/trunk@6104 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
cris 1998-02-04 13:46:27 +00:00
parent b02d763ad0
commit edb0d968ed
80 changed files with 7679 additions and 1398 deletions

View File

@ -15,31 +15,32 @@
#define F_DESC_CATDON 111
#define F_DATAISC 112
#define F_DATADIM 113
#define F_DOM_INDIR 114
#define F_DOM_CODCOM 115
#define F_DOM_DENCOM 116
#define F_DOM_CAPCOM 117
#define F_DOM_PROVCOM 118
#define F_DOM_CODLOC 119
#define F_DOM_DENLOC 120
#define F_DOM_STRADA 121
#define F_DOM_DISTRI 122
#define F_RES_INDIR 123
#define F_RES_CODCOM 124
#define F_RES_DENCOM 125
#define F_RES_CAPCOM 126
#define F_RES_PROVCOM 127
#define F_RES_CODLOC 128
#define F_RES_DENLOC 129
#define F_COMNASC 130
#define F_DENCOMNASC 131
#define F_PROVCOMNASC 132
#define F_SESSO 133
#define F_CF 134
#define F_DOCID 135
#define F_TELABI 136
#define F_TELLAV 137
#define F_TELALT 138
#define F_COGNOME_SP 114
#define F_DOM_INDIR 115
#define F_DOM_CODCOM 116
#define F_DOM_DENCOM 117
#define F_DOM_CAPCOM 118
#define F_DOM_PROVCOM 119
#define F_DOM_CODLOC 120
#define F_DOM_DENLOC 121
#define F_DOM_STRADA 122
#define F_DOM_DISTRI 123
#define F_RES_INDIR 124
#define F_RES_CODCOM 125
#define F_RES_DENCOM 126
#define F_RES_CAPCOM 127
#define F_RES_PROVCOM 128
#define F_RES_CODLOC 129
#define F_RES_DENLOC 130
#define F_COMNASC 131
#define F_DENCOMNASC 132
#define F_PROVCOMNASC 133
#define F_SESSO 134
#define F_CF 135
#define F_DOCID 136
#define F_TELABI 137
#define F_TELLAV 138
#define F_TELALT 139
// pagina 2
#define F_CATNOND1 201

View File

@ -132,7 +132,7 @@ BEGIN
WARNING "Codice sezione assente"
END
STRING F_DENSEZ 24
STRING F_DENSEZ 30 24
BEGIN
PROMPT 12 6 ""
MESSAGE COPY,14@
@ -162,7 +162,7 @@ BEGIN
WARNING "Codice sottogruppo assente"
END
STRING F_DENSOT 24
STRING F_DENSOT 30 24
BEGIN
PROMPT 50 6 ""
MESSAGE COPY,16@
@ -220,30 +220,36 @@ BEGIN
PROMPT 1 9 "Dati anagrafici"
END
STRING F_COGNOME_SP 25
BEGIN
PROMPT 2 10 "Cognome da sposata "
FIELD COGNOME_SP
END
TEXT DLG_NULL
BEGIN
PROMPT 2 10 "Domicilio: "
PROMPT 2 11 "Domicilio: "
END
STRING F_DOM_INDIR 30
BEGIN
PROMPT 13 10 "Indirizzo "
PROMPT 13 11 "Indirizzo "
FIELD DOM_INDIR
END
STRING F_DOM_STRADA 5
BEGIN
PROMPT 55 10 "St. "
PROMPT 55 11 "St. "
END
STRING F_DOM_DISTRI 4
BEGIN
PROMPT 66 10 "Dist. "
PROMPT 66 11 "Dist. "
END
STRING F_DOM_CODCOM 4
BEGIN
PROMPT 13 11 "Comune "
PROMPT 13 12 "Comune "
FIELD DOM_CODCOM
FLAGS "U"
USE LF_COMUNI
@ -261,7 +267,7 @@ END
STRING F_DOM_DENCOM 50 30
BEGIN
PROMPT 30 11 ""
PROMPT 30 12 ""
USE LF_COMUNI KEY 2
INPUT DENCOM F_DOM_DENCOM
#include <comdden.h>
@ -273,7 +279,7 @@ END
STRING F_DOM_CODLOC 4
BEGIN
PROMPT 13 12 "Localita' "
PROMPT 13 13 "Localita' "
FIELD DOM_CODLOC
FLAGS "U"
USE LCP SELECT S7=#F_DOM_CODCOM
@ -292,7 +298,7 @@ END
STRING F_DOM_DENLOC 30
BEGIN
PROMPT 30 12 ""
PROMPT 30 13 ""
USE LCP KEY 2 SELECT S7=#F_DOM_CODCOM
INPUT S0 F_DOM_DENLOC
DISPLAY "Localita'@30" S0
@ -306,31 +312,31 @@ END
STRING F_DOM_CAPCOM 5
BEGIN
PROMPT 66 11 "CAP "
PROMPT 66 12 "CAP "
FIELD DOM_CAP
//FLAGS "D"
END
STRING F_DOM_PROVCOM 5
BEGIN
PROMPT 66 12 "Prov."
PROMPT 66 13 "Prov."
FLAGS "D"
END
TEXT DLG_NULL
BEGIN
PROMPT 2 13 "Residenza: "
PROMPT 2 14 "Residenza: "
END
STRING F_RES_INDIR 30
BEGIN
PROMPT 13 13 "Indirizzo "
PROMPT 13 14 "Indirizzo "
FIELD RES_INDIR
END
STRING F_RES_CODCOM 4
BEGIN
PROMPT 13 14 "Comune "
PROMPT 13 15 "Comune "
FIELD RES_CODCOM
FLAGS "U"
USE LF_COMUNI
@ -348,7 +354,7 @@ END
STRING F_RES_DENCOM 50 30
BEGIN
PROMPT 30 14 ""
PROMPT 30 15 ""
USE LF_COMUNI KEY 2
INPUT DENCOM F_RES_DENCOM
#include <comdden.h>
@ -360,7 +366,7 @@ END
STRING F_RES_CODLOC 4
BEGIN
PROMPT 13 15 "Localita' "
PROMPT 13 16 "Localita' "
FIELD RES_CODLOC
FLAGS "U"
USE LCP SELECT S7=#F_RES_CODLOC
@ -379,7 +385,7 @@ END
STRING F_RES_DENLOC 30
BEGIN
PROMPT 30 15 ""
PROMPT 30 16 ""
USE LCP SELECT S7=#F_RES_CODLOC
INPUT S0 F_RES_DENLOC
DISPLAY "Localita'@30" S0
@ -393,14 +399,14 @@ END
STRING F_RES_CAPCOM 5
BEGIN
PROMPT 66 14 "CAP "
PROMPT 66 15 "CAP "
FIELD RES_CAP
//FLAGS "D"
END
STRING F_RES_PROVCOM 5
BEGIN
PROMPT 66 15 "Prov."
PROMPT 66 16 "Prov."
FLAGS "D"
END
@ -803,7 +809,7 @@ LISTBOX F_KELL 4
BEGIN
PROMPT 54 13 "Kell "
FIELD KELL
FLAGS "U"
//FLAGS "U"
#include "skell.h"
END

View File

@ -125,7 +125,7 @@ BEGIN
FLAGS "RG"
USE LF_SOGGETTI KEY 1
INPUT CODICE F_F_CODICE
DISPLAY "Codice@6" CODICE
DISPLAY "Codice@8" CODICE
DISPLAY "Cognome@25" COGNOME
DISPLAY "Nome@25" NOME
DISPLAY "Nato il@10" DATANASC

View File

@ -21,6 +21,7 @@
#include "soggetti.h"
#include "donaz.h"
#include "contsan.h"
#include "idoneita.h"
#include "rconvoc.h"
#include "atlib.h"
@ -38,6 +39,7 @@ class TGiornalieroDC : public TApplication
TLocalisamfile* _rconvoc;
TRecord_array* _sdonazioni;
TRecord_array* _scontrolli;
TRecord_array* _sidoneita;
// array dei soggetti inseriti per controllare doppio inserimento
TAssoc_array* _asoggetti;
bool _modified, _ricerca;
@ -107,6 +109,7 @@ bool TGiornalieroDC::create()
_rconvoc = new TLocalisamfile(LF_RCONVOC);
_sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON);
_scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON);
_sidoneita = new TRecord_array(LF_IDONEITA,IDO_PROGIDO);
_asoggetti = new TAssoc_array();
_msk->set_handler(F_INS_CONTROLLI,ins_controlli_handler);
TSheet_field& ss = (TSheet_field&)_msk->field(F_SOGGETTI);
@ -139,6 +142,7 @@ bool TGiornalieroDC::destroy()
delete _rconvoc;
delete _sdonazioni;
delete _scontrolli;
delete _sidoneita;
delete _asoggetti;
return TApplication::destroy();
}
@ -369,7 +373,10 @@ int TGiornalieroDC::write(TSheet_field& s)
if (!exist)
{
_scontrolli->write(TRUE);
con_reord(sog.curr(),_scontrolli);
TRectype* keyc = new TRectype(LF_IDONEITA);
keyc->put(IDO_CODICE, row.get(0));
int err = _sidoneita->read(keyc);
con_reord(sog.curr(),_scontrolli,_sidoneita);
}
}
_progins++;
@ -650,6 +657,7 @@ bool TGiornalieroDC::soggetti_notify(TSheet_field& s, int r, KEY k)
if (!row.empty_items())
app()._modified = TRUE;
const long codsog = row.get_long(0);
const long etichetta = row.get_long(5);
if (codsog != 0)
for (int i=s.items()-1; i>=0; i--)
{
@ -658,6 +666,26 @@ bool TGiornalieroDC::soggetti_notify(TSheet_field& s, int r, KEY k)
TToken_string& row = s.row(i);
if (codsog == row.get_long(0))
return s.sheet_mask().field(F_S_CODICE).error_box("Soggetto gia' inserito");
else
if (etichetta != 0)
{
if (etichetta == row.get_long(5))
return s.sheet_mask().field(F_S_ETICHETTA).error_box("Etichetta sacca gia' inserita");
else
{
TLocalisamfile donaz(LF_DONAZ);
donaz.setkey(5);
donaz.zero();
donaz.put(DON_ETICHETTA, etichetta);
for(donaz.read(); !donaz.eof(); donaz.next())
{
const long etic = donaz.get_long(DON_ETICHETTA);
const TDate datadon = donaz.get_date(DON_DATADON);
if (etichetta!=etic) break;
if ((etichetta==etic) && (app()._datadon.year()==datadon.year())) return s.sheet_mask().field(F_S_ETICHETTA).error_box("Etichetta sacca gia' inserita");
}
}
}
}
}
else

View File

@ -21,6 +21,7 @@
#include "soggetti.h"
#include "donaz.h"
#include "contsan.h"
#include "idoneita.h"
#include "atlib.h"
@ -36,6 +37,7 @@ class TGiornalieroC : public TApplication
TLocalisamfile* _contsan;
TRecord_array* _sdonazioni;
TRecord_array* _scontrolli;
TRecord_array* _sidoneita;
TAssoc_array* _asoggetti; // array dei soggetti inseriti per controllare doppio ins.
bool _modified;
@ -82,6 +84,7 @@ bool TGiornalieroC::create()
_contsan = new TLocalisamfile(LF_CONTSAN);
_sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON);
_scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON);
_sidoneita = new TRecord_array(LF_IDONEITA,IDO_PROGIDO);
_asoggetti = new TAssoc_array();
TSheet_field& ss = (TSheet_field&)_msk->field(F_SOGGETTI);
@ -105,6 +108,7 @@ bool TGiornalieroC::destroy()
delete _contsan;
delete _sdonazioni;
delete _scontrolli;
delete _sidoneita;
delete _asoggetti;
return TApplication::destroy();
}
@ -261,7 +265,10 @@ int TGiornalieroC::write(TSheet_field& s)
}
if (!exist)
_scontrolli->write(TRUE);
con_reord(sog.curr(), _scontrolli);
TRectype* keyi = new TRectype(LF_IDONEITA);
keyi->put(IDO_CODICE, row.get(0));
err = _sidoneita->read(keyi);
con_reord(sog.curr(),_scontrolli,_sidoneita);
const TDate oggi(TODAY);
sog.put(SOG_DATAULTAGG,oggi);
sog.put(SOG_UTENULTAGG,user());

View File

@ -59,7 +59,13 @@ protected:
virtual bool changing_mask(int mode) { return FALSE; }
virtual TMask* get_mask( int mode = 0) { return _msk; }
virtual TRelation* get_relation() const { return _rel; }
virtual void init_query_insert_mode(TMask& m);
virtual void init_query_mode(TMask& m) { init_query_insert_mode(m);};
virtual void init_modify_mode(TMask& m);
virtual void init_insert_mode(TMask& m) { init_modify_mode(m); }
static bool nome_handler(TMask_field& f, KEY k);
static bool codice_handler(TMask_field& f, KEY k);
static bool convocati_notify(TSheet_field& s, int r, KEY k);
static bool esegui_handler(TMask_field& f, KEY k);
static bool data_handler(TMask_field&f, KEY k);
@ -74,6 +80,19 @@ public:
HIDDEN inline TGestioneConvocazioni& app() { return (TGestioneConvocazioni&) main_app(); }
void TGestioneConvocazioni::init_query_insert_mode(TMask& m)
{
disable_menu_item(M_FILE_NEW);
m.hide(-1);
m.show(-2);
}
void TGestioneConvocazioni::init_modify_mode(TMask& m)
{
m.show(-1);
m.hide(-2);
}
bool TGestioneConvocazioni::filter_func_convoc(const TRelation* rel)
{
bool filtrato = FALSE;
@ -390,7 +409,51 @@ bool TGestioneConvocazioni::esegui_handler(TMask_field& f, KEY k)
}
return TRUE;
}
bool TGestioneConvocazioni::nome_handler(TMask_field& f, KEY k)
{
bool ok = TRUE;
if (f.to_check(k))
{
TMask& m = f.mask();
long codsog = m.get_long(F_S_CODICE);
if (codsog == 0)
f.on_key(K_F9);
}
return ok;
}
bool TGestioneConvocazioni::codice_handler(TMask_field& f, KEY k)
{
bool ok = TRUE;
if (f.to_check(k))
{
TMask& m = f.mask();
long codsog = m.get_long(F_S_CODICE);
if (codsog != 0)
{
TLocalisamfile sog(LF_SOGGETTI); ;
sog.setkey(1);
sog.zero();
sog.put(SOG_CODICE, codsog);
int err = sog.read();
if (err == NOERR)
{
m.set(F_S_COGNOME, sog.get(SOG_COGNOME));
m.set(F_S_NOME, sog.get(SOG_NOME));
m.set(F_S_DATANASC, sog.get(SOG_DATANASC));
m.set(F_S_TESSAVIS, sog.get(SOG_TESSAVIS));
m.set(F_S_CODSEZ, sog.get(SOG_CODSEZ));
m.set(F_S_CODSOT, sog.get(SOG_CODSOT));
m.set(F_S_CATDON, sog.get(SOG_CATDON));
}
else
ok = FALSE; // codice non esistente
}
}
return ok;
}
bool TGestioneConvocazioni::user_create()
{
_msk = new TMask("at0400a");
@ -411,6 +474,9 @@ bool TGestioneConvocazioni::user_create()
_msk->set_handler(F_CODSOT,sezione_handler);
TSheet_field& sc = (TSheet_field&)_msk->field(F_CONVOCATI);
sc.set_notify(convocati_notify);
sc.sheet_mask().set_handler(F_S_NOME,nome_handler);
sc.sheet_mask().set_handler(F_S_CODICE,codice_handler);
_rel->lfile().last();
_lastcod = _rel->lfile().get_long(COV_NUMERO);
enable_menu_item(M_FILE_PRINT);
@ -441,6 +507,40 @@ bool TGestioneConvocazioni::remove()
// cancella testata convocazione
bool ok = TRUE;
// cancella convocati
// prima cancella dall'archivio soggetti la data ultima convocazione
TLocalisamfile soggetti(LF_SOGGETTI);
TLocalisamfile rconvoc(LF_RCONVOC);
rconvoc.setkey(3);
for (int r=1; r<=_sconvocati->rows(); r++)
{
const TRectype& riga = _sconvocati->row(r);
const long codice = riga.get_long(RCV_CODICE);
const TDate dataconv = riga.get_date(RCV_DATACONV);
soggetti.put(SOG_CODICE,codice);
if (soggetti.read() == NOERR)
{
int numconv = soggetti.get_int(SOG_NUMCONV);
if (numconv > 0)
{
numconv--;
soggetti.put(SOG_NUMCONV,numconv);
TDate dataprec(NULLDATE);
rconvoc.put(RCV_CODICE,codice);
rconvoc.put(RCV_DATACONV,dataconv);
if (rconvoc.read() == NOERR)
{
--rconvoc;
const long codprec = rconvoc.get_long(RCV_CODICE);
if (codprec == codice)
soggetti.put(SOG_DATACONV, rconvoc.get(RCV_DATACONV));
}
soggetti.put(SOG_DATACONV,dataprec);
}
else
soggetti.put(SOG_DATACONV, NULLDATE);
soggetti.rewrite();
}
}
int err = _sconvocati->remove();
if (err == _iseof || err == _isemptyfile)
err = NOERR;
@ -539,20 +639,20 @@ int TGestioneConvocazioni::scrivi(const TMask& m, bool ri)
rec.put(RCV_CHIAMATA,chiamata);
rec.put(RCV_STAMPATO,row.get(5));
rec.put(RCV_ANNULLATO,row.get(6));
if (!ri)
//if (!ri)
//{
// aggiornamento archivio soggetti
soggetti.put(SOG_CODICE,codice);
if (soggetti.read() == NOERR)
{
// aggiornamento archivio soggetti
soggetti.put(SOG_CODICE,codice);
if (soggetti.read() == NOERR)
{
if (chiamata == 'S')
soggetti.put(SOG_DATAULTSOL,dataconv);
soggetti.put(SOG_DATACONV,dataconv);
int numconv = soggetti.get_int(SOG_NUMCONV);
soggetti.put(SOG_NUMCONV,numconv+1);
soggetti.rewrite();
}
}
if (chiamata == 'S')
soggetti.put(SOG_DATAULTSOL,dataconv);
soggetti.put(SOG_DATACONV,dataconv);
int numconv = soggetti.get_int(SOG_NUMCONV);
soggetti.put(SOG_NUMCONV,numconv+1);
soggetti.rewrite();
}
//}
}
err = ri ? _sconvocati->rewrite() : _sconvocati->write();
}
@ -570,6 +670,30 @@ bool TGestioneConvocazioni::convocati_notify(TSheet_field& s, int r, KEY k)
s.mask().set(F_NUMCONV,numconv-1);
}
break;
case K_CTRL+K_TAB:
// uscita riga
{
TToken_string& row = s.row(r);
const long codsog = row.get_long(0);
if (codsog != 0)
for (int i=s.items()-1; i>=0; i--)
{
if (i != r)
{
TToken_string& row = s.row(i);
if (codsog == row.get_long(0))
return s.sheet_mask().field(F_S_CODICE).error_box("Soggetto gia' inserito");
}
}
else
{
const char* cognome = row.get(1);
if ((cognome != NULL) && (cognome != "\0"))
s.sheet_mask().field(F_S_NOME).set_focusdirty();
//s.set_focus_cell(r,2);
}
}
break;
case K_CTRL+K_INS:
{
int numconv = s.mask().get_int(F_NUMCONV);
@ -577,7 +701,7 @@ bool TGestioneConvocazioni::convocati_notify(TSheet_field& s, int r, KEY k)
}
break;
case K_INS:
result = FALSE;
//result = FALSE;
break;
}
return result;

View File

@ -21,6 +21,8 @@
#define F_NUMSOLL 118
#define F_NUMRIT 119
#define F_CONVOCATI 120
#define F_CODSEZH 151
#define F_CODSOTH 152
#define F_ESEGUI 140
@ -35,5 +37,9 @@
#define F_S_DATANASC 108
#define F_S_CATDON 109
#define F_S_TESSAVIS 110
#define F_S_CODSEZ 111
#define F_S_CODSOT 112
#define F_S_DESC_CATDON 151
#define F_S_DENSEZ 151
#define F_S_DENSOT 152
#define F_S_DESC_CATDON 153

View File

@ -168,6 +168,30 @@ BEGIN
CHECKTYPE SEARCH
HELP "Codice sezione da convocare"
ADD MASK batbsez
MESSAGE COPY,F_CODSEZH
GROUP 1
END
STRING F_CODSEZH 2
BEGIN
PROMPT 2 5 "Sezione "
FIELD CODSEZ
FLAGS "U"
USE LF_CONVOC KEY 3
INPUT CODSEZ F_CODSEZ
INPUT CODSOT F_CODSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Data@10" DATA
DISPLAY "Punto" PUNTO
OUTPUT F_NUMERO NUMERO
OUTPUT F_CODSEZ CODSEZ
OUTPUT F_CODSOT CODSOT
OUTPUT F_DATA DATA
OUTPUT F_PUNTO PUNTO
CHECKTYPE NORMAL
GROUP 2
MESSAGE COPY,F_CODSEZH
END
STRING F_DENSEZ 25
@ -194,6 +218,19 @@ BEGIN
CHECKTYPE NORMAL
HELP "Codice sottogruppo da convocare"
ADD MASK batbsez
GROUP 1
MESSAGE COPY,F_CODSOTH
END
STRING F_CODSOTH 2
BEGIN
PROMPT 2 6 "Sottogruppo "
FIELD CODSOT
FLAGS "U"
COPY ALL F_CODSEZH
CHECKTYPE NORMAL
GROUP 2
MESSAGE COPY,F_CODSOTH
END
STRING F_DENSOT 25
@ -273,7 +310,7 @@ PAGE "Soggetti" -1 -1 78 20
SPREADSHEET F_CONVOCATI
BEGIN
PROMPT 1 1 "Convocati"
ITEM "Codice@6"
ITEM "Codice@10"
ITEM "Cognome@25"
ITEM "Nome@25"
ITEM "Data conv."
@ -283,6 +320,8 @@ BEGIN
ITEM "Nato il@10"
ITEM "Cat."
ITEM "Tessera"
ITEM "Se"
ITEM "So"
END
ENDPAGE
@ -291,9 +330,9 @@ ENDMASK
PAGE "Soggetto " -1 -1 78 20
GROUPBOX DLG_NULL 77 5
GROUPBOX DLG_NULL 77 6
BEGIN
PROMPT 1 0 ""
PROMPT 1 0 "Dati identificativi soggetto"
FLAGS "R"
END
@ -317,7 +356,9 @@ BEGIN
OUTPUT F_S_DATANASC DATANASC
OUTPUT F_S_CATDON CATDON
OUTPUT F_S_TESSAVIS TESSAVIS
CHECKTYPE NORMAL
OUTPUT F_S_CODSEZ CODSEZ
OUTPUT F_S_CODSOT CODSOT
//CHECKTYPE NORMAL
ADD RUN at0 -0
END
@ -336,7 +377,7 @@ BEGIN
DISPLAY "C." CATDON
DISPLAY "Tessera" TESSAVIS
COPY OUTPUT F_S_CODICE
CHECKTYPE SEARCH
//CHECKTYPE SEARCH
HELP "Cognome del soggetto"
ADD RUN at0 -0
END
@ -344,31 +385,51 @@ END
STRING F_S_NOME 25
BEGIN
PROMPT 46 2 ""
COPY ALL F_S_COGNOME
USE LF_SOGGETTI KEY 2
INPUT COGNOME F_S_COGNOME
INPUT NOME F_S_NOME
DISPLAY "Cognome@25" COGNOME
DISPLAY "Nome@25" NOME
DISPLAY "Nato il@10" DATANASC
DISPLAY "Codice@8" CODICE
DISPLAY "Sez." CODSEZ
DISPLAY "Sot." CODSOT
DISPLAY "C." CATDON
DISPLAY "Tessera" TESSAVIS
COPY OUTPUT F_S_CODICE
CHECKTYPE SEARCH
HELP "Nome del soggetto"
// CHECKTYPE NORMAL
ADD RUN at0 -0
END
GROUPBOX DLG_NULL 77 5
BEGIN
PROMPT 1 7 "Dati convocazione"
FLAGS "R"
END
DATE F_S_DATACONV
BEGIN
PROMPT 2 5 "Convocato il "
PROMPT 2 8 "Convocato il "
END
STRING F_S_CHIAMATA 1
LISTBOX F_S_CHIAMATA 15
BEGIN
PROMPT 30 5 "Chiamata "
PROMPT 30 8 "Tipo convocazione "
FLAGS "U"
ITEM "C|Convocato"
ITEM "S|Sollecitato"
ITEM "R|Ritardatario"
END
BOOLEAN F_S_STAMPATO
BEGIN
PROMPT 2 6 "Convocazione stampata"
PROMPT 2 9 "Convocazione stampata"
END
BOOLEAN F_S_ANNULLATO
BEGIN
PROMPT 2 7 "Convocazione annullata"
PROMPT 2 10 "Convocazione annullata"
END
DATE F_S_DATANASC
@ -379,26 +440,57 @@ END
STRING F_S_CATDON 2
BEGIN
PROMPT 2 8 "Cat. "
PROMPT 60 3 "Categoria "
FLAGS "D"
USE CTD
INPUT CODTAB F_S_CATDON
OUTPUT F_S_DESC_CATDON S0
CHECKTYPE NORMAL
//USE CTD
//INPUT CODTAB F_S_CATDON
//OUTPUT F_S_DESC_CATDON S0
//CHECKTYPE NORMAL
END
STRING F_S_TESSAVIS 10
BEGIN
PROMPT 52 8 "Tessera AVIS "
PROMPT 33 3 "Tessera AVIS "
FLAGS "D"
END
STRING F_S_DESC_CATDON 25
STRING F_S_CODSEZ 2
BEGIN
PROMPT 12 8 ""
PROMPT 2 4 "Sez./Sottog. "
FLAGS "D"
END
STRING F_S_CODSOT 2
BEGIN
PROMPT 46 4 ""
FLAGS "D"
USE LF_SEZIONI
INPUT CODSEZ F_S_CODSEZ
INPUT CODSOT F_S_CODSOT
OUTPUT F_S_DENSEZ DENSEZ
OUTPUT F_S_DENSOT DENSOT
CHECKTYPE NORMAL
END
STRING F_S_DENSOT 25 23
BEGIN
PROMPT 49 4 ""
FLAGS "D"
END
STRING F_S_DENSEZ 25 23
BEGIN
PROMPT 20 4 ""
FLAGS "D"
END
//STRING F_S_DESC_CATDON 25
//BEGIN
// PROMPT 12 8 ""
// FLAGS "D"
//END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -13 -1 ""

View File

@ -23,8 +23,10 @@ class TSpostamentoConv : public TPrintapp
TString16 _punto,_tipo, _sezione, _sottog;
TString16 _codsez, _codsot;
int _quanti; // numero di convocazioni per giorni
int _spostati; // contatore dei soggetti spostati
int _spostati; // contatore dei soggetti spostati per giorno
int _contatore;
TDate _data; // data a cui spostare
bool _stampa;
//static bool filter_func_stconvoc(const TRelation* rel);
protected:
@ -33,6 +35,7 @@ protected:
virtual bool set_print(int m);
virtual void set_page(int file, int cnt);
virtual bool preprocess_page(int file, int counter);
virtual print_action postprocess_print(int file, int counter);
public:
TMask& app_mask() { return *_msk; }
@ -56,9 +59,17 @@ void TSpostamentoConv::set_page(int file, int cnt)
set_row(3, "");
}
print_action TSpostamentoConv::postprocess_print(int file, int counter)
{
if (_contatore > 0)
_msk->set(F_SPOSTATI,_contatore);
return NEXT_PAGE;
}
bool TSpostamentoConv::preprocess_page(int file, int counter)
{
TDate& data = app()._data;
app()._contatore++;
app()._spostati++;
if (app()._spostati > app()._quanti)
{
@ -73,14 +84,17 @@ bool TSpostamentoConv::preprocess_page(int file, int counter)
current_cursor()->file().setkey(2);
current_cursor()->curr(LF_SOGGETTI).put(SOG_DATACONV,data);
current_cursor()->file(LF_SOGGETTI).rewrite();
return TRUE;
return app()._stampa;
}
bool TSpostamentoConv::set_print(int m)
{
_stampa = FALSE;
KEY tasto;
tasto = _msk->run();
if (tasto == K_ENTER)
if (tasto == F_STAMPA)
_stampa = TRUE;
if (tasto != K_QUIT)
{
_dataini = _msk->get(F_DATAINI);
_datafin = _msk->get(F_DATAFIN);
@ -89,7 +103,8 @@ bool TSpostamentoConv::set_print(int m)
_codsez = _msk->get(F_CODSEZ);
_codsot = _msk->get(F_CODSOT);
_spostadal = _msk->get(F_SPOSTADAL);
_spostaal = _msk->get(F_SPOSTAAL);
_spostaal = _msk->get(F_SPOSTAAL);
_contatore = 1;
TString80 filtro = "";
// filtro per punto di prelievo
if (_punto.not_empty())

View File

@ -14,3 +14,4 @@
#define F_SPOSTADAL 111
#define F_SPOSTAAL 112
#define F_SPOSTATI 113
#define F_STAMPA 201

View File

@ -1,5 +1,26 @@
#include "at0500a.h"
TOOLBAR "" 0 20 0 2
BUTTON F_STAMPA 9 2
BEGIN
PROMPT -13 -11 "~Stampa"
MESSAGE EXIT,F_STAMPA
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -23 -11 ""
MESSAGE EXIT,K_ENTER
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -33 -11 ""
END
ENDPAGE
PAGE "Spostamento convocazioni" -1 -1 78 20
GROUPBOX DLG_NULL 77 8
@ -135,15 +156,5 @@ BEGIN
FLAGS "D"
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 16 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 16 ""
END
ENDPAGE
ENDMASK

View File

@ -55,7 +55,7 @@ public:
void header_sezione(const TString16 codsez, const TString16 codsot);
void footer_sezione();
void fine_stampa();
TSbloccoSospesi() : _data_sblocco(TODAY), _data_stampa(TODAY), _tiposo(""), _cognome_nome("",25), _operazione("",25) {}
TSbloccoSospesi() : _data_sblocco(TODAY), _data_stampa(TODAY), _tiposo(""), _cognome_nome("",25), _operazione("",40) {}
};
HIDDEN inline TSbloccoSospesi& app() { return (TSbloccoSospesi&) main_app(); }
@ -122,6 +122,7 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter)
_cognome_nome = nome;
const TString16 stato = recsog.get(SOG_STATO);
const TString16 pros_stato = recsog.get(SOG_PROS_STATO);
const TString16 statosi = recsog.get(SOG_STATOSI);
const TString16 statoaf = recsog.get(SOG_STATOAF);
const TDate datafine = recsog.get_date(SOG_DATA_PROS);
@ -133,17 +134,38 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter)
datafineaf = recsog.get_date(SOG_FINESOSAF);
TString80 operazione = "";
if (stato == "SO" && datafine.ok() && datafine <= app()._data_sblocco)
if (stato=="SO" && pros_stato==FINE_SOSPENSIONE && datafine.ok() && datafine<=app()._data_sblocco)
{
const TDate datastato = recsog.get_date(SOG_DATASTATO);
operazione << datastato.string();
operazione << " ";
operazione << datafine.string();
operazione << " ";
operazione << "-- -- -- SO FS";
}
else
if (statosi == "SO" && datafinesi.ok() && datafinesi <= app()._data_sblocco)
{
const TDate datastato = recsog.get_date(SOG_DATASI);
operazione << datastato.string();
operazione << " ";
operazione << datafinesi.string();
operazione << " ";
operazione << "SI SO ID";
}
else
if (statoaf == "SO" && datafineaf.ok() && datafineaf <= app()._data_sblocco)
{
const TDate datastato = recsog.get_date(SOG_DATAAF);
operazione << datastato.string();
operazione << " ";
operazione << datafineaf.string();
operazione << " ";
operazione << "AF SO ID";
}
_operazione = operazione;
if (_definitiva)
{
{
if (stato == "SO" && datafine.ok() && datafine <= app()._data_sblocco)
{
TRectype* key = new TRectype(LF_CONTSAN);
@ -159,7 +181,7 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter)
reccon.put(CON_TIPOCON, FINE_SOSPENSIONE);
_scontrolli->add_row(reccon);
_scontrolli->rewrite();
con_reord(recsog, _scontrolli);
//con_reord(recsog, _scontrolli);
current_cursor()->file().rewrite();
}
if ((statosi == "SO" && datafinesi.ok() && datafinesi <= app()._data_sblocco) || (statoaf == "SO" && datafineaf.ok() && datafineaf <= app()._data_sblocco))
@ -167,9 +189,10 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter)
TRectype* key = new TRectype(LF_IDONEITA);
long codice = recsog.get_long(SOG_CODICE);
key->put(IDO_CODICE, codice);
int err = _sidoneita->read(key);
if (statosi == "SO" && datafinesi.ok() && datafinesi <= app()._data_sblocco)
{
int err = _sidoneita->read(key);
//int err = _sidoneita->read(key);
int progido = _sidoneita->rows()+1;
TRectype& recido = _idoneita->curr();
recido.zero();
@ -184,7 +207,7 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter)
}
if (statoaf == "SO" && datafineaf.ok() && datafineaf <= app()._data_sblocco)
{
int err = _sidoneita->read(key);
//int err = _sidoneita->read(key);
int progido = _sidoneita->rows()+1;
TRectype& recido = _idoneita->curr();
recido.zero();
@ -197,7 +220,7 @@ bool TSbloccoSospesi::preprocess_page(int file, int counter)
_sidoneita->add_row(recido);
_sidoneita->rewrite();
}
ido_reord(recsog, _sidoneita);
//ido_reord(recsog, _sidoneita);
current_cursor()->file().rewrite();
}
}
@ -225,9 +248,10 @@ void TSbloccoSospesi::set_page(int file, int cnt)
set_row(1,"@12g#a", &_cognome_nome);
set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@49g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS));
set_row(1,"@57g@ld", FLD(LF_SOGGETTI,SOG_DATASTATO));
set_row(1,"@68g@ld", FLD(LF_SOGGETTI,SOG_DATA_PROS));
set_row(1,"@79g#a", &_operazione);
//set_row(1,"@57g@ld", FLD(LF_SOGGETTI,SOG_DATASTATO));
//set_row(1,"@68g@ld", FLD(LF_SOGGETTI,SOG_DATA_PROS));
//set_row(1,"@79g#a", &_operazione);
set_row(1,"@57g#a", &_operazione);
}
bool TSbloccoSospesi::filter_func_sbloccosospesi(const TRelation* rel)
@ -235,9 +259,13 @@ bool TSbloccoSospesi::filter_func_sbloccosospesi(const TRelation* rel)
bool filtrato = FALSE;
TRectype& recsog = rel->lfile().curr();
const TString16 stato = recsog.get(SOG_STATO);
const TString16 statopros = recsog.get(SOG_PROS_STATO);
const TString16 statosi = recsog.get(SOG_STATOSI);
const TString16 statoaf = recsog.get(SOG_STATOAF);
const TDate datafine = recsog.get_date(SOG_DATA_PROS);
TDate datafine(NULLDATE);
if (statopros == "FS")
datafine = recsog.get_date(SOG_DATA_PROS);
TDate datafinesi(NULLDATE);
TDate datafineaf(NULLDATE);
if (statosi == "SO")

View File

@ -99,7 +99,7 @@ bool TModificaIntervalli::preprocess_page(int file, int counter)
reccon.put(CON_INTAF, recsog.get_int(SOG_INTAF));
_scontrolli->add_row(reccon);
_scontrolli->rewrite();
con_reord(recsog, _scontrolli);
//con_reord(recsog, _scontrolli);
current_cursor()->file().rewrite();
// salto pagina se cambio sezione

View File

@ -303,6 +303,7 @@ bool TStampaDonBen::set_print(int m)
// filtro per sezioni selezionati
filtra_sezioni();
// filtro per categorie
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

View File

@ -1,6 +1,8 @@
#include <form.h>
#include <mask.h>
#include <prefix.h>
#include <printapp.h>
#include <progind.h>
#include <recarray.h>
#include <tabutil.h>
#include <utility.h>
@ -15,6 +17,8 @@
#include "donaz.h"
#include "benem.h"
#include "sezioni.h"
#include "atopera.h"
#include "atropera.h"
#define ALIAS_GAZ 300
@ -24,22 +28,20 @@ class TAttribuzioneBenemerenze : public TPrintapp
TRelation* _rel;
TLocalisamfile* _donaz;
TLocalisamfile* _benem;
TLocalisamfile* _atopera;
TLocalisamfile* _atropera;
TLocalisamfile* _sezioni;
TRecord_array* _sdonazioni;
TRecord_array* _sbenemerenze;
TCursor* _cur;
TAssoc_array _catdon;
TString16 _gruppoazie, _gruppoold;
TAssoc_array _tabben;
TString16 _gruppoazie, _oldben;
TDate _dataela, _datapre;
bool _anchegruppi;
TString16 _tipoben; // tipo benemerenza da assegnare
bool _definitiva;
int _numdon; // numero donazioni necessarie
TDate _data_stampa;
TString16 _codsez, _codsot;
TParagraph_string _cognome_nome;
int _contatore;
static bool filter_func_attriben(const TRelation* rel);
protected:
virtual bool user_create();
virtual bool user_destroy();
@ -49,81 +51,57 @@ protected:
public:
void crea_intestazione();
void header_sezione(const TString16 codsez, const TString16 codsot);
TAttribuzioneBenemerenze() : _data_stampa(TODAY), _cognome_nome("",25) {}
void header_ben(const TString16 tipoben);
TAttribuzioneBenemerenze() : _cognome_nome("",25) {}
};
HIDDEN inline TAttribuzioneBenemerenze& app() { return (TAttribuzioneBenemerenze&) main_app(); }
bool TAttribuzioneBenemerenze::preprocess_page(int file, int counter)
{
TRectype& recsez = current_cursor()->curr(LF_SEZIONI);
TRectype& recsog = current_cursor()->curr();
TLocalisamfile& filesog = current_cursor()->file();
TRectype& recsog = current_cursor()->curr(LF_SOGGETTI);
TString80 nome = recsog.get(SOG_COGNOME);
nome << " ";
nome << recsog.get(SOG_NOME);
_cognome_nome = nome;
const int totdon = recsog.get_int(SOG_TOTDON);
// salto pagina se cambio sezione
const TString16 codsez = recsog.get(SOG_CODSEZ);
const TString16 codsot = recsog.get(SOG_CODSOT);
if ((_codsez!=codsez)||(_codsot!=codsot))
// salto pagina se cambio benemerenza
const TString16 tipoben = current_cursor()->curr().get(ROP_S0);
if (tipoben!=_oldben)
{
if (_codsez != "**")
if (_oldben != "**")
printer().formfeed();
_codsez = codsez;
_codsot = codsot;
header_sezione(codsez, codsot);
_oldben = tipoben;
header_ben(tipoben);
}
return TRUE;
}
void TAttribuzioneBenemerenze::set_page(int file, int cnt)
{
set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(1,"@9g@S", FLD(LF_SOGGETTI,SOG_CATDON));
set_row(1,"@12g#a", &_cognome_nome);
set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@49g@pn", FLD(LF_SOGGETTI,SOG_TOTDON,"###"));
}
bool TAttribuzioneBenemerenze::filter_func_attriben(const TRelation* rel)
{
bool filtrato;
// filtro chi non ha già ricevuto la benemerenza richiesta
TLocalisamfile ben(LF_BENEM);
ben.setkey(3);
TRectype& recben = ben.curr();
recben.zero();
recben.put(BEN_CODICE, rel->lfile().curr().get_long(SOG_CODICE));
recben.put(BEN_TIPOBEN, app()._tipoben);
filtrato = (ben.read() != NOERR); // se ha gia' la ben. non va filtrato
// filtro chi ha il numero donazioni giuste
if (filtrato)
filtrato = rel->lfile().curr().get_int(SOG_TOTDON) >= app()._numdon;
return filtrato;
}
void TAttribuzioneBenemerenze::header_sezione(const TString16 codsez, const TString16 codsot)
{
const TString80 densez = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSEZ);
const TString80 densot = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSOT);
TString intestazione(132);
intestazione = "Sezione: ";
intestazione << codsez;
intestazione << "/";
intestazione << codsot;
intestazione << " ";
intestazione << densez;
if ((densot.ok())&& (densot.not_empty()))
{
if (file == LF_SOGGETTI)
{
intestazione << "/";
intestazione << densot;
}
set_row(1,"@0g#a", &_cognome_nome);
set_row(1,"@26g@S", FLD(LF_SOGGETTI,SOG_CATDON));
set_row(1,"@29g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS));
set_row(1,"@39g@pn", FLD(LF_SOGGETTI,SOG_TOTDON,"###"));
}
else
set_row(1,"");
}
void TAttribuzioneBenemerenze::header_ben(const TString16 tipoben)
{
TString intestazione(132);
intestazione = "Benemerenza ";
intestazione << tipoben;
intestazione << " ";
TTable ben("BNZ");
ben.zero();
ben.put("CODTAB", tipoben);
ben.read();
if (ben.good())
intestazione << ben.get("S0");
intestazione.center_just();
set_header(1,"@0g%s", (const char*) intestazione);
return;
@ -135,47 +113,14 @@ bool TAttribuzioneBenemerenze::set_print(int)
tasto = _msk->run();
if (tasto == K_ENTER)
{
_codsez = "**";
_codsot = "**";
_gruppoold = "**";
_oldben = "**";
_contatore = 0;
TString80 chiave = "";
_dataela = _msk->get(F_DATAELA);
_datapre = _msk->get(F_DATAPRE);
_gruppoazie = _msk->get(F_GRUPPOAZIE);
_anchegruppi = _msk->get_bool(F_ANCHEGRUPPI);
_tipoben = _msk->get(F_TIPOBEN);
_definitiva = _msk->get_bool(F_DEFINITIVA);
if (_gruppoazie.not_empty())
chiave << "90->GRUPPOAZIE|UPPER(90->COGNOME)|UPPER(90->NOME)";
else
chiave = "90->CODSEZ|90->CODSOT|UPPER(90->COGNOME)|UPPER(90->NOME)";
TString80 filtro = "";
if (_gruppoazie.not_empty())
filtro.format("(90->GRUPPOAZIE == \"%s\")",(const char*)_gruppoazie);
else
if (!_anchegruppi)
filtro.format("(90->GRUPPOAZIE == \"\")");
// filtro per sezioni
const TString16 sezini = _msk->get(F_SEZINI);
const TString16 sotini = _msk->get(F_SOTINI);
const TString16 sezfin = _msk->get(F_SEZFIN);
const TString16 sotfin = _msk->get(F_SOTFIN);
TRectype da(LF_SOGGETTI);
TRectype a(LF_SOGGETTI);
if (sezini.not_empty())
da.put(SOG_CODSEZ, sezini);
if (sotini.not_empty())
da.put(SOG_CODSOT, sotini);
if (sezfin.not_empty())
a.put(SOG_CODSEZ, sezfin);
if (sotfin.not_empty())
a.put(SOG_CODSOT, sotfin);
current_cursor()->setregion(da, a);
current_cursor()->setfilter(filtro, TRUE);
((TSorted_cursor*)current_cursor())->change_order(chiave);
reset_files();
add_file(LF_SOGGETTI);
_catdon.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);
@ -194,8 +139,145 @@ bool TAttribuzioneBenemerenze::set_print(int)
_catdon.add((const char*) catqui);
if (catses.not_empty() && catses.ok())
_catdon.add((const char*) catses);
current_cursor()->setfilter("TOTDON!=0");
current_cursor()->set_filterfunction(filter_func_attriben,TRUE);
_tabben.destroy();
TTable ben("BNZ");
for(ben.first(); !ben.eof(); ben.next())
{
TString16 codben = ben.get("CODTAB");
int numdonben = ben.get_int("I0");
real* oggetto = new real(numdonben);
_tabben.add((const char*)codben, (TObject*) oggetto);
}
TString80 filtro = "";
if (_gruppoazie.not_empty())
filtro.format("(90->GRUPPOAZIE == \"%s\")",(const char*)_gruppoazie);
else
if (!_anchegruppi)
filtro.format("(90->GRUPPOAZIE == \"\")");
// filtro per sezioni
const TString16 sezini = _msk->get(F_SEZINI);
const TString16 sotini = _msk->get(F_SOTINI);
TRectype da(LF_SOGGETTI);
if (sezini.not_empty())
da.put(SOG_CODSEZ, sezini);
if (sotini.not_empty())
da.put(SOG_CODSOT, sotini);
_cur = new TCursor(_rel, "", 3, &da, &da);
_cur->setfilter(filtro, TRUE);
TLocalisamfile atopera(LF_ATOPERA);
atopera.last();
int progope = atopera.get_int(OPE_PROGOPE);
progope++;
atopera.zero();
atopera.put(OPE_PROGOPE, progope);
atopera.put(OPE_CODSEZ,sezini);
atopera.put(OPE_CODSOT,sotini);
atopera.put(OPE_GRUPPOAZIE,_gruppoazie);
atopera.put(OPE_DATA1,_dataela);
atopera.put(OPE_DATA2,_datapre);
atopera.put(OPE_FLAG1,_anchegruppi);
atopera.put(OPE_UTENTE,user());
atopera.write();
TLocalisamfile atropera(LF_ATROPERA);
// cancelliamo l'elaborazione precedente
for (atropera.first(); !atropera.eof(); atropera.next())
atropera.remove();
TRectype& sog = _cur->curr();
long last = _cur->items();
_benem->setkey(3);
TProgind prg (last, "Elaborazione in corso... Prego attendere", FALSE, TRUE, 30);
for ( *_cur=0; _cur->pos() < last; ++(*_cur) )
{
prg.addstatus(1);
// controllare la categoria
bool filtrato = TRUE;
long codice = sog.get_long(SOG_CODICE);
if (_catdon.items() != 0)
{
const TString16 cat = sog.get(SOG_CATDON);
filtrato = _catdon.is_key((const char*) cat);
}
if (filtrato)
{
TRectype* key = new TRectype(LF_DONAZ);
key->put(DON_CODICE, codice);
int err = _sdonazioni->read(key);
if (err == NOERR)
{
int precsi = sog.get_int(SOG_DONPRECSI);
int precaf = sog.get_int(SOG_DONPRECAF);
int numdon = 0;
if (precsi>0)
numdon = numdon+precsi;
if (precaf>0)
numdon = numdon+precaf;
for (int r=1; r<=_sdonazioni->rows(); r++)
{
const TRectype& riga = _sdonazioni->row(r);
TDate datadon = riga.get_date(DON_DATADON);
if (datadon<=_dataela)
numdon++;
}
TString16 ultben = "**";
TRectype* key = new TRectype(LF_BENEM);
key->put(BEN_CODICE, codice);
int err = _sbenemerenze->read(key);
if (err == NOERR)
{
for (int r=1; r<=_sbenemerenze->rows(); r++)
{
const TRectype& riga = _sbenemerenze->row(r);
ultben = riga.get(BEN_TIPOBEN);
}
}
int bonusctrl = 0;
if (ultben != "**")
{
real& ndonult = (real&) _tabben.find((const char*) ultben);
bonusctrl = ndonult.integer();
}
_tabben.restart();
real* c;
for (c = (real*) _tabben.first_item(); c != NULL; c = (real*) _tabben.succ_item())
{
const char* tipoben = _tabben.get_hashobj()->key();
int bonus = c->integer();
if (bonus > bonusctrl)
{
if (numdon >= bonus)
{
// controllo che non abbia ricevuto la benemerenza
//const char* tipoben = _tabben.get_hashobj()->key();
_benem->zero();
_benem->put(BEN_CODICE, codice);
_benem->put(BEN_TIPOBEN, tipoben);
_benem->read();
if (_benem->bad())
{
atropera.zero();
atropera.put(ROP_PROGOPE, progope);
atropera.put(ROP_CODICE, codice);
atropera.put(ROP_S0, tipoben);
atropera.write();
}
}
}
}
}
}
}
reset_files();
TRelation* relope = new TRelation(LF_ATROPERA);
relope->add(LF_SOGGETTI, "CODICE==CODICE");
TString80 chiave = "131->S0|UPPER(90->COGNOME)|UPPER(90->NOME)";
int curope = add_cursor(new TSorted_cursor(relope, (const char*) chiave, "", 1));
filtro = "";
current_cursor()->setfilter((const char*) filtro, TRUE);
add_file(LF_ATROPERA);
add_file(LF_SOGGETTI,LF_ATROPERA);
reset_print();
crea_intestazione();
return TRUE;
@ -209,18 +291,11 @@ void TAttribuzioneBenemerenze::crea_intestazione()
reset_header();
TString sep(132);
sep = "ATTRIBUZIONE BENEMERENZA ";
sep << _tipoben;
const TString80 descr = _msk->get(F_D_TIPOBEN);
sep << " ";
sep << descr;
sep = "ATTRIBUZIONE BENEMERENZE ";
sep << " ALLA DATA ";
TString16 data_stampa = _dataela.string();
sep << data_stampa;
sep << _dataela.string();;
sep.center_just();
set_header(2, "@0g%s", (const char*) sep);
data_stampa = _data_stampa.string();
set_header(2,"@0g%10s", (const char*) data_stampa);
sep = "";
sep << "Pag. @#";
set_header(2, "@120g%s", (const char*) sep);
@ -228,21 +303,23 @@ void TAttribuzioneBenemerenze::crea_intestazione()
sep = "";
sep.fill('-');
set_header(3, (const char *) sep);
set_header(4,"@0gCod.@7gC.@10gCognome e nome@36gNato il@47Num.don.");
set_header(5,"@0g------@9g--@12g-------------------------@38g----------@49g--------");
set_header(4,"@0gCognome e nome@26gC.@29gTessera@39gTot.don.");
set_header(5,"@0-------------------------@26g--@29g--------@39g--------");
}
bool TAttribuzioneBenemerenze::user_create()
{
{
_msk = new TMask("at1200a");
_rel = new TRelation(LF_SOGGETTI);
_rel->add(LF_SEZIONI,"CODSEZ==CODSEZ|CODSOT==CODSOT");
_rel->add("GAZ", "CODTAB==GRUPPOAZIE",1,0,ALIAS_GAZ);
add_cursor(new TSorted_cursor(_rel,"SOG_CODSEZ","",3));
_donaz = new TLocalisamfile(LF_DONAZ);
_benem = new TLocalisamfile(LF_BENEM);
_sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON);
_sbenemerenze = new TRecord_array(LF_BENEM, BEN_PROGBEN);
_atopera = new TLocalisamfile(LF_ATOPERA);
_atropera = new TLocalisamfile(LF_ATROPERA);
_sezioni = new TLocalisamfile(LF_SEZIONI);
return TRUE;
}
@ -254,6 +331,9 @@ bool TAttribuzioneBenemerenze::user_destroy()
delete _benem;
delete _sdonazioni;
delete _sbenemerenze;
delete _atopera;
delete _atropera;
delete _sezioni;
return TRUE;
}

View File

@ -5,10 +5,10 @@
#define F_D_SEZINI 102
#define F_SOTINI 103
#define F_D_SOTINI 104
#define F_SEZFIN 105
#define F_D_SEZFIN 106
#define F_SOTFIN 107
#define F_D_SOTFIN 108
//#define F_SEZFIN 105
//#define F_D_SEZFIN 106
//#define F_SOTFIN 107
//#define F_D_SOTFIN 108
#define F_CAT1 201
#define F_D_CAT1 202
@ -23,11 +23,19 @@
#define F_CAT6 211
#define F_D_CAT6 212
#define F_DATAELA 109
#define F_DATAPRE 110
#define F_GRUPPOAZIE 111
#define F_D_GRUPPOAZIE 112
#define F_ANCHEGRUPPI 113
#define F_TIPOBEN 114
#define F_D_TIPOBEN 115
#define F_DEFINITIVA 116
#define F_DATAELA 309
#define F_DATAPRE 310
#define F_GRUPPOAZIE 311
#define F_D_GRUPPOAZIE 312
#define F_ANCHEGRUPPI 313
//#define F_TIPOBEN 314
//#define F_D_TIPOBEN 315
#define F_DEFINITIVA 314
#define F_O_CODSEZ 401
#define F_O_CODSOT 402
//#define F_O_GRUPPOAZIE 403
//#define F_O_DATA1 404
//#define F_O_DATA2 405
//#define F_O_FLAG1 406
//#define F_O_UTENTE 407

View File

@ -17,12 +17,12 @@ PAGE "Attribuzione benemerenze" -1 -1 78 18
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 0 "Scelta sezioni/sottogruppi"
PROMPT 1 0 "Scelta sezione/sottogruppo"
END
STRING F_SEZINI 2
BEGIN
PROMPT 2 1 "Da "
PROMPT 2 1 "Sezione "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZINI
@ -36,12 +36,12 @@ BEGIN
OUTPUT F_SOTINI CODSOT
OUTPUT F_D_SOTINI DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione da cui partire"
HELP "Codice sezione da stampare"
END
STRING F_D_SEZINI 25
BEGIN
PROMPT 11 1 ""
PROMPT 20 1 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZINI
@ -51,20 +51,20 @@ BEGIN
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZINI
CHECKTYPE NORMAL
HELP "Sezione da cui partire"
HELP "Sezione da stampare"
END
STRING F_SOTINI 2
BEGIN
PROMPT 2 2 " "
PROMPT 2 2 "Sottogruppo "
COPY ALL F_SEZINI
CHECKTYPE SEARCH
HELP "Codice sottogruppo da cui partire"
HELP "Codice sottogruppo da stampare"
END
STRING F_D_SOTINI 25
BEGIN
PROMPT 11 2 ""
PROMPT 20 2 ""
FLAGS "U"
COPY USE F_D_SEZINI
INPUT DENSEZ F_D_SEZINI
@ -75,61 +75,6 @@ BEGIN
HELP "Sottogruppo da cui partire"
END
STRING F_SEZFIN 2
BEGIN
PROMPT 41 1 "A "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZFIN
INPUT CODSOT F_SOTFIN
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZFIN CODSEZ
OUTPUT F_D_SEZFIN DENSEZ
OUTPUT F_SOTFIN CODSOT
OUTPUT F_D_SOTFIN DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione finale"
END
STRING F_D_SEZFIN 25
BEGIN
PROMPT 49 1 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZFIN
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZFIN
CHECKTYPE NORMAL
HELP "Sezione finale"
END
STRING F_SOTFIN 2
BEGIN
PROMPT 41 2 " "
COPY ALL F_SEZFIN
CHECKTYPE SEARCH
HELP "Codice sottogruppo finale"
END
STRING F_D_SOTFIN 25
BEGIN
PROMPT 49 2 ""
FLAGS "U"
COPY USE F_D_SEZFIN
INPUT DENSEZ F_D_SEZFIN
INPUT DENSOT F_D_SOTFIN
COPY DISPLAY F_D_SEZFIN
COPY OUTPUT F_D_SEZFIN
CHECKTYPE NORMAL
HELP "Sottogruppo finale"
END
GROUPBOX DLG_NULL 77 5
BEGIN
PROMPT 1 4 "Categorie donatori"
@ -256,7 +201,7 @@ BEGIN
FLAGS "D"
END
GROUPBOX DLG_NULL 77 8
GROUPBOX DLG_NULL 77 7
BEGIN
PROMPT 1 9 "Opzioni per l'attribuzione"
END
@ -285,6 +230,8 @@ BEGIN
OUTPUT F_GRUPPOAZIE CODTAB
OUTPUT F_D_GRUPPOAZIE S0
CHECKTYPE NORMAL
MESSAGE DISABLE,F_ANCHEGRUPPI
MESSAGE EMPTY ENABLE,F_ANCHEGRUPPI
WARNING "Codice gruppo aziendale non presente"
HELP "Gruppo aziendale di appartenenza"
END
@ -308,33 +255,41 @@ BEGIN
PROMPT 2 13 "Includi soggetti appartenenti a gruppi aziendali"
END
STRING F_TIPOBEN 2
BEGIN
PROMPT 2 14 "Benemerenza da attribuire "
FLAGS "U"
USE BNZ
INPUT CODTAB F_TIPOBEN
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@40" S0
OUTPUT F_TIPOBEN CODTAB
OUTPUT F_D_TIPOBEN S0
CHECKTYPE REQUIRED
VALIDATE NOT_EMPTY_FUNC
WARNING "Codice benemerenza non presente"
HELP "Benemerenza da assegnare"
END
STRING F_D_TIPOBEN 25
BEGIN
PROMPT 35 14 ""
FLAGS "D"
END
BOOLEAN F_DEFINITIVA
BEGIN
PROMPT 2 15 "Attribuzione definitiva"
PROMPT 2 14 "Attribuzione definitiva"
HELP "Se attribuzione definitiva, le benemerenze stampate verranno registrate"
END
ENDPAGE
PAGE "Ricerca" -1 -1 78 18
STRING F_O_CODSEZ 2
BEGIN
PROMPT 2 1 "Sezione "
FLAGS "U"
USE LF_ATOPERA KEY 2
INPUT CODSEZ F_O_CODSEZ
INPUT CODSOT F_O_CODSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Gr.az." GRUPPOAZIE
DISPLAY "Data ela.@10" DATA1
DISPLAY "Data pr.con.@10" DATA2
DISPLAY "Anche gruppi" FLAG1
DISPLAY "Utente" UTENTE
CHECKTYPE NORMAL
END
STRING F_O_CODSOT 2
BEGIN
PROMPT 2 2 "Sottogruppo "
COPY ALL F_O_CODSEZ
CHECKTYPE SEARCH
HELP "Codice sottogruppo da stampare"
END
ENDPAGE
ENDMASK

View File

@ -311,6 +311,7 @@ bool TControlloBenemerenze::set_print(int m)
((TSorted_cursor*)current_cursor())->change_order(chiave);
reset_files();
add_file(LF_SOGGETTI);
_catdon.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

View File

@ -3,7 +3,7 @@
#include "at2.h"
#define usage "Error - usage : %s -[0|1|2|3|4|5|6|7]"
#define usage "Error - usage : %s -[0|1|2|3|4|5|6|7|8]"
int main(int argc, char** argv)
{
@ -28,6 +28,8 @@ int main(int argc, char** argv)
rt = at2700(argc, argv); break;
case 7:
rt = at2800(argc, argv); break;
case 8:
rt = at2900(argc, argv); break;
default:
error_box(usage, argv[0]) ; rt = 1; break;
}

View File

@ -9,6 +9,7 @@ int at2500(int argc, char* argv[]); // elenco soggetti idonei
int at2600(int argc, char* argv[]); // elenco soggetti iscritti/dimessi
int at2700(int argc, char* argv[]); // elenco soggetti per categorie
int at2800(int argc, char* argv[]); // elenco soggetti che non donano dal
int at2900(int argc, char* argv[]); // elenco soggetti per frequenza donazioni
#endif // __AT2_H

View File

@ -44,3 +44,8 @@ MENUBAR MENU_BAR(7)
MENU MENU_BAR(7)
SUBMENU MENU_FILE "~File"
/* at2 -8 elenco soggetti per frequenza donazione */
MENUBAR MENU_BAR(8)
MENU MENU_BAR(8)
SUBMENU MENU_FILE "~File"

View File

@ -210,6 +210,7 @@ bool TStampaSospesi::set_print(int m)
else
current_cursor()->setfilter("TCS->S6 == \"S\"", TRUE);
// filtro per categorie
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

View File

@ -42,6 +42,8 @@ class TStampaPerEta : public TPrintapp
ts _tipostampa;
TString16 _codsez, _codsot;
int _etlarghezza, _etcolonne;
bool _stampa80;
protected:
virtual bool user_create();
@ -91,28 +93,60 @@ void TStampaPerEta::set_page(int file, int cnt)
case etichette:
{
TPrint_section& corpo = _form_eti->get_body();
corpo.update();
for (word i = 0; i < corpo.height(); i++)
{
TPrintrow& riga = corpo.row(i);
set_row(i+1,riga);
}
// serve perchè alla prossima etichetta rifaccia la setpage
// altrimenti stampa sempre la stessa etichetta
force_setpage(TRUE);
for (int r=1;r<=_etcolonne;r++)
{
if (current_cursor()->pos()<current_cursor()->items())
{
force_setpage(TRUE);
corpo.update();
for (word i = 0; i < corpo.height(); i++)
{
TPrintrow& riga = corpo.row(i);
TString256 riga1 = riga.row();
riga1.cut(_etlarghezza);
int colonna = ((r-1)*_etlarghezza);
TString16 formato;
formato << '@' << colonna << "g";
riga1.insert(formato,0);
set_row(i+1,riga1);
}
if (r < _etcolonne)
++(*current_cursor());
}
}
}
break;
case elenco:
{
set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(1,"@9g@S", FLD(LF_SOGGETTI,SOG_CATDON));
set_row(1,"@12g#a", &_cognome_nome);
set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@49g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR));
set_row(1,"@100g@S", FLD(LF_SOGGETTI,SOG_TELABI));
set_row(1,"@116g@S", FLD(LF_SOGGETTI,SOG_TELLAV));
set_row(2,"@49g#a", &_dencom);
set_row(2,"@116g@S", FLD(LF_SOGGETTI,SOG_TELALT));
if (_stampa80)
{
set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(2,"@6g@S", FLD(LF_SOGGETTI,SOG_CATDON));
set_row(3,"@2g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS));
set_row(1,"@12g#a", &_cognome_nome);
set_row(2,"@12g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(3,"@12g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR));
set_row(4,"@12g#a", &_dencom);
set_row(1,"@62g@S", FLD(LF_SOGGETTI,SOG_TELABI));
set_row(2,"@62g@S", FLD(LF_SOGGETTI,SOG_TELLAV));
set_row(3,"@62g@S", FLD(LF_SOGGETTI,SOG_TELALT));
set_row(5,"");
}
else
{
set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(1,"@9g@S", FLD(LF_SOGGETTI,SOG_CATDON));
set_row(1,"@12g#a", &_cognome_nome);
set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@49g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR));
set_row(1,"@100g@S", FLD(LF_SOGGETTI,SOG_TELABI));
set_row(1,"@116g@S", FLD(LF_SOGGETTI,SOG_TELLAV));
set_row(2,"@49g#a", &_dencom);
set_row(2,"@116g@S", FLD(LF_SOGGETTI,SOG_TELALT));
}
}
break;
}
@ -157,7 +191,10 @@ void TStampaPerEta::header_sezione(const TString16 codsez, const TString16 codso
intestazione << "/";
intestazione << densot;
}
intestazione.center_just();
if (_stampa80)
intestazione.center_just(80);
else
intestazione.center_just(132);
set_header(1,"@0g%s", (const char*) intestazione);
return;
}
@ -199,6 +236,8 @@ bool TStampaPerEta::preprocess_page(int file, int counter)
_codsot = codsot;
header_sezione(codsez, codsot);
}
if (printer().rows_left()<5)
printer().formfeed();
}
if (_tipostampa==etichette)
if (printer().rows_left() < _form_eti->get_body().height())
@ -229,6 +268,7 @@ bool TStampaPerEta::set_print(int m)
filtra_sezioni();
_dataini = _msk->get(F_DATAINI);
_datafin = _msk->get(F_DATAFIN);
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);
@ -274,20 +314,38 @@ void TStampaPerEta::crea_intestazione()
{
sep << " al ";
sep << data.string();
}
sep.center_just();
}
if (_stampa80)
sep.center_just(80);
else
sep.center_just(132);
set_header(2, "@0g%s", (const char*) sep);
TString16 data_stampa = _data_stampa.string();
set_header(2,"@0g%10s", (const char*) data_stampa);
sep = "";
sep << "Pag. @#";
set_header(2, "@120g%s", (const char*) sep);
if (_stampa80)
set_header(2, "@73g%s", (const char*) sep);
else
set_header(2, "@110g%s", (const char*) sep);
sep = "";
sep.fill('-');
set_header(3, (const char *) sep);
set_header(4,"@0gCodice@9gC.@12gCognome e nome@38gNato il@49gIndirizzo@100gTelefono abit.@116gTelefono lavoro");
set_header(5,"@49gCAP/Località/Comune/Prov.@116gTelefono altro");
set_header(6,"@0g--------@9g--@12g-------------------------@38g----------@49g--------------------------------------------------@100g---------------@116g---------------");
if (_stampa80)
{
_cognome_nome.set_width(51);
set_header(4,"@0gCodice@9gCognome e nome@62gTelefono abit.");
set_header(5,"@0gCat.@9gData di nascita@62gTelefono lavoro");
set_header(6,"@0gTessera@9gIndirizzo@62gTelefono altro");
set_header(7,"@0g--------@9g--------------------------------------------------@62g---------------");
}
else
{
_cognome_nome.set_width(25);
set_header(4,"@0gCodice@9gC.@12gCognome e nome@38gNato il@49gIndirizzo@100gTelefono abit.@116gTelefono lavoro");
set_header(5,"@49gCAP/Località/Comune/Prov.@116gTelefono altro");
set_header(6,"@0g--------@9g--@12g-------------------------@38g----------@49g--------------------------------------------------@100g---------------@116g---------------");
}
}
}
@ -305,6 +363,7 @@ bool TStampaPerEta::user_create()
_etcolonne = config.get_int("EtColonne");
_form_eti = new TEti_pereta_form(etformato);
_msk = new TMask("at2200a");
_stampa80 = config.get_bool("Stampa80");
return TRUE;
}

View File

@ -213,6 +213,7 @@ bool TStampaEsclusi::set_print(int)
else
current_cursor()->setfilter("ESCLUSO != \"\"");
// filtro per categorie
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

View File

@ -254,6 +254,7 @@ bool TStampaModificati::set_print(int)
_dataini = _msk->get(F_DATAINI);
filtra_sezioni();
// filtro per categorie
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

View File

@ -251,6 +251,7 @@ bool TStampaIdonei::set_print(int m)
else
current_cursor()->setfilter("(TCS->S6 == \"I\") || (TCS->S6 == \"F\")", TRUE);
// filtro per categorie
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

View File

@ -227,6 +227,7 @@ bool TStampaIscritti::set_print(int m)
// filtro per sezioni
filtra_sezioni();
// filtro per categorie
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

View File

@ -635,6 +635,7 @@ bool TStampaPerCategorie::set_print(int m)
((TSorted_cursor*)current_cursor())->change_order(chiave);
reset_files();
add_file(LF_SOGGETTI);
_catdon.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);
@ -653,6 +654,7 @@ bool TStampaPerCategorie::set_print(int m)
_catdon.add((const char*) catqui);
if (catses.not_empty() && catses.ok())
_catdon.add((const char*) catses);
_catnondon.destroy();
const TString16 catnpri = _msk->get(F_CATN1);
const TString16 catnsec = _msk->get(F_CATN2);
const TString16 catnter = _msk->get(F_CATN3);

View File

@ -265,6 +265,7 @@ bool TStampaNonDon::set_print(int m)
add_file(LF_SOGGETTI);
filtra_sezioni();
_data = _msk->get(F_DATA);
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

414
at/at2900.cpp Executable file
View File

@ -0,0 +1,414 @@
#include <form.h>
#include <mask.h>
#include <printapp.h>
#include <recarray.h>
#include <utility.h>
#include "donaz.h"
#include "soggetti.h"
#include "sezioni.h"
#include <comuni.h>
#include "at2.h"
#include "at2900a.h"
#define ALIAS_LCP 100
#define ALIAS_TCS 200
enum ts { undefined = 0, elenco = 1, etichette = 2 };
// definizione form per etichette
class TEti_freq_form : public TForm
{
public:
virtual TCursor* cursor() const;
virtual TRelation* relation() const;
TPrint_section& get_body() { return section('B'); } ;
TEti_freq_form(): TForm() {};
TEti_freq_form(const char* form, const char * code = "", int editlevel = 0, const char* desc = "")
: TForm(form,code,editlevel,desc) {};
virtual ~TEti_freq_form() {};
};
class TFrequenza : public TPrintapp
{
static bool filter_func_freq(const TRelation* rel);
TRelation* _rel;
TMask* _msk;
TLocalisamfile* _donaz;
TRecord_array* _sdonazioni;
TEti_freq_form* _form_eti;
TAssoc_array _categorie;
int _cur;
TParagraph_string _cognome_nome, _dencom, _numdonsog;
TDate _data_stampa;
TDate _dataini,_datafin;
int _numdon;
ts _tipostampa;
TString16 _codsez, _codsot;
int _etlarghezza, _etcolonne;
bool _stampa80;
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual bool set_print(int m);
virtual void set_page(int file, int cnt);
virtual bool preprocess_page (int file, int counter);
public:
void crea_intestazione();
void filtra_sezioni();
void header_sezione(const TString16 codsez, const TString16 codsot);
TMask& app_mask() { return *_msk; }
TFrequenza() : _data_stampa(TODAY), _cognome_nome("",25), _dencom("",50), _numdonsog("",5) {}
};
HIDDEN inline TFrequenza& app() { return (TFrequenza&) main_app(); }
TCursor* TEti_freq_form::cursor() const { return app().current_cursor(); }
TRelation* TEti_freq_form::relation() const { return cursor()->relation(); }
void TFrequenza::filtra_sezioni()
{
const TString16 sezini = _msk->get(F_SEZINI);
const TString16 sotini = _msk->get(F_SOTINI);
const TString16 sezfin = _msk->get(F_SEZFIN);
const TString16 sotfin = _msk->get(F_SOTFIN);
TRectype da(LF_SOGGETTI);
TRectype a(LF_SOGGETTI);
if (sezini.not_empty())
da.put(SOG_CODSEZ, sezini);
if (sotini.not_empty())
da.put(SOG_CODSOT, sotini);
if (sezfin.not_empty())
a.put(SOG_CODSEZ, sezfin);
if (sotfin.not_empty())
a.put(SOG_CODSOT, sotfin);
current_cursor()->setregion(da, a);
}
void TFrequenza::set_page(int file, int cnt)
{
switch (_tipostampa)
{
case etichette:
{
TPrint_section& corpo = _form_eti->get_body();
for (int r=1;r<=_etcolonne;r++)
{
if (current_cursor()->pos()<current_cursor()->items())
{
force_setpage(TRUE);
corpo.update();
for (word i = 0; i < corpo.height(); i++)
{
TPrintrow& riga = corpo.row(i);
TString256 riga1 = riga.row();
riga1.cut(_etlarghezza);
int colonna = ((r-1)*_etlarghezza);
TString16 formato;
formato << '@' << colonna << "g";
riga1.insert(formato,0);
set_row(i+1,riga1);
}
if (r < _etcolonne)
++(*current_cursor());
}
}
}
break;
case elenco:
{
if (_stampa80)
{
set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(2,"@0g@8,rs", FLD(LF_SOGGETTI,SOG_TESSAVIS));
set_row(3,"@6g@S", FLD(LF_SOGGETTI,SOG_CATDON));
set_row(1,"@9g#a", &_cognome_nome);
set_row(3,"@9g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@44g@S", FLD(LF_SOGGETTI,SOG_TELABI));
set_row(2,"@44g@S", FLD(LF_SOGGETTI,SOG_TELLAV));
set_row(3,"@44g@S", FLD(LF_SOGGETTI,SOG_TELALT));
//set_row(1,"@60g@ld", FLD(LF_SOGGETTI,SOG_DATAULTDON));
//set_row(2,"@64g@S", FLD(LF_SOGGETTI,SOG_TIPOULTDON));
set_row(1,"@60g#a", &_numdonsog);
set_row(4,"");
}
else
{
set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(1,"@9g@S", FLD(LF_SOGGETTI,SOG_CATDON));
set_row(1,"@12g#a", &_cognome_nome);
set_row(1,"@38g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@49g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR));
set_row(1,"@100g@S", FLD(LF_SOGGETTI,SOG_TELABI));
set_row(1,"@116g@S", FLD(LF_SOGGETTI,SOG_TELLAV));
//set_row(1,"@132g@ld", FLD(LF_SOGGETTI,SOG_DATAULTDON));
set_row(2,"@49g#a", &_dencom);
set_row(2,"@116g@S", FLD(LF_SOGGETTI,SOG_TELALT));
//set_row(2,"@132g@S", FLD(LF_SOGGETTI,SOG_TIPOULTDON));
set_row(1,"@132g#a", &_numdonsog);
}
}
break;
}
}
bool TFrequenza::filter_func_freq(const TRelation* rel)
{
bool filtrato = TRUE;
TLocalisamfile& sog = rel->lfile();
// filtro per categorie
TAssoc_array& categorie = app()._categorie;
if (categorie.items() != 0)
{
const TString16 cat = sog.get(SOG_CATDON);
filtrato = categorie.is_key((const char*) cat);
}
// filtro per numero donazioni nel periodo
if (filtrato)
{
filtrato = FALSE;
const long codice = sog.get_long(SOG_CODICE);
TRectype* key = new TRectype(LF_DONAZ);
key->put(DON_CODICE, codice);
int err = app()._sdonazioni->read(key);
if (err == NOERR)
{
int numdon = 0;
for (int r=1; r<=app()._sdonazioni->rows(); r++)
{
const TRectype& riga = app()._sdonazioni->row(r);
TDate datadon = riga.get_date(DON_DATADON);
if ((datadon>=app()._dataini) && (datadon<=app()._datafin))
numdon++;
}
if (numdon >= app()._numdon)
filtrato = TRUE;
}
}
return filtrato;
}
void TFrequenza::header_sezione(const TString16 codsez, const TString16 codsot)
{
const TString80 densez = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSEZ);
const TString80 densot = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSOT);
TString intestazione(132);
intestazione = "Sezione: ";
intestazione << codsez;
intestazione << "/";
intestazione << codsot;
intestazione << " ";
intestazione << densez;
if ((densot.ok())&& (densot.not_empty()))
{
intestazione << "/";
intestazione << densot;
}
if (_stampa80)
intestazione.center_just(80);
else
intestazione.center_just(132);
set_header(1,"@0g%s", (const char*) intestazione);
return;
}
bool TFrequenza::preprocess_page(int file, int counter)
{
if (_tipostampa == elenco)
{
TRectype recsog = current_cursor()->curr();
const long codice = recsog.get_long(SOG_CODICE);
TRectype* key = new TRectype(LF_DONAZ);
key->put(DON_CODICE, codice);
int err = _sdonazioni->read(key);
if (err == NOERR)
{
int numdon = 0;
for (int r=1; r<=_sdonazioni->rows(); r++)
{
const TRectype& riga = _sdonazioni->row(r);
TDate datadon = riga.get_date(DON_DATADON);
if ((datadon>=_dataini) && (datadon<=_datafin))
numdon++;
}
_numdonsog = format("%3d",numdon);
}
TString80 nome = recsog.get(SOG_COGNOME);
nome << " ";
nome << recsog.get(SOG_NOME);
_cognome_nome = nome;
TString256 localita = "";
localita << current_cursor()->curr(-ALIAS_LCP).get("S6");
if (localita.not_empty() && localita.ok())
{
localita << " ";
localita << current_cursor()->curr(-ALIAS_LCP).get("S0");
localita << " - ";
}
else
{
localita = current_cursor()->curr(LF_COMUNI).get(COM_CAPCOM);
localita << " ";
}
localita << current_cursor()->curr(LF_COMUNI).get(COM_DENCOM);
localita.trim();
_dencom = localita;
// salto pagina se cambio sezione
const TString16 codsez = recsog.get(SOG_CODSEZ);
const TString16 codsot = recsog.get(SOG_CODSOT);
if ((_codsez!=codsez)||(_codsot!=codsot))
{
if (_codsez != "**")
printer().formfeed();
_codsez = codsez;
_codsot = codsot;
header_sezione(codsez, codsot);
}
}
if (_tipostampa==etichette)
if (printer().rows_left() < _form_eti->get_body().height())
printer().formfeed();
return TRUE;
}
bool TFrequenza::set_print(int m)
{
_tipostampa = undefined;
KEY tasto;
tasto = _msk->run();
switch (tasto)
{
case F_ELENCO:
_tipostampa = elenco;
_codsez = "**";
_codsot = "**";
break;
case F_ETICHETTE:
_tipostampa = etichette;
break;
}
if (_tipostampa != undefined)
{
reset_files();
add_file(LF_SOGGETTI);
filtra_sezioni();
_numdon = _msk->get_int(F_NUMDON);
_dataini = _msk->get(F_DATAINI);
_datafin = _msk->get(F_DATAFIN);
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);
const TString16 catqua = _msk->get(F_CAT4);
const TString16 catqui = _msk->get(F_CAT5);
const TString16 catses = _msk->get(F_CAT6);
if (catpri.not_empty() && catpri.ok())
_categorie.add((const char*) catpri);
if (catsec.not_empty() && catsec.ok())
_categorie.add((const char*) catsec);
if (catter.not_empty() && catter.ok())
_categorie.add((const char*) catter);
if (catqua.not_empty() && catqua.ok())
_categorie.add((const char*) catqua);
if (catqui.not_empty() && catqui.ok())
_categorie.add((const char*) catqui);
if (catses.not_empty() && catses.ok())
_categorie.add((const char*) catses);
current_cursor()->set_filterfunction (filter_func_freq);
reset_print();
crea_intestazione();
return TRUE;
}
else
return FALSE;
}
void TFrequenza::crea_intestazione()
{
reset_header();
if (_tipostampa == elenco)
{
TString sep(132);
sep = "SOGGETTI CHE HANNO FATTO ALMENO ";
sep << _numdon;
sep << " DONAZIONI DAL ";
sep << _dataini.string();
sep << " AL ";
sep << _datafin.string();
if (_stampa80)
sep.center_just(80);
else
sep.center_just(132);
set_header(2, "@0g%s", (const char*) sep);
TString16 data_stampa = _data_stampa.string();
set_header(2,"@0g%10s", (const char*) data_stampa);
sep = "";
sep << "Pag. @#";
if (_stampa80)
set_header(2, "@73g%s", (const char*) sep);
else
set_header(2, "@110g%s", (const char*) sep);
set_header(3, "");
if (_stampa80)
{
set_header(4,"@0gCodice@9gCognome e nome@44gTelefono abit.@60gNum.don.");
set_header(5,"@0gTessera@44gTelefono lavoro");
set_header(6,"@0gCateg.@9gNato il@44gTelefono altro");
set_header(7,"@0g--------@9g----------------------------------@44g--------------@60g--------");
_cognome_nome.set_width(35);
}
else
{
set_header(4,"@0gCodice@9gC.@12gCognome e nome@38gNato il@49gIndirizzo@100gTelefono abit.@116gTelefono lavoro@132gNum.don.");
set_header(5,"@49gCAP/Località/Comune/Prov.@116gTelefono altro");
set_header(6,"@0g--------@9g--@12g-------------------------@38g----------@49g--------------------------------------------------@100g---------------@116g---------------@132g--------");
_cognome_nome.set_width(25);
}
}
}
bool TFrequenza::user_create()
{
_rel = new TRelation(LF_SOGGETTI);
_rel->add("TCS", "CODTAB==STATO",1,0,ALIAS_TCS);
_rel->add("LCP", "CODTAB==DOM_CODLOC",1,0,ALIAS_LCP);
_rel->add(LF_COMUNI, "COM==DOM_CODCOM");
_rel->add(LF_SEZIONI, "CODSEZ==CODSEZ|CODSOT==CODSOT");
_cur = add_cursor(new TCursor(_rel, "", 3));
_msk = new TMask("at2900a");
_donaz = new TLocalisamfile(LF_DONAZ);
_sdonazioni = new TRecord_array(LF_DONAZ,DON_PROGDON);
TConfig config(CONFIG_STUDIO);
TString16 etformato = config.get("EtFormato");
_etlarghezza = config.get_int("EtLarghezza");
_etcolonne = config.get_int("EtColonne");
_form_eti = new TEti_freq_form(etformato);
_stampa80 = config.get_bool("Stampa80");
return TRUE;
}
bool TFrequenza::user_destroy()
{
delete _msk;
delete _rel;
delete _form_eti;
delete _donaz;
delete _sdonazioni;
return TRUE;
}
int at2900(int argc, char* argv[])
{
TFrequenza a;
a.run(argc, argv, "Soggetti per frequenza di donazione");
return 0;
}

31
at/at2900a.h Executable file
View File

@ -0,0 +1,31 @@
// stampa lista frequenza
// definizione campi per maschera di selezione
#define F_SEZINI 101
#define F_D_SEZINI 102
#define F_SOTINI 103
#define F_D_SOTINI 104
#define F_SEZFIN 105
#define F_D_SEZFIN 106
#define F_SOTFIN 107
#define F_D_SOTFIN 108
#define F_CAT1 201
#define F_D_CAT1 202
#define F_CAT2 203
#define F_D_CAT2 204
#define F_CAT3 205
#define F_D_CAT3 206
#define F_CAT4 207
#define F_D_CAT4 208
#define F_CAT5 209
#define F_D_CAT5 210
#define F_CAT6 211
#define F_D_CAT6 212
#define F_NUMDON 301
#define F_DATAINI 302
#define F_DATAFIN 303
#define F_ELENCO 401
#define F_ETICHETTE 402

289
at/at2900a.uml Executable file
View File

@ -0,0 +1,289 @@
#include "at2900a.h"
PAGE "Soggetti per frequenza di donazione" -1 -1 78 20
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 1 "Scelta sezioni/sottogruppi"
END
STRING F_SEZINI 2
BEGIN
PROMPT 2 2 "Da "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZINI
INPUT CODSOT F_SOTINI
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZINI CODSEZ
OUTPUT F_D_SEZINI DENSEZ
OUTPUT F_SOTINI CODSOT
OUTPUT F_D_SOTINI DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione da cui partire"
END
STRING F_D_SEZINI 25
BEGIN
PROMPT 11 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZINI
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZINI
CHECKTYPE NORMAL
HELP "Sezione da cui partire"
END
STRING F_SOTINI 2
BEGIN
PROMPT 2 3 " "
COPY ALL F_SEZINI
CHECKTYPE SEARCH
HELP "Codice sottogruppo da cui partire"
END
STRING F_D_SOTINI 25
BEGIN
PROMPT 11 3 ""
FLAGS "U"
COPY USE F_D_SEZINI
INPUT DENSEZ F_D_SEZINI
INPUT DENSOT F_D_SOTINI
COPY DISPLAY F_D_SEZINI
COPY OUTPUT F_D_SEZINI
CHECKTYPE NORMAL
HELP "Sottogruppo da cui partire"
END
STRING F_SEZFIN 2
BEGIN
PROMPT 41 2 "A "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZFIN
INPUT CODSOT F_SOTFIN
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZFIN CODSEZ
OUTPUT F_D_SEZFIN DENSEZ
OUTPUT F_SOTFIN CODSOT
OUTPUT F_D_SOTFIN DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione finale"
END
STRING F_D_SEZFIN 25
BEGIN
PROMPT 49 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZFIN
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZFIN
CHECKTYPE NORMAL
HELP "Sezione finale"
END
STRING F_SOTFIN 2
BEGIN
PROMPT 41 3 " "
COPY ALL F_SEZFIN
CHECKTYPE SEARCH
HELP "Codice sottogruppo finale"
END
STRING F_D_SOTFIN 25
BEGIN
PROMPT 49 3 ""
FLAGS "U"
COPY USE F_D_SEZFIN
INPUT DENSEZ F_D_SEZFIN
INPUT DENSOT F_D_SOTFIN
COPY DISPLAY F_D_SEZFIN
COPY OUTPUT F_D_SEZFIN
CHECKTYPE NORMAL
HELP "Sottogruppo finale"
END
GROUPBOX DLG_NULL 77 5
BEGIN
PROMPT 1 5 "Categorie"
END
STRING F_CAT1 2
BEGIN
PROMPT 2 6 ""
FLAGS "U"
USE CTD
INPUT CODTAB F_CAT1
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@30" S0
OUTPUT F_CAT1 CODTAB
OUTPUT F_D_CAT1 S0
CHECKTYPE NORMAL
WARNING "Codice non presente"
HELP "Categoria di appartenenza"
END
STRING F_D_CAT1 30
BEGIN
PROMPT 8 6 ""
FLAGS "D"
END
STRING F_CAT2 2
BEGIN
PROMPT 2 7 ""
FLAGS "U"
USE CTD
INPUT CODTAB F_CAT2
COPY DISPLAY F_CAT1
OUTPUT F_CAT2 CODTAB
OUTPUT F_D_CAT2 S0
CHECKTYPE NORMAL
WARNING "Codice non presente"
HELP "Categoria di appartenenza"
END
STRING F_D_CAT2 30
BEGIN
PROMPT 8 7 ""
FLAGS "D"
END
STRING F_CAT3 2
BEGIN
PROMPT 2 8 ""
FLAGS "U"
USE CTD
INPUT CODTAB F_CAT3
COPY DISPLAY F_CAT1
OUTPUT F_CAT3 CODTAB
OUTPUT F_D_CAT3 S0
CHECKTYPE NORMAL
WARNING "Codice non presente"
HELP "Categoria di appartenenza"
END
STRING F_D_CAT3 30
BEGIN
PROMPT 8 8 ""
FLAGS "D"
END
STRING F_CAT4 2
BEGIN
PROMPT 40 6 ""
FLAGS "U"
USE CTD
INPUT CODTAB F_CAT4
COPY DISPLAY F_CAT1
OUTPUT F_CAT4 CODTAB
OUTPUT F_D_CAT4 S0
CHECKTYPE NORMAL
WARNING "Codice non presente"
HELP "Categoria di appartenenza"
END
STRING F_D_CAT4 30
BEGIN
PROMPT 46 6 ""
FLAGS "D"
END
STRING F_CAT5 2
BEGIN
PROMPT 40 7 ""
FLAGS "U"
USE CTD
INPUT CODTAB F_CAT5
COPY DISPLAY F_CAT1
OUTPUT F_CAT5 CODTAB
OUTPUT F_D_CAT5 S0
CHECKTYPE NORMAL
WARNING "Codice non presente"
HELP "Categoria di appartenenza"
END
STRING F_D_CAT5 30
BEGIN
PROMPT 46 7 ""
FLAGS "D"
END
STRING F_CAT6 2
BEGIN
PROMPT 40 8 ""
FLAGS "U"
USE CTD
INPUT CODTAB F_CAT6
COPY DISPLAY F_CAT1
OUTPUT F_CAT6 CODTAB
OUTPUT F_D_CAT6 S0
CHECKTYPE NORMAL
WARNING "Codice non presente"
HELP "Categoria di appartenenza"
END
STRING F_D_CAT6 30
BEGIN
PROMPT 46 8 ""
FLAGS "D"
END
GROUPBOX DLG_NULL 77 3
BEGIN
PROMPT 1 10 "Opzioni di elaborazione"
END
NUMBER F_NUMDON 3
BEGIN
PROMPT 2 11 "Almeno "
END
DATE F_DATAINI
BEGIN
PROMTP 14 11 "donazioni dal "
END
DATE F_DATAFIN
BEGIN
PROMPT 40 11 "al "
END
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 13 "Stampa"
END
BUTTON F_ELENCO 9 2
BEGIN
PROMPT -13 14 "Elenco"
MESSAGE EXIT,F_ELENCO
END
BUTTON F_ETICHETTE 9 2
BEGIN
PROMPT -23 14 "Etichette"
MESSAGE EXIT,F_ETICHETTE
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -33 14 ""
END
ENDPAGE
ENDMASK

View File

@ -4,18 +4,28 @@
#include "at3.h"
#define usage "Error - usage : %s -{0}"
#define usage "Error - usage : %s -{0|1|2|3|4|5|6}"
int main(int argc,char** argv)
{
int rt = -1 ;
int rt = -1 ;
const int r = (argc > 1) ? atoi(&argv[1][1]) : -1;
switch (r)
{
case 0:
rt = at3100(argc,argv) ; break;
case 1:
rt = at3200(argc,argv) ; break;
case 2:
rt = at3300(argc,argv) ; break;
case 3:
rt = at3400(argc,argv) ; break;
case 4:
rt = at3500(argc,argv) ; break;
case 5:
rt = at3600(argc,argv) ; break;
case 6:
rt = at3700(argc,argv) ; break;
default:
error_box(usage, argv[0]) ; break;
}

View File

@ -2,6 +2,12 @@
#define __AT3_H
int at3100(int argc, char* argv[]);
int at3200(int argc, char* argv[]);
int at3300(int argc, char* argv[]);
int at3400(int argc, char* argv[]);
int at3500(int argc, char* argv[]);
int at3600(int argc, char* argv[]);
int at3700(int argc, char* argv[]);
#endif // __AT3_H

View File

@ -5,53 +5,37 @@
#include <default.url>
/* ----------------------------------------------------
* at3 -0
* ---------------------------------------------------- */
/* at3 -0 statistica soggetti per sesso e fascia di eta'*/
MENU TASK_MENUBAR
SUBMENU MENU_FILE "~File"
SUBMENU MENU_FILE "~File"
/* ----------------------------------------------------
* at1 -1
* ---------------------------------------------------- */
/* at3 -1 statistica donazioni per mese e gruppo/rh */
MENUBAR MENU_BAR(1)
MENU MENU_BAR(1)
SUBMENU MENU_FILE "~File"
/* ----------------------------------------------------
* at1 -2
* ---------------------------------------------------- */
SUBMENU MENU_FILE "~File"
/* at3 -2 statistica soggetti per categorie */
MENUBAR MENU_BAR(2)
MENU MENU_BAR(2)
SUBMENU MENU_FILE "~File"
/* ----------------------------------------------------
* at1 -3
*
* ----------------------------------------------------*/
SUBMENU MENU_FILE "~File"
/* at3 -3 statistica donazioni per mese e tipo don. */
MENUBAR MENU_BAR(3)
MENU MENU_BAR(3)
SUBMENU MENU_FILE "~File"
SUBMENU MENU_FILE "~File"
/* ----------------------------------------------------
* at1 -4
* ---------------------------------------------------- */
/* at3 -4 statistica giornaliera donazioni per tipo */
MENUBAR MENU_BAR(4)
MENU MENU_BAR(4)
SUBMENU MENU_FILE "~File"
SUBMENU MENU_FILE "~File"
/* ----------------------------------------------------
* at1 -5
* ---------------------------------------------------- */
/* at3 -5 statistica donazioni/donatori per sesso, gruppo e rh */
MENUBAR MENU_BAR(5)
MENU MENU_BAR(5)
SUBMENU MENU_FILE "~File"
SUBMENU MENU_FILE "~File"
/* at3 -6 statistica soggetti per sesso, gruppo e rh */
MENUBAR MENU_BAR(6)
MENU MENU_BAR(6)
SUBMENU MENU_FILE "~File"

View File

@ -1,113 +1,562 @@
#include <applicat.h>
#include <execp.h>
#include <mask.h>
#include <msksheet.h>
#include <printer.h>
#include <progind.h>
#include <real.h>
#include <relation.h>
#include <tabutil.h>
#include <urldefid.h>
#include <..\include\filetext.h>
#include <..\include\filetext.cpp>
#include <lffiles.h>
#include <utility.h>
#include "at3.h"
// nomi campi maschera
//#include "at3100a.h"
#include "at3100a.h"
// nomi dei campi
#include "soggetti.h"
#include "atstats.h"
#include "sezioni.h"
//#include "atlib.h"
// classe per la definizione di una riga di statistica
class TRigaSFascia : public TObject
{
int _etaini,_etafin;
TArray _valori;
class TCarica_app : public TApplication
protected:
const TRigaSFascia& copy(const TRigaSFascia& riga);
public:
const int etaini() const { return _etaini; }
const int etafin() const { return _etafin; }
TObject* dup() const { return new TRigaSFascia(*this); }
const TRigaSFascia& operator = (const TRigaSFascia& riga);
const real& operator [] (int colonna) const;
void aggiorna_valore(int colonna, const real& numero) ;
void azzera_valori();
// costruttore
TRigaSFascia(int etaini, int etafin) {_etaini = etaini; _etafin = etafin;}
// costruttore di copia
TRigaSFascia(const TRigaSFascia& riga) { copy(riga); }
virtual ~TRigaSFascia() {};
};
const TRigaSFascia& TRigaSFascia::copy(const TRigaSFascia& riga)
{
_etaini = riga._etaini;
_etafin = riga._etafin;
_valori = riga._valori;
return (*this);
}
const TRigaSFascia& TRigaSFascia::operator = (const TRigaSFascia& riga)
{
copy(riga);
return (*this);
}
const real& TRigaSFascia::operator [] (int colonna) const
{
real* valore = (real*)_valori.objptr(colonna);
if (valore == NULL)
return ZERO;
else
return *valore;
}
void TRigaSFascia::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 TRigaSFascia::azzera_valori()
{
_valori.destroy();
}
class TStatSogxEta : public TApplication
{
TMask* _msk;
TRelation* _rel;
TFile_text* _trasfile;
TLocalisamfile* _soggetti;
TCursor* _cur;
TLocalisamfile* _sezioni;
TLocalisamfile* _soggetti;
TLocalisamfile* _atstats;
TAssoc_array* _colonne;
TArray _righe;
TString16 _sezini, _sotini, _sezfin, _sotfin;
TString16 _catdon;
TDate _data;
TArray _etaini, _etafin;
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 write();
int data2row(const int eta);
bool riepilogo();
bool stampa();
bool crea_colonne();
bool crea_righe();
void azzera_righe();
void stampa_sezione(TString16 codsez, TString16 codsot);
void crea_intestazione();
public:
TCarica_app() {}
TStatSogxEta() {}
};
HIDDEN inline TCarica_app& app() { return (TCarica_app&) main_app(); }
HIDDEN inline TStatSogxEta& app() { return (TStatSogxEta&) main_app(); }
bool TCarica_app::create()
int TStatSogxEta::data2row(const int eta)
{
int indice = 0;
for (int i=0; i<_etaini.items(); i++)
{
real valore;
real* val1 = (real*) _etaini.objptr(i);
valore = *val1;
int etaini = valore.integer();
real* val2 = (real*) _etafin.objptr(i);
valore = *val2;
int etafin = valore.integer();
if ((eta >= etaini) && (eta <= etafin))
indice = i;
}
return indice;
}
bool TStatSogxEta::crea_colonne()
{
_colonne->destroy();
real contatore(ZERO);
real* oggetto = new real(contatore);
const char* indice = "0";
_colonne->add(indice,(TObject*)oggetto);
indice = "1"; // maschi
contatore = contatore+1;
real* oggetto2 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto2);
indice = "2"; // femmine
contatore = contatore+1;
real* oggetto3 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto3);
indice = "9"; // non spec.
contatore = contatore+1;
real* oggetto4 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto4);
return TRUE;
}
bool TStatSogxEta::crea_righe()
{
for (int i=0;i<_etaini.items();i++)
{
real valore;
real* val1 = (real*) _etaini.objptr(i);
valore = *val1;
int etaini = valore.integer();
real* val2 = (real*) _etafin.objptr(i);
valore = *val2;
int etafin = valore.integer();
_righe.add(new TRigaSFascia(etaini, etafin), i);
}
return _righe.items()>0;
}
bool TStatSogxEta::create()
{
TApplication::create();
_msk = new TMask("at3100a");
_rel = new TRelation(LF_SOGGETTI);
_trasfile = new TFile_text("sogg.txt","sogg.ini");
_soggetti = new TLocalisamfile(LF_SOGGETTI);
_atstats = new TLocalisamfile(LF_ATSTATS);
_sezioni = new TLocalisamfile(LF_SEZIONI);
_colonne = new TAssoc_array();
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}
bool TCarica_app::destroy()
bool TStatSogxEta::destroy()
{
delete _rel;
delete _msk;
delete _trasfile;
delete _soggetti;
delete _atstats;
delete _sezioni;
delete _colonne;
return TApplication::destroy();
}
bool TCarica_app::menu(MENU_TAG m)
bool TStatSogxEta::menu(MENU_TAG m)
{
TMask& msk = get_mask();
KEY tasto;
do
{
tasto = msk.run();
switch (tasto)
{
case K_ENTER: // registra
{
TCarica_app::write();
}
break;
}
}
while (tasto != K_QUIT);
return FALSE;
tasto = msk.run();
if (tasto == K_ENTER)
{
_sezini = _msk->get(F_SEZINI);
_sotini = _msk->get(F_SOTINI);
_sezfin = _msk->get(F_SEZFIN);
_sotfin = _msk->get(F_SOTFIN);
_catdon = _msk->get(F_CATDON);
_data = _msk->get_date(F_DATA);
TSheet_field& s = (TSheet_field&)_msk->field(F_FASCIE);
for (int r=0; r<s.items(); r++)
{
TToken_string& row = s.row(r);
const int etaini = row.get_int(0);
const int etafin = row.get_int();
if (etaini != 0 || etafin != 0)
{
_etaini.add(new real(etaini),r);
_etafin.add(new real(etafin),r);
}
}
if (riepilogo())
stampa();
}
return FALSE;
}
int TCarica_app::write()
void TStatSogxEta::crea_intestazione()
{
TProgind *pi;
pi = new TProgind(10,"Caricamento dati da file di testo", FALSE, TRUE, 1);
pi->setstatus(1);
_trasfile->open("sogg.txt",'r');
_rel->lfile().setkey(2);
_rel->write_enable();
TRecord_text rec;
while (_trasfile->ok_r())
{
pi->addstatus(1);
if (_trasfile->read(rec) == NOERR)
{
_trasfile->autosave(*_rel, rec);
}
}
delete pi;
return NOERR;
TPrintrow row;
TString256 sep;
sep = "STATISTICA SOGGETTI PER SESSO E ETA' al ";
sep << _data.string();
sep.center_just(80);
row.put(sep);
row.put("@>", 1);
row.put("Pag. @#", 70);
printer().setheaderline(2, row);
sep = "";
sep << "Categoria ";
sep << _catdon;
sep.center_just(80);
row.reset();
row.put(sep);
printer().setheaderline(3, row);
sep = "";
sep << "Fascia di eta' Sconosciuto Maschi Femmine Non spec. Totale";
row.reset();
row.put(sep);
printer().setheaderline(5, row);
sep = "";
sep.fill('-');
row.reset();
row.put(sep);
printer().setheaderline(6, row);
}
bool TStatSogxEta::stampa()
{
if (printer().open())
{
crea_intestazione();
TRelation* relstat = new TRelation(LF_ATSTATS);
TCursor* curstat = new TCursor(relstat, "", 1);
TString16 oldsez = "**";
TString16 oldsot = "**";
double numero;
TString16 actsez, actsot;
TString16 sesso;
int fascia;
long last = curstat->items();
for ( *curstat=0; curstat->pos() < last; ++(*curstat) )
{
actsez = curstat->curr().get(ATSS_CODSEZ);
actsot = curstat->curr().get(ATSS_CODSOT);
fascia = curstat->curr().get_int(ATSS_FASCIA);
sesso = curstat->curr().get(ATSS_SESSO);
if (sesso.empty())
sesso = "9";
numero = (double)curstat->curr().get_int(ATSS_NUMERO);
if (actsez != oldsez || actsot != oldsot)
{
if (oldsez != "**" && oldsot != "**")
{
stampa_sezione(oldsez,oldsot);
azzera_righe();
}
oldsez = actsez;
oldsot = actsot;
}
TRigaSFascia& riga = (TRigaSFascia&)_righe[fascia];
real& colonna = (real&)_colonne->find((const char*)sesso);
real n = numero;
riga.aggiorna_valore(colonna.integer(),n);
}
if (oldsez != "**" && oldsot != "**")
stampa_sezione(oldsez,oldsot);
delete curstat;
delete relstat;
printer().close();
return TRUE;
}
else
return FALSE;
}
void TStatSogxEta::azzera_righe()
{
for (int i=0;i<_etaini.items();i++)
{
TRigaSFascia& riga = (TRigaSFascia&)_righe[i];
riga.azzera_valori();
}
}
void TStatSogxEta::stampa_sezione(TString16 codsez, TString16 codsot)
{
TPrintrow row;
TString256 rigastampa;
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;
}
}
rigastampa.center_just(80);
row.put(rigastampa);
printer().setheaderline(1, row);
TRigaSFascia rigatotali(0,0);
TString16 valore;
real totalefascia = ZERO;
for (int r=0;r<_etaini.items();r++)
{
TRigaSFascia& riga = (TRigaSFascia&)_righe[r];
row.reset();
real valreal;
rigastampa = "da ";
real* val1 = (real*)_etaini.objptr(r);
valreal = *val1;
rigastampa << valreal.string();
rigastampa << " a ";
real* val2 = (real*)_etafin.objptr(r);
valreal = *val2;
rigastampa << valreal.string();
rigastampa << " anni";
totalefascia = ZERO;
// ciclo per totali
for (int i=0;i<_colonne->items();i++)
{
rigatotali.aggiorna_valore(i,riga[i]);
totalefascia+=riga[i];
}
// ciclo per stampa
int pos = 15;
for (int j=0;j<_colonne->items();j++)
{
//rigatotali.aggiorna_valore(i,riga[i]);
//totalefascia+=riga[i];
valore = "";
valore.format("%8d",riga[i].integer());
rigastampa.overwrite((const char*)valore, pos);
real perc = (riga[j]/totalefascia)*100;
pos=pos+6;
valore = "";
valore << perc.string(3,2);
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
if (totalefascia != 0)
{
valore = "";
valore.format("%8d",totalefascia.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
}
}
// stampa totali per sezione
rigastampa = "";
rigastampa.fill('-');
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
rigastampa = "";
rigastampa = "Totale";
real totale;
totale = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
totale+=rigatotali[i];
valore = "";
valore.format("%8d",rigatotali[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totale.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
printer().formfeed();
}
bool TStatSogxEta::riepilogo()
{
if (crea_colonne() && crea_righe())
{
// cancello i risultati della elaborazione precedente
TLocalisamfile stat(LF_ATSTATS);
for (stat.first(); !stat.eof(); stat.next())
stat.remove();
stat.setkey(1);
_cur = new TCursor(_rel, "", 1);
TString256 filtro = "";
// filtro per categoria
if (_catdon.not_empty())
{
if (filtro.empty())
filtro = format("(90->CATDON == \"%s\")",(const char*)_catdon);
else
{
filtro << " && ";
filtro << format("(90->CATDON == \"%s\")",(const char*)_catdon);
}
if (_data.ok())
{
TTable ctd("CTD");
ctd.put("CODTAB",_catdon);
if (ctd.read() == NOERR)
{
bool dimissione = ctd.get_bool("B0");
if (dimissione)
filtro << " && (ANSI(90->DATADIM)<=" << _data.string(ANSI) << ")";
else
filtro << " && (ANSI(90->DATAISC)<=" << _data.string(ANSI) << ")";
}
}
}
// filtro per sezione/sottogruppo
if (_sezini.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
}
if (_sotini.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
else
{
filtro << " && ";
filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
}
}
}
if (_sezfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
}
if (_sotfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
else
{
filtro << " && ";
filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
}
}
}
_cur->setfilter((const char*) filtro, TRUE);
TString16 codsez, codsot;
long numero;
TString16 sesso;
int eta, fascia;
TDate datanasc;
const TDate oggi(TODAY);
const int anno = oggi.year();
TRectype& recsog = _cur->curr();
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);
codsez = recsog.get(SOG_CODSEZ);
codsot = recsog.get(SOG_CODSOT);
datanasc = recsog.get_date(SOG_DATANASC);
eta = _data.year() - datanasc.year();
fascia = data2row(eta);
sesso = recsog.get(SOG_SESSO);
if (sesso.empty())
sesso = "9";
stat.zero();
stat.put(ATSS_CODSEZ, codsez);
stat.put(ATSS_CODSOT, codsot);
stat.put(ATSS_SESSO, sesso);
stat.put(ATSS_FASCIA, fascia);
if (stat.read() == NOERR)
{
numero = stat.get_long(ATSS_NUMERO);
numero++;
stat.put(ATSS_NUMERO, numero);
stat.rewrite();
}
else
{
stat.put(ATSS_CODSEZ, codsez);
stat.put(ATSS_CODSOT, codsot);
stat.put(ATSS_SESSO, sesso);
stat.put(ATSS_FASCIA, fascia);
numero = 1;
stat.put(ATSS_NUMERO, numero);
stat.write();
}
}
return (stat.eod() > 0);
}
else
return FALSE;
}
int at3100(int argc, char* argv[])
{
TCarica_app a;
a.run(argc, argv, "Carica dati da file di testo");
TStatSogxEta a;
a.run(argc, argv, "Statistica soggetti per sesso e eta'");
return 0;
}

19
at/at3100a.h Executable file
View File

@ -0,0 +1,19 @@
// statistica donatori per sesso e fascie di eta'
// definizione campi per maschera di selezione
#define F_SEZINI 101
#define F_D_SEZINI 102
#define F_SOTINI 103
#define F_D_SOTINI 104
#define F_SEZFIN 105
#define F_D_SEZFIN 106
#define F_SOTFIN 107
#define F_D_SOTFIN 108
#define F_CATDON 301
#define F_D_CATDON 302
#define F_DATA 303
#define F_FASCIE 304
#define F_ETAINI 101
#define F_ETAFIN 102

View File

@ -1,22 +1,204 @@
TOOLBAR "" 0 20 0 2
#include "at3100a.h"
BUTTON DLG_OK 10 2
PAGE "Statistica donatori per sesso e fascie di eta'" -1 -1 78 20
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT -12 -11 ""
PROMPT 1 1 "Scelta sezioni/sottogruppi"
END
BUTTON DLG_QUIT 10 2
STRING F_SEZINI 2
BEGIN
PROMPT -22 -11 ""
PROMPT 2 2 "Da "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZINI
INPUT CODSOT F_SOTINI
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZINI CODSEZ
OUTPUT F_D_SEZINI DENSEZ
OUTPUT F_SOTINI CODSOT
OUTPUT F_D_SOTINI DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione da cui partire"
END
ENDPAGE
STRING F_D_SEZINI 25
BEGIN
PROMPT 11 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZINI
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZINI
CHECKTYPE NORMAL
HELP "Sezione da cui partire"
END
PAGE "Trasferimento dati da file di testo: prova" -1 -1 78 20
STRING F_SOTINI 2
BEGIN
PROMPT 2 3 " "
COPY ALL F_SEZINI
CHECKTYPE SEARCH
HELP "Codice sottogruppo da cui partire"
END
STRING F_D_SOTINI 25
BEGIN
PROMPT 11 3 ""
FLAGS "U"
COPY USE F_D_SEZINI
INPUT DENSEZ F_D_SEZINI
INPUT DENSOT F_D_SOTINI
COPY DISPLAY F_D_SEZINI
COPY OUTPUT F_D_SEZINI
CHECKTYPE NORMAL
HELP "Sottogruppo da cui partire"
END
STRING F_SEZFIN 2
BEGIN
PROMPT 41 2 "A "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZFIN
INPUT CODSOT F_SOTFIN
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZFIN CODSEZ
OUTPUT F_D_SEZFIN DENSEZ
OUTPUT F_SOTFIN CODSOT
OUTPUT F_D_SOTFIN DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione finale"
END
STRING F_D_SEZFIN 25
BEGIN
PROMPT 49 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZFIN
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZFIN
CHECKTYPE NORMAL
HELP "Sezione finale"
END
STRING F_SOTFIN 2
BEGIN
PROMPT 41 3 " "
COPY ALL F_SEZFIN
CHECKTYPE SEARCH
HELP "Codice sottogruppo finale"
END
STRING F_D_SOTFIN 25
BEGIN
PROMPT 49 3 ""
FLAGS "U"
COPY USE F_D_SEZFIN
INPUT DENSEZ F_D_SEZFIN
INPUT DENSOT F_D_SOTFIN
COPY DISPLAY F_D_SEZFIN
COPY OUTPUT F_D_SEZFIN
CHECKTYPE NORMAL
HELP "Sottogruppo finale"
END
GROUPBOX DLG_NULL 77 14
BEGIN
PROMPT 1 5 "Opzioni per la statistica"
END
STRING F_CATDON 2
BEGIN
PROMPT 2 6 "Cat. "
FLAGS "U"
USE CTD
INPUT CODTAB F_CATDON
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@40" S0
OUTPUT F_CATDON CODTAB
OUTPUT F_D_CATDON S0
CHECKTYPE NORMAL
WARNING "Codice categoria non presente"
HELP "Categoria di appartenenza"
END
STRING F_D_CATDON 25
BEGIN
PROMPT 12 6 ""
FLAGS "D"
END
DATE F_DATA
BEGIN
PROMPT 45 6 "Data elaborazione "
END
TEXT DLG_NULL
BEGIN
PROMPT 5 5 "Premere CONFERMA per iniziare"
PROMPT 2 7 "Fascie di eta'"
END
SPREADSHEET F_FASCIE 15 9
BEGIN
PROMPT 3 8 ""
ITEM "Da "
ITEM "A "
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK
PAGE "Fascia di eta'" -1 -1 75 16
NUMBER F_ETAINI 3
BEGIN
PROMPT 2 2 "Eta' iniziale "
END
NUMBER F_ETAFIN 3
BEGIN
PROMPT 3 2 "Eta' finale "
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -13 -1 ""
END
BUTTON DLG_CANCEL 9 2
BEGIN
PROMPT -23 -1 ""
END
BUTTON DLG_DELREC 9 2
BEGIN
PROMPT -33 -1 ""
MESSAGE EXIT, K_DEL
END
ENDPAGE

642
at/at3200.cpp Executable file
View File

@ -0,0 +1,642 @@
#include <applicat.h>
#include <mask.h>
#include <printer.h>
#include <progind.h>
#include <real.h>
#include <relation.h>
#include <tabutil.h>
#include <urldefid.h>
#include <utility.h>
#include "at3.h"
// nomi campi maschera
#include "at3200a.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 TRigaMDxG : public TObject
{
int _anno, _mese;
TArray _valori;
protected:
const TRigaMDxG& copy(const TRigaMDxG& riga);
public:
const int anno() const { return _anno; }
const int mese() const { return _mese; }
TObject* dup() const { return new TRigaMDxG(*this); }
const TRigaMDxG& operator = (const TRigaMDxG& riga);
const real& operator [] (int colonna) const;
void aggiorna_valore(int colonna, const real& numero) ;
void azzera_valori();
// costruttore
TRigaMDxG(int anno, int mese) {_anno = anno; _mese = mese;}
// costruttore di copia
TRigaMDxG(const TRigaMDxG& riga) { copy(riga); }
virtual ~TRigaMDxG() {};
};
const TRigaMDxG& TRigaMDxG::copy(const TRigaMDxG& riga)
{
_anno = riga._anno;
_mese = riga._mese;
_valori = riga._valori;
return (*this);
}
const TRigaMDxG& TRigaMDxG::operator = (const TRigaMDxG& riga)
{
copy(riga);
return (*this);
}
const real& TRigaMDxG::operator [] (int colonna) const
{
real* valore = (real*)_valori.objptr(colonna);
if (valore == NULL)
return ZERO;
else
return *valore;
}
void TRigaMDxG::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 TRigaMDxG::azzera_valori()
{
_valori.destroy();
}
class TMensileDonxGr : public TApplication
{
TMask* _msk;
TRelation* _rel;
TCursor* _cur;
TLocalisamfile* _sezioni;
TLocalisamfile* _soggetti;
TLocalisamfile* _donaz;
TLocalisamfile* _atstatd;
TDate _dataini, _datafin;
TAssoc_array* _colonne;
TArray _righe; // array per riepilogo donazioni
TString16 _sezini, _sotini, _sezfin, _sotfin;
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 int anno, const int mese);
TString16 gruppo2col(TString16 gruppo, 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();
TString16 int2month(const int month);
public:
TMensileDonxGr() {}
};
HIDDEN inline TMensileDonxGr& app() { return (TMensileDonxGr&) main_app(); }
TString16 TMensileDonxGr::int2month(const int month)
{
TString16 mese = "";
switch (month)
{
case 1:
mese << "GENNAIO ";
break;
case 2:
mese << "FEBBRAIO ";
break;
case 3:
mese << "MARZO ";
break;
case 4:
mese << "APRILE ";
break;
case 5:
mese << "MAGGIO ";
break;
case 6:
mese << "GIUGNO ";
break;
case 7:
mese << "LUGLIO ";
break;
case 8:
mese << "AGOSTO ";
break;
case 9:
mese << "SETTEMBRE";
break;
case 10:
mese << "OTTOBRE ";
break;
case 11:
mese << "NOVEMBRE ";
break;
case 12:
mese << "DICEMBRE ";
break;
}
return mese;
}
int TMensileDonxGr::data2row(const int anno, const int mese)
{
const int annoini = _dataini.year();
return (anno-annoini)*12 + mese;
}
bool TMensileDonxGr::crea_colonne()
{
_colonne->destroy();
real contatore(ZERO);
real* oggetto = new real(contatore);
const char* indice = "0P";
_colonne->add(indice,(TObject*)oggetto);
indice = "0N";
contatore = contatore+1;
real* oggetto2 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto2);
indice = "AP";
contatore = contatore+1;
real* oggetto3 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto3);
indice = "AN";
contatore = contatore+1;
real* oggetto4 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto4);
indice = "BP";
contatore = contatore+1;
real* oggetto5 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto5);
indice = "BN";
contatore = contatore+1;
real* oggetto6 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto6);
indice = "CP";
contatore = contatore+1;
real* oggetto7 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto7);
indice = "CN";
contatore = contatore+1;
real* oggetto8 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto8);
indice = "NN";
contatore = contatore+1;
real* oggetto9 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto9);
return TRUE;
}
TString16 TMensileDonxGr::gruppo2col(TString16 gruppo, TString16 rh)
{
TString16 indice = "NN";
if (gruppo == "0")
indice = "0";
if (gruppo == "A")
indice = "A";
if (gruppo == "A1")
indice = "A";
if (gruppo == "A2")
indice = "A";
if (gruppo == "A1B")
indice = "C";
if (gruppo == "A2B")
indice = "C";
if (gruppo == "AB")
indice = "C";
if (gruppo == "B")
indice = "B";
if (rh.empty())
indice = "NN";
if (rh == "POS")
indice << "P";;
if (rh == "NEG")
indice << "N";;
return indice;
}
bool TMensileDonxGr::crea_righe()
{
int anno = _dataini.year();
int meseini, mesefin;
while (anno<=_datafin.year())
{
if (anno == _dataini.year())
meseini = _dataini.month();
else
meseini = 1;
if (anno == _datafin.year())
mesefin = _datafin.month();
else
mesefin = 12;
for (int mese=meseini;mese<=mesefin;mese++)
_righe.add(new TRigaMDxG(anno, mese), data2row(anno, mese));
anno++;
}
return _righe.items()>0;
}
bool TMensileDonxGr::create()
{
TApplication::create();
_msk = new TMask("at3200a");
_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();
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}
bool TMensileDonxGr::destroy()
{
delete _rel;
delete _msk;
delete _soggetti;
delete _donaz;
delete _atstatd;
delete _sezioni;
delete _colonne;
return TApplication::destroy();
}
bool TMensileDonxGr::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);
_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 TMensileDonxGr::crea_intestazione()
{
TPrintrow row;
TString256 sep;
sep = "MENSILE DONAZIONI PER GRUPPO E RH";
sep.center_just(80);
row.put(sep);
row.put("@>", 1);
row.put("Pag. @#", 70);
printer().setheaderline(2, row);
row.reset();
sep = "";
if (_dataini.ok())
{
sep << " dal ";
sep << _dataini.string();
}
if (_datafin.ok())
{
sep << " al ";
sep << _datafin.string();
}
sep.center_just(80);
row.put(sep);
printer().setheaderline(3, row);
row.reset();
printer().setheaderline(4, row);
sep = "Mese ";
int pos = 21;
sep.overwrite("0 POS 0 NEG A POS A NEG B POS B NEG AB POS AB NEG NON DEF. TOTALE",pos);
//sep.overwrite("Totale",pos);
row.put(sep);
printer().setheaderline(5, row);
sep = "";
sep.fill('-');
row.reset();
row.put(sep);
printer().setheaderline(6, row);
}
bool TMensileDonxGr::stampa()
{
if (printer().open())
{
crea_intestazione();
TRelation* relstat = new TRelation(LF_ATSTATD);
TCursor* curstat = new TCursor(relstat, "", 1);
TString16 oldsez = "**";
TString16 oldsot = "**";
double numero;
TString16 actsez, actsot, gruppo, rh;
int anno, mese;
long last = curstat->items();
for ( *curstat=0; curstat->pos() < last; ++(*curstat) )
{
actsez = curstat->curr().get(ATS_CODSEZ);
actsot = curstat->curr().get(ATS_CODSOT);
anno = curstat->curr().get_int(ATS_ANNO);
mese = curstat->curr().get_int(ATS_MESE);
gruppo = curstat->curr().get(ATS_GRUPPO);
rh = curstat->curr().get(ATS_RH);
numero = (double)curstat->curr().get_int(ATS_NUMERO);
if (actsez != oldsez || actsot != oldsot)
{
if (oldsez != "**" && oldsot != "**")
{
stampa_sezione(oldsez,oldsot);
azzera_righe();
}
oldsez = actsez;
oldsot = actsot;
}
TRigaMDxG& riga = (TRigaMDxG&)_righe[data2row(anno,mese)];
TString16 indcol = gruppo2col(gruppo,rh);
real& colonna = (real&)_colonne->find((const char*)indcol);
real n = numero;
riga.aggiorna_valore(colonna.integer(),n);
}
if (oldsez != "**" && oldsot != "**")
stampa_sezione(oldsez,oldsot);
delete curstat;
delete relstat;
printer().close();
return TRUE;
}
else
return FALSE;
}
void TMensileDonxGr::azzera_righe()
{
int anno = _dataini.year();
int meseini, mesefin;
while (anno<=_datafin.year())
{
if (anno == _dataini.year())
meseini = _dataini.month();
else
meseini = 1;
if (anno == _datafin.year())
mesefin = _datafin.month();
else
mesefin = 12;
for (int mese=meseini;mese<=mesefin;mese++)
{
TRigaMDxG& riga = (TRigaMDxG&)_righe[data2row(anno,mese)];
riga.azzera_valori();
}
anno++;
}
}
void TMensileDonxGr::stampa_sezione(TString16 codsez, TString16 codsot)
{
TPrintrow row;
TString256 rigastampa;
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;
}
}
rigastampa.center_just(80);
row.put(rigastampa);
printer().setheaderline(1, row);
TRigaMDxG rigatotali(0,0);
int anno = _dataini.year();
int meseini, mesefin;
real totalemese = ZERO;
TString16 valore;
while (anno<=_datafin.year())
{
if (anno == _dataini.year())
meseini = _dataini.month();
else
meseini = 1;
if (anno == _datafin.year())
mesefin = _datafin.month();
else
mesefin = 12;
for (int mese=meseini;mese<=mesefin;mese++)
{
TRigaMDxG& riga = (TRigaMDxG&)_righe[data2row(anno,mese)];
row.reset();
rigastampa = "";
rigastampa.format("%s %4d", (const char*)int2month(mese), anno);
totalemese = ZERO;
int pos = 16;
for (int i=0;i<_colonne->items();i++)
{
rigatotali.aggiorna_valore(i,riga[i]);
totalemese+=riga[i];
valore = "";
valore.format("%8d",riga[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
}
valore = "";
valore.format("%8d",totalemese.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
}
anno++;
}
// stampa totali per sezione
rigastampa = "";
rigastampa.fill('-');
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
rigastampa = "";
rigastampa = "Totale periodo";
totalemese = ZERO;
int pos = 16;
for (int i=0;i<_colonne->items();i++)
{
totalemese+=rigatotali[i];
valore = "";
valore.format("%8d",rigatotali[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
}
valore = "";
valore.format("%8d",totalemese.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
printer().formfeed();
}
bool TMensileDonxGr::riepilogo()
{
if (crea_colonne() && crea_righe())
{
// cancello i risultati della elaborazione precedente
TLocalisamfile stat(LF_ATSTATD);
for (stat.first(); !stat.eof(); stat.next())
stat.remove();
stat.setkey(1);
// 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 (filtro.empty())
filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
}
if (_sotini.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
else
{
filtro << " && ";
filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
}
}
}
if (_sezfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
}
if (_sotfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
else
{
filtro << " && ";
filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
}
}
}
_cur->setfilter((const char*) filtro, TRUE);
TString16 codsez, codsot, gruppo, rh;
TDate datadon;
int anno, mese;
long numero;
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);
codsez = recdon.get(DON_CODSEZ);
codsot = recdon.get(DON_CODSOT);
if (codsez.empty())
{
codsez = recsog.get(SOG_CODSEZ);
codsot = recsog.get(SOG_CODSOT);
}
datadon = recdon.get_date(DON_DATADON);
anno = datadon.year();
mese = datadon.month();
gruppo = recsog.get(SOG_GRUPPOAB0);
rh = recsog.get(SOG_RHANTID);
stat.zero();
stat.put(ATS_CODSEZ, codsez);
stat.put(ATS_CODSOT, codsot);
stat.put(ATS_ANNO, anno);
stat.put(ATS_MESE, mese);
stat.put(ATS_TIPODON, " ");
stat.put(ATS_GRUPPO, gruppo);
stat.put(ATS_RH, rh);
if (stat.read() == NOERR)
{
numero = stat.get_long(ATS_NUMERO);
numero++;
stat.put(ATS_NUMERO, numero);
stat.rewrite();
}
else
{
stat.zero();
stat.put(ATS_CODSEZ, codsez);
stat.put(ATS_CODSOT, codsot);
stat.put(ATS_ANNO, anno);
stat.put(ATS_MESE, mese);
stat.put(ATS_TIPODON, " ");
stat.put(ATS_GRUPPO, gruppo);
stat.put(ATS_RH, rh);
numero = 1;
stat.put(ATS_NUMERO, numero);
stat.write();
}
}
return (stat.eod() > 0);
}
else
return FALSE;
}
int at3200(int argc, char* argv[])
{
TMensileDonxGr a;
a.run(argc, argv, "Mensile donazioni per gruppo e rh");
return 0;
}

16
at/at3200a.h Executable file
View File

@ -0,0 +1,16 @@
// statistica donazioni per gruppo e rh
// definizione campi per maschera di selezione
#define F_SEZINI 101
#define F_D_SEZINI 102
#define F_SOTINI 103
#define F_D_SOTINI 104
#define F_SEZFIN 105
#define F_D_SEZFIN 106
#define F_SOTFIN 107
#define F_D_SOTFIN 108
#define F_DATAINI 301
#define F_DATAFIN 302
//#define F_TIPODON 303
//#define F_D_TIPODON 304

168
at/at3200a.uml Executable file
View File

@ -0,0 +1,168 @@
#include "at3200a.h"
PAGE "Mensile donazioni per gruppo e rh" -1 -1 78 12
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 1 "Scelta sezioni/sottogruppi"
END
STRING F_SEZINI 2
BEGIN
PROMPT 2 2 "Da "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZINI
INPUT CODSOT F_SOTINI
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZINI CODSEZ
OUTPUT F_D_SEZINI DENSEZ
OUTPUT F_SOTINI CODSOT
OUTPUT F_D_SOTINI DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione da cui partire"
END
STRING F_D_SEZINI 25
BEGIN
PROMPT 11 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZINI
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZINI
CHECKTYPE NORMAL
HELP "Sezione da cui partire"
END
STRING F_SOTINI 2
BEGIN
PROMPT 2 3 " "
COPY ALL F_SEZINI
CHECKTYPE SEARCH
HELP "Codice sottogruppo da cui partire"
END
STRING F_D_SOTINI 25
BEGIN
PROMPT 11 3 ""
FLAGS "U"
COPY USE F_D_SEZINI
INPUT DENSEZ F_D_SEZINI
INPUT DENSOT F_D_SOTINI
COPY DISPLAY F_D_SEZINI
COPY OUTPUT F_D_SEZINI
CHECKTYPE NORMAL
HELP "Sottogruppo da cui partire"
END
STRING F_SEZFIN 2
BEGIN
PROMPT 41 2 "A "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZFIN
INPUT CODSOT F_SOTFIN
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZFIN CODSEZ
OUTPUT F_D_SEZFIN DENSEZ
OUTPUT F_SOTFIN CODSOT
OUTPUT F_D_SOTFIN DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione finale"
END
STRING F_D_SEZFIN 25
BEGIN
PROMPT 49 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZFIN
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZFIN
CHECKTYPE NORMAL
HELP "Sezione finale"
END
STRING F_SOTFIN 2
BEGIN
PROMPT 41 3 " "
COPY ALL F_SEZFIN
CHECKTYPE SEARCH
HELP "Codice sottogruppo finale"
END
STRING F_D_SOTFIN 25
BEGIN
PROMPT 49 3 ""
FLAGS "U"
COPY USE F_D_SEZFIN
INPUT DENSEZ F_D_SEZFIN
INPUT DENSOT F_D_SOTFIN
COPY DISPLAY F_D_SEZFIN
COPY OUTPUT F_D_SEZFIN
CHECKTYPE NORMAL
HELP "Sottogruppo finale"
END
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 5 "Opzioni per la statistica"
END
DATE F_DATAINI
BEGIN
PROMPT 2 6 "Donazioni effettuate dal "
HELP "Data iniziale"
END
DATE F_DATAFIN
BEGIN
PROMPT 40 6 "al "
HELP "Data finale"
END
//STRING F_TIPODON 2
//BEGIN
// PROMPT 2 7 "Tipo donazioni "
// FLAGS "U"
// USE TDN
// INPUT CODTAB F_TIPODON
// DISPLAY "Codice" CODTAB
// DISPLAY "Descrizione@30" S0
// OUTPUT F_TIPODON CODTAB
// OUTPUT F_D_TIPODON S0
// CHECKTYPE NORMAL
// WARNING "Codice non presente"
//END
//STRING F_D_TIPODON 30
//BEGIN
// PROMPT 23 7 ""
// FLAGS "D"
//END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK

526
at/at3300.cpp Executable file
View File

@ -0,0 +1,526 @@
#include <applicat.h>
#include <mask.h>
#include <printer.h>
#include <progind.h>
#include <real.h>
#include <relation.h>
#include <tabutil.h>
#include <urldefid.h>
#include <utility.h>
#include "at3.h"
// nomi campi maschera
#include "at3300a.h"
// nomi dei campi
#include "soggetti.h"
#include "atstats.h"
#include "sezioni.h"
// classe per la definizione di una riga di statistica
class TRigaSxCat : public TObject
{
TString16 _catdon;
TArray _valori;
protected:
const TRigaSxCat& copy(const TRigaSxCat& riga);
public:
const TString16 catdon() const { return _catdon; }
TObject* dup() const { return new TRigaSxCat(*this); }
const TRigaSxCat& operator = (const TRigaSxCat& riga);
const real& operator [] (int colonna) const;
void aggiorna_valore(int colonna, const real& numero) ;
void azzera_valori();
// costruttore
TRigaSxCat(TString16 catdon) {_catdon = catdon;}
// costruttore di copia
TRigaSxCat(const TRigaSxCat& riga) { copy(riga); }
virtual ~TRigaSxCat() {};
};
const TRigaSxCat& TRigaSxCat::copy(const TRigaSxCat& riga)
{
_catdon = riga._catdon;
_valori = riga._valori;
return (*this);
}
const TRigaSxCat& TRigaSxCat::operator = (const TRigaSxCat& riga)
{
copy(riga);
return (*this);
}
const real& TRigaSxCat::operator [] (int colonna) const
{
real* valore = (real*)_valori.objptr(colonna);
if (valore == NULL)
return ZERO;
else
return *valore;
}
void TRigaSxCat::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 TRigaSxCat::azzera_valori()
{
_valori.destroy();
}
class TStatSogxCat : public TApplication
{
TMask* _msk;
TRelation* _rel;
TCursor* _cur;
TLocalisamfile* _sezioni;
TLocalisamfile* _soggetti;
TLocalisamfile* _atstats;
TAssoc_array* _colonne;
TAssoc_array* _categorie;
TArray _righe;
TString16 _sezini, _sotini, _sezfin, _sotfin;
TDate _dataini, _datafin;
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 catdon);
bool riepilogo();
bool stampa();
bool crea_colonne();
bool crea_righe();
void azzera_righe();
void stampa_sezione(TString16 codsez, TString16 codsot);
void crea_intestazione();
public:
TStatSogxCat() {}
};
HIDDEN inline TStatSogxCat& app() { return (TStatSogxCat&) main_app(); }
int TStatSogxCat::data2row(const TString16 catdon)
{
real& indicer = (real&)_categorie->find((const char*) catdon);
return indicer.integer();
}
bool TStatSogxCat::crea_colonne()
{
_colonne->destroy();
real contatore(ZERO);
real* oggetto = new real(contatore);
const char* indice = "N"; // nuovi
_colonne->add(indice,(TObject*)oggetto);
indice = "T"; // totale
contatore = contatore+1;
real* oggetto2 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto2);
return TRUE;
}
bool TStatSogxCat::crea_righe()
{
TTable ctd("CTD");
TString16 catdon = "**";
int indice = 0;
_categorie->destroy();
real* oggetto1 = new real(indice);
_categorie->add((const char*) catdon, (TObject*) oggetto1);
_righe.add(new TRigaSxCat(catdon), indice);
for (ctd.first(); !ctd.eof(); ctd.next())
{
indice++;
catdon = ctd.get("CODTAB");
_righe.add(new TRigaSxCat(catdon), indice);
real* oggetto = new real(indice);
_categorie->add((const char*) catdon,(TObject*) oggetto);
}
return _righe.items()>0;
}
bool TStatSogxCat::create()
{
TApplication::create();
_msk = new TMask("at3300a");
_rel = new TRelation(LF_SOGGETTI);
_soggetti = new TLocalisamfile(LF_SOGGETTI);
_atstats = new TLocalisamfile(LF_ATSTATS);
_sezioni = new TLocalisamfile(LF_SEZIONI);
_colonne = new TAssoc_array();
_categorie = new TAssoc_array();
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}
bool TStatSogxCat::destroy()
{
delete _rel;
delete _msk;
delete _soggetti;
delete _atstats;
delete _sezioni;
delete _colonne;
delete _categorie;
return TApplication::destroy();
}
bool TStatSogxCat::menu(MENU_TAG m)
{
TMask& msk = get_mask();
KEY tasto;
tasto = msk.run();
if (tasto == K_ENTER)
{
_sezini = _msk->get(F_SEZINI);
_sotini = _msk->get(F_SOTINI);
_sezfin = _msk->get(F_SEZFIN);
_sotfin = _msk->get(F_SOTFIN);
_dataini = _msk->get_date(F_DATAINI);
_datafin = _msk->get_date(F_DATAFIN);
if (riepilogo())
stampa();
}
return FALSE;
}
void TStatSogxCat::crea_intestazione()
{
TPrintrow row;
TString256 sep;
sep = "STATISTICA SOGGETTI PER CATEGORIA";
sep.center_just(80);
row.put(sep);
row.put("@>", 1);
row.put("Pag. @#", 70);
printer().setheaderline(2, row);
sep = "dal ";
sep << _dataini.string();
sep << " al ";
sep << _datafin.string();
sep.center_just(80);
row.reset();
row.put(sep);
printer().setheaderline(3, row);
sep = "";
sep << "Categoria Nuovi Totale";
row.reset();
row.put(sep);
printer().setheaderline(5, row);
sep = "";
sep.fill('-');
row.reset();
row.put(sep);
printer().setheaderline(6, row);
}
bool TStatSogxCat::stampa()
{
if (printer().open())
{
crea_intestazione();
TRelation* relstat = new TRelation(LF_ATSTATS);
TCursor* curstat = new TCursor(relstat, "", 1);
TString16 oldsez = "**";
TString16 oldsot = "**";
double numero, numero2;
TString16 actsez, actsot;
TString16 catdon;
long last = curstat->items();
for ( *curstat=0; curstat->pos() < last; ++(*curstat) )
{
actsez = curstat->curr().get(ATSS_CODSEZ);
actsot = curstat->curr().get(ATSS_CODSOT);
catdon = curstat->curr().get(ATSS_CATDON);
numero = (double)curstat->curr().get_int(ATSS_NUMERO);
numero2 = (double)curstat->curr().get_int(ATSS_NUMERO2);
if (actsez != oldsez || actsot != oldsot)
{
if (oldsez != "**" && oldsot != "**")
{
stampa_sezione(oldsez,oldsot);
azzera_righe();
}
oldsez = actsez;
oldsot = actsot;
}
if (catdon.empty())
catdon = "**";
TRigaSxCat& riga = (TRigaSxCat&)_righe[data2row(catdon)];
const char* indicen = "N";
real& colonnan = (real&)_colonne->find(indicen);
real n = numero;
riga.aggiorna_valore(colonnan.integer(),n);
const char* indicet = "T";
real& colonnat = (real&)_colonne->find(indicet);
n = numero2;
riga.aggiorna_valore(colonnat.integer(),n);
}
if (oldsez != "**" && oldsot != "**")
stampa_sezione(oldsez,oldsot);
delete curstat;
delete relstat;
printer().close();
return TRUE;
}
else
return FALSE;
}
void TStatSogxCat::azzera_righe()
{
TString16 catdon = "**";
int indice = data2row(catdon);
TRigaSxCat& riga = (TRigaSxCat&)_righe[indice];
riga.azzera_valori();
TTable ctd("CTD");
for (ctd.first(); !ctd.eof(); ctd.next())
{
catdon = ctd.get("CODTAB");
indice = data2row(catdon);
TRigaSxCat& riga = (TRigaSxCat&)_righe[indice];
riga.azzera_valori();
}
}
void TStatSogxCat::stampa_sezione(TString16 codsez, TString16 codsot)
{
TPrintrow row;
TString256 rigastampa;
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;
}
}
rigastampa.center_just(80);
row.put(rigastampa);
printer().setheaderline(1, row);
TRigaSxCat rigatotali(" ");
TString16 valore;
TString16 catdon;
TTable ctd("CTD");
for (ctd.first(); !ctd.eof(); ctd.next())
{
TString16 catdon = ctd.get("CODTAB");
TRigaSxCat& riga = (TRigaSxCat&)_righe[data2row(catdon)];
row.reset();
rigastampa = "";
rigastampa << catdon;
rigastampa << " ";
rigastampa << ctd.get("S0");
int pos = 41;
const char* indicen = "N";
real& colonnan = (real&)_colonne->find(indicen);
rigatotali.aggiorna_valore(colonnan.integer(),riga[colonnan.integer()]);
valore = "";
valore.format("%8d",riga[colonnan.integer()].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
const char* indicet = "T";
real& colonnat = (real&)_colonne->find(indicet);
rigatotali.aggiorna_valore(colonnat.integer(),riga[colonnat.integer()]);
valore = "";
valore.format("%8d",riga[colonnat.integer()].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
row.put((const char*) rigastampa);
printer().print(row);
}
// stampa totali per sezione
rigastampa = "";
rigastampa.fill('-');
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
rigastampa = "";
rigastampa = "Totale";
int pos = 41;
const char* indicen = "N";
real& colonnan = (real&)_colonne->find(indicen);
valore = "";
valore.format("%8d",rigatotali[colonnan.integer()].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
const char* indicet = "T";
real& colonnat = (real&)_colonne->find(indicet);
valore = "";
valore.format("%8d",rigatotali[colonnat.integer()].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+8;
row.put((const char*) rigastampa);
printer().print(row);
printer().formfeed();
}
bool TStatSogxCat::riepilogo()
{
if (crea_colonne() && crea_righe())
{
// cancello i risultati della elaborazione precedente
TLocalisamfile stat(LF_ATSTATS);
for (stat.first(); !stat.eof(); stat.next())
stat.remove();
stat.setkey(1);
_cur = new TCursor(_rel, "", 1);
TString256 filtro = "";
// filtro per sezione/sottogruppo
if (_sezini.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
}
if (_sotini.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
else
{
filtro << " && ";
filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
}
}
}
if (_sezfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
}
if (_sotfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
else
{
filtro << " && ";
filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
}
}
}
_cur->setfilter((const char*) filtro, TRUE);
TString16 codsez, codsot;
long numero,numero2;
TString16 catdon;
TDate dataisc, datadim;
bool nuovo, totale;
TTable ctd("CTD");
TRectype& recsog = _cur->curr();
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);
nuovo = FALSE;
totale = FALSE;
codsez = recsog.get(SOG_CODSEZ);
codsot = recsog.get(SOG_CODSOT);
catdon = recsog.get(SOG_CATDON);
if (catdon.not_empty())
{
ctd.put("CODTAB",catdon);
if (ctd.read() == NOERR)
{
bool dimissione = ctd.get_bool("B0");
if (dimissione)
{
datadim = recsog.get_date(SOG_DATADIM);
nuovo = (datadim >= _dataini && datadim <= _datafin);
totale = (datadim <= _datafin);
}
else
{
dataisc = recsog.get_date(SOG_DATAISC);
nuovo = (dataisc >= _dataini && dataisc <= _datafin);
totale = (dataisc <= _datafin);
}
}
}
stat.zero();
stat.put(ATSS_CODSEZ, codsez);
stat.put(ATSS_CODSOT, codsot);
stat.put(ATSS_CATDON, catdon);
if (stat.read() == NOERR)
{
numero = stat.get_long(ATSS_NUMERO);
numero2 = stat.get_long(ATSS_NUMERO2);
if (nuovo)
numero++;
if (totale)
numero2++;
stat.put(ATSS_NUMERO, numero);
stat.put(ATSS_NUMERO2, numero2);
stat.rewrite();
}
else
{
stat.put(ATSS_CODSEZ, codsez);
stat.put(ATSS_CODSOT, codsot);
stat.put(ATSS_CATDON, catdon);
if (nuovo)
numero = 1;
else
numero = 0;
if (totale)
numero2 = 1;
else
numero2 = 0;
stat.put(ATSS_NUMERO, numero);
stat.put(ATSS_NUMERO2, numero2);
stat.write();
}
}
return (stat.eod() > 0);
}
else
return FALSE;
}
int at3300(int argc, char* argv[])
{
TStatSogxCat a;
a.run(argc, argv, "Statistica soggetti per categoria");
return 0;
}

14
at/at3300a.h Executable file
View File

@ -0,0 +1,14 @@
// statistica SOGGETTI PER CATEGORIE con nuovi iscritti
// definizione campi per maschera di selezione
#define F_SEZINI 101
#define F_D_SEZINI 102
#define F_SOTINI 103
#define F_D_SOTINI 104
#define F_SEZFIN 105
#define F_D_SEZFIN 106
#define F_SOTFIN 107
#define F_D_SOTFIN 108
#define F_DATAINI 301
#define F_DATAFIN 302

146
at/at3300a.uml Executable file
View File

@ -0,0 +1,146 @@
#include "at3300a.h"
PAGE "Statistica donatori per categoria" -1 -1 78 12
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 1 "Scelta sezioni/sottogruppi"
END
STRING F_SEZINI 2
BEGIN
PROMPT 2 2 "Da "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZINI
INPUT CODSOT F_SOTINI
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZINI CODSEZ
OUTPUT F_D_SEZINI DENSEZ
OUTPUT F_SOTINI CODSOT
OUTPUT F_D_SOTINI DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione da cui partire"
END
STRING F_D_SEZINI 25
BEGIN
PROMPT 11 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZINI
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZINI
CHECKTYPE NORMAL
HELP "Sezione da cui partire"
END
STRING F_SOTINI 2
BEGIN
PROMPT 2 3 " "
COPY ALL F_SEZINI
CHECKTYPE SEARCH
HELP "Codice sottogruppo da cui partire"
END
STRING F_D_SOTINI 25
BEGIN
PROMPT 11 3 ""
FLAGS "U"
COPY USE F_D_SEZINI
INPUT DENSEZ F_D_SEZINI
INPUT DENSOT F_D_SOTINI
COPY DISPLAY F_D_SEZINI
COPY OUTPUT F_D_SEZINI
CHECKTYPE NORMAL
HELP "Sottogruppo da cui partire"
END
STRING F_SEZFIN 2
BEGIN
PROMPT 41 2 "A "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZFIN
INPUT CODSOT F_SOTFIN
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZFIN CODSEZ
OUTPUT F_D_SEZFIN DENSEZ
OUTPUT F_SOTFIN CODSOT
OUTPUT F_D_SOTFIN DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione finale"
END
STRING F_D_SEZFIN 25
BEGIN
PROMPT 49 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZFIN
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZFIN
CHECKTYPE NORMAL
HELP "Sezione finale"
END
STRING F_SOTFIN 2
BEGIN
PROMPT 41 3 " "
COPY ALL F_SEZFIN
CHECKTYPE SEARCH
HELP "Codice sottogruppo finale"
END
STRING F_D_SOTFIN 25
BEGIN
PROMPT 49 3 ""
FLAGS "U"
COPY USE F_D_SEZFIN
INPUT DENSEZ F_D_SEZFIN
INPUT DENSOT F_D_SOTFIN
COPY DISPLAY F_D_SEZFIN
COPY OUTPUT F_D_SEZFIN
CHECKTYPE NORMAL
HELP "Sottogruppo finale"
END
GROUPBOX DLG_NULL 77 3
BEGIN
PROMPT 1 5 "Opzioni per la statistica"
END
DATE F_DATAINI
BEGIN
PROMPT 2 6 "Segnala i cambi di categoria dal "
END
DATE F_DATAFIN
BEGIN
PROMPT 50 6 "al "
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK

698
at/at3400.cpp Executable file
View File

@ -0,0 +1,698 @@
#include <applicat.h>
//#include <execp.h>
#include <mask.h>
#include <printer.h>
#include <progind.h>
#include <real.h>
#include <relation.h>
#include <tabutil.h>
#include <urldefid.h>
#include <utility.h>
#include "at3.h"
// nomi campi maschera
#include "at3400a.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 TRiga : public TObject
{
int _anno, _mese;
TArray _valori;
protected:
const TRiga& copy(const TRiga& riga);
public:
const int anno() const { return _anno; }
const int mese() const { return _mese; }
TObject* dup() const { return new TRiga(*this); }
const TRiga& operator = (const TRiga& riga);
const real& operator [] (int colonna) const;
void aggiorna_valore(int colonna, const real& numero) ;
void azzera_valori();
// costruttore
TRiga(int anno, int mese) {_anno = anno; _mese = mese;}
// costruttore di copia
TRiga(const TRiga& riga) { copy(riga); }
virtual ~TRiga() {};
};
const TRiga& TRiga::copy(const TRiga& riga)
{
_anno = riga._anno;
_mese = riga._mese;
_valori = riga._valori;
return (*this);
}
const TRiga& TRiga::operator = (const TRiga& riga)
{
copy(riga);
return (*this);
}
const real& TRiga::operator [] (int colonna) const
{
real* valore = (real*)_valori.objptr(colonna);
if (valore == NULL)
return ZERO;
else
return *valore;
}
void TRiga::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 TRiga::azzera_valori()
{
_valori.destroy();
}
class TRiepilogoDonazioni : public TApplication
{
TMask* _msk;
TRelation* _rel;
TCursor* _cur;
TLocalisamfile* _sezioni;
TLocalisamfile* _soggetti;
TLocalisamfile* _donaz;
TLocalisamfile* _atstatd;
TDate _dataini, _datafin;
bool _primedon;
bool _perpunto;
TAssoc_array* _colonne;
TArray _righe; // array per riepilogo donazioni
TArray _righe_prime; // array per riepilogo prime don
TString16 _sezini, _sotini, _sezfin, _sotfin;
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 int anno, const int mese);
bool riepilogo();
bool stampa();
bool crea_colonne();
bool crea_righe();
void azzera_righe();
void stampa_sezione(TString16 codsez, TString16 codsot);
void crea_intestazione();
TString16 int2month(const int month);
public:
TRiepilogoDonazioni() {}
};
HIDDEN inline TRiepilogoDonazioni& app() { return (TRiepilogoDonazioni&) main_app(); }
TString16 TRiepilogoDonazioni::int2month(const int month)
{
TString16 mese = "";
switch (month)
{
case 1:
mese << "GENNAIO ";
break;
case 2:
mese << "FEBBRAIO ";
break;
case 3:
mese << "MARZO ";
break;
case 4:
mese << "APRILE ";
break;
case 5:
mese << "MAGGIO ";
break;
case 6:
mese << "GIUGNO ";
break;
case 7:
mese << "LUGLIO ";
break;
case 8:
mese << "AGOSTO ";
break;
case 9:
mese << "SETTEMBRE";
break;
case 10:
mese << "OTTOBRE ";
break;
case 11:
mese << "NOVEMBRE ";
break;
case 12:
mese << "DICEMBRE ";
break;
}
return mese;
}
int TRiepilogoDonazioni::data2row(const int anno, const int mese)
{
const int annoini = _dataini.year();
return (anno-annoini)*12 + mese;
}
bool TRiepilogoDonazioni::crea_colonne()
{
_colonne->destroy();
TTable tdn("TDN");
real contatore(ZERO);
for (tdn.first(); !tdn.eof(); tdn.next())
{
real* oggetto = new real(contatore);
_colonne->add((const char*)tdn.get("CODTAB"),(TObject*)oggetto);
contatore+=1;
}
return !tdn.empty();
}
bool TRiepilogoDonazioni::crea_righe()
{
int anno = _dataini.year();
int meseini, mesefin;
while (anno<=_datafin.year())
{
if (anno == _dataini.year())
meseini = _dataini.month();
else
meseini = 1;
if (anno == _datafin.year())
mesefin = _datafin.month();
else
mesefin = 12;
for (int mese=meseini;mese<=mesefin;mese++)
{
_righe.add(new TRiga(anno, mese), data2row(anno, mese));
if (_primedon)
_righe_prime.add(new TRiga(anno, mese), data2row(anno, mese));
}
anno++;
}
return _righe.items()>0;
}
bool TRiepilogoDonazioni::create()
{
TApplication::create();
_msk = new TMask("at3400a");
_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();
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}
bool TRiepilogoDonazioni::destroy()
{
delete _rel;
delete _msk;
delete _soggetti;
delete _donaz;
delete _atstatd;
delete _sezioni;
delete _colonne;
return TApplication::destroy();
}
bool TRiepilogoDonazioni::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);
_primedon = msk.get_bool(F_PRIMEDON);
//_perpunto = msk.get_bool(F_PERPUNTO);
_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 TRiepilogoDonazioni::crea_intestazione()
{
TPrintrow row;
TString256 sep;
sep = "MENSILE DONAZIONI";
//if (_perpunto)
// sep << " PER PUNTO PRELIEVO";
if (_dataini.ok())
{
sep << " dal ";
sep << _dataini.string();
}
if (_datafin.ok())
{
sep << " al ";
sep << _datafin.string();
}
sep.center_just(80);
row.put(sep);
row.put("@>", 1);
row.put("Pag. @#", 70);
printer().setheaderline(2, row);
row.reset();
printer().setheaderline(3, row);
sep = "Mese ";
TTable tdn("TDN");
int pos = 27;
for (tdn.first(); !tdn.eof(); tdn.next())
{
sep.overwrite((const char*)tdn.get("CODTAB"),pos);
pos = pos+10;
}
sep.overwrite("Totale",pos);
row.put(sep);
printer().setheaderline(5, row);
sep = "";
sep.fill('-');
row.reset();
row.put(sep);
printer().setheaderline(6, row);
}
bool TRiepilogoDonazioni::stampa()
{
if (printer().open())
{
crea_intestazione();
TRelation* relstat = new TRelation(LF_ATSTATD);
TCursor* curstat = new TCursor(relstat, "", 2);
TString16 oldsez = "**";
TString16 oldsot = "**";
double numero, numprime;
TString16 actsez, actsot;
TString16 tipodon;
int anno, mese;
long last = curstat->items();
for ( *curstat=0; curstat->pos() < last; ++(*curstat) )
{
actsez = curstat->curr().get(ATS_CODSEZ);
actsot = curstat->curr().get(ATS_CODSOT);
anno = curstat->curr().get_int(ATS_ANNO);
mese = curstat->curr().get_int(ATS_MESE);
tipodon = curstat->curr().get(ATS_TIPODON);
numero = (double)curstat->curr().get_int(ATS_NUMERO);
numprime = (double)curstat->curr().get_int(ATS_NUMPRIME);
if (actsez != oldsez || actsot != oldsot)
{
if (oldsez != "**" && oldsot != "**")
{
stampa_sezione(oldsez,oldsot);
azzera_righe();
}
oldsez = actsez;
oldsot = actsot;
}
TRiga& riga = (TRiga&)_righe[data2row(anno,mese)];
real& colonna = (real&)_colonne->find((const char*)tipodon);
real n = numero;
riga.aggiorna_valore(colonna.integer(),n);
if (_primedon)
{
TRiga& riga_prime = (TRiga&)_righe_prime[data2row(anno,mese)];
n = numprime;
riga_prime.aggiorna_valore(colonna.integer(), n);
}
}
if (oldsez != "**" && oldsot != "**")
stampa_sezione(oldsez,oldsot);
delete curstat;
delete relstat;
printer().close();
return TRUE;
}
else
return FALSE;
}
void TRiepilogoDonazioni::azzera_righe()
{
int anno = _dataini.year();
int meseini, mesefin;
while (anno<=_datafin.year())
{
if (anno == _dataini.year())
meseini = _dataini.month();
else
meseini = 1;
if (anno == _datafin.year())
mesefin = _datafin.month();
else
mesefin = 12;
for (int mese=meseini;mese<=mesefin;mese++)
{
TRiga& riga = (TRiga&)_righe[data2row(anno,mese)];
riga.azzera_valori();
if (_primedon)
{
TRiga& riga_prime = (TRiga&)_righe_prime[data2row(anno,mese)];
riga_prime.azzera_valori();
}
}
anno++;
}
}
void TRiepilogoDonazioni::stampa_sezione(TString16 codsez, TString16 codsot)
{
TPrintrow row;
TString256 rigastampa;
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;
}
}
rigastampa.center_just(80);
row.put(rigastampa);
printer().setheaderline(1, row);
TRiga rigatotali(0,0);
int anno = _dataini.year();
int meseini, mesefin;
real totalemese = ZERO;
TString16 valore;
while (anno<=_datafin.year())
{
if (anno == _dataini.year())
meseini = _dataini.month();
else
meseini = 1;
if (anno == _datafin.year())
mesefin = _datafin.month();
else
mesefin = 12;
for (int mese=meseini;mese<=mesefin;mese++)
{
TRiga& riga = (TRiga&)_righe[data2row(anno,mese)];
row.reset();
rigastampa = "";
rigastampa.format("%s %4d", (const char*)int2month(mese), anno);
totalemese = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
rigatotali.aggiorna_valore(i,riga[i]);
totalemese+=riga[i];
valore = "";
valore.format("%8d",riga[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totalemese.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
}
anno++;
}
// stampa totali per sezione
rigastampa = "";
rigastampa.fill('-');
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
rigastampa = "";
rigastampa = "Totale periodo";
totalemese = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
totalemese+=rigatotali[i];
valore = "";
valore.format("%8d",rigatotali[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totalemese.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
if (_primedon)
{
rigatotali.azzera_valori();
row.reset();
printer().print(row);
printer().print(row);
printer().print(row);
printer().print(row);
//printer().skip(4);
rigastampa = "RIEPILOGO PRIME DONAZIONI";
rigastampa.center_just();
row.put(rigastampa);
row.reset();
row.put(rigastampa);
printer().print(row);
rigastampa = "";
rigastampa.fill('-');
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
printer().print(row);
anno = _dataini.year();
while (anno<=_datafin.year())
{
if (anno == _dataini.year())
meseini = _dataini.month();
else
meseini = 1;
if (anno == _datafin.year())
mesefin = _datafin.month();
else
mesefin = 12;
for (int mese=meseini;mese<=mesefin;mese++)
{
TRiga& riga = (TRiga&)_righe_prime[data2row(anno,mese)];
row.reset();
rigastampa = "";
rigastampa.format("%s %4d", (const char*)int2month(mese), anno);
totalemese = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
rigatotali.aggiorna_valore(i,riga[i]);
totalemese+=riga[i];
valore = "";
valore.format("%8d",riga[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totalemese.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
}
anno++;
}
// stampa totali per sezione
rigastampa = "";
rigastampa.fill('-');
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
rigastampa = "";
rigastampa = "Totale periodo";
totalemese = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
totalemese+=rigatotali[i];
valore = "";
valore.format("%8d",rigatotali[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totalemese.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
}
printer().formfeed();
}
bool TRiepilogoDonazioni::riepilogo()
{
if (crea_colonne() && crea_righe())
{
// cancello i risultati della elaborazione precedente
TLocalisamfile stat(LF_ATSTATD);
for (stat.first(); !stat.eof(); stat.next())
stat.remove();
stat.setkey(2);
// 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 (filtro.empty())
filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
}
if (_sotini.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
else
{
filtro << " && ";
filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
}
}
}
if (_sezfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
}
if (_sotfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
else
{
filtro << " && ";
filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
}
}
}
_cur->setfilter((const char*) filtro, TRUE);
TString16 codsez, codsot, tipodon;
TDate datadon;
int anno, mese;
long numero;
bool primadon;
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);
codsez = recdon.get(DON_CODSEZ);
codsot = recdon.get(DON_CODSOT);
if (codsez.empty())
{
codsez = recsog.get(SOG_CODSEZ);
codsot = recsog.get(SOG_CODSOT);
}
datadon = recdon.get_date(DON_DATADON);
tipodon = recdon.get(DON_TIPODON);
primadon = recdon.get_bool(DON_PRIMADON);
anno = datadon.year();
mese = datadon.month();
stat.zero();
stat.put(ATS_CODSEZ, codsez);
stat.put(ATS_CODSOT, codsot);
stat.put(ATS_ANNO, anno);
stat.put(ATS_MESE, mese);
stat.put(ATS_TIPODON, tipodon);
if (stat.read() == NOERR)
{
numero = stat.get_long(ATS_NUMERO);
numero++;
stat.put(ATS_NUMERO, numero);
if (_primedon && primadon)
{
numero = stat.get_long(ATS_NUMPRIME);
numero++;
stat.put(ATS_NUMPRIME, numero);
}
stat.rewrite();
}
else
{
stat.zero();
stat.put(ATS_CODSEZ, codsez);
stat.put(ATS_CODSOT, codsot);
stat.put(ATS_ANNO, anno);
stat.put(ATS_MESE, mese);
stat.put(ATS_TIPODON, tipodon);
numero = 1;
stat.put(ATS_NUMERO, numero);
if (_primedon && primadon)
stat.put(ATS_NUMPRIME, numero);
stat.write();
}
}
return (stat.eod() > 0);
}
else
return FALSE;
}
int at3400(int argc, char* argv[])
{
TRiepilogoDonazioni a;
a.run(argc, argv, "Riepilogo mensile donazioni");
return 0;
}

16
at/at3400a.h Executable file
View File

@ -0,0 +1,16 @@
// riepilogo mensile donazioni
// definizione campi per maschera di selezione
#define F_SEZINI 101
#define F_D_SEZINI 102
#define F_SOTINI 103
#define F_D_SOTINI 104
#define F_SEZFIN 105
#define F_D_SEZFIN 106
#define F_SOTFIN 107
#define F_D_SOTFIN 108
#define F_DATAINI 301
#define F_DATAFIN 302
#define F_PRIMEDON 303
//#define F_PERPUNTO 304

153
at/at3400a.uml Executable file
View File

@ -0,0 +1,153 @@
#include "at3400a.h"
PAGE "Riepilogo mensile donazioni" -1 -1 78 12
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 1 "Scelta sezioni/sottogruppi"
END
STRING F_SEZINI 2
BEGIN
PROMPT 2 2 "Da "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZINI
INPUT CODSOT F_SOTINI
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZINI CODSEZ
OUTPUT F_D_SEZINI DENSEZ
OUTPUT F_SOTINI CODSOT
OUTPUT F_D_SOTINI DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione da cui partire"
END
STRING F_D_SEZINI 25
BEGIN
PROMPT 11 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZINI
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZINI
CHECKTYPE NORMAL
HELP "Sezione da cui partire"
END
STRING F_SOTINI 2
BEGIN
PROMPT 2 3 " "
COPY ALL F_SEZINI
CHECKTYPE SEARCH
HELP "Codice sottogruppo da cui partire"
END
STRING F_D_SOTINI 25
BEGIN
PROMPT 11 3 ""
FLAGS "U"
COPY USE F_D_SEZINI
INPUT DENSEZ F_D_SEZINI
INPUT DENSOT F_D_SOTINI
COPY DISPLAY F_D_SEZINI
COPY OUTPUT F_D_SEZINI
CHECKTYPE NORMAL
HELP "Sottogruppo da cui partire"
END
STRING F_SEZFIN 2
BEGIN
PROMPT 41 2 "A "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZFIN
INPUT CODSOT F_SOTFIN
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZFIN CODSEZ
OUTPUT F_D_SEZFIN DENSEZ
OUTPUT F_SOTFIN CODSOT
OUTPUT F_D_SOTFIN DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione finale"
END
STRING F_D_SEZFIN 25
BEGIN
PROMPT 49 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZFIN
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZFIN
CHECKTYPE NORMAL
HELP "Sezione finale"
END
STRING F_SOTFIN 2
BEGIN
PROMPT 41 3 " "
COPY ALL F_SEZFIN
CHECKTYPE SEARCH
HELP "Codice sottogruppo finale"
END
STRING F_D_SOTFIN 25
BEGIN
PROMPT 49 3 ""
FLAGS "U"
COPY USE F_D_SEZFIN
INPUT DENSEZ F_D_SEZFIN
INPUT DENSOT F_D_SOTFIN
COPY DISPLAY F_D_SEZFIN
COPY OUTPUT F_D_SEZFIN
CHECKTYPE NORMAL
HELP "Sottogruppo finale"
END
GROUPBOX DLG_NULL 77 5
BEGIN
PROMPT 1 5 "Opzioni per il riepilogo"
END
DATE F_DATAINI
BEGIN
PROMPT 2 6 "Donazioni effettuate dal "
HELP "Data iniziale"
END
DATE F_DATAFIN
BEGIN
PROMPT 40 6 "al "
HELP "Data finale"
END
BOOLEAN F_PRIMEDON
BEGIN
PROMPT 2 7 "Riepilogo per prime donazioni"
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK

View File

@ -1,360 +1,580 @@
#include <applicat.h>
//#include <execp.h>
#include <mask.h>
#include <form.h>
#include <printapp.h>
#include <printer.h>
#include <progind.h>
#include <real.h>
#include <relation.h>
#include <tabutil.h>
#include <urldefid.h>
#include <utility.h>
#include "lf.h"
#include "at3.h"
// nomi campi maschera
#include "at3500a.h"
// nomi dei campi
#include "soggetti.h"
#include "donaz.h"
#include "atstatd.h"
#include "sezioni.h"
#include "at3.h"
#include "at3500a.h"
// classe per la definizione di una riga di statistica
class TRigaG : public TObject
{
TDate _data;
TArray _valori;
#define ALIAS_LCP 100
#define ALIAS_TCS 200
#define IDON_SI "SI"
#define IDON_AF "AF"
enum ts { undefined = 0, elenco = 1, etichette = 2, cartoline = 3 };
// definizione form per etichette
class TScadenze_form : public TForm
{
public:
virtual TCursor* cursor() const;
virtual TRelation* relation() const;
TPrint_section& get_body() { return section('B'); } ;
TScadenze_form(): TForm() {};
TScadenze_form(const char* form, const char * code = "", int editlevel = 0, const char* desc = "")
: TForm(form,code,editlevel,desc) {};
virtual ~TScadenze_form() {};
};
class TScadenze_application : public TPrintapp
{
TRelation* _rel;
TMask* _msk;
TScadenze_form* _form_eti;
TAssoc_array _categorie;
int _cur1, _cur2, _cur3, _cur4;
TParagraph_string _cognome_nome;
TDate _data_stampa;
TDate _dataini, _datafin;
TString16 _procdon;
ts _tipo_stampa;
TString16 _codsez, _codsot;
static bool filter_func_scadenze(const TRelation* rel);
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual bool set_print(int m);
virtual void set_page(int file, int cnt);
virtual bool preprocess_page(int file, int counter);
const TRigaG& copy(const TRigaG& riga);
public:
void crea_intestazione();
void filtra_sezioni();
void header_sezione(TString16 codsez, TString16 codsot);
TMask& app_mask() { return *_msk; }
TScadenze_application() : _data_stampa(TODAY), _cognome_nome("",25) {}
const TDate data() const { return _data; }
TObject* dup() const { return new TRigaG(*this); }
const TRigaG& operator = (const TRigaG& riga);
const real& operator [] (int colonna) const;
void aggiorna_valore(int colonna, const real& numero) ;
void azzera_valori();
// costruttore
TRigaG(TDate data) {_data = data;}
// costruttore di copia
TRigaG(const TRigaG& riga) { copy(riga); }
virtual ~TRigaG() {};
};
HIDDEN inline TScadenze_application& app() { return (TScadenze_application&) main_app(); }
TCursor* TScadenze_form::cursor() const { return app().current_cursor(); }
TRelation* TScadenze_form::relation() const { return cursor()->relation(); }
void TScadenze_application::filtra_sezioni()
const TRigaG& TRigaG::copy(const TRigaG& riga)
{
TString16 sezini = _msk->get(F_SEZINI);
TString16 sotini = _msk->get(F_SOTINI);
TString16 sezfin = _msk->get(F_SEZFIN);
TString16 sotfin = _msk->get(F_SOTFIN);
select_cursor(_cur4);
TLocalisamfile& fl = current_cursor()->file(LF_SOGGETTI);
TRectype da(fl.curr());
TRectype a(fl.curr());
da.zero();
a.zero();
if ((sezini.not_empty()) && (sezini.ok()))
da.put(SOG_CODSEZ, sezini);
if ((sotini.not_empty()) && (sotini.ok()))
da.put(SOG_CODSOT, sotini);
if ((sezfin.not_empty()) && (sezfin.ok()))
a.put(SOG_CODSEZ, sezfin);
if ((sotfin.not_empty()) && (sotfin.ok()))
a.put(SOG_CODSOT, sotfin);
current_cursor()->setregion(da, a);
_data = riga._data;
_valori = riga._valori;
return (*this);
}
const TRigaG& TRigaG::operator = (const TRigaG& riga)
{
copy(riga);
return (*this);
}
const real& TRigaG::operator [] (int colonna) const
{
real* valore = (real*)_valori.objptr(colonna);
if (valore == NULL)
return ZERO;
else
return *valore;
}
void TRigaG::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 TRigaG::azzera_valori()
{
_valori.destroy();
}
class TRiepilogoGiornaliero : public TApplication
{
TMask* _msk;
TRelation* _rel;
TCursor* _cur;
TLocalisamfile* _sezioni;
TLocalisamfile* _soggetti;
TLocalisamfile* _donaz;
TLocalisamfile* _atstatd;
bool _primedon;
TDate _dataini, _datafin;
TAssoc_array* _colonne;
TArray _righe; // array per riepilogo donazioni
TArray _righe_prime; // array per riepilogo prime don
TString16 _sezini, _sotini, _sezfin, _sotfin;
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 TDate data) { return data-_dataini; }
bool riepilogo();
bool stampa();
bool crea_colonne();
bool crea_righe();
void azzera_righe();
void stampa_sezione(TString16 codsez, TString16 codsot);
void crea_intestazione();
public:
TRiepilogoGiornaliero() {}
};
HIDDEN inline TRiepilogoGiornaliero& app() { return (TRiepilogoGiornaliero&) main_app(); }
bool TRiepilogoGiornaliero::crea_colonne()
{
_colonne->destroy();
TTable tdn("TDN");
real contatore(ZERO);
for (tdn.first(); !tdn.eof(); tdn.next())
{
real* oggetto = new real(contatore);
_colonne->add((const char*)tdn.get("CODTAB"),(TObject*)oggetto);
contatore+=1;
}
return !tdn.empty();
}
bool TRiepilogoGiornaliero::crea_righe()
{
TDate data = _dataini;
while (data<=_datafin)
{
_righe.add(new TRigaG(data), data2row(data));
if (_primedon)
_righe_prime.add(new TRigaG(data), data2row(data));
++data;
}
return _righe.items()>0;
}
bool TRiepilogoGiornaliero::create()
{
TApplication::create();
_msk = new TMask("at3500a");
_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();
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}
void TScadenze_application::set_page(int file, int cnt)
bool TRiepilogoGiornaliero::destroy()
{
// costruzione etichette
switch (_tipo_stampa)
{
case etichette:
{
TPrint_section& corpo = _form_eti->get_body();
corpo.reset();
corpo.update();
for (int i = 0; i < corpo.height(); i++)
{
TPrintrow& riga = corpo.row(i);
set_row(i+1,riga);
}
force_setpage(TRUE); // serve perchè alla prossima etichetta rifaccia la setpage
// altrimenti stampa sempre la stessa etichetta
}
break;
case elenco:
{
set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"######"));
set_row(1,"@7g@S", FLD(LF_SOGGETTI,SOG_CATDON));
set_row(1,"@10g#a", &_cognome_nome);
set_row(1,"@36g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@47g@ld", FLD(LF_SOGGETTI,SOG_DATAULTID)); // potremmo mettere anche datastato
set_row(1,"@58g@S", FLD(LF_SOGGETTI,SOG_IDON1));
set_row(1,"@61g@S", FLD(LF_SOGGETTI,SOG_IDON2));
set_row(1,"@64g@S", FLD(LF_SOGGETTI,SOG_IDON3));
set_row(1,"@67g@S", FLD(LF_SOGGETTI,SOG_IDON4));
set_row(2,"@50g@S", FLD(LF_SOGGETTI,SOG_STATO));
}
break;
}
delete _rel;
delete _msk;
delete _soggetti;
delete _donaz;
delete _atstatd;
delete _sezioni;
delete _colonne;
return TApplication::destroy();
}
bool TScadenze_application::filter_func_scadenze(const TRelation* rel)
{
bool filtrato = TRUE;
TLocalisamfile& sog = rel->lfile();
// filtro per categorie
TAssoc_array categorie = app()._categorie;
if (categorie.items() != 0)
{
TString16 cat = sog.get(SOG_CATDON);
filtrato = categorie.is_key((const char*) cat);
}
// filtro per data di prossima donazione
if (filtrato)
{
TRectype from = sog->curr();
TRectype to = sog->curr();
from.zero();
to.zero();
if (app()._dataini.ok())
{
if (app()._procdon == IDON_SI)
from.put(SOG_DATAPROSSI, app()._dataini);
else
from.put(SOG_DATAPROSAF, app()._dataini);
}
if (app()._datafin.ok())
{
if (app()._procdon == IDON_SI)
to.put(SOG_DATAPROSSI, app()._datafin);
else
to.put(SOG_DATAPROSAF, app()._datafin);
}
filtrato = (sog->curr() >= from) && (sog->curr() <= to);
}
return filtrato;
}
bool TScadenze_application::preprocess_page(int file, int counter)
{
// contatore soggetti stampati
// per ora non c'è
if (_tipo_stampa == elenco)
{
TString80 nome = current_cursor()->curr().get(SOG_COGNOME);
nome << " ";
nome << current_cursor()->curr().get(SOG_NOME);
_cognome_nome = nome;
// salto pagina se cambio sezione
TString16 codsez = current_cursor()->curr().get(SOG_CODSEZ);
TString16 codsot = current_cursor()->curr().get(SOG_CODSOT);
if ((_codsez!=codsez)||(_codsot!=codsot))
{
if (_codsez != "**")
printer().formfeed();
_codsez = codsez;
_codsot = codsot;
header_sezione(codsez, codsot);
}
}
return TRUE;
}
void TScadenze_application::header_sezione(TString16 codsez, TString16 codsot)
{
TString80 densez = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSEZ);
TString80 densot = current_cursor()->curr(LF_SEZIONI).get(SEZ_DENSOT);
TString256 intestazione(132);
intestazione = "Sezione: ";
intestazione << codsez;
intestazione << "/";
intestazione << codsot;
intestazione << " ";
intestazione << densez;
if ((densot.ok())&& (densot.not_empty()))
{
intestazione << "/";
intestazione << densot;
}
intestazione.center_just();
set_header(1,"@0g%s", (const char*) intestazione);
return;
}
bool TScadenze_application::set_print(int m)
bool TRiepilogoGiornaliero::menu(MENU_TAG m)
{
_tipo_stampa = undefined;
KEY tasto;
tasto = _msk->run();
switch (tasto)
{
case F_ELENCO:
_tipo_stampa = elenco;
_codsez = "**";
_codsot = "**";
break;
case F_ETICHETTE:
_tipo_stampa = etichette;
case F_CARTOLINE:
_tipo_stampa = cartoline;
break;
}
if (_tipo_stampa != undefined)
{
reset_files();
add_file(LF_SOGGETTI);
_dataini = _msk->get(F_DATAINI);
_datafin = _msk->get(F_DATAFIN);
_procdon = _msk->get(F_PROCDON1);
// filtro per sezioni selezionati
filtra_sezioni();
// filtro per categorie
TString16 catpri = _msk->get(F_CAT1);
TString16 catsec = _msk->get(F_CAT2);
TString16 catter = _msk->get(F_CAT3);
TString16 catqua = _msk->get(F_CAT4);
TString16 catqui = _msk->get(F_CAT5);
TString16 catses = _msk->get(F_CAT6);
if (catpri.not_empty() && catpri.ok())
_categorie.add((const char*) catpri);
if (catsec.not_empty() && catsec.ok())
_categorie.add((const char*) catsec);
if (catter.not_empty() && catter.ok())
_categorie.add((const char*) catter);
if (catqua.not_empty() && catqua.ok())
_categorie.add((const char*) catqua);
if (catqui.not_empty() && catqui.ok())
_categorie.add((const char*) catqui);
if (catses.not_empty() && catses.ok())
_categorie.add((const char*) catses);
// filtro per idoneo e non escluso
current_cursor()->setfilter("((TCS->S6 == \"I\" ) || (TCS->S6 == \"F\")) && (ESCLUSO == \"\")", TRUE);
// filtro per procedura di donazione (controllo che abbia la data)
/* questo filtro è nella filter_function
TString16 procdon = _msk->get(F_PROCDON1);
if (procdon == IDON_SI)
current_cursor()->setfilter("(DATAPROSSI == \"\")", TRUE);
else
current_cursor()->setfilter("(DATAPROSAF == \"\")", TRUE);
*/
// filtro per categorie
current_cursor()->set_filterfunction(filter_func_scadenze);
reset_print();
TMask& msk = get_mask();
KEY tasto;
tasto = msk.run();
if (tasto == K_ENTER)
{
_dataini = msk.get(F_DATAINI);
_datafin = msk.get(F_DATAFIN);
_primedon = msk.get_bool(F_PRIMEDON);
_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 TRiepilogoGiornaliero::crea_intestazione()
{
TPrintrow row;
TString256 sep;
sep = "GIORNALIERO DONAZIONI";
if (_dataini.ok())
{
sep << " dal ";
sep << _dataini.string();
}
if (_datafin.ok())
{
sep << " al ";
sep << _datafin.string();
}
sep.center_just(80);
row.put(sep);
row.put("@>", 1);
row.put("Pag. @#", 70);
printer().setheaderline(2, row);
row.reset();
printer().setheaderline(3, row);
sep = "Data ";
TTable tdn("TDN");
int pos = 27;
for (tdn.first(); !tdn.eof(); tdn.next())
{
sep.overwrite((const char*)tdn.get("CODTAB"),pos);
pos = pos+10;
}
sep.overwrite("Totale",pos);
row.put(sep);
printer().setheaderline(5, row);
sep = "";
sep.fill('-');
row.reset();
row.put(sep);
printer().setheaderline(6, row);
}
bool TRiepilogoGiornaliero::stampa()
{
if (printer().open())
{
crea_intestazione();
return TRUE;
}
else
return FALSE;
TRelation* relstat = new TRelation(LF_ATSTATD);
TCursor* curstat = new TCursor(relstat, "", 1);
TString16 oldsez = "**";
TString16 oldsot = "**";
double numero, numprime;
TString16 actsez, actsot;
TString16 tipodon;
TDate data;
long last = curstat->items();
for ( *curstat=0; curstat->pos() < last; ++(*curstat) )
{
actsez = curstat->curr().get(ATS_CODSEZ);
actsot = curstat->curr().get(ATS_CODSOT);
data = curstat->curr().get_date(ATS_DATA);
tipodon = curstat->curr().get(ATS_TIPODON);
numero = (double)curstat->curr().get_int(ATS_NUMERO);
numprime = (double)curstat->curr().get_int(ATS_NUMPRIME);
if (actsez != oldsez || actsot != oldsot)
{
if (oldsez != "**" && oldsot != "**")
{
stampa_sezione(oldsez,oldsot);
azzera_righe();
}
oldsez = actsez;
oldsot = actsot;
}
TRigaG& riga = (TRigaG&)_righe[data2row(data)];
real& colonna = (real&)_colonne->find((const char*)tipodon);
real n = numero;
riga.aggiorna_valore(colonna.integer(),n);
if (_primedon)
{
TRigaG& riga_prime = (TRigaG&)_righe_prime[data2row(data)];
n = numprime;
riga_prime.aggiorna_valore(colonna.integer(), n);
}
}
if (oldsez != "**" && oldsot != "**")
stampa_sezione(oldsez,oldsot);
delete curstat;
delete relstat;
printer().close();
return TRUE;
}
else
return FALSE;
}
void TScadenze_application::crea_intestazione()
void TRiepilogoGiornaliero::azzera_righe()
{
reset_header();
if (_tipo_stampa == elenco)
{
TString256 sep(132);
sep = "SCADENZE DI DONAZIONE ";
TString16 procdon = _msk->get(F_PROCDON1);
sep << procdon ;
TDate data = _msk->get(F_DATAINI);
if (data.ok())
TDate data = _dataini;
while (data<=_datafin)
{
TRigaG& riga = (TRigaG&)_righe[data2row(data)];
riga.azzera_valori();
if (_primedon)
{
sep << " dal ";
sep << data.string();
TRigaG& riga_prime = (TRigaG&)_righe_prime[data2row(data)];
riga_prime.azzera_valori();
}
data = _msk->get(F_DATAFIN);
if (data.ok())
++data;
}
}
void TRiepilogoGiornaliero::stampa_sezione(TString16 codsez, TString16 codsot)
{
TPrintrow row;
TString256 rigastampa;
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())
{
sep << " al ";
sep << data.string();
rigastampa << "/";
rigastampa << den;
}
sep.center_just();
set_header(2, "@0g%s", (const char*) sep);
TString16 data_stampa = _data_stampa.string();
set_header(2,"@0g%10s", (const char*) data_stampa);
sep = "";
sep << "Pag. @#";
set_header(2, "@120g%s", (const char*) sep);
sep = "";
sep.fill('-');
set_header(3, (const char *) sep);
set_header(4,"@0gCod.@7gC.@10gCognome e nome@36gNato il@47gData ID@58gTipi idon.");
set_header(5,"@47gTipo/Esito");
set_header(6,"@0g------@7g--@10g-------------------------@36g----------@47g----------@58g-- -- -- --");
}
}
bool TScadenze_application::user_create()
{
_rel = new TRelation(LF_SOGGETTI);
_rel->add("TCS", "CODTAB==STATO",1,0,ALIAS_TCS);
_rel->add("LCP", "CODTAB==LOCALITA",1,0,ALIAS_LCP);
_rel->add(LF_COMUNI, "COM==COM");
// per stampare la denominazione della sezione nell'intestazione
_rel->add(LF_SEZIONI, "CODSEZ==CODSEZ|CODSOT==CODSOT");
_cur1 = add_cursor(new TCursor(_rel, "", 1)); //cursore ordinamento per codice
_cur2 = add_cursor(new TCursor(_rel, "", 2)); //cursore ordinamento per cognome e nome
_cur3 = add_cursor(new TCursor(_rel, "", 3)); //cursore ordinamento per sezione+sottogruppo+codice
_cur4 = add_cursor(new TCursor(_rel, "", 4)); //cursore ordinamento per sezione+sottogruppo+cognome e nome
_msk = new TMask("at3500a");
}
rigastampa.center_just(80);
row.put(rigastampa);
printer().setheaderline(1, row);
_form_eti = new TScadenze_form("AT_ETSOG");
return TRUE;
TRigaG rigatotali(NULLDATE);
TDate data = _dataini;
real totaledata = ZERO;
TString16 valore;
while (data<=_datafin)
{
TRigaG& riga = (TRigaG&)_righe[data2row(data)];
row.reset();
rigastampa = "";
rigastampa.format("%s", (const char*)data.string());
totaledata = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
rigatotali.aggiorna_valore(i,riga[i]);
totaledata+=riga[i];
valore = "";
valore.format("%8d",riga[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totaledata.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
++data;
}
// stampa totali per sezione
rigastampa = "";
rigastampa.fill('-');
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
rigastampa = "";
rigastampa = "Totale periodo";
totaledata = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
totaledata+=rigatotali[i];
valore = "";
valore.format("%8d",rigatotali[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totaledata.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
if (_primedon)
{
printer().formfeed();
rigatotali.azzera_valori();
data = _dataini;
while (data<=_datafin)
{
TRigaG& riga = (TRigaG&)_righe_prime[data2row(data)];
row.reset();
rigastampa = "";
rigastampa.format("%s", (const char*)data.string());
totaledata = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
rigatotali.aggiorna_valore(i,riga[i]);
totaledata+=riga[i];
valore = "";
valore.format("%8d",riga[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totaledata.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
++data;
}
// stampa totali per sezione
rigastampa = "";
rigastampa.fill('-');
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
rigastampa = "";
rigastampa = "Totale periodo";
totaledata = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
totaledata+=rigatotali[i];
valore = "";
valore.format("%8d",rigatotali[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totaledata.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
}
row.reset();
printer().setheaderline(3, row);
printer().formfeed();
}
bool TScadenze_application::user_destroy()
{
delete _msk;
delete _rel;
delete _form_eti;
return TRUE;
}
bool TRiepilogoGiornaliero::riepilogo()
{
if (crea_colonne() && crea_righe())
{
// cancello i risultati della elaborazione precedente
TLocalisamfile stat(LF_ATSTATD);
for (stat.first(); !stat.eof(); stat.next())
stat.remove();
// 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 (filtro.empty())
filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
}
if (_sotini.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
else
{
filtro << " && ";
filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
}
}
}
if (_sezfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
}
if (_sotfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
else
{
filtro << " && ";
filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
}
}
}
_cur->setfilter((const char*) filtro, TRUE);
TString16 codsez, codsot, tipodon;
int anno, mese, giorno;
TDate data;
long numero;
bool primadon;
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);
codsez = recdon.get(DON_CODSEZ);
codsot = recdon.get(DON_CODSOT);
if (codsez.empty())
{
codsez = recsog.get(SOG_CODSEZ);
codsot = recsog.get(SOG_CODSOT);
}
data = recdon.get_date(DON_DATADON);
anno = data.year();
mese = data.month();
giorno = data.day();
tipodon = recdon.get(DON_TIPODON);
primadon = recdon.get_bool(DON_PRIMADON);
stat.zero();
stat.put(ATS_CODSEZ, codsez);
stat.put(ATS_CODSOT, codsot);
//stat.put(ATS_DATA, data);
stat.put(ATS_ANNO, anno);
stat.put(ATS_MESE, mese);
stat.put(ATS_GIORNO, giorno);
stat.put(ATS_TIPODON, tipodon);
if (stat.read() == NOERR)
{
numero = stat.get_long(ATS_NUMERO);
numero++;
stat.put(ATS_NUMERO, numero);
if (_primedon && primadon)
{
numero = stat.get_long(ATS_NUMPRIME);
numero++;
stat.put(ATS_NUMPRIME, numero);
}
int err = stat.rewrite();
}
else
{
stat.zero();
stat.put(ATS_CODSEZ, codsez);
stat.put(ATS_CODSOT, codsot);
stat.put(ATS_ANNO, anno);
stat.put(ATS_MESE, mese);
stat.put(ATS_GIORNO, giorno);
stat.put(ATS_DATA, data);
stat.put(ATS_TIPODON, tipodon);
numero = 1;
stat.put(ATS_NUMERO, numero);
if (_primedon && primadon)
stat.put(ATS_NUMPRIME, numero);
int err = stat.write();
}
}
return (stat.eod() > 0);
}
else
return FALSE;
}
int at3500(int argc, char* argv[])
{
TScadenze_application a;
a.run(argc, argv, "Scadenze di donazione");
return 0;
}
TRiepilogoGiornaliero a;
a.run(argc, argv, "Riepilogo giornaliero donazioni");
return 0;
}

15
at/at3500a.h Executable file
View File

@ -0,0 +1,15 @@
// riepilogo gironaliero donazioni
// definizione campi per maschera di selezione
#define F_SEZINI 101
#define F_D_SEZINI 102
#define F_SOTINI 103
#define F_D_SOTINI 104
#define F_SEZFIN 105
#define F_D_SEZFIN 106
#define F_SOTFIN 107
#define F_D_SOTFIN 108
#define F_DATAINI 301
#define F_DATAFIN 302
#define F_PRIMEDON 303

153
at/at3500a.uml Executable file
View File

@ -0,0 +1,153 @@
#include "at3500a.h"
PAGE "Riepilogo giornaliero donazioni" -1 -1 78 12
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 1 "Scelta sezioni/sottogruppi"
END
STRING F_SEZINI 2
BEGIN
PROMPT 2 2 "Da "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZINI
INPUT CODSOT F_SOTINI
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZINI CODSEZ
OUTPUT F_D_SEZINI DENSEZ
OUTPUT F_SOTINI CODSOT
OUTPUT F_D_SOTINI DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione da cui partire"
END
STRING F_D_SEZINI 25
BEGIN
PROMPT 11 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZINI
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZINI
CHECKTYPE NORMAL
HELP "Sezione da cui partire"
END
STRING F_SOTINI 2
BEGIN
PROMPT 2 3 " "
COPY ALL F_SEZINI
CHECKTYPE SEARCH
HELP "Codice sottogruppo da cui partire"
END
STRING F_D_SOTINI 25
BEGIN
PROMPT 11 3 ""
FLAGS "U"
COPY USE F_D_SEZINI
INPUT DENSEZ F_D_SEZINI
INPUT DENSOT F_D_SOTINI
COPY DISPLAY F_D_SEZINI
COPY OUTPUT F_D_SEZINI
CHECKTYPE NORMAL
HELP "Sottogruppo da cui partire"
END
STRING F_SEZFIN 2
BEGIN
PROMPT 41 2 "A "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZFIN
INPUT CODSOT F_SOTFIN
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZFIN CODSEZ
OUTPUT F_D_SEZFIN DENSEZ
OUTPUT F_SOTFIN CODSOT
OUTPUT F_D_SOTFIN DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione finale"
END
STRING F_D_SEZFIN 25
BEGIN
PROMPT 49 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZFIN
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZFIN
CHECKTYPE NORMAL
HELP "Sezione finale"
END
STRING F_SOTFIN 2
BEGIN
PROMPT 41 3 " "
COPY ALL F_SEZFIN
CHECKTYPE SEARCH
HELP "Codice sottogruppo finale"
END
STRING F_D_SOTFIN 25
BEGIN
PROMPT 49 3 ""
FLAGS "U"
COPY USE F_D_SEZFIN
INPUT DENSEZ F_D_SEZFIN
INPUT DENSOT F_D_SOTFIN
COPY DISPLAY F_D_SEZFIN
COPY OUTPUT F_D_SEZFIN
CHECKTYPE NORMAL
HELP "Sottogruppo finale"
END
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 5 "Opzioni per il riepilogo"
END
DATE F_DATAINI
BEGIN
PROMPT 2 6 "Donazioni effettuate dal "
HELP "Data iniziale"
END
DATE F_DATAFIN
BEGIN
PROMPT 40 6 "al "
HELP "Data finale"
END
BOOLEAN F_PRIMEDON
BEGIN
PROMPT 2 7 "Riepilogo per prime donazioni"
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,16 @@
// Convocazione per BOLOGNA
// statistica donazioni per gruppo e rh
// definizione campi per maschera di selezione
#define F_DATACONV 101
#define F_PUNTO 102
#define F_D_PUNTO 103
#define F_TIPODON 104
#define F_D_TIPODON 105
#define F_CODSEZ 106
#define F_DENSEZ 107
#define F_CODSOT 108
#define F_DENSOT 109
#define F_SEZINI 101
#define F_D_SEZINI 102
#define F_SOTINI 103
#define F_D_SOTINI 104
#define F_SEZFIN 105
#define F_D_SEZFIN 106
#define F_SOTFIN 107
#define F_D_SOTFIN 108
#define F_ELENCO 401
#define F_ETICHETTE 402
#define F_CARTOLINE 403
#define F_DATAINI 301
#define F_DATAFIN 302
#define F_TIPODON 303
#define F_D_TIPODON 304

168
at/at3600a.uml Executable file
View File

@ -0,0 +1,168 @@
#include "at3600a.h"
PAGE "Statistica donazioni/donatori" -1 -1 78 12
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 1 "Scelta sezioni/sottogruppi"
END
STRING F_SEZINI 2
BEGIN
PROMPT 2 2 "Da "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZINI
INPUT CODSOT F_SOTINI
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZINI CODSEZ
OUTPUT F_D_SEZINI DENSEZ
OUTPUT F_SOTINI CODSOT
OUTPUT F_D_SOTINI DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione da cui partire"
END
STRING F_D_SEZINI 25
BEGIN
PROMPT 11 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZINI
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZINI
CHECKTYPE NORMAL
HELP "Sezione da cui partire"
END
STRING F_SOTINI 2
BEGIN
PROMPT 2 3 " "
COPY ALL F_SEZINI
CHECKTYPE SEARCH
HELP "Codice sottogruppo da cui partire"
END
STRING F_D_SOTINI 25
BEGIN
PROMPT 11 3 ""
FLAGS "U"
COPY USE F_D_SEZINI
INPUT DENSEZ F_D_SEZINI
INPUT DENSOT F_D_SOTINI
COPY DISPLAY F_D_SEZINI
COPY OUTPUT F_D_SEZINI
CHECKTYPE NORMAL
HELP "Sottogruppo da cui partire"
END
STRING F_SEZFIN 2
BEGIN
PROMPT 41 2 "A "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZFIN
INPUT CODSOT F_SOTFIN
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZFIN CODSEZ
OUTPUT F_D_SEZFIN DENSEZ
OUTPUT F_SOTFIN CODSOT
OUTPUT F_D_SOTFIN DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione finale"
END
STRING F_D_SEZFIN 25
BEGIN
PROMPT 49 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZFIN
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZFIN
CHECKTYPE NORMAL
HELP "Sezione finale"
END
STRING F_SOTFIN 2
BEGIN
PROMPT 41 3 " "
COPY ALL F_SEZFIN
CHECKTYPE SEARCH
HELP "Codice sottogruppo finale"
END
STRING F_D_SOTFIN 25
BEGIN
PROMPT 49 3 ""
FLAGS "U"
COPY USE F_D_SEZFIN
INPUT DENSEZ F_D_SEZFIN
INPUT DENSOT F_D_SOTFIN
COPY DISPLAY F_D_SEZFIN
COPY OUTPUT F_D_SEZFIN
CHECKTYPE NORMAL
HELP "Sottogruppo finale"
END
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 5 "Opzioni per la statistica"
END
DATE F_DATAINI
BEGIN
PROMPT 2 6 "Donazioni effettuate dal "
HELP "Data iniziale"
END
DATE F_DATAFIN
BEGIN
PROMPT 40 6 "al "
HELP "Data finale"
END
STRING F_TIPODON 2
BEGIN
PROMPT 2 7 "Tipo donazioni "
FLAGS "U"
USE TDN
INPUT CODTAB F_TIPODON
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@30" S0
OUTPUT F_TIPODON CODTAB
OUTPUT F_D_TIPODON S0
CHECKTYPE NORMAL
WARNING "Codice non presente"
END
STRING F_D_TIPODON 30
BEGIN
PROMPT 23 7 ""
FLAGS "D"
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK

601
at/at3700.cpp Executable file
View File

@ -0,0 +1,601 @@
#include <applicat.h>
//#include <execp.h>
#include <mask.h>
#include <printer.h>
#include <progind.h>
#include <real.h>
#include <relation.h>
#include <tabutil.h>
#include <urldefid.h>
#include <utility.h>
#include "at3.h"
// nomi campi maschera
#include "at3700a.h"
// nomi dei campi
#include "soggetti.h"
#include "atstats.h"
#include "sezioni.h"
// classe per la definizione di una riga di statistica
class TRigaSGruppo : public TObject
{
TString16 _gruppo, _rh;
TArray _valori;
protected:
const TRigaSGruppo& copy(const TRigaSGruppo& riga);
public:
const TString16 gruppo() const { return _gruppo; }
const TString16 rh() const { return _rh; }
TObject* dup() const { return new TRigaSGruppo(*this); }
const TRigaSGruppo& operator = (const TRigaSGruppo& riga);
const real& operator [] (int colonna) const;
void aggiorna_valore(int colonna, const real& numero) ;
void azzera_valori();
// costruttore
TRigaSGruppo(TString16 gruppo, TString16 rh) {_gruppo = gruppo; _rh = rh;}
// costruttore di copia
TRigaSGruppo(const TRigaSGruppo& riga) { copy(riga); }
virtual ~TRigaSGruppo() {};
};
const TRigaSGruppo& TRigaSGruppo::copy(const TRigaSGruppo& riga)
{
_gruppo = riga._gruppo;
_rh = riga._rh;
_valori = riga._valori;
return (*this);
}
const TRigaSGruppo& TRigaSGruppo::operator = (const TRigaSGruppo& riga)
{
copy(riga);
return (*this);
}
const real& TRigaSGruppo::operator [] (int colonna) const
{
real* valore = (real*)_valori.objptr(colonna);
if (valore == NULL)
return ZERO;
else
return *valore;
}
void TRigaSGruppo::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 TRigaSGruppo::azzera_valori()
{
_valori.destroy();
}
class TStatisticaSog : public TApplication
{
TMask* _msk;
TRelation* _rel;
TCursor* _cur;
TLocalisamfile* _sezioni;
TLocalisamfile* _soggetti;
TLocalisamfile* _atstats;
TAssoc_array* _colonne;
TArray _righe;
TString16 _sezini, _sotini, _sezfin, _sotfin;
TString16 _catdon;
TDate _data;
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:
TStatisticaSog() {}
};
HIDDEN inline TStatisticaSog& app() { return (TStatisticaSog&) main_app(); }
int TStatisticaSog::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 TStatisticaSog::crea_colonne()
{
_colonne->destroy();
real contatore(ZERO);
real* oggetto = new real(contatore);
const char* indice = "0";
_colonne->add(indice,(TObject*)oggetto);
indice = "1"; // maschi
contatore = contatore+1;
real* oggetto2 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto2);
indice = "2"; // femmine
contatore = contatore+1;
real* oggetto3 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto3);
indice = "9"; // non spec.
contatore = contatore+1;
real* oggetto4 = new real(contatore);
_colonne->add(indice,(TObject*)oggetto4);
return TRUE;
}
bool TStatisticaSog::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 TRigaSGruppo(gruppo, rh), data2row(gruppo, rh));
}
}
return _righe.items()>0;
}
bool TStatisticaSog::create()
{
TApplication::create();
_msk = new TMask("at3700a");
_rel = new TRelation(LF_SOGGETTI);
_soggetti = new TLocalisamfile(LF_SOGGETTI);
_atstats = new TLocalisamfile(LF_ATSTATS);
_sezioni = new TLocalisamfile(LF_SEZIONI);
_colonne = new TAssoc_array();
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}
bool TStatisticaSog::destroy()
{
delete _rel;
delete _msk;
delete _soggetti;
delete _atstats;
delete _sezioni;
delete _colonne;
return TApplication::destroy();
}
bool TStatisticaSog::menu(MENU_TAG m)
{
TMask& msk = get_mask();
KEY tasto;
tasto = msk.run();
if (tasto == K_ENTER)
{
_sezini = _msk->get(F_SEZINI);
_sotini = _msk->get(F_SOTINI);
_sezfin = _msk->get(F_SEZFIN);
_sotfin = _msk->get(F_SOTFIN);
_catdon = _msk->get(F_CATDON);
_data = _msk->get_date(F_DATA);
if (riepilogo())
stampa();
}
return FALSE;
}
void TStatisticaSog::crea_intestazione()
{
TPrintrow row;
TString256 sep;
sep = "STATISTICA SOGGETTI PER SESSO, GRUPPO E RH al ";
sep << _data.string();
sep.center_just(80);
row.put(sep);
row.put("@>", 1);
row.put("Pag. @#", 70);
printer().setheaderline(2, row);
sep = "";
sep << "Categoria ";
sep << _catdon;
sep.center_just(80);
row.reset();
row.put(sep);
printer().setheaderline(3, row);
sep = "";
sep << "Gruppo/Rh Sconosciuto Maschi Femmine Non spec. Totale";
row.reset();
row.put(sep);
printer().setheaderline(5, row);
sep = "";
sep.fill('-');
row.reset();
row.put(sep);
printer().setheaderline(6, row);
}
bool TStatisticaSog::stampa()
{
if (printer().open())
{
crea_intestazione();
TRelation* relstat = new TRelation(LF_ATSTATS);
TCursor* curstat = new TCursor(relstat, "", 1);
TString16 oldsez = "**";
TString16 oldsot = "**";
double numero;
TString16 actsez, actsot;
TString16 gruppo, rh, sesso;
long last = curstat->items();
for ( *curstat=0; curstat->pos() < last; ++(*curstat) )
{
actsez = curstat->curr().get(ATSS_CODSEZ);
actsot = curstat->curr().get(ATSS_CODSOT);
gruppo = curstat->curr().get(ATSS_GRUPPO);
rh = curstat->curr().get(ATSS_RH);
sesso = curstat->curr().get(ATSS_SESSO);
if (sesso.empty())
sesso = "9";
numero = (double)curstat->curr().get_int(ATSS_NUMERO);
if (actsez != oldsez || actsot != oldsot)
{
if (oldsez != "**" && oldsot != "**")
{
stampa_sezione(oldsez,oldsot);
azzera_righe();
}
oldsez = actsez;
oldsot = actsot;
}
TRigaSGruppo& riga = (TRigaSGruppo&)_righe[data2row(gruppo,rh)];
real& colonna = (real&)_colonne->find((const char*)sesso);
real n = numero;
riga.aggiorna_valore(colonna.integer(),n);
}
if (oldsez != "**" && oldsot != "**")
stampa_sezione(oldsez,oldsot);
delete curstat;
delete relstat;
printer().close();
return TRUE;
}
else
return FALSE;
}
void TStatisticaSog::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;
}
TRigaSGruppo& riga = (TRigaSGruppo&)_righe[data2row(gruppo,rh)];
riga.azzera_valori();
}
}
}
void TStatisticaSog::stampa_sezione(TString16 codsez, TString16 codsot)
{
TPrintrow row;
TString256 rigastampa;
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;
}
}
rigastampa.center_just(80);
row.put(rigastampa);
printer().setheaderline(1, row);
TRigaSGruppo rigatotali(" "," ");
TString16 valore;
TString16 gruppo, rh;
real totalegruppo = 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;
}
TRigaSGruppo& riga = (TRigaSGruppo&)_righe[data2row(gruppo,rh)];
row.reset();
rigastampa = "";
rigastampa << gruppo;
rigastampa << " ";
rigastampa << rh;
totalegruppo = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
rigatotali.aggiorna_valore(i,riga[i]);
totalegruppo+=riga[i];
valore = "";
valore.format("%8d",riga[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
if (totalegruppo != 0)
{
valore = "";
valore.format("%8d",totalegruppo.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
}
}
}
// stampa totali per sezione
rigastampa = "";
rigastampa.fill('-');
row.reset();
row.put(rigastampa);
printer().print(row);
row.reset();
rigastampa = "";
rigastampa = "Totale";
real totale;
totale = ZERO;
int pos = 21;
for (int i=0;i<_colonne->items();i++)
{
totale+=rigatotali[i];
valore = "";
valore.format("%8d",rigatotali[i].integer());
rigastampa.overwrite((const char*)valore, pos);
pos = pos+10;
}
valore = "";
valore.format("%8d",totale.integer());
rigastampa.overwrite((const char*)valore, pos+4);
row.put((const char*) rigastampa);
printer().print(row);
printer().formfeed();
}
bool TStatisticaSog::riepilogo()
{
if (crea_colonne() && crea_righe())
{
// cancello i risultati della elaborazione precedente
TLocalisamfile stat(LF_ATSTATS);
for (stat.first(); !stat.eof(); stat.next())
stat.remove();
stat.setkey(1);
_cur = new TCursor(_rel, "", 1);
TString256 filtro = "";
// filtro per categoria
if (_catdon.not_empty())
{
if (filtro.empty())
filtro = format("(90->CATDON == \"%s\")",(const char*)_catdon);
else
{
filtro << " && ";
filtro << format("(90->CATDON == \"%s\")",(const char*)_catdon);
}
if (_data.ok())
{
TTable ctd("CTD");
ctd.put("CODTAB",_catdon);
if (ctd.read() == NOERR)
{
bool dimissione = ctd.get_bool("B0");
if (dimissione)
filtro << " && (ANSI(90->DATADIM)<=" << _data.string(ANSI) << ")";
else
filtro << " && (ANSI(90->DATAISC)<=" << _data.string(ANSI) << ")";
}
}
}
// filtro per sezione/sottogruppo
if (_sezini.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ >= \"%s\")",(const char*)_sezini);
}
if (_sotini.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
else
{
filtro << " && ";
filtro << format("(90->CODSOT >= \"%s\")",(const char*)_sotini);
}
}
}
if (_sezfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
else
{
filtro << " && ";
filtro << format("(90->CODSEZ <= \"%s\")",(const char*)_sezfin);
}
if (_sotfin.not_empty())
{
if (filtro.empty())
filtro = format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
else
{
filtro << " && ";
filtro << format("(90->CODSOT <= \"%s\")",(const char*)_sotfin);
}
}
}
_cur->setfilter((const char*) filtro, TRUE);
TString16 codsez, codsot;
long numero;
TString16 gruppo, rh, sesso;
TRectype& recsog = _cur->curr();
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);
codsez = recsog.get(SOG_CODSEZ);
codsot = recsog.get(SOG_CODSOT);
gruppo = recsog.get(SOG_GRUPPOAB0);
rh = recsog.get(SOG_RHANTID);
sesso = recsog.get(SOG_SESSO);
if (sesso.empty())
sesso = "9";
if (gruppo == "A1" || gruppo == "A2")
gruppo = "A";
if (gruppo == "A1B" || gruppo == "A2B")
gruppo = "AB";
stat.zero();
stat.put(ATSS_CODSEZ, codsez);
stat.put(ATSS_CODSOT, codsot);
stat.put(ATSS_SESSO, sesso);
stat.put(ATSS_GRUPPO, gruppo);
stat.put(ATSS_RH, rh);
if (stat.read() == NOERR)
{
numero = stat.get_long(ATSS_NUMERO);
numero++;
stat.put(ATSS_NUMERO, numero);
stat.rewrite();
}
else
{
stat.put(ATSS_CODSEZ, codsez);
stat.put(ATSS_CODSOT, codsot);
stat.put(ATSS_SESSO, sesso);
stat.put(ATSS_GRUPPO, gruppo);
stat.put(ATSS_RH, rh);
numero = 1;
stat.put(ATSS_NUMERO, numero);
stat.write();
}
}
return (stat.eod() > 0);
}
else
return FALSE;
}
int at3700(int argc, char* argv[])
{
TStatisticaSog a;
a.run(argc, argv, "Statistica soggetti per sesso, gruppo e rh");
return 0;
}

15
at/at3700a.h Executable file
View File

@ -0,0 +1,15 @@
// statistica SOGGETTI PER SESSO E GRUPPO/RH
// definizione campi per maschera di selezione
#define F_SEZINI 101
#define F_D_SEZINI 102
#define F_SOTINI 103
#define F_D_SOTINI 104
#define F_SEZFIN 105
#define F_D_SEZFIN 106
#define F_SOTFIN 107
#define F_D_SOTFIN 108
#define F_CATDON 301
#define F_D_CATDON 302
#define F_DATA 303

163
at/at3700a.uml Executable file
View File

@ -0,0 +1,163 @@
#include "at3700a.h"
PAGE "Statistica donatori per sesso, gruppo e rh" -1 -1 78 12
GROUPBOX DLG_NULL 77 4
BEGIN
PROMPT 1 1 "Scelta sezioni/sottogruppi"
END
STRING F_SEZINI 2
BEGIN
PROMPT 2 2 "Da "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZINI
INPUT CODSOT F_SOTINI
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZINI CODSEZ
OUTPUT F_D_SEZINI DENSEZ
OUTPUT F_SOTINI CODSOT
OUTPUT F_D_SOTINI DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione da cui partire"
END
STRING F_D_SEZINI 25
BEGIN
PROMPT 11 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZINI
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZINI
CHECKTYPE NORMAL
HELP "Sezione da cui partire"
END
STRING F_SOTINI 2
BEGIN
PROMPT 2 3 " "
COPY ALL F_SEZINI
CHECKTYPE SEARCH
HELP "Codice sottogruppo da cui partire"
END
STRING F_D_SOTINI 25
BEGIN
PROMPT 11 3 ""
FLAGS "U"
COPY USE F_D_SEZINI
INPUT DENSEZ F_D_SEZINI
INPUT DENSOT F_D_SOTINI
COPY DISPLAY F_D_SEZINI
COPY OUTPUT F_D_SEZINI
CHECKTYPE NORMAL
HELP "Sottogruppo da cui partire"
END
STRING F_SEZFIN 2
BEGIN
PROMPT 41 2 "A "
FLAGS "U"
USE LF_SEZIONI
INPUT CODSEZ F_SEZFIN
INPUT CODSOT F_SOTFIN
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
OUTPUT F_SEZFIN CODSEZ
OUTPUT F_D_SEZFIN DENSEZ
OUTPUT F_SOTFIN CODSOT
OUTPUT F_D_SOTFIN DENSOT
CHECKTYPE SEARCH
HELP "Codice sezione finale"
END
STRING F_D_SEZFIN 25
BEGIN
PROMPT 49 2 ""
FLAGS "U"
USE LF_SEZIONI KEY 2
INPUT DENSEZ F_D_SEZFIN
DISPLAY "Sezione@25" DENSEZ
DISPLAY "Sottogruppo@25" DENSOT
DISPLAY "Cod.sez" CODSEZ
DISPLAY "Cod.sot." CODSOT
COPY OUTPUT F_SEZFIN
CHECKTYPE NORMAL
HELP "Sezione finale"
END
STRING F_SOTFIN 2
BEGIN
PROMPT 41 3 " "
COPY ALL F_SEZFIN
CHECKTYPE SEARCH
HELP "Codice sottogruppo finale"
END
STRING F_D_SOTFIN 25
BEGIN
PROMPT 49 3 ""
FLAGS "U"
COPY USE F_D_SEZFIN
INPUT DENSEZ F_D_SEZFIN
INPUT DENSOT F_D_SOTFIN
COPY DISPLAY F_D_SEZFIN
COPY OUTPUT F_D_SEZFIN
CHECKTYPE NORMAL
HELP "Sottogruppo finale"
END
GROUPBOX DLG_NULL 77 3
BEGIN
PROMPT 1 5 "Opzioni per la statistica"
END
STRING F_CATDON 2
BEGIN
PROMPT 2 6 "Cat. "
FLAGS "U"
USE CTD
INPUT CODTAB F_CATDON
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@40" S0
OUTPUT F_CATDON CODTAB
OUTPUT F_D_CATDON S0
CHECKTYPE NORMAL
WARNING "Codice categoria non presente"
HELP "Categoria di appartenenza"
END
STRING F_D_CATDON 25
BEGIN
PROMPT 12 6 ""
FLAGS "D"
END
DATE F_DATA
BEGIN
PROMPT 45 6 "Data elaborazione "
END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -22 -1 ""
END
ENDPAGE
ENDMASK

View File

@ -47,7 +47,7 @@ MENUBAR MENU_BAR(6)
MENU MENU_BAR(6)
SUBMENU MENU_FILE "~File"
/* at4 -6 stampa cartoline/... da codice a codice */
/* at4 -7 stampa cartoline/... da codice a codice */
MENUBAR MENU_BAR(7)
MENU MENU_BAR(7)

View File

@ -4,19 +4,32 @@
#include <utility.h>
#include "soggetti.h"
#include "sezioni.h"
#include "sezioni.h"
#include <comuni.h>
#include "at4.h"
#include "at4100a.h"
#include "at4100b.h"
#include "at4100c.h"
#define ALIAS_LCP 100
#define ALIAS_TCS 200
#define ALIAS_CTD 700 // categoria donatori
#define ALIAS_CTN1 701 // categoria non donatori 1
#define ALIAS_CTN2 702 // categoria non donatori 2
#define ALIAS_TCS 200 // tipi/esiti controlli sanitari
#define ALIAS_LDN 400 // punti di prelievo
#define ALIAS_LCPDOM 100 // localita' postale di domicilio
#define ALIAS_COMDOM 501 // comune di domicilio
#define ALIAS_COMNAS 500 // comune di nascita
#define ALIAS_BNZ 600 // benemerenze
#define ALIAS_GAZ 300 // gruppi aziendale
#define IDON_SI "SI"
#define IDON_AF "AF"
enum ts { undefined = 0, elenco = 1, etichette = 2, cartoline = 3 };
enum ts { undefined = 0, elenco = 1, completo = 2, etichette = 3, cartoline = 4 };
// definizione form per etichette
class TScadenze_form : public TForm
@ -39,7 +52,7 @@ class TStampaScadenze : public TPrintapp
TScadenze_form* _form_eti;
TScadenze_form* _form_car;
TAssoc_array _categorie;
TParagraph_string _cognome_nome;
TParagraph_string _cognome_nome, _dencom;
TDate _data_stampa;
TDate _dataini, _datafin, _dataultid;
bool _usomodo, _usasez;
@ -50,6 +63,7 @@ class TStampaScadenze : public TPrintapp
TString80 _invitoper, _data, _presso1, _presso2, _presso3, _presso4;
TString80 _note, _intest1, _intest2, _intest3, _intest4;
int _etlarghezza, _etcolonne;
int _contatore, _totfinestampa;
static bool filter_func_scadenze(const TRelation* rel);
@ -59,15 +73,18 @@ protected:
virtual bool set_print(int m);
virtual void set_page(int file, int cnt);
virtual bool preprocess_page(int file, int counter);
virtual print_action postprocess_print(int file, int counter);
ts dati_cartoline();
public:
void crea_intestazione();
void filtra_sezioni();
void footer_sezione();
void fine_stampa();
void header_sezione(const TString16 codsez, const TString16 codsot);
void dati_sezione(const TString16 codsez, const TString16 codsot);
TMask& app_mask() { return *_msk; }
TStampaScadenze() : _data_stampa(TODAY), _cognome_nome("",25) {}
TStampaScadenze() : _data_stampa(TODAY), _cognome_nome("",25), _dencom("",25) {}
};
HIDDEN inline TStampaScadenze& app() { return (TStampaScadenze&) main_app(); }
@ -97,6 +114,29 @@ ts TStampaScadenze::dati_cartoline()
return undefined;
}
void TStampaScadenze::fine_stampa()
{
// stampa totale soggetti a fine stampa
reset_footer();
printer().footerlen(20);
TString sep(80);
sep.fill('-');
set_footer(1, (const char *) sep);
set_footer(2,"TOTALE SOGGETTI IN SCADENZA %d", _totfinestampa);
printer().formfeed();
reset_footer();
}
print_action TStampaScadenze::postprocess_print(int file, int counter)
{
if (_contatore > 0)
footer_sezione();
if (_totfinestampa > 0 && _contatore != _totfinestampa)
fine_stampa();
return NEXT_PAGE;
}
void TStampaScadenze::filtra_sezioni()
{
const TString16 sezini = _msk->get(F_SEZINI);
@ -223,6 +263,39 @@ void TStampaScadenze::set_page(int file, int cnt)
//set_row(3,"");
}
break;
case completo:
{
set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"#########"));
set_row(1,"@10g#a", &_cognome_nome);
set_row(3,"@10g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@36g@S", FLD(LF_SOGGETTI,SOG_DOM_INDIR));
set_row(2,"@36g#a", &_dencom);
set_row(1,"@62g@S", FLD(LF_SOGGETTI,SOG_TELABI));
set_row(2,"@62g@S", FLD(LF_SOGGETTI,SOG_TELLAV));
set_row(3,"@62g@S", FLD(LF_SOGGETTI,SOG_TELALT));
set_row(1,"@77g@ld", FLD(LF_SOGGETTI,SOG_DATAPROSSI));
set_row(2,"@77g@ld", FLD(LF_SOGGETTI,SOG_DATAPROSAF));
set_row(1,"@88g@ld", FLD(LF_SOGGETTI,SOG_DATAULTSI));
set_row(2,"@88g@ld", FLD(LF_SOGGETTI,SOG_DATAULTAF));
set_row(1,"@99g@ld", FLD(LF_SOGGETTI,SOG_DATAULTID));
set_row(3,"@77g@S", FLD(LF_SOGGETTI,SOG_GRUPPOAB0));
set_row(3,"@81g@S", FLD(LF_SOGGETTI,SOG_RHANTID));
set_row(3,"@85g@S", FLD(LF_SOGGETTI,SOG_FENOTIPORH));
set_row(3,"@92g@S", FLD(LF_SOGGETTI,SOG_KELL));
set_row(3,"@96g@S", FLD(LF_SOGGETTI,SOG_DU));
set_row(3,"@100g@S", FLD(LF_SOGGETTI,SOG_ANTICORPI));
set_row(3,"@102g@S", FLD(LF_SOGGETTI,SOG_CMV));
set_row(4,"");
}
break;
}
}
@ -297,7 +370,7 @@ bool TStampaScadenze::filter_func_scadenze(const TRelation* rel)
bool TStampaScadenze::preprocess_page(int file, int counter)
{
if (_tipostampa==elenco)
if (_tipostampa==elenco || _tipostampa== completo)
{
TRectype& recsog = current_cursor()->curr();
const TString16 codsez = recsog.get(SOG_CODSEZ);
@ -305,19 +378,41 @@ bool TStampaScadenze::preprocess_page(int file, int counter)
TString80 nome = recsog.get(SOG_COGNOME);
nome << " ";
nome << recsog.get(SOG_NOME);
nome << " ";
nome << recsog.get(SOG_COGNOME_SP);
_cognome_nome = nome;
TString256 localita = "";
localita << current_cursor()->curr(-ALIAS_LCPDOM).get("S6");
if (localita.not_empty() && localita.ok())
{
localita << " ";
localita << current_cursor()->curr(-ALIAS_LCPDOM).get("S0");
localita << " - ";
}
else
{
localita = current_cursor()->curr(LF_COMUNI).get(COM_CAPCOM);
localita << " ";
}
localita << current_cursor()->curr(LF_COMUNI).get(COM_DENCOM);
localita.trim();
_dencom = localita;
// salto pagina se cambio sezione
if ((_codsez!=codsez)||(_codsot!=codsot))
{
if (_codsez != "**")
printer().formfeed();
footer_sezione();
_codsez = codsez;
_codsot = codsot;
header_sezione(codsez, codsot);
_contatore = 0;
}
else
if (printer().rows_left() < 4)
else
if ((printer().rows_left()<4 && _tipostampa==elenco) || (printer().rows_left()<3 && _tipostampa==completo))
printer().formfeed();
_contatore++;
_totfinestampa++;
}
if (_tipostampa==etichette)
if (printer().rows_left() < _form_eti->get_body().height())
@ -346,6 +441,20 @@ void TStampaScadenze::header_sezione(const TString16 codsez, const TString16 cod
return;
}
void TStampaScadenze::footer_sezione()
{
// stampa totale soggetti a fine pagina
reset_footer();
TString sep(80);
sep.fill('-');
set_footer(1, (const char *) sep);
set_footer(2,"SOGGETTI IN SCADENZA PER SEZIONE %d", _contatore);
printer().formfeed();
reset_footer();
}
void TStampaScadenze::dati_sezione(const TString16 codsez, const TString16 codsot)
{
_intest1 = current_cursor()->curr(LF_SEZIONI).get(SEZ_INTESTAZ1);
@ -379,6 +488,9 @@ bool TStampaScadenze::set_print(int m)
case F_ELENCO:
_tipostampa = elenco;
break;
case F_COMPLETO:
_tipostampa = completo;
break;
case F_ETICHETTE:
_tipostampa = etichette;
break;
@ -419,7 +531,8 @@ bool TStampaScadenze::set_print(int m)
_giorni[6] = 'X';
// filtro per sezioni selezionati
filtra_sezioni();
// filtro per categorie
// filtro per categorie
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);
@ -445,6 +558,8 @@ bool TStampaScadenze::set_print(int m)
current_cursor()->setfilter("((TCS->S6 == \"I\" ) || (TCS->S6 == \"F\")) && (ESCLUSO == \"\")", TRUE);
// filtro per categorie e altro
current_cursor()->set_filterfunction(filter_func_scadenze);
_contatore = 0;
_totfinestampa = 0;
reset_print();
crea_intestazione();
return TRUE;
@ -456,7 +571,7 @@ bool TStampaScadenze::set_print(int m)
void TStampaScadenze::crea_intestazione()
{
reset_header();
if (_tipostampa == elenco)
if (_tipostampa == elenco || _tipostampa == completo)
{
TString sep(132);
sep = "SCADENZE DI DONAZIONE ";
@ -474,6 +589,26 @@ void TStampaScadenze::crea_intestazione()
sep << " al ";
sep << data.string();
}
if (_ab01.not_empty())
{
sep << " Gruppi ";
sep << _ab01;
}
if (_ab02.not_empty())
{
sep << ", ";
sep << _ab02;
}
if (_ab03.not_empty())
{
sep << ", ";
sep << _ab03;
}
if (_rh.not_empty())
{
sep << " - Rh ";
sep << _rh;
}
sep.center_just();
set_header(2, "@0g%s", (const char*) sep);
TString16 data_stampa = _data_stampa.string();
@ -484,9 +619,20 @@ void TStampaScadenze::crea_intestazione()
sep = "";
sep.fill('-');
set_header(3, (const char *) sep);
set_header(5,"@0gCod.@10gC.@13gCognome@39gNato il@50gData pr.SI@61gData pr.AF@72gData/Tipo@83gData/Tipo@94gIdon.@100gAB0");
set_header(6,"@13gNome@50gInterv. SI@61gInterv. AF@72gult. don.@83gult. idon.@94gper@100gRh");
set_header(7,"@0g---------@10g--@13g-------------------------@39g----------@50g----------@61g----------@72g----------@83g----------@94g-----");
if (_tipostampa == elenco)
{
set_header(5,"@0gCod.@10gC.@13gCognome@39gNato il@50gData pr.SI@61gData pr.AF@72gData/Tipo@83gData/Tipo@94gIdon.@100gAB0");
set_header(6,"@13gNome@50gInterv. SI@61gInterv. AF@72gult. don.@83gult. idon.@94gper@100gRh");
set_header(7,"@0g---------@10g--@13g-------------------------@39g----------@50g----------@61g----------@72g----------@83g----------@94g-----");
}
if (_tipostampa == completo)
{
set_header(5,"@0gCod.@10gCognome e Nome@36gIndirizzo@62gTelefoni@77gData pr.SI@88gData ult.SI@99g Ult.idon.");
set_header(6,"@10gData nasc.@77gData pr.AF@88gData ult.AF");
set_header(7,"@77gGr. Rh. Fen. Kell Du A CMV");
set_header(8,"");
}
printer().footerlen(3);
}
}
@ -494,8 +640,8 @@ bool TStampaScadenze::user_create()
{
_rel = new TRelation(LF_SOGGETTI);
_rel->add("TCS", "CODTAB==STATO",1,0,ALIAS_TCS);
_rel->add("LCP", "CODTAB==DOM_CODLOC",1,0,ALIAS_LCP);
_rel->add(LF_COMUNI, "COM==DOM_CODCOM");
_rel->add("LCP", "CODTAB==DOM_CODLOC",1,0,ALIAS_LCPDOM);
_rel->add(LF_COMUNI, "COM==DOM_CODCOM",1,0,ALIAS_COMDOM);
_rel->add(LF_SEZIONI, "CODSEZ==CODSEZ|CODSOT==CODSOT");
add_cursor(new TCursor(_rel, "", 3));
_msk = new TMask("at4100a");

View File

@ -43,5 +43,6 @@
#define F_RHANTID 318
#define F_ELENCO 401
#define F_ETICHETTE 402
#define F_CARTOLINE 403
#define F_COMPLETO 402
#define F_ETICHETTE 403
#define F_CARTOLINE 404

View File

@ -366,25 +366,31 @@ END
BUTTON F_ELENCO 9 2
BEGIN
PROMPT -14 18 "Elenco"
PROMPT -15 18 "Elenco"
MESSAGE EXIT,F_ELENCO
END
BUTTON F_COMPLETO 9 2
BEGIN
PROMPT -25 18 "Completo"
MESSAGE EXIT,F_COMPLETO
END
BUTTON F_ETICHETTE 9 2
BEGIN
PROMPT -24 18 "Etichette"
PROMPT -35 18 "Etichette"
MESSAGE EXIT,F_ETICHETTE
END
BUTTON F_CARTOLINE 9 2
BEGIN
PROMPT -34 18 "Cartoline"
PROMPT -45 18 "Cartoline"
MESSAGE EXIT,F_CARTOLINE
END
BUTTON DLG_QUIT 9 2
BEGIN
PROMPT -44 18 ""
PROMPT -55 18 ""
END
ENDPAGE

View File

@ -303,6 +303,7 @@ bool TStampaUrgenze::set_print(int)
add_file(LF_SOGGETTI);
filtra_sezioni();
// filtro per categorie
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

View File

@ -189,6 +189,7 @@ void TConvocazioniPerSezione::set_page(int file, int cnt)
set_row(1,"@59g@S", FLD(LF_SOGGETTI,SOG_TIPOULTDON));
set_row(1,"@62g@ld", FLD(LF_RCONVOC,RCV_DATACONV));
set_row(1,"@73g@S", FLD(LF_RCONVOC,RCV_CHIAMATA));
set_row(1,"@75g@S", FLD(LF_CONVOC,COV_DATA));
}
break;
}
@ -317,8 +318,8 @@ bool TConvocazioniPerSezione::set_print(int m)
_datafin = _msk->get(F_DATAFIN);
_punto = _msk->get(F_PUNTO);
_tipo = _msk->get(F_TIPO);
_codsez = _msk->get(F_CODSEZ);
_codsot = _msk->get(F_CODSOT);
_sezione = _msk->get(F_CODSEZ);
_sottog = _msk->get(F_CODSOT);
_aggiorna = _msk->get_bool(F_AGGIORNA);
_ordina = _msk->get(F_ORDINA);
TString256 chiave = "";

View File

@ -178,6 +178,7 @@ bool TStampaTessere::set_print(int m)
//const char* filtro = format("T_STAMPATA!=\"X\"");
//const char* filtro = format("TOTDON>=%i",_numdon);
//current_cursor()->setfilter(filtro);
_categorie.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);

View File

@ -3,7 +3,7 @@
#include "at6.h"
#define usage "Error - usage : %s -[0|1|2|3|4|5|6]"
#define usage "Error - usage : %s -[0|1|2|3|4]"
int main(int argc, char** argv)
{
@ -22,10 +22,6 @@ int main(int argc, char** argv)
rt = at6400(argc, argv); break;
case 4:
rt = at6500(argc, argv); break;
case 5:
rt = at6600(argc, argv); break;
case 6:
rt = at6700(argc, argv); break;
default:
error_box(usage, argv[0]) ; rt = 1; break;
}

View File

@ -6,7 +6,5 @@ int at6200(int argc, char* argv[]); // stampa tabella sezioni/sottogruppi
int at6300(int argc, char* argv[]); // stampa di controllo donazioni
int at6400(int argc, char* argv[]); // stampa di controllo soggetti incompleti
int at6500(int argc, char* argv[]); // stampa di controllo controlli sanitari
int at6600(int argc, char* argv[]); // riepilogo mensile donazioni
int at6700(int argc, char* argv[]); // riepilogo giornaliero donazioni
#endif // __AT6_H

View File

@ -11,36 +11,20 @@ MENU TASK_MENUBAR
/* at6 -1 stampa archivio sezioni */
MENUBAR MENU_BAR(1)
MENU MENU_BAR(1)
SUBMENU MENU_FILE "~File"
/* at6 -2 stampa di controllo donazioni */
MENUBAR MENU_BAR(2)
MENU MENU_BAR(2)
SUBMENU MENU_FILE "~File"
/* at6 -3 stampa soggetti incompleti */
MENUBAR MENU_BAR(3)
MENU MENU_BAR(3)
SUBMENU MENU_FILE "~File"
/* at6 -4 stampa di controllo controlli sanitari */
MENUBAR MENU_BAR(4)
MENU MENU_BAR(4)
SUBMENU MENU_FILE "~File"
/* at6 -5 riepilogo mensile donazioni */
MENUBAR MENU_BAR(5)
MENU MENU_BAR(5)
SUBMENU MENU_FILE "~File"
/* at6 -6 riepilogo giornaliero donazioni */
MENUBAR MENU_BAR(6)
MENU MENU_BAR(6)
SUBMENU MENU_FILE "~File"

View File

@ -25,7 +25,7 @@ class TControlloDonazioni : public TPrintapp
TString16 _tipodon, _luogodon, _luogoold, _sezold;
TString16 _sezini, _sotini, _tipostampa,_ordinamento;
TString16 _controllo;
bool _stampa80, _primedon;
bool _stampa80, _primedon, _breve;
TParagraph_string _cognome_nome;
protected:
@ -49,42 +49,58 @@ HIDDEN inline TControlloDonazioni& app() { return (TControlloDonazioni&) main_ap
void TControlloDonazioni::set_page(int file, int cnt)
{
if (_stampa80)
if (_breve)
{
set_row(1,"@0g#D", &_contatore);
set_row(1,"@6g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########"));
set_row(1,"@16g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(2,"@16g@8,rs", FLD(LF_SOGGETTI,SOG_TESSAVIS));
set_row(1,"@0g@ld", FLD(LF_DONAZ,DON_DATADON));
set_row(1,"@11g@S", FLD(LF_DONAZ, DON_LUOGODON));
set_row(1,"@20g@S", FLD(LF_DONAZ,DON_TIPODON));
set_row(1,"@25g#a", &_cognome_nome);
set_row(2,"@25g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@61g@S", FLD(LF_SOGGETTI,SOG_CODSEZ));
set_row(2,"@64g@S", FLD(LF_SOGGETTI,SOG_CODSOT));
set_row(1,"@64g@ld", FLD(LF_DONAZ,DON_DATADON));
set_row(2,"@64g@S", FLD(LF_DONAZ,DON_TIPODON));
//set_row(1,"@104g@S", FLD(LF_DONAZ, DON_LUOGODON));
set_row(1,"@75g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0));
set_row(2,"@75g@S", FLD(LF_SOGGETTI, SOG_RHANTID));
set_row(1,"@79g#t", &_controllo);
set_row(1,"@76g@S", FLD(LF_SOGGETTI,SOG_CODSEZ));
set_row(1,"@79g@S", FLD(LF_SOGGETTI,SOG_CODSOT));
set_row(1,"@82g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0));
set_row(1,"@87g@S", FLD(LF_SOGGETTI, SOG_RHANTID));
set_row(1,"@91g@S", FLD(LF_SOGGETTI, SOG_FENOTIPORH));
set_row(1,"@98g@S", FLD(LF_SOGGETTI, SOG_KELL));
set_row(1,"@102g@S", FLD(LF_SOGGETTI, SOG_DU));
set_row(1,"@106g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########"));
}
else
{
set_row(1,"@0g#D", &_contatore);
set_row(1,"@7g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########"));
set_row(1,"@17g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(1,"@26g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS));
set_row(1,"@34g#a", &_cognome_nome);
set_row(1,"@70g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@81g@S", FLD(LF_SOGGETTI,SOG_CODSEZ));
set_row(1,"@84g@S", FLD(LF_SOGGETTI,SOG_CODSOT));
set_row(1,"@87g@ld", FLD(LF_DONAZ,DON_DATADON));
set_row(1,"@98g@S", FLD(LF_DONAZ,DON_TIPODON));
set_row(1,"@104g@S", FLD(LF_DONAZ, DON_LUOGODON));
set_row(1,"@110g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0));
set_row(1,"@114g@S", FLD(LF_SOGGETTI, SOG_RHANTID));
set_row(1,"@118g@S", FLD(LF_SOGGETTI, SOG_FENOTIPORH));
set_row(1,"@125g@S", FLD(LF_SOGGETTI, SOG_KELL));
set_row(1,"@129g@S", FLD(LF_SOGGETTI, SOG_DU));
}
if (_stampa80)
{
set_row(1,"@0g#D", &_contatore);
set_row(1,"@6g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########"));
set_row(1,"@16g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(2,"@16g@8,rs", FLD(LF_SOGGETTI,SOG_TESSAVIS));
set_row(1,"@25g#a", &_cognome_nome);
set_row(2,"@25g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@61g@S", FLD(LF_SOGGETTI,SOG_CODSEZ));
set_row(2,"@64g@S", FLD(LF_SOGGETTI,SOG_CODSOT));
set_row(1,"@64g@ld", FLD(LF_DONAZ,DON_DATADON));
set_row(2,"@64g@S", FLD(LF_DONAZ,DON_TIPODON));
//set_row(1,"@104g@S", FLD(LF_DONAZ, DON_LUOGODON));
set_row(1,"@75g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0));
set_row(2,"@75g@S", FLD(LF_SOGGETTI, SOG_RHANTID));
set_row(1,"@79g#t", &_controllo);
}
else
{
set_row(1,"@0g#D", &_contatore);
set_row(1,"@7g@pn", FLD(LF_DONAZ,DON_ETICHETTA,"#########"));
set_row(1,"@17g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(1,"@26g@S", FLD(LF_SOGGETTI,SOG_TESSAVIS));
set_row(1,"@34g#a", &_cognome_nome);
set_row(1,"@70g@ld", FLD(LF_SOGGETTI,SOG_DATANASC));
set_row(1,"@81g@S", FLD(LF_SOGGETTI,SOG_CODSEZ));
set_row(1,"@84g@S", FLD(LF_SOGGETTI,SOG_CODSOT));
set_row(1,"@87g@ld", FLD(LF_DONAZ,DON_DATADON));
set_row(1,"@98g@S", FLD(LF_DONAZ,DON_TIPODON));
set_row(1,"@104g@S", FLD(LF_DONAZ, DON_LUOGODON));
set_row(1,"@110g@S", FLD(LF_SOGGETTI, SOG_GRUPPOAB0));
set_row(1,"@114g@S", FLD(LF_SOGGETTI, SOG_RHANTID));
set_row(1,"@118g@S", FLD(LF_SOGGETTI, SOG_FENOTIPORH));
set_row(1,"@125g@S", FLD(LF_SOGGETTI, SOG_KELL));
set_row(1,"@129g@S", FLD(LF_SOGGETTI, SOG_DU));
}
}
bool TControlloDonazioni::preprocess_page(int file, int counter)
@ -163,7 +179,7 @@ print_action TControlloDonazioni::postprocess_print(int file, int counter)
{
if (_contatore > 0)
footer_stampa();
if (_totfinestampa > 0)
if (_totfinestampa > 0 && _contatore != _totfinestampa)
fine_stampa();
return NEXT_PAGE;
}
@ -272,7 +288,9 @@ bool TControlloDonazioni::set_print(int m)
_tipodon = _msk->get(F_TIPODON);
_luogodon = _msk->get(F_LUOGODON);
_primedon = _msk->get_bool(F_PRIMEDON);
_breve = _msk->get_bool(F_BREVE);
if (_breve)
_cognome_nome.set_width(50);
_tipostampa = _msk->get(F_TIPOSTAMPA);
_ordinamento = _msk->get(F_ORDINAMENTO);
TString80 chiave = "";
@ -422,17 +440,23 @@ void TControlloDonazioni::crea_intestazione()
else
sep.center_just(132);
set_header(2,"@0g%s", (const char*) sep);
if (_stampa80)
{
set_header(3,"@0gProg.@6gEt.sacca@16gCodice@25gCognome e nome@61gSe@64gData don.@75gGr.");
set_header(4,"@16gTessera@25gData nascita@61gSo@64gTipo don.@75gRh");
set_header(5,"@0g-----@6g---------@16g--------@25g-----------------------------------@61g--@64g----------@75g---");
if (_breve)
{
set_header(3,"@0gData@11gPunto@20gTipo@25gCognome e nome@76gSe/So@82gAB0 Rh/A Fen.Rh Kell Du@106gEtichetta");
set_header(4,"@0g----------@11g-----@20g----@25g--------------------------------------------------@76g-----@82g--- ---- ------ ---- --@106g---------");
}
else
{
set_header(3,"@0gProg.@7gEt.sacca@17gCodice@26gTessera@34gCognome e nome@70gNato il@81gSe/So@87gData don.@98gTipo@104gLuogo@110gGr.@114gRh@118gFen.Rh@125gKellDu");
set_header(4,"@0g------@7g---------@17g--------@26g-------@34g-----------------------------------@70g----------@81g-----@87g----------@98g----@104g-----@110g---@114g---@118g------@125g--- ---");
}
else
if (_stampa80)
{
set_header(3,"@0gProg.@6gEt.sacca@16gCodice@25gCognome e nome@61gSe@64gData don.@75gGr.");
set_header(4,"@16gTessera@25gData nascita@61gSo@64gTipo don.@75gRh");
set_header(5,"@0g-----@6g---------@16g--------@25g-----------------------------------@61g--@64g----------@75g---");
}
else
{
set_header(3,"@0gProg.@7gEt.sacca@17gCodice@26gTessera@34gCognome e nome@70gNato il@81gSe/So@87gData don.@98gTipo@104gLuogo@110gGr.@114gRh@118gFen.Rh@125gKellDu");
set_header(4,"@0g------@7g---------@17g--------@26g-------@34g-----------------------------------@70g----------@81g-----@87g----------@98g----@104g-----@110g---@114g---@118g------@125g--- ---");
}
printer().footerlen(3);
}

View File

@ -14,7 +14,8 @@
#define F_TIPODON 111
#define F_LUOGODON 112
#define F_PRIMEDON 113
#define F_TIPOSTAMPA 114
#define F_ORDINAMENTO 115
#define F_BREVE 114
#define F_TIPOSTAMPA 115
#define F_ORDINAMENTO 116
#define F_D_TIPODON 201
#define F_D_LUOGODON 202

View File

@ -177,6 +177,11 @@ BEGIN
PROMPT 2 9 "Stampa solo prime donazioni"
END
BOOLEAN F_BREVE
BEGIN
PROMPT 36 9 "Formato di stampa breve"
END
RADIOBUTTON F_TIPOSTAMPA 25
BEGIN
PROMPT 1 11 "Stampa per "

View File

@ -229,6 +229,7 @@ bool TStampaIncompleti::set_print(int m)
reset_files();
add_file(LF_SOGGETTI);
filtra_sezioni();
_catdon.destroy();
const TString16 catpri = _msk->get(F_CAT1);
const TString16 catsec = _msk->get(F_CAT2);
const TString16 catter = _msk->get(F_CAT3);
@ -247,6 +248,7 @@ bool TStampaIncompleti::set_print(int m)
_catdon.add((const char*) catqui);
if (catses.not_empty() && catses.ok())
_catdon.add((const char*) catses);
_catnondon.destroy();
const TString16 catnpri = _msk->get(F_CATN1);
const TString16 catnsec = _msk->get(F_CATN2);
const TString16 catnter = _msk->get(F_CATN3);

View File

@ -1,28 +1,28 @@
#include <mask.h>
#include <printapp.h>
#include <recarray.h>
#include <tabutil.h>
#include <recarray.h>
#include <utility.h>
#include <lffiles.h>
#include "at7.h"
#include "atlib.h"
// nomi dei campi
#include "soggetti.h"
#include "contsan.h"
#include "idoneita.h"
class TFS_NoData_app : public TPrintapp
class TBologna90 : public TPrintapp
{
TMask* _msk;
TRelation* _rel;
int _cur;
TLocalisamfile* _soggetti;
TLocalisamfile* _contsan;
TRecord_array* _scontrolli;
TString16 _sospensione, _finesospensione;
int _cur;
TLocalisamfile* _contsan;
TRecord_array* _scontrolli;
TLocalisamfile* _idoneita;
TRecord_array* _sidoneita;
protected:
virtual bool user_create();
virtual bool user_destroy();
@ -31,94 +31,122 @@ protected:
virtual bool preprocess_page(int file, int counter);
public:
TFS_NoData_app() {}
TBologna90() {}
};
HIDDEN inline TFS_NoData_app& app() { return (TFS_NoData_app&) main_app(); }
HIDDEN inline TBologna90& app() { return (TBologna90&) main_app(); }
bool TFS_NoData_app::preprocess_page(int file, int counter)
bool TBologna90::preprocess_page(int file, int counter)
{
bool rew = FALSE;
bool rewrite = FALSE;
TRectype& recsog = current_cursor()->curr();
const long codice = recsog.get_long(SOG_CODICE);
TRectype* key = new TRectype(LF_CONTSAN);
key->put(CON_CODICE, codice);
int err = _scontrolli->read(key);
if (err == NOERR)
{
const int numrighe = _scontrolli->rows();
if (numrighe > 0)
{
const TRectype& riga = _scontrolli->row(numrighe);
const TString16 tipocon = riga.get(CON_TIPOCON);
const TString16 prosstipo = riga.get(CON_PROSSTIPO);
const TDate prossdata = riga.get(CON_PROSSDATA);
const TDate datanulla(NULLDATE);
if ((tipocon == _sospensione) && (prosstipo == _finesospensione) && (prossdata != datanulla))
{
TString16 statopross = recsog.get(SOG_PROS_STATO);
TDate datapross = recsog.get(SOG_DATA_PROS);
if (statopross.empty() && datapross == datanulla)
const int intaf = recsog.get_int(SOG_INTAF);
if (intaf != 0 && intaf != 45)
{
recsog.put(SOG_INTAF, 45);
const long codice = recsog.get_long(SOG_CODICE);
TRectype* keyc = new TRectype(LF_CONTSAN);
keyc->put(CON_CODICE, codice);
int err = _scontrolli->read(keyc);
TRectype* keyi = new TRectype(LF_IDONEITA);
keyi->put(IDO_CODICE, codice);
int erri = _sidoneita->read(keyi);
if ((err == NOERR || erri == NOERR) && (_scontrolli->rows() > 0 || _sidoneita->rows() > 0))
{
for (int c=1; c<=_scontrolli->rows(); c++)
{
TRectype& riga = _scontrolli->row(c, TRUE);
int intaf = riga.get_int(CON_INTAF);
if (intaf != 0 && intaf != 45)
riga.put(CON_INTAF, 45);
}
for (int r=1; r<=_sidoneita->rows(); r++)
{
TRectype& riga = _sidoneita->row(r, TRUE);
const TString16 tipoido = riga.get(IDO_TIPOIDO);
if (tipoido == "AF")
{
recsog.put(SOG_PROS_STATO, prosstipo);
recsog.put(SOG_DATA_PROS, prossdata);
current_cursor()->file().rewrite();
rew = TRUE;
}
}
}
}
return rew;
int intaf = riga.get_int(IDO_INTERVALLO);
if (intaf != 0 && intaf != 45)
riga.put(CON_INTAF, 45);
}
}
_scontrolli->rewrite();
_sidoneita->rewrite();
con_reord(recsog,_scontrolli, _sidoneita);
//ido_reord(recsog,_sidoneita);
rewrite = TRUE;
}
}
if (rewrite)
current_cursor()->file().rewrite();
return rewrite;
}
void TFS_NoData_app::set_page(int file, int cnt)
void TBologna90::set_page(int file, int cnt)
{
set_row(1,"@0g@pn", FLD(LF_SOGGETTI,SOG_CODICE,"########"));
set_row(1,"@10g@S", FLD(LF_SOGGETTI,SOG_COGNOME));
set_row(1,"@36g@S", FLD(LF_SOGGETTI,SOG_NOME));
//set_row(1,"@10g@S", FLD(LF_SOGGETTI,SOG_COGNOME));
//set_row(1,"@36g@S", FLD(LF_SOGGETTI,SOG_NOME));
}
bool TFS_NoData_app::set_print(int)
bool TBologna90::set_print(int)
{
KEY tasto;
tasto = _msk->run();
if (tasto == K_ENTER)
{
reset_files();
/*
TRectype da(LF_SOGGETTI);
TRectype a(LF_SOGGETTI);
const long codini = _msk->get_long(F_CODINI);
const long codfin = _msk->get_long(F_CODFIN);
da.zero();
a.zero();
if (codini != 0)
da.put(SOG_CODICE, codini);
if (codfin != 0)
a.put(SOG_CODICE, codfin);
current_cursor()->setregion(da,a);
*/
//current_cursor()->setfilter(format("STATO == \"RF\""));
reset_files();
add_file(LF_SOGGETTI);
reset_print();
_sospensione = "SO";
_finesospensione = "FS";
current_cursor()->setfilter(format("STATO == \"%s\"",(const char*)_sospensione));
return TRUE;
}
else
return FALSE;
}
bool TFS_NoData_app::user_create()
bool TBologna90::user_create()
{
_msk = new TMask("at7300a");
_rel = new TRelation(LF_SOGGETTI);
_contsan = new TLocalisamfile(LF_CONTSAN);
_scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON);
_contsan = new TLocalisamfile(LF_CONTSAN);
_scontrolli = new TRecord_array(LF_CONTSAN,CON_PROGCON);
_idoneita = new TLocalisamfile(LF_IDONEITA);
_sidoneita = new TRecord_array(LF_IDONEITA,IDO_PROGIDO);
_cur = add_cursor(new TCursor(_rel, "", 1));
long items = _rel->lfile().items();
return TRUE;
}
bool TFS_NoData_app::user_destroy()
bool TBologna90::user_destroy()
{
delete _rel;
delete _msk;
delete _contsan;
delete _rel;
delete _scontrolli;
delete _contsan;
delete _sidoneita;
delete _idoneita;
return TRUE;
}
int at7300(int argc, char* argv[])
{
TFS_NoData_app a;
a.run(argc, argv, "Correzione stato e data prossimo stato");
TBologna90 a;
a.run(argc, argv, "Bologna: intaf = 90");
return 0;
}

View File

@ -1,5 +1,4 @@
PAGE "Stampa SO senza data FS" -1 -1 78 20
PAGE "Bologna AF 90->45" -1 -1 78 20
BUTTON DLG_OK 9 2
BEGIN
PROMPT -12 14 ""

View File

@ -35,7 +35,7 @@ BEGIN
GRID ""
END
SECTION BODY ODD 60
SECTION BODY ODD 30
STRINGA 1 50
BEGIN

View File

@ -5,6 +5,7 @@ bool is_idon_one(TString16 idon, const char* tipo);
bool is_idon(TString16 id1, TString16 id2, TString16 id3, TString16 id4, const char* tipo);
bool is_donaz(TString16 don, const char* tipo);
char modstato_tcs(TString16 tipo);
void con_reord(TRectype& soggetto, TRecord_array* controlli);
void con_reord(TRectype& soggetto, TRecord_array* controlli, TRecord_array* idoneita);
void ido_reord(TRectype& soggetto, TRecord_array* idoneita);
void don_datepross(TRectype& soggetto);
void calcola_donazioni_lib(TRectype& soggetto, TRecord_array* donazioni);

View File

@ -4,6 +4,7 @@
#include "soggetti.h"
#include "contsan.h"
#include "donaz.h"
#include "idoneita.h"
#define IDON_SI "SI"
@ -62,37 +63,31 @@ char modstato_tcs(TString16 tipo)
return modstato;
}
void con_reord(TRectype& soggetto, TRecord_array* controlli)
{
TDate data, prossdata;
TString16 tipo, prosstipo;
void con_reord(TRectype& soggetto, TRecord_array* controlli, TRecord_array* idoneita)
{
const TDate datanulla(NULLDATE);
TDate data(NULLDATE);
TDate prossdata(NULLDATE);
TString16 tipo = " ";
TString16 prosstipo = " ";
char modstato = ' ';
int r_modifica = -1; // eventuale ultima riga di modifica id.
int r_ultid = -1; // riga ultima idoneità
int r_ultstato = -1; // riga ultimo stato valido
int r_ultid = -1; // riga ultima idoneità
int r_ultstato = -1; // riga ultimo stato valido
char penultstato = ' '; // penultimo stato valido
char ultstato = ' '; // ultimo stato valido
TDate dataultstato(NULLDATE); // data ultimo stato valido
for (int r=controlli->rows(); r>=1; r--)
for (int r=controlli->rows(); r>0; r--)
{
const TRectype& row = controlli->row(r);
tipo = row.get(CON_TIPOCON);
modstato = modstato_tcs(tipo);
if (modstato == 'M')
{
if (r_modifica == -1)
r_modifica = r;
}
else
{
if ((modstato != ' ') && (r_ultstato == -1))
if ((modstato != 'N') && (r_ultstato == -1))
r_ultstato = r;
else if ((modstato != ' ') && (penultstato == ' '))
else if ((modstato != 'N') && (penultstato == ' '))
penultstato = modstato;
if ((modstato == 'I') && (r_ultid == -1))
r_ultid = r;
}
}
TString16 id1 = ' ';
TString16 id2 = ' ';
@ -116,16 +111,6 @@ void con_reord(TRectype& soggetto, TRecord_array* controlli)
id4 = row.get(CON_IDON4);
intsi = row.get_int(CON_INTSI);
intaf = row.get_int(CON_INTAF);
if (r_modifica > r_ultid)
{
const TRectype& rowm = controlli->row(r_modifica);
id1 = rowm.get(CON_IDON1);
id2 = rowm.get(CON_IDON2);
id3 = rowm.get(CON_IDON3);
id4 = rowm.get(CON_IDON4);
intsi = rowm.get_int(CON_INTSI);
intaf = rowm.get_int(CON_INTAF);
}
}
soggetto.put(SOG_DATAULTID,data);
soggetto.put(SOG_TIPOULTID,tipo);
@ -133,13 +118,10 @@ void con_reord(TRectype& soggetto, TRecord_array* controlli)
soggetto.put(SOG_IDON2,id2);
soggetto.put(SOG_IDON3,id3);
soggetto.put(SOG_IDON4,id4);
const int intsisog = soggetto.get_int(SOG_INTSI);
if (intsi > 0 || intsisog == 0)
if (intsi > 0)
soggetto.put(SOG_INTSI,intsi);
const int intafsog = soggetto.get_int(SOG_INTAF);
if (intaf > 0 || intafsog == 0)
if (intaf > 0)
soggetto.put(SOG_INTAF,intaf);
tipo = ' ';
if (r_ultstato != -1)
{
@ -154,100 +136,124 @@ void con_reord(TRectype& soggetto, TRecord_array* controlli)
soggetto.put(SOG_DATASTATO,dataultstato);
soggetto.put(SOG_PROS_STATO,prosstipo);
soggetto.put(SOG_DATA_PROS,prossdata);
soggetto.put(SOG_STATOSI, " ");
soggetto.put(SOG_STATOAF, " ");
soggetto.put(SOG_DATASI, datanulla);
soggetto.put(SOG_DATAAF, datanulla);
soggetto.put(SOG_FINESOSSI, datanulla);
soggetto.put(SOG_FINESOSAF, datanulla);
// riordino le idoneita
for (int ri=1; ri<=idoneita->rows(); ri++)
{
const TRectype& row = idoneita->row(ri);
TDate dataido = row.get_date(IDO_DATAIDO);
TString16 tipoido = row.get(IDO_TIPOIDO);
TString16 ido_sos = row.get(IDO_IDO_SOS);
int intervallo = row.get_int(IDO_INTERVALLO);
TDate finesos = row.get_date(IDO_FINESOS);
if (tipoido == IDON_SI)
if ((intervallo != 0) && (intsi == 0))
soggetto.put(SOG_INTSI, intervallo);
if (tipoido == IDON_AF)
if ((intervallo != 0) && (intaf == 0))
soggetto.put(SOG_INTAF, intervallo);
if (dataido >= dataultstato)
{
if (tipoido == IDON_SI)
{
soggetto.put(SOG_DATASI,dataido);
soggetto.put(SOG_STATOSI,ido_sos);
soggetto.put(SOG_FINESOSSI,finesos);
if (intervallo != 0 && ido_sos == IDONEITA)
{
soggetto.put(SOG_INTSI,intervallo);
if (id1 != IDON_SI && id2 != IDON_SI && id3 != IDON_SI && id4 != IDON_SI)
if (id1.empty())
soggetto.put(SOG_IDON1,IDON_SI);
else
if (id2.empty())
soggetto.put(SOG_IDON2,IDON_SI);
else
if (id3.empty())
soggetto.put(SOG_IDON3,IDON_SI);
else
if (id4.empty())
soggetto.put(SOG_IDON4,IDON_SI);
}
}
if (tipoido == IDON_AF)
{
soggetto.put(SOG_DATAAF,dataido);
soggetto.put(SOG_STATOAF,ido_sos);
soggetto.put(SOG_FINESOSAF,finesos);
if (intervallo != 0 && ido_sos == IDONEITA)
{
soggetto.put(SOG_INTAF,intervallo);
}
}
}
}
/*
TTable tcs("TCS");
tcs.put("CODTAB",tipo);
if (tcs.read() == NOERR)
{
TString catcoll = tcs.get("S7");
if (catcoll.not_empty())
{
mask.set(F_CATDON,catcoll);
mask.field(F_CATDON).on_key(K_TAB);
}
}
*/
// verifico la concordanza di stato soggetto e stato idoneita
TString16 statosi = soggetto.get(SOG_STATOSI);
TString16 statoaf = soggetto.get(SOG_STATOAF);
TDate datastatosi = soggetto.get_date(SOG_DATASI);
TDate datastatoaf = soggetto.get_date(SOG_DATAAF);
if (statosi.not_empty() || statoaf.not_empty())
{
TString16 stato = soggetto.get(SOG_STATO);
char modstato = modstato_tcs(stato);
if ((statosi == IDONEITA || statosi.empty()) && (statoaf == IDONEITA || statoaf.empty()))
if ((modstato != 'I') || (modstato != 'F'))
stato = IDONEITA;
if ((statosi == SOSPENSIONE || statosi.empty()) && (statoaf == SOSPENSIONE || statoaf.empty()))
if (modstato != 'S')
stato = SOSPENSIONE;
char statocalcolato = modstato_tcs(stato);
if (modstato != statocalcolato)
{
soggetto.put(SOG_STATO, stato);
soggetto.put(SOG_PROS_STATO," ");
soggetto.put(SOG_DATA_PROS, datanulla);
if (statocalcolato == 'I')
{
TDate datacalcolata = NULLDATE;
if (statosi == IDONEITA)
datacalcolata = datastatosi;
if ((statoaf == IDONEITA) && (datastatoaf > datacalcolata))
datacalcolata = datastatoaf;
soggetto.put(SOG_DATASTATO,datacalcolata);
}
else
if (datastatoaf > datastatosi)
soggetto.put(SOG_DATASTATO,datastatoaf);
else
soggetto.put(SOG_DATASTATO,datastatosi);
}
}
don_datepross(soggetto);
if ((penultstato == 'S') && ((ultstato == 'I') || (ultstato == 'F')))
if (((penultstato == 'S') || (penultstato == 'I')) && ((ultstato == 'I') || (ultstato == 'F')))
{
data = soggetto.get_date(SOG_DATAPROSSI);
if (data < dataultstato && data.ok()) soggetto.put(SOG_DATAPROSSI,dataultstato);
data = soggetto.get_date(SOG_DATAPROSAF);
if (data < dataultstato && data.ok()) soggetto.put(SOG_DATAPROSAF,dataultstato);
}
if ((penultstato == '1') && (ultstato == 'F'))
{
data = soggetto.get_date(SOG_DATAPROSSI);
if (data < dataultstato) soggetto.put(SOG_DATAPROSSI,dataultstato);
}
if ((penultstato == '2') && (ultstato == 'F'))
{
data = soggetto.get_date(SOG_DATAPROSAF);
if (data < dataultstato) soggetto.put(SOG_DATAPROSAF,dataultstato);
}
}
void ido_reord(TRectype& soggetto, TRecord_array* idoneita)
{
TDate dataido, finesos;
TString16 tipoido, ido_sos;
int intervallo;
bool fattoSI = FALSE;
bool fattoAF = FALSE;
TString16 id1 = soggetto.get(SOG_IDON1);
TString16 id2 = soggetto.get(SOG_IDON2);
TString16 id3 = soggetto.get(SOG_IDON3);
TString16 id4 = soggetto.get(SOG_IDON4);
const TDate datastato = soggetto.get_date(SOG_DATASTATO);
for (int r=idoneita->rows(); r>=1; r--)
{
const TRectype& row = idoneita->row(r);
dataido = row.get_date(IDO_DATAIDO);
if (dataido >= datastato)
{
tipoido = row.get(IDO_TIPOIDO);
ido_sos = row.get(IDO_IDO_SOS);
intervallo = row.get_int(IDO_INTERVALLO);
finesos = row.get_date(IDO_FINESOS);
if (tipoido == IDON_SI && !fattoSI)
{
fattoSI = TRUE;
soggetto.put(SOG_DATASI,dataido);
soggetto.put(SOG_STATOSI,ido_sos);
soggetto.put(SOG_FINESOSSI,finesos);
if (intervallo != 0 && ido_sos == IDONEITA)
soggetto.put(SOG_INTSI,intervallo);
// sistemare le idoneita idon1,2,3,4
}
if (tipoido == IDON_AF && !fattoAF)
{
fattoAF = TRUE;
soggetto.put(SOG_DATAAF,dataido);
soggetto.put(SOG_STATOAF,ido_sos);
soggetto.put(SOG_FINESOSAF,finesos);
if (intervallo != 0 && ido_sos == IDONEITA)
soggetto.put(SOG_INTAF,intervallo);
// sistemare le idoneita idon1,2,3,4
}
}
}
if (fattoSI || fattoAF)
{
TDate datastato = soggetto.get_date(SOG_DATASTATO);
TDate datastatosi = soggetto.get_date(SOG_DATASI);
TDate datastatoaf = soggetto.get_date(SOG_DATAAF);
if (datastato < datastatosi || datastato < datastatoaf)
{
TString16 stato = soggetto.get(SOG_STATO);
TString16 statosi = soggetto.get(SOG_STATOSI);
TString16 statoaf = soggetto.get(SOG_STATOAF);
if (statosi == SOSPENSIONE && statoaf == SOSPENSIONE)
stato = SOSPENSIONE;
else
stato = IDONEITA;
soggetto.put(SOG_STATO,stato);
don_datepross(soggetto);
}
}
else
{
soggetto.put(SOG_STATOSI," ");
soggetto.put(SOG_DATASI,NULLDATE);
soggetto.put(SOG_FINESOSSI,NULLDATE);
soggetto.put(SOG_STATOAF," ");
soggetto.put(SOG_DATAAF,NULLDATE);
soggetto.put(SOG_FINESOSAF,NULLDATE);
don_datepross(soggetto);
}
}
}
void don_datepross(TRectype& soggetto)
@ -271,11 +277,11 @@ void don_datepross(TRectype& soggetto)
bool id_af = FALSE; // il soggetto è idoneo per af?
modstato = modstato_tcs(stato);
if (modstato == 'I' || modstato == 'F' || modstato == '1' || modstato == '2') // il soggetto è idoneo
if (modstato == 'I' || modstato == 'F') // il soggetto è idoneo
{
id_si = (is_idon(id1,id2,id3,id4,IDON_SI) && intsi != 0); // il soggetto è idoneo SI
id_af = (is_idon(id1,id2,id3,id4,IDON_AF) && intaf != 0); // il soggetto è idoneo AF
id_si = ((is_idon(id1,id2,id3,id4,IDON_SI) || (soggetto.get(SOG_STATOSI) == IDONEITA)) && (intsi != 0)); // il soggetto è idoneo SI
id_af = ((is_idon(id1,id2,id3,id4,IDON_AF) || (soggetto.get(SOG_STATOAF) == IDONEITA)) && (intaf != 0)); // il soggetto è idoneo AF
if (dataultdon.ok()) // se ha fatto almeno una donazione
{
if (is_donaz(tipoultdon,IDON_SI)) // se l'ultima donazione è una SI
@ -326,11 +332,79 @@ void don_datepross(TRectype& soggetto)
dataaf = soggetto.get_date(SOG_DATAULTID);
}
}
if (modstato == '1')
datasi = NULLDATE;
if (modstato == '2')
dataaf = NULLDATE;
TString16 statoparziale;
TDate datastatoparziale;
statoparziale = soggetto.get(SOG_STATOSI);
datastatoparziale = soggetto.get_date(SOG_DATASI);
if (statoparziale == SOSPENSIONE)
datasi = NULLDATE;
if (statoparziale == IDONEITA)
if (datastatoparziale > datasi)
datasi = datastatoparziale;
statoparziale = soggetto.get(SOG_STATOAF);
datastatoparziale = soggetto.get_date(SOG_DATAAF);
if (statoparziale == SOSPENSIONE)
dataaf = NULLDATE;
if (statoparziale == IDONEITA)
if (datastatoparziale > dataaf)
dataaf = datastatoparziale;
soggetto.put(SOG_DATAPROSSI,datasi);
soggetto.put(SOG_DATAPROSAF,dataaf);
}
void calcola_donazioni_lib(TRectype& soggetto, TRecord_array* donazioni)
{
TDate ultdata(NULLDATE);
TString16 ulttipo = ' ';
const int i = donazioni->rows();
const int donprecsi = soggetto.get_int(SOG_DONPRECSI);
const int donprecaf = soggetto.get_int(SOG_DONPRECAF);
if (i < 0) // non ha donazioni
{
int zerodon = 0;
soggetto.put(SOG_DATAULTDON,ultdata);
soggetto.put(SOG_DATAULTSI,ultdata);
soggetto.put(SOG_DATAULTAF,ultdata);
soggetto.put(SOG_TOTDONSI,donprecsi);
soggetto.put(SOG_TOTDONAF,donprecaf);
soggetto.put(SOG_TIPOULTDON,ulttipo);
}
else
{
const TRectype& row = donazioni->row(i);
ultdata = row.get_date(DON_DATADON);
ulttipo = row.get(DON_TIPODON);
soggetto.put(SOG_DATAULTDON,ultdata);
soggetto.put(SOG_TIPOULTDON,ulttipo);
TDate dataultsi(NULLDATE);
TDate dataultaf(NULLDATE);
int totdonsi = 0;
int totdonaf = 0;
for (int r=1; r<=donazioni->rows(); r++)
{
const TRectype& row = donazioni->row(r);
ultdata = row.get_date(DON_DATADON);
ulttipo = row.get(DON_TIPODON);
if (is_donaz(ulttipo,IDON_SI))
{
dataultsi = ultdata;
totdonsi++;
}
else
if (is_donaz(ulttipo,IDON_AF))
{
dataultaf = ultdata;
totdonaf++;
}
}
soggetto.put(SOG_DATAULTSI, dataultsi);
soggetto.put(SOG_TOTDONSI, totdonsi+donprecsi);
soggetto.put(SOG_DATAULTAF, dataultaf);
soggetto.put(SOG_TOTDONAF, totdonaf+donprecaf);
soggetto.put(SOG_TOTDON, totdonsi+donprecsi+totdonaf+donprecaf);
}
don_datepross(soggetto);
}

10
at/atopera.h Executable file
View File

@ -0,0 +1,10 @@
// definizione campi dell'archivio ATOPERA
#define OPE_PROGOPE "PROGOPE"
#define OPE_CODSEZ "CODSEZ"
#define OPE_CODSOT "CODSOT"
#define OPE_GRUPPOAZIE "GRUPPOAZIE"
#define OPE_DATA1 "DATA1"
#define OPE_DATA2 "DATA2"
#define OPE_FLAG1 "FLAG1"
#define OPE_UTENTE "UTENTE"

5
at/atropera.h Executable file
View File

@ -0,0 +1,5 @@
// definizione campi dell'archivio ATROPERA
#define ROP_PROGOPE "PROGOPE"
#define ROP_CODICE "CODICE"
#define ROP_S0 "S0"

View File

@ -8,4 +8,8 @@
#define ATS_GIORNO "GIORNO"
#define ATS_TIPODON "TIPODON"
#define ATS_NUMERO "NUMERO"
#define ATS_NUMPRIME "NUMPRIME"
#define ATS_NUMPRIME "NUMPRIME"
#define ATS_NUMERO2 "NUMERO2"
#define ATS_NUMPRIME2 "NUMPRIME2"
#define ATS_GRUPPO "GRUPPO"
#define ATS_RH "RH"

View File

@ -4,3 +4,6 @@ ITEM " |"
ITEM "NEG|NEG"
ITEM "POS|POS"
ITEM "DPO|++"
ITEM "KK|KK"
ITEM "Kk|Kk"
ITEM "kk|kk"

View File

@ -8,3 +8,9 @@ ITEM "POS|POS"
MESSAGE COPY,9@
ITEM "DPO|++"
MESSAGE COPY,9@
ITEM "KK|KK"
MESSAGE COPY,9@
ITEM "Kk|Kk"
MESSAGE COPY,9@
ITEM "kk|kk"
MESSAGE COPY,9@