Files correlati :ca3 & friends Ricompilazione Demo : [ ] Commento :completato ca3800 (bilancio di commessa); spostato il prg x generare movana casuali in ca3400;aggiunto ca3900 (stima ricavi di competenza) anche a menu, ma da completare git-svn-id: svn://10.65.10.50/trunk@14348 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			299 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			299 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| #include <applicat.h>
 | |
| #include <mask.h>
 | |
| #include <progind.h>
 | |
| #include <urldefid.h>
 | |
| 
 | |
| #include <causali.h>
 | |
| #include <pconti.h>
 | |
| 
 | |
| #include "cdc.h"
 | |
| #include "fasi.h"
 | |
| #include "movana.h"
 | |
| #include "pconana.h"
 | |
| #include "rmovana.h"
 | |
| 
 | |
| #include "ca3.h"
 | |
| #include "calib01.h"
 | |
| #include "../cg/cglib01.h"
 | |
| 
 | |
| class TCode_generator
 | |
| {
 | |
|   TRelation* _rel;
 | |
|   TCursor* _cur;
 | |
| 
 | |
| public:
 | |
|   TRecnotype items() const { return _cur->items(); }
 | |
|   const TString& code();
 | |
|   
 | |
|   TCode_generator(int logicnum);
 | |
|   ~TCode_generator();
 | |
| };
 | |
| 
 | |
| const TString& TCode_generator::code()
 | |
| {
 | |
|   const TRecnotype i = items();
 | |
|   if (i > 0)
 | |
|   {
 | |
|     *_cur = rand() % i;
 | |
|     const TRectype& curr = _rel->curr();
 | |
|     const int logicnum = curr.num();
 | |
|     switch (logicnum)
 | |
|     {
 | |
|     case LF_CAUSALI:
 | |
|       return curr.get(CAU_CODCAUS);
 | |
|     case LF_CDC: 
 | |
|       return curr.get(CDC_CODCOSTO);
 | |
|     case LF_COMMESSE: 
 | |
|       return curr.get("CODCMS");
 | |
|     case LF_FASI: 
 | |
|       return curr.get(FASI_CODFASE);
 | |
|     case LF_PCON: 
 | |
|       {
 | |
|         TString& tmp = get_tmp_string(12);
 | |
|         tmp.format("%03d%03d%06ld", 
 | |
|                    curr.get_int(PCN_GRUPPO), curr.get_int(PCN_CONTO), curr.get_long(PCN_SOTTOCONTO));
 | |
|         return tmp;
 | |
|       }
 | |
|     case LF_PCONANA: 
 | |
|       return curr.get(PCONANA_CODCONTO);
 | |
|     default:
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
|   return EMPTY_STRING;
 | |
| }
 | |
| 
 | |
| 
 | |
| TCode_generator::TCode_generator(int logicnum)
 | |
| {
 | |
|   TWait_cursor hourglass;
 | |
|   TString filter;
 | |
| 
 | |
|   if (logicnum <= 0)
 | |
|   {
 | |
|    	TConfig& cfg = ca_config();
 | |
|     const bool use_pdcc =  cfg.get_bool("UsePdcc");
 | |
|     logicnum = use_pdcc ? LF_PCON : LF_PCONANA;
 | |
|   }
 | |
| 
 | |
|   switch (logicnum)
 | |
|   {
 | |
|   case LF_CAUSALI:
 | |
|     filter = "MOVIND=\"X\"";
 | |
|     break;
 | |
|   case LF_PCON:
 | |
|     filter = "SOTTOCONTO!=''";
 | |
|     break;
 | |
|   case LF_PCONANA:
 | |
|     {
 | |
|       const TMultilevel_code_info& info = ca_multilevel_code_info(LF_PCONANA);
 | |
|       const int min_len = info.total_len(-1);
 | |
|       filter << "STR(NUM(LEN(CODCONTO))>" << min_len << ')';
 | |
|     }
 | |
|     break;
 | |
|   default:
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   _rel = new TRelation(logicnum);
 | |
|   _cur = new TCursor(_rel, filter);
 | |
|   const TRecnotype conti = _cur->items();
 | |
|   _cur->freeze();
 | |
| }
 | |
| 
 | |
| TCode_generator::~TCode_generator()
 | |
| {
 | |
|   delete _cur;
 | |
|   delete _rel;
 | |
| }
 | |
| 
 | |
| ////////////////////////////////////////////////////////
 | |
| //	APPLICAZIONE
 | |
| ////////////////////////////////////////////////////////
 | |
| class TRandom_ca : public TSkeleton_application
 | |
| {
 | |
| protected:
 | |
|   bool chiedi_quanti(int& mov, bool& ric);
 | |
|   void kill_bill();
 | |
|   void genera(int quanti);
 | |
|   void genera_riclass();
 | |
| 
 | |
| public:
 | |
|   void riclassify(const TString& conto);
 | |
|   virtual void main_loop();
 | |
| };
 | |
| 
 | |
| bool TRandom_ca::chiedi_quanti(int& mov, bool& ric)
 | |
| {
 | |
|   TMask mask("Movimenti casuali ma perfetti", 1, 60, 6);
 | |
| 
 | |
|   TReal_field& add_number (short id, int page, const char* prompt, int x, int y, int dim,  const char* flags = "", int ndec = 0);
 | |
|   mask.add_number(101, 0, "Numero di movimenti ", 1, 1, 4, "U");
 | |
|   mask.add_boolean(102, 0, "Genera riclassificazioni", 1, 2);
 | |
|   mask.add_static (DLG_NULL, 0, "@bAttenzione: verranno distrutti movimenti e saldi", 1, 3);
 | |
|   mask.add_button(DLG_OK, 0, "", -12, -1, 10, 2);
 | |
|   mask.add_button(DLG_QUIT, 0, "", -22, -1, 10, 2);
 | |
|   mask.set(101, 100);
 | |
|   const bool ok = mask.run() != K_QUIT;
 | |
|   if (ok)
 | |
|   {
 | |
|     mov = (mask.get_int(101)+1)/2;
 | |
|     ric = mask.get_bool(102);
 | |
|   }
 | |
|   
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| void TRandom_ca::kill_bill()
 | |
| {
 | |
|   const int lnum[] = { LF_MOVANA, LF_RMOVANA, LF_SALDANA, 0 };
 | |
|   for (int i = 0; lnum[i]; i++)
 | |
|   {
 | |
|     TSystemisamfile f(lnum[i]);
 | |
|     f.zap();
 | |
|   }
 | |
| }
 | |
| 
 | |
| void TRandom_ca::riclassify(const TString& conto)
 | |
| {
 | |
|   const TMultilevel_code_info& info = ca_multilevel_code_info(LF_PCONANA);
 | |
|   const int min_len = info.total_len(-1);
 | |
|   if (conto.len() > min_len)
 | |
|   {
 | |
|     TRecord_array ric(conto, LF_PANAPDC);
 | |
| 
 | |
|     TCode_generator conti(LF_PCON);
 | |
|     const int righe = rand() % 4 + 1;
 | |
|     for (int i = 1; i <= righe; i++)
 | |
|     {
 | |
|       TRectype& row = ric.row(i, true);
 | |
|       const TString& c = conti.code();
 | |
|       row.put(PCN_GRUPPO,     c.mid(0, 3));
 | |
|       row.put(PCN_CONTO,      c.mid(3, 3));
 | |
|       row.put(PCN_SOTTOCONTO, c.mid(6, 6));
 | |
|     }
 | |
|     ric.write();
 | |
|   }
 | |
| }
 | |
| 
 | |
| static bool riclass_callback(const TRelation& rel, void* jolly)
 | |
| {
 | |
|   TRandom_ca* myself = (TRandom_ca*)jolly;
 | |
|   const TString80 conto = rel.curr().get(PCONANA_CODCONTO);
 | |
|   myself->riclassify(conto);
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| void TRandom_ca::genera_riclass()
 | |
| {
 | |
|   {
 | |
|     TSystemisamfile f(LF_PANAPDC);
 | |
|     f.zap();
 | |
|   }
 | |
| 
 | |
|   TRelation rel(LF_PCONANA);
 | |
|   TCursor cur(&rel);
 | |
|   cur.scan(riclass_callback, this, "Generazione riclassificazioni");
 | |
| }
 | |
| 
 | |
| void TRandom_ca::genera(int quanti)
 | |
| {
 | |
|   TEsercizi_contabili esc;
 | |
| 
 | |
|   TCode_generator conti(0);
 | |
|   TCode_generator commesse(LF_COMMESSE);
 | |
|   TCode_generator fasi(LF_FASI);
 | |
|   TCode_generator costi(LF_CDC);
 | |
|   TCode_generator causali(LF_CAUSALI);
 | |
| 
 | |
|   TLocalisamfile fmov(LF_MOVANA);
 | |
|   TProgind pi(quanti, "Generazione movimenti", FALSE, TRUE);
 | |
|   for (int m = 0; m < quanti; m++)
 | |
|   {
 | |
|     pi.addstatus(1);
 | |
|     TAnal_mov mov;
 | |
|   
 | |
|     TDate data(TODAY); data -= rand()%365;
 | |
|     mov.put(MOVANA_DATAREG, data);
 | |
|     mov.put(MOVANA_DATACOMP, data-1L);
 | |
|     mov.put(MOVANA_DATADOC, data-2L);
 | |
|     mov.put(MOVANA_ANNOES, esc.date2esc(data));
 | |
|     mov.put(MOVANA_DESCR, "Movimento random preventivo");
 | |
|     mov.put(MOVANA_TIPOMOV, "P");
 | |
|     mov.put(MOVANA_CODCAUS, causali.code());
 | |
| 
 | |
|     const int rows = rand()%10+1;
 | |
|     TImporto tot;
 | |
|     int i;
 | |
|     for (i = 0; i < rows; i++)
 | |
|     {
 | |
|       TRectype& rmov = mov.new_row();
 | |
|       TString80 descr; descr.format("Riga casuale %d", i+1);
 | |
|       rmov.put(RMOVANA_DESCR, descr);
 | |
|       rmov.put(RMOVANA_CODCONTO, conti.code());
 | |
|       rmov.put(RMOVANA_CODCMS, commesse.code());
 | |
|       rmov.put(RMOVANA_CODFASE, fasi.code());
 | |
|       rmov.put(RMOVANA_CODCCOSTO, costi.code());
 | |
| 
 | |
|       const TImporto imp(i & 0x1 ? 'A' : 'D', real(10*(rand()%1000+1)));
 | |
|       rmov.put(RMOVANA_SEZIONE, imp.sezione());
 | |
|       rmov.put(RMOVANA_IMPORTO, imp.valore());
 | |
|       tot += imp;
 | |
|     }
 | |
| 
 | |
|     tot.normalize();
 | |
|     mov.put(MOVANA_SEZIONE, tot.sezione());
 | |
|     mov.put(MOVANA_TOTDOC, tot.valore());
 | |
| 
 | |
|     mov.write(fmov);
 | |
| 
 | |
|     // Consuntivo
 | |
|     mov.put(MOVANA_NUMREG, mov.get_long(MOVANA_NUMREG)+1);
 | |
|     data += rand()%30+30;
 | |
|     mov.put(MOVANA_DATAREG, data);
 | |
|     mov.put(MOVANA_DATACOMP, data-1L);
 | |
|     mov.put(MOVANA_DATADOC, data-2L);
 | |
|     mov.put(MOVANA_ANNOES, esc.date2esc(data));
 | |
|     mov.put(MOVANA_DESCR, "Movimento random consuntivo");
 | |
|     mov.put(MOVANA_TIPOMOV, "");
 | |
| 
 | |
|     tot.set('D', ZERO);
 | |
|     for (i = 1; i <= rows; i++)
 | |
|     {
 | |
|       TRectype& rmov = mov.body()[i];
 | |
|       real imp = rmov.get(RMOVANA_IMPORTO);
 | |
|       imp += real((rand()%100)-50);
 | |
|       rmov.put(RMOVANA_IMPORTO, imp);
 | |
|       tot += TImporto(rmov.get_char(RMOVANA_SEZIONE), imp);
 | |
|     }
 | |
|     tot.normalize();
 | |
|     mov.put(MOVANA_SEZIONE, tot.sezione());
 | |
|     mov.put(MOVANA_TOTDOC, tot.valore());
 | |
|     
 | |
|     mov.write(fmov);
 | |
|   }
 | |
| }
 | |
| 
 | |
| void TRandom_ca::main_loop()
 | |
| {
 | |
|   int quanti = 100;
 | |
|   bool ric = false;
 | |
|   if (chiedi_quanti(quanti, ric))
 | |
|   {
 | |
|     if (quanti > 0)
 | |
|     {
 | |
|       kill_bill();
 | |
|       genera(quanti);
 | |
|     }
 | |
|     if (ric) 
 | |
|       genera_riclass();
 | |
|   }
 | |
| }
 | |
| 
 | |
| int ca3400(int argc, char* argv[])
 | |
| {
 | |
|   TRandom_ca a;
 | |
|   a.run(argc, argv, TR("Movimenti casuali ma perfetti"));
 | |
|   return 0;
 | |
| }
 |