campo-sirio/si/si0200.cpp
alex 2d0aeae806 Patch level : aga 07 no patch
Files correlati     : si0.exe
Ricompilazione Demo : [ ]
Commento            :
Corretta selezione stampa servizi
In tutti i form bisogna fare un join da 20 (clienti) a 33 (documenti)


git-svn-id: svn://10.65.10.50/trunk@10037 c028cbd2-c16b-5b4b-a496-9718f37d4682
2002-02-04 17:01:00 +00:00

247 lines
6.8 KiB
C++
Executable File

//////////////////////////////////////////////////////////////
// Stampa documenti
//////////////////////////////////////////////////////////////
#include <applicat.h>
#include <config.h>
#include <defmask.h>
#include <form.h>
#include <printer.h>
#include <progind.h>
#include <sheet.h>
#include <utility.h>
#include <doc.h>
#include <rdoc.h>
#include "../ve/velib.h"
#include "si0200a.h"
class TDocisamfile : public TLocalisamfile
{
TDocumento _doc;
public:
virtual TRectype& curr() const { return (TRectype&) _doc; }
virtual int readat(TRecnotype nrec, word lockop = _nolock);
TDocisamfile() : TLocalisamfile(LF_DOC) {}
virtual ~TDocisamfile() {};
};
int TDocisamfile::readat(TRecnotype nrec, word lockop)
{
int err = TBaseisamfile::readat(nrec, _nolock);
if (err == NOERR)
err = _doc.read(TBaseisamfile::curr());
return err;
}
class TListe_form : public TForm
{
// @access Protected Member
protected:
public:
virtual bool validate(TForm_item& fld, TToken_string& val);
TListe_form(const char* form, const char * code = "", int editlevel = 0, const char* desc = "");
virtual ~TListe_form() {}
};
bool TListe_form::validate(TForm_item& fld, TToken_string& val)
{
return TForm::validate(fld, val);
}
TListe_form::TListe_form(const char* form, const char* code, int editlevel, const char* desc)
: TForm(form, code, editlevel, desc)
{
const int num = relation()->lfile().num();
if (num == LF_DOC)
relation()->lfile().set_curr(new TDocumento);
}
class TListe_application: public TSkeleton_application
{
TMask * _select_mask;
TListe_form * _form;
TFilename _formname;
protected:
virtual bool create();
virtual bool destroy();
char tipo_lista() const { return _formname[6]; }
void set_limits();
virtual void main_loop();
virtual const char * extra_modules() const { return "BA"; }
public:
TListe_application() : _select_mask(NULL), _form(NULL) {};
virtual ~TListe_application() {};
};
inline TListe_application& app() { return (TListe_application&) main_app(); }
bool TListe_application::create()
{
if (argc() < 3)
return error_box("manca il nome del form di stampa");
open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART,
LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON,
LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
_formname = argv(2);
_select_mask = new TMask("si0200a");
_form = new TListe_form(_formname);
return TSkeleton_application::create();
}
void TListe_application::set_limits()
{
TCursor * c = _form->cursor();
TRelation * r = c->relation();
const int headlnum = r->lfile().num();
TString16 tipo(_select_mask->get(F_TIPOCF));
TString16 cli_fr(_select_mask->get(F_CODFR));
TString16 cli_to(_select_mask->get(F_CODTO));
TRectype from(LF_CLIFO);
from.put("TIPOCF", tipo);
TRectype to(from);
TString filter("(");
if (headlnum == LF_DOC)
{
if (cli_fr.empty() && cli_to.empty())
{
TString16 rag_fr(_select_mask->get(F_RAGSOCFR));
if (rag_fr.not_empty())
filter << format("&&(20->RAGSOC>=\"%s\")", (const char *) rag_fr);
TString16 rag_to(_select_mask->get(F_RAGSOCTO));
if (rag_to.not_empty())
filter << format("&&(20->RAGSOC<=\"%s\")", (const char *) rag_to);
}
else
{
TString16 cli_fr(_select_mask->get(F_CODFR));
if (cli_fr.not_empty())
from.put("CODCF", cli_fr);
TString16 rag_to(_select_mask->get(F_CODTO));
if (rag_to.not_empty())
to.put("CODCF", cli_to);
c->setkey(2);
}
c->setregion(from, to);
}
else
{
if (cli_fr.empty() && cli_to.empty())
{
TString16 rag_fr(_select_mask->get(F_RAGSOCFR));
if (rag_fr.not_empty())
filter << format("&&(20->RAGSOC>=\"%s\")", (const char *) rag_fr);
TString16 rag_to(_select_mask->get(F_RAGSOCTO));
if (rag_to.not_empty())
filter << format("&&(20->RAGSOC<=\"%s\")", (const char *) rag_to);
}
else
{
TString16 cli_fr(_select_mask->get(F_CODFR));
if (cli_fr.not_empty())
from.put("CODCF", cli_fr);
TString16 rag_to(_select_mask->get(F_CODTO));
if (rag_to.not_empty())
to.put("CODCF", cli_to);
}
}
if (filter != "(")
filter << "&&";
filter << format("(ANNO==%d)", _select_mask->get_int(F_ANNO));
filter << format("&&(PROVV==\"%c\")", _select_mask->get(F_PROVV)[0]);
TSheet_field & s = _select_mask->sfield(F_SHEETNUMS);
const int rows = s.items();
if (rows > 0)
{
TString sw, e1, e2;
for (int j=0; j<rows; j++)
{
TToken_string& riga = s.row(j);
sw = riga.get(0);sw.trim();
if (riga.empty_items() || sw.empty())
break; // Interrompe alla prima riga vuota...
e1.format("(CODNUM==\"%s\"", (const char*)sw);
e2 = "";
for (int k=1; k<=6; k++) // Famme vede' li stati generali... Aho' A BURINO! Che e' la Rivoluzione Francese?
{
const char c = riga.get(k)[0];
if (c == '\0' || c == ' ')
break; // Interrompe al primo blank...
e2.format("(33->STATO==\"%c\")",c);
// Se k vale 2 o piu' significa ke gli stati prec erano != "" no!?
if (k == 1)
e1 << "&&(";
else
e1 << "||";
e1 << e2;
}
if (e2.not_empty())
e1 << ")";
e1 << ")"; // Piazza la parentesi finale
if (j == 0)
filter << "&&(";
else
filter << "||";
filter << e1;
}
filter << ")"; // Parentesi finale
}
TDate data_fr(_select_mask->get(F_DA_DATADOC));
if (data_fr.ok())
filter << format("&&(ANSI(33->DATADOC)>=\"%s\")", (const char *) data_fr.string(ANSI));
TDate data_to(_select_mask->get(F_A_DATADOC));
if (data_to.ok())
filter << format("&&(ANSI(33->DATADOC)<=\"%s\")", (const char *) data_to.string(ANSI));
TString80 art_fr(_select_mask->get(F_SERVFR));
if (art_fr.not_empty())
filter << format("&&(34->CODARTMAG>=\"%s\")", (const char *) art_fr);
TString80 art_to(_select_mask->get(F_SERVTO));
if (art_to.not_empty())
filter << format("&&(34->CODARTMAG<=\"%s\")", (const char *) art_to);
filter << ")";
c->setfilter(filter, TRUE);
}
bool TListe_application::destroy()
{
delete _select_mask;
delete _form;
return TApplication::destroy();
}
void TListe_application::main_loop()
{
while (_select_mask->run() != K_ESC)
{
set_limits();
_form->print();
}
}
// Do all the work!
int si0200(int argc, char* argv[])
{
TListe_application a;
a.run(argc, argv, "Lista documenti");
return (0);
}