#include #include #include #include #include "velib.h" #include "..\cg\cglib01.h" #include "..\mg\mglib.h" #include "..\mg\stomag.h" #include "ve2400.h" // maschera dell'anagrafica di magazzino class TMask_anamag: public TMask { TRelation * _rel; // relazione principale TCodgiac_livelli * livelli_giac;// oggetto handler per i livelli di giacenza TCodart_livelli * livelli_art;// oggetto handler per i livelli di anagraficca int last_annogiac; int last_annosto; TString16 _um_principale; TMagazzini _magazzini; TEsercizi_contabili _esercizi_contabili; static bool handle_codice(TMask_field &, KEY); // handler del campo codice articolo static bool handle_livart(TMask_field &, KEY); // handler dei campi codice articolo (livelli) static bool handle_anno(TMask_field &, KEY); // handler del campo anno delle giacenze static bool handle_stoanno(TMask_field &, KEY); // handler del campo anno delle giacenze static bool handle_sheet_um(TMask_field &, KEY); // handler dello sheet delle unità di misura static bool notify_sheet_um(TSheet_field & s, int r, KEY k); // notify dello sheet delle unità di misura static bool handle_sheet_deslin(TMask_field &, KEY); // handler dello sheet delle descrizioni in lingua static bool handle_sheet_cod(TMask_field &, KEY); // handler dello sheet dei codici alternativi static bool notify_sheet_giac(TSheet_field & s, int r, KEY k); // notify delle giacenze static bool handle_sheetgiac(TMask_field &, KEY); // handler dello sheet giacenze static bool notify_sheet_sto(TSheet_field & s, int r, KEY k); // notify dello storico static bool handle_sheetstomag(TMask_field &, KEY); // handler dello sheet storico giacenze static bool handle_sheet_um_um(TMask_field &, KEY); // handler del campo UM dello sheet delle unità di misura static bool handle_sheet_um_price(TMask_field &, KEY); // handler del campo PREZZO e PREZZO_LORDO dello sheet delle unità di misura static void sheetgiac_get(TSheet_field &fld_righe, int item); static void sheetgiac_put(TSheet_field &fld_righe, int item); static void sheetsto_get(TSheet_field &fld_righe, int item); static void sheetsto_put(TSheet_field &fld_righe, int item); void clear_info_sto(); bool info_sto_dirty(); int add_totali_storico(TString &codmag); bool remove_totali_storico(TString & codmag); void update_totali_storico(TString & codmag); bool check_totali_storico(); public: void ricalcola_giacenze(); TString16 &um_principale() {return _um_principale;} TMagazzini & magazzini() {return _magazzini;} TEsercizi_contabili &esercizi_contabili() {return _esercizi_contabili;} TMask_anamag(TRelation * rel,bool mg_autorized); virtual ~TMask_anamag(); }; // costruttore della maschera anagrafica di magazzino TMask_anamag::TMask_anamag(TRelation * rel,bool mg_autorized) : TMask("ve2400") { _rel=rel; // imposta il puntatore al gestore livelli giacenze livelli_giac= new TCodgiac_livelli(); livelli_art= new TCodart_livelli(); // imposta il valore dell'anno per le giacenze last_annogiac=-1; last_annosto=-1; // sheet unità di misura set_handler(F_SHEETUM, handle_sheet_um); TSheet_field &f= (TSheet_field &)field(F_SHEETUM); f.set_notify(notify_sheet_um); TMask &fm= f.sheet_mask(); fm.set_handler(FS_CODUM, handle_sheet_um_um); fm.set_handler(FS_PREZZO, handle_sheet_um_price); fm.set_handler(FS_PREZZO_LORDO, handle_sheet_um_price); // sheet descrizioni in lingua set_handler(F_SHEETDESLIN, handle_sheet_deslin); // sheet codici corrispondenti set_handler(F_SHEETCOD, handle_sheet_cod); // *************************************************** // ABILITAZIONI PARAMETRICHE // Abilita la pagina delle giacenze if (mg_autorized && magazzini().gestmag()) { // sheet giacenze set_handler(F_ANNO, handle_anno); set_handler(F_SHEETGIAC, handle_sheetgiac); sfield(F_SHEETGIAC).set_notify(notify_sheet_giac); sfield(F_SHEETGIAC).set_userget(sheetgiac_get); sfield(F_SHEETGIAC).set_userput(sheetgiac_put); // sheet storico set_handler(F_SHEETSTOMAG, handle_sheetstomag); sfield(F_SHEETSTOMAG).set_notify(notify_sheet_sto); sfield(F_SHEETSTOMAG).set_userget(sheetsto_get); sfield(F_SHEETSTOMAG).set_userput(sheetsto_put); set_handler(F_STOANNO, handle_stoanno); enable_page(PAGE_GIACENZE,TRUE); enable_page(PAGE_STORICO,TRUE); // setta i campi della maschera per la pagina giacenze TSheet_field &fld_stomag= (TSheet_field &)field(F_SHEETSTOMAG); TSheet_field &fld_giac= (TSheet_field &)field(F_SHEETGIAC); // disabilita le colonne quando non sono utilizzati i livelli di giacenza for (int i=0; i<4; i++) { livelli_giac->set_sheetcolumn(fld_giac,F_LIV1+i,i+1); } // disabilita la colonna numero distinte if (FALSE) { fld_giac.delete_column(fld_giac.cid2index(F_NDIST)); fld_giac.sheet_mask().field(F_NDIST).enable(FALSE); } // abilita la gestione delle ubicazioni (manuale/su tabella) if (magazzini().gestubi_man()) { fld_giac.sheet_mask().field(F_UBICAZ).show(FALSE); fld_giac.sheet_mask().field(F_UBICAZD).show(FALSE); fld_giac.sheet_mask().field(F_UBICAZ2).show(TRUE); } else { fld_giac.sheet_mask().field(F_UBICAZ).show(TRUE); fld_giac.sheet_mask().field(F_UBICAZD).show(TRUE); fld_giac.sheet_mask().field(F_UBICAZ2).show(FALSE); } // abilita la gestione del monomagazzino fld_giac.sheet_mask().field(F_DESMAG).enable(magazzini().gestmultimag()); fld_giac.enable_column(fld_giac.cid2index(F_CODMAG),magazzini().gestmultimag()); fld_stomag.enable_column(fld_stomag.cid2index(F_STOCODMAG),magazzini().gestmultimag()); } else { enable_page(PAGE_GIACENZE,FALSE); enable_page(PAGE_STORICO,FALSE); } // abilita la visualizzazione dei campi distinti per i livelli articolo if (FALSE) { field(F_CODART).hide(); field(F_GCA).hide(); for (int i=0; i<3; i++) { // versione con campi predefiniti sulla maschera if (livelli_art->enabled(1+i)) { field(F_LIVART1+i).show(); field(F_LIVART1+livelli_giac->last_level()-1).check_type(1+i==livelli_art->last_level() ? CHECK_NONE : CHECK_REQUIRED); ((TEdit_field&)field(F_LIVART1+livelli_giac->last_level()-1)).set_width(livelli_art->code_length(1+i)); set_handler(F_LIVART1+i, handle_livart); } else { field(F_LIVART1+i).hide(); field(F_LIVART1+livelli_giac->last_level()-1).check_type(CHECK_NONE); } } } else { if (livelli_art->enabled()) { set_handler(F_CODART, handle_codice); for (int i=0; i<9; i++) field(F_LIVART1+i).hide(); if (!livelli_art->enabled(2)) field(F_GCA).hide(); } else field(F_GCA).hide(); } } void TMask_anamag::sheetsto_put(TSheet_field &sheet_sto, int item) { if (item>1) return; TMask_anamag & m=(TMask_anamag & )sheet_sto.mask(); TRectype & first_rec=sheet_sto.record()->row(1,TRUE); first_rec.put(STOMAG_ULTCOS1,m.get_real(F_STOULTCOS1 )); first_rec.put(STOMAG_ULTCOS2,m.get_real(F_STOULTCOS2 )); first_rec.put(STOMAG_COSTSTD,m.get_real(F_STOCOSTOSTD )); first_rec.put(STOMAG_COSTOMEDIO,m.get_real(F_STOCOSTOMEDIO )); first_rec.put(STOMAG_CATVEN,m.get(F_STOCATVEN )); first_rec.put(STOMAG_CODLISTINO,m.get(F_STOCODLIST)); first_rec.put(STOMAG_PRZLIST,m.get(F_STOPREZZOLIST )); } void TMask_anamag::sheetsto_get(TSheet_field &sheet_sto, int item) { TMask_anamag & m=(TMask_anamag &) sheet_sto.mask(); if (item>1) return; TRectype & first_rec=sheet_sto.record()->row(1,TRUE); m.set(F_STOULTCOS1, first_rec.get_real(STOMAG_ULTCOS1)); m.set(F_STOULTCOS2, first_rec.get_real(STOMAG_ULTCOS2 )); m.set(F_STOCOSTOSTD, first_rec.get_real( STOMAG_COSTSTD )); m.set(F_STOCOSTOMEDIO, first_rec.get_real(STOMAG_COSTOMEDIO)); m.set(F_STOCATVEN , first_rec.get(STOMAG_CATVEN)); m.set(F_STOCODLIST , first_rec.get(STOMAG_CODLISTINO)); m.set(F_STOPREZZOLIST ,first_rec.get(STOMAG_PRZLIST)); } bool TMask_anamag::info_sto_dirty() { return field(F_STOULTCOS1).focusdirty() || field(F_STOULTCOS2).focusdirty() || field(F_STOCOSTOSTD).focusdirty() || field(F_STOCOSTOMEDIO).focusdirty()|| field(F_STOCATVEN ).focusdirty()|| field(F_STOCODLIST).focusdirty()|| field(F_STOPREZZOLIST).focusdirty(); } void TMask_anamag::clear_info_sto() { reset(F_STOULTCOS1); reset(F_STOULTCOS2); reset(F_STOCOSTOSTD); reset(F_STOCOSTOMEDIO); reset(F_STOCATVEN ); reset(F_STOCODLIST); reset(F_STOPREZZOLIST); } TMask_anamag::~TMask_anamag() { delete livelli_art; delete livelli_giac; } // HANDLER DEL CODICE: controlla la corrispondenza al formato previsto bool TMask_anamag::handle_codice(TMask_field &fld, KEY k) { TMask_anamag &mask=(TMask_anamag &)fld.mask(); TString codepart; if (k == K_TAB && !fld.get().blank()) { int l; TTable _tabgrp("GCA"); for (l=1; llast_level(); l++) { codepart=""; codepart << l << mask.livelli_art->unpack_grpcode(fld.get(),l); _tabgrp.zero(); _tabgrp.put("CODTAB", codepart); if (_tabgrp.read()!=NOERR) { fld.error_box("'%s' non appartiene a '%s'",(const char *)codepart.mid(1),(const char *)mask.livelli_art->name(l)); return(FALSE); } } codepart=mask.livelli_art->unpack_grpcode(fld.get(),mask.livelli_art->last_level()); if (codepart.blank()) { fld.error_box("Il codice articolo non può essere vuoto"); return(FALSE); } if (!mask.livelli_art->fit_to_format(codepart)) { fld.error_box("Il codice articolo non corrisponde al formato previsto \n('%s' ?? '%s')",(const char *)codepart,(const char *)mask.livelli_art->code_format()); return(FALSE); } } return(TRUE); } // HANDLER DEL CODICE: controlla la corrispondenza al formato previsto bool TMask_anamag::handle_livart(TMask_field &fld, KEY k) { if (k == K_TAB && fld.focusdirty()) { TMask_anamag & m=(TMask_anamag & )fld.mask(); TString s(m.field(F_CODART).get()); m.livelli_art->pack_grpcode(s,fld.get(),fld.dlg()-F_LIVART1+1); m.field(F_CODART).set(s); if (fld.dlg()-F_LIVART1+1==m.livelli_art->last_level() && fld.get().blank()) { fld.error_box("Il codice articolo non può essere lasciato in bianco"); return FALSE; } } return TRUE; } bool TMask_anamag::handle_anno(TMask_field &fld, KEY k) { TMask_anamag &mask=(TMask_anamag &)fld.mask(); if (k == K_TAB) { TSheet_field &fld_giac= (TSheet_field &)mask.field(F_SHEETGIAC); if (mask.get(F_ANNO).empty() ) { mask.set(F_ANNORIF, mask.esercizi_contabili().last()) ; mask.set(F_ANNO, mask.get(F_ANNORIF)); } if (mask.last_annogiac>0 && mask.last_annogiac!=fld.mask().get_int(F_ANNO)) { if (fld_giac.dirty() && handle_sheetgiac(fld_giac,K_ENTER)) { if (fld.yesno_box("Vuoi salvare le righe di giacenza per l'anno %d",mask.last_annogiac )) { fld_giac.autosave(*mask._rel); fld_giac.record()->rewrite(); } } mask.field(F_ANNORIF).set(fld.get()); // rilegge le giacenze relative a quell'anno ed aggiorna il layout fld_giac.record()->read(*fld_giac.putkey(*mask._rel)); fld_giac.autoload(*mask._rel); fld_giac.force_update(); } mask.last_annogiac=mask.get_int(F_ANNO); } return(TRUE); } bool TMask_anamag::handle_stoanno(TMask_field &fld, KEY k) { TMask_anamag &mask=(TMask_anamag &)fld.mask(); if (k == K_TAB) { TSheet_field &fld_stomag= (TSheet_field &)fld.mask().field(F_SHEETSTOMAG); /*if (mask.get_int(F_STOANNO) >=mask.esercizi_contabili().last()) { fld.error_box("Impossibile dare la composizione delle rimanenze per l'ultimo anno"); mask.reset(F_STOANNO); }*/ if (mask.get(F_STOANNO).empty() ) { mask.set(F_STOANNORIF, mask.esercizi_contabili().last()) ; mask.set(F_STOANNO, mask.get(F_STOANNORIF)); } if ( fld.focusdirty() && mask.last_annosto>0 && mask.last_annosto!=fld.mask().get_int(F_STOANNO)) { if ((mask.field(F_SHEETSTOMAG).dirty() || mask.info_sto_dirty()) && fld_stomag.items()>0 ) { if (fld.yesno_box("Vuoi salvare lo storico per l'anno %d",mask.last_annosto) && handle_sheetstomag(fld_stomag,K_ENTER)) { fld_stomag.autosave(*mask._rel); fld_stomag.record()->write(TRUE); } } mask.field(F_STOANNORIF).set(fld.get()); mask.last_annosto=mask.get_int(F_STOANNORIF); // rilegge lo storico relativo a quell'anno ed aggiorna il layout mask.clear_info_sto(); fld_stomag.record()->read(*fld_stomag.putkey(*mask._rel)); fld_stomag.autoload(*mask._rel); handle_sheetstomag(mask.field(F_SHEETSTOMAG),K_SPACE); fld_stomag.force_update(); } else mask.last_annosto=mask.get_int(F_STOANNORIF); } return(TRUE); } bool TMask_anamag::handle_sheet_um(TMask_field &fld, KEY k) { TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente TMask_anamag & m= (TMask_anamag &)(fld.mask()); if (k == K_ENTER) { if (*f.cell(0,f.cid2index(FS_CODUM))==' ') return error_box("La prima unità di misura deve essere specificata"); const int items = f.items(); if (items > 0) { TAssoc_array v; // istanzia l'hash table per il controllo di univocità for (int i= 0; i=f.items()) { return error_box("L'unità di misura '%s' deve essere presente in tabella",(const char *)m.um_principale()); } } } else if (k==K_TAB) { } else if (k==K_SPACE) { m.um_principale()=f.cell(0,f.cid2index(FS_CODUM)); } return TRUE; } bool TMask_anamag::notify_sheet_um(TSheet_field &fld_um, int r, KEY k) { if (k == K_TAB) { fld_um.sheet_mask().enable(DLG_DELREC, r > 0); if (r == 0) { if (fld_um.items() == 0) ((TToken_string &)fld_um.row(0)) = "|1"; // aggiunge una riga allo sheet else ((TToken_string &)fld_um.row(0)).add("1",fld_um.cid2index(FS_FCUM)); // forza la prima unita' di misura a 1 fld_um.disable_cell(0, fld_um.cid2index(FS_FCUM)); // mette in sola lettura il secondo campo della prima riga (il fattore di conversione della prima U.M. è fisso a 1) fld_um.force_update(0); } } return TRUE; } bool TMask_anamag::handle_sheet_deslin(TMask_field &fld, KEY k) { if (k == K_ENTER) { TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente const int items = f.items(); if (items > 0) { TAssoc_array v; // istanzia l'hash table per il controllo di univocità for (int i= 0; i < items; i++) { const TString16 codlin(f.cell(i,0)); if (codlin.blank()) return error_box("I codici lingua non possono essere vuoti"); if (v.add(codlin)) return error_box("I codici lingua devono essere diversi tra loro"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già } } } return TRUE; } bool TMask_anamag::handle_sheet_cod(TMask_field &fld, KEY k) { if (k==K_ENTER) { TSheet_field &f= (TSheet_field &)fld; // typecast del campo al suo sheet corrispondente const int items = f.items(); if (items > 0) { TMask &m= fld.mask(); // prende la maschere d'origine del campo TAssoc_array v; // istanzia l'hash table per il controllo di univocità v.add(m.get(F_CODART)); // aggiunge all'hash table il codice articolo originale for (int i= 0; i< items; i++) { const TString80 codart(f.cell(i,0)); if (codart.blank()) return error_box("I codici alternativi non possono essere vuoti"); if (v.add(codart)) return error_box("I codici alternativi devono essere diversi tra loro e dal codice dell'articolo"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già } } } return TRUE; } bool TMask_anamag::handle_sheetgiac(TMask_field &fld, KEY k) { if (k==K_ENTER) { TSheet_field &f=(TSheet_field &)fld; const int items = f.items(); if (items > 0) { TMask &m= f.mask(); // prende la maschere d'origine del campo TAssoc_array v; // istanzia l'hash table per il controllo di univocità for (int i= 0; i< items; i++) { TString codgiac(f.cell(i,F_CODMAG-FIRST_FIELD)); codgiac << f.cell(i,F_CODDEP-FIRST_FIELD); codgiac << f.cell(i,F_LIV1-FIRST_FIELD); codgiac << f.cell(i,F_LIV2-FIRST_FIELD); codgiac << f.cell(i,F_LIV3-FIRST_FIELD); codgiac << f.cell(i,F_LIV4-FIRST_FIELD); if (codgiac.blank()) return error_box("I codici delle giacenze non possono essere vuoti"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già if (v.add(codgiac)) return error_box("Esistono due righe con lo stesso codice di giacenza"); if (!notify_sheet_giac(f, i, K_ENTER)) return FALSE; } // ordina le righe per livello+codmag // f.rows_array().sort(); } } return TRUE; } int TMask_anamag::add_totali_storico(TString & codmag) { TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); bool need_rigatotali(TRUE); for (int r=0 ; r< s.items() && codmag>=s.cell(r,s.cid2index(F_STOCODMAG)); r++) { if (*s.cell(r,s.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI && codmag==s.cell(r,s.cid2index(F_STOCODMAG))) need_rigatotali=FALSE; } if (need_rigatotali ) { real totq,totval; TLocalisamfile mag(LF_MAG); mag.setkey(2); mag.put(MAG_ANNOES,get(F_STOANNORIF)); //mag.put(MAG_CODART,get(F_CODART)); mag.put(MAG_CODMAG,codmag); mag.read(); while (!mag.eof() && get_int(F_STOANNORIF)==mag.get_int(MAG_ANNOES) && strncmp((const char *)codmag,mag.get(MAG_CODMAG),3)==0) { if (get(F_CODART)==mag.get(MAG_CODART)) { totq+=mag.get_real(MAG_RIM); totval+=mag.get_real(MAG_VALRIM); } mag.next(); } s.insert(r,FALSE); s.row(r ).add(SIMBOLO_TOTALI,s.cid2index(F_STOTIPORIGA)); s.row(r ).add(codmag,s.cid2index(F_STOCODMAG)); s.row(r ).add("Totale",s.cid2index(F_STOANNOES)); s.disable_cell(r,-1); s.insert(r+1,FALSE); s.row(r+1).add(SIMBOLO_TOTALI,s.cid2index(F_STOTIPORIGA)); s.row(r+1).add(codmag,s.cid2index(F_STOCODMAG)); s.row(r+1).add("Rim.in",s.cid2index(F_STOANNOES)); s.row(r+1).add(totq.string(),s.cid2index(F_STOQUANT)); s.row(r+1).add(totval.string(),s.cid2index(F_STOVAL)); s.disable_cell(r+1,-1); } update_totali_storico(codmag); return r; } void TMask_anamag::update_totali_storico(TString & codmag) { TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); real tot1,tot2; // find first occourrence.. int i=0 ; while (i< s.items() && codmag>s.cell(i,s.cid2index(F_STOCODMAG))) i++; // ...sum... for (; i< s.items() && *s.cell(i,s.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI ; i++) { tot1+=real(s.cell(i,s.cid2index(F_STOQUANT))); tot2+=real(s.cell(i,s.cid2index(F_STOVAL))); } //... display if (i< s.items()) { s.row(i).add(tot1.string(),s.cid2index(F_STOQUANT)); s.row(i).add(tot2.string(),s.cid2index(F_STOVAL)); s.force_update(i); } } bool TMask_anamag::remove_totali_storico(TString & codmag) { TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); bool found_some(FALSE); if (codmag==" ") return FALSE; for (int r=0 ; !found_some && r< s.items()-1 && !(*s.cell(r,s.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI && codmag==s.cell(r,s.cid2index(F_STOCODMAG))); r++) { if (*s.cell(r,s.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI && codmag==s.cell(r,s.cid2index(F_STOCODMAG))) found_some=TRUE; } if (!found_some) { // ultima riga s.destroy(r,FALSE); s.destroy(r,FALSE); } return !found_some; } bool TMask_anamag::check_totali_storico() { TSheet_field &s =(TSheet_field &)field(F_SHEETSTOMAG); for (int r=0 ; r< s.items() ; r++) { // rintraccia il totale for (; r< s.items() && *s.cell(r,s.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI; r++) ; real totq1(s.cell(r,s.cid2index(F_STOQUANT))),totq2(s.cell(r+1,s.cid2index(F_STOQUANT))); if (totq1!=totq2) if (!yesno_box("La somma delle composizioni dello storico \nper il magazzino %s non corrisponde \nalla rimanenza iniziale.\n Proseguo ugualmente ?", (const char *)s.cell(r,s.cid2index(F_STOCODMAG)))) return FALSE; real totval1(s.cell(r,s.cid2index(F_STOVAL))),totval2(s.cell(r+1,s.cid2index(F_STOVAL))); if (totval1!=totval2) return yesno_box("La somma del valore delle composizioni dello storico \n per il magazzino %s non corrisponde \nal valore della rimanenza iniziale.\n Proseguo ugualmente ?", (const char *)s.cell(r,s.cid2index(F_STOCODMAG))); r++; } return TRUE; } bool TMask_anamag::notify_sheet_giac(TSheet_field &f, int i, KEY k) { TMask_anamag & m=(TMask_anamag &)f.mask(); switch (k) { case (K_ENTER): // fine modifica { real ck(f.cell(i,f.cid2index(F_RIM))); ck+=real(f.cell(i,f.cid2index(F_ACQ))); ck+=real(f.cell(i,f.cid2index(F_ENTR))); ck-=real(f.cell(i,f.cid2index(F_VEN))); ck-=real(f.cell(i,f.cid2index(F_USC))); ck-=real(f.cell(i,f.cid2index(F_ACL))); ck+=real(f.cell(i,f.cid2index(F_INCL))); ck-=real(f.cell(i,f.cid2index(F_INPRODF))); ck+=real(f.cell(i,f.cid2index(F_INPRODC))); ck-=real(f.cell(i,f.cid2index(F_SCARTI))); ck-=real(f.cell(i,f.cid2index(F_GIAC))); if (!ck.is_zero()) { f.error_box("La giacenza deve essere pari a RIM+(ACQ+ENTR)-(VEN+USC)-(ACL-INCL)-(PRODF-PRODC) - SCARTI)"); return FALSE; } } break; case (K_CTRL + K_INS): // richiesta di inserimento case (K_TAB): // modifica if (*f.cell(i,f.cid2index(F_CODMAG))==' ') { if (m.magazzini().standardmag().not_empty()) { f.row(i).add(m.magazzini().standardmag(),f.cid2index(F_CODMAG)); f.row(i).add(m.magazzini().standarddep(),f.cid2index(F_CODDEP)); } } break; } return TRUE; } bool TMask_anamag::notify_sheet_sto(TSheet_field &s, int r, KEY k) { static TString16 oldcodmag,newcodmag,oldanno,newanno; TMask_anamag & m=(TMask_anamag &)s.mask(); bool need_rigatotali=TRUE; switch (k) { case K_DEL: if (*s.cell(r,s.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI) return FALSE; break; case (K_CTRL+K_DEL): if (m.remove_totali_storico(oldcodmag)) s.force_update(); break; case K_TAB: // posizionamento sulla riga oldcodmag=s.cell(r,s.cid2index(F_STOCODMAG)); oldanno=s.cell(r,s.cid2index(F_STOANNOES)); break; case (K_ENTER): // fine modifica newanno=(s.cell(r,s.cid2index(F_STOANNOES))); newcodmag=(s.cell(r,s.cid2index(F_STOCODMAG))); if (m.esercizi_contabili()[atoi(newanno)].inizio() >= m.esercizi_contabili()[m.get_int(F_STOANNO)].inizio()) { s.row(r).add(oldanno,s.cid2index(F_STOANNOES)); s.error_box("La rimanenza iniziale di un esercizio deve essere composta da parti provenienti da esercizi precedenti"); return FALSE; } // modifica m.update_totali_storico(newcodmag); if (oldcodmag==s.cell(r,s.cid2index(F_STOCODMAG))) { if (oldanno==s.cell(r,s.cid2index(F_STOANNOES)) ) break; } else { m.remove_totali_storico(oldcodmag); } case (K_CTRL + K_INS ): // fine inserimento if (*s.cell(r,s.cid2index(F_STOCODMAG))==' ' && m.magazzini().standardmag().not_empty()) { // new line s.row(r).add(m.magazzini().standardmag(),s.cid2index(F_STOCODMAG)); } newcodmag=(s.cell(r,s.cid2index(F_STOCODMAG))); newanno=(s.cell(r,s.cid2index(F_STOANNOES))); if (newcodmag != " ") { // ordina while (r< s.items()-1 && (newcodmag > s.cell(r+1,s.cid2index(F_STOCODMAG)) || (newcodmag == s.cell(r+1,s.cid2index(F_STOCODMAG)) && (newanno > s.cell(r+1,s.cid2index(F_STOANNOES)) && *s.cell(r+1,s.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI)) )) { s.swap_rows(r,r+1); r++; } while (r>0 && (newcodmag < s.cell(r-1,s.cid2index(F_STOCODMAG)) || (newcodmag == s.cell(r-1,s.cid2index(F_STOCODMAG)) && (newanno < s.cell(r-1,s.cid2index(F_STOANNOES)) || *s.cell(r-1,s.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI )) )) { s.swap_rows(r,r-1); r--; } m.add_totali_storico(newcodmag); TSheet_field & s_um=(TSheet_field & )s.mask().field(F_SHEETUM); s.force_update(); } break; case (K_INS): // richiesta di inserimento break; } return TRUE; } bool TMask_anamag::handle_sheetstomag(TMask_field &fld, KEY k) { TSheet_field & f=(TSheet_field &)fld; TMask_anamag &m=(TMask_anamag &) f.mask(); // prende la maschere d'origine del campo if (k==K_ENTER) { const int items = f.items(); real totrim,totvalrim; if (items > 0) { if (!m.check_totali_storico()) return FALSE; TAssoc_array v; // istanzia l'hash table per il controllo di univocità for (int i= 0; i< items; i++) { if (*f.cell(i,f.cid2index(F_STOTIPORIGA))!=SIMBOLO_TOTALI) { TString codmg(f.cell(i,f.cid2index(F_STOCODMAG))); TString codeser(f.cell(i,f.cid2index(F_STOANNOES))); if (codmg.blank()) return error_box("Il codice del magazzino non può essere vuoto"); if (codeser.blank()) return error_box("I codici degli esercizi non possono essere vuoti"); // aggiunge all'hash table l'elemento 0 (primo) della riga corrente e controlla che non esista già codmg.overwrite(codeser,3); if (v.add(codmg)) return error_box("La composizione delle rimanenze deve far riferimento a esercizi tutti diversi tra loro"); TLocalisamfile stor_aux(LF_STOMAG); stor_aux.put(STOMAG_CODART,fld.mask().get(F_CODART)); stor_aux.put(STOMAG_ANNOESRIF,fld.mask().get(F_STOANNO)); stor_aux.put(STOMAG_ANNOES,codeser); totrim=totrim+(real)f.cell(i,f.cid2index(F_STOQUANT)); totvalrim=totvalrim+(real)f.cell(i,f.cid2index(F_STOVAL)); } } for (i= 0; i< items;) { if (*f.cell(i,f.cid2index(F_STOTIPORIGA))==SIMBOLO_TOTALI) f.rows_array().remove(i,TRUE); else i++; } // ordina le righe per ANNO //f.rows_array().sort(); if ( m.get(F_STOANNO)selected() > 0) { // ALGORITMO DI PRECALCOLO DEL RAPPORTO DELLE UNITA' DI MISURA NELLO SHEET // // SHEET: // ----- // riga u.m. f.c. // 1) KM 1 -> kilometri (you), riferiti al metro (your) con f.c. 1000 (your_fc) // ... ... ... // ...) MM X -> millimetri (me), riferiti al metro (my) con f.c. 0,001 (my_fc) // // se (your==my) allora X=(my_fc/your_fc) ...chiaro, no!? :-) TTable t("%UMS"); real x; // fattore di conversione dell'unità di misura corrente const TString16 first_um(f->row(0).get(0)); // prende l'unità di misura di rapporto (dalla prima linea dello sheet) t.zero(); t.put("CODTAB", curr_um); if (t.read() == NOERR) { const TString16 rif_um(t.get("S7")); // prende l'unità di misura di riferimento dell'unità di misura corrente x = t.get_real("R10"); // prende il suo fattore di conversione if (rif_um != first_um) { t.zero(); t.put("CODTAB", first_um); if (t.read() == NOERR) { TString16 rif_first_um(t.get("S7")); // prende l'unità di misura di riferimento dell'unità di misura di rapporto const real rif_fc_first_um(t.get_real("R10")); // prende il suo fattore di conversione if (rif_first_um == rif_um) { x /= rif_fc_first_um; // calcola il rapporto tra i fattori di conversione x.round(5); // arrotonda il risultato a 5 decimali } else { if (rif_first_um == curr_um) { x= 1/rif_fc_first_um; } } } } } if (x == ZERO) x = 1.00; m.set(FS_FCUM, x); // il risultato viene scritto nel campo del fattore di conversione } else { TString & um_p=((TMask_anamag &)f->mask()).um_principale(); if (um_p.blank()) { f->mask().set(F_UMPRINCIPALE,curr_um); f->mask().set(F_UMPRINCIPALE2,curr_um); um_p=curr_um; } } } } return TRUE; } bool TMask_anamag::handle_sheet_um_price(TMask_field &f, KEY k) { if (f.to_check(k,TRUE)) { TMask& m = f.mask(); TString codiva= m.get_sheet()->mask().get(F_CODIVA);// recuper il codice IVA dalla maschera principale real netto = 0.0; real lordo = 0.0; if (f.dlg() == FS_PREZZO) { netto = real(m.get(FS_PREZZO)); lordo = netto2lordo(netto,codiva); m.set(FS_PREZZO_LORDO,lordo.string()); } else { lordo = real(m.get(FS_PREZZO_LORDO)); real prec_lordo = lordo; netto = lordo2netto(lordo,codiva); if (lordo != prec_lordo) { warning_box("Scorporando l'iva dal prezzo lordo si e' dovuto\n" "correggere quest'ultimo a causa di arrotondamenti."); m.set(FS_PREZZO_LORDO,lordo.string()); } m.set(FS_PREZZO,netto.string()); } } return TRUE; } void TMask_anamag::sheetgiac_get(TSheet_field &fld_righe, int item) { TMask_anamag &m=(TMask_anamag &)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("LIVELLO") ,1),fld_righe.cid2index(F_LIV1) ); row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVELLO") ,2),fld_righe.cid2index(F_LIV2) ); row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVELLO") ,3),fld_righe.cid2index(F_LIV3) ); row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVELLO") ,4),fld_righe.cid2index(F_LIV4) ); } // item varies from 1 to items() void TMask_anamag::sheetgiac_put(TSheet_field &fld_righe, int item) { TMask_anamag &m=(TMask_anamag &)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("LIVELLO", packedcode); } } // Aggiorna il valore delle giacenze in base al cambiamento dell'unità di misura principale void TMask_anamag::ricalcola_giacenze() { real fc(1.0); TSheet_field & f=(TSheet_field &)field(F_SHEETUM); if (!um_principale().blank() && um_principale()!=f.cell(0,f.cid2index(FS_CODUM))) { for (int i= 0; i