Aggiunta stampa lista documenti.

git-svn-id: svn://10.65.10.50/trunk@4190 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1997-03-10 14:51:08 +00:00
parent 870b4c965f
commit a20f793f78
4 changed files with 321 additions and 66 deletions

208
ve/listadoc.frm Executable file
View File

@ -0,0 +1,208 @@
USE 33
JOIN %TIP TO 33 INTO CODTAB==TIPODOC
END
DESCRIPTION
BEGIN
33->* "Documenti di vendita"
20->* "Clienti/Fornitori"
%TIP->* "Tabella tipi documento"
END
GENERAL
BEGIN
OFFSET 0 0
FONT "Courier New"
SIZE 12
END
SECTION HEADER ODD 6
STRINGA 1 40 1
BEGIN
KEY "nome ditta"
PROMPT 1 1 "Ditta "
MESSAGE _DITTA, !RAGSOC
END
STRINGA 2 10
BEGIN
KEY "Data"
PROMPT 120 1 "Data "
MESSAGE _DATA
END
NUMERO 3 7
BEGIN
KEY "Nr. pagina"
PROMPT 137 1 "Pagina "
MESSAGE _PAGENO
END
NUMERO 4 25
BEGIN
KEY "Intestazione stampa"
PROMPT 45 2 "Stampa lista documenti"
END
STRINGA 5 146
BEGIN
KEY "Separatore (iniziale)"
PROMPT 1 3 "------------------------------------------------------------------------------------------------------------------------------------------------------"
END
STRINGA 6 8
BEGIN
KEY "Intestazione (Cod. numerazione)"
PROMPT 1 4 "Cod. num."
END
STRINGA 7 9
BEGIN
KEY "Intestazione (Tipo doc.)"
PROMPT 11 4 "Tipo doc."
END
STRINGA 8 8
BEGIN
KEY "Intestazione (Numero doc.)"
PROMPT 22 4 "Nr. doc."
END
STRINGA 9 9
BEGIN
KEY "Intestazione (Data doc.)"
PROMPT 31 4 "Data doc."
END
STRINGA 10 7
BEGIN
KEY "Intestazione (Cliente)"
PROMPT 48 4 "Cliente"
END
STRINGA 11 10
BEGIN
KEY "Intestazione (Stato doc.)"
PROMPT 75 4 "Stato doc."
END
STRINGA 12 10
BEGIN
KEY "Intestazione (Imponibile)"
PROMPT 86 4 "Imponibile"
END
STRINGA 13 10
BEGIN
KEY "Intestazione (Spese)"
PROMPT 111 4 "Spese"
END
STRINGA 14 10
BEGIN
KEY "Intestazione (IVA)"
PROMPT 128 4 "IVA"
END
STRINGA 15 14
BEGIN
KEY "Intestazione (Importo totale)"
PROMPT 132 4 "Importo totale"
END
STRINGA 16 146
BEGIN
KEY "Separatore (finale)"
PROMPT 1 5 "------------------------------------------------------------------------------------------------------------------------------------------------------"
END
END
SECTION BODY ODD 2
STRINGA 17 4
BEGIN
KEY "Codice numerazione"
PROMPT 1 1 ""
FIELD 33->CODNUM
END
STRINGA 18 9
BEGIN
KEY "Tipo documento"
PROMPT 11 1 ""
FIELD %TIP->S0
END
NUMERO 19 7
BEGIN
KEY "Numero documento"
PROMPT 22 1 ""
FIELD 33->NDOC
PICTURE "#######"
END
DATA 20 10
BEGIN
KEY "Data documento"
PROMPT 31 1 ""
FILED 33->DATADOC
END
NUMERO 21 7
BEGIN
KEY "Codice cliente"
PROMPT 42 1 ""
FIELD 33->CODCF
PICTURE "#######"
END
STRINGA 22 25 2
BEGIN
KEY "Cliente ragione sociale"
PROMPT 51 1 ""
MESSAGE _CLIENTE,!RAGSOC
END
STRINGA 23 1
BEGIN
KEY "Stato documento"
PROMPT 76 1 ""
FIELD 33->STATO
END
NUMBER 24 15
BEGIN
KEY "Totale imponibile"
PROMPT 86 1 ""
MESSAGE _TOTIMPONIBILI,1
PICTURE "###.###.###.###"
END
NUMBER 25 15
BEGIN
KEY "Spese"
PROMPT 101 1 ""
PICTURE "###.###.###.###"
FIELD TOTSPE
END
NUMBER 26 15
BEGIN
KEY "Totale imposte"
PROMPT 116 1 ""
FIELD IMPOSTE
PICTURE "###.###.###.###"
END
NUMBER 27 15
BEGIN
KEY "Totale documento"
PROMPT 131 1 ""
FIELD TOTDOC
PICTURE "###.###.###.###"
END
END

View File

@ -2,7 +2,7 @@
#include <checks.h>
#include <xvt.h>
extern int ve1100(int argc, char* argv[]); // stampa documenti di vendita tramite form derivati
extern int ve1100(int argc, char** argv); // stampa documenti di vendita tramite form derivati
int main(int argc, char **argv) {
int rt= -1;
@ -10,7 +10,7 @@ int main(int argc, char **argv) {
switch (r) {
case 0: rt= ve1100(argc, argv); break;
default: error_box("Sintassi: %s [-0 [params]]", argv[0]); break;
default: error_box("Sintassi: %s [-0 {[params]|[L]}]", argv[0]); break;
}
return (rt);
}

View File

@ -8,23 +8,12 @@ SUBMENU MENU_FILE "~File"
ITEM BAR_ITEM(1) "~Parametri"
MENUBAR MENU_BAR(1)
/* ve1 -0 */
MENUBAR MENU_BAR(1)
MENU MENU_BAR(1)
SUBMENU MENU_FILE "~File"
ITEM BAR_ITEM(1) "~Parametri"
MENUBAR MENU_BAR(2)
MENU MENU_BAR(2)
SUBMENU MENU_FILE "~File"
ITEM BAR_ITEM(1) "~Parametri"
MENUBAR MENU_BAR(3)
MENU MENU_BAR(3)
SUBMENU MENU_FILE "~File"
ITEM BAR_ITEM(1) "~Parametri"

View File

@ -18,7 +18,8 @@
#include "velib02.h"
#define Usage "Usage: ve1 -1 [codnum anno {D|P} dalnum alnum {D|P} [ncopie]]"
#define LISTADOC "listadoc"
#define Usage "Usage: ve1 -0 {[codnum anno {D|P} dalnum alnum {D|P} [ncopie]] | [L]}"
// Queste classi (TDocisamfile e TRDocisamfile) servono nel costruttore di TDocumento_form
// in modo da sostituire i file della relazione, ovvero LF_DOC e LF_RIGHEDOC.
@ -28,13 +29,26 @@
class TDocisamfile : public TLocalisamfile
{
TDocumento *_doc;
TDocumentoEsteso *_doc;
public:
virtual TRectype& curr() const { return (TRectype&) *_doc; }
TDocisamfile(TDocumento* doc) : TLocalisamfile(LF_DOC) { _doc = doc;}
virtual int readat(TRecnotype nrec, word lockop = _nolock);
TDocisamfile(TDocumentoEsteso* doc) : TLocalisamfile(LF_DOC) { _doc = doc;}
virtual ~TDocisamfile() {};
};
int TDocisamfile::readat(TRecnotype nrec, word lockop)
{
int err = TBaseisamfile::readat(nrec, _nolock);
if (err == NOERR)
if ((err=_doc->read(curr())) == NOERR)
{
_doc->summary_reset();
_doc->summary_filter(1);
}
return err;
//return err == NOERR ? _doc->read(curr()) : err;
}
class TRDocisamfile : public TLocalisamfile
{
TDocumento *_doc;
@ -65,6 +79,7 @@ class TDocumento_form : public TForm
TString_array _exclude_array; // array di coppie tipo/articolo da escludere dalla stampa
TDocumentoEsteso * _doc; // Documento da stampare
bool _valid, _cli_loaded; // flag che indica se il form e' valido | se l'oggetto cliente è già stato caricato
bool _is_lista; // flag che indica se il form e' usato per la stampa della lista documenti
TString_array _group_decimals; // Array di TToken_string per ogni gruppo definito in GENERAL.
// Il primo elelemento della token_string conterra' il numero del gruppo
// il secondo il n.ro di decimali per importi in lire ed il terzo il n.ro
@ -104,6 +119,7 @@ public:
TString_array & exclude_list() { return _exclude_array; }
TDocumentoEsteso& doc() { return *_doc; }
TDocumento_form(TRectype&/*TDocumentoEsteso **/ doc, TRelation& rel, const bool definitiva, const bool interattivo);
TDocumento_form(const char* form, TRelation& rel);
virtual ~TDocumento_form();
};
@ -155,6 +171,7 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation&
read(nomeform);
_cliente= new TCliFor;
_cli_loaded= FALSE;
_is_lista = FALSE;
_doc = new TDocumentoEsteso(doc); // istanzia TDocumentoEsteso
_docfile = new TDocisamfile(_doc);
@ -194,6 +211,20 @@ TDocumento_form::TDocumento_form(TRectype&/*TDocumentoEsteso**/ doc, TRelation&
pr.footerlen(foot.height());
}
// costruttore per stampa lista documenti (uso convenzionale dei forms)
TDocumento_form::TDocumento_form(const char* form, TRelation& rel): TForm(form), _firmrel(rel), _valid(FALSE)
{
_is_lista = TRUE;
_rdocfile=NULL;
_tip = new TTable("%TIP");
_tab = new TLocalisamfile(LF_TAB);
_cliente= new TCliFor;
_cli_loaded= FALSE;
_doc = new TDocumentoEsteso;
_docfile = new TDocisamfile(_doc);
relation()->replace(_docfile,0);
}
TDocumento_form::~TDocumento_form()
{
delete _cliente;
@ -649,7 +680,7 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
// + %COMUNI (213@) Comune di nascita
TLocalisamfile &doc= (cursor())->file(LF_DOC);
TString16 tipocf= doc.get("TIPOCF"), codcf= doc.get("CODCF"), ocfpi= doc.get("OCFPI");
if (!_cli_loaded ) { // il cliente è sulla testata del documento di vendita, quindi può essere caricato una volta sola per tutte
if (!_cli_loaded || _is_lista) { // il cliente è sulla testata del documento di vendita, quindi può essere caricato una volta sola per tutte
_cliente->load(tipocf[0], atol(codcf), ocfpi);
_cliente->add(LF_COMUNI, "COM=STATOCF+COMCF", 1, LF_CLIFO, 100+LF_COMUNI);
_cliente->add(LF_COMUNI, "COM=STATONASC+COMNASC", 1, LF_CLIFO, 200+LF_COMUNI);
@ -659,7 +690,10 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
if (in[0]=='!') {
in.ltrim(1);
if (in=="RAGSOC")
{
valore = _cliente->get(LF_CLIFO, "RAGSOC");
valore.strip_d_spaces();
}
if (in=="IND")
valore = _cliente->get(LF_CLIFO, "INDCF");
if (in=="NUM")
@ -791,6 +825,13 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
cf.put_paragraph(pg);
}
// Messaggio per stampare la data di oggi
if (code== "_DATA")
{
TString16 pg(TDate(TODAY).string());
cf.put_paragraph(pg);
}
if (code== "_RIEPILOGOIVA") {
// tabella riepilogo aliquote iva e relative imposte
// sintassi: _RIEPILOGOIVA,<selettore>,<macro>,<cambio codice>
@ -924,6 +965,7 @@ class TStampaDoc_application: public TApplication
long _dalnum, _alnum; // estremi di numerazione dei documenti
TDate _dadata, _adata; // estremi di data dei documenti
bool _interattivo; // flag che indica se il prog. funziona in interattivo o in batch
bool _is_lista; // flga che indica se e' stata selezionata la lista documenti
bool _definitiva; // flag che indica se la stampa è definitiva o no
TRelation *_firmrel; // puntatore alla relazione che gestisce i dati della ditta corrente
TDocumento_form *_form; // puntatore al form di stampa
@ -977,7 +1019,7 @@ void TStampaDoc_application::print_selected()
error_box("Non vi sono documenti da stampare nell'intervallo indicato");
return;
}
_definitiva= query_final_print(); // legge il flag di stampa definitiva
if (!_is_lista) _definitiva= query_final_print(); // legge il flag di stampa definitiva
TPrinter& pr = printer();
pr.open();
@ -985,51 +1027,60 @@ void TStampaDoc_application::print_selected()
TProgind* pi = pr.printtype() != screenvis ?
new TProgind(cur.items(),"Stampa documenti in corso...",FALSE,TRUE,10) :
NULL;
cur.setregion(darec, arec);
const long items = cur.items();
behaviour whattodo = go;
bool first_inst = TRUE;
//TDocumentoEsteso *documento = new TDocumentoEsteso;
//cur.file().set_curr(documento);
for (long i = 0; i < items; i++)
if (!_is_lista)
{
cur = i; // Posiziona il documento
_form = new TDocumento_form(cur.curr()/*documento*/, *_firmrel, _definitiva, _interattivo); // Istanzia il form
if (!_form->valid()) break; // interrompe la stampa se il doc corrente non e' tra i tipi validi
const TString &modulo= _form->get_module_code(); // legge dal form il codice del modulo di carta per la stampa
if (modulo_prec.empty()) modulo_prec = modulo; // se siamo al primo passaggio la variabile di modulo precedente viene riempita
else first_inst = FALSE;
const bool module_changed = modulo != modulo_prec;
if (first_inst || module_changed)
if (!_form->doc_arrange()) // Setta l'offset o posiziona manualmente
break; // Se vi sono errori interrompe la stampa
if (module_changed) whattodo = on_module_change(modulo, modulo_prec); // se il modulo è cambiato dalla stampa precedente interroga la funzione per sapere che comportamento tenere
if (whattodo==cancel) break; // se non si può procedere la stampa viene interrotta
if (whattodo==skip) continue; // Salta il documento corrente
// altrimenti prosegue
// Carica il numero di copie da stampare per questo form
int ncopie = _ncopie == 0 ? _form->ncopie() : _ncopie; // Numero di copie da stampare per questo documento
if (ncopie == 0) ncopie = 1;
for (int n=0; n < ncopie; n++)
cur.setregion(darec, arec);
const long items = cur.items();
behaviour whattodo = go;
bool first_inst = TRUE;
//TDocumentoEsteso *documento = new TDocumentoEsteso;
//cur.file().set_curr(documento);
for (long i = 0; i < items; i++)
{
print_documento();
_form->doc().summary_reset();
_form->doc().scadenze_reset();
}
delete _form;
if (_definitiva && (numerazione_definitiva(doc) != NOERR))
{ // se la stampa è definitiva viene lanciata la procedura di rinumerazione
if (_interattivo) error_box("Non è possibile completare la procedura di numerazione definitiva dei documenti");
break;
}
}
cur = i; // Posiziona il documento
_form = new TDocumento_form(cur.curr()/*documento*/, *_firmrel, _definitiva, _interattivo); // Istanzia il form
if (!_form->valid()) break; // interrompe la stampa se il doc corrente non e' tra i tipi validi
const TString &modulo= _form->get_module_code(); // legge dal form il codice del modulo di carta per la stampa
if (modulo_prec.empty()) modulo_prec = modulo; // se siamo al primo passaggio la variabile di modulo precedente viene riempita
else first_inst = FALSE;
const bool module_changed = modulo != modulo_prec;
if (first_inst || module_changed)
if (!_form->doc_arrange()) // Setta l'offset o posiziona manualmente
break; // Se vi sono errori interrompe la stampa
if (module_changed) whattodo = on_module_change(modulo, modulo_prec); // se il modulo è cambiato dalla stampa precedente interroga la funzione per sapere che comportamento tenere
if (whattodo==cancel) break; // se non si può procedere la stampa viene interrotta
if (whattodo==skip) continue; // Salta il documento corrente
// altrimenti prosegue
// Non viene fatta la delete documento perche' gia' presente nella distruzione del cursore, avendo fatto una set_curr()
// Carica il numero di copie da stampare per questo form
int ncopie = _ncopie == 0 ? _form->ncopie() : _ncopie; // Numero di copie da stampare per questo documento
if (ncopie == 0) ncopie = 1;
for (int n=0; n < ncopie; n++)
{
print_documento();
_form->doc().summary_reset();
_form->doc().scadenze_reset();
}
delete _form;
if (_definitiva && (numerazione_definitiva(doc) != NOERR))
{ // se la stampa è definitiva viene lanciata la procedura di rinumerazione
if (_interattivo) error_box("Non è possibile completare la procedura di numerazione definitiva dei documenti");
break;
}
}
// Non viene fatta la delete documento perche' gia' presente nella distruzione del cursore, avendo fatto una set_curr()
}
else // Lista documenti
{
_form = new TDocumento_form(LISTADOC,*_firmrel);
_form->cursor()->setregion(darec,arec);
_form->print();
delete _form;
}
if (pi != NULL) delete pi;
printer().close();
@ -1148,7 +1199,7 @@ bool TStampaDoc_application::create()
_firmrel->add(LF_COMUNI, "COM=STATORES+COMRF", 1, LF_ANAG, 200+LF_COMUNI);
const int argc = TApplication::argc();
if (argc>2)
if (argc>3)
{ // lettura dei parametri iniziali dalla linea di comando
_codnum= argv(2); // il primo parametro è il codice di numerazione
_anno= atoi(argv(3)); // il secondo è l'anno
@ -1173,13 +1224,16 @@ bool TStampaDoc_application::create()
return FALSE;
}
else
if (argc == 2)
{
_is_lista = argc == 3 && argv(2)[0] == 'L';
if (argc == 2 || _is_lista)
{ // oppure lancio della maschera
_interattivo= TRUE;
dispatch_e_menu(BAR_ITEM(1));
}
else
return error_box(Usage);
}
return TRUE;
}
@ -1199,6 +1253,8 @@ void TStampaDoc_application::on_firm_change()
bool TStampaDoc_application::select()
{
TMask m("ve1100a");
if (_is_lista) m.hide(F_NCOPIE);
TString wdate;
m.set_handler(F_DA_DATADOC, date2num_handler);
m.set_handler(F_A_DATADOC, date2num_handler);
@ -1231,10 +1287,12 @@ bool TStampaDoc_application::menu(MENU_TAG)
}
// Do all the work!
int ve1100(int argc, char* argv[])
int ve1100(int argc, char** argv)
{
TStampaDoc_application a;
a.run(argc, argv, "Stampa documenti di vendita");
const bool cond = argc == 4 && argv[2][0] == 'L'; // List documenti
a.run(argc, argv, cond ? "Lista documenti" : "Stampa documenti di vendita");
return (0);
}