campo-sirio/or/or1200.cpp

345 lines
9.8 KiB
C++
Raw Normal View History

// Stampa dettaglio disponibilita' articoli
#include <applicat.h>
#include <printer.h>
#include <tabutil.h>
#include "doc.h"
#include "rdoc.h"
#include "orlib.h"
#include "or1200a.h"
#include "../cg/cglib01.h"
#include "../ve/velib.h"
class TStampa_dettaglio_articoli : public TSkeleton_application
{
TMask *_m;
TOrdine_form
*_frm;
TCodgiac_livelli
*_codgiac;
TTable *_fcg;
TString _fromcodnum, _tocodnum; // Range calcolati automaticamente all'inizio del prg
int _anno;
char _provv;
bool _da_ordinare, // Se true solo gli articoli da ordinare, false tutti.
_detail_mag, _detail_dep,
_giac_eff, _val_comp;
TDate _data_oss; // Data di osservazione
TDate _data_inizio;
TArray _date_array; // Array di date di suddivisione periodi di osservazione
TArray _file; // Array di files da aprire per i malditos TRecord_array
int _periods,
_detail_level; //0..4 0 = Articoli 4 = FCG #4 Maximum detail level
TString _from_art, //ranges
_to_art,
_from_mag, _to_mag,
_from_dep, _to_dep;
TString_array
_from_giac, _to_giac;
protected:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
void set_date_array();
void set_form();
public:
TStampa_dettaglio_articoli() {};
virtual ~TStampa_dettaglio_articoli() {};
};
bool TStampa_dettaglio_articoli::create()
{
open_files(LF_UMART, LF_OCCAS, LF_CLIFO, LF_INDSP, LF_CFVEN, LF_TABCOM, LF_MAG, 0);
_m = new TMask("or1200a");
// Reperisce i flags per vedere se e' abilitata la gestione depositi e la gestione livelli di giacenza
// Abilita quindi i campi relativi per la selezione dettaglio deposito/livello di giacenza
TConfig conf(CONFIG_DITTA,"mg");
bool geslivgiac = conf.get_bool("GESLIVGIAC");
bool gesdepositi = conf.get_bool("GESDEPOSITI");
_m->enable(-GR_DEP, gesdepositi);
_m->enable(-GR_GIAC, geslivgiac);
_fcg = new TTable("FCG");
_codgiac = new TCodgiac_livelli;
if (geslivgiac) // Completa i campi per i livelli di giacenza al fine di poter effettuare le ricerche
{
short id = F_GIAC1;
for (_fcg->first(); _fcg->good(); _fcg->next(), id+=4)
_m->set(id, _fcg->get("CODTAB"));
}
// Trova gli estremi codice numerazione per tutti i documenti ordine
TTable tip("%TIP");
TString cod;
for (tip.first(); tip.good(); tip.next())
{
if (tip.get_int("I1") == 3) // Trattasi di ordine ??
{
cod = tip.get("CODTAB");
if (_fromcodnum.empty() || cod < _fromcodnum)
_fromcodnum = cod;
if (cod > _tocodnum)
_tocodnum = cod;
}
}
return TSkeleton_application::create();
}
bool TStampa_dettaglio_articoli::destroy()
{
delete _codgiac;
delete _fcg;
delete _m;
return TSkeleton_application::destroy();
}
void TStampa_dettaglio_articoli::set_date_array()
{
TDate dday;
_date_array.destroy();
const long ndays = _data_oss - _data_inizio;
const long daysperiod = ndays / _periods;
dday = _data_inizio;
for (int i = 0; i < _periods; i++)
{
dday += daysperiod;
if (i == _periods -1)
dday = _data_oss;
_date_array.add(dday);
}
}
void TStampa_dettaglio_articoli::set_form()
{
CHECK(_frm,"Invalid form");
_frm->set_options(_detail_level, _detail_mag, _detail_dep, _giac_eff, _val_comp, &_date_array);
// Setta il filtro e l'ordinamento per il cursore del form...
TString lev_str, mag_str, s, filter_expr;
TSorted_cursor* cur = (TSorted_cursor*)_frm->cursor();
// TDocumento *doc = new TDocumento; // Don't delete it
// cur->file(LF_DOC).set_curr(doc); // File collegato
// cur->file(LF_RIGHEDOC).set_curr(new TRiga_documento(doc)); // File principale
if (_detail_level > 0)
lev_str.format("LIVELLO[1,%d]",_codgiac->packed_length(_detail_level));
if (_detail_mag)
mag_str.format("CODMAG[1,3]");
if (_detail_dep)
mag_str.format("CODMAG");
s = "CODART|";
if (lev_str.not_empty())
s << lev_str << "|";
if (mag_str.not_empty())
s << mag_str << "|";
s << "CODNUM|ANNO|PROVV|NDOC";
cur->change_order(s); // Cursor order expression
TRectype f(LF_RIGHEDOC), t(LF_RIGHEDOC);
if (_anno != 0)
{
f.put(DOC_PROVV, _provv);
f.put(DOC_ANNO, _anno);
}
else
{
s.format("(PROVV==\"%c\") &&", _provv);
filter_expr << s;
}
f.put(DOC_CODNUM, _fromcodnum);
t = f;
t.put(DOC_CODNUM, _tocodnum);
cur->setregion(f,t); // Cursor region
// Considera solo i documenti con data consegna compresa tra oggi e la data di osservazione
s.format("(ANSI(%d->DATACONS)>=\"%s\")", LF_RIGHEDOC,
(const char*)_data_inizio.string(ANSI));
filter_expr << s;
if (_data_oss.ok())
{
s.format("&& (ANSI(%d->DATACONS)<=\"%s\")", LF_RIGHEDOC, (const char*) _data_oss.string(ANSI));
filter_expr << s;
// s.format("&& ((ANSI(%d->DATASCIMP)==\"\")||(ANSI(%d->DATASCIMP)>=\"%s\"))", LF_DOC, LF_DOC, (const char*) _data_oss.string(ANSI));
// filter_expr << s;
}
// Setta i range per il codice articolo
if (_from_art.not_empty())
{
s.format("&&(%d->CODART>=\"%s\")",
LF_RIGHEDOC, (const char*)_from_art);
filter_expr << s;
}
if (_to_art.not_empty())
{
filter_expr << "&&";
s.format("(%d->CODART<=\"%s\")",
LF_RIGHEDOC, (const char*)_to_art);
filter_expr << s;
}
// Setta i range per i livelli di giacenza (da 1 a 4)
if (_detail_level > 0)
for (int lev=1, index=0; lev <= _detail_level; lev++)
{
if (!_codgiac->enabled(lev))
continue;
TString& from = (TString&) _from_giac[index];
TString& to = (TString&) _to_giac[index++];
const int starts = _codgiac->code_start(lev);
const int ends = starts+_codgiac->code_length(lev);
if (from.not_empty())
{
s.format("&&(%d->LIVELLO[%d,%d]>=\"%s\")",
LF_RIGHEDOC,starts,ends,(const char*)from);
filter_expr << s;
}
if (to.not_empty())
{
s.format("&&(%d->LIVELLO[%d,%d]<=\"%s\")",
LF_RIGHEDOC,starts,ends,(const char*)to);
filter_expr << s;
}
}
// Setta i range per il codice magazzino (deposito incluso)
if (_from_mag.not_empty())
{
s.format("&&(%d->CODMAG>=\"%s\")",
LF_RIGHEDOC, (const char*)_from_mag);
filter_expr << s;
}
if (_to_mag.not_empty())
{
s.format("&&(%d->CODMAG<=\"%s\")",
LF_RIGHEDOC, (const char*)_to_mag);
filter_expr << s;
}
if (_da_ordinare)
{
s.format("&&(%d->RIGAEVASA!=\"X\")", LF_RIGHEDOC);
filter_expr << s;
}
cur->setfilter(filter_expr,true); // Cursor filter expression
// Una volta settato il cursore del form, pensiamo ai campi del form
// ed alle espressioni delle sottosezioni, le colonne da abilitare etc. etc...
// Disabilita le colonne in base al numero di periodi da suddividere
for (short id = 4+_periods*2; id <= 15; id++)
{
_frm->find_field('B',odd_page,id).disable();
_frm->find_field('B',odd_page,id+50).disable();
}
// Fincature & altro
const int hh = 7;
const int fl = printer().formlen();
int rows[5]; // Righe orizzontali
rows[0] = hh-4;
rows[1] = hh-2;
rows[2] = hh;
rows[3] = fl-1;
rows[4] = 0;
_frm->genera_intestazioni(odd_page, hh-1);
_frm->genera_intestazione_supplementare(odd_page, hh-3);
_frm->genera_fincatura(odd_page, hh-4, fl-1, rows);
}
void TStampa_dettaglio_articoli::main_loop()
{
while (_m->run()!=K_QUIT)
{
_provv = _m->get(F_PROVV)[0];
_anno = _m->get_int(F_ANNO);
_data_inizio = _m->get_date(F_DATE_H);
_data_oss = _m->get_date(F_DATAOSS);
if (!_data_oss.ok())
{
_data_oss = _data_inizio;
_data_oss.set_month(12);
_data_oss.set_day(31);
int anno = _anno;
if (anno <= 0)
{
TEsercizi_contabili esc;
const int codes = esc.last();
if (codes > 0)
anno = esc[codes].fine().year();
}
if (anno > _data_oss.year())
_data_oss.set_year(anno);
}
_from_mag = _m->get(F_MAGFROM);
_to_mag = _m->get(F_MAGTO);
_from_dep = _m->get(F_DEPFROM);
_to_dep = _m->get(F_DEPTO);
if (_from_mag.not_empty())
_from_mag.left_just(3);
if (_to_mag.not_empty())
_to_mag.left_just(3);
_from_mag << _from_dep;
_to_mag << _to_dep;
_from_art = _m->get(F_ARTFROM);
_to_art = _m->get(F_ARTTO);
_from_giac.destroy();
_to_giac.destroy();
_from_giac.add(_m->get(F_GIAC1_FROM),0);
_to_giac.add(_m->get(F_GIAC1_TO),0);
_from_giac.add(_m->get(F_GIAC2_FROM),1);
_to_giac.add(_m->get(F_GIAC2_TO),1);
_from_giac.add(_m->get(F_GIAC3_FROM),2);
_to_giac.add(_m->get(F_GIAC3_TO),2);
_from_giac.add(_m->get(F_GIAC4_FROM),3);
_to_giac.add(_m->get(F_GIAC4_TO),3);
_detail_mag = _m->get_bool(F_DETAIL_MAG);
_detail_dep = _m->get_bool(F_DETAIL_DEP);
_detail_level = _m->get_int(F_DETAIL_LEV);
_periods = _m->get_int(F_PERIODS);
_da_ordinare = _m->get(F_RIGHETUTTE) == "O";
_giac_eff = _m->get_bool(F_GIACEFF);
_val_comp = _m->get_bool(F_VALCOMP);
set_date_array();
_frm = new TOrdine_form("or1200a");
set_form();
if (_frm->cursor()->items() > 0)
{
TCursor* cur = _frm->cursor();
TDocumento *doc = new TDocumento; // Don't delete it
cur->file(LF_DOC).set_curr(doc); // File collegato
cur->file(LF_RIGHEDOC).set_curr(new TRiga_documento(doc)); // File principale
_frm->print();
cur->file(LF_DOC).set_curr(new TRectype(LF_DOC));
cur->file(LF_RIGHEDOC).set_curr(new TRectype(LF_RIGHEDOC));
}
// Reset mask
_m->reset();
delete _frm;
}
}
int or1200(int argc, char** argv)
{
TStampa_dettaglio_articoli a;
a.run(argc,argv,TR("Stampa disponibilita' articoli"));
return 0;
}