#include #include #include #include #include #include #include #include #include "..\mg\mglib.h" //#include "..\cg\cglib.h" #include "..\ve\veconf.h" #include "mg1100.h" //******************** //******************** // maschera dell'applicazione "Gestione interattiva movimenti di magazzino" // class TMask_movmag: public TMask { static TRecord_cache cache_causali; TMov_mag * mov_mag; TCodgiac_livelli * livelli_giac; // oggetto gestione livelli di giacenza TString price_codart; real price_quant; bool price_proposed; real proposed_price(const char * codart, real quant,const char * causrig); bool update_rigamov (int r, const char * old_codcaus); static bool notify_righe(TSheet_field & fld_righe, int item, KEY k); // notify delle righe di sheet static bool handle_righe(TMask_field &f, KEY k); // handler delle righe static bool handle_righeprezzo1(TMask_field &f, KEY k); // handler del prezzo delle righe static bool handle_righeprezzo2(TMask_field &f, KEY k); // handler del prezzo delle righe static bool handle_codcaus(TMask_field &fld, KEY k); // handler della causale static bool handle_datacomp(TMask_field &, KEY k); // handler del numero di registrazione static void sheetrighe_put(TSheet_field &fld_righe, int item); static void sheetrighe_get(TSheet_field &fld_righe, int item); public: TMask_movmag(TCodgiac_livelli *l_m,TMov_mag * m_m); virtual ~TMask_movmag(); }; TRecord_cache TMask_movmag::cache_causali("%CAU"); // costruttore della maschera anagrafica di magazzino //TMask_movmag::TMask_movmag() : TMask_movmag::TMask_movmag(TCodgiac_livelli *l_m,TMov_mag * m_m) : TMask("mg1100") { // oggetti dell'applicazione livelli_giac= l_m; mov_mag = m_m; // setta handler e notify TSheet_field & ss=(TSheet_field &)field(F_RIGHE); set_handler(F_DATACOMP, handle_datacomp); set_handler(F_CODCAUS, handle_codcaus); ss.sheet_mask().field(F_QUANT).set_handler(handle_righeprezzo1); ss.sheet_mask().field(F_CAUSRIG).set_handler(handle_righeprezzo1); ss.sheet_mask().field(F_CODART).set_handler(handle_righeprezzo2); ss.set_notify(notify_righe); ss.set_handler(handle_righe); ss.set_userget(sheetrighe_get); ss.set_userput(sheetrighe_put); ss.set_lines_record(m_m->body()); // setta i campi della maschera // per la pagina giacenze TSheet_field &fld_righe= (TSheet_field &)field(F_RIGHE); // setta le colonne in base all'abilitazione dei livelli di giacenza livelli_giac->set_sheetcolumn(fld_righe,F_LIV1,1); livelli_giac->set_sheetcolumn(fld_righe,F_LIV2,2); livelli_giac->set_sheetcolumn(fld_righe,F_LIV3,3); livelli_giac->set_sheetcolumn(fld_righe,F_LIV4,4); TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente if (prassid.get_bool("GES", NULL, A_LISTINI)) field(F_CATVEN).show(prassid.get_bool("GESLISCV")); else field(F_CATVEN).hide(); } TMask_movmag::~TMask_movmag() { } // item varies from 1 to items() void TMask_movmag::sheetrighe_get(TSheet_field &fld_righe, int item) { TMask_movmag &m=(TMask_movmag &)fld_righe.mask(); // prende il record della riga corrente dal record array TRectype &rec= fld_righe.record()->row(item, TRUE); TToken_string &row= fld_righe.row(item-1); // codici di livello row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,1),fld_righe.cid2index(F_LIV1) ); row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,2),fld_righe.cid2index(F_LIV2) ); row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,3),fld_righe.cid2index(F_LIV3) ); row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,4),fld_righe.cid2index(F_LIV4) ); } // item varies from 1 to items() void TMask_movmag::sheetrighe_put(TSheet_field &fld_righe, int item) { TMask_movmag &m=(TMask_movmag &)fld_righe.mask(); TToken_string &row= fld_righe.row(item-1); TRectype &recrighe= fld_righe.record()->row(item, TRUE); // codici livello if (m.livelli_giac->enabled()) { TString16 packedcode; m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV1)),1); m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV2)),2); m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV3)),3); m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV4)),4); recrighe.put("LIVGIAC", packedcode); } } bool TMask_movmag::handle_righe(TMask_field &f, KEY k) { if (k == K_ENTER) { TSheet_field & ss=(TSheet_field & )f; for (int i=0; i< ss.items(); i++) { if (*ss.cell(i,ss.cid2index(F_CODMAG)) ==' ') { f.error_box("Nella riga %d manca l'indicazione del magazzino ",i+1); return FALSE; } } } return TRUE; } bool TMask_movmag::notify_righe(TSheet_field & ss, int r, KEY key) { static TString16 old_codcaus; if ( key == K_DEL ) // Cancellazione { if (*ss.cell(r,ss.cid2index( F_AUTOMATICA))==riga_automatica) return FALSE; // can't remove auto lines directly if (r < ss.items()-1) { if (*ss.cell(r+1,ss.cid2index( F_AUTOMATICA))==riga_automatica) { ss.destroy(r + 1); } } } else if (key == K_INS) { // Inserimento { if (*ss.cell(r,ss.cid2index( F_AUTOMATICA))==riga_automatica) return FALSE; // cannot insert between a row and its generated one } } else if (key == K_SPACE) { old_codcaus=ss.sheet_mask().get(F_CAUSRIG); if (old_codcaus.blank()) old_codcaus=ss.mask().get(F_CODCAUS); } else if (key == K_ENTER) { TMask_movmag &m=(TMask_movmag &)ss.mask(); if (m.update_rigamov(r,old_codcaus)) ss.select(r+1); } return TRUE; } // proposta soft: solo se il prezzo è non nullo (già impostato) bool TMask_movmag::handle_righeprezzo1(TMask_field &f, KEY k) { if (f.mask().get(F_PREZZO).blank()) return handle_righeprezzo2(f, k); return TRUE; } // proposta hard: propone il prezzo in ogni caso bool TMask_movmag::handle_righeprezzo2(TMask_field &f, KEY k) { TMask_movmag &m=(TMask_movmag &)f.mask().get_sheet()->mask(); if (k==K_TAB && f.focusdirty()) { // propone il prezzo in base alla causale if (!f.mask().get(F_QUANT).blank() && !f.mask().get(F_CODART).blank()) { real prz=m.proposed_price(f.mask().get(F_CODART), f.mask().get_real(F_QUANT), f.mask().get(F_CAUSRIG)); f.mask().set(F_PREZZO,prz); } } return TRUE; } bool TMask_movmag::update_rigamov (int r, const char * old_codcaus) { TSheet_field & ss=(TSheet_field & )field(F_RIGHE); TString16 new_codcaus(ss.cell(r,ss.cid2index(F_CAUSRIG))); if (new_codcaus.blank()) new_codcaus=get(F_CODCAUS); TCausale_magazzino &oldcau=(TCausale_magazzino &)cache_causali.get(old_codcaus); TCausale_magazzino &cau =(TCausale_magazzino &)cache_causali.get(new_codcaus); if (*cau.caus_collegata()!='\0') { // deve esserci una riga collegata TString16 codmag,coddep; real prezzo(ss.cell(r,ss.cid2index(F_PREZZO))); if (r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA)) != riga_automatica) { // manca, la inserisco ss.insert(r+1); ss.row(r+1)=ss.row(r); } else { codmag=ss.cell(r+1,ss.cid2index(F_CODMAG)); coddep=ss.cell(r+1,ss.cid2index(F_CODDEP)); ss.row(r+1)=ss.row(r); } ss.row(r+1).add(prezzo.string(),ss.cid2index(F_PREZZO)); ss.row(r+1).add(codmag,ss.cid2index(F_CODMAG)); ss.row(r+1).add(coddep,ss.cid2index(F_CODDEP)); ss.row(r+1).add(cau.caus_collegata(),ss.cid2index(F_CAUSRIG)); ss.row(r+1).add(TString(1,riga_automatica),ss.cid2index(F_AUTOMATICA)); ss.check_row(r+1); ss.force_update(r+1); return TRUE; } else if (*oldcau.caus_collegata()!='\0') { // scollega la vecchia riga ss.destroy(r + 1); } return FALSE; } real TMask_movmag::proposed_price(const char *codart, real quant, const char *causrig) { real rv("0"); TCausale_magazzino & cau= (TCausale_magazzino &)cache_causali.get(*causrig ? causrig : get(F_CODCAUS)); TLocalisamfile anamag(LF_ANAMAG); anamag.put("CODART",codart); anamag.read(); switch (cau.tipoprz()) { // prezzo case 'P': { TLocalisamfile umart(LF_UMART); TConfig cfgditta(CONFIG_DITTA); TCondizione_vendita cv(&cfgditta,&anamag,&umart); cv.put_listino(get(F_CODLIST),get(F_CATVEN)); cv.ricerca(codart,quant); rv=cv.get_prezzo(); } break; // costo case 'C': { rv=anamag.get_real("ULTCOS1"); } break; } return rv; } bool TMask_movmag::handle_codcaus(TMask_field &fld, KEY k) { static TString16 old_codcaus; if (k == K_TAB && fld.focusdirty() && old_codcaus!="") { // aggiorna le righe di sheet TMask_movmag &m=(TMask_movmag &)fld.mask(); TSheet_field & ss=(TSheet_field & )m.field(F_RIGHE); bool added_some; // aggiorna le righe che dipendono dalla causale movimento for (int i=0; i< ss.items(); i++) { if (*ss.cell(i,ss.cid2index(F_CAUSRIG)) ==' ') added_some &=(m.update_rigamov(i,old_codcaus)); } if (added_some) { ss.dirty(); ss.set_focus(); } } if (k == K_TAB) old_codcaus=fld.get(); return TRUE; } bool TMask_movmag::handle_datacomp(TMask_field &fld, KEY k) { if (k == K_TAB) // && fld.focusdirty()) { int codes=((TMask_movmag &)fld.mask()).mov_mag->codice_esercizio(TDate(fld.get())); if (codes>0) { fld.mask().field(F_ANNOES).set(codes); fld.mask().field(H_ANNOES).set(codes); } else { fld.error_box("La data indicata non appartiene a nessuno degli esercizi contabili inseriti ") ; return FALSE; } } return TRUE; } class TApp_movmag: public TRelation_application { TArray used_files; TMask_movmag *_msk; // maschera principale TCodgiac_livelli * _livelli_giac;// oggetto handler per i livelli di giacenza TRelation * _rel; // relazione contenente il file movimenti virtual bool user_create(); virtual bool user_destroy(); virtual TMask *get_mask(int) { return _msk; } virtual bool changing_mask(int) { return FALSE; } virtual TRelation *get_relation() const { return _rel; } virtual const char *get_next_key(); TString16 _nextcod; public: TApp_movmag() {}; virtual ~TApp_movmag() {}; }; inline TApp_movmag& app() { return (TApp_movmag&) main_app(); } bool TApp_movmag::user_create() { used_files.add(new TLocalisamfile(LF_ANAMAG)); used_files.add(new TLocalisamfile(LF_UMART)); used_files.add(new TLocalisamfile(LF_MOVMAG)); used_files.add(new TLocalisamfile(LF_RMOVMAG)); used_files.add(new TTable("%CAU")); TMov_mag * m_m= new TMov_mag(); // record del movimento di magazzino m_m->enable_autoload(LF_RMOVMAG); // gestione giacenza a livelli _livelli_giac= new TCodgiac_livelli; // maschera specifica con gli handler dei movimenti _msk= new TMask_movmag(_livelli_giac,m_m); // relazione con un solo file (LF_MOVMAG) ma col record Head_Body _rel= new TRelation(LF_MOVMAG); _rel->lfile().set_curr(m_m); return TRUE; } bool TApp_movmag::user_destroy() { delete _rel; delete _msk; delete _livelli_giac; return TRUE; } // autonumerazione const char *TApp_movmag::get_next_key() { return _nextcod.format("%d|%s",F_NUMREG,((TMov_mag &)_rel->curr()).get_next_key()); } int mg1100(int argc, char* argv[]) { TApp_movmag a; a.run(argc, argv, "Movimenti di magazzino"); return 0; }