Files correlati : ve6.exe Ricompilazione Demo : [ ] Commento : Riportata la versione 3.1 patch 979 git-svn-id: svn://10.65.10.50/trunk@15623 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			345 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			345 lines
		
	
	
		
			9.8 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| // 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;
 | |
| }
 | |
| 
 |