Files correlati : or1.exe or1100d.frm Ricompilazione Demo : [ ] Commento : GF20040 Se stampo con il dettaglio articoli solo per gli ordini evasi con la spunta STAMPA RIGHE EVASE CON RESIDUO mi elenca anche quegli ordini che sono stati evasi per la quantità ordinata. git-svn-id: svn://10.65.10.50/trunk@11294 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			358 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			358 lines
		
	
	
		
			10 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:
 | 
						|
  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 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,"Stampa disponibilita' articoli");
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 |