From 80a623909282780728247affebf9cd8beba9083c Mon Sep 17 00:00:00 2001 From: luca83 Date: Wed, 20 Apr 2011 15:22:04 +0000 Subject: [PATCH] Patch level : 10.0 NO PATCH Files correlati : ps1002 ps1002200a.msk Ricompilazione Demo : [ ] Commento : Importazione da terminale della produzione e aggiornamento BEM per EUROFORESI git-svn-id: svn://10.65.10.50/branches/R_10_00@21998 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ps/indice_programmi.txt | 1 + ps/ps1002.cpp | 6 +- ps/ps1002.h | 3 +- ps/ps1002200.cpp | 344 ++++++++++++++++++++++++++++++++++++++++ ps/ps1002200a.h | 3 + ps/ps1002200a.uml | 37 +++++ 6 files changed, 390 insertions(+), 4 deletions(-) create mode 100755 ps/ps1002200.cpp create mode 100755 ps/ps1002200a.h create mode 100755 ps/ps1002200a.uml diff --git a/ps/indice_programmi.txt b/ps/indice_programmi.txt index 0bb9796d6..9fa3a566a 100755 --- a/ps/indice_programmi.txt +++ b/ps/indice_programmi.txt @@ -172,6 +172,7 @@ PS1001 CRPA/DINAMICA PS1002 EUROFORESI _prod_gca stampa produzione per giorno/cliente/articolo -0 Gestione rapida(?) delle righe documento di un cliente +-1 Importazione da terminale della produzione e aggiornamento BEM PS1100 Importazione listini dei gommari (prassiroma, ex ve7500) diff --git a/ps/ps1002.cpp b/ps/ps1002.cpp index e5ae0708c..02bc625d2 100755 --- a/ps/ps1002.cpp +++ b/ps/ps1002.cpp @@ -7,9 +7,9 @@ int main(int argc, char** argv) int n = argc > 1 ? atoi(argv[1]+1) : 0; switch(n) { - case 0: ps1002100(argc, argv); break; //gestione rapida(?) delle righe documento Euroforesi - default: - ps1002100(argc, argv); break; + case 0: ps1002100(argc, argv); break; //gestione rapida(?) delle righe documento Euroforesi + case 1: ps1002200(argc, argv); break; //importazione da terminale della produzione e aggiornamento BEM Euroforesi + default: ps1002100(argc, argv); break; } exit(0); return 0; diff --git a/ps/ps1002.h b/ps/ps1002.h index 85faf35b3..9a835cc1c 100755 --- a/ps/ps1002.h +++ b/ps/ps1002.h @@ -1 +1,2 @@ -int ps1002100(int argc, char* argv[]); \ No newline at end of file +int ps1002100(int argc, char* argv[]); +int ps1002200(int argc, char* argv[]); \ No newline at end of file diff --git a/ps/ps1002200.cpp b/ps/ps1002200.cpp new file mode 100755 index 000000000..2cac7a74d --- /dev/null +++ b/ps/ps1002200.cpp @@ -0,0 +1,344 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "rdoc.h" +#include "../mr/rilprod.h" +#include "../mr/rrilprod.h" + +#include "ps1002.h" +#include "ps1002200a.h" + + /////////////////////////////////////// + //// TIMPORTA_PRODUZIONE_REC //// + /////////////////////////////////////// + +//Classe TImporta_produzione_rec +class TImporta_produzione_rec: public TAS400_recordset +{ +public: + TImporta_produzione_rec(const char* filename); +}; + +TImporta_produzione_rec::TImporta_produzione_rec(const char* filename) + : TAS400_recordset(TString("AS400(86)\n") << filename) +{ + create_field("RDOCKEY", -1, 20, _alfafld, true); //chiave di RDOC + create_field("CODART", -1, 20, _alfafld, true); //codice articolo + create_field("CODLAV", -1, 10, _alfafld, true); //codice lavorazione + create_field("QTAPROD", -1, 15, _realfld, true); //quantitą prodotta + create_field("FLGSALDO", -1, 1, _boolfld, true); //flag a saldo + create_field("DATALAV", -1, 10, _alfafld, true); //data lavorazione + create_field("ORALAV", -1, 8, _alfafld, true); //ora lavorazione +} + + /////////////////////////////////////// + //// TIMPORTA_PRODUZIONE_MSK //// + /////////////////////////////////////// + +//Classe TImporta_produzione_msk +class TImporta_produzione_msk : public TAutomask +{ +protected: + virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); + int calcola_prog(const TString& codart, const TDate& data); + int calcola_nriga(const TString& codart, const TDate& data, const long prog); + bool genera_produzione(const TFilename& file); + void sposta_file(const TString& file); + bool chiudi_bem(); + +public: + bool importa_file(); + TImporta_produzione_msk(); +}; + +bool TImporta_produzione_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) +{ + switch (o.dlg()) + { + case DLG_ELABORA: + if(e == fe_button) + { + importa_file(); + return true; + } + break; + default: break; + } + return true; +} + +//CALCOLA_PROG: data la coppia articolo - data, calcola il progressivo successivo per completare la chiave +int TImporta_produzione_msk::calcola_prog(const TString& codart, const TDate& data) +{ + TString query; + query << "USE RILPROD\n" + << "FROM CODART=#CODART DATA=#DATA\n" + << "TO CODART=#CODART DATA=#DATA\n" + << "BY PROG"; + + TISAM_recordset rilprod(query); + rilprod.set_var("#CODART", codart); + rilprod.set_var("#DATA", data); + + int prog = 1; + + if(rilprod.move_last()) + prog += rilprod.get(RILPROD_PROG).as_int(); + return prog; +} + +//CALCOLA_NRIGA: data la terna articolo - data - prog, calcola il numero riga successivo per completare la chiave +int TImporta_produzione_msk::calcola_nriga(const TString& codart, const TDate& data, const long prog) +{ + TString query; + query << "USE RRILPROD\n" + << "FROM CODART=#CODART DATA=#DATA PROG=#PROG\n" + << "TO CODART=#CODART DATA=#DATA PROG=#PROG\n" + << "BY NRIGA"; + + TISAM_recordset rrilprod(query); + rrilprod.set_var("#CODART", codart); + rrilprod.set_var("#DATA", data); + rrilprod.set_var("PROG", prog); + + int nriga = 1; + + if(rrilprod.move_last()) + nriga += rrilprod.get(RRILPROD_NRIGA).as_int(); + return nriga; +} + +//SPOSTA_FILE: archivia i file elaborati +void TImporta_produzione_msk::sposta_file(const TString& file) +{ + TFilename fileori = file; + TFilename path = fileori.path(); + path.add("elaborati"); + make_dir(path); + + TString strname; + strname.format("%06d_%06d_%s", TDate(TODAY).date2ansi(), daytime(), (const char*)fileori.name()); + TFilename filedest = path; + filedest.add(strname); + fcopy(fileori, filedest); + fileori.fremove(); +} + +bool TImporta_produzione_msk::chiudi_bem() +{ + const TDate data = get_date(F_DATA); + + TLocalisamfile rdoc(LF_RIGHEDOC); + TLocalisamfile rilprod(LF_RILPROD); + + int err = NOERR; + + TString query; + query << "USE RILPROD KEY 5"; + if(data.ok()) + query << "\nSELECT DATA<=#DATA"; + query << "\nFROM PROVVD=\"\" ANNOP=\"\" CODNUMP=\"\" NDOCP=\"\" NRIGAP=\"\"" + << "\nTO PROVVD=\"\" ANNOP=\"\" CODNUMP=\"\" NDOCP=\"\" NRIGAP=\"\""; + + TISAM_recordset testate(query); + + for(bool ok = testate.move_first(); ok; ok = testate.move_next()) + { + TRectype& trec = testate.cursor()->curr(); + const char provv = trec.get(RILPROD_PROVV)[0]; + const int anno = trec.get_int(RILPROD_ANNO); + const TString4 codnum = trec.get(RILPROD_CODNUM); + const int ndoc = trec.get_long(RILPROD_NDOC); + const int idriga = trec.get_int(RILPROD_NRIGA); + const real qta = trec.get_real(RILPROD_QTA); + + TRectype& rec = rdoc.curr(); + rec.put(RDOC_CODNUM, codnum); + rec.put(RDOC_ANNO, anno); + rec.put(RDOC_PROVV, provv); + rec.put(RDOC_IDRIGA, idriga); + + if(rec.read(rdoc) == NOERR) + { + rec.put(RDOC_CODNUM, codnum); + rec.put(RDOC_ANNO, anno); + rec.put(RDOC_PROVV, provv); + rec.put(RDOC_IDRIGA, idriga); + rec.put(RDOC_QTA, qta); + + rec.rewrite(rdoc); + + trec.put(RILPROD_PROVVP, provv); + trec.put(RILPROD_ANNOP, anno); + trec.put(RILPROD_CODNUMP, codnum); + trec.put(RILPROD_NDOCP, ndoc); + trec.put(RILPROD_NRIGAP, idriga); + trec.rewrite(rilprod); + } + else + return false; + } + return true; +} + +//GENERA_PRODUZIONE: effettiva elaborazione del file +bool TImporta_produzione_msk::genera_produzione(const TFilename& file) +{ + int err = NOERR; + TImporta_produzione_rec recset(file); + + TProgind pi(recset.items(), "Importazione in corso...", true, true); + + TLocalisamfile tprod(LF_RILPROD); + TLocalisamfile rprod(LF_RRILPROD); + + TAssoc_array tprod_ar; + + //scorro il file di input + for(bool ok = recset.move_first(); ok; ok = recset.move_next()) + { + if (!pi.addstatus(1)) + break; + + //estraggo i dati di interesse + TToken_string krdoc(recset.get("RDOCKEY").as_string(), '.'); + const TString80 codart = recset.get("CODART").as_string(); + const TString16 codlav = recset.get("CODLAV").as_string(); + const real qtaprod = recset.get("QTAPROD").as_real(); + const bool flgsaldo = recset.get("FLGSALDO").as_bool(); + const TString16 datastr = recset.get("DATALAV").as_string(); + const TString8 orastr = recset.get("ORALAV").as_string(); + + const char provv = 'D'; + const TString4 codnum = krdoc.get(0); + const int anno = krdoc.get_int(1); + const long ndoc = krdoc.get_long(2); + const int idriga = krdoc.get_int(3); + + const TDate datafine(atoi(datastr.left(2)), atoi(datastr.mid(3,2)), atoi(datastr.right(4))); + TString8 orafine(orastr); orafine.strip(":"); + + TToken_string key; + key.add(codart); + key.add(datafine); + key.add(codlav); + + int prog; + //se non l'ho gią fatto creo il record della testata, altrimenti aggiorno le quantitą + if(!tprod_ar.is_key(key)) + { + prog = calcola_prog(codart, datafine); + TRectype& testata = tprod.curr(); + testata.zero(); + testata.put(RILPROD_CODART, codart); + testata.put(RILPROD_DATA, datafine); + testata.put(RILPROD_PROG, prog); + testata.put(RILPROD_CODNUM, codnum); + testata.put(RILPROD_ANNO, anno); + testata.put(RILPROD_PROVV, provv); + testata.put(RILPROD_NDOC, ndoc); + testata.put(RILPROD_OPERATORE, codlav); + testata.put(RILPROD_QTA, qtaprod); + testata.put(RILPROD_CHIUSO, flgsaldo); + + tprod_ar.add(key, testata); + } + else + { + TRectype& testata = *(TRectype*)tprod_ar.objptr(key); + real& qta = testata.get_real(RILPROD_QTA); + qta += qtaprod; + prog = testata.get_int(RILPROD_PROG); + } + + //creo la riga corrispondente a quella letta da file + TRectype& riga = rprod.curr(); + riga.zero(); + riga.put(RRILPROD_CODART, codart); + riga.put(RRILPROD_DATA, datafine); + riga.put(RRILPROD_PROG, prog); + riga.put(RRILPROD_NRIGA, calcola_nriga(codart, datafine, prog)); + riga.put(RRILPROD_DATAINI, datafine); + riga.put(RRILPROD_ORAINI, orafine); + riga.put(RRILPROD_DATAFINE, datafine); + riga.put(RRILPROD_ORAFINE, orafine); + riga.put(RRILPROD_QTA, qtaprod); + + err = riga.rewrite_write(rprod); + } + + //salva le testate + FOR_EACH_ASSOC_OBJECT(tprod_ar, obj, key, itm) + { + TRectype& testata = *(TRectype*)itm; + err = testata.rewrite_write(tprod); + } + return err == NOERR ? true : false; +} + +//IMPORTA_FILE: controlla l'esistenza del file e richiama le effettive elaborazioni +bool TImporta_produzione_msk::importa_file() +{ + const TFilename file = get(F_FILE); + + if(file.exist()) + { + if(genera_produzione(file)) + { + sposta_file(file); + if(chiudi_bem()) + message_box(TR("Importazione terminata con successo")); + else + error_box(TR("Errore durante l'aggiornamento dei documenti")); + } + else + error_box(TR("Errore durante l'importazione del file")); + } + else + { + error_box(TR("Il file selezionato non esiste; si prega di controllare")); + return false; + } + return true; +} + +TImporta_produzione_msk::TImporta_produzione_msk() + : TAutomask ("ps1002200a") +{} + + /////////////////////////////////////// + //// TIMPORTA_PRODUZIONE_APP //// + /////////////////////////////////////// + +//Classe TImporta_produzione_app +class TImporta_produzione_app : public TSkeleton_application +{ +protected: + virtual bool check_autorization() const { return false; } + virtual const char* extra_modules() const { return "ve"; } + virtual void main_loop(); + virtual bool create(); +}; + +void TImporta_produzione_app::main_loop() +{ + TImporta_produzione_msk mask; + mask.run(); +} + +bool TImporta_produzione_app::create() +{ + return TSkeleton_application::create(); +} + +int ps1002200 (int argc, char* argv[]) +{ + TImporta_produzione_app main_app; + main_app.run(argc, argv, TR("Importa produzione da terminale")); + return true; +} \ No newline at end of file diff --git a/ps/ps1002200a.h b/ps/ps1002200a.h new file mode 100755 index 000000000..6703a8255 --- /dev/null +++ b/ps/ps1002200a.h @@ -0,0 +1,3 @@ +//Campi maschera ps1002200a +#define F_FILE 201 +#define F_DATA 202 diff --git a/ps/ps1002200a.uml b/ps/ps1002200a.uml new file mode 100755 index 000000000..21c7c40a5 --- /dev/null +++ b/ps/ps1002200a.uml @@ -0,0 +1,37 @@ +#include "ps1002200a.h" + +PAGE "Importazione" -1 -1 78 6 + +STRING DLG_PROFILE 50 +BEGIN + PROMPT 9 -12 "Profilo " + PSELECT + FLAGS "H" +END + +GROUPBOX DLG_NULL 76 4 +BEGIN + PROMPT 1 1 "@bParametri file" +END + +STRING F_FILE 255 50 +BEGIN + PROMPT 2 2 "File " + FSELECT "*.*" + CHECKTYPE REQUIRED +END + +DATE F_DATA +BEGIN + PROMPT 2 3 "Chiudi Documenti fino al " +END + +ENDPAGE + +TOOLBAR "topbar" 0 0 0 2 + +#include + +ENDPAGE + +ENDMASK \ No newline at end of file