diff --git a/at/at2700.cpp b/at/at2700.cpp index dc2ccce8f..1f58ba645 100755 --- a/at/at2700.cpp +++ b/at/at2700.cpp @@ -8,6 +8,7 @@ #include "soggetti.h" #include "benem.h" #include "donaz.h" +#include "famiglie.h" #include "sezioni.h" #include @@ -32,7 +33,7 @@ #define ALIAS_BNZ 600 // benemerenze #define ALIAS_GAZ 300 // gruppi aziendale -#define ETI_INDIRIZZO 4 // numero campo indirizzo in etichetta (deve essere sempre cosi') +#define ETI_COGNOME 3 // numero campo cognome e nome in etichetta (deve essere sempre cosi') per famiglie enum ts { undefined=0, sintetico=1, completo=2, schede=3, etichette=4, cartoline=5, personale=6 }; @@ -60,20 +61,23 @@ class TStampaPerCategorie : public TPrintapp TMask* _msk; TLocalisamfile* _benem; TLocalisamfile* _donaz; + TLocalisamfile* _famiglie; TRecord_array* _sbenemerenze; + TRecord_array* _sfamiglia; TEti_percat_form* _form_eti; TEti_percat_form* _form_car; TEti_percat_form* _form_sch; TEti_percat_form* _form_per; TAssoc_array _catdon; TAssoc_array _catnondon; + TAssoc_array _codfamiglie; TParagraph_string _cognome_nome, _dencom, _benemerenza; TString80 _rigastampa; TDate _data_stampa; ts _tipostampa; TString16 _lettini, _lettfin, _capini, _capfin; TString16 _gruppoazie, _gruppoold; - bool _pergruppo; + bool _pergruppo, _perfamiglie; int _contatore; TString16 _codsez, _codsot, _orario, _datacart; TString80 _invitoper, _data, _presso1, _presso2, _presso3, _presso4; @@ -257,7 +261,19 @@ void TStampaPerCategorie::set_page(int file, int cnt) { if (current_cursor()->pos()items()) { + bool avanza = TRUE; + while (avanza) + { + if (current_cursor()->pos()items()) + avanza = !(preprocess_page(file, cnt)); + else + avanza = FALSE; + if (avanza) + ++(*current_cursor()); + } force_setpage(TRUE); + TForm_item& cognome = corpo.find_field(ETI_COGNOME); + cognome.set(_cognome_nome); corpo.update(); for (word i = 0; i < corpo.height(); i++) { @@ -271,10 +287,16 @@ void TStampaPerCategorie::set_page(int file, int cnt) set_row(i+1,riga1); } if (r < _etcolonne) - { - ++(*current_cursor()); - if (current_cursor()->pos()items()) - preprocess_page(file, cnt); + { + bool avanza = TRUE; + while (avanza) + { + ++(*current_cursor()); + if (current_cursor()->pos()items()) + avanza = !(preprocess_page(file, cnt)); + else + avanza = FALSE; + } } } } @@ -612,6 +634,123 @@ bool TStampaPerCategorie::preprocess_page(int file, int counter) if (_tipostampa==etichette) if (printer().rows_left() < _form_eti->get_body().height()) printer().formfeed(); + + if (_perfamiglie) + { + TRectype& recfam = current_cursor()->curr(LF_FAMIGLIE); + const long codice = recsog.get_long(SOG_CODICE); + const long codsufam = recfam.get_long(FAM_CODFAM); + const int rigafamsog = recfam.get_int(FAM_PROGFAM); + if ( codsufam == codice) + { + TRectype key = TRectype(LF_FAMIGLIE); + key.put(FAM_FAMIGLIA, recfam.get_long(FAM_FAMIGLIA)); + const int err = _sfamiglia->read(key); + if (err == NOERR) + { + current_cursor()->save_status(); + // controllo se qualcuno che lo precede nella famiglia rientra + // nella selezione, in questo caso ho gia' stampato la famiglia + // che viene stampata quando incontro il primo componente che + // rientra nella famiglia + // se non l'ho ancora stampato, accodo tutti i nominativi + // della famiglia e stampo + bool dastampare=TRUE; + for (int r=1; r<=_sfamiglia->rows(); r++) + { + const TRectype& riga = _sfamiglia->row(r); + long codfam = riga.get_long(FAM_CODFAM); + if (!(codice == codfam)) + { + TLocalisamfile sog(LF_SOGGETTI); + sog.setkey(1); + sog.put(SOG_CODICE, codfam); + if (sog.read() == NOERR) + { + current_cursor()->curr().put(SOG_CODSEZ, sog.get(SOG_CODSEZ)); + current_cursor()->curr().put(SOG_CODSOT, sog.get(SOG_CODSOT)); + current_cursor()->curr().put(SOG_COGNOME, sog.get(SOG_COGNOME)); + current_cursor()->curr().put(SOG_NOME, sog.get(SOG_NOME)); + current_cursor()->curr().put(SOG_DATANASC, sog.get(SOG_DATANASC)); + if (current_cursor()->test() == NOERR) + if (r < rigafamsog) + dastampare = FALSE; + } + } + } + //current_cursor()->restore_status(); + if (dastampare) + { + TString256 cognome = ""; + for (int r=1; r<=_sfamiglia->rows(); r++) + { + const TRectype& riga = _sfamiglia->row(r); + long codfam = riga.get_long(FAM_CODFAM); + if (codice == codfam) + { + TLocalisamfile sog(LF_SOGGETTI); + sog.setkey(1); + sog.put(SOG_CODICE, codfam); + if (sog.read() == NOERR) + { + cognome << sog.get(SOG_COGNOME); + cognome << " "; + cognome << sog.get(SOG_NOME); + } + } + else + { + TLocalisamfile sog(LF_SOGGETTI); + sog.setkey(1); + sog.put(SOG_CODICE, codfam); + if (sog.read() == NOERR) + { + current_cursor()->curr().put(SOG_CODSEZ, sog.get(SOG_CODSEZ)); + current_cursor()->curr().put(SOG_CODSOT, sog.get(SOG_CODSOT)); + current_cursor()->curr().put(SOG_COGNOME, sog.get(SOG_COGNOME)); + current_cursor()->curr().put(SOG_NOME, sog.get(SOG_NOME)); + current_cursor()->curr().put(SOG_DATANASC, sog.get(SOG_DATANASC)); + if (current_cursor()->test() == NOERR) + { + //TLocalisamfile soggetti(LF_SOGGETTI); + //soggetti.setkey(1); + //soggetti.put(SOG_CODICE, codfam); + sog.put(SOG_CODICE, codfam); + if (sog.read() == NOERR) + { + cognome << ", "; + cognome << sog.get(SOG_COGNOME); + cognome << " "; + cognome << sog.get(SOG_NOME); + } + } + } + } + _cognome_nome = cognome; + } + } + current_cursor()->restore_status(); + if (!dastampare) + return FALSE; + } + } + else + { + TString80 cognome= ""; + cognome << recsog.get(SOG_COGNOME); + cognome << " "; + cognome << recsog.get(SOG_NOME); + _cognome_nome = cognome; + } + } + else + { + TString80 cognome= ""; + cognome << recsog.get(SOG_COGNOME); + cognome << " "; + cognome << recsog.get(SOG_NOME); + _cognome_nome = cognome; + } _contatore++; return TRUE; } @@ -648,12 +787,15 @@ bool TStampaPerCategorie::set_print(int m) { if (_tipostampa == cartoline) dati_cartolina(); + if (_tipostampa == etichette) + _cognome_nome.set_width(200); _codsez = "**"; _codsot = "**"; _gruppoold = "**"; _contatore = 0; TString80 chiave = ""; _pergruppo = _msk->get_bool(F_PERGRUPPO); + _perfamiglie = _msk->get_bool(F_PERFAMIGLIE); bool percap = _msk->get_bool(F_PERCAP); _capini = _msk->get(F_CAPINI); _capfin = _msk->get(F_CAPFIN); @@ -857,10 +999,11 @@ void TStampaPerCategorie::crea_intestazione() } bool TStampaPerCategorie::user_create() -{ +{ _rel = new TRelation(LF_SOGGETTI); _rel->add(LF_DONAZ, "CODICE==CODICE", 1); _rel->add(LF_BENEM, "CODICE==CODICE", 1); + _rel->add(LF_FAMIGLIE, "CODFAM==CODICE", 2); _rel->add(LF_SEZIONI, "CODSEZ==CODSEZ|CODSOT==CODSOT"); _rel->add("BNZ", "CODTAB==TIPOBEN", 1, LF_BENEM, ALIAS_BNZ); _rel->add("CTD", "CODTAB==CATDON",1,0,ALIAS_CTD); @@ -876,7 +1019,9 @@ bool TStampaPerCategorie::user_create() _rel->add(LF_MEDICI, "CODMED==CODMED"); _donaz = new TLocalisamfile(LF_DONAZ); _benem = new TLocalisamfile(LF_BENEM); + _famiglie = new TLocalisamfile(LF_FAMIGLIE); _sbenemerenze = new TRecord_array(LF_BENEM,BEN_PROGBEN); + _sfamiglia = new TRecord_array(LF_FAMIGLIE,FAM_PROGFAM); add_cursor(new TSorted_cursor(_rel,"SOG_CODSEZ|SOG_CODSOT","",3)); _msk = new TMask("at2700a"); @@ -904,7 +1049,9 @@ bool TStampaPerCategorie::user_destroy() delete _form_car; delete _form_eti; delete _msk; + delete _sfamiglia; delete _sbenemerenze; + delete _famiglie; delete _benem; delete _donaz; delete _rel; diff --git a/at/at2700a.h b/at/at2700a.h index 2bb886b9b..6c4575c37 100755 --- a/at/at2700a.h +++ b/at/at2700a.h @@ -45,6 +45,7 @@ #define F_LETTINI 407 #define F_LETTFIN 408 #define F_NOTIZIARIO 409 +#define F_PERFAMIGLIE 410 #define F_SINTETICO 501 #define F_COMPLETO 502 diff --git a/at/at2700a.uml b/at/at2700a.uml index 27852d9a7..934bf504f 100755 --- a/at/at2700a.uml +++ b/at/at2700a.uml @@ -415,7 +415,7 @@ BEGIN FLAGS "D" END -GROUPBOX DLG_NULL 77 6 +GROUPBOX DLG_NULL 77 7 BEGIN PROMPT 1 14 "Opzioni di stampa" END @@ -497,5 +497,10 @@ BEGIN //PICTURE "!!" END +BOOLEAN F_PERFAMIGLIE +BEGIN + PROMPT 2 19 "Raggruppa per famiglie (solo etichette)" +END + ENDPAGE ENDMASK