#include #include #include #include #include "../cg/cglib01.h" #include "../ve/veconf.h" #include "mglib.h" #include "mg4200.h" #include "mg4200a.h" #include "mg4frm.h" TCursor* TForm_inventario::cursor() const { if (_use_alternate_cursor) // Se e' settata la stampa per ragg. fisc ritorna il cursore appropriato return (TCursor*)_sortcur; return TForm_stampemg::cursor(); } bool TForm_inventario::validate(TForm_item &cf, TToken_string &s) { const TString80 code = s.get(0); // prende il primo parametro, il codice del messaggio if (code=="_USER") { const TRectype& magrec=relation()->curr(LF_MAG); const TString subcode=s.get(); if (subcode=="GIAC") { real v=curr_art().giacenza_corretta(magrec, FALSE,_valcomp); cf.set(v.string()); } else if (subcode=="VAL1") valorizzazione(cf,_valorizz_scelte[0]); else if (subcode=="VAL2"&& _colonne >=2) valorizzazione(cf,_valorizz_scelte[1]); else if (subcode=="VAL3" && _colonne >=3) valorizzazione(cf,_valorizz_scelte[2]); else if (subcode=="VAL4" && _colonne >=4) valorizzazione(cf,_valorizz_scelte[3]); else if (subcode=="VAL5"&& _colonne >=5) valorizzazione(cf,_valorizz_scelte[4]); else if (subcode=="VAL6" && _colonne >=6) valorizzazione(cf,_valorizz_scelte[5]); /* else if (subcode=="NAMEVAL1") cf.set(Nome_valorizz[_valorizz_scelte[0]]); else if (subcode=="NAMEVAL2"&& _colonne >=2) cf.set(Nome_valorizz[_valorizz_scelte[1]]); else if (subcode=="NAMEVAL3" && _colonne >=3) cf.set(Nome_valorizz[_valorizz_scelte[2]]); else if (subcode=="NAMEVAL4" && _colonne >=4) cf.set(Nome_valorizz[_valorizz_scelte[3]]); else if (subcode=="NAMEVAL5"&& _colonne >=5) cf.set(Nome_valorizz[_valorizz_scelte[4]]); else if (subcode=="NAMEVAL6" && _colonne >=6) cf.set(Nome_valorizz[_valorizz_scelte[5]]); */ else if (subcode=="LINEATOTALI") { TString l(29*_colonne+12,'-'); cf.set(l); } } else if (code == "_ANNO") cf.set(format("%d", _annoes)); return TForm_stampemg::validate(cf, s); } TArticolo_giacenza_loadable &TForm_inventario::curr_art() { const TString80 newcode(relation()->curr(LF_ANAMAG).get(ANAMAG_CODART)); if (_curr_art==NULL || newcode != _curr_art->codice()) { if (_curr_art) delete _curr_art; _curr_art=new TArticolo_giacenza_loadable(newcode); if (_alladata) _curr_art->load((TIsamtempfile&)(relation()->lfile(LF_MAG))); } return *_curr_art; } void TForm_inventario::add_colval(int tipo) { TTipo_valorizz t= (TTipo_valorizz )tipo; if (t>=valorizz_ultcos && tipo <=valorizz_LIFOr) { // Accende le colonne totali del Footer Last... find_field('F', last_page, FF_BASEFL + (_colonne * 2)).show(); if (t < valorizz_FIFOa) find_field('F', last_page, FF_BASEFL + (_colonne * 2) +1).show(); _valorizz_scelte[_colonne++]=t; TString col; col << _colonne; find_field('B',odd_page,FF_ENABLECOLS).set(col); // Accende le colonne per l'intestazione const int base_col = 2*(_colonne-1); find_field('B',odd_page,FF_COL1HEADER + base_col).show(); // Colonna valore find_field('B',odd_page,FF_COL1HEADER + base_col+1).show(t < valorizz_FIFOa); // Colonna valore unitario (abilitata solo se ! FIFO/LIFO) // Nasconde la colonna del valore unitario se il tipo di valorizzazzione e' FIFO/LIFO if (t >= valorizz_FIFOa && t <= valorizz_LIFOr) // Abilita i campi necessari per "nascondere" le colonne del prezzo unitario in tutto il form. find_field('B', odd_page, FF_DISABLEUNIT1 + _colonne - 1).enable(); } } bool TForm_inventario::valorizzazione(TForm_item &cf, TTipo_valorizz t) { TRectype & magrec=relation()->lfile(LF_MAG).curr(); TString annoes(magrec.get(MAG_ANNOES)); real v; if (t==valorizz_ultcos) { v=curr_art().ultimo_costo(annoes); } if (t==valorizz_mediacos) { v=curr_art().media_costi(annoes); } if (t==valorizz_przlist) { v=100.0 / (100.0 + curr_art().get_real(ANAMAG_PERCRIC)); v=curr_art().prezzo_listino(annoes,_catven,_codlist) * v; } if (t==valorizz_coststd) { v=curr_art().costo_standard(annoes); } if (t==valorizz_costmediopond) { const TString4 codmag = magrec.get(MAG_CODMAG).left(3); const TString80 livello(magrec.get(MAG_LIVELLO)); v=curr_art().costo_mediopond(annoes,codmag,livello); } if (t==valorizz_costmedio) { const TString4 codmag = magrec.get(MAG_CODMAG).left(3); const TString80 livello(magrec.get(MAG_LIVELLO)); v=curr_art().costo_medio(annoes,codmag,livello); } // arrotonda le valorizzazioni a costo unitario _currency->set_price(TRUE); _currency->set_num(v); v = _currency->get_num(); if (t==valorizz_LIFO) { const TString4 codmag = magrec.get(MAG_CODMAG).left(3); const TString80 livello(magrec.get(MAG_LIVELLO)); v=curr_art().LIFO(annoes,codmag,livello, FALSE,_valcomp); } if (t==valorizz_FIFO) { const TString4 codmag = magrec.get(MAG_CODMAG).left(3); const TString80 livello(magrec.get(MAG_LIVELLO)); v=curr_art().FIFO(annoes,codmag,livello, FALSE,_valcomp); } if (t==valorizz_LIFOa) { TString codmag(magrec.get(MAG_CODMAG));codmag.left(3); const TString80 livello(magrec.get(MAG_LIVELLO)); v=curr_art().LIFO_annuale(annoes,codmag,livello, FALSE,_valcomp); } if (t==valorizz_FIFOa) { const TString4 codmag = magrec.get(MAG_CODMAG).left(3); const TString80 livello(magrec.get(MAG_LIVELLO)); v=curr_art().FIFO_annuale(annoes,codmag,livello, FALSE,_valcomp); } const real giac_corretta = curr_art().giacenza_corretta(magrec, FALSE,_valcomp); v= v * giac_corretta ; _currency->set_price(FALSE); _currency->set_num(v); cf.set(_currency->get_num().string()); return TRUE; } bool TForm_inventario::genera_intestazione_supplementare(pagetype p, short y) { TPrint_section* body = exist('B', p); if (body == NULL || !body->columnwise()) return FALSE; TPrint_section* header = exist('H', p); if (header == NULL) return FALSE; TForm_string* s; TString des; for (int j=0;j<_colonne;j++) { TForm_item& fi = body->find_field(FF_COL1HEADER+j*2); des = Nome_valorizz[_valorizz_scelte[j]]; int w = fi.width(); if (_valorizz_scelte[j] < valorizz_FIFOa) w *= 2; des.center_just(w); s = new TForm_string(header); s->id() = -1; s->set_x(fi.x()); s->y() = y; s->set_prompt(des); s->temp() = TRUE; header->add_field(s); } return TRUE; } void TForm_inventario::set_parametri(const char * codcatv,const char * codlist,bool giaceff, bool valcomp, bool alladata, int annoes) { _catven=codcatv; _codlist=codlist; _giaceff=giaceff; _valcomp=valcomp; _alladata=alladata; _annoes = annoes; } TForm_inventario::TForm_inventario(const char *name,const char *code) : TForm_stampemg(name,code),_curr_art(NULL) { _sortcur = new TSorted_cursor(relation(),"RAGGFIS|CODART"); _use_alternate_cursor = FALSE; _colonne=0; _currency = new TCurrency(ZERO,"_FIRM"); } TForm_inventario::~TForm_inventario() { if (_curr_art) delete _curr_art; if (_sortcur) delete _sortcur; delete _currency; } class TStampainv_mask: public TStampemg_mask { static bool handle_ragg(TMask_field &fld, KEY k); // handler static bool handle_liv(TMask_field &fld, KEY k); // handler static bool handle_subord(TMask_field &fld, KEY k); // handler static bool handle_codlist(TMask_field &fld, KEY k); // handler static bool handle_filt(TMask_field &fld, KEY k); // handler public: TStampainv_mask(); ~TStampainv_mask(){}; }; TStampainv_mask::TStampainv_mask(): TStampemg_mask("mg4200") { TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente if (prassid.get_bool("GES", NULL, A_LISTINI)) field(F_CATVENLISTINO).enable(prassid.get_bool("GESLISCV")); else { field(F_CATVENLISTINO).disable(); field(F_CODLISTINO).disable(); } set_handler(F_TOLIVELLOART, handle_liv); set_handler(F_TOLIVELLOGIAC, handle_liv); set_handler(F_ORDINE, handle_ragg); //set_handler(F_DETTAGLIODEP, handle_ragg); set_handler(F_DETTAGLIOMAG, handle_ragg); set_handler(F_ORDINEART,handle_subord); set_handler(F_ORDINEMAG,handle_subord); set_handler(F_CODLISTINO, handle_codlist); set_handler(F_FILTRO, handle_filt); } bool TStampainv_mask::handle_filt(TMask_field &fld, KEY k) { if (k == K_SPACE) { const bool articles = fld.mask().get(F_ORDINE)=="A"; TMask& m = fld.mask(); m.show(F_ORDINEART, articles); m.show(F_ORDINEMAG, !articles); m.send_key(K_SPACE, articles ? F_ORDINEART : F_ORDINEMAG); } return TRUE; } bool TStampainv_mask::handle_subord(TMask_field &fld, KEY k) { if (k == K_SPACE) { TOperable_field &fraggcod=(TOperable_field &)fld.mask().field(F_RAGGCODICE); TOperable_field &fragggiac=(TOperable_field &)fld.mask().field(F_RAGGLIVGIAC); switch (fld.get()[0]) { case 'C': if (fld.mask().get(F_ORDINE)=="A") fraggcod.enable(); else { if (!fld.mask().get_bool(F_DETTAGLIODEP)) { fraggcod.reset(); fraggcod.disable(); fragggiac.reset(); fragggiac.disable(); fraggcod.do_message(0);fragggiac.do_message(0); } } break; case 'M': case 'S': case 'R': case 'D': fraggcod.reset(); fraggcod.check();fraggcod.disable(); break; } } return TRUE; } bool TStampainv_mask::handle_liv(TMask_field &fld, KEY k) { if (k == K_TAB) { TOperable_field &ftotmag=(TOperable_field &)fld.mask().field(F_TOTALIMAGAZZINI); TOperable_field &fdettmag=(TOperable_field &)fld.mask().field(F_DETTAGLIOMAG); if (fld.mask().get(F_ORDINE)=="A") { if (fld.mask().get_int(F_TOLIVELLOART) || fld.mask().get_int(F_TOLIVELLOGIAC)) { // raggruppamenti prima del dettaglio magazzini ftotmag.reset(); ftotmag.disable();ftotmag.do_message(0); } else { ftotmag.enable(); } } } return TRUE; } bool TStampainv_mask::handle_ragg(TMask_field &fld, KEY k) { if (k == K_SPACE) { TOperable_field &ftotmag=(TOperable_field &)fld.mask().field(F_TOTALIMAGAZZINI); TOperable_field &fraggcod=(TOperable_field &)fld.mask().field(F_RAGGCODICE); TOperable_field &fragggiac=(TOperable_field &)fld.mask().field(F_RAGGLIVGIAC); if (fld.mask().get(F_ORDINE)=="M") { ftotmag.enable(); if (!fld.mask().get_bool(F_DETTAGLIODEP)) { fraggcod.reset(); fraggcod.disable(); fragggiac.reset(); fragggiac.disable(); fraggcod.do_message(0);fragggiac.do_message(0); return TRUE; } } fraggcod.enable(); fragggiac.enable(); } return TRUE; } bool TStampainv_mask::handle_codlist(TMask_field &fld, KEY k) { if (k == K_ENTER) { if (fld.empty()) { TMask & m=fld.mask(); if (m.get_int(F_VAL1)-1==valorizz_przlist || m.get_int(F_VAL2)-1==valorizz_przlist || m.get_int(F_VAL3)-1==valorizz_przlist || m.get_int(F_VAL4)-1==valorizz_przlist || m.get_int(F_VAL5)-1==valorizz_przlist || m.get_int(F_VAL6)-1==valorizz_przlist ) return fld.error_box("Occorre specificare il listino per la valorizzazione"); } } return TRUE; } // STAMPA anagrafiche void TStampa_inventario ::on_firm_change() { _mask->enable_livellicodice(); } bool TStampa_inventario::create() { _mask = new TStampainv_mask(); _files = new TArray(); // aggiunge i files per usare i tracciati record _files->add(new TLocalisamfile(LF_ANAMAG)); _files->add(new TLocalisamfile(LF_UMART)); _files->add(new TLocalisamfile(LF_DESLIN)); _files->add(new TLocalisamfile(LF_CODCORR)); _files->add(new TLocalisamfile(LF_MAG)); _files->add(new TLocalisamfile(LF_STOMAG)); _files->add(new TLocalisamfile(LF_MOVMAG)); _files->add(new TLocalisamfile(LF_RMOVMAG)); return TSkeleton_application::create(); } bool TStampa_inventario::destroy() { delete _mask; delete _files; return TRUE; } bool TStampa_inventario::crea_tempmag(const bool b) { const bool valcomp = *_mask->get(F_FIN_COMP)=='C'; TIsamtempfile* temp_mag = new TIsamtempfile(LF_MAG, "tmpmag", TRUE, b); TRectype darec(LF_ANAMAG), arec(LF_ANAMAG); darec.put(ANAMAG_CODART, _mask->get(F_DAART)); arec.put(ANAMAG_CODART, _mask->get(F_AART)); TRelation ana_rel(LF_ANAMAG); TCursor ana_cur(&ana_rel, "", 1, &darec, &arec); const TRecnotype items = ana_cur.items(); ana_cur.freeze(); const TDate data_limite(_mask->get_date(F_DATALIM)); TArticolo_giacenza art_giac; TString16 annoes(_mask->get(F_ANNOES)); TString msg; msg << "Creazione giacenze temporanee anno " << annoes; TProgind pi(items, msg, FALSE, TRUE); for (ana_cur = 0L; ana_cur.pos() < items; ++ana_cur) { art_giac.read(ana_cur.curr()); // Scrive i records sul file temporaneo TRecord_array& mag = art_giac.mag(annoes); for (int i = mag.last_row(); i > 0 && temp_mag->good(); i = mag.pred_row(i)) { TRectype & magrec = (TRectype &) mag.row(i); real v=art_giac.giacenza_corretta(magrec, TRUE, valcomp); magrec.put(MAG_GIAC, v); temp_mag->write(magrec); } pi.addstatus(1L); } // Se il file è ok lo sostituisce all'interno della relazione del form const bool rt = temp_mag->good(); if (!rt) { error_box("Errore %d in creazione file temporaneo per saldi di magazzino alla data indicata.", temp_mag->status()); delete temp_mag; } else if (b) // Non sostituire in caso di stampa tutti gli articoli _form->relation()->replace(temp_mag); else delete temp_mag; // in caso di stampa tutti gli articoli, non cancella fisicamente il file; per riaprirlo poi return rt; } bool TStampa_inventario::calcola_giacenze(const bool b) { const bool giaceff = *_mask->get(F_REALE_GIAC)=='R'; const bool valcomp = *_mask->get(F_FIN_COMP)=='C'; //Scorre l'anagrafica di magazzino e calcola per ognuno la giacenza alla data indicata //Memorizzando i records in un file temporaneo che avrà lo stesso tracciato di LF_MAG TIsamtempfile* temp_mag = new TIsamtempfile(LF_MAG, "tmpmag", TRUE, b); TRectype darec(LF_ANAMAG), arec(LF_ANAMAG); darec.put(ANAMAG_CODART, _mask->get(F_DAART)); arec.put(ANAMAG_CODART, _mask->get(F_AART)); TRelation ana_rel(LF_ANAMAG); TCursor ana_cur(&ana_rel, "", 1, &darec, &arec); const TRecnotype items = ana_cur.items(); ana_cur.freeze(); const TDate data_limite(_mask->get_date(F_DATALIM)); TArticolo_giacenza_data art_giac; const TEsercizi_contabili esc; const int anno = esc.date2esc(data_limite); TString16 annoes; annoes.format("%04d", anno); TString msg; msg << "Elaborazione saldi al " << data_limite << " ..."; TProgind pi(items, msg, FALSE, TRUE); for (ana_cur = 0L; ana_cur.pos() < items; ++ana_cur) { art_giac.read(ana_cur.curr()); art_giac.al(data_limite); // Calcola la giacenza alla data per questo articolo // Scrive i records sul file temporaneo TRecord_array& mag = art_giac.mag(annoes); for (int i = mag.last_row(); i > 0 && temp_mag->good(); i = mag.pred_row(i)) { TRectype & magrec = (TRectype &) mag.row(i); if (giaceff) { real v=art_giac.giacenza_corretta(magrec, TRUE,valcomp); magrec.put(MAG_GIAC, v); } temp_mag->write(magrec); } pi.addstatus(1L); } // Se il file è ok lo sostituisce all'interno della relazione del form const bool rt = temp_mag->good(); if (!rt) { error_box("Errore %d in creazione file temporaneo per saldi di magazzino alla data indicata.", temp_mag->status()); delete temp_mag; } else if (b) // Non sostituire in caso di stampa tutti gli articoli _form->relation()->replace(temp_mag); else delete temp_mag; // in caso di stampa tutti gli articoli, non cancella fisicamente il file; per riaprirlo poi return rt; } void TStampa_inventario::setprint_permagazzini() { const char subordine=*_mask->get(F_ORDINEMAG); const bool totdep = _mask->get_bool(F_TOTALIDEPOSITI); TRectype darec(LF_MAG),arec(LF_MAG); TString cfilter, espr1, espr2; _cur = _form->cursor(); // setta il filtro sul cursore if (*_mask->get(F_FILTRO)=='N') cfilter << "(STR(GIAC!=\"0\"))&&" ; if (*_mask->get(F_FILTRO)=='+') cfilter << "(STR(GIAC>\"0\"))&&" ; if (*_mask->get(F_DAART)) cfilter << "(CODART>=" <<'"' << _mask->get(F_DAART)<< "\")&&" ; if (*_mask->get(F_AART)) cfilter << "(CODART<=" << '"' << _mask->get(F_AART)<< "\")&&" ; if (cfilter.not_empty()) cfilter.cut(cfilter.len()-2); if (!totdep) _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,3]",_strexpr); else _form->find_field('B',odd_page,"GRUPPI_DEPOSITO").setcondition("CODMAG[1,5]",_strexpr); switch (subordine) { case 'C': _form->find_field('B',odd_page,"H_CATMER").hide(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); if (!totdep) espr1 = "ANNOES|CODMAG[1,3]|CODART|LIVELLO|CODMAG[4,5]"; else espr1 = "ANNOES|CODMAG|CODART|LIVELLO"; _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); _form->set_ordering(mg_normale); break; case 'S': case 'M': { TString16 m1,m2; m1 = _mask->get(F_DACATMER); if (m1.not_empty()) m1.left_just(3); m2 = _mask->get(F_ACATMER); if (m2.not_empty()) m2.left_just(3); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); int index_grmerc = 3; if (subordine == 'S') index_grmerc = 5; if (!totdep) espr1.format("ANNOES|CODMAG[1,3]|%d->GRMERC[1,%d]|CODART|LIVELLO|CODMAG[4,5]", LF_ANAMAG, index_grmerc); else espr1.format("ANNOES|CODMAG|%d->GRMERC[1,%d]|CODART|LIVELLO", LF_ANAMAG, index_grmerc); _form->set_ordering(mg_cat_merc); espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->GRMERC[1,3]", LF_ANAMAG); // espr2.format("%d->GRMERC[1,3]", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); TString16 fmerc; if (subordine == 'S') { fmerc = "GRMERC"; _form->find_field('B',odd_page,"H_SCATMER").show(); _form->find_field('B',odd_page,"TOT_SCATMER").show(); m1 << _mask->get(F_DASCATMER); m2 << _mask->get(F_ASCATMER); } else { fmerc = "GRMERC[1,3]"; _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); } if (m1.not_empty()) { espr2.format("&&(%d->%s >= \"%s\")", LF_ANAMAG, (const char *)fmerc, (const char*)m1); cfilter << espr2; } if (m2.not_empty()) { espr2.format("&&(%d->%s <= \"%s\")", LF_ANAMAG, (const char *)fmerc, (const char*)m2); cfilter << espr2; } espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->GRMERC", LF_ANAMAG); // espr2.format("%d->%s", LF_ANAMAG, (const char *)fmerc); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); } break; case 'R': _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); if (!totdep) espr1.format("ANNOES|CODMAG[1,3]|%d->RAGGFIS|CODART|LIVELLO|CODMAG[4,5]",LF_ANAMAG); else espr1.format("ANNOES|CODMAG|%d->RAGGFIS|CODART|LIVELLO|CODMAG[4,5]",LF_ANAMAG); _form->set_ordering(mg_ragg_fisc); espr2.format("CODMAG[1,3]+CODMAG[1,5]+%d->RAGGFIS", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); if (_mask->get(F_DARAGFIS).not_empty()) { espr2.format("&&(%d->RAGGFIS>=\"%s\")", LF_ANAMAG, (const char*) _mask->get(F_DARAGFIS)); cfilter << espr2; } if (_mask->get(F_ARAGFIS).not_empty()) { espr2.format("&&(%d->RAGGFIS<=\"%s\")", LF_ANAMAG, (const char*) _mask->get(F_ARAGFIS)); cfilter << espr2; } break; default: break; } //_mask->set_livellicodice(); // abilita/disabilita le sezioni dei totali _form->setdett_permag( _mask->get_bool(F_RAGGCODICE),_mask->get_int(F_FROMLIVELLOART),_mask->get_int(F_TOLIVELLOART), _mask->get_bool(F_RAGGLIVGIAC),_mask->get_int(F_FROMLIVELLOGIAC),_mask->get_int(F_TOLIVELLOGIAC), TRUE,_mask->get_bool(F_TOTALIDEPOSITI),_mask->get_bool(F_DETTAGLIODEP)); ((TSorted_cursor *)_cur)->change_order(espr1); darec.put("ANNOES",_mask->get(F_ANNOES)); darec.put("CODMAG",_mask->get(F_DAMAG)); arec.put("ANNOES",_mask->get(F_ANNOES)); arec.put("CODMAG",_mask->get(F_AMAG)); _cur->setfilter(cfilter, TRUE); _cur->setregion(darec,arec); } // ORDINAMENTO void TStampa_inventario::setprint_perarticoli() { char subordine=_mask->get(F_ORDINEART)[0]; TRectype darec(LF_MAG),arec(LF_MAG); TString cfilter, espr1, espr2; _cur = _form->cursor(); // setta il filtro sul cursore if (_mask->get(F_FILTRO)[0]=='N') cfilter << "(STR(GIAC!=\"0\"))&&" ; if (_mask->get(F_FILTRO)[0]=='+') cfilter << "(STR(GIAC>\"0\"))&&" ; if (cfilter.not_empty()) cfilter.rtrim(2); switch (subordine) { case 'C': case 'D': _form->find_field('B',odd_page,"H_CATMER").hide(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); if (subordine == 'C') espr1 = "ANNOES|CODART|LIVELLO|CODMAG"; else espr1.format("ANNOES|UPPER(%d->DESCR)|LIVELLO|CODMAG", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); _form->set_ordering(mg_normale); break; case 'S': case 'M': { TString16 m1,m2; m1 = _mask->get(F_DACATMER); m2 = _mask->get(F_ACATMER); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); if (subordine == 'S') espr1.format("ANNOES|%d->GRMERC|CODART|LIVELLO|CODMAG", LF_ANAMAG); else espr1.format("ANNOES|%d->GRMERC[1,3]|CODART|LIVELLO|CODMAG", LF_ANAMAG); _form->set_ordering(mg_cat_merc); espr2.format("%d->GRMERC[1,3]", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); if (subordine == 'S') { _form->find_field('B',odd_page,"H_SCATMER").show(); _form->find_field('B',odd_page,"TOT_SCATMER").show(); m1.left_just(3) << _mask->get(F_DASCATMER); m2.left_just(3) << _mask->get(F_ASCATMER); if (!m1.blank()) { espr2.format("&&(%d->GRMERC>=\"%s\")", LF_ANAMAG, (const char*)m1); cfilter << espr2; } if (!m2.blank()) { espr2.format("&&(%d->GRMERC<=\"%s\")", LF_ANAMAG, (const char*)m2); cfilter << espr2; } espr2.format("%d->GRMERC", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); } else { _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); if (!m1.blank()) { espr2.format("&&(TRIM(%d->GRMERC[1,3])>=\"%s\")", LF_ANAMAG, (const char*)m1); cfilter << espr2; } if (!m2.blank()) { espr2.format("&&(TRIM(%d->GRMERC[1,3])<=\"%s\")", LF_ANAMAG, (const char*)m2); cfilter << espr2; } } } break; case 'R': _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); espr1.format("ANNOES|%d->RAGGFIS|CODART|LIVELLO|CODMAG",LF_ANAMAG); _form->set_ordering(mg_ragg_fisc); espr2.format("%d->RAGGFIS", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_CATMER").setcondition(espr2,_strexpr); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr2,_strexpr); if (_mask->get(F_DARAGFIS).not_empty()) { espr2.format("&&(%d->RAGGFIS>=\"%s\")", LF_ANAMAG, (const char*) _mask->get(F_DARAGFIS)); cfilter << espr2; } if (_mask->get(F_ARAGFIS).not_empty()) { espr2.format("&&(%d->RAGGFIS<=\"%s\")", LF_ANAMAG, (const char*) _mask->get(F_ARAGFIS)); cfilter << espr2; } break; default: break; } _form->setdett_perart( _mask->get_bool(F_RAGGCODICE),_mask->get_int(F_FROMLIVELLOART),_mask->get_int(F_TOLIVELLOART), _mask->get_bool(F_RAGGLIVGIAC),_mask->get_int(F_FROMLIVELLOGIAC),_mask->get_int(F_TOLIVELLOGIAC), _mask->get_bool(F_TOTALIMAGAZZINI),_mask->get_bool(F_DETTAGLIOMAG)); ((TSorted_cursor *)_cur)->change_order(espr1); darec.put("ANNOES",_mask->get(F_ANNOES)); darec.put("CODMAG",_mask->get(F_DAMAG)); if (subordine == 'D') { if (_mask->get(F_DADES).not_empty()) cfilter << "&&(UPPER(47->DESCR)>=\"" << _mask->get(F_DADES) << "\")"; if (_mask->get(F_ADES).not_empty()) cfilter << "&&(UPPER(47->DESCR)<=\"" << _mask->get(F_ADES) << "\")"; } else { if (*_mask->get(F_DAART)) cfilter << "&&(CODART>=\"" << _mask->get(F_DAART) << "\")"; if (*_mask->get(F_AART)) cfilter << "&&(CODART<=\"" << _mask->get(F_AART) << "\")"; } arec.put("ANNOES",_mask->get(F_ANNOES)); arec.put("CODMAG", _mask->get(F_AMAG)); _cur->setfilter(cfilter, subordine != 'C'); _cur->setregion(darec,arec); } void TStampa_inventario::setprint_perarticoli_all() { TRectype darec(LF_ANAMAG),arec(LF_ANAMAG); TString cfilter,filter,joinexp; TString sortexp("ANNOES|CODART|LIVELLO|CODMAG"); char subordine=*_mask->get(F_ORDINEART); _cur = _form->cursor(); if (*_mask->get(F_FILTRO)=='N') filter << "(STR(" << LF_MAG <<"->GIAC!=\"0\"))&&"; if (*_mask->get(F_FILTRO)=='+') filter << "(STR(" << LF_MAG <<"->GIAC>\"0\"))&&" ; if (*_mask->get(F_DAMAG)) filter << "(CODMAG[1,3]>=" <<'"' << _mask->get(F_DAMAG)<< "\")&&" ; if (*_mask->get(F_AMAG)) filter << "(CODMAG[1,3]<=" <<'"' << _mask->get(F_AMAG)<< "\")&&" ; if (filter.not_empty()) filter.rtrim(2); //_mask->set_livellicodice(); switch (subordine) { case 'C': _cur->setkey(1); darec.put("CODART",_mask->get(F_DAART)); arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").hide(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); _form->set_ordering(mg_normale); break; case 'D': _cur->setkey(2); darec.put("DESCR",_mask->get(F_DADES)); arec.put("DESCR",_mask->get(F_ADES)); _form->find_field('B',odd_page,"H_CATMER").disable(); _form->find_field('B',odd_page,"TOT_CATMER").hide(); _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); _form->set_ordering(mg_normale); break; case 'S': case 'M': { TString16 m1,m2; m1 = _mask->get(F_DACATMER); m2 = _mask->get(F_ACATMER); if (subordine == 'S') { m1.left_just(3) << _mask->get(F_DASCATMER); m2.left_just(3) << _mask->get(F_ASCATMER); // m1.trim(); // m2.trim(); } // Siccome GRMERC e' il primo campo della chiave, se e' settato l'articolo di fine intervallo // ed esso non e' vuoto, mentre la categoria merc. lo e'... la setregion() del cursore non ha effetti, // Quindi se non viene indicata alcuna categoria merc. di fine interv, va preimpostata // Alla ultima stringa possibile if (m2.empty() && _mask->get(F_AART).not_empty()) m2.fill('\254',subordine == 'S' ? 5 : 3); _cur->setkey(3); darec.put("GRMERC", m1); darec.put("CODART",_mask->get(F_DAART)); arec.put("GRMERC", m2); const TString80 aart(_mask->get(F_AART)); if (aart.not_empty()) arec.put("CODART", aart); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); _form->set_ordering(mg_cat_merc); if (subordine == 'S') { _form->find_field('B',odd_page,"H_SCATMER").show(); _form->find_field('B',odd_page,"TOT_SCATMER").show(); TString16 espr ; espr.format("%d->GRMERC", LF_ANAMAG); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition(espr,_strexpr); } else { _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("CODART",_strexpr); sortexp.format("ANNOES|%d->GRMERC[1,3]|CODART|LIVELLO|CODMAG", LF_ANAMAG); } } break; case 'R': { _form->set_ordering(mg_ragg_fisc);// Setta la subsection in modo da raggruppare per RAGGFIS _form->use_alternate_cursor(); _cur = _form->cursor(); // Setta il cursore sortato per questo ordinamento... siccome non esiste una chiave RAGGFIS+CODART _cur->setkey(1); darec.put("CODART",_mask->get(F_DAART)); arec.put("CODART",_mask->get(F_AART)); _form->find_field('B',odd_page,"H_CATMER").show(); _form->find_field('B',odd_page,"TOT_CATMER").show(); _form->find_field('B',odd_page,"H_SCATMER").hide(); _form->find_field('B',odd_page,"TOT_SCATMER").hide(); _form->find_field('B',odd_page,"GRUPPI_SCATMER").setcondition("RAGGFIS",_strexpr); if (_mask->get(F_DARAGFIS).not_empty()) cfilter.format("(RAGGFIS>=\"%s\")",(const char*)_mask->get(F_DARAGFIS)); if (cfilter.not_empty() && _mask->get(F_ARAGFIS).not_empty()) { cfilter << "&&(RAGGFIS<=\""; cfilter << _mask->get(F_ARAGFIS); cfilter << "\")&&"; } if (cfilter.not_empty()) cfilter.rtrim(2); _cur->setfilter(cfilter); _cur->setregion(darec, arec,0x2); } break; } _form->setdett_perart( _mask->get_bool(F_RAGGCODICE),_mask->get_int(F_FROMLIVELLOART),_mask->get_int(F_TOLIVELLOART), _mask->get_bool(F_RAGGLIVGIAC),_mask->get_int(F_FROMLIVELLOGIAC),_mask->get_int(F_TOLIVELLOGIAC), _mask->get_bool(F_TOTALIMAGAZZINI),_mask->get_bool(F_DETTAGLIOMAG)); joinexp << "ANNOES==\"" << _mask->get(F_ANNOES) << "\"|CODART==CODART"; TSortedfile *mag; TRelation *rel = NULL; if (_mask->get_bool(F_ALLADATA) || *_mask->get(F_REALE_GIAC)=='R') { TIsamtempfile* temp_mag = new TIsamtempfile(LF_MAG, "tmpmag", FALSE, TRUE); // Non crearlo, auto cancella il file rel = new TRelation(temp_mag); } else rel = new TRelation(LF_MAG); if (subordine == 'M') rel->add(LF_ANAMAG, "CODART==CODART"); // !?!?!! ATTENZIONE : Modifica temporanea mag= new TSortedfile(LF_MAG,rel,sortexp,"",1); // il filtro viene qui settato DOPO la creazione del Sortedfile a causa di una bug // sulla libreria nei TSorted_file / TCursor mag->cursor().setfilter(filter, subordine == 'M'); // FINE MODIFICA ; rimettere il filtro nel costruttore quando il bug sarà risolto _cur->relation()->replace(mag,1,joinexp); _cur->setregion(darec,arec,0x2); } void TStampa_inventario::main_loop() { while (_mask->run() == K_ENTER) { if (_mask->magazz_ini().gestmag(TRUE)) { if (_mask->get(F_DAMAG).blank() && _mask->get(F_AMAG).blank()) { bool empty = FALSE; if (_mask->get(F_ORDINEART) == "D") empty = _mask->get(F_DADES).blank() && _mask->get(F_ADES).blank(); else empty = _mask->get(F_DAART).blank() && _mask->get(F_AART).blank(); if (empty && !yesno_box("Sono stati selezionati tutti gli articoli. Confermare la stampa?")) continue; } const bool b = _mask->get_bool(F_ALLADATA); const bool r = *_mask->get(F_REALE_GIAC)=='R'; if (_mask->get(F_ORDINE)[0]=='A') { if (_mask->get(F_FILTRO)[0]=='T') // tutti gli articoli { _form = new TForm_inventario("mg4200aa", ""); if (b && !calcola_giacenze(FALSE)) { delete _form; continue; } else if (!b && r && !crea_tempmag(FALSE)) { delete _form; continue; } setprint_perarticoli_all(); } else { _form = new TForm_inventario("mg4200a", ""); if (b && !calcola_giacenze()) { delete _form; continue; } else if (!b && r && !crea_tempmag()) { delete _form; continue; } setprint_perarticoli(); } } else { _form = new TForm_inventario("mg4200b", ""); if (b && !calcola_giacenze()) { delete _form; continue; } else if (!b && r && !crea_tempmag()) { delete _form; continue; } setprint_permagazzini(); } _form->set_parametri(_mask->get(F_CATVENLISTINO), _mask->get(F_CODLISTINO), *_mask->get(F_REALE_GIAC)=='R', *_mask->get(F_FIN_COMP)=='C', b, _mask->get_int(F_ANNOES)); _form->add_colval(_mask->get_int(F_VAL1)-1); _form->add_colval(_mask->get_int(F_VAL2)-1); _form->add_colval(_mask->get_int(F_VAL3)-1); _form->add_colval(_mask->get_int(F_VAL4)-1); _form->add_colval(_mask->get_int(F_VAL5)-1); _form->add_colval(_mask->get_int(F_VAL6)-1); _form->genera_intestazioni(odd_page, 5); _form->genera_intestazione_supplementare(odd_page, 4); // Nomi valorizzazioni applicate per colonna set_def_valuta(*_form); const TDate data_limite(_mask->get_date(F_DATALIM)); if (data_limite.ok()) { TForm_item & f = _form->find_field('H',odd_page,4); TString prompt = f.prompt(); prompt << "al " << data_limite.string() << " "; f.set_prompt(prompt); } _form->print(); delete _form; } } // while true return ; } int mg4200(int argc, char* argv[]) { TStampa_inventario a; a.run(argc,argv,"Stampa inventario"); return 0; }