201 lines
5.6 KiB
C++
201 lines
5.6 KiB
C++
|
#include <applicat.h>
|
|||
|
#include <reprint.h>
|
|||
|
|
|||
|
#include "ca1.h"
|
|||
|
#include "ca1600a.h"
|
|||
|
#include "calib01.h"
|
|||
|
#include "calib02.h"
|
|||
|
|
|||
|
///////////////////////////////////
|
|||
|
// Maschera
|
|||
|
///////////////////////////////////
|
|||
|
class TMask_print_cms : public TAutomask
|
|||
|
{
|
|||
|
|
|||
|
protected:
|
|||
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|||
|
public:
|
|||
|
TMask_print_cms();
|
|||
|
virtual ~TMask_print_cms() {}
|
|||
|
};
|
|||
|
|
|||
|
TMask_print_cms::TMask_print_cms()
|
|||
|
:TAutomask("ca1600a")
|
|||
|
{
|
|||
|
ca_create_fields(*this, 0, LF_COMMESSE, 3, 2, F_DACMS, F_DACMS + 100, 0x0, "#DACMS");
|
|||
|
int nfields = ca_create_fields(*this, 0, LF_COMMESSE, 3, 8, F_ACMS, F_ACMS + 100, 0x0, "#ACMS");
|
|||
|
for (int i = 0; i < nfields; i++)
|
|||
|
{
|
|||
|
TMask_field& dacms = field(F_DACMS + i);
|
|||
|
dacms.set_group(1);
|
|||
|
dacms.check_type(CHECK_NORMAL);
|
|||
|
TMask_field& acms = field(F_ACMS + i);
|
|||
|
acms.set_group(2);
|
|||
|
acms.check_type(CHECK_NORMAL);
|
|||
|
}
|
|||
|
//ci potrebbe essere pure il centro di costo (es. Dinamica con cdc=SEDE)
|
|||
|
TConfig& ini = ca_config();
|
|||
|
for (int i = 0; i < 2; i++)
|
|||
|
{
|
|||
|
const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2
|
|||
|
if (level == "CDC") // Crea centro di costo
|
|||
|
{
|
|||
|
ca_create_fields(*this, 0, LF_CDC, 3, 15, F_CDC, F_DESCDC);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
bool TMask_print_cms::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|||
|
{
|
|||
|
switch (o.dlg())
|
|||
|
{
|
|||
|
case F_ANNO:
|
|||
|
if (e == fe_modify && !o.empty())
|
|||
|
{
|
|||
|
TEsercizi_contabili esc;
|
|||
|
TDate inies, fines;
|
|||
|
if (esc.code2range(atoi(o.get()), inies, fines))
|
|||
|
{
|
|||
|
set(F_DADATA, inies);
|
|||
|
set(F_ADATA, fines);
|
|||
|
}
|
|||
|
}
|
|||
|
break;
|
|||
|
/*case F_DADATA:
|
|||
|
case F_ADATA:
|
|||
|
if (e == fe_close)
|
|||
|
{
|
|||
|
const int anno = get_int(F_ANNO);
|
|||
|
if (anno > 0) //se viene selezionato un esercizio..
|
|||
|
{
|
|||
|
TEsercizi_contabili esc; //..le date devono essere incluse nell'esercizio selezionato!
|
|||
|
const TDate data = o.get();
|
|||
|
if (!data.empty() && esc.date2esc(data) != anno)
|
|||
|
return error_box(TR("La data deve appartenere all'anno selezionato"));
|
|||
|
}
|
|||
|
}
|
|||
|
break;*/
|
|||
|
default:
|
|||
|
break;
|
|||
|
}
|
|||
|
return true;
|
|||
|
}
|
|||
|
|
|||
|
///////////////////////////////////
|
|||
|
// Applicazione
|
|||
|
///////////////////////////////////
|
|||
|
class TPrint_cms : public TSkeleton_application
|
|||
|
{
|
|||
|
protected:
|
|||
|
virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM
|
|||
|
|
|||
|
virtual bool create();
|
|||
|
|
|||
|
public:
|
|||
|
virtual void main_loop();
|
|||
|
};
|
|||
|
|
|||
|
bool TPrint_cms::create()
|
|||
|
{
|
|||
|
const TMultilevel_code_info& mci = ca_multilevel_code_info(LF_COMMESSE);
|
|||
|
if (mci.levels() <= 0)
|
|||
|
return error_box(TR("Le commesse non sono state configurate"));
|
|||
|
|
|||
|
return TSkeleton_application::create();
|
|||
|
}
|
|||
|
|
|||
|
void TPrint_cms::main_loop()
|
|||
|
{
|
|||
|
TFilename path;
|
|||
|
TMask_print_cms m;
|
|||
|
while (m.run() == K_ENTER)
|
|||
|
{
|
|||
|
TReport_book book;
|
|||
|
TAnal_report rep;
|
|||
|
|
|||
|
path = m.get(F_REPORT);
|
|||
|
if (path.empty())
|
|||
|
path = "ca1600a";
|
|||
|
|
|||
|
rep.load(path);
|
|||
|
|
|||
|
//aggiunta con controllo parametri di filtro particolari (Adolf rikiesta)
|
|||
|
const int anno = m.get_int(F_ANNO);
|
|||
|
const TDate dadata = m.get_date(F_DADATA);
|
|||
|
const TDate adata = m.get_date(F_ADATA);
|
|||
|
TString cdc;
|
|||
|
for (short cdc_id = F_CDC; m.id2pos(cdc_id) > 0; cdc_id++)
|
|||
|
cdc << m.get(cdc_id);
|
|||
|
if (anno > 0 || dadata.ok() || adata.ok() || cdc.full())
|
|||
|
{
|
|||
|
TString query;
|
|||
|
//se ANNO <20> specificato sono possibili i casi:
|
|||
|
//a) vengono specificate entrambe le date limite: cms con anno=ANNO,dadata>=DATAINIZIO,adata<=DATAFINE
|
|||
|
//b) non vengono specificate entrambe le date limite: sono le cms con anno=ANNO
|
|||
|
//c) specificata solo dadata: cms con anno=ANNO,dadata>=DATAINIZIO,finiscono quando gli pare
|
|||
|
//d) specificata solo adata: cms con anno=ANNO,adata<=DATAIFINE,cominciano quando gli pare
|
|||
|
//Se si vuole indicare periodi specifici non legati al campo anno si ottengono le commesse che,nel corso della...
|
|||
|
//...loro vita,sono interessate dalle date indicate
|
|||
|
//e) specificando adata prende le cms che abbiano DATAINIZIO>=dadata, ovvero che comincino dopo dadata
|
|||
|
//f) specificando dadata prende le cms che abbiano DATAFINE<=adata, ovvero che terminino entro adata
|
|||
|
|
|||
|
if (query.full())
|
|||
|
query << "&&";
|
|||
|
|
|||
|
if (dadata.ok() || adata.ok())
|
|||
|
{
|
|||
|
if (dadata.ok())
|
|||
|
query << "(NUM(ANSI(DATAINIZIO))>=" << dadata.date2ansi() << ")";
|
|||
|
if (dadata.ok() && adata.ok())
|
|||
|
query << "&&";
|
|||
|
if (adata.ok())
|
|||
|
query << "(NUM(ANSI(DATAFINE))<=" << adata.date2ansi() << ")";
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
if (anno > 0)
|
|||
|
{
|
|||
|
if (query.full())
|
|||
|
query << "&&";
|
|||
|
query << "(ANNO='" << anno << "')";
|
|||
|
}
|
|||
|
|
|||
|
if (cdc.full())
|
|||
|
{
|
|||
|
if (query.full()) query << "&&";
|
|||
|
query << "(CODCOSTO='" << cdc << "')";
|
|||
|
}
|
|||
|
|
|||
|
//inserisce la USE e la SELECT all'inizio (tecnica per aggirare il problema degli && ignoti)
|
|||
|
query.insert("USE COMMESSE\nSELECT ");
|
|||
|
|
|||
|
//e se la commessa fosse strutturata?
|
|||
|
TString codcms;
|
|||
|
for (short codcms_id = F_DACMS; m.id2pos(codcms_id) > 0; codcms_id++)
|
|||
|
codcms << m.get(codcms_id);
|
|||
|
if (codcms.full()) //non c'e' bisogno di query.full() x' c'e' gia la USE
|
|||
|
query << "/n" << "FROM CODCMS='" << codcms << "'";
|
|||
|
|
|||
|
for (short codcms_id = F_ACMS; m.id2pos(codcms_id) > 0; codcms_id++)
|
|||
|
codcms << m.get(codcms_id);
|
|||
|
if (codcms.full())
|
|||
|
query << "/n" << "TO CODCMS='" << codcms << "'";
|
|||
|
|
|||
|
//cabia la query al report
|
|||
|
rep.set_recordset(query);
|
|||
|
}
|
|||
|
|
|||
|
rep.mask2report(m);
|
|||
|
book.add(rep);
|
|||
|
book.print_or_preview();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
int ca1600(int argc, char* argv[])
|
|||
|
{
|
|||
|
TPrint_cms a;
|
|||
|
a.run(argc, argv, TR("Stampa commesse"));
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|