Files correlati : Ricompilazione Demo : [ ] Commento : Eliminati include inutili git-svn-id: svn://10.65.10.50/trunk@18496 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			340 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			340 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						||
#include <automask.h>
 | 
						||
#include <config.h>
 | 
						||
#include <reprint.h>
 | 
						||
#include <textset.h>
 | 
						||
 | 
						||
#include "lv2700a.h"
 | 
						||
 | 
						||
class TRiepBolle_recordset: public TCSV_recordset
 | 
						||
{
 | 
						||
public:
 | 
						||
  TRiepBolle_recordset(): TCSV_recordset("CSV(\"\t\")") {}
 | 
						||
};
 | 
						||
 | 
						||
struct TStruttura: public TObject
 | 
						||
{ 
 | 
						||
  long _cliente;
 | 
						||
  TString _articolo; 
 | 
						||
  TString _descr;
 | 
						||
  TDate _dataDoc;
 | 
						||
  int _numeroDoc;
 | 
						||
  long _qta;
 | 
						||
  TStruttura():_cliente(0),_articolo(""),_descr(""),_dataDoc(""),_numeroDoc(0),_qta(0) {}
 | 
						||
  TStruttura(long cliente, TString articolo, TString descr,
 | 
						||
             TDate dataDoc, int numeroDoc, long qta):_cliente(cliente),_articolo(articolo),_descr(descr),_dataDoc(dataDoc),_numeroDoc(numeroDoc),_qta(qta) {}
 | 
						||
};
 | 
						||
 | 
						||
struct TStrutturaData: public TObject
 | 
						||
{ 
 | 
						||
  TDate _dataDoc;
 | 
						||
  int _numeroDoc;
 | 
						||
  int _cliente;
 | 
						||
  int _posizione;
 | 
						||
  TStrutturaData():_cliente(0),_dataDoc(""),_numeroDoc(0),_posizione(0) {}
 | 
						||
  TStrutturaData(int posizione, int cliente,
 | 
						||
    TDate dataDoc, int numeroDoc):_posizione(posizione), _dataDoc(dataDoc),_numeroDoc(numeroDoc) {}
 | 
						||
};
 | 
						||
 | 
						||
 | 
						||
class TRiepBolle_mask: public TAutomask
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						||
public:
 | 
						||
  TRiepBolle_mask():TAutomask("lv2700a"){}
 | 
						||
};
 | 
						||
 | 
						||
bool TRiepBolle_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						||
{
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
class TRiepBolle_report : public TReport
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual bool use_mask() { return false; }
 | 
						||
};
 | 
						||
 | 
						||
class TRiepBolle_app: public TSkeleton_application
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual void main_loop();
 | 
						||
  void elabora(const TMask& mask) const;
 | 
						||
  TString getQuery(bool isArticolo) const;
 | 
						||
};
 | 
						||
 | 
						||
TString TRiepBolle_app::getQuery(bool isArticolo) const
 | 
						||
{
 | 
						||
  /*
 | 
						||
  RICHIESTA QUERY:
 | 
						||
  estrazione di tutte le bolle in base ai range della parametrica:
 | 
						||
  - cliente 
 | 
						||
  - data
 | 
						||
  - zona
 | 
						||
  Inoltre estrarre in base alla causale di lavanderia tutte quelle
 | 
						||
  righe che non sono di reso (2000@.B2!='X').
 | 
						||
  Dalla causale di lavanderia agganciare la causale di magazzino 
 | 
						||
  consegnata e verificare che abbiano il segno '+' nel campo
 | 
						||
  consegnato mese (3000@.S2[37,38] ='+1').
 | 
						||
  le bolle sono determinate dal file di configurazione Ditta.ini
 | 
						||
  */
 | 
						||
 | 
						||
  //Stringhe x composizione query
 | 
						||
  TString query, select, between, orderBy, join, from_, to_;
 | 
						||
  
 | 
						||
  //Richiamo parametri della ditta di configurazione
 | 
						||
  //file Ditta.ini
 | 
						||
  TConfig lvini(CONFIG_DITTA, "lv");
 | 
						||
  const TString4 codnum  = lvini.get("NUM_GEN");
 | 
						||
  const TString4 tipodoc = lvini.get("TIPODOC_GEN");
 | 
						||
 | 
						||
  select  << "USE RDOC KEY 1\n";
 | 
						||
  select  << "SELECT ((2000@.B2!='X')&&(3000@.S2[37,38] ='+1')&&(DOC.TIPODOC='" << tipodoc << "')&&";
 | 
						||
  between << "(BETWEEN(DOC.ZONA,#F_ZONA_FROM,#F_ZONA_FROM))&&(BETWEEN(DOC.DATADOC,#F_DATA_FROM,#F_DATA_TO))&&(BETWEEN(DOC.CODCF,#F_CODCF_FROM,#F_CODCF_TO)))\n";
 | 
						||
 | 
						||
  if(isArticolo)
 | 
						||
    orderBy << "BY DOC.CODCF CODART DOC.DATADOC NDOC\n";
 | 
						||
  else
 | 
						||
    orderBy << "BY DOC.CODCF DOC.DATADOC NDOC\n";
 | 
						||
  
 | 
						||
  join    << "JOIN DOC TO RDOC ALIAS 1000 INTO CODNUM==CODNUM ANNO==ANNO PROVV==PROVV NDOC==NDOC\n";
 | 
						||
  join    << "JOIN &LVCAU TO RDOC ALIAS 2000 INTO CODTAB==CODAGG1\n";
 | 
						||
  join    << "JOIN %CAU TO &LVCAU ALIAS 3000 INTO CODTAB==S2\n";
 | 
						||
 | 
						||
  from_   << "FROM CODNUM='" << codnum << "'\n";
 | 
						||
  to_     << "TO CODNUM='"   << codnum << "'";
 | 
						||
 | 
						||
  query << select << between << orderBy << join << from_ << to_;
 | 
						||
  
 | 
						||
  return query;
 | 
						||
}
 | 
						||
 | 
						||
class TRiepilogo: public TArray
 | 
						||
{
 | 
						||
public:
 | 
						||
  void add(int count,long cliente, TString articolo, TString descr,
 | 
						||
           TDate dataDoc, int numeroDoc, long qta);
 | 
						||
  TRiepilogo():TArray(9){}
 | 
						||
};
 | 
						||
 | 
						||
class TRiepilogoData: public TArray
 | 
						||
{
 | 
						||
public:
 | 
						||
  void add(int posizione,int cliente, TDate dataDoc, int numeroDoc);
 | 
						||
  TRiepilogoData():TArray(){}
 | 
						||
};
 | 
						||
 | 
						||
void TRiepilogo::add(int count,long cliente, TString articolo, TString descr,
 | 
						||
                     TDate dataDoc, int numeroDoc, long qta) 
 | 
						||
{
 | 
						||
  TStruttura* struttura = new TStruttura(cliente,articolo, descr,dataDoc,numeroDoc,qta);
 | 
						||
  TArray::add(struttura,count);  
 | 
						||
}
 | 
						||
 | 
						||
void TRiepilogoData::add(int posizione,int cliente, TDate dataDoc, int numeroDoc) 
 | 
						||
{
 | 
						||
  TStrutturaData* strutturaData = new TStrutturaData(posizione,cliente, dataDoc,numeroDoc);
 | 
						||
  TArray::add(strutturaData,posizione);  
 | 
						||
}
 | 
						||
 | 
						||
void TRiepBolle_app:: elabora(const TMask& mask)const
 | 
						||
{
 | 
						||
  TISAM_recordset riep(getQuery(true));
 | 
						||
 | 
						||
  //inserire parametri filtri
 | 
						||
  riep.set_var("#F_DATA_FROM",mask.get_date(F_DATA_DA));
 | 
						||
  riep.set_var("#F_DATA_TO",mask.get_date(F_DATA_A));  
 | 
						||
  riep.set_var("#F_CODCF_FROM",TVariant(mask.get(F_CODCF_DA)));
 | 
						||
  riep.set_var("#F_CODCF_TO",TVariant(mask.get(F_CODCF_A)));
 | 
						||
  riep.set_var("#F_ZONA_FROM",TVariant(mask.get(F_ZONA)));
 | 
						||
 | 
						||
  
 | 
						||
  TRiepilogo     riepilogo;  
 | 
						||
  TRiepilogoData riepilogoData;
 | 
						||
  TRiepilogoData riepilogoData2;
 | 
						||
  int count = 1;
 | 
						||
 | 
						||
  for(bool ok = riep.move_first();ok;ok=riep.move_next())
 | 
						||
  {
 | 
						||
    TDate dataDoc = riep.get("DOC.DATADOC").as_date();  
 | 
						||
    long cliente  = riep.get("DOC.CODCF").as_int();
 | 
						||
    TString articolo = riep.get("CODART").as_string();
 | 
						||
    TString descr = riep.get("DESCR").as_string();
 | 
						||
    int numeroDoc  = riep.get("NDOC").as_int();
 | 
						||
    long qta  = riep.get("QTA").as_int();
 | 
						||
   
 | 
						||
    riepilogo.add(count,cliente,articolo,descr,dataDoc,numeroDoc,qta);
 | 
						||
    count++;
 | 
						||
  } 
 | 
						||
 | 
						||
 
 | 
						||
  TRiepBolle_report rep;
 | 
						||
  bool stampa = rep.load("lv2700a");
 | 
						||
  TRiepBolle_recordset* riep_set = new TRiepBolle_recordset();
 | 
						||
  rep.set_recordset(riep_set);
 | 
						||
 | 
						||
  int clienteOld = 0;
 | 
						||
  TString articoloOld;
 | 
						||
  int contatore = 0;
 | 
						||
 | 
						||
  FOR_EACH_ARRAY_ITEM(riepilogo,c,obj)//scandisce clienti e tiene
 | 
						||
    //buoni solo quelli valorizzati
 | 
						||
  {
 | 
						||
    TStruttura& s = *(TStruttura*) obj;
 | 
						||
         
 | 
						||
    if(clienteOld!=s._cliente || 
 | 
						||
       articoloOld!=s._articolo)
 | 
						||
    {
 | 
						||
      riep_set->new_rec();
 | 
						||
      
 | 
						||
      riep_set->set(0,TVariant(long (s._cliente)));//CAMPO DI ROTTURA    
 | 
						||
      riep_set->set(1,TVariant(long (s._cliente)));     
 | 
						||
      riep_set->set(2,TVariant(s._articolo));
 | 
						||
      riep_set->set(3,TVariant(s._descr));
 | 
						||
 | 
						||
      contatore=4;
 | 
						||
 | 
						||
      if(clienteOld!=s._cliente)
 | 
						||
      {
 | 
						||
        //Per ogni cliente creo una struttura di date. <20> necessario
 | 
						||
        //per il report.
 | 
						||
        TISAM_recordset dateDocAll(getQuery(false));
 | 
						||
 | 
						||
        //inserire parametri filtri
 | 
						||
        dateDocAll.set_var("#F_DATA_FROM",mask.get_date(F_DATA_DA));
 | 
						||
        dateDocAll.set_var("#F_DATA_TO",mask.get_date(F_DATA_A));  
 | 
						||
        dateDocAll.set_var("#F_CODCF_FROM",TVariant(long (s._cliente)));
 | 
						||
        dateDocAll.set_var("#F_CODCF_TO",TVariant(long (s._cliente)));
 | 
						||
        dateDocAll.set_var("#F_ZONA_FROM",TVariant(mask.get(F_ZONA)));
 | 
						||
 | 
						||
        TDate dateOld;
 | 
						||
        int numeroOld=0;
 | 
						||
        int cliente=0;
 | 
						||
        int posizione = 4;
 | 
						||
 | 
						||
        for(bool ok = dateDocAll.move_first();ok;ok=dateDocAll.move_next())
 | 
						||
        {
 | 
						||
          TDate dataDocTot = dateDocAll.get("DOC.DATADOC").as_date();  
 | 
						||
          int numeroDocTot = dateDocAll.get("NDOC").as_int();
 | 
						||
          int clientDocTot = dateDocAll.get("DOC.CODCF").as_int();
 | 
						||
         
 | 
						||
          if(dateOld  !=dataDocTot   || 
 | 
						||
            numeroOld !=numeroDocTot || 
 | 
						||
            cliente!=clientDocTot )
 | 
						||
          {
 | 
						||
            dateOld=dataDocTot;
 | 
						||
            numeroOld=numeroDocTot;
 | 
						||
            cliente=clientDocTot;
 | 
						||
            riepilogoData.add(posizione,clientDocTot,dataDocTot,numeroDocTot);
 | 
						||
            riepilogoData2.add(posizione,clientDocTot,dataDocTot,numeroDocTot);
 | 
						||
            posizione=posizione+3;
 | 
						||
          }
 | 
						||
        }
 | 
						||
      }
 | 
						||
 | 
						||
      clienteOld=s._cliente;
 | 
						||
      articoloOld=s._articolo;
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
    FOR_EACH_ARRAY_ITEM(riepilogoData,f,obj)
 | 
						||
    {
 | 
						||
      TStrutturaData& sD = *(TStrutturaData*) obj;
 | 
						||
 | 
						||
      //ogni primo record riporto come titolo tutte le date-numero
 | 
						||
      if(contatore==4)
 | 
						||
      {
 | 
						||
        FOR_EACH_ARRAY_ITEM(riepilogoData2,f,obj)
 | 
						||
        {
 | 
						||
          
 | 
						||
          TStrutturaData& sD2 = *(TStrutturaData*) obj;
 | 
						||
          int contatore2 = sD2._posizione;
 | 
						||
 | 
						||
          TString tt = sD2._dataDoc;
 | 
						||
          TString tt2 = tt.sub(0,5);
 | 
						||
 | 
						||
          riep_set->set(contatore2,TVariant(tt2));
 | 
						||
          contatore2++;
 | 
						||
          riep_set->set(contatore2,TVariant(long (sD2._numeroDoc)));
 | 
						||
          contatore2++;
 | 
						||
          riep_set->set(contatore2,TVariant(long (0)));
 | 
						||
          contatore2++;  
 | 
						||
        }  
 | 
						||
      }
 | 
						||
  
 | 
						||
      //posizionamento qta in base alla data-numero
 | 
						||
      if(s._dataDoc==sD._dataDoc && s._numeroDoc==sD._numeroDoc)
 | 
						||
      {
 | 
						||
        contatore = sD._posizione;
 | 
						||
 | 
						||
        TString tt = s._dataDoc;
 | 
						||
        TString tt2 = tt.sub(0,5);
 | 
						||
 | 
						||
        riep_set->set(contatore,TVariant(tt2));
 | 
						||
        contatore++;
 | 
						||
        riep_set->set(contatore,TVariant(long (s._numeroDoc)));
 | 
						||
        contatore++;
 | 
						||
        riep_set->set(contatore,TVariant(long (s._qta)));
 | 
						||
        contatore++;  
 | 
						||
 | 
						||
 | 
						||
        TArray* p = (TArray*) obj;
 | 
						||
        int e = p->size();
 | 
						||
        e=e+1;
 | 
						||
        while(72>contatore)
 | 
						||
        {
 | 
						||
          contatore++;
 | 
						||
          contatore++;
 | 
						||
          riep_set->set(contatore,TVariant(long (0)));
 | 
						||
          contatore++;  
 | 
						||
        }
 | 
						||
 | 
						||
        break;
 | 
						||
      }  
 | 
						||
      else
 | 
						||
      {
 | 
						||
        contatore++;
 | 
						||
        contatore++;
 | 
						||
        riep_set->set(contatore,TVariant(long (0)));
 | 
						||
        contatore++;  
 | 
						||
        
 | 
						||
      }
 | 
						||
    }       
 | 
						||
  }
 | 
						||
 | 
						||
  //Crea file che contiene il recordset
 | 
						||
  //riep_set->save_as("c:\\riepilogoBolla.txt");
 | 
						||
 | 
						||
  if(stampa)
 | 
						||
  {
 | 
						||
    //carica tutte le variabili del report.
 | 
						||
    rep.mask2report(mask);
 | 
						||
 | 
						||
    TReport_book b;
 | 
						||
    bool ok = b.add(rep);// Richiede parametri di stampa in base alla maschera omonima
 | 
						||
    if (ok)
 | 
						||
    {
 | 
						||
      if (b.pages() > 0)
 | 
						||
        b.print_or_preview(); // Stampa effettivamente
 | 
						||
      else
 | 
						||
        warning_box (TR("Nessun record estratto per i parametri inseriti"));
 | 
						||
    }
 | 
						||
  }
 | 
						||
}
 | 
						||
 | 
						||
void TRiepBolle_app::main_loop()
 | 
						||
{
 | 
						||
  TRiepBolle_mask m;
 | 
						||
  while(m.run()==K_ENTER)
 | 
						||
  {
 | 
						||
    elabora(m);    
 | 
						||
  }  
 | 
						||
}
 | 
						||
 | 
						||
int lv2700(int argc, char* argv[])
 | 
						||
{
 | 
						||
  TRiepBolle_app app;
 | 
						||
  app.run(argc, argv, TR("Stampa Riepilogo Bolle di Lavanderia"));
 | 
						||
  return 0;
 | 
						||
} |