Files correlati : or1.exe Ricompilazione Demo : [ ] Commento : Bugs 0000689 Aggiungere ai documenti un campo data rientro (DATASCIMP) da considerare nella disponibilità per articolo git-svn-id: svn://10.65.10.50/trunk@14623 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			346 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			346 lines
		
	
	
		
			9.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
// Stampa dettaglio disponibilita' articoli
 | 
						|
#include <applicat.h>
 | 
						|
#include <mask.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;
 | 
						|
}
 | 
						|
 |