From 5c9a74f40071d51e4638426bbca9a2b93d837897 Mon Sep 17 00:00:00 2001 From: luca83 Date: Mon, 11 May 2009 10:27:55 +0000 Subject: [PATCH] Patch level : 10.0 Files correlati : mg4.exe; mg4400.msk Ricompilazione Demo : [ ] Commento : Nuovo programma che controlla se i movimenti di magazzino sono alineatri con i documenti da cui vengono generati git-svn-id: svn://10.65.10.50/trunk@18843 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- mg/mg4400.cpp | 249 ++++++++++++++++++++++++++++++++++++++++++++++++++ mg/mg4400.h | 1 + mg/mg4400.uml | 27 ++++++ 3 files changed, 277 insertions(+) create mode 100755 mg/mg4400.cpp create mode 100755 mg/mg4400.h create mode 100755 mg/mg4400.uml diff --git a/mg/mg4400.cpp b/mg/mg4400.cpp new file mode 100755 index 000000000..1085abc32 --- /dev/null +++ b/mg/mg4400.cpp @@ -0,0 +1,249 @@ +#include +#include +#include +#include +#include +#include + +#include "mglib.h" +#include "mg4400.h" +#include "movmag.h" +#include "rmovmag.h" +#include "../ve/velib.h" + + /////////////////////////////////////// + //// TControllo_movdadoc_msk //// + /////////////////////////////////////// + +//classe TControllo_movdadoc_msk +class TControllo_movdadoc_msk : public TAutomask +{ +public: + bool on_field_event(TOperable_field& o, TField_event e, long jolly); + TControllo_movdadoc_msk (const char* name) : TAutomask(name) {} +}; + +//ON_FIELD_EVENT: metodo che gestisce gli eventi sui campi della maschera +bool TControllo_movdadoc_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + return true; +} + + /////////////////////////////////////// + //// TControllo_movdadoc_app //// + /////////////////////////////////////// + +//classe TControllo_movdadoc_app +class TControllo_movdadoc_app : public TSkeleton_application +{ + TControllo_movdadoc_msk* _msk; + +protected: + virtual bool create(); + virtual bool destroy(); + virtual void main_loop(); + + bool check(); + bool scorri_documenti(const TString4& codnum, const TAssoc_array& tpdoc, TLog_report& log); +}; + +//CHECK: metodo che ricerca le numerazioni che effettivamente generano movimenti di magazzino +//e richiama il metodo scorri_documenti() che effettivamente si occupa di fare tutti i controlli +bool TControllo_movdadoc_app::check() +{ + TAssoc_array tpdoc; + TString_array numerazioni; + + TLog_report log("Controllo movimenti magazzino"); + + { + //cerco quali sono i tipi documento che generano movimenti di magazzino + TISAM_recordset tipi("USE %TIP SELECT (B1=\"X\")&& (S7 != \"\")"); + + for (bool ok = tipi.move_first(); ok; ok = tipi.move_next()) + tpdoc.add(tipi.get("CODTAB").as_string(), tipi.get("S7").as_real()); + } + + if (tpdoc.items() > 0) + { + //cerco i codnum che mi servono effettivamente + TISAM_recordset num("USE %NUM"); + + for (bool ok = num.move_first(); ok; ok = num.move_next()) + { + const TCodice_numerazione& cn = cached_numerazione(num.get("CODTAB").as_string()); + bool found = false; + for (int t = cn.ntipi_doc()-1; t >= 0 && !found; t--) + found = tpdoc.is_key(cn.tipo_doc(t)); + + if (found) + numerazioni.add(cn.codice()); + } + } + + bool corretto = true; + + //scorro tutti i documenti numerazione per numerazione + FOR_EACH_ARRAY_ROW(numerazioni, n, codnum) + { + if (!corretto) + { + corretto = scorri_documenti(*codnum, tpdoc, log); + corretto = false; + } + else + corretto = scorri_documenti(*codnum, tpdoc, log); + } + + if (corretto) + log.log(1, "Non sono stati rilevati errori"); + + //Mostro il log degli errori + TReport_book buc; + buc.add(log); + buc.preview(); + + return true; +} + +//SCORRI_DOCUMENTI: metodo che effettivamente si occupa di scorrere tutti i documenti di tutte le numerazioni +//e controlla la corrispondenza con i movimenti di magazzino associati ai documenti +bool TControllo_movdadoc_app::scorri_documenti(const TString4& codnum, const TAssoc_array& tpdoc, TLog_report& log) +{ + const TString4 anno = _msk->get(F_ANNOES); + + //preparo la query che limita i movimenti + TString query; + query << "USE DOC\nFROM PROVV=D ANNO=" << anno << " CODNUM=" << codnum + << "\nTO PROVV=D ANNO=" << anno << " CODNUM=" << codnum; + + TISAM_recordset documenti(query); + + bool corretto = true; + + for (bool ok = documenti.move_first(); ok; ok = documenti.move_next()) + { + TAssoc_array qtardoc; + TAssoc_array qtarmov; + TDocumento doc(documenti.cursor()->curr()); + const long ndoc = doc.get_long(DOC_NDOC); + + real *dastato = (real*)tpdoc.objptr(doc.get(DOC_TIPODOC)); + + if (doc.get_int(DOC_STATO) < dastato->integer()) + continue; + + //controllo se effettivamente esiste il movimento di magazzino + const TRectype& movmag = cache().get(LF_MOVMAG, doc.get_long(DOC_MOVMAG)); + if (movmag.empty()) + { + corretto = false; + TString str; + str << "Non esiste il movimento di magazzino associato al documento " << codnum + << " numero " << ndoc << " del " << doc.get_date(DOC_DATADOC); + log.log(2, str); + continue; + } + + //scorro tutte le righe documento + for (long i = 1; i <= doc.rows(); i++) + { + const TRiga_documento& rdoc = doc[i]; + const TString80 codart = rdoc.get(RDOC_CODARTMAG); + + if (codart.full()) + { + TArticolo& art = rdoc.articolo(); + + //leggo se esiste già nel TAssoc_array + real *qta = (real*)qtardoc.objptr(codart); + //se non esiste + if (qta == NULL) + { + //per ora memorizzo zero + qta = new real; + qtardoc.add(codart,qta); + } + //aggiorno la quantità convertendola all'unità di misura di base + *qta += art.convert_to_um(rdoc.quantita(), NULL, rdoc.get(RDOC_UMQTA)); + } + } + + //instanzio il movimento + TMov_mag mov(doc.get_long(DOC_MOVMAG)); + //scorro tutte le righe dei movimenti di magazzino + for (long i = 1; i<= mov.rows(); i++) + { + TString80 codart = mov.body().row(i).get(RMOVMAG_CODART); + //leggo se esiste già nel TAssoc_array + real *qta = (real*)qtarmov.objptr(codart); + //se non esiste + if (qta == NULL) + { + //per ora memorizzo zero + qta = new real; + qtarmov.add(codart,qta); + } + //aggiorno la quantità convertendola all'unità di misura di base + *qta += mov.body().row(i).get_real(RMOVMAG_QUANT); + } + + //se non corrisoinde il numero di items, segnalo errore + if (qtardoc.items() != qtarmov.items()) + { + corretto = false; + TString str; + str << "Non sono state create tutte le righe del movimento associate al documento " << codnum + << " numero " << ndoc << " del " << doc.get_date(DOC_DATADOC); + log.log(2, str); + continue; + } + + //controllo la corriposndenza tra i due array + FOR_EACH_ASSOC_OBJECT(qtardoc, obj, key, itm) + { + real *dqta = (real*)itm; + real *mqta = (real*)qtarmov.objptr(key); + + if (mqta == NULL || *dqta != *mqta) + { + corretto = false; + TString str; + str << "Non c'è corrispondenza tra le righe documento e le righe movimento per il documento " << codnum + << " numero " << ndoc << " del " << doc.get_date(DOC_DATADOC); + log.log(2, str); + break; + } + } + } //ciclo for che scorre i documenti + + return corretto; +} + +//CREATE: metodo costruttore +bool TControllo_movdadoc_app::create() +{ + _msk = new TControllo_movdadoc_msk("mg4400"); + return TSkeleton_application::create(); +} + +//DESTROY: metodo distruttore +bool TControllo_movdadoc_app::destroy() +{ + delete _msk; + return TSkeleton_application::destroy(); + +} + +void TControllo_movdadoc_app::main_loop() +{ + while (_msk->run() == K_ENTER) + check(); +} + +int mg4400(int argc, char* argv[]) +{ + TControllo_movdadoc_app a; + a.run(argc,argv,TR("Controllo lista movimenti")); + return 0; +} diff --git a/mg/mg4400.h b/mg/mg4400.h new file mode 100755 index 000000000..1e037959c --- /dev/null +++ b/mg/mg4400.h @@ -0,0 +1 @@ +#define F_ANNOES 101 \ No newline at end of file diff --git a/mg/mg4400.uml b/mg/mg4400.uml new file mode 100755 index 000000000..f4a05ab29 --- /dev/null +++ b/mg/mg4400.uml @@ -0,0 +1,27 @@ +#include "mg4400.h" + +PAGE "Controllo lista movimenti" -1 -1 30 2 + +NUMBER F_ANNOES 4 +BEGIN + FLAGS "AZ" + PROMPT 2 1 "Codice esercizio " + USE ESC + INPUT CODTAB F_ANNOES + DISPLAY "Esercizio" CODTAB + DISPLAY "Dal@12" D0 + DISPLAY "Al@12" D1 + OUTPUT F_ANNOES CODTAB + ADD NONE + CHECKTYPE REQUIRED +END + +ENDPAGE + +TOOLBAR "" 0 0 0 2 + +#include + +ENDPAGE + +ENDMASK