Files correlati : ve0.exe ve0300a.ini ve0100a.msk ve0200g.msk ve1300.alx ve1.exe ve17001.rep ve17002.rep ve1700a.msk ve1700a.msk ve2.exe ve6.exe ve61000a.msk ve17001.rep ve17002.rep ve17002.rep ve17001.rep ve1700a.msk ve6b00a.msk MODIFICHE CRPA Se si mette il flag P sulla data documento della maschera di un tipo documento viene proposta l’ultima data inserita. Possibilità di impostare il numero di copie nell’inserimento/modifica di un documento. Righe documento massime 10000 Aggiunta ricerca per riferimento cliente (ricerca alternativa). Aggiunto indirizzo cliente/fornitore sulla ricerca documenti. Lista documenti avanzata (report). Aggiunte le regolarizzazioni nella contabilizzazione documenti Sistema abilitazione della data registrazione in contabilizzazione documenti Aggiunta la possibilità di usare campi del documento nella dicitura del riferimento. Gestiti i movimenti di sola iva in contabilizzazione. Riferimento per mese nelle partite. Ordinamento per documento nell’evasione ordini con un flag in configurazione Impostato il tipo CF in base al tipo documento Aggiunto il messaggio cliente alla stampa report delle vendite git-svn-id: svn://10.65.10.50/branches/R_10_00@24024 c028cbd2-c16b-5b4b-a496-9718f37d4682
483 lines
13 KiB
C++
483 lines
13 KiB
C++
// freeze
|
|
// valuta
|
|
// output
|
|
// librerie
|
|
// 99999
|
|
//////////////////////////////////////////////////////////////
|
|
// Stampa documenti
|
|
//////////////////////////////////////////////////////////////
|
|
|
|
#include <applicat.h>
|
|
#include <automask.h>
|
|
#include <config.h>
|
|
|
|
#include <defmask.h>
|
|
#include <progind.h>
|
|
#include <reprint.h>
|
|
#include <sheet.h>
|
|
#include <toolfld.h>
|
|
|
|
#include "velib07.h"
|
|
#include "sconti.h"
|
|
#include "ve1700.h"
|
|
|
|
#include <comuni.h>
|
|
#include <nditte.h>
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
// classe TListaDoc_application customizzata dalla TApplication per l'applicazione principale
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class TStampa_lista_docs_mask : public TAutomask
|
|
{
|
|
TCursor_sheet _clifo;
|
|
|
|
protected:
|
|
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
|
|
public:
|
|
TCursor_sheet & clifo() { return _clifo; }
|
|
long select_cod_range(long from, long to);
|
|
void reset_choices();
|
|
void set_choice_limits();
|
|
void build_clifo_list();
|
|
TStampa_lista_docs_mask();
|
|
virtual ~TStampa_lista_docs_mask() {}
|
|
};
|
|
|
|
long TStampa_lista_docs_mask::select_cod_range(long from, long to)
|
|
{
|
|
TWait_cursor hourglass;
|
|
if (from < 0L)
|
|
from = _clifo.row(_clifo.selected()).get_long(1);
|
|
if (to < 0L)
|
|
to = _clifo.row(_clifo.selected()).get_long(1);
|
|
else
|
|
if (to == 0L)
|
|
to = 999999L;
|
|
|
|
for (int i = 0; i < _clifo.items(); i++)
|
|
{
|
|
TToken_string& c = _clifo.row(i);
|
|
|
|
const long cod = c.get_long(1);
|
|
if (cod >= from && cod <= to)
|
|
_clifo.check(i);
|
|
else
|
|
_clifo.uncheck(i);
|
|
}
|
|
set_choice_limits();
|
|
return _clifo.checked();
|
|
}
|
|
|
|
void TStampa_lista_docs_mask::set_choice_limits()
|
|
{
|
|
long first = 999999L, last = -1L;
|
|
|
|
for (int i = 0; i < _clifo.items(); i++)
|
|
{
|
|
if (_clifo.checked(i))
|
|
{
|
|
const long cf = _clifo.row(i).get_long(1);
|
|
if (first > cf)
|
|
first = cf;
|
|
if (last < cf)
|
|
last = cf;
|
|
}
|
|
}
|
|
if (first != -1)
|
|
set(F_CODFR, first);
|
|
if (last != -1)
|
|
set(F_CODTO, last);
|
|
set(F_SELECTED, _clifo.checked());
|
|
}
|
|
|
|
void TStampa_lista_docs_mask::build_clifo_list()
|
|
{
|
|
// Semplice ed efficace
|
|
TRectype rec(LF_CLIFO);
|
|
rec.put(CLI_TIPOCF, get(F_TIPOCF));
|
|
_clifo.cursor()->setregion(rec, rec);
|
|
}
|
|
|
|
void TStampa_lista_docs_mask::reset_choices()
|
|
{
|
|
reset(F_SELECTED);
|
|
reset(F_CODFR);
|
|
reset(F_CODTO);
|
|
_clifo.check(-1, false);
|
|
}
|
|
|
|
bool TStampa_lista_docs_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
switch (o.dlg())
|
|
{
|
|
case F_TIPOCF:
|
|
if (e == fe_modify)
|
|
{
|
|
TWait_cursor hourglass;
|
|
reset_choices();
|
|
build_clifo_list();
|
|
}
|
|
break;
|
|
case F_CODFR :
|
|
if (e == fe_button)
|
|
{
|
|
_clifo.disable_check();
|
|
_clifo.disable(DLG_USER);
|
|
if (_clifo.run() == K_ENTER)
|
|
select_cod_range(-1, o.mask().get_long(F_CODTO));
|
|
_clifo.enable(DLG_USER);
|
|
}
|
|
else
|
|
if (e == fe_modify)
|
|
select_cod_range(o.get_long(), o.mask().get_long(F_CODTO));
|
|
break;
|
|
case F_CODTO :
|
|
if (e == fe_button)
|
|
{
|
|
_clifo.disable_check();
|
|
_clifo.disable(DLG_USER);
|
|
if (_clifo.run() == K_ENTER)
|
|
select_cod_range(o.mask().get_long(F_CODFR), -1);
|
|
_clifo.enable(DLG_USER);
|
|
}
|
|
else
|
|
if (e == fe_modify)
|
|
select_cod_range(o.mask().get_long(F_CODFR), o.get_long());
|
|
break;
|
|
case BUT_SEL:
|
|
if (e == fe_button)
|
|
{
|
|
_clifo.enable_check();
|
|
if (_clifo.run() == K_ENTER)
|
|
set_choice_limits();
|
|
}
|
|
break;
|
|
case BUT_ANN:
|
|
if (e == fe_button)
|
|
reset_choices();
|
|
break;
|
|
case 102:
|
|
if (e == fe_button)
|
|
{
|
|
TSheet_field & s = sfield(F_SHEETNUMS);
|
|
TToken_string & row = s.row(s.selected());
|
|
TArray_sheet as(-1,-1,70,20,TR("Tipi documento"),HR("Codice|Descrizione@50")); //costruisce uno sheet di selezione dei tipi doc
|
|
|
|
const TCodice_numerazione& cn = cached_numerazione(row.get(1));
|
|
for (int t = cn.ntipi_doc()-1; t >= 0; t--)
|
|
{
|
|
const TString4 tipodoc = cn.tipo_doc(t);
|
|
TToken_string row; //classica token_string con codice e descrizione del tipodoc: questa viene scelta nella tabella
|
|
row.add(tipodoc); //dei tipi docs %TIP
|
|
row.add(cache().get("%TIP", tipodoc, "S0"));
|
|
as.add(row); //..e viene aggiunta allo sheet di selezione
|
|
}
|
|
if (as.run() != K_ESC)
|
|
{
|
|
TToken_string& riga = as.row(-1); //setta sul campo a maschera il codice della riga selezionata di as
|
|
o.set(riga.get(0));
|
|
}
|
|
}
|
|
else
|
|
if (e == fe_close && o.get().full())
|
|
{
|
|
TSheet_field & s = sfield(F_SHEETNUMS);
|
|
TToken_string & row = s.row(s.selected());
|
|
const TCodice_numerazione& cn = cached_numerazione(row.get(s.cid2index(101)));
|
|
for (int t = cn.ntipi_doc()-1; t >= 0; t--)
|
|
{
|
|
const TString& tipodoc = cn.tipo_doc(t);
|
|
if (tipodoc == o.get())
|
|
return true;
|
|
}
|
|
return o.error_box(FR("Tipo documento non valido per la numerazione %s"), (const char*)cn.codice());
|
|
}
|
|
break;
|
|
default: break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
TStampa_lista_docs_mask::TStampa_lista_docs_mask()
|
|
: TAutomask("ve1700a"),
|
|
_clifo(new TCursor(new TRelation(LF_CLIFO)),
|
|
" |CODCF|RAGSOC", TR("Selezione Clienti/Fornitori"),
|
|
HR("@1|Codice@6R|Descrizione@50"), 0, 1)
|
|
{
|
|
((TButton_tool&)field(DLG_PREVIEW)).set_exit_key('A');
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TLista_documenti_recordset
|
|
///////////////////////////////////////////////////////////
|
|
static void add_term(TString & expr, const char * term1, const char * op, const char * term2,
|
|
const bool string = true, const bool and = true, const bool is_string = true)
|
|
{
|
|
if (expr.full())
|
|
expr << (and ? "&&" : "||");
|
|
if (is_string)
|
|
{
|
|
if (!string)
|
|
expr << "STR";
|
|
}
|
|
else
|
|
if (string)
|
|
expr << "VAL";
|
|
expr << '(' << term1 << op << term2 << ')';
|
|
}
|
|
|
|
static void add_expr(TString & expr, const char * subexpr, const bool string = true,
|
|
const bool and = true, const bool is_string = true)
|
|
{
|
|
if (subexpr && *subexpr)
|
|
{
|
|
if (expr.full())
|
|
expr << (and ? "&&" : "||");
|
|
if (is_string)
|
|
{
|
|
if (!string)
|
|
expr << "STR";
|
|
}
|
|
else
|
|
if (string)
|
|
expr << "VAL";
|
|
expr << '(' << subexpr << ')';
|
|
}
|
|
}
|
|
static const char * stringify(TString & s)
|
|
{
|
|
s.insert("\"");
|
|
s << '"';
|
|
return s;
|
|
}
|
|
|
|
class TLista_documenti_recordset : public TDocument_recordset
|
|
{
|
|
TStampa_lista_docs_mask * _m;
|
|
static TAssoc_array _clifo_sel; // Assoc array con solo i cli/fo selezionati. Facilita il filter...
|
|
|
|
protected:
|
|
virtual TCursor* cursor() const;
|
|
static bool filter_clifo(const TRelation* r);
|
|
|
|
public:
|
|
|
|
TLista_documenti_recordset(const char* use, TStampa_lista_docs_mask * m) : TDocument_recordset(use), _m(m) {}
|
|
virtual ~TLista_documenti_recordset() { }
|
|
};
|
|
|
|
TAssoc_array TLista_documenti_recordset::_clifo_sel; // Assoc array con solo i cli/fo selezionati. Facilita il filter...
|
|
|
|
bool TLista_documenti_recordset::filter_clifo(const TRelation* r)
|
|
{
|
|
const long codcf = r->curr().get_long(CLI_CODCF);
|
|
TString8 key; key.format("%06ld", codcf);
|
|
return _clifo_sel.is_key(key);
|
|
}
|
|
|
|
TCursor* TLista_documenti_recordset::cursor() const
|
|
{
|
|
const bool to_create = !valid_cursor();
|
|
TCursor * cur = TDocument_recordset::cursor();
|
|
|
|
if (to_create && cur != NULL)
|
|
{
|
|
TStampa_lista_docs_mask & m = *_m;
|
|
TCursor_sheet & clifo = m.clifo();
|
|
|
|
cur->setkey(3);
|
|
((TLista_documenti_recordset *) this)->set_firmval(m.get_int(F_SELVAL) == 3);
|
|
// Compone la lista dei clienti/forntitori selezionati
|
|
_clifo_sel.destroy();
|
|
TString16 key;
|
|
const long items = clifo.items();
|
|
for (long i = 0L; i<items; i++)
|
|
if (clifo.checked(i))
|
|
{
|
|
key.format("%06ld", clifo.row(i).get_long(1)); // Formatta il codice
|
|
_clifo_sel.add(key, NULL);
|
|
}
|
|
cur->set_filterfunction(clifo.checked() > 0 ? filter_clifo : NULL);
|
|
// NB: se _clifo_sel non contiene nulla, non viene effettuato alcun filter su CLI/FO (non setta la funzione!!)
|
|
|
|
TString filter(cur->filter());
|
|
TString val = m.get(F_TIPOCF);
|
|
const int selval = m.get_int(F_SELVAL);
|
|
|
|
::add_term(filter, DOC_TIPOCF, "==", stringify(val));
|
|
val = m.get(F_ANNO);
|
|
::add_term(filter, DOC_ANNO, "==", stringify(val));
|
|
val = m.get(F_PROVV);
|
|
::add_term(filter, DOC_PROVV, "==", stringify(val));
|
|
if (selval == 1) //In Lire
|
|
{
|
|
TString16 firm_val(TCurrency::get_firm_val());
|
|
|
|
if (firm_val.full())
|
|
::add_term(filter, "(" DOC_CODVAL, "==", stringify(firm_val));
|
|
::add_term(filter, DOC_CODVAL, "==", "\"\")", true, false);
|
|
}
|
|
else
|
|
if (selval == 2) // nella valuta specificata
|
|
{
|
|
val = m.get(F_VALUTA);
|
|
::add_term(filter, DOC_CODVAL, "==", stringify(val));
|
|
}
|
|
|
|
// Compone l'espressione filter...
|
|
// prende tutte le righe dello spreasheet che non sono totalmente vuote:
|
|
// (CODNUM=="xxx"&&(STATO=="x"||STATO=="y"||STATO=="z"...)) ---> questo per una singola riga...
|
|
// se vi sono piu' righe, lo si ripete aggiungendo prima un bellissimo "||"
|
|
TSheet_field& sf = m.sfield(F_SHEETNUMS);
|
|
const int rows = sf.items();
|
|
TString docfilter;
|
|
TString from_num("ZZZZ");
|
|
TString to_num;
|
|
|
|
for (int j=0; j<rows; j++)
|
|
{
|
|
TToken_string& riga = sf.row(j);
|
|
|
|
if (riga.empty())
|
|
break;
|
|
|
|
TString16 str(riga.get(0));
|
|
TString statofilter;
|
|
|
|
if (str.full())
|
|
{
|
|
::add_term(docfilter, DOC_CODNUM, "==", stringify(str));
|
|
if (from_num > str)
|
|
from_num = str;
|
|
if (to_num < str)
|
|
to_num = str;
|
|
}
|
|
str = riga.get();
|
|
if (str.full())
|
|
::add_term(docfilter, DOC_TIPODOC, "==", stringify(str));
|
|
|
|
for (int k = 2; k <= 7; k++) // Famme vede' li stati generali... Aho' A BURINO! Che e' la Rivoluzione Francese?
|
|
{
|
|
TString4 c = riga.get(k);
|
|
|
|
if (c.full())
|
|
::add_term(statofilter, DOC_STATO, "==", stringify(c), true, false);
|
|
}
|
|
::add_expr(docfilter, statofilter);
|
|
}
|
|
::add_expr(filter, docfilter);
|
|
|
|
TRectype from(LF_DOC);
|
|
TRectype to(from);
|
|
TDate da = m.get_date(F_DA_DATADOC);
|
|
TDate a = m.get_date(F_A_DATADOC);
|
|
const int anno = m.get_int(F_ANNO);
|
|
|
|
if (!da.ok())
|
|
da = TDate(1, 1, anno);
|
|
if (!a.ok())
|
|
a = TDate(31, 12, anno);
|
|
from.put(DOC_DATADOC, da);
|
|
to.put(DOC_DATADOC, a);
|
|
val = m.get(F_ANNO);
|
|
from.put(DOC_ANNO, val);
|
|
to.put(DOC_ANNO, val);
|
|
val = m.get(F_PROVV);
|
|
from.put(DOC_PROVV, val);
|
|
to.put(DOC_PROVV, val);
|
|
from.put(DOC_CODNUM, from_num);
|
|
to.put(DOC_CODNUM, to_num);
|
|
cur->freeze(false);
|
|
cur->setregion(from, to);
|
|
cur->setfilter(filter);
|
|
const TRecnotype it = cur->items();
|
|
cur->freeze();
|
|
if (it > 0L)
|
|
*cur = 0L;
|
|
}
|
|
return cur;
|
|
}
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
// classe TListaDoc_application customizzata dalla TApplication per l'applicazione principale
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
// Chiavi di ordinamento LF_DOC:
|
|
// Chiave 1: ordinamento per Provvisorio + Anno + Codice numerazione + Numero documento
|
|
// Chiave 3: ordinamento per Data documento + Provvisorio + Anno + Codice numerazione + Numero documento
|
|
|
|
class TLista_documenti_report : public TDocument_report
|
|
{
|
|
/* TString _codnum; // codice di numerazione
|
|
char _provv; // stampa documenti provvisiori o definitivi (D o P)
|
|
int _anno; // anno della documentazione
|
|
int _ncopie; // numero di copie per ogni documento
|
|
long _dalnum, _alnum; // estremi di numerazione dei documenti
|
|
TDate _dadata, _adata; // estremi di data dei documenti */
|
|
TStampa_lista_docs_mask * _m;
|
|
|
|
|
|
protected:
|
|
bool set_recordset(const TString& query);
|
|
|
|
public:
|
|
TLista_documenti_report(TStampa_lista_docs_mask * m) : _m(m) {}
|
|
};
|
|
|
|
bool TLista_documenti_report::set_recordset(const TString& query)
|
|
{
|
|
return TReport::set_recordset(new TLista_documenti_recordset(query, _m));
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
// classe TListaDoc_application customizzata dalla TApplication per l'applicazione principale
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
class TListaDoc_application: public TSkeleton_application
|
|
{
|
|
protected:
|
|
virtual bool create();
|
|
virtual void main_loop();
|
|
|
|
public:
|
|
TListaDoc_application() {};
|
|
virtual ~TListaDoc_application() {};
|
|
};
|
|
|
|
bool TListaDoc_application::create()
|
|
{
|
|
return TSkeleton_application::create();
|
|
}
|
|
|
|
void TListaDoc_application::main_loop()
|
|
{
|
|
TStampa_lista_docs_mask m;
|
|
TLista_documenti_report report(&m);
|
|
|
|
m.set(F_REPORT, "ve17001");
|
|
|
|
while (m.run() != K_QUIT)
|
|
{
|
|
TReport_book book;
|
|
TFilename report_name = m.get(F_REPORT);
|
|
|
|
if (report_name.blank())
|
|
report_name = "ve17001";
|
|
report.load(report_name);
|
|
book.add(report);
|
|
if (book.pages() > 0)
|
|
book.print_or_preview();
|
|
}
|
|
}
|
|
|
|
// Do all the work!
|
|
int ve1700(int argc, char* argv[])
|
|
{
|
|
TListaDoc_application a;
|
|
a.run(argc, argv, TR("Lista documenti"));
|
|
return 0;
|
|
} |