From 81008377a7a1470351e5edc458522b53b92e0b38 Mon Sep 17 00:00:00 2001 From: luca83 Date: Mon, 16 Mar 2009 16:30:01 +0000 Subject: [PATCH] Patch level : 10.0 patch 260 Files correlati : lv2 Ricompilazione Demo : [ ] Commento : Acquisizione da contapezzi - pronto per i test git-svn-id: svn://10.65.10.50/trunk@18525 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- lv/lv2600.cpp | 313 +++++++++++++++++++++++++++++++++---------------- lv/lv2600a.h | 9 +- lv/lv2600a.uml | 93 ++++++++++----- 3 files changed, 284 insertions(+), 131 deletions(-) diff --git a/lv/lv2600.cpp b/lv/lv2600.cpp index 143ff09eb..8a87871b2 100755 --- a/lv/lv2600.cpp +++ b/lv/lv2600.cpp @@ -6,10 +6,11 @@ #include "lv2600a.h" -/////////////////////////////////////////////////////////// -// TAcquisizione_msk -/////////////////////////////////////////////////////////// + ///////////////////////////////// + //// TACQUISIZIONE_MSK //// + ///////////////////////////////// +//classe TAcquisizione_msk class TAcquisizione_msk: public TAutomask { protected: @@ -18,33 +19,23 @@ public: TAcquisizione_msk(); }; +//ON_FIELD_EVENT: metodo che gestisce gli eventi sui campi della maschera bool TAcquisizione_msk::on_field_event(TOperable_field& f,TField_event e,long jolly) { switch (f.dlg()) { - //giochetto per avere la lista dei files validi nella directory di trasferimento! - case F_NAME: - if (e == fe_button) - { - TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"), - HR("File@32")); - TFilename path = get(F_PATH); - path.add("*.dat"); //files delle testate - list_files(path, as.rows_array()); - TFilename name; - FOR_EACH_ARRAY_ROW(as.rows_array(), i, row) - { - name = *row; - *row = name.name(); - } - if (as.run() == K_ENTER) - { - f.set(as.row(as.selected())); - } - } - break; - default: - break; + case F_PATH: + //se il campo è vuoto, provo a scriverlo dalla configurazione + if (f.empty()) + { + TConfig* configlv = new TConfig(CONFIG_DITTA,"lv"); + TString path = configlv->get("PathContapezzi"); + if (path.full()) + f.set(path); + } + break; + default: + break; } return true; } @@ -53,14 +44,14 @@ TAcquisizione_msk::TAcquisizione_msk():TAutomask("lv2600a") { } -/////////////////////////////////////////////////////////// -// TAcquisizione_cache -/////////////////////////////////////////////////////////// + /////////////////////////////////// + //// TACQUISIZIONE_CACHE //// + /////////////////////////////////// +//classe TAcquisizione_cache class TAcquisizione_cache : TCache { - TString4 _codnum,_tipodoc,_stato; - + TString4 _codnum, _tipodoc, _stato; protected: virtual void discarding(const THash_object* obj); @@ -71,50 +62,51 @@ public: TAcquisizione_cache(); }; +//DISCARDING: metodo che salva un documento sul disco prima di eliminarlo dalla cache void TAcquisizione_cache::discarding(const THash_object* obj) { TDocumento& doc = (TDocumento&)obj->obj(); doc.rewrite(); } +//KEY2OBJ: metodo che sceglie il documento giusto da disco in modo da poterlo continuare, o lo crea se non c'è TObject* TAcquisizione_cache::key2obj(const char* key) { TToken_string chiave(key); - const TDate datadoc=chiave.get(); - const long codcf=chiave.get_long(); + const TDate datadoc = chiave.get(); + const long codcf = chiave.get_long(); TString query; query<< "USE DOC KEY 2 SELECT STATO=#STATO\n"; - for (int i=0;i<2; i++) + for (int i = 0; i < 2; i++) { - query << (i?"TO":"FROM") << " " - << "TIPOCF=C CODCF=#CODCF ANNO=#ANNO DATADOC=#DATADOC CODNUM=#CODNUM\n"; + query << (i ? "TO" : "FROM") << " " + << "TIPOCF=C CODCF=#CODCF ANNO=#ANNO DATADOC=#DATADOC CODNUM=#CODNUM\n"; } TISAM_recordset rset(query); - rset.set_var("#STATO",TVariant(_stato)); - rset.set_var("#CODCF",codcf); - rset.set_var("#ANNO",long(datadoc.year())); - rset.set_var("#DATADOC",datadoc); - rset.set_var("#CODNUM",TVariant(_codnum)); + rset.set_var("#STATO", TVariant(_stato)); + rset.set_var("#CODCF", codcf); + rset.set_var("#ANNO", long(datadoc.year())); + rset.set_var("#DATADOC", datadoc); + rset.set_var("#CODNUM", TVariant(_codnum)); - TDocumento* doc=NULL; + TDocumento* doc = NULL; - if (rset.move_first()) - { - doc=new TDocumento(rset.cursor()->curr()); - } + if (rset.move_first()) + doc = new TDocumento(rset.cursor()->curr()); else { - doc=new TDocumento('D',datadoc.year(),_codnum,0); - doc->put(DOC_TIPODOC,_tipodoc); - doc->put(DOC_STATO,_stato); - doc->put(DOC_DATADOC,datadoc); - doc->put(DOC_TIPOCF,"C"); - doc->put(DOC_CODCF,codcf); + doc = new TDocumento('D',datadoc.year(),_codnum,0); + doc->put(DOC_TIPODOC, _tipodoc); + doc->put(DOC_STATO, _stato); + doc->put(DOC_DATADOC, datadoc); + doc->put(DOC_TIPOCF, "C"); + doc->put(DOC_CODCF, codcf); } return doc; } +//DOC: metodo che restituisce un puntatore ad un documento identificato dalla coppia data - cliente TDocumento& TAcquisizione_cache::doc(const TDate& gg, const long cc) { TString16 key; @@ -122,66 +114,187 @@ TDocumento& TAcquisizione_cache::doc(const TDate& gg, const long cc) return *(TDocumento*)objptr(key); } +//metodo costruttore di una cache di 17 elementi TAcquisizione_cache::TAcquisizione_cache() : TCache(17) { - TConfig cfg(CONFIG_DITTA,"lv"); - _codnum=cfg.get("NUM_RIT",NULL,0); - _tipodoc=cfg.get("TIPOOC_RIT",NULL,0); - _stato=cfg.get("STATO_RIT",NULL,0); + TConfig cfg(CONFIG_DITTA, "lv"); + _codnum = cfg.get("NUM_RIT", NULL, 0); + _tipodoc = cfg.get("TIPOOC_RIT", NULL, 0); + _stato = cfg.get("STATO_RIT", NULL, 0); } -/////////////////////////////////////////////////////////// -// TAcquisizione_lavanderie_app -/////////////////////////////////////////////////////////// + //////////////////////////////////////////// + //// TACQUISIZIONE_LAVANDERIE_APP //// + //////////////////////////////////////////// +//classe TAcquisizione_lavanderie_app class TAcquisizione_lavanderie_app : public TSkeleton_application { + TAcquisizione_msk* _msk; + protected: - virtual void main_loop(); + virtual bool create(); + virtual bool destroy(); + + void elabora_file(const TString& file, bool new_file); + + +public: + bool transfer(); + virtual void main_loop(); }; +//CREATE: metodo costruttore +bool TAcquisizione_lavanderie_app::create() +{ + _msk = new TAcquisizione_msk(); + TSheet_field& sheet = _msk->sfield(F_SHEET_NAME); + sheet.set_auto_append(); + + return TSkeleton_application::create(); +} + +//DESTROY: metodo distruttore +bool TAcquisizione_lavanderie_app::destroy() +{ + delete _msk; + return TApplication::destroy(); +} + +//ELABORA_FILE: metodo che effettivamente fa l'elaborazione del file, creando i documenti +void TAcquisizione_lavanderie_app::elabora_file(const TString& file, bool new_file) +{ + TAcquisizione_cache ca; + + //scandisco il file + TScanner s(file); + while (s.ok()) + { + TString80 riga = s.line(); + if (riga.blank()) + continue; + + TDate datadoc; + long codcf; + TString80 codart; + long qta; + long rotti; + long ndoc; + TString16 tipo_conteggio; + TString80 operatore; + + //controllo quale tracciato record devo seguire + if (riga.len() == 34) // -> MONTANARI + { + //leggo i campi dalla riga del file + datadoc.set_day(atoi(riga.mid(0,2))); + datadoc.set_month(atoi(riga.mid(2,2))); + datadoc.set_year(atoi(riga.mid(4,4))); + + codcf = atol(riga.mid(8,6)); + codart = riga.mid(14,8); + qta = atol(riga.mid(22,6)); + rotti = atol(riga.mid(28,6)); + } + else if (riga.len() == 121) // ->SKEMA + { + //leggo i campi dalla riga del file + TDate datadoc; + datadoc.set_year(atoi(riga.mid(0,4))); + datadoc.set_month(atoi(riga.mid(4,2))); + datadoc.set_day(atoi(riga.mid(6,2))); + + codart = riga.mid(8,20); + codcf = atol(riga.mid(28,20)); + qta = atoi(riga.mid(48,11)); + ndoc = atoi(riga.mid(59,11)); + + switch (atoi(riga.mid(70,11))) + { + case 1: tipo_conteggio = "Automatico"; break; + case 2: tipo_conteggio = "Manuale"; break; + case 3: tipo_conteggio = "Scarto"; break; + default: break; + } + + operatore = riga.mid(81,40); + } + + bool found = false; + + TDocumento& doc = ca.doc(datadoc,codcf); + //cerco se esiste già una riga sul documento selezionato per quell'articolo; + //se la trovo sommo la quantità appena letta a quella già esistente, + //altrimenti creo una nuova riga documento + if (doc.rows() > 0 && new_file) + { + if (!yesno_box(TR("ATTENZIONE: il documento che si sta importando esiste già!\nSi desidera continuare?"))) + return; + else if (yesno_box(TR("ATTENZIONE: Si desidera sovrascrivere il documento esistente(rispondendo NO le quantità verranno sommate a quelle esistenti)?"))) + doc.destroy_rows(); + } + + for (int i = 1; i <= doc.rows(); i++) + { + TRiga_documento& rdoc = doc[i]; + if (rdoc.get(RDOC_CODART) == codart) + { + long qtardoc = rdoc.get_long(RDOC_QTA); + qtardoc += qta; + rdoc.put(RDOC_QTA,qtardoc); + found = true; + break; + } + } + + if (found == false) + { + TRiga_documento& rdoc = doc.new_row("01"); + rdoc.put(RDOC_CODART,codart); + rdoc.put(RDOC_QTA,qta); + } + new_file = false; + } +} + +//TRANSFER: metodo che scorre i campi nome e, se sono pieni, richiama il metodo +//ELABORA_FILE(), che effettivamente fa l'elaborazione +bool TAcquisizione_lavanderie_app::transfer() +{ + //prendo il path dalla maschera + const TString& path = _msk->get(F_PATH); + TSheet_field& sheet = _msk->sfield(F_SHEET_NAME); + TFilename file; + + //per ogni riga dello sheet, leggo il suo contenuto, se contiene dei caratteri jolly + //preparo la lista dei file che soddisfano la maschera in quella directory e li elaboro + //tutti, altrimenti elaboro esattamente il file che è scritto sullo sheet + FOR_EACH_SHEET_ROW(sheet, r1, row1) + { + if(row1->full()) + { + file = path; + file.add(*row1); + + if (file.find('*') >= 0 || file.find('?') >= 0) + { + TString_array lista_file; + list_files(file, lista_file); + + FOR_EACH_ARRAY_ROW(lista_file, r2, row2) + elabora_file(*row2, true); + } + else + elabora_file(file, true); + } + } + return true; +} + void TAcquisizione_lavanderie_app::main_loop() { - TAcquisizione_msk msk; - while (msk.run()!=K_QUIT) - { - TFilename name; - name=msk.get(F_PATH); - name.add(msk.get(F_NAME)); - TAcquisizione_cache ca; - TCSV_recordset csvbolle(name); - for(bool ok=csvbolle.move_first(); ok; ok=csvbolle.move_next()) - { - const long cli = csvbolle.get(0).as_int(); - const TDate dtdoc = csvbolle.get(1).as_date(); - const TString80 codart = csvbolle.get(2).as_string(); - const long qta = csvbolle.get(3).as_int(); - const TString4 um= csvbolle.get(4).as_string(); - bool found=false; - - TDocumento& doc = ca.doc(dtdoc,cli); - for (int i=1; doc.rows(); i++) - { - TRiga_documento& rdoc = doc[i]; - if (rdoc.get(RDOC_CODART)==codart) - { - long qtardoc = rdoc.get_long(RDOC_QTA); - qtardoc+=qta; - rdoc.put(RDOC_QTA,qtardoc); - found=true; - break; - } - } - - if (found==false) - { - TRiga_documento& rdoc = doc.new_row("01"); - rdoc.put(RDOC_CODART,codart); - rdoc.put(RDOC_QTA,qta); - } - - } - } + while (_msk->run() == K_ENTER) + transfer(); } int lv2600(int argc, char *argv[]) diff --git a/lv/lv2600a.h b/lv/lv2600a.h index ef74897b4..5bb0d6dca 100755 --- a/lv/lv2600a.h +++ b/lv/lv2600a.h @@ -1,2 +1,7 @@ -#define F_PATH 101 -#define F_NAME 102 +//Acquisizione da contapezzi +//Campi Maschera lv2600a +#define F_PATH 201 +#define F_SHEET_NAME 202 + +//campo dello sheet +#define F_S_NAME 101 \ No newline at end of file diff --git a/lv/lv2600a.uml b/lv/lv2600a.uml index 3c67461b2..a1c94031c 100755 --- a/lv/lv2600a.uml +++ b/lv/lv2600a.uml @@ -1,37 +1,72 @@ #include "lv2600a.h" -PAGE "Aquisizione" -1 -1 40 5 +TOOLBAR "Topbar" 0 0 0 2 -GROUPBOX DLG_NULL 76 4 -BEGIN - PROMPT 2 4 "@bSorgente" -END - -STRING F_PATH 256 39 -BEGIN - PROMPT 3 5 "Cartella " - DSELECT - CHECKTYPE REQUIRED -END - -STRING F_NAME 18 -BEGIN - PROMPT 3 6 "File " - CHECKTYPE REQUIRED -END - -STRING DLG_PROFILE 50 -BEGIN - PROMPT 1 -1 "Profilo " - SHEET PSELECT - FLAGS "H" -END - -ENDPAGE - -TOOLBAR "" 0 0 0 2 #include ENDPAGE +PAGE "Aquisizione da Contapezzi" -1 -1 80 10 + +STRING DLG_PROFILE 50 +BEGIN + PROMPT 1 -1 "Profilo " + PSELECT + FLAGS "H" +END + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 1 "@bSorgente" +END + +STRING F_PATH 255 50 +BEGIN + PROMPT 10 2 "Cartella " + DSELECT + CHECKTYPE REQUIRED +END + +SPREADSHEET F_SHEET_NAME 78 10 +BEGIN + PROMPT 1 5 "Nomi file" + ITEM "Nome file" +END + +ENDPAGE ENDMASK + +PAGE "Nomi file" -1 -1 80 3 + +GROUPBOX DLG_NULL 78 3 +BEGIN + PROMPT 1 1 "@bNome file" +END + +STRING F_S_NAME 68 +BEGIN + PROMPT 3 2 "File " +END +ENDPAGE + +TOOLBAR "" 0 0 0 2 + +BUTTON DLG_OK 2 2 +BEGIN + PROMPT 1 1 "" +END + +BUTTON DLG_DELREC 2 2 +BEGIN + PROMPT 2 1 "Elimina" + MESSAGE EXIT,K_DEL + PICTURE BMP_DELREC +END + +BUTTON DLG_CANCEL 2 2 +BEGIN + PROMPT 4 1 "" +END + +ENDPAGE +ENDMASK \ No newline at end of file