Files correlati : or1.exe or1100a.msk or1100b.frm or1200a.frm or1200a.msk Ricompilazione Demo : [ ] Commento : GF20030 La stampa ordini per cliente-fornitore/agente/articolo restituisce il messaggio d'errore:"FATAL ERROR can't find item with id 10 RUN TIME ERROR." GF20031 La stampa ordini col dettaglio articoli per data di consegna oltre a mostrare gli ordini col dettaglio del o degli articoli con data consegna indicata in fase di interrogazione mostra anche la testata (e non il dettaglio degli articoli giustamente) anche di quegli ordini con data di consegna non rientrante nel range inserito in fase di interrogazione. Esempio inserire due ordini uno con data consegna documento e righe documento 20/05/03 e l'altro con data di consegna documento 20/05/03 e un articolo con data di consegna 30/06/06, fare l'interrogazione con dettaglio righe e data di consegna dal 30/06/03 al 30/06/03. GF20032 La stampa disponibilità articoli non evidenzia nulla. git-svn-id: svn://10.65.10.50/trunk@11224 c028cbd2-c16b-5b4b-a496-9718f37d4682
349 lines
10 KiB
C++
Executable File
349 lines
10 KiB
C++
Executable File
// Stampa dettaglio disponibilita' articoli
|
|
#include <applicat.h>
|
|
#include <mask.h>
|
|
#include <printer.h>
|
|
#include "orlib.h"
|
|
#include "or1200a.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:
|
|
void open_files(int logicnum, ...);
|
|
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() {};
|
|
};
|
|
|
|
void TStampa_dettaglio_articoli::open_files(int logicnum, ...)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, logicnum);
|
|
while (logicnum > 0)
|
|
{
|
|
CHECKD(_file.objptr(logicnum) == NULL, "File gia' aperto: ", logicnum);
|
|
_file.add(new TLocalisamfile(logicnum), logicnum);
|
|
logicnum = va_arg(marker, int);
|
|
}
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
// 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 ec;
|
|
const int codes = ec.last();
|
|
if (codes > 0)
|
|
anno = ec[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,"Stampa disponibilita' articoli");
|
|
return 0;
|
|
}
|
|
|