#include #include #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 { 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 è 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; }