#include #include #include #include #include #include #include #include "ps1002.h" #include "ps1002300a.h" ///////////////////////////////////// // Maschera //////////////////////////////////// class TRileva_produzione_msk : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); public: bool elabora(); TRileva_produzione_msk(); }; bool TRileva_produzione_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case DLG_ELABORA: if (e == fe_button) { elabora(); return true; } break; case F_DADATA: case F_ADATA: if (e == fe_close) { const TDate dadata = o.get(); } break; default: break; } return true; } bool TRileva_produzione_msk::elabora() { TString query; query << "USE RDOC KEY 4"; query << "\nSELECT (DOC.CODNUM=#CODNUM)&&(BETWEEN(DOC.DATADOC,#DADATA,#ADATA))&&((CODCMS!=\"\")||(FASCMS!=\"\"))"; query << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC"; query << "\nFROM DAPROVV=D DAANNO=#ANNO DACODNUM=BEM"; query << "\nTO DAPROVV=D DAANNO=#ANNO DACODNUM=BEM"; TISAM_recordset recset(query); recset.set_var("#CODNUM", get(F_CODNUM)); recset.set_var("#DADATA", get_date(F_DADATA)); recset.set_var("#ADATA", get_date(F_ADATA)); const long anno = get_date(F_DADATA).year(); recset.set_var("#ANNO", anno); const long items = recset.items(); const TDate dataprod = get_date(F_DATAPROD); TProgind pi(items, TR("Scansione righe documento in corso..."), true, true); TRectype& bolla_rec = recset.cursor()->curr(); //record corrente del recordset TLocalisamfile rdoc(LF_RIGHEDOC); //file delle righe documento con le BEM da aggiornare for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { if (!pi.addstatus(1)) break; //prende la quantita' dalla riga della bolla const real bolla_qta = bolla_rec.get_real(RDOC_QTA); if (bolla_qta > ZERO) { #ifdef DBG const TString& bolla_codnum = bolla_rec.get(RDOC_CODNUM); const int bolla_anno = bolla_rec.get_int(RDOC_ANNO); const long bolla_ndoc = bolla_rec.get_long(RDOC_NDOC); const int bolla_nriga = bolla_rec.get_int(RDOC_NRIGA); #endif //campi che servono per raccatare la riga della BEM const TString& bem_codnum = bolla_rec.get(RDOC_DACODNUM); const long bem_anno = bolla_rec.get_int(RDOC_DAANNO); const long bem_ndoc = bolla_rec.get_long(RDOC_DANDOC); const long bem_idriga = bolla_rec.get_int(RDOC_DAIDRIGA); //servono anche lavorazione e colore (almeno uno dei due c'e' in base alla query) const TString& bolla_lav = bolla_rec.get(RDOC_CODCMS); const TString& bolla_col = bolla_rec.get(RDOC_FASCMS); //adesso prende la riga documento della BEM e aggiorna i valori se deve //e' costretto ad usare una query e non una read() perche' IDRIGA non appartiene alle chiavi di RDOC TString bem_query; bem_query << "USE RDOC"; bem_query << "\nSELECT (IDRIGA=#IDRIGA)"; bem_query << "\nFROM CODNUM=BEM ANNO=#ANNO PROVV=D NDOC=#NDOC"; bem_query << "\nTO CODNUM=BEM ANNO=#ANNO PROVV=D NDOC=#NDOC"; TISAM_recordset bem_recset(bem_query); bem_recset.set_var("#IDRIGA", bem_idriga); bem_recset.set_var("#ANNO", bem_anno); bem_recset.set_var("#NDOC", bem_ndoc); const long bem_items = bem_recset.items(); if (bem_items > 1) return error_box("C'e' piu' di una riga della BEM %ld con IDRIGA = %ld", bem_ndoc, bem_idriga); /*TRectype& bem_rec = rdoc.curr(); const TString& bem_codnum = bolla_rec.get(RDOC_DACODNUM); //se non fosse BEM sarebbe un errore!!! bem_rec.put(RDOC_CODNUM, bem_codnum); const int bem_anno = bolla_rec.get_int(RDOC_DAANNO); bem_rec.put(RDOC_ANNO, bem_anno); bem_rec.put(RDOC_PROVV, 'D'); const long bem_ndoc = bolla_rec.get_long(RDOC_DANDOC); bem_rec.put(RDOC_NDOC, bem_ndoc); //occhio alla riga, raga! DAIDRIGA sulla rigabolla deve essere uguale a IDRIGA sulla rigabem, NON a NRIGA che è aleatorio! const int bem_idriga = bolla_rec.get_int(RDOC_DAIDRIGA); bem_rec.put(RDOC_IDRIGA, bem_idriga);*/ //if (bem_rec.read(rdoc) == NOERR) //{ TRectype& bem_rec = bem_recset.cursor()->curr(); const real bem_old_lav_qta = bem_rec.get_real(RDOC_QTAGG2); const real bem_old_col_qta = bem_rec.get_real(RDOC_QTAGG1); //solo le BEM a quantita' lavorazione e/o colore nulle possono essere aggiornate (senno' ci verrebbe del casino) if (bolla_lav.full() && bem_old_lav_qta == ZERO) //lavorazione { bem_rec.put(RDOC_CODCMS, bolla_lav); bem_rec.put(RDOC_QTAGG2, bolla_qta); bem_rec.put(RDOC_CODAGG2, dataprod); } if (bolla_col.full() && bem_old_col_qta == ZERO) //colore { bem_rec.put(RDOC_FASCMS, bolla_col); bem_rec.put(RDOC_QTAGG1, bolla_qta); bem_rec.put(RDOC_DATACONS, dataprod); } const int err = bem_rec.rewrite(rdoc); if (err != NOERR) return false; //} //if(bem_rec.read(rdoc)... } // if (bolla_qta > ZERO)... } //for (bool ok = recset.move_first()... return true; } TRileva_produzione_msk::TRileva_produzione_msk() : TAutomask ("ps1002300a") {} ///////////////////////////////////// // Applicazione //////////////////////////////////// class TRileva_produzione : public TSkeleton_application { protected: virtual bool check_autorization() const { return false; } virtual const char* extra_modules() const { return "ve"; } virtual void main_loop(); virtual bool create(); }; void TRileva_produzione::main_loop() { TRileva_produzione_msk mask; mask.run(); } bool TRileva_produzione::create() { return TSkeleton_application::create(); } int ps1002300 (int argc, char* argv[]) { TRileva_produzione main_app; main_app.run(argc, argv, TR("Rileva produzione da bolle")); return true; }