Include mancante in sc2101.cpp piu stato dell' arte dei solleciti

git-svn-id: svn://10.65.10.50/trunk@2388 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1996-01-03 17:31:54 +00:00
parent 45d6594881
commit df36f2cc2b
10 changed files with 797 additions and 198 deletions

View File

@ -1,4 +1,5 @@
#include <prefix.h>
#include <utility.h>
#include "sc2101.h"
#include "sc2100a.h"

View File

@ -29,7 +29,7 @@ class TStampaSol_application: public TApplication {
protected:
virtual bool create();
virtual bool destroy();
virtual bool menu(MENU_TAG mt);
virtual bool menu(MENU_TAG m);
virtual void on_firm_change();
public:
@ -38,13 +38,14 @@ public:
TCursor_sheet &sheet() { return _msk->cur_sheet(); }
bool print_selected(); // cicla la stampa sugli elementi selezionati
bool print_sol(); // stampa l'elemento corrente
int print_sol(); // stampa l'elemento corrente
TStampaSol_application();
virtual ~TStampaSol_application() {}
};
bool TStampaSol_application::print_selected() {
bool TStampaSol_application::print_selected()
{
TCursor_sheet &s = sheet();
TCursor &c = *s.cursor();
@ -52,6 +53,7 @@ bool TStampaSol_application::print_selected() {
const int key = mask().get_key();
// filtra il cursore del form in mode che diventi uguale al cursor_sheet corrente
// Qui sarebbe bello copiarsi l'indice dell'altro cursore
TCursor &fc = *form().cursor();
fc.setkey(key);
TRectype filter(LF_CLIFO);
@ -63,14 +65,25 @@ bool TStampaSol_application::print_selected() {
printer().open();
bool one_printed = FALSE;
const long items = c.items();
for (long i=0; i < items; i++) if (print_all || s.checked(i)) {
for (long i=0; i < items; i++) if (print_all || s.checked(i))
{
// if (one_printed)
// printer().formfeed();
fc= i; // muove il cursore alla posizione corrente
const bool ok = print_sol();
if (!ok) analfabeti++;
const int ret = print_sol();
if (ret > 0)
one_printed = TRUE;
else
if (ret < 0)
analfabeti++;
}
printer().formfeed();
// if (one_printed)
// printer().formfeed();
printer().close();
if (analfabeti > 0) {
@ -81,7 +94,8 @@ bool TStampaSol_application::print_selected() {
return TRUE;
}
bool TStampaSol_application::print_sol() {
int TStampaSol_application::print_sol()
{
TSol_form &f= form();
// preparazione variabili per controllo lingua
@ -91,7 +105,7 @@ bool TStampaSol_application::print_sol() {
// controllo lingua ditta corrente
if ((f.lingua() == _lingua_ditta && !lincf.empty()) || f.lingua() != _lingua_ditta) ok= (lincf == f.lingua());
if (!ok) return FALSE; // cliente analfabeta
if (!ok) return -1; // cliente analfabeta
// filtra solo le partite del cliente selezionato
TLocalisamfile& partite = _file[LF_PARTITE];
@ -115,11 +129,13 @@ bool TStampaSol_application::print_sol() {
{
TPartita game(partite.curr());
saldo += game.calcola_saldo_al(FALSE, data_limite_soll);
partite.put(PART_NRIGA, 9999);
}
saldo.normalize(f.sezione_normale());
if (saldo.valore() < sel_importo)
return TRUE;
return 0;
partite.curr() = filter;
}
for (int err = partite.read(_isgteq);
err == NOERR && partite.curr() == filter;
@ -143,15 +159,15 @@ bool TStampaSol_application::print_sol() {
if (one_printed)
printer().formfeed();
return TRUE;
return one_printed ? 1 : 0;
}
bool TStampaSol_application::create() {
bool TStampaSol_application::create()
{
TApplication::create();
_file.open(LF_TABCOM, LF_TAB, LF_CAUSALI, LF_MOV, LF_RMOV, 0);
_file.open(LF_NDITTE, LF_ANAG, LF_COMUNI, 0);
_file.open(LF_NDITTE, LF_ANAG, LF_COMUNI, LF_RFORM, 0);
_file.open(LF_CLIFO, LF_PARTITE, LF_SCADENZE, LF_PAGSCA ,0);
_msk= new TSol_mask("sc2400a");
@ -160,26 +176,28 @@ bool TStampaSol_application::create() {
return TRUE;
}
bool TStampaSol_application::destroy() {
bool TStampaSol_application::destroy()
{
delete _msk;
_file.close();
return TApplication::destroy();
}
void TStampaSol_application::on_firm_change() {
void TStampaSol_application::on_firm_change()
{
TApplication::on_firm_change();
TConfig c(CONFIG_DITTA, "cg");
_lingua_ditta= c.get("CodLin");
_gesval= c.get_bool("GesVal");
}
bool TStampaSol_application::menu(MENU_TAG mt)
bool TStampaSol_application::menu(MENU_TAG)
{
TSol_mask &m= mask();
while (m.run() == K_ENTER)
while (m.run() != K_QUIT)
{
_form= new TSol_form(m, F_DATALIMSOL);
_form= new TSol_form(m, _gesval, F_DATALIMSOL);
print_selected();
delete _form;
_form= NULL;

View File

@ -1,7 +1,7 @@
#include "scselmsk.h"
#include "sc2400a.h"
PAGE "Stampa solleciti" -1 -1 68 16
PAGE "Stampa solleciti" -1 -1 68 17
NUMBER F_CODDITTA 5
BEGIN
@ -21,12 +21,12 @@ END
GROUPBOX DLG_NULL 68 7
BEGIN
PROMPT 0 7 ""
PROMPT 0 2 ""
END
NUMBER F_CODPROF 4
BEGIN
PROMPT 1 8 "Profilo "
PROMPT 1 3 "Profilo "
FLAGS "Z"
USE LF_FORM
INPUT TIPOPROF BASE_EC_PROFILE
@ -38,11 +38,13 @@ BEGIN
OUTPUT F_LINPROF CODPROF[5,5]
OUTPUT F_DESPROF DESC
CHECKTYPE REQUIRED
FIELD ANTICLEAR
WARNING "Codice profilo o lingua errato"
END
STRING F_LINPROF 1
BEGIN
PROMPT 18 8 ""
PROMPT 18 3 ""
USE %LNG
INPUT CODTAB F_LINPROF
DISPLAY "Codice" CODTAB
@ -53,99 +55,134 @@ END
STRING F_DESPROF 50 40
BEGIN
PROMPT 25 8 ""
PROMPT 25 3 ""
FLAGS "D"
END
DATE F_DATALIMSOL
BEGIN
PROMPT 1 9 "Data limite sollecito "
PROMPT 1 4 "Data limite sollecito "
FLAGS "A"
VALIDATE DATE_CMP_FUNC <= F_DATASEND
WARNING "La data limite sollecito non può essere superiore alla data di invio"
WARNING "La data limite sollecito deve essere specificata e non può essere superiore alla data di invio"
CHECKTYPE REQUIRED
END
NUMBER F_IMPORMIN 18
BEGIN
PROMPT 1 10 "Importo minimo "
PROMPT 1 5 "Importo minimo "
END
RADIOBUTTON F_RIFIMPMIN 10
BEGIN
PROMPT 45 9 ""
PROMPT 45 4 ""
ITEM "P|Partita"
ITEM "C|Cliente"
END
BOOLEAN F_STAMPESP
BEGIN
PROMPT 1 11 "Stampa esposizione"
PROMPT 1 6 "Stampa esposizione"
END
STRING F_LUOGOSEND 50 32
BEGIN
PROMPT 1 12 "Luogo d'invio "
PROMPT 1 7 "Luogo d'invio "
END
DATE F_DATASEND
BEGIN
PROMPT 50 12 "data "
PROMPT 50 7 "Data "
FLAGS "A"
CHECKTYPE REQUIRED
END
RADIOBUTTON SC_SORTCF 40
BEGIN
PROMPT 1 2 "Ordinamento"
ITEM "1|Per codice"
ITEM "2|Per ragione sociale"
PROMPT 1 9 "Ordinamento"
ITEM "1|Per codice" MESSAGE HIDE,2@|SHOW,1@
ITEM "2|Per ragione sociale" MESSAGE HIDE,1@|SHOW,2@
END
BUTTON SC_SELECT 10 1
BEGIN
PROMPT 50 3 "~Selezione"
PROMPT 50 10 "~Selezione"
END
BUTTON SC_RESET 10 1
BEGIN
PROMPT 50 4 "~Azzera"
PROMPT 50 11 "~Azzera"
END
NUMBER SC_CFCODFR 5
BEGIN
PROMPT 1 6 "Da codice "
END
NUMBER SC_CFCODTO 5
BEGIN
PROMPT 36 6 "a codice "
END
NUMBER SC_NSEL 3
BEGIN
PROMPT 59 6 "N. "
FLAGS "D"
PROMPT 1 13 "Da codice "
GROUP 1
END
BUTTON SC_CFBUTFR 2 1
BEGIN
PROMPT 31 6 ""
PROMPT 31 13 ""
GROUP 1
PICTURE 109
END
NUMBER SC_CFCODTO 5
BEGIN
PROMPT 36 13 "a codice "
GROUP 1
END
BUTTON SC_CFBUTTO 2 1
BEGIN
PROMPT 51 6 ""
PROMPT 51 13 ""
PICTURE 109
GROUP 1
END
BUTTON DLG_OK 10 2
STRING SC_CFDESFR 50 30
BEGIN
PROMPT 1 13 "Da ragione sociale "
GROUP 2
FLAGS "H"
END
BUTTON SC_CFDESBUTFR 2 1
BEGIN
PROMPT 51 13 ""
PICTURE 109
GROUP 2
FLAGS "H"
END
STRING SC_CFDESTO 50 30
BEGIN
PROMPT 2 14 "A ragione sociale "
GROUP 2
FLAGS "H"
END
BUTTON SC_CFDESBUTTO 2 1
BEGIN
PROMPT 51 14 ""
PICTURE 109
GROUP 2
FLAGS "H"
END
NUMBER SC_NSEL 3
BEGIN
PROMPT 59 13 "N. "
FLAGS "D"
END
BUTTON DLG_PRINT 10 2
BEGIN
PROMPT -12 -1 ""
MESSAGE EXIT,K_ENTER
END
BUTTON DLG_CANCEL 10 2
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -1 ""
END

View File

@ -1,5 +1,6 @@
#include "../cg/saldacon.h"
#include <mov.h>
#include <pagsca.h>
#include <scadenze.h>
#include <partite.h>
@ -40,6 +41,14 @@ const TString &TESSL_mask::get_prof_code() const {
return get(F_CODPROF);
}
const char *TESSL_mask::get_prof_name() const
{
TFixed_string tmp(__tmp_string, 16);
tmp = get_prof_code();
tmp << get_prof_lang();
return __tmp_string;
}
const TString &TESSL_mask::get_prof_lang() const {
return get(F_LINPROF);
}
@ -49,7 +58,9 @@ const TString &TESSL_mask::get_prof_lang() const {
// TESSL_row
///////////////////////////////////////////////////////////
TESSL_row::TESSL_row(const TRiga_partite& row, const TDate& data, const TImporto& imp, int rata): _num_prot(0) {
TESSL_row::TESSL_row(const TRiga_partite& row, const TDate& data, const TImporto& imp, int rata)
: _num_prot(0), _num_reg(0), _salvo_buon_fine(FALSE)
{
_riga = row.get_int(PART_NRIGA);
_rata = rata;
@ -57,6 +68,7 @@ TESSL_row::TESSL_row(const TRiga_partite& row, const TDate& data, const TImporto
_causale = row.get(PART_CODCAUS);
_data_doc = row.get(PART_DATADOC);
_num_prot = row.get_long(PART_PROTIVA);
_num_reg = row.get_long(PART_NREG);
_importo = imp; _importo.normalize();
_totale = row.get_real(PART_IMPTOTDOC);
@ -64,7 +76,7 @@ TESSL_row::TESSL_row(const TRiga_partite& row, const TDate& data, const TImporto
}
TESSL_row::TESSL_row(const char* desc, const TImporto& imp)
: _riga(9999), _rata(9999), _num_prot(0), _salvo_buon_fine(FALSE)
: _riga(9999), _rata(9999), _num_prot(0), _num_reg(0), _salvo_buon_fine(FALSE)
{
_descrizione = desc;
_importo = imp; _importo.normalize();
@ -86,20 +98,36 @@ int TESSL_row::compare(const TSortable& s) const
return c;
}
// Annulla i campi uguali alla riga precedente
void TESSL_row::reset_uguali()
{
_num_doc = "";
_data_doc = botime;
_num_prot = 0;
_totale = ZERO;
}
void TESSL_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);
if (old_picture.empty())
{
new_picture = valuta ? ".3" : ".";
}
else
{
new_picture = old_picture;
if (old_picture.find(',') > 0)
new_picture << ".###";
else
new_picture << ",###";
}
fi.set_picture(new_picture);
}
@ -111,9 +139,17 @@ void TESSL_row::set_imp(TForm_item& fi, const real& imp, bool valuta) const
}
}
TESSL_form& TESSL_row::form() const
{
TESSL_form* f = TESSL_form::_form;
CHECK(f, "NULL form");
return *f;
}
void TESSL_row::print_on(TPrint_section& body)
{
TESSL_form& form = (TESSL_form&)body.form();
const bool valuta = form.in_valuta() && in_valuta();
TForm_item& causale = body.find_field(PEC_CODCAUS);
causale.set(_causale);
@ -123,6 +159,13 @@ void TESSL_row::print_on(TPrint_section& body)
}
TForm_item& descr = body.find_field(PEC_DESCR1);
if (num_reg() > 0) // Riga di partita vera e propria (non totale parziale)
{
TString s(80); s = descr.prompt();
TESSL_form::_form->change_magic_body(*this, s);
descr.set(s);
}
else
descr.set(_descrizione);
TForm_item& datadoc = body.find_field(PEC_DATADOC);
@ -142,11 +185,14 @@ void TESSL_row::print_on(TPrint_section& body)
TForm_item& dare = body.find_field(PEC_DARE);
TForm_item& avere = body.find_field(PEC_AVERE);
if (_importo.sezione() == 'D') {
dare.set(imp.string());
if (_importo.sezione() == 'D')
{
set_imp(dare, imp, valuta);
avere.set("");
} else {
avere.set(imp.string());
}
else
{
set_imp(avere, imp, valuta);
dare.set("");
}
@ -154,13 +200,11 @@ void TESSL_row::print_on(TPrint_section& body)
importo_in_lire.set(_importo_lire.string());
TForm_item& scaduto = body.find_field(PEC_SCADUTO);
scaduto.set(_scaduto.string());
set_imp(scaduto, _scaduto, valuta);
TForm_item& esposto = body.find_field(PEC_ESPOSTO);
esposto.set(_esposto.string());
TForm_item& sbf = body.find_field(PEC_SBF);
sbf.set(_salvo_buon_fine ? "*" : " ");
set_imp(esposto, _esposto, valuta);
esposto.set_prompt(_salvo_buon_fine ? "*" : " ");
TForm_item& cambio = body.find_field(PEC_CAMBIO);
cambio.set(_valuta.cambio().string());
@ -168,7 +212,13 @@ void TESSL_row::print_on(TPrint_section& body)
TForm_item& datacambio = body.find_field(PEC_DATACAM);
datacambio.set(_valuta.data().string());
body.update();
const TString old_prompt(descr.prompt());
descr.set_prompt(""); // Nasconde temporaneamente il prompt per non stampare i <magic>
body.update(); // crea la vera riga di stampa
esposto.set_prompt(" ");
descr.set_prompt(old_prompt); // Ripristina il vecchio prompt
}
static int val_compare(const void* o1, const void* o2) {
@ -188,29 +238,29 @@ static int val_compare(const void* o1, const void* o2) {
TImporto TESSL_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 in 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;
@ -294,13 +344,13 @@ TESSL_row& TESSL_array::new_row(const TRiga_partite& row, const TDate& data, con
{
CHECKD(n > 0, "Numero rata errato: ", n);
TESSL_row* riga = new TESSL_row(row, data, imp, n);
add(riga, n);
add(riga);
return *riga;
}
void TESSL_array::add_row(const TRiga_partite& row)
{
const bool in_valuta = form().in_valuta();
const bool in_valuta = form().in_valuta() && row.in_valuta();;
real importo_in_lire(ZERO);
const char sezione = form().sezione_normale();
@ -315,9 +365,9 @@ void TESSL_array::add_row(const TRiga_partite& row)
TESSL_row& rec = new_row(row, data, rata.importo(in_valuta), r);
if (in_valuta)
{
TImporto i(rata.importo(FALSE));
i.normalize(sezione);
rec.importo_in_lire(i.valore());
TImporto il(rata.importo(FALSE));
il.normalize(sezione);
rec.importo_in_lire(il.valore());
}
if (data <= form().data_limite_scaduto())
{
@ -332,7 +382,7 @@ void TESSL_array::add_row(const TRiga_partite& row)
const TDate data(row.get(PART_DATAPAG));
if (data <= form().data_limite_operazione())
{
const TImporto imp(row.importo(in_valuta, 0x1));
const TImporto imp(row.importo(in_valuta, 0x1)); // Importo pulito senza nient'altro
TESSL_row& riga = new_row(row, data, imp, 1);
if (in_valuta)
{
@ -370,51 +420,45 @@ void TESSL_array::add_row(const TRiga_partite& row)
}
}
TImporto ritenute(row.importo(FALSE, 0x8));
if (!ritenute.is_zero())
{
TESSL_row& r = new_row(row, data, TImporto('D', ZERO), 4);
r.descrizione(form().describe(PEC_RITENUTE));
if (in_valuta)
{
ritenute.normalize(sezione);
r.importo_in_lire(ritenute.valore());
}
else
r.importo(ritenute);
}
const TImporto abbuoni(row.importo(in_valuta, 0x2));
if (!abbuoni.is_zero())
{
TESSL_row& r = new_row(row, data, abbuoni, 2);
r.descrizione(form().describe(302));
r.descrizione(form().describe(PEC_ABBUONI));
if (in_valuta)
{
TImporto i(row.importo(FALSE, 0x2));
i.normalize(sezione);
r.importo_in_lire(i.valore());
TImporto il(row.importo(FALSE, 0x2));
il.normalize(sezione);
r.importo_in_lire(il.valore());
}
}
TImporto diffcam(row.importo(FALSE, 0x4));
if (!diffcam.is_zero())
{
TESSL_row& r = new_row(row, data, TImporto('D', ZERO), 3);
r.descrizione(form().describe(PEC_DIFFCAM));
if (in_valuta)
{
TESSL_row& r = new_row(row, data, TImporto('D', ZERO), 3);
r.descrizione(form().describe(303));
diffcam.normalize(sezione);
r.importo_in_lire(diffcam.valore());
}
else
{
TESSL_row& r = new_row(row, data, diffcam, 3);
r.descrizione(form().describe(303));
}
}
TImporto ritenute(row.importo(FALSE, 0x8));
if (!ritenute.is_zero())
{
if (in_valuta)
{
TESSL_row& r = new_row(row, data, TImporto('D', ZERO), 3);
r.descrizione(form().describe(304));
ritenute.normalize(sezione);
r.importo_in_lire(ritenute.valore());
}
else
{
TESSL_row& r = new_row(row, data, ritenute, 3);
r.descrizione(form().describe(304));
}
r.importo(diffcam);
}
}
}
@ -450,14 +494,33 @@ TESSL_array::TESSL_array(const TPartita& game, const TESSL_form* f)
TESSL_form * TESSL_form::_form = NULL;
void TESSL_form:: header_handler(TPrinter& pr)
void TESSL_form::stampa_testata(TPrinter& pr)
{
TPrint_section& head = _form->section('H');
head.reset();
pr.resetheader();
TPrint_section& head = section('H');
TForm_item& pagina = head.find_field(PEC_PAGINA);
TString16 pg; pg << int(pr.getcurrentpage());
pagina.set(pg);
head.update();
for (word j = 0; j < head.height(); j++) pr.setheaderline(j, head.row(j));
const word r = head.height()-1;
TPrintrow& head_row = head.row(r-1);
TPrint_section& body = section('B');
for (int f = body.fields()-1; f >= 0; f--)
{
// Leggi lo special e stampalo
TForm_item& fi = body.field(f);
if (fi.shown())
{
const int x = offset_x() + fi.x() - 1; // Le TPrintrow partono da 0, bestia!
head_row.put(fi.key(), x);
}
}
for (word j = 0; j <= r; j++)
pr.setheaderline(j, head.row(j));
}
static int tot_compare(const void* o1, const void* o2)
@ -465,42 +528,41 @@ 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());
}
void TESSL_form::footer_handler(TPrinter& pr)
word TESSL_form::ordina_totali_per_valuta(THash_object* tot[MAXTOT])
{
TPrint_section& foot = _form->section('F');
pr.resetfooter();
const word MAXTOT = 16;
THash_object* tot[MAXTOT];
// I totali sono in un assoc array disordinato per cui li copio in un array e li ordino
// alfabeticamente in base al loro codice valuta
TTotalizer& totali = _form->totali();
totali.restart();
TTotalizer& arr = totali();
arr.restart();
word num_rip = 0;
for (THash_object* obj = arr.get_hashobj();
num_rip < MAXTOT && obj != NULL;
obj = arr.get_hashobj())
tot[num_rip++] = obj;
qsort(tot, num_rip, sizeof(THash_object*), tot_compare);
return num_rip;
}
word numtot = 0;
for (THash_object* obj = totali.get_hashobj();
numtot < MAXTOT && obj != NULL;
obj = totali.get_hashobj())
tot[numtot++] = obj;
qsort(tot, numtot, sizeof(THash_object*), tot_compare);
void TESSL_form::stampa_riporti(TPrinter& pr)
{
THash_object* tot[MAXTOT];
_num_rip = ordina_totali_per_valuta(tot);
const word maxtot = foot.height() / _form->_footer_used;
if (numtot > maxtot)
numtot = maxtot;
const word maxtot = section('F').height() - 1;
if (_num_rip > maxtot)
_num_rip = maxtot;
const TString& riporto = _form->describe(301, 'F');
const TString& riporto = describe(PEC_RIPORTO);
TString desc(80);
TPrint_section& body = _form->section('B');
for (word j = 0; j < numtot; j++)
TPrint_section& body = section('B');
for (word j = 0; j < _num_rip; j++)
{
const word line = j * _form->_footer_used;
const TString& key = tot[j]->key();
TTotal& t = (TTotal&)(tot[j]->obj());
@ -510,13 +572,217 @@ void TESSL_form::footer_handler(TPrinter& pr)
TESSL_row rip(desc, t.importo().normalize());
rip.scaduto(t.scaduto());
rip.esposto(t.esposto());
rip.importo_in_lire(t.importo_lire());
rip.print_on(body);
for (int fl = 0; fl < _form->_footer_used; fl++)
pr.setfooterline(line, body.row(fl));
pr.setfooterline(j + 1, body.row(0));
}
}
int TESSL_form::find_magic(TString& s, TString& magic1, TString& magic2) const
{
const int pos = s.find('<', 0);
int end;
if (pos >= 0)
{
end = s.find('>', pos);
if (end > pos)
{
int p1 = pos+1;
magic1 = s.mid(p1, 2);
while (isalnum(s[p1])) p1++;
while (p1 < end && !isalnum(s[p1])) p1++;
if (p1 < end)
magic2 = s.mid(p1, 2);
else
magic2.cut(0);
}
else
end = s.len()-1;
const TString right(s.mid(end+1));
s.cut(pos); s << right;
}
return pos;
}
void TESSL_form::change_magic_body(const TESSL_row& row, TString& s)
{
TString magic1(4), magic2(4), val(50);
int pos;
while ((pos = find_magic(s, magic1, magic2)) >= 0)
{
val.cut(0);
if (magic1 == "PA" || magic2 == "PA")
{
val = row.descrizione();
if (val.empty())
val = causali().decode(row.causale());
}
if (magic1 == "MO" || magic2 == "MO")
{
val = movimenti().decode(row.num_reg());
}
s.insert(val, pos);
}
}
void TESSL_form::change_magic_footer(const THash_object& o, TString& s)
{
TString magic1(4), magic2(4), val(50);
int pos;
while ((pos = find_magic(s, magic1, magic2)) >= 0)
{
val.cut(0);
if (magic1 == "DA")
{
const TDate& d = magic2 == "SC" ? _dls : _dlo;
val = d.string();
}
if (magic1 == "VA")
val = o.key();
if (magic1 == "DE")
val = valute().decode(o.key());
s.insert(val, pos);
}
}
void TESSL_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_footer(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);
TPrint_section& body = section('B');
if (dare.x() <= 0 || avere.x() <= 0)
{
const TForm_item& bdare = body.find_field(PEC_DARE);
dare.x() = bdare.x();
const TForm_item& bavere = body.find_field(PEC_AVERE);
avere.x() = bavere.x();
}
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);
if (scaduto.x() <= 0)
{
const TForm_item& bscaduto = body.find_field(PEC_SCADUTO);
scaduto.x() = bscaduto.x();
}
scaduto.set(t.scaduto().string());
TForm_item& esposto = foot.find_field(PEC_ESPOSTO);
if (esposto.x() <= 0)
{
const TForm_item& besposto = body.find_field(PEC_ESPOSTO);
esposto.x() = besposto.x();
}
esposto.set(t.esposto().string());
TForm_item& implire = foot.find_field(PEC_IMPLIRE);
if (implire.x() <= 0)
{
const TForm_item& bimplire = body.find_field(PEC_IMPLIRE);
implire.x() = bimplire.x();
}
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 TESSL_form::stampa_pedata(TPrinter& pr)
{
THash_object* tot[MAXTOT];
word num_rip = ordina_totali_per_valuta(tot);
// 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;
for (word j = 0; j < num_rip; j++)
print_total(j*_total_rows+1, *tot[j]);
}
void TESSL_form::ultima_pagina()
{
set_last_page(TRUE);
}
void TESSL_form:: header_handler(TPrinter& pr)
{
pr.resetheader();
_form->stampa_testata(pr);
}
void TESSL_form::footer_handler(TPrinter& pr)
{
pr.resetfooter();
if (_form->page(pr) > 0) // Normal page
_form->stampa_riporti(pr);
else // Last page
_form->stampa_pedata(pr);
}
void TESSL_form::azzera_totali()
{
totali().destroy(); // Azzera tutti i riporti
_num_rip = 0; // Azzera il numero di righe di riporto
set_last_page(FALSE); // Azzera il flag di ultima pagina di stampa
TPrint_section& foot = section('F');
printer().footerlen(foot.height());
}
bool TESSL_form::print_game(const TPartita& game)
{
@ -530,7 +796,7 @@ bool TESSL_form::print_game(const TPartita& game)
TPrint_section& body = section('B');
TImporto saldo;
real scaduto, esposto;
real scaduto, esposto, implire;
// Stampa le righe di partita
@ -542,12 +808,20 @@ bool TESSL_form::print_game(const TPartita& game)
TESSL_row& riga = righe.row(r);
if (pr.rows_left() < body.height())
{
pr.formfeed();
for (word nr = 0; nr < _num_rip; nr++)
{
TPrintrow* fl = pr.getfooterline(nr);
CHECKD(fl, "Manca la riga di riporto ", nr);
pr.print(*fl);
}
}
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;
@ -555,11 +829,12 @@ bool TESSL_form::print_game(const TPartita& game)
pr.print(body.row(0));
totali().add(riga.importo(), riga.scaduto(), riga.esposto(),
ZERO, riga.valuta().codice());
riga.importo_in_lire(), riga.valuta().codice());
saldo += riga.importo();
scaduto += riga.scaduto();
esposto += riga.esposto();
implire += riga.importo_in_lire();
ok = TRUE;
}
@ -567,9 +842,10 @@ bool TESSL_form::print_game(const TPartita& game)
{
saldo.normalize();
TESSL_row sld(describe(301), saldo);
TESSL_row sld(describe(PEC_SALDO), saldo);
sld.scaduto(scaduto);
sld.esposto(esposto);
sld.importo_in_lire(implire);
sld.print_on(body);
pr.print(body.row(0));
@ -580,24 +856,55 @@ bool TESSL_form::print_game(const TPartita& game)
return ok;
}
const TString& TESSL_form::describe(short id, char sez) const
const TString& TESSL_form::describe(short id, char sez, pagetype pt) const
{
const TForm_item& fi = find_field(sez, odd_page, id);
const TForm_item& fi = find_field(sez, pt, id);
return fi.prompt();
}
TESSL_form::TESSL_form(const TESSL_mask& m, short id_datalim, short id_datascad,
void TESSL_form::init_header(const TMask& m)
{
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);
f.put("TIPOPROF", name());
f.put("CODPROF", code());
f.put("SEZ", "H");
f.put("ID", PEC_MEMO);
const int err = f.read();
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
}
}
TESSL_form::TESSL_form(const TESSL_mask& m, bool gesval, short id_datalim, short id_datascad,
short id_giorni_rischio)
:TForm(BASE_EC_PROFILE, m.get_prof_code()),
_causali(LF_CAUSALI, CAU_CODCAUS, CAU_DESCR)
:TForm(BASE_EC_PROFILE, m.get_prof_name()),
_in_valuta(FALSE), _num_rip(0), _total_rows(0),
_causali(LF_CAUSALI, CAU_CODCAUS, CAU_DESCR),
_movimenti(LF_MOV, MOV_NUMREG, MOV_DESCR),
_valute("%VAL"), _giorni_rischio(0)
{
_form = this;
TForm_item& imp_lire = find_field('B', odd_page, PEC_IMPLIRE);
_in_valuta = imp_lire.shown(); // Il profilo e' in valuta se c'e' la colonna importo in lire
_lingua = m.get_prof_lang();
_who = m.get_who();
TCursor_sheet& cs = m.cur_sheet();
_cursore = cs.cursor();
@ -615,18 +922,29 @@ TESSL_form::TESSL_form(const TESSL_mask& m, short id_datalim, short id_datascad,
TPrinter& pr = printer();
pr.setheaderhandler(header_handler);
pr.headerlen(section('H').height());
TPrint_section& head = section('H');
pr.headerlen(head.height());
TForm_item& flags = find_field('H', last_page, 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(footer_handler);
pr.footerlen(section('F').height());
const TPrint_section& foot = section('F');
pr.footerlen(foot.height());
for (int i = foot.fields()-1; i >= 0; i--)
_total_rows = 1;
for (word fi = 0; fi < foot.fields(); fi++)
{
TForm_item& fi = foot.field(i);
if (fi.y() > _footer_used)
_footer_used = fi.y();
const TForm_item& item = foot.field(fi);
if (item.shown())
{
const word y = (word)item.y();
if (y > _total_rows)
_total_rows = y;
}
}
}
@ -637,3 +955,5 @@ TESSL_form::~TESSL_form()
pr.setfooterhandler(NULL);
_form = NULL;
}

View File

@ -31,12 +31,14 @@ protected:
public:
const char *get_prof_base() const;
const TString &get_prof_code() const;
const char *get_prof_name() const;
const TString &get_prof_lang() const;
TESSL_mask(const char *name);
virtual ~TESSL_mask();
};
class TESSL_form;
///////////////////////////////////////////////////////////
// TESSL_row
///////////////////////////////////////////////////////////
@ -54,6 +56,7 @@ class TESSL_row : public TSortable
TDate _data_doc; // Data del documento
TString _num_doc; // Numero documento
long _num_prot; // Protocollo IVA
long _num_reg; // Numero registrazione
TImporto _importo; // Importo in valuta
real _importo_lire; // Importo in lire
real _scaduto; // Importo scaduto
@ -66,11 +69,13 @@ protected: // TSortable
virtual int compare(const TSortable& s) const;
void set_imp(TForm_item& fi, const real& imp, bool valuta) const;
TESSL_form& form() const;
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 scaduto(const real& s) { _scaduto = s; }
@ -78,12 +83,16 @@ public:
void importo_in_lire(const real& il) { _importo_lire = il; }
void salvo_buon_fine(bool sbf) { _salvo_buon_fine = sbf; }
const TString& causale() const { return _causale; }
const TString& descrizione() const { return _descrizione; }
long num_reg() const { return _num_reg; }
const TValuta& valuta() const { return _valuta; }
const TImporto& importo() const { return _importo; }
real importo_in_lire() const { return _importo_lire; }
real scaduto() const { return _scaduto; }
real esposto() const { return _esposto; }
const TDate& data() const { return _data; }
bool in_valuta() const { return _valuta.in_valuta(); }
void print_on(TPrint_section& body);
@ -98,26 +107,48 @@ public:
class TESSL_form : public TForm
{
friend class TESSL_row;
static TESSL_form* _form;
enum { MAXTOT = 16 };
TCursor* _cursore;
TTotalizer _totali;
TDecoder _causali; // Decodoficatore dei codici causale
TDecoder _causali; // Decodificatore dei codici causale
TDecoder _valute; // Decodificatore dei codici valuta
TDecoder _movimenti; // Decodificatore delle descrizioni dei movimenti
TString _lingua;
TDate _dlo, _dls, _dir;
int _giorni_rischio;
bool _in_valuta;
int _footer_used; // Numero di righe per ogni valuta del footer
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
char _who;
protected:
void init_header(const TMask& m);
word ordina_totali_per_valuta(THash_object* tot[MAXTOT]);
int find_magic(TString& s, TString& magic1, TString& magic2) const;
void change_magic_body(const TESSL_row& o, TString& s);
void change_magic_footer(const THash_object& o, TString& s);
void print_total(int riga, const THash_object& o);
void stampa_testata(TPrinter& p);
void stampa_pedata(TPrinter& p);
void stampa_riporti(TPrinter& p);
static void header_handler(TPrinter& p);
static void footer_handler(TPrinter& p);
public:
TTotalizer& totali() { return _totali; }
TDecoder& causali() { return _causali; }
TDecoder& valute() { return _valute; }
TDecoder& movimenti() { return _movimenti; }
const TDate& data_limite_operazione() const { return _dlo; }
const TDate& data_limite_scaduto() const { return _dls; }
@ -126,12 +157,14 @@ public:
const TString& lingua() const { return _lingua; }
bool in_valuta() const { return _in_valuta; }
const TString& describe(short id, char sez = 'B') const;
const TString& describe(short id, char sez = 'H', pagetype pt = last_page) const;
const char sezione_normale() const { return _who == 'C' ? 'D' : 'A' ; }
void azzera_totali();
void ultima_pagina();
virtual bool print_game(const TPartita& game);
TESSL_form(const TESSL_mask& m, short id_datalim, short id_datascad = 0, short id_giorni_rischio = 0);
TESSL_form(const TESSL_mask& m, bool gesval, short id_datalim, short id_datascad = 0, short id_giorni_rischio = 0);
virtual ~TESSL_form();
};

View File

@ -20,7 +20,7 @@ TSol_mask::~TSol_mask() {}
bool TSol_mask::get_sel_tot_saldo() const
{
return get_bool(F_RIFIMPMIN);
return get(F_RIFIMPMIN) == "C";
}
real TSol_mask::get_sel_importo() const
@ -48,8 +48,8 @@ TSol_row::TSol_row(const char* desc, const TImporto& imp)
// TSol_form: form speciale per solleciti
///////////////////////////////////////////////////////////
TSol_form::TSol_form(const TSol_mask& m, short id_datalim)
:TESSL_form(m, id_datalim)
TSol_form::TSol_form(const TSol_mask& m, bool gesval, short id_datalim)
:TESSL_form(m, gesval, id_datalim)
{
_sel_tot_saldo = m.get_sel_tot_saldo();

View File

@ -61,7 +61,7 @@ protected:
public:
bool get_sel_tot_saldo() const { return _sel_tot_saldo;}
const real & get_sel_importo() const { return _sel_importo; }
TSol_form(const TSol_mask& m, short id_datalim);
TSol_form(const TSol_mask& m, bool gesval, short id_datalim);
virtual ~TSol_form() {}
};

View File

@ -28,6 +28,13 @@ TSelection_mask::TSelection_mask(const char* name)
_for_sh_k2 = new TCursor_sheet(_for_cur_k2, " |RAGSOC|CODCF", "Selezione fornitori per ragione sociale",
"@1|Ragione Sociale@50|Codice");
}
else
{
_for_cur_k1 = NULL;
_for_cur_k2 = NULL;
_for_sh_k1 = NULL;
_for_sh_k2 = NULL;
}
set_handler(SC_CLIFO, rclifo_handler);
set_handler(SC_SORTCF, rsortcf_handler);
@ -37,14 +44,21 @@ TSelection_mask::TSelection_mask(const char* name)
set_handler(SC_RESET, breset_handler);
set_handler(SC_CFCODFR, ffrom_handler);
set_handler(SC_CFCODTO, fto_handler);
set_handler(SC_CFDESFR, fdfrom_handler);
set_handler(SC_CFDESTO, fdto_handler);
set_handler(SC_CFDESBUTFR, bdfrom_handler);
set_handler(SC_CFDESBUTTO, bdto_handler);
}
TSelection_mask::~TSelection_mask()
{
if (_for_sh_k1 != NULL)
{
delete _for_sh_k2;
delete _for_sh_k1;
delete _for_cur_k2;
delete _for_cur_k1;
}
delete _cli_sh_k2;
delete _cli_sh_k1;
@ -82,6 +96,8 @@ void TSelection_mask::reset_sheets()
}
reset(SC_CFCODFR);
reset(SC_CFCODTO);
reset(SC_CFDESFR);
reset(SC_CFDESTO);
reset(SC_NSEL);
}
@ -134,15 +150,68 @@ void TSelection_mask::select_clifo_range(long from, long to)
else
c.uncheck(i);
if (cod == from) cod1ok = TRUE;
if (cod == to) cod2ok = TRUE;
// if (cod == from) cod1ok = TRUE;
// if (cod == to) cod2ok = TRUE;
}
if (!cod1ok) from = firs;
if (!cod2ok) to = last;
if (get(SC_CFCODFR).not_empty())
// if (!cod1ok)
set(SC_CFCODFR, firs);
if (get(SC_CFCODTO).not_empty())
// if (!cod2ok)
set(SC_CFCODTO, last);
set(SC_CFCODFR, from);
set(SC_CFCODTO, to);
set(SC_NSEL, c.checked());
}
void TSelection_mask::select_des_clifo_range(const TString& from, const TString & to)
{
TCursor_sheet& c = cur_sheet();
const long items = c.items();
const int key = get_key();
CHECK(key == 2, "La chiave deve essere la 2");
TString s_from(from), s_to(to);
if (s_to.empty() && items)
s_to = c.row(items-1).get(1);
s_from.upper();
s_to.upper();
if (s_from > s_to) // Controlla limiti
{
const TString tmp(s_to);
s_to = s_from;
s_from = tmp;
set(SC_CFDESFR, to);
set(SC_CFDESTO, from);
}
TString last;
TString firs;
for (long i = 0; i < items; i++)
{
TToken_string& tt = c.row(i);
TString s(tt.get(1));
s.upper();
const bool add = s_from <= s && s_to >= s;
if (add)
{
c.check(i);
if (firs.empty())
firs = tt.get(1);
last = tt.get(1);
}
else
c.uncheck(i);
}
if (get(SC_CFDESFR).not_empty())
set(SC_CFDESFR, firs);
if (get(SC_CFDESTO).not_empty())
set(SC_CFDESTO, last);
set(SC_NSEL, c.checked());
}
@ -176,6 +245,37 @@ void TSelection_mask::set_clifo_limits()
set(SC_NSEL, nsel);
}
void TSelection_mask::set_des_clifo_limits()
{
TString first, last;
long nsel = 0;
TCursor_sheet& c = cur_sheet();
const long items = c.items();
const int key = get_key();
CHECK(key == 2, "La chiave deve essere la 2");
for (int i = 0; i < items; i++) if (c.checked(i))
{
TToken_string& t = c.row(i);
const TString des(t.get(1));
if (first.empty())
{
first = last = des;
}
else
{
if (first > des) first = des;
if (last < des) last = des;
}
nsel++;
}
set(SC_CFDESFR, first);
set(SC_CFDESTO, last);
set(SC_NSEL, nsel);
}
// handlers
bool TSelection_mask::bfrom_handler(TMask_field& f, KEY k)
{
@ -255,6 +355,85 @@ bool TSelection_mask::fto_handler(TMask_field& f, KEY k)
return TRUE;
}
bool TSelection_mask::bdfrom_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE)
{
TSelection_mask& m = (TSelection_mask&)f.mask();
TCursor_sheet& c = m.cur_sheet();
c.disable_check();
if (c.run() == K_ENTER)
{
TToken_string& t = c.row(c.selected());
const TString des1(t.get(3 - m.get_key()));
const TString des2 = m.get(SC_CFDESTO);
m.set(SC_CFDESFR, des1);
m.select_des_clifo_range(des1, des2);
}
}
return TRUE;
}
bool TSelection_mask::bdto_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE)
{
TSelection_mask& m = (TSelection_mask&)f.mask();
TCursor_sheet& c = m.cur_sheet();
c.disable_check();
if (c.run() == K_ENTER)
{
TToken_string& t = c.row(c.selected());
const TString des1(m.get(SC_CFDESFR));
const TString des2(t.get(3 - m.get_key()));
m.set(SC_CFDESTO, des2);
m.select_des_clifo_range(des1, des2);
}
}
return TRUE;
}
bool TSelection_mask::fdfrom_handler(TMask_field& f, KEY k)
{
TSelection_mask& m = (TSelection_mask&)f.mask();
if (k == K_TAB && f.focusdirty())
{
const TString des1(f.get());
const TString des2(m.get(SC_CFDESTO));
m.select_des_clifo_range(des1, des2);
}
else
if (k == K_F9)
{
TMask_field& f = m.field(SC_CFDESBUTFR);
f.on_hit();
}
return TRUE;
}
bool TSelection_mask::fdto_handler(TMask_field& f, KEY k)
{
TSelection_mask& m = (TSelection_mask&)f.mask();
if (k == K_TAB && f.focusdirty())
{
const TString des2(f.get());
const TString des1(m.get(SC_CFDESFR));
m.select_des_clifo_range(des1, des2);
}
else
if (k == K_F9)
{
TMask_field& f = m.field(SC_CFDESBUTTO);
f.on_hit();
}
return TRUE;
}
bool TSelection_mask::breset_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE)
@ -273,6 +452,9 @@ bool TSelection_mask::bselect_handler(TMask_field& f, KEY k)
TCursor_sheet& c = m.cur_sheet();
c.enable_check();
c.run();
if (m.get_key() == 2)
m.set_des_clifo_limits();
else
m.set_clifo_limits();
}
return TRUE;

View File

@ -38,7 +38,9 @@ protected: // TMask
protected:
void select_clifo_range(long from, long to);
void select_des_clifo_range(const TString & from, const TString & to);
void set_clifo_limits();
void set_des_clifo_limits();
void set_who(char w) { _who = w; }
void set_key (int k) { _key = k; }
@ -54,6 +56,10 @@ protected:
static bool bselect_handler(TMask_field& f, KEY k);
static bool rclifo_handler(TMask_field& f, KEY k);
static bool rsortcf_handler(TMask_field& f, KEY k);
static bool bdfrom_handler(TMask_field& f, KEY k);
static bool bdto_handler(TMask_field& f, KEY k);
static bool fdfrom_handler(TMask_field& f, KEY k);
static bool fdto_handler(TMask_field& f, KEY k);
public:
TCursor_sheet& cur_sheet() const;

View File

@ -21,6 +21,8 @@
#define SC_PCONCODTO3 318
#define SC_PCONBUTFR 319
#define SC_PCONBUTTO 320
#define SC_CFDESBUTFR 319
#define SC_CFDESBUTTO 320
#define BASE_EC_PROFILE "PEC"