git-svn-id: svn://10.65.10.50/branches/R_10_00@22678 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			363 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			363 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						|
#include <automask.h>
 | 
						|
#include <progind.h>
 | 
						|
#include <reprint.h>
 | 
						|
#include <reputils.h>
 | 
						|
 | 
						|
#include "../db/dblib.h"
 | 
						|
#include "../ve/velib.h"
 | 
						|
#include "../mr/mrplib.h"
 | 
						|
 | 
						|
#include "ps0920.h"
 | 
						|
#include "ps0920300a.h"
 | 
						|
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
//	MASCHERA
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
class TPianifica_impianti_mask : public TAutomask
 | 
						|
{
 | 
						|
protected:
 | 
						|
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						|
 | 
						|
public:
 | 
						|
  TPianifica_impianti_mask();
 | 
						|
  virtual ~TPianifica_impianti_mask();
 | 
						|
};
 | 
						|
 | 
						|
TPianifica_impianti_mask::TPianifica_impianti_mask()
 | 
						|
            : TAutomask("ps0920300a")
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
TPianifica_impianti_mask::~TPianifica_impianti_mask()
 | 
						|
{  
 | 
						|
}             
 | 
						|
 | 
						|
bool TPianifica_impianti_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						|
{
 | 
						|
	const int id = o.dlg();
 | 
						|
	switch (id)
 | 
						|
	{
 | 
						|
		case F_ADATA:
 | 
						|
			if (e == fe_modify)
 | 
						|
			{
 | 
						|
				const TDate dadata = get_date(F_DADATA);
 | 
						|
				const int daanno = dadata.year();
 | 
						|
				const TDate adata = o.get();
 | 
						|
				const int aanno = adata.year();
 | 
						|
				if (daanno != aanno)
 | 
						|
					return error_box(TR("Le date devono appartenere allo stesso anno!"));
 | 
						|
			}
 | 
						|
			break;
 | 
						|
		default:
 | 
						|
			break;
 | 
						|
	}
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/////////////////////////////////////////////////////////////////
 | 
						|
//	APPLICAZIONE
 | 
						|
/////////////////////////////////////////////////////////////////
 | 
						|
class TPianifica_impianti : public TSkeleton_application  
 | 
						|
{
 | 
						|
  TPianifica_impianti_mask * _mask;
 | 
						|
	TArray _target_dates;
 | 
						|
 | 
						|
	virtual bool check_autorization() const {return false;}
 | 
						|
  virtual const char * extra_modules() const {return "ve";}
 | 
						|
	bool find_my_sister_row(const TRiga_documento& source_row, const TString& a_codnum, const TCodice_articolo& son_codartmag, 
 | 
						|
													const TString& a_impianto, TRectype& sister_row, TLog_report& log) const;
 | 
						|
	void delete_old_docs();
 | 
						|
	void create_new_docs(TLog_report& log);
 | 
						|
 | 
						|
protected:
 | 
						|
  virtual void main_loop();
 | 
						|
  virtual bool create();
 | 
						|
 | 
						|
public:
 | 
						|
  const TPianifica_impianti_mask & mask() const {return *_mask;}
 | 
						|
  virtual ~TPianifica_impianti();
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
void TPianifica_impianti::delete_old_docs()
 | 
						|
{
 | 
						|
  TDate dadata = _mask->get_date(F_DADATA);
 | 
						|
	TDate adata = _mask->get_date(F_ADATA);
 | 
						|
	const int lastday = adata - dadata;
 | 
						|
 | 
						|
	const int anno = dadata.year();
 | 
						|
  const TString& codnum = _mask->get(F_NUM);		//accoppa i documenti con numerazione sorgente
 | 
						|
	const TString& impianto = _mask->get(F_AIMP);	//..e con l'impianto destinazione
 | 
						|
  TRelation rel_doc(LF_DOC);
 | 
						|
  TRectype darec(LF_DOC), arec(LF_DOC);
 | 
						|
	TDate from(1, 1, anno - 1);
 | 
						|
	TDate to(31, 12, anno);
 | 
						|
 | 
						|
	darec.put(DOC_DATADOC, from);
 | 
						|
  darec.put(DOC_PROVV, "D");
 | 
						|
  darec.put(DOC_ANNO, anno);
 | 
						|
  darec.put(DOC_CODNUM, codnum);
 | 
						|
 | 
						|
	arec.put(DOC_DATADOC, to);
 | 
						|
  arec.put(DOC_PROVV, "D");
 | 
						|
  arec.put(DOC_ANNO, anno);
 | 
						|
  arec.put(DOC_CODNUM, codnum);
 | 
						|
 | 
						|
	TString filtro;
 | 
						|
	filtro << "CODNUM='" << codnum << "'";
 | 
						|
 | 
						|
  TCursor cur_doc (&rel_doc, filtro, 3, &darec, &arec);
 | 
						|
  const long items = cur_doc.items();
 | 
						|
  cur_doc.freeze();
 | 
						|
  TProgind progind(items, "Eliminazione vecchi documenti in corso...", false, true);
 | 
						|
 | 
						|
  dadata = (TDate&) _target_dates[0];
 | 
						|
  adata = (TDate&) _target_dates[lastday];
 | 
						|
	for (cur_doc = 0; cur_doc.pos() < items; ++cur_doc)
 | 
						|
  { 
 | 
						|
    progind.addstatus(1);
 | 
						|
    TDocumento doc(cur_doc.curr());
 | 
						|
		//trovato un documento che soddisfa il darec/arec deve eliminarlo se la prima riga ha impianto..
 | 
						|
		//..uguale a quello nel campo F_AIMP sulla maschera
 | 
						|
		const TDate h_datacons = doc.get_date(DOC_DATACONS);
 | 
						|
  	bool imp_ok =false, datacons_ok = false;
 | 
						|
 | 
						|
		for (int i = 1; i <= doc.physical_rows(); i++)
 | 
						|
		{
 | 
						|
			const TRiga_documento& rigadoc = doc[i];
 | 
						|
			if (rigadoc.get(RDOC_IMPIANTO) == impianto)
 | 
						|
				imp_ok = true;
 | 
						|
			const TDate datacons = rigadoc.get_date(RDOC_DATACONS);
 | 
						|
			if (datacons.ok())
 | 
						|
				datacons_ok = (datacons >= dadata) && (datacons <= adata);
 | 
						|
			else
 | 
						|
				datacons_ok = (h_datacons >= dadata) && (h_datacons <= adata);
 | 
						|
			if (imp_ok && datacons_ok)
 | 
						|
			{
 | 
						|
				doc.remove();
 | 
						|
				break;
 | 
						|
			}
 | 
						|
		} //for(int i =...
 | 
						|
  }	//for(cur_doc..
 | 
						|
}
 | 
						|
 | 
						|
void TPianifica_impianti::create_new_docs(TLog_report& log)
 | 
						|
{
 | 
						|
	const TDate dadata = _mask->get_date(F_DADATA);
 | 
						|
	const TDate adata = _mask->get_date(F_ADATA);
 | 
						|
	const int anno = dadata.year();
 | 
						|
  const TString& codnum = _mask->get(F_NUM);	//crea documenti con numerazioni sorgenti...
 | 
						|
	const TString& da_impianto = _mask->get(F_DAIMP);	//..con l'impianto sorgente! (conserva la supersimmetria)
 | 
						|
	//questi servono dopo!!!
 | 
						|
	const TString& a_impianto = _mask->get(F_AIMP);
 | 
						|
  TRelation rel_doc(LF_DOC);
 | 
						|
  TRectype darec(LF_DOC), arec(LF_DOC);
 | 
						|
	TLocalisamfile db(LF_RDIST);
 | 
						|
	TDate from(1, 1, anno - 1);
 | 
						|
	TDate to(31, 12, anno);
 | 
						|
 | 
						|
	db.setkey(2);
 | 
						|
	darec.put(DOC_DATADOC, from);	
 | 
						|
  darec.put(DOC_PROVV, "D");
 | 
						|
  darec.put(DOC_ANNO, anno);
 | 
						|
  darec.put(DOC_CODNUM, codnum);
 | 
						|
 | 
						|
	arec.put(DOC_DATADOC, to);
 | 
						|
  arec.put(DOC_PROVV, "D");
 | 
						|
  arec.put(DOC_ANNO, anno);
 | 
						|
  arec.put(DOC_CODNUM, codnum);
 | 
						|
 | 
						|
	TString filtro;
 | 
						|
	TDistinta_tree albero;
 | 
						|
	filtro << "CODNUM='" << codnum << "'";
 | 
						|
  TCursor cur_doc (&rel_doc, filtro, 3, &darec, &arec);
 | 
						|
  const long items = cur_doc.items();
 | 
						|
  cur_doc.freeze();
 | 
						|
  TProgind progind(items, "Generazione nuovi documenti in corso...", false, true);
 | 
						|
 | 
						|
	for (cur_doc = 0; cur_doc.pos() < items; ++cur_doc)
 | 
						|
  { 
 | 
						|
    progind.addstatus(1);
 | 
						|
    TDocumento doc(cur_doc.curr());
 | 
						|
		TDocumento nuovo_doc('D', anno, codnum, 0);
 | 
						|
 | 
						|
		// crea un documento...
 | 
						|
		nuovo_doc.copy_data(nuovo_doc, doc);
 | 
						|
		nuovo_doc.put(DOC_TIPODOC, codnum);	//il tipo deve corrispondere alla numerazione!
 | 
						|
		nuovo_doc.put(DOC_STATO, 2);
 | 
						|
		TDate datadoc = nuovo_doc.get(DOC_DATADOC);
 | 
						|
 | 
						|
		TDate h_datacons = nuovo_doc.get(DOC_DATACONS);
 | 
						|
 | 
						|
		if (h_datacons < dadata || h_datacons > adata)
 | 
						|
			continue;
 | 
						|
 | 
						|
    TDate datacons = h_datacons;
 | 
						|
 | 
						|
		
 | 
						|
		const int ndays = datacons - dadata;
 | 
						|
	
 | 
						|
		if (ndays > 365)
 | 
						|
			continue;
 | 
						|
 | 
						|
		datacons = (TDate &)_target_dates[ndays];
 | 
						|
		nuovo_doc.put(DOC_DATACONS, datacons);
 | 
						|
		
 | 
						|
		for (int i = 1; i <= doc.rows(); i++)
 | 
						|
		{
 | 
						|
			const TRiga_documento& source_row = doc[i];	//riga del documento sorgente
 | 
						|
			const TString80 codice(source_row.get(RDOC_CODARTMAG));
 | 
						|
 | 
						|
 | 
						|
  		//il casino va fatto solo se la riga non e' gia' evasa, l'impianto e' quello selezionato e la riga e' riga articolo
 | 
						|
			if (source_row.get(RDOC_IMPIANTO) == da_impianto && source_row.is_articolo())
 | 
						|
			{
 | 
						|
 | 
						|
				db.zero();
 | 
						|
				db.put("CODCOMP", codice);
 | 
						|
				const int err = db.read(_isgteq);
 | 
						|
 | 
						|
				if (err == NOERR && codice == db.get("CODCOMP"))
 | 
						|
				{
 | 
						|
					const TCodice_articolo dest_codart = db.get("CODDIST");
 | 
						|
					TArray labors;
 | 
						|
					bool found = false;
 | 
						|
					
 | 
						|
					albero.set_root(dest_codart);
 | 
						|
 | 
						|
          for (TRiga_esplosione * l = albero.first_labor(labors); l != NULL && !found; l = albero.next_labor(labors))
 | 
						|
					{
 | 
						|
						TLavorazione * lav = TDistinta_tree::find_labor(l);
 | 
						|
 | 
						|
						if (lav != NULL && a_impianto == lav->cod_impianto(0))
 | 
						|
						{
 | 
						|
							const int priority = source_row.get_int(RDOC_PRIORITY);
 | 
						|
							TDate datacons = source_row.get_date(RDOC_DATACONS);
 | 
						|
 | 
						|
							if (!datacons.ok())
 | 
						|
								datacons = h_datacons;
 | 
						|
							const int ndays = datacons - dadata;
 | 
						|
							datacons = (TDate &)_target_dates[ndays];
 | 
						|
							if (datacons < dadata || datacons > adata)
 | 
						|
								continue;
 | 
						|
							//..e la sua riga vuota
 | 
						|
							TRiga_documento& nuova_rigadoc = nuovo_doc.new_row(source_row.get(RDOC_TIPORIGA));
 | 
						|
							//riempie la nuova riga 
 | 
						|
 | 
						|
							nuovo_doc.copy_data(nuova_rigadoc, source_row);
 | 
						|
							nuova_rigadoc.put(RDOC_CODART, dest_codart);
 | 
						|
							nuova_rigadoc.put(RDOC_CODARTMAG, dest_codart);
 | 
						|
							nuova_rigadoc.put(RDOC_PRIORITY, priority);
 | 
						|
							nuova_rigadoc.zero(nuova_rigadoc.field_qtaevasa());
 | 
						|
							nuova_rigadoc.zero(RDOC_RIGAEVASA);
 | 
						|
							datacons = source_row.get_date(RDOC_DATACONS);
 | 
						|
							if (datacons.ok())
 | 
						|
							{
 | 
						|
								datacons = (TDate &)_target_dates[ndays];
 | 
						|
								nuova_rigadoc.put(RDOC_DATACONS, datacons);
 | 
						|
							}
 | 
						|
							nuova_rigadoc.put(RDOC_IMPIANTO, a_impianto);
 | 
						|
							const TString &linea = lav->cod_linea(0);
 | 
						|
							nuova_rigadoc.put(RDOC_LINEA, linea);
 | 
						|
							found = true;
 | 
						|
						}
 | 
						|
					}
 | 
						|
				}
 | 
						|
			}	//if(source_row.get...
 | 
						|
		}	//for(int i...
 | 
						|
		if (nuovo_doc.physical_rows() > 0)
 | 
						|
		{
 | 
						|
			int err = nuovo_doc.write();
 | 
						|
			if (err != NOERR)
 | 
						|
			{
 | 
						|
				TString errore;
 | 
						|
				errore.format("Errore %d nella scrittura del documento %ld", err, nuovo_doc.get_long(DOC_NDOC));
 | 
						|
				log.log(2, errore);
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}	//for(cur_doc...
 | 
						|
}
 | 
						|
 | 
						|
void TPianifica_impianti::main_loop()
 | 
						|
{
 | 
						|
  while (_mask->run() == K_ENTER)
 | 
						|
  {
 | 
						|
	  TDate dadata = _mask->get_date(F_DADATA);
 | 
						|
		TDate adata = _mask->get_date(F_ADATA);
 | 
						|
		TDate data, end_date;
 | 
						|
		const TString8 impianto = _mask->get(F_AIMP);
 | 
						|
		const TString8 linea = _mask->get(F_LIN);
 | 
						|
		TMRP_calendar c(linea, impianto);
 | 
						|
		int ndays = adata - dadata + 1;
 | 
						|
		const int ritardo = _mask->get_int(F_RITARDO);
 | 
						|
		int min, max;
 | 
						|
 | 
						|
		data = dadata;
 | 
						|
		end_date = dadata;
 | 
						|
		end_date += ritardo;
 | 
						|
		if (!data.is_holiday() && data.wday() != 6)
 | 
						|
		{
 | 
						|
			c.turni(end_date, min, max);
 | 
						|
 | 
						|
			while (max == 0 || end_date.is_holiday() || end_date.wday() == 6)
 | 
						|
				c.turni(++end_date, min, max);
 | 
						|
		}
 | 
						|
		_target_dates.add(end_date, 0);
 | 
						|
 | 
						|
		for (int i = 1; i < 366; i++)
 | 
						|
		{
 | 
						|
			data = dadata;
 | 
						|
			data += i;
 | 
						|
			end_date = (TDate &) _target_dates[i - 1];
 | 
						|
			++end_date;
 | 
						|
			if (!data.is_holiday() && data.wday() != 6)
 | 
						|
			{
 | 
						|
				c.turni(end_date, min, max);
 | 
						|
 | 
						|
				while (max == 0 || end_date.is_holiday() || end_date.wday() == 6)
 | 
						|
				{
 | 
						|
					++end_date;
 | 
						|
					c.turni(end_date, min, max);
 | 
						|
				}
 | 
						|
 | 
						|
			}
 | 
						|
			else 
 | 
						|
				if (end_date - data > ritardo)
 | 
						|
					--end_date;
 | 
						|
			_target_dates.add(end_date, i);
 | 
						|
		}
 | 
						|
		delete_old_docs(); //intanto accoppa i vecchi documenti di tipo destinazione
 | 
						|
		//poi crea i nuovi documenti di produzione
 | 
						|
		TLog_report log("Errori generazione documenti pianificazione");
 | 
						|
 | 
						|
		create_new_docs(log);	
 | 
						|
 | 
						|
		TReport_book buc;
 | 
						|
		buc.add(log);
 | 
						|
		buc.preview();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
bool TPianifica_impianti::create()
 | 
						|
{
 | 
						|
	open_files(LF_TAB, LF_TABCOM, LF_DOC, LF_RIGHEDOC, LF_DIST, LF_RDIST, LF_ANAMAG, NULL);
 | 
						|
	_mask = new TPianifica_impianti_mask;
 | 
						|
	return TSkeleton_application:: create();
 | 
						|
}
 | 
						|
 | 
						|
TPianifica_impianti::~TPianifica_impianti()
 | 
						|
{
 | 
						|
	delete _mask;
 | 
						|
}
 | 
						|
 | 
						|
TPianifica_impianti & app() { return (TPianifica_impianti&) main_app();}
 | 
						|
 | 
						|
int ps0920300(int argc, char* argv[])
 | 
						|
{
 | 
						|
  TPianifica_impianti a;
 | 
						|
  a.run(argc, argv, "Pianificazione impianti");
 | 
						|
  return 0;
 | 
						|
}
 |