Praticamente finita la stampa dei totali EC

git-svn-id: svn://10.65.10.50/trunk@2305 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1995-12-15 17:12:03 +00:00
parent c3911bba9e
commit 5b229e95f6
5 changed files with 547 additions and 82 deletions

392
sc/pec.frm Executable file
View File

@ -0,0 +1,392 @@
USE 20
JOIN 13 INTO COM=COMCF
END
DESCRIPTION
BEGIN
20->* "Clienti/Fornitori"
13->* "Comuni"
END
GENERAL
BEGIN
OFFSET 0 0
FONT "Arial"
SIZE 12
END
SECTION GRAPHICS ODD
LINEA 1 172 1
BEGIN
PROMPT 1 10 "@B@R"
END
LINEA 2 172 1
BEGIN
PROMPT 1 12 "@B@R"
END
LINEA 3 172 1
BEGIN
PROMPT 1 58 "@B@R"
END
LINEA 10 1 57
BEGIN
PROMPT 1 10 "@B@R"
END
LINEA 11 1 57
BEGIN
PROMPT 24 10 "@R"
END
LINEA 12 1 57
BEGIN
PROMPT 36 10 "@R"
END
LINEA 13 1 57
BEGIN
PROMPT 56 10 "@R"
END
LINEA 14 1 57
BEGIN
PROMPT 76 10 "@R"
END
LINEA 15 1 57
BEGIN
PROMPT 96 10 "@R"
END
LINEA 16 1 57
BEGIN
PROMPT 116 10 "@B@R"
END
END
SECTION HEADER ODD 12
STRINGA 100
BEGIN
KEY "Flags generali VALUTA|FINCATURA"
PROMPT 0 0 "X|2"
FLAGS "DH"
END
STRINGA 1
BEGIN
KEY "Spettabile/Egregio"
PROMPT 2 1 "Spettabile"
END
NUMERO 218
BEGIN
KEY "Pagina"
PROMPT 70 1 "Pagina "
END
NUMERO 3
BEGIN
KEY "Codice cliente/fornitore"
PROMPT 2 2 ""
FIELD CODCF
END
STRINGA 4
BEGIN
KEY "Ragione sociale"
PROMPT 8 2 ""
FIELD RAGSOC
END
STRINGA 5
BEGIN
KEY "Indirizzo"
PROMPT 2 3 ""
FIELD INDCF
END
STRINGA 6
BEGIN
KEY "Numero civico"
PROMPT 52 3 ""
FIELD CIVCF
END
NUMERO 7
BEGIN
KEY "C.A.P."
PROMPT 2 4 "C.A.P. "
FIELD CAPCF
END
STRINGA 8
BEGIN
KEY "Localita'"
PROMPT 26 4 ""
FIELD LOCALITACF
END
STRINGA 9
BEGIN
KEY "Comune"
PROMPT 2 5 ""
FIELD 13->DENCOM
END
STRINGA 10
BEGIN
KEY "Provincia"
PROMPT 52 5 ""
FIELD 13->PROVCOM
END
STRINGA 11
BEGIN
KEY "Prefisso telefonico"
PROMPT 2 6 "Telefono "
FIELD PTEL
END
STRINGA 12
BEGIN
KEY "Telefono"
PROMPT 24 6 "/ "
FIELD TEL
END
STRINGA 101
BEGIN
KEY "Luogo d'invio"
PROMPT 2 7 ""
END
DATA 102
BEGIN
KEY "Data d'invio"
PROMPT 52 7 ""
FORMAT "1444-"
END
STRING 103
BEGIN
KEY "Testo fisso"
PROMPT 2 8 ""
END
END
SECTION BODY ODD 1
STRINGA 201
BEGIN
KEY "Cod."
PROMPT 2 1 ""
FLAGS "H"
END
STRINGA 202 22 1
BEGIN
KEY "Descrizione"
PROMPT 2 1 ""
END
DATA 205
BEGIN
KEY "Data doc."
PROMPT 24 1 ""
FLAGS "H"
END
STRINGA 206
BEGIN
KEY "Num.doc."
PROMPT 34 1 ""
FLAGS "H"
END
NUMERO 207
BEGIN
KEY "Prot."
PROMPT 44 1 ""
FLAGS "H"
END
NUMERO 208
BEGIN
KEY "Totale documento"
PROMPT 60 1 ""
FLAGS "H"
END
DATA 209
BEGIN
KEY "Data"
PROMPT 25 1 ""
END
NUMERO 210
BEGIN
KEY "Dare"
PROMPT 37 1 ""
PICTURE "###.###.###.###"
END
NUMERO 211
BEGIN
KEY "Avere"
PROMPT 57 1 ""
PICTURE "###.###.###.###"
END
NUMERO 212
BEGIN
KEY "Scaduto"
PROMPT 77 1 ""
PICTURE "###.###.###.###"
END
NUMERO 213
BEGIN
KEY "Esposto"
PROMPT 97 1 ""
PICTURE "###.###.###.###"
END
STRINGA 214
BEGIN
KEY ""
PROMPT 115 1 ""
END
NUMERO 215
BEGIN
KEY "Importi in lire"
PROMPT 117 1 ""
PICTURE "###.###.###.###"
END
NUMERO 216
BEGIN
KEY "Cambio"
PROMPT 2 1 ""
PICTURE "###.###.###.###"
FLAGS "H"
END
DATA 217
BEGIN
KEY "Data cam."
PROMPT 2 1 ""
FLAGS "H"
END
STRING 301
BEGIN
KEY "Descrizione saldo partita"
PROMPT 2 1 "*** Saldo partita"
FLAGS "DH"
END
STRING 302
BEGIN
KEY "Descrizione abbuoni"
PROMPT 2 1 "*** Abbuoni"
FLAGS "DH"
END
STRING 303
BEGIN
KEY "Descrizione differenza cambi"
PROMPT 2 1 "*** Differenza cambi"
FLAGS "DH"
END
STRING 304
BEGIN
KEY "Ritenute"
PROMPT 2 1 "*** Ritenute"
FLAGS "DH"
END
END // Fine body
SECTION FOOTER ODD 9
STRING 400
BEGIN
KEY "Descrizione riporto"
PROMPT 2 1 "*** Riporto"
FLAGS "DH"
END
STRING 401
BEGIN
KEY "Descrizione totale"
PROMPT 2 1 "Saldo <VALUTA> al <DATA>"
END
NUMERO 210
BEGIN
KEY "Dare"
PROMPT 37 1 ""
PICTURE "###.###.###.###"
END
NUMERO 211
BEGIN
KEY "Avere"
PROMPT 57 1 ""
PICTURE "###.###.###.###"
END
STRING 402
BEGIN
KEY "Descrizione totale scaduto"
PROMPT 2 2 "Totale scaduto al <DATA SCADUTO>"
END
NUMERO 212
BEGIN
KEY "Scaduto"
PROMPT 77 1 ""
PICTURE "###.###.###.###"
END
STRING 403
BEGIN
KEY "Descrizione totale esposto"
PROMPT 2 3 "Totale esposto"
END
NUMERO 213
BEGIN
KEY "Esposto"
PROMPT 97 1 ""
PICTURE "###.###.###.###"
END
STRING 404
BEGIN
KEY "Descrizione totale importi in lire"
PROMPT 2 4 "Importi in lire della valuta <DESCRIZIONE VALUTA>"
END
NUMERO 215
BEGIN
KEY "Importi in lire"
PROMPT 117 1 ""
PICTURE "###.###.###.###"
END
END // Fine footer
END // Fine Form

View File

@ -38,14 +38,15 @@ class TEC_form : public TForm
TDate _dlo, _dls, _dir; // Data limite operazione, scaduto e inizio rischio
int _giorni_rischio; // Numero giorni rischio nella maschera di selezione
bool _in_valuta; // Il form e' in valuta
int _fincatura; // 0 = nessuna, 1 = testo, 2 = grafica
word _num_rip; // Numero di righe usate per i riporti
word _total_rows; // Numero di righe usate per i totali
protected:
void init_memo();
void init_header(const TMask& m);
word ordina_totali_per_valuta(THash_object* tot[MAXTOT]);
void change_magic_names(const THash_object& o, TString& s);
void print_total(int riga, const THash_object& o, short id);
void print_total(int riga, const THash_object& o);
void stampa_testata(TPrinter& p);
void stampa_pedata(TPrinter& p);
@ -112,7 +113,7 @@ public:
int riga() const { return _riga; }
int rata() const { return _rata; }
void reset_causale() { _causale.cut(0); _descrizione.cut(0); }
void reset_uguali();
void descrizione(const char* s) { _descrizione = s; }
void importo(const TImporto& i) { _importo = i; }
void importo_lire(const real& i) { _importo_lire = i; }
@ -173,23 +174,37 @@ int TEC_row::compare(const TSortable& s) const
else
c = _data > r._data ? +1 : -1;
return c;
}
}
// Annulla i campi uguali alla riga precedente
void TEC_row::reset_uguali()
{
_num_doc = "";
_data_doc = botime;
_num_prot = 0;
_totale = ZERO;
}
void TEC_row::set_imp(TForm_item& fi, const real& imp, bool valuta) const
{
TString old_picture;
TString old_picture(20);
if (valuta)
{
old_picture = fi.picture();
TString new_picture(20);
new_picture = old_picture;
if (old_picture.find(',') > 0)
new_picture << ".###";
if (old_picture.empty())
{
new_picture = valuta ? ".3" : ".";
}
else
new_picture << ",###";
{
new_picture = old_picture;
if (old_picture.find(',') > 0)
new_picture << ".###";
else
new_picture << ",###";
}
fi.set_picture(new_picture);
}
@ -299,29 +314,29 @@ public:
TImporto TEC_array::importo(const TPartita& game, const TRectype& pag, bool valuta) const
{
const int nriga = pag.get_int(PAGSCA_NRIGA);
const TRiga_partite& fat = game.riga(nriga);
const TRiga_partite& fat = game.riga(nriga); // Riga di fattura
const bool fat_val = fat.in_valuta();
const int nrigp = pag.get_int(PAGSCA_NRIGP);
const TRiga_partite& sum = game.riga(nrigp);
const TRiga_partite& sum = game.riga(nrigp); // Riga di pagamento
const char sez = sum.sezione();
const char* const field = valuta && fat_val ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO;
TImporto imp(sez, pag.get_real(PAGSCA_IMPORTO));
TImporto imp(sez, pag.get_real(field)); // Importo base
if (!fat_val)
imp.valore() += pag.get_real(PAGSCA_RITENUTE);
imp.valore() += pag.get_real(PAGSCA_RITENUTE); // Sommo le ritenute se sono il lire
if (pag.get_char(PAGSCA_ACCSAL) == 'S')
if (pag.get_char(PAGSCA_ACCSAL) == 'S') // Se il pagamento ha abbuoni o differenze cambio
{
real abb(pag.get(PAGSCA_ABBUONI));
if (!valuta && fat_val)
if (!valuta && fat_val) // Se voglio gli abbuoni in lire ma la fattura non lo e'
{
const TValuta val(sum);
val.val2lit(abb);
abb += pag.get_real(PAGSCA_DIFFCAM);
const TValuta val(sum); // Leggo il cambio dalla riga di partita
val.val2lit(abb); // Converto in lire gli abbuoni
abb += pag.get_real(PAGSCA_DIFFCAM); // Sommo l'eventuale differenza cambio (gia' in lire)
}
imp.valore() += abb;
imp.valore() += abb; // Sommo il tutto all'importo base (sez e' uguale per tutti i valori)
}
return imp;
@ -490,24 +505,32 @@ void TEC_array::add_row(const TRiga_partite& row)
}
}
const TImporto diffcam(row.importo(in_valuta, 0x4));
TImporto diffcam(row.importo(FALSE, 0x4));
if (!diffcam.is_zero())
{
TEC_row& rec = new_row(row, data, diffcam, 3);
TEC_row& rec = new_row(row, data, TImporto('D', ZERO), 3);
rec.descrizione(form().describe(PEC_DIFFCAM));
if (in_valuta)
{
TImporto il(row.importo(FALSE, 0x4));
il.normalize(sezione);
rec.importo_lire(il.valore());
diffcam.normalize(sezione);
rec.importo_lire(diffcam.valore());
}
else
rec.importo(diffcam);
}
const TImporto ritenute(row.importo(in_valuta, 0x8));
TImporto ritenute(row.importo(FALSE, 0x8));
if (!ritenute.is_zero())
{
TEC_row& r = new_row(row, data, ritenute, 4);
r.descrizione(form().describe(PEC_RITENUTE));
TEC_row& rec = new_row(row, data, TImporto('D', ZERO), 4);
rec.descrizione(form().describe(PEC_RITENUTE));
if (in_valuta)
{
ritenute.normalize(sezione);
rec.importo_lire(ritenute.valore());
}
else
rec.importo(ritenute);
}
}
}
@ -577,8 +600,8 @@ static int tot_compare(const void* o1, const void* o2)
if (o1 == o2) // Sfrutto una piccola debolezza di qsort:
return 0; // ogni tanto confronta oggetti con se stessi
const THash_object* h1 = (const THash_object*)o1;
const THash_object* h2 = (const THash_object*)o2;
const THash_object* h1 = *((const THash_object**)o1);
const THash_object* h2 = *((const THash_object**)o2);
return stricmp(h1->key(), h2->key());
}
@ -601,13 +624,12 @@ void TEC_form::stampa_riporti(TPrinter& pr)
{
THash_object* tot[MAXTOT];
_num_rip = ordina_totali_per_valuta(tot);
const word maxtot = section('F').height();
const word maxtot = section('F').height() - 1; // La prima riga e' riservata alla fincatura
if (_num_rip > maxtot)
_num_rip = maxtot;
const TString& riporto = describe(PEC_RIPORTO, 'F');
TString desc(80);
TPrint_section& body = section('B');
for (word j = 0; j < _num_rip; j++)
@ -623,7 +645,7 @@ void TEC_form::stampa_riporti(TPrinter& pr)
rip.esposto(t.esposto());
rip.importo_lire(t.importo_lire());
rip.print_on(body);
pr.setfooterline(j, body.row(0));
pr.setfooterline(j+1, body.row(0));
}
}
@ -664,44 +686,83 @@ void TEC_form::change_magic_names(const THash_object& o, TString& s)
}
}
void TEC_form::print_total(int riga, const THash_object& o, short id)
{
TForm_item& desc_field = find_field('F', odd_page, id);
if (desc_field.shown())
{
const int old_width = desc_field.width();
desc_field.set_width(80); // Allunga campo descrizione
TString s(80); s = desc_field.prompt();
change_magic_names(o, s);
const TTotal& t = (const TTotal&)o.obj();
TEC_row row(s, t.importo());
TPrint_section& body = section('B');
row.print_on(body);
desc_field.set_width(old_width); // Ripristina lunghezza originaria
printer().setfooterline(riga + desc_field.y() -1, body.row(0));
void TEC_form::print_total(int riga, const THash_object& o)
{
const short MAXID = 4;
const short f_id[MAXID] = { PEC_TSALDO, PEC_TSCADUTO, PEC_TESPOSTO, PEC_TIMPLIRE };
TString_array prompt(MAXID);
TPrint_section& foot = section('F');
// Sostituisce magic-names nei prompt
TString s(80);
for (int i = 0; i < MAXID; i++)
{
TForm_item& desc_field = foot.find_field(f_id[i]);
if (desc_field.shown())
{
s = desc_field.prompt();
prompt.add(s, i);
change_magic_names(o, s);
desc_field.set_prompt(s);
}
}
const TTotal& t = (const TTotal&)o.obj();
const TImporto& imp = t.importo();
TForm_item& dare = foot.find_field(PEC_DARE);
TForm_item& avere = foot.find_field(PEC_AVERE);
if (imp.sezione() == 'D')
{
dare.set(imp.valore().string());
avere.set("");
}
else
{
dare.set("");
avere.set(imp.valore().string());
}
TForm_item& scaduto = foot.find_field(PEC_SCADUTO);
scaduto.set(t.scaduto().string());
TForm_item& esposto = foot.find_field(PEC_ESPOSTO);
scaduto.set(t.esposto().string());
TForm_item& implire = foot.find_field(PEC_IMPLIRE);
implire.set(t.importo_lire().string());
foot.update();
// Ripristina prompt originari
for (i = 0; i < MAXID; i++)
{
const TString* p = (const TString*)prompt.objptr(i);
if (p)
{
TForm_item& desc_field = foot.find_field(f_id[i]);
desc_field.set_prompt(*p);
}
}
for (word r = 0; r < _total_rows; r++)
printer().setfooterline(riga + r, foot.row(r));
}
void TEC_form::stampa_pedata(TPrinter& pr)
{
THash_object* tot[MAXTOT];
word num_rip = ordina_totali_per_valuta(tot);
const word maxtot = section('F').height() / _total_rows;
// La prima riga del footer deve essere lasciata libera per la fincatura
// Ogni sottosezione di totale occupa _total_rows righe: per cui devo calcolare
// quanti totali ci stanno nelle righe riservate al footer
const word maxtot = (section('F').height()-1) / _total_rows;
if (num_rip > maxtot)
num_rip = maxtot;
TString desc(80);
TPrint_section& body = section('B');
for (word j = 0; j < num_rip; j++)
{
print_total(j * _total_rows, *tot[j], PEC_TSALDO);
}
print_total(j*_total_rows+1, *tot[j]);
}
void TEC_form::ultima_pagina()
@ -771,7 +832,7 @@ bool TEC_form::print_game(const TPartita& game)
const int ri = riga.riga();
const int ra = riga.rata();
if (ri == ultima_riga && ra == ultima_rata+1)
riga.reset_causale();
riga.reset_uguali();
ultima_riga = ri;
ultima_rata = ra;
@ -812,9 +873,17 @@ const TString& TEC_form::describe(short id, char sez, pagetype pt) const
return fi.prompt();
}
void TEC_form::init_memo()
void TEC_form::init_header(const TMask& m)
{
TForm_item& fi = find_field('H', odd_page, PEC_MEMO);
TPrint_section& head = section('H');
TForm_item& luogo_invio = head.find_field(PEC_LUOGOIN);
luogo_invio.set(m.get(F_LUOGOSEND));
TForm_item& data_invio = head.find_field(PEC_DATAIN);
data_invio.set(m.get(F_DATASEND));
TForm_item& fi = head.find_field(PEC_MEMO);
if (fi.shown())
{
TLocalisamfile f(LF_RFORM);
@ -826,6 +895,12 @@ void TEC_form::init_memo()
if (err == NOERR)
fi.set(f.get("TESTO"));
}
if (_fincatura)
{
TPrint_section& fink = section('G');
if (fink.fields() > 0) fink.update(); // Setta il backgroud di stampa
}
}
TEC_form::TEC_form(const TEC_mask& m, bool gesval)
@ -836,14 +911,10 @@ TEC_form::TEC_form(const TEC_mask& m, bool gesval)
{
_form = this;
TForm_item& imp_lire = find_field('B', odd_page, PEC_IMPLIRE);
_in_valuta = gesval && imp_lire.shown(); // Il profilo e' in valuta se c'e' la colonna importo in lire
_lingua = m.get_prof_lang(); // Lingua profilo
TCursor_sheet& cs = m.cur_sheet();
_cursore = cs.cursor();
_lingua = m.get_prof_lang(); // Lingua profilo
_dlo = m.get(F_DATALIMOP);
_dls = m.get(F_DATALIMSC);
_giorni_rischio = m.get_int(F_GIORISCH);
@ -854,14 +925,12 @@ TEC_form::TEC_form(const TEC_mask& m, bool gesval)
pr.setheaderhandler(ec_header_handler);
TPrint_section& head = section('H');
pr.headerlen(head.height());
TForm_item& luogo_invio = head.find_field(PEC_LUOGOIN);
luogo_invio.set(m.get(F_LUOGOSEND));
TForm_item& data_invio = head.find_field(PEC_DATAIN);
data_invio.set(m.get(F_DATASEND));
init_memo(); // Set fixed memo text
TForm_item& flags = head.find_field(PEC_FLAGS);
TToken_string f(flags.prompt());
_in_valuta = gesval && f.get_char(0) == 'X'; // Il profilo e' in valuta se c'e' il flag di valuta
_fincatura = f.get_int(1);
init_header(m); // Set fixed text
pr.setfooterhandler(ec_footer_handler);
const TPrint_section& foot = section('F');
@ -959,8 +1028,10 @@ bool TStampaEC_application::print_selected()
one_printed = TRUE;
else
analfabeti++;
}
printer().formfeed();
}
if (one_printed)
printer().formfeed();
printer().close();
if (analfabeti > 0)

View File

@ -52,7 +52,6 @@ BEGIN
DISPLAY "Descrizione@50" S0
OUTPUT F_LINPROF CODTAB
CHECKTYPE NORMAL
VALIDATE CHECK_FIELD F_CODPROF
WARNING "Codice profilo o lingua errato"
END

View File

@ -34,6 +34,6 @@
#define PEC_TSALDO 401
#define PEC_TSCADUTO 402
#define PEC_TESPOSTO 403
#define PEC_TLIRE 404
#define PEC_TIMPLIRE 404
#endif

View File

@ -94,6 +94,9 @@ void TSelection_mask::select_clifo_range(long from, long to)
const int key = get_key();
TString s_from(50), s_to(50);
if (to == 0 && items)
to = c.row(items-1).get_long(key);
if (from > to) // Controlla limiti
{
long tmp = to;