diff --git a/mg/mg0400.cpp b/mg/mg0400.cpp index d7d49040b..d7b687710 100755 --- a/mg/mg0400.cpp +++ b/mg/mg0400.cpp @@ -1,5 +1,4 @@ #include -#include #include #include #include @@ -50,37 +49,47 @@ bool TClifo_giac_mask::notify_sheet_giac(TSheet_field &f, int i, KEY k) { TClifo_giac_mask & m = (TClifo_giac_mask&)f.mask(); - const bool gestmag = main_app().has_module(MGAUT) && m.magazzini().gestmag(); - if (gestmag) - { 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))); + //controlla che l'indsped di una nuova riga non sia gia' presente, senno' avrebbe 2 record con la stessa.. + //..chiave visto che la testata e' uguale per tutti + const int indsped = atoi(f.cell(i, f.cid2index(F_INDSPED))); + for (int j = 0; j < f.items(); j++) + { + if (i != j) + { + const int jndsped = atoi(f.cell(j, f.cid2index(F_INDSPED))); + if (indsped == jndsped) + return f.error_box(FR("L'indirizzo della riga %d e' lo stesso di quello della riga %d"), i+1, j+1); + } + } //for (int j = 0... - 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; + + 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; + } //if(!ck.is_zero())... + + } + break; default: break; } - } //if(gestmag... //campi presi da altri campi della maschera per.. //..essere visualizzati nella pag. giacenze @@ -107,7 +116,7 @@ bool TClifo_giac_mask::notify_sheet_giac(TSheet_field &f, int i, KEY k) bool TClifo_giac_mask::handle_sheet_giac_valgiac(TMask_field &f, KEY k) { - if (k==K_TAB && f.dirty()) + if (k == K_TAB && f.dirty()) { TMask& m = f.mask(); real q=m.get_real(F_RIM)+m.get_real(F_ACQ); @@ -128,7 +137,7 @@ bool TClifo_giac_mask::handle_autoinsert_livgiac(TMask_field &fld, KEY k) if (k == K_TAB && fld.focusdirty() && !fld.empty()) { TClifo_giac_mask & mask = (TClifo_giac_mask&)fld.mask().get_sheet()->mask(); - const int levnum=fld.dlg()-F_LIV1+1; + const int levnum = fld.dlg() - F_LIV1 + 1; return mask.livelli_giac->autoinsert(levnum, fld); } return true; @@ -138,8 +147,8 @@ void TClifo_giac_mask::sheetgiac_get(TSheet_field &fld_righe, int item) { TClifo_giac_mask &m = (TClifo_giac_mask&)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); + 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) ); @@ -152,7 +161,7 @@ void TClifo_giac_mask::sheetgiac_get(TSheet_field &fld_righe, int item) void TClifo_giac_mask::sheetgiac_put(TSheet_field &fld_righe, int item) { TClifo_giac_mask &m = (TClifo_giac_mask&)fld_righe.mask(); - TToken_string &row= fld_righe.row(item-1); + TToken_string &row= fld_righe.row(item - 1); TRectype &recrighe= fld_righe.record()->row(item, TRUE); // codici livello @@ -216,10 +225,11 @@ void TClifo_giac_mask::set_parametered_fields() } // abilita la gestione delle ubicazioni (manuale/su tabella) - const bool ubi = gestmag && magazzini().gestubi_man(); - fld_giac.sheet_mask().field(F_UBICAZ).show(!ubi); - fld_giac.sheet_mask().field(F_UBICAZD).show(!ubi); - fld_giac.sheet_mask().field(F_UBICAZ2).show(ubi); + if (magazzini().gestubi_man()) + { + fld_giac.sheet_mask().field(F_UBICAZ).check_type(CHECK_SEARCH); + fld_giac.sheet_mask().field(F_UBICAZD).check_type(CHECK_SEARCH); + } } @@ -238,6 +248,7 @@ TClifo_giac_mask::TClifo_giac_mask(TRelation * rel) : TMask("mg0400a") set_parametered_fields(); } +//--------------------------------------------------------------------------------------------------------------------------// //-------------------------------------------- // APPLICAZIONE //-------------------------------------------- @@ -251,17 +262,19 @@ protected: virtual bool user_destroy(); virtual TMask *get_mask(int) { return _msk; } - TISAM_recordset recset_giacenze(const char tipocf, const long codcf, const TString& codart, const int annoes); + TString query_giacenze(const TMask& m); virtual int read(TMask& m); - void fill_giacenze(const char tipocf, const long codcf, const TString& codart, const int annoes); + virtual bool find(word key = 0); + void fill_giacenze(const TMask& m); virtual bool remove(); int remove_giacenze(const char tipocf, const long codcf, const TString& codart, const int annoes); virtual int write(const TMask& m); virtual int rewrite(const TMask& m); - int write_giacenze(TSheet_field& sheet_giac, const char tipocf, const long codcf, const TString& codart, const int annoes); + int find_codindsp(TSheet_field& s,const int codindsp) const; + int write_giacenze(const TMask& m); public: virtual TRelation *get_relation() const { return _rel; } @@ -269,17 +282,20 @@ public: virtual ~TClifo_giac() {} }; -//------------------------------------------- -// Metodo comune per riempire un recordset -//------------------------------------------- -TISAM_recordset TClifo_giac::recset_giacenze(const char tipocf, const long codcf, const TString& codart, const int annoes) +//----------------------------------------------------------------------------- +// Metodo comune per riempire una stringa da usare come query nei vari recset +//----------------------------------------------------------------------------- +TString TClifo_giac::query_giacenze(const TMask& m) { - TISAM_recordset giacenze("USE CLIFOGIAC\nSELECT CODART=#CODART\nFROM TIPOCF=#TIPOCF CODCF=#CODCF ANNOES=#ANNOES\nTO TIPOCF=#TIPOCF CODCF=#CODCF ANNOES=#ANNOES"); - giacenze.set_var("#CODART", TVariant(codart)); - TString4 str_tipocf; str_tipocf << tipocf; - giacenze.set_var("#TIPOCF", TVariant(str_tipocf)); - giacenze.set_var("#CODCF", codcf); - giacenze.set_var("#ANNOES", (long)annoes); + const char tipocf = m.get(F_TIPOCF)[0]; + const long codcf = m.get_long(F_CODCF); + const TString80 codart = m.get(F_CODART); + const int annoes = m.get_int(F_ANNOES); + + TString& giacenze = get_tmp_string(); + giacenze << "USE CLIFOGIAC KEY 3\n" + << "\nFROM ANNOES=" << annoes << " CODART=" << codart << " TIPOCF=" << tipocf << " CODCF=" << codcf + << "\nTO ANNOES=" << annoes << " CODART=" << codart << " TIPOCF=" << tipocf << " CODCF=" << codcf ; return giacenze; } @@ -288,14 +304,13 @@ TISAM_recordset TClifo_giac::recset_giacenze(const char tipocf, const long codcf // Metodi READ //------------------ //FILL_GIACENZE: metodo x riempire lo sheet della maschera con tutti i record che soddisfano la chiave incompleta -void TClifo_giac::fill_giacenze(const char tipocf, const long codcf, const TString& codart, const int annoes) +void TClifo_giac::fill_giacenze(const TMask& m) { - //e usiamo 'sti recordset che sono comodi e capibili...quasi - TISAM_recordset giacenze = recset_giacenze(tipocf, codcf, codart, annoes); + TISAM_recordset giacenze(query_giacenze(m)); + int items = giacenze.items(); - TProgind pi(giacenze.items(), TR("Ricerca giacenze per indirizzo di spedizione..."), true, true); - - TSheet_field& sheet = _msk->sfield(F_SHEETGIAC); + //riempie lo sheet con i record che soddisfano la chiave parziale applicata per avere il recordset + TSheet_field& sheet = m.sfield(F_SHEETGIAC); TMask& sheetmask = sheet.sheet_mask(); TRelation& rel = *giacenze.cursor()->relation(); //accesso alle righe @@ -304,10 +319,7 @@ void TClifo_giac::fill_giacenze(const char tipocf, const long codcf, const TStri if (giacenze.items() > 0) { for (bool ok = giacenze.move_first(); ok; ok = giacenze.move_next()) - { - if (!pi.addstatus(1)) - break; - + { TToken_string& row = sheet.row(-1); //crea una nuova riga dello sheet //scandisco nella maschera tutti i campi che hanno un field @@ -319,41 +331,88 @@ void TClifo_giac::fill_giacenze(const char tipocf, const long codcf, const TStri } sheet.check_row(sheet.items()-1); //fa fare alla maschera la decodifica dei codici e aggiorna la TToken_string } - sheet.force_update(); //forza l'update dello sheet, in modo da rendere visibili i cambiamneti fatti + sheet.force_update(); //forza l'update dello sheet, in modo da rendere visibili i cambiamenti fatti } return; } +bool TClifo_giac::find(word key) +{ + bool ok = false; + const char tipocf = _msk->get(F_TIPOCF)[0]; + const long codcf = _msk->get_long(F_CODCF); + const TString80 codart = _msk->get(F_CODART); + const int annoes = _msk->get_int(F_ANNOES); + + TLocalisamfile clifogiac(LF_CLIFOGIAC); + + clifogiac.put(CLIFOGIAC_ANNOES, annoes); + clifogiac.put(CLIFOGIAC_CODART, codart); + clifogiac.put(CLIFOGIAC_TIPOCF, tipocf); + clifogiac.put(CLIFOGIAC_CODCF, codcf); + + clifogiac.setkey(3); + + ok = clifogiac.read(_isgteq) == NOERR; + + return ok; +} + int TClifo_giac::read(TMask& m) { -// int err = TRelation_application::read(m); -// return err; - - //recupero i dati della testata - const char tipocf = m.get(F_TIPOCF)[0]; - const long codcf = m.get_long(F_CODCF); - const TString80 codart = m.get(F_CODART); - const int annoes = m.get_int(F_ANNOES); - - fill_giacenze(tipocf, codcf, codart, annoes); - + fill_giacenze(m); return NOERR; } //------------------ // Metodi WRITE //------------------ -//WRITE_GIACENZE:scrive i dati sul file 166 (CLIFOGIAC) -int TClifo_giac::write_giacenze(TSheet_field& sheet_giac, const char tipocf, const long codcf, const TString& codart, - const int annoes) +int TClifo_giac::find_codindsp(TSheet_field& s,const int codindsp) const { - TISAM_recordset giacenze = recset_giacenze(tipocf, codcf, codart, annoes); - int items = giacenze.items(); + int r=-1; + + //per ogni riga dello sheet, legge codindsp, + //e se esiste interrompe restituendo un valore positivo, + //se no arriva fino in fondo e resituisci -1 + for (r = s.items()-1; r >= 0; r--) + { + const int indsped = s.row(r).get_int(s.cid2index(F_INDSPED)); + + if (codindsp == indsped) + break; + } + return r; +} + +//WRITE_GIACENZE:scrive i dati sul file 166 (CLIFOGIAC) +int TClifo_giac::write_giacenze(const TMask& m) +{ + TISAM_recordset giacenze(query_giacenze(m)); int err = NOERR; TLocalisamfile& clifogiac = giacenze.cursor()->file(); - //Maschera di sheet + //si prende lo sheet sulla maschera principale... + TSheet_field& sheet_giac = m.sfield(F_SHEETGIAC); + + //per ogni riga del recordset + for (bool ok = giacenze.move_first(); ok; ok = giacenze.move_next()) + { + //leggo indirizzo spedizione unico campo chiave sulla riga dello sheet + const int codindsp = giacenze.get(CLIFOGIAC_INDSPED).as_int(); + + //tutte le righe del TISAM_recordset che NON SONO nel TRecord_array vanno eliminate dal file + if (find_codindsp(sheet_giac, codindsp) < 0) + clifogiac.remove(); + } + + //prende i dati dalla maschera principale + const char tipocf = m.get(F_TIPOCF)[0]; + const long codcf = m.get_long(F_CODCF); + const TString80 codart = m.get(F_CODART); + const int annoes = m.get_int(F_ANNOES); + + //..e quindi la maschera di sheet TMask& msk = sheet_giac.sheet_mask(); //per ogni riga dello sheet @@ -390,32 +449,12 @@ int TClifo_giac::write_giacenze(TSheet_field& sheet_giac, const char tipocf, con int TClifo_giac::write(const TMask& m) { - //int err = TRelation_application::write(m); - //return err; - - const char tipocf = m.get(F_TIPOCF)[0]; - const long codcf = m.get_long(F_CODCF); - const TString80 codart = m.get(F_CODART); - const int annoes = m.get_int(F_ANNOES); - - TSheet_field& sheet_giac = m.sfield(F_SHEETGIAC); - - return write_giacenze(sheet_giac, tipocf, codcf, codart, annoes); + return write_giacenze(m); } int TClifo_giac::rewrite(const TMask& m) { - //int err = TRelation_application::rewrite(m); - //return err; - - const char tipocf = m.get(F_TIPOCF)[0]; - const long codcf = m.get_long(F_CODCF); - const TString80 codart = m.get(F_CODART); - const int annoes = m.get_int(F_ANNOES); - - TSheet_field& sheet_giac = m.sfield(F_SHEETGIAC); - - return write_giacenze(sheet_giac, tipocf, codcf, codart, annoes); + return write_giacenze(m); } //------------------ @@ -424,8 +463,11 @@ int TClifo_giac::rewrite(const TMask& m) //REMOVE_GIACENZE: elimina tutte le righe dello sheet per il clifo,l'articolo e l'anno passati int TClifo_giac::remove_giacenze(const char tipocf, const long codcf, const TString& codart, const int annoes) { - TISAM_recordset giacenze = recset_giacenze(tipocf, codcf, codart, annoes); - int items = giacenze.items(); + TString query_giacenze; + query_giacenze << "USE CLIFOGIAC KEY 3\n" + << "\nFROM ANNOES=" << annoes << " CODART=" << codart << " TIPOCF=" << tipocf << " CODCF=" << codcf + << "\nTO ANNOES=" << annoes << " CODART=" << codart << " TIPOCF=" << tipocf << " CODCF=" << codcf ; + TISAM_recordset giacenze(query_giacenze); int err = NOERR; //l'accoppamento delle righe va fatto proprio sul file, quindi sotto con il localisamfile.. @@ -440,18 +482,13 @@ int TClifo_giac::remove_giacenze(const char tipocf, const long codcf, const TStr } bool TClifo_giac::remove() { - //bool ok = TRelation_application::remove(); - //return ok; - //recupero i dati della testata - const char tipocf = _msk->get(F_TIPOCF)[0]; - const long codcf = _msk->get_long(F_CODCF); - const TString80 codart = _msk->get(F_CODART); - const int annoes = _msk->get_int(F_ANNOES); + const TRectype rec = _rel->curr(); + const char tipocf = rec.get_char(CLIFOGIAC_TIPOCF); + const long codcf = rec.get_long(CLIFOGIAC_CODCF); + const TString80 codart = rec.get(CLIFOGIAC_CODART); + const int annoes = rec.get_int(CLIFOGIAC_ANNOES); - //variabili per lavorare sugli sheet - TSheet_field& sheet_giac = _msk->sfield(F_SHEETGIAC); - return remove_giacenze(tipocf, codcf, codart, annoes) > 0; } @@ -461,9 +498,14 @@ bool TClifo_giac::remove() bool TClifo_giac::user_create() { _rel = new TRelation(LF_CLIFOGIAC); - _msk = new TClifo_giac_mask(_rel); - + + const bool gestmag = _msk->magazzini().gestmag(); + if (!gestmag) + { + return error_box(TR("Per utilizzare questo programma e' NECESSARIO attivare la Gestione del magazzino!")); + } + return true; } diff --git a/mg/mg0400a.h b/mg/mg0400a.h index 38694e125..dd6261ed3 100755 --- a/mg/mg0400a.h +++ b/mg/mg0400a.h @@ -21,41 +21,39 @@ #define F_LOTTORIOR 110 #define F_LOTTOIRIOR 111 #define F_GIORNIRIOR 112 -#define F_GIAC 113 -#define F_VALGIAC 114 -#define F_RIM 115 -#define F_VRIM 116 -#define F_ACQ 117 -#define F_VACQ 118 -#define F_ENTR 119 -#define F_VENTR 120 -#define F_VEN 121 -#define F_VVEN 122 -#define F_USC 123 -#define F_VUSC 124 -#define F_ORDF 125 -#define F_VORDF 126 -#define F_ORDC 127 -#define F_VORDC 128 -#define F_SCARTI 129 -#define F_VSCARTI 130 -#define F_INPRODC 131 -#define F_INPRODF 132 -#define F_ACL 133 -#define F_INCL 134 -#define F_LABELS 135 -#define F_NDIST 136 +#define F_GIAC 113 +#define F_VALGIAC 114 +#define F_RIM 115 +#define F_VRIM 116 +#define F_ACQ 117 +#define F_VACQ 118 +#define F_ENTR 119 +#define F_VENTR 120 +#define F_VEN 121 +#define F_VVEN 122 +#define F_USC 123 +#define F_VUSC 124 +#define F_ORDF 125 +#define F_VORDF 126 +#define F_ORDC 127 +#define F_VORDC 128 +#define F_SCARTI 129 +#define F_VSCARTI 130 +#define F_INPRODC 131 +#define F_INPRODF 132 +#define F_ACL 133 +#define F_INCL 134 +#define F_LABELS 135 +#define F_NDIST 136 // colonne non visibili dello Sheet -#define F_UBICAZD 154 -#define F_DESL1 155 -#define F_DESL2 156 -#define F_DESL3 157 -#define F_DESL4 158 +#define F_UBICAZD 154 +#define F_DESL1 155 +#define F_DESL2 156 +#define F_DESL3 157 +#define F_DESL4 158 // campi richiesti da quei rompicazzo di Xfirpo -#define F_CODARTR 159 -#define F_DESCRR 160 +#define F_CODARTR 159 +#define F_DESCRR 160 -// campi doppi -#define F_UBICAZ2 207 diff --git a/mg/mg0400a.uml b/mg/mg0400a.uml index ce82efc39..1087e256d 100755 --- a/mg/mg0400a.uml +++ b/mg/mg0400a.uml @@ -107,6 +107,7 @@ BEGIN ITEM "Liv3@10" ITEM "Liv4@10" ITEM "Data rif.@10" + ITEM "Ubicazione" ITEM "Livello rior.@10" ITEM "Scorta min.@10" ITEM "Lotto rior.@10" @@ -254,25 +255,18 @@ BEGIN FIELD DATARIF END -// ubicazione introdotta da tabella ubicazioni -STRING F_UBICAZ 10 +//ubicazione introdotta da tabella ubicazioni (accensione/spegnimento gestito da programma) +STRING F_UBICAZ 3 BEGIN PROMPT 2 4 "Ubicazione " - FIELD UBICAZ USE UBI INPUT CODTAB F_UBICAZ - DISPLAY "Codice" CODTAB[1,3] + DISPLAY "Codice" CODTAB DISPLAY "Ubicazione@50 " S0 OUTPUT F_UBICAZ CODTAB OUTPUT F_UBICAZD S0 CHECKTYPE NORMAL - STR_EXPR (#F_UBICAZ[4,10]=="") -END - -// ubicazione introdotta direttamente o da tabella -STRING F_UBICAZ2 10 -BEGIN - PROMPT 2 4 "Ubicazione " + FLAGS "Z" FIELD UBICAZ END