Files correlati : Ricompilazione Demo : [ ] Commento : ca3: corretta la gestione dei doc_speciali che sono figli di FDR/FDE (non aveva mai funzionato nella storia) ca2: corretta la gestione saldi analitici; adesso prima di cancellare i saldana controlla di essere l'unico programma che accede a saldana git-svn-id: svn://10.65.10.50/trunk@20458 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			218 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			218 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <automask.h>
 | 
						|
#include <progind.h>
 | 
						|
#include <recset.h>
 | 
						|
 | 
						|
#include "calib01.h"
 | 
						|
#include "ca2.h"
 | 
						|
#include "ca2300a.h"
 | 
						|
 | 
						|
#include "../cg/cglib01.h"
 | 
						|
 | 
						|
#include "movana.h"
 | 
						|
#include "rmovana.h"
 | 
						|
#include "saldana.h"
 | 
						|
 | 
						|
//--------------------------------------------------------------------
 | 
						|
//  MASCHERA
 | 
						|
//--------------------------------------------------------------------
 | 
						|
class TRic_saldi_msk : public TAutomask
 | 
						|
{
 | 
						|
protected:
 | 
						|
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						|
 | 
						|
public:
 | 
						|
  TRic_saldi_msk();  
 | 
						|
  virtual ~TRic_saldi_msk(){};
 | 
						|
};
 | 
						|
 | 
						|
bool TRic_saldi_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						|
{
 | 
						|
  switch (o.dlg())
 | 
						|
  {
 | 
						|
  case F_ANNO:
 | 
						|
    if (e == fe_init || e == fe_modify)
 | 
						|
    {
 | 
						|
      //in base all'esercizio selezionato dall'utonto, questo magico programma cerca quale è il movimento con data..
 | 
						|
      //..competenza più antica che interessa l'esercizio selezionato (ricordiamo che i movimenti possono avere..
 | 
						|
      //..durata pluriennale, da istruzioni adolfiche) ed esegue dall'esercizio contenente tale data il ricalcolo..
 | 
						|
      //..dei saldi (Silvan non sei nessuno!)
 | 
						|
      const int selected_anno = atoi(o.get());
 | 
						|
      TEsercizi_contabili esc;
 | 
						|
      TDate datainiesc, datafinesc;
 | 
						|
      esc.code2range(selected_anno, datainiesc, datafinesc);
 | 
						|
      TString query;
 | 
						|
      query << "USE MOVANA\nSELECT (BETWEEN(DATAFCOMP,#DATAINIESC,0))||(AUTOFCOMP==\"X\")";
 | 
						|
      TISAM_recordset recset(query);
 | 
						|
      recset.set_var("#DATAINIESC", datainiesc);
 | 
						|
      
 | 
						|
      TDate datacomp = datainiesc;
 | 
						|
 | 
						|
      const long recset_items = recset.items();
 | 
						|
      TProgind pi(recset_items, "Ricerca movimenti che interessano l'esercizio selezionato...", true, true);
 | 
						|
      for (bool ok = recset.move_first(); ok; ok = recset.move_next())
 | 
						|
      {
 | 
						|
        if (!pi.addstatus(1))
 | 
						|
          break;
 | 
						|
 | 
						|
        const TDate curr_date = recset.get(MOVANA_DATACOMP).as_date();
 | 
						|
        if (curr_date < datacomp)
 | 
						|
          datacomp = curr_date;
 | 
						|
      }
 | 
						|
      const int first_anno = esc.date2esc(datacomp);
 | 
						|
      set(F_FIRST_ANNO, first_anno);
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  default:
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
TRic_saldi_msk::TRic_saldi_msk() :TAutomask ("ca2300a") { }  
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// TAnal_mov_ric
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class TAnal_mov_ric : public TAnal_mov
 | 
						|
{
 | 
						|
  int _annoes;
 | 
						|
 | 
						|
public:
 | 
						|
  virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop);
 | 
						|
  virtual int read(TBaseisamfile& f, word op, word lockop);
 | 
						|
 | 
						|
public:
 | 
						|
  void set_annoes(int anno) { _annoes = anno; }
 | 
						|
  TAnal_mov_ric(long numreg = 0) : TAnal_mov(numreg), _annoes(0) {}
 | 
						|
};
 | 
						|
 | 
						|
int TAnal_mov_ric::readat(TBaseisamfile& f, TRecnotype nrec, word lockop)
 | 
						|
{
 | 
						|
  const int err = TMultiple_rectype::readat(f, nrec, lockop);
 | 
						|
  
 | 
						|
	kill_saldi();
 | 
						|
  load_saldi(false);
 | 
						|
  save_saldi(_annoes);
 | 
						|
 | 
						|
  return err;
 | 
						|
}
 | 
						|
 | 
						|
int TAnal_mov_ric::read(TBaseisamfile& f, word op, word lockop)
 | 
						|
{
 | 
						|
  const int err = TMultiple_rectype::read(f, op, lockop);
 | 
						|
	
 | 
						|
	kill_saldi();
 | 
						|
	load_saldi(false);
 | 
						|
  save_saldi(_annoes);
 | 
						|
 | 
						|
  return err;
 | 
						|
}
 | 
						|
 | 
						|
//--------------------------------------------------------------------
 | 
						|
//  APPLICAZIONE
 | 
						|
//--------------------------------------------------------------------
 | 
						|
 | 
						|
class TRic_saldi_app : public TSkeleton_application
 | 
						|
{
 | 
						|
  TRic_saldi_msk * _mask;
 | 
						|
 | 
						|
protected:
 | 
						|
  virtual const char * extra_modules() const {return "cm";} //deve funzionare anche per le commesse
 | 
						|
 | 
						|
  virtual bool create();
 | 
						|
  virtual bool destroy();
 | 
						|
  virtual void main_loop();
 | 
						|
  static bool elabora_movimento(const TRelation& rel, void* pJolly) {	return true; }
 | 
						|
  bool remove_saldi(const int first_anno);
 | 
						|
 | 
						|
public:
 | 
						|
  TRic_saldi_app() {}
 | 
						|
  virtual ~TRic_saldi_app() {}
 | 
						|
};
 | 
						|
 | 
						|
bool TRic_saldi_app::create()
 | 
						|
{
 | 
						|
  _mask = new TRic_saldi_msk;  
 | 
						|
  return TSkeleton_application::create();
 | 
						|
}
 | 
						|
 | 
						|
bool TRic_saldi_app::destroy()
 | 
						|
{
 | 
						|
  delete _mask;
 | 
						|
  return TSkeleton_application::destroy();
 | 
						|
}
 | 
						|
 | 
						|
bool TRic_saldi_app::remove_saldi(const int first_anno)
 | 
						|
{
 | 
						|
  TSystemisamfile saldana(LF_SALDANA);
 | 
						|
  const bool can_do = saldana.open(_excllock) == NOERR;
 | 
						|
  if (can_do)
 | 
						|
  {
 | 
						|
    //deve azzerare i saldi a partire dal primo anno di interesse
 | 
						|
    TString query;
 | 
						|
    query << "USE SALDANA\nFROM ANNO=#ANNO";
 | 
						|
 | 
						|
    TISAM_recordset recset(query);
 | 
						|
    recset.set_var("#ANNO", long(first_anno));
 | 
						|
    const long recset_items = recset.items();
 | 
						|
    TProgind pi(recset_items, "Azzeramento saldi...", true, true);
 | 
						|
 | 
						|
    const TRectype& rec_saldana = recset.cursor()->curr();
 | 
						|
    for (bool ok = recset.move_first(); ok; ok = recset.move_next())
 | 
						|
    {
 | 
						|
      if (!pi.addstatus(1))
 | 
						|
        break;
 | 
						|
      rec_saldana.remove(saldana);
 | 
						|
    }
 | 
						|
    //alla fine compatta il file
 | 
						|
    saldana.close();
 | 
						|
    saldana.pack(true, false);
 | 
						|
  }
 | 
						|
  else
 | 
						|
    error_box("Inpossibile procedere! File dei saldi analitici in uso");
 | 
						|
 | 
						|
	return can_do;
 | 
						|
}
 | 
						|
 | 
						|
void TRic_saldi_app::main_loop()
 | 
						|
{
 | 
						|
  while (_mask->run() == K_ENTER)
 | 
						|
  { 
 | 
						|
    //Il ricalcolo saldi e' diviso in 2 fasi:
 | 
						|
    //1  Azzeramento e ricalcolo dei saldi dei movimenti di tipo normale o temporaneo per il solo anno selezionato
 | 
						|
    //2  Azzeramento e ricalcolo dei saldi dei movimenti di tipo preventivo o variazione per TUTTI gli esercizi..
 | 
						|
    //..questo perche' i movimenti P e T possono essere "spalmati" su piu' anni
 | 
						|
 | 
						|
    //AZZERAMENTO dei saldi
 | 
						|
		const int first_anno = _mask->get_int(F_FIRST_ANNO);
 | 
						|
    remove_saldi(first_anno);
 | 
						|
 | 
						|
    //RICOSTRUZIONE saldi (eventualmente spammati su piu' anni)
 | 
						|
    TEsercizi_contabili esc;
 | 
						|
    const TDate datainies = esc[first_anno].inizio();
 | 
						|
    TRelation rel_movana(LF_MOVANA);
 | 
						|
    TRectype darec(LF_MOVANA);
 | 
						|
    darec.put(MOVANA_DATACOMP, datainies);
 | 
						|
 | 
						|
    TCursor cur_movana(&rel_movana, "", 2, &darec);
 | 
						|
    const long items = cur_movana.items();
 | 
						|
 | 
						|
    if (items > 0)
 | 
						|
    {
 | 
						|
      TAnal_mov_ric* amr = new TAnal_mov_ric;
 | 
						|
      amr->set_annoes(0);
 | 
						|
      rel_movana.lfile().set_curr(amr); //il record principale della rel e' un TMov_anal!!
 | 
						|
      cur_movana.scan(elabora_movimento, this, "Ricostruzione saldi...");
 | 
						|
      rel_movana.lfile().set_curr(new TRectype(LF_MOVANA)); //il record principale della rel e' un TMov_anal!!
 | 
						|
    }
 | 
						|
  } 
 | 
						|
}
 | 
						|
 | 
						|
int ca2300(int argc, char* argv[])
 | 
						|
{
 | 
						|
  TRic_saldi_app app;
 | 
						|
  app.run(argc, argv, "Ricostruzione saldi di analitica");
 | 
						|
  return 0;
 | 
						|
}
 |