From cdc3f0958d24965790fc2b5e9f89ab553bf0c83f Mon Sep 17 00:00:00 2001 From: guy Date: Thu, 19 Jul 2012 12:28:28 +0000 Subject: [PATCH] corretta generazione storico da magazzino git-svn-id: svn://10.65.10.50/branches/R_10_00@22711 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ha/ha3800.cpp | 588 ++++++++++++++++++++++++-------------------------- 1 file changed, 285 insertions(+), 303 deletions(-) diff --git a/ha/ha3800.cpp b/ha/ha3800.cpp index 1fa6220b5..1af9df6d8 100755 --- a/ha/ha3800.cpp +++ b/ha/ha3800.cpp @@ -66,300 +66,257 @@ TInserimento_storico_mask::TInserimento_storico_mask() : TAutomask("ha3800a") ////////////////////////////////////////////// // Applicazione ////////////////////////////////////////////// + class TInserimento_storico : public TSkeleton_application { + // bool ultimo_cliente_aperto(TRecordset& history, long& clifo, long& indsped) const; + protected: - void elabora_aperture(const TMask& mask, TLog_report& log); - void elabora_chiusure(const TMask& mask, TLog_report& log); + void elabora_chiusura(const TRecordset& mov_recset, TLog_report& log) const; + void elabora_apertura(const TRecordset& mov_recset, TLog_report& log) const; void elabora(const TMask& mask); public: - void main_loop(); + virtual void main_loop(); }; -void TInserimento_storico::elabora_aperture(const TMask& mask, TLog_report& log) +void TInserimento_storico::elabora_apertura(const TRecordset& mov_recset, TLog_report& log) const { - //1) legge la configurazione per avere i parametri di query - TConfig config(CONFIG_DITTA, "ha"); - const TString4 tipo2elab = config.get("Doc2ElabTip"); - const TString4 stato2elab = config.get("Doc2ElabSta"); - const TString8 caus_open = config.get("CausOpen"); - // const TString8 caus_close = config.get("CausClose"); Ignorata dal 19-06-2012 - - //..e anche la maschera - const long anno = mask.get_long(F_ANNO); - const TDate da_data = mask.get_date(F_DADATA); - const TDate a_data = mask.get_date(F_ADATA); + const TString8 causape = mov_recset.get(MOVMAG_CODCAUS).as_string(); - //2) raccatta le numerazioni valide in base al tipo di documento in configurazione - TString_array num_doc; - const int num_del_tipo = numerazioni_documenti(num_doc, tipo2elab); + //comunque deve scrivere il cliente e la data perchè è un'apertura quindi la macchina è assegnata.. + //..al cliente con questo documento + const long doc_ndoc = mov_recset.get(MOVMAG_NUMREG).as_int(); + const TDate doc_datadoc = mov_recset.get(MOVMAG_DATAREG).as_date(); + const long doc_anno = doc_datadoc.year(); + const long doc_clifo = mov_recset.get(MOVMAG_CODCF).as_int(); + const long indsped = mov_recset.get(MOVMAG_CODINDSP).as_int(); -#ifdef DBG - ofstream numerazioni("c:/temp/numerazioni.txt", ios::app); -#endif + TToken_string key; key << mov_recset.get(MOVMAG_NUMREG); + TRecord_array rmovmag(key, LF_RMOVMAG); - - //3) giro su ogni numerazione per trovare le righe che servono - for (int n = 0; n < num_del_tipo; n++) + for (int r = 1; r > 0 && r <= rmovmag.last_row(); r++) { - const TString4 codnum = num_doc.row(n); -#ifdef DBG - if (codnum == "B009") - int cazzone = 1; -#endif + const TRectype& row = rmovmag.row(r); - TString query; - query << "USE RDOC KEY 2"; - query << "\nSELECT (DOC.STATO=#STATO)&&(BETWEEN(DOC.DATADOC,#DADATA,#ADATA))"; - query << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC"; - query << "\nFROM CODNUM=#CODNUM ANNO=#ANNO PROVV=D"; - query << "\nTO CODNUM=#CODNUM ANNO=#ANNO PROVV=D"; + //controllo della causale + const TString8 caus = row.get(RMOVMAG_CODCAUS); + //se la causale non è sulla riga controlla quella di testata + if (caus.full() && caus != causape) + continue; - TISAM_recordset rdoc_recset(query); - rdoc_recset.set_var("#STATO", stato2elab); - rdoc_recset.set_var("#DADATA", da_data); - rdoc_recset.set_var("#ADATA", a_data); - rdoc_recset.set_var("#CODNUM", codnum); - rdoc_recset.set_var("#ANNO", anno); + //3_A) tabella &ATT + //poichè documento apertura deve controllare se per caso la macchina è nuova + //dati del record corrente (vale anche per le chiusure in quanto esistono macchine.. + //..di antica data senza registrazioni!) + const TString80 codart = row.get(RMOVMAG_CODART); + const TString16 matricola = row.get(RMOVMAG_LIVGIAC); - const long rdoc_recset_items = rdoc_recset.items(); - - //date tutte le righedoc che soddisfano la query, deve tener conto solo di quelle.. - //..non ancora registrate in precedenza e che, soprattutto, abbiano una causale sensata - for (bool ok = rdoc_recset.move_first(); ok; ok = rdoc_recset.move_next()) + TModule_table tab_att("&ATT"); + tab_att.put("CODTAB", matricola); + const int err = tab_att.read(); + //se l'attrezzatura (intesa come codart+matricola) non esiste -> la deve aggiungere (sara' sicuramente la prima)... + //..per quanto riguarda il progressivo) + if (err != NOERR) { - //controllo della causale - TString8 caus = rdoc_recset.get(RDOC_CAUSMAG).as_string(); - //se la causale non è sulla riga controlla quella di testata - if (caus.empty()) - caus = rdoc_recset.get("33."DOC_CAUSMAG).as_string(); + TString msg; + msg << "Articolo " << codart << " senza matricola sul movimento " + << mov_recset.get(MOVMAG_NUMREG) << " del " << mov_recset.get(MOVMAG_DATAREG); + log.log(1, msg); + continue; + } - //solo le righdoc con causale sensata proseguono - if (caus == caus_open /*|| caus == caus_close*/) + //se la macchina viene assegnata ad un cliente (movimento di apertura) -> va messo il clifo.. + tab_att.put("I0", doc_clifo); + tab_att.put("I1", indsped); + tab_att.put("D0", doc_datadoc); + tab_att.write_rewrite(); + + //3_B) tabella &HIS + //controllo sul ndoc se per caso questa riga l'ha già importata, senno' deve aggiungere un record + //query sulla storia di questa macchina + TString query_his; + query_his << "USE &HIS"; + query_his << "\nFROM CODTAB=#CODTAB"; + query_his << "\nTO CODTAB=#CODTAB"; + TISAM_recordset recset_his(query_his); + recset_his.set_var("#CODTAB", matricola); + + const long recset_his_items = recset_his.items(); + + TModule_table tab_his("&HIS"); + int n_line_to_update = 0; + + //cerca se la riga esiste già nello storico e va solo aggiornata + for (bool ok = recset_his.move_last(); ok; ok = recset_his.move_prev()) + { + const long curr_anno = recset_his.get("S4[1,4]").as_int(); + if (curr_anno == doc_anno) { - //bool di scrimage - const bool bopen = caus == caus_open; - - //3_A) tabella &ATT - //poichè documento apertura deve controllare se per caso la macchina è nuova - //dati del record corrente (vale anche per le chiusure in quanto esistono macchine.. - //..di antica data senza registrazioni!) - const long doc_anno = rdoc_recset.get(RDOC_ANNO).as_int(); - const TString4 doc_codnum = rdoc_recset.get(RDOC_CODNUM).as_string(); - const long doc_ndoc = rdoc_recset.get(RDOC_NDOC).as_int(); - const TString& codart = rdoc_recset.get(RDOC_CODART).as_string(); - const TString& matricola = rdoc_recset.get(RDOC_LIVELLO).as_string(); - TModule_table tab_att("&ATT"); - tab_att.put("CODTAB", matricola); - const int err = tab_att.read(); - //se l'attrezzatura (intesa come codart+matricola) non esiste -> la deve aggiungere (sara' sicuramente la prima)... - //..per quanto riguarda il progressivo) - if (err != NOERR) + long curr_ndoc = recset_his.get("S4[9,15]").as_int(); + if (curr_ndoc == doc_ndoc) { - TString msg; - msg << "Articolo " << codart << " senza matricola sul documento " << doc_codnum << " " << doc_anno << "/" << doc_ndoc; - log.log(1, msg); - continue; + n_line_to_update = recset_his.get("CODTAB[9,13]").as_int(); + break; } - //comunque deve scrivere il cliente e la data perchè è un'apertura quindi la macchina è assegnata.. - //..al cliente con questo documento - const long doc_clifo = rdoc_recset.get("33.CODCF").as_int(); - const TDate doc_datadoc = rdoc_recset.get("33.DATADOC").as_date(); - const int indsped = rdoc_recset.get("33.CODINDSP").as_int(); + } + } //for (bool ok = recset_his.move... - //se la macchina viene assegnata ad un cliente (movimento di apertura) -> va messo il clifo.. - if (bopen) - tab_att.put("I0", doc_clifo); - else //..senno' torna alla casa madre e sparisce il clifo - tab_att.put("I0", 0L); + TString80 new_codtab; + //se la riga non c'era -> va aggiunta + if (n_line_to_update <= 0) + { + n_line_to_update = recset_his_items + 1; - tab_att.put("D0", doc_datadoc); - tab_att.put("I1", indsped); + //adesso ha il numero di riga da aggiornare e crea il nuovo record + new_codtab.format("%08s%05d", (const char*)matricola, n_line_to_update); + tab_his.put("CODTAB", new_codtab); + tab_his.write(); + new_codtab.cut(0); + } - tab_att.write_rewrite(); - - //3_B) tabella &HIS - //controllo sul ndoc se per caso questa riga l'ha già importata, senno' deve aggiungere un record - //query sulla storia di questa macchina - TString query_his; - query_his << "USE &HIS"; - query_his << "\nFROM CODTAB=#CODTAB"; - query_his << "\nTO CODTAB=#CODTAB"; - TISAM_recordset recset_his(query_his); - recset_his.set_var("#CODTAB", matricola); - - const long recset_his_items = recset_his.items(); - - TModule_table tab_his("&HIS"); - int n_line_to_update = 0; - - //cerca se la riga esiste già nello storico e va solo aggiornata - for (bool ok = recset_his.move_last(); ok; ok = recset_his.move_prev()) - { - long curr_anno; - if (bopen) - curr_anno = recset_his.get("S4[1,4]").as_int(); - else - curr_anno = recset_his.get("S5[1,4]").as_int(); - if (curr_anno == doc_anno) - { - TString4 curr_codnum; - if (bopen) - curr_codnum = recset_his.get("S4[5,8]").as_string(); - else - curr_codnum = recset_his.get("S5[5,8]").as_string(); - if (curr_codnum == doc_codnum) - { - long curr_ndoc; - if (bopen) - curr_ndoc = recset_his.get("S4[9,15]").as_int(); - else - curr_ndoc = recset_his.get("S5[9,15]").as_int(); - if (curr_ndoc == doc_ndoc) - { - n_line_to_update = recset_his.get("CODTAB[9,13]").as_int(); - break; - } - } - } - } //for (bool ok = recset_his.move... - - TString80 new_codtab; - //se la riga non c'era -> va aggiunta - if (n_line_to_update == 0) - { - n_line_to_update = recset_his_items + 1; - - //adesso ha il numero di riga da aggiornare e crea il nuovo record - new_codtab.format("%08s%05d", (const char*)matricola, n_line_to_update); - tab_his.put("CODTAB", new_codtab); - tab_his.write(); - new_codtab.cut(0); - } - - //rimette il codtab per riposizionarsi sul record corretto - new_codtab.format("%08s%05d", (const char*)matricola, n_line_to_update); - tab_his.put("CODTAB", new_codtab); + //rimette il codtab per riposizionarsi sul record corretto + new_codtab.format("%08s%05d", (const char*)matricola, n_line_to_update); + tab_his.put("CODTAB", new_codtab); - //ed aggiunge tutti i campi - const TString& descr = rdoc_recset.get(RDOC_DESCR).as_string(); - tab_his.put("S0", descr); - //tab_his.put("S3", articolo_collegato); + //ed aggiunge tutti i campi + const TString& descr = mov_recset.get(MOVMAG_DESCR).as_string(); + tab_his.put("S0", descr); + //tab_his.put("S3", articolo_collegato); - TString16 str_key_doc; - str_key_doc.format("%4d%4s%7d", doc_anno, (const char*)doc_codnum, doc_ndoc); - if (bopen) - tab_his.put("S4", str_key_doc); - else - tab_his.put("S5", str_key_doc); - tab_his.put("S6", rdoc_recset.get(RDOC_UMQTA).as_string()); - const TString& codmag = rdoc_recset.get(RDOC_CODMAG).as_string(); - TString4 s7; //s7[1,1]=tipo s7[2,4]=codmag - s7 << "C" << codmag; - tab_his.put("S7", s7); - tab_his.put("I0", doc_clifo); - tab_his.put("I1", indsped); - tab_his.put("D0", doc_datadoc); - const real qta = rdoc_recset.get(RDOC_QTA).as_real(); - tab_his.put("R0", qta); - const real prezzo = rdoc_recset.get(RDOC_PREZZO).as_real(); - const real importo = qta * prezzo; - tab_his.put("R1", importo); - tab_his.put("B0", !bopen); //se è il documento di chiusura va segnalato + TString16 str_key_doc; + str_key_doc.format("%4d%4s%7d", doc_anno, (const char*)causape, doc_ndoc); + tab_his.put("S4", str_key_doc); + tab_his.put("S6", row.get(RMOVMAG_UM)); + const TString& codmag = row.get(RMOVMAG_CODMAG); + TString4 s7; //s7[1,1]=tipo s7[2,4]=codmag + s7 << "C" << codmag; + tab_his.put("S7", s7); + tab_his.put("I0", doc_clifo); + tab_his.put("I1", indsped); + tab_his.put("D0", doc_datadoc); + const real qta = row.get(RMOVMAG_QUANT); + tab_his.put("R0", qta); + const real prezzo = row.get(RMOVMAG_PREZZO); + const real importo = qta * prezzo; + tab_his.put("R1", importo); + tab_his.put("B0", false); - const int written = tab_his.write_rewrite(); - //segna sul log la riga aggiunta alla tabella storico &HIS - if (written == NOERR) - { - TString msg; - msg.format("%4d-%4s/%7d--%s--%s--%6d", - doc_anno, (const char*)doc_codnum, doc_ndoc, - (const char*)codart, (const char*)matricola, doc_clifo); - log.log(0, msg); - } - } //if (caus==caus_open || .. - - } //for (bool ok = rdoc_recset.move_first()... - - } //for (int n = 0; n < num_del_tipo... + const int written = tab_his.write_rewrite(); + //segna sul log la riga aggiunta alla tabella storico &HIS + if (written == NOERR) + { + TString msg; + msg.format("%4d-%4s/%7d--%s--%s--%6d", + doc_anno, (const char*)causape, doc_ndoc, + (const char*)codart, (const char*)matricola, doc_clifo); + log.log(0, msg); + } + } } -void TInserimento_storico::elabora_chiusure(const TMask& mask, TLog_report& log) +/* Obsoleto +bool TInserimento_storico::ultimo_cliente_aperto(TRecordset& recset, long& clifo, long& indsped) const { - TConfig config(CONFIG_DITTA, "ha"); - const TString8 caus_close = config.get("CausClose"); - - //..e anche la maschera - const long anno = mask.get_long(F_ANNO); - const TDate da_data = mask.get_date(F_DADATA); - const TDate a_data = mask.get_date(F_ADATA); - TString query; - query << "USE MOVMAG KEY 3 SELECT CODCAUS=#CODCAUS"; - query << "\nFROM DATAREG=#DADATA"; - query << "\nTO DATAREG=#ADATA"; + clifo = indsped = 0; - TISAM_recordset mov_recset(query); - mov_recset.set_var("#CODCAUS", caus_close); - mov_recset.set_var("#DADATA", da_data); - mov_recset.set_var("#ADATA", a_data); - - for (bool ok = mov_recset.move_first(); ok; ok = mov_recset.move_next()) + TString_array aperture; + TString_array chiusure; + TString80 tok; + long cli, ind, dat; + for (bool ok = recset.move_first(); ok; ok = recset.move_next()) { - const TDate mov_datareg = mov_recset.get(MOVMAG_DATAREG).as_date(); - const long mov_nreg = mov_recset.get(MOVMAG_NUMREG).as_int(); + const bool chiusura = recset.get("B0").as_bool(); + cli = recset.get("I0").as_int(); + ind = recset.get("I1").as_int(); + dat = recset.get("D0").as_date().date2ansi(); + tok.format("%ld|%ld|%ld", cli, ind, dat); + if (chiusura) + chiusure.add(tok); + else + aperture.add(tok); + } - TToken_string key; key << mov_recset.get(MOVMAG_NUMREG); - TRecord_array rmovmag(key, LF_RMOVMAG); - for (int r = 1; r > 0 && r <= rmovmag.last_row(); r++) + FOR_EACH_ARRAY_ROW(aperture, a, ape) + { + ape->get(0, cli); + ape->get(1, ind); + ape->get(2, dat); + bool found = false; + FOR_EACH_ARRAY_ROW(chiusure, c, chi) { - const TRectype& row = rmovmag.row(r); - //controllo della causale - const TString& caus = row.get(RMOVMAG_CODCAUS); - if (caus.full() && caus != caus_close) - continue; + long c, i, d; + chi->get(0, c); + chi->get(1, i); + chi->get(2, d); + if (cli == c && ind == i && d >= dat) + { + found = true; + break; + } + } + if (!found) + { + clifo = cli; + indsped = ind; + break; + } + } + + return clifo > 0; +} +*/ + +void TInserimento_storico::elabora_chiusura(const TRecordset& mov_recset, TLog_report& log) const +{ + const TDate mov_datareg = mov_recset.get(MOVMAG_DATAREG).as_date(); + const int anno = mov_datareg.year(); + const long mov_nreg = mov_recset.get(MOVMAG_NUMREG).as_int(); + const TString8 caus_close = mov_recset.get(MOVMAG_CODCAUS).as_string(); + + TToken_string key; key << mov_recset.get(MOVMAG_NUMREG); + TRecord_array rmovmag(key, LF_RMOVMAG); + for (int r = 1; r > 0 && r <= rmovmag.last_row(); r++) + { + const TRectype& row = rmovmag.row(r); + //controllo della causale di riga se diversa dalla testata + const TString& caus = row.get(RMOVMAG_CODCAUS); + if (caus.full() && caus != caus_close) + continue; - const TString80 codart = row.get(RMOVMAG_CODART); - const TString16 matricola = row.get(RMOVMAG_LIVGIAC); + const TString80 codart = row.get(RMOVMAG_CODART); + const TString16 matricola = row.get(RMOVMAG_LIVGIAC); - TModule_table tab_att("&ATT"); - tab_att.put("CODTAB", matricola); - const int err = tab_att.read(); - if (err != NOERR) - { - TString msg; - msg << "Articolo " << codart << " senza matricola sul movimento " << mov_recset.get(MOVMAG_NUMREG) << " del " << mov_recset.get(MOVMAG_DATAREG); - log.log(1, msg); - continue; - } + TModule_table tab_att("&ATT"); + tab_att.put("CODTAB", matricola); + const int err = tab_att.read(); + if (err != NOERR) + { + TString msg; + msg << "Articolo " << codart << " senza matricola sul movimento " + << mov_nreg << " del " << mov_datareg; + log.log(1, msg); + continue; + } - const long clifo = tab_att.get_long("I0"); - const int indsped = tab_att.get_int("I1"); - if (clifo <= 0) - { - TString msg; - msg << "Matricola " << matricola << " senza cliente: probabilmente l'articolo " << codart << " è già rientrato"; - log.log(1, msg); - continue; - } + long clifo = 0, indsped = 0; + if (tab_att.get_date("D0") <= mov_datareg) + { + clifo = tab_att.get_long("I0"); + indsped = tab_att.get_int("I1"); + } - tab_att.put("I0", ""); // Azzera cliente - tab_att.put("I1", ""); // Azzera indsped - tab_att.put("D0", mov_datareg); - tab_att.write_rewrite(); - - TString query_his; - query_his << "USE &HIS"; - query_his << "\nFROM CODTAB=#CODTAB"; - query_his << "\nTO CODTAB=#CODTAB"; - TISAM_recordset recset_his(query_his); - recset_his.set_var("#CODTAB", matricola); - - const long recset_his_items = recset_his.items(); - - TModule_table tab_his("&HIS"); - int n_line_to_update = 0; + TString query_his; + query_his << "USE &HIS SELECT S7[1,1]='C'"; + query_his << "\nFROM CODTAB=#CODTAB"; + query_his << "\nTO CODTAB=#CODTAB"; + TISAM_recordset recset_his(query_his); + recset_his.set_var("#CODTAB", matricola); + int n_line_to_update = 0; + const long recset_his_items = recset_his.items(); + if (recset_his_items > 0) + { //cerca se la riga esiste già nello storico e va solo aggiornata for (bool ok = recset_his.move_last(); ok; ok = recset_his.move_prev()) { @@ -368,73 +325,98 @@ void TInserimento_storico::elabora_chiusure(const TMask& mask, TLog_report& log) if (curr_anno == anno && curr_nreg == mov_nreg) { n_line_to_update = recset_his.get("CODTAB[9,13]").as_int(); + clifo = recset_his.get("I0").as_int(); + indsped = recset_his.get("I1").as_int(); break; } } //for (bool ok = recset_his.move... - - TString80 new_codtab; //se la riga non c'era -> va aggiunta - if (n_line_to_update == 0) - { - n_line_to_update = recset_his_items + 1; + } + if (n_line_to_update <= 0) + n_line_to_update = recset_his_items + 1; - //adesso ha il numero di riga da aggiornare e crea il nuovo record - new_codtab.format("%08s%05d", (const char*)matricola, n_line_to_update); - tab_his.put("CODTAB", new_codtab); - tab_his.write(); - } - - //rimette il codtab per riposizionarsi sul record corretto - new_codtab.format("%08s%05d", (const char*)matricola, n_line_to_update); - tab_his.put("CODTAB", new_codtab); - - //ed aggiunge tutti i campi - const TString& descr = mov_recset.get(MOVMAG_DESCR).as_string(); - tab_his.put("S0", descr); + TModule_table tab_his("&HIS"); - TString16 str_key_doc; - str_key_doc.format("%4d%4s%7d", anno, "", mov_nreg); - tab_his.put("S5", str_key_doc); - tab_his.put("S6", row.get(RMOVMAG_UM)); - const TString& codmag = row.get(RMOVMAG_CODMAG); - TString4 s7; //s7[1,1]=tipo s7[2,4]=codmag - s7 << "C" << codmag; - tab_his.put("S7", s7); - tab_his.put("I0", clifo); - tab_his.put("I1", indsped); - tab_his.put("D0", mov_datareg); - const real qta = row.get(RMOVMAG_QUANT); - tab_his.put("R0", qta); - const real prezzo = row.get(RMOVMAG_PREZZO); - const real importo = qta * prezzo; - tab_his.put("R1", importo); - tab_his.put("B0", true); // Chiusura + TString16 new_codtab; + new_codtab.format("%08s%05d", (const char*)matricola, n_line_to_update); + tab_his.put("CODTAB", new_codtab); + + //ed aggiunge tutti i campi + const TString& descr = mov_recset.get(MOVMAG_DESCR).as_string(); + tab_his.put("S0", descr); + + TString16 str_key_doc; + str_key_doc.format("%4d%4s%7d", anno, (const char*)caus_close, mov_nreg); + tab_his.put("S5", str_key_doc); + tab_his.put("S6", row.get(RMOVMAG_UM)); + const TString& codmag = row.get(RMOVMAG_CODMAG); + TString4 s7; //s7[1,1]=tipo s7[2,4]=codmag + s7 << "C" << codmag; + tab_his.put("S7", s7); + tab_his.put("I0", clifo); + tab_his.put("I1", indsped); + tab_his.put("D0", mov_datareg); + const real qta = row.get(RMOVMAG_QUANT); + tab_his.put("R0", qta); + const real prezzo = row.get(RMOVMAG_PREZZO); + const real importo = qta * prezzo; + tab_his.put("R1", importo); + tab_his.put("B0", true); // Chiusura - const int written = tab_his.write_rewrite(); - //segna sul log la riga aggiunta alla tabella storico &HIS - if (written == NOERR) - { - TString msg; - msg.format("%4d-%4s/%7d--%s--%s--%6d", - anno, (const char*)caus_close, mov_nreg, - (const char*)codart, (const char*)matricola, clifo); - log.log(0, msg); - } + const int written = tab_his.write_rewrite(); + //segna sul log la riga aggiunta alla tabella storico &HIS + if (written == NOERR) + { + TString msg; + msg.format("%4d-%4s/%7d--%s--%s--%6d", + anno, (const char*)caus_close, mov_nreg, + (const char*)codart, (const char*)matricola, clifo); + log.log(0, msg); + } + + if (tab_att.get_long("I0") == clifo && tab_att.get_long("I1") == indsped && tab_att.get_date("D0") <= mov_datareg) + { + tab_att.put("I0", ""); // Azzera cliente + tab_att.put("I1", ""); // Azzera indsped + tab_att.put("D0", mov_datareg); + tab_att.write_rewrite(); } } } void TInserimento_storico::elabora(const TMask& mask) { - //vogliono pure il log! che rompicazzo + TConfig config(CONFIG_DITTA, "ha"); + const TString8 caus_open = config.get("CausOpen"); + const TString8 caus_close = config.get("CausClose"); + + // Vogliono pure il log! TLog_report log(TR("Righe storico aggiunte")); log.kill_duplicates(); log.log(0, ""); log.log(0, HR("Anno-Num.-Ndoc--Articolo --Matricola --Cliente")); log.log(0, ""); - elabora_aperture(mask, log); - elabora_chiusure(mask, log); + const long anno = mask.get_long(F_ANNO); + const TDate da_data = mask.get_date(F_DADATA); + const TDate a_data = mask.get_date(F_ADATA); + TString query; + query << "USE MOVMAG KEY 3" + << "\nFROM DATAREG=#DADATA" + << "\nTO DATAREG=#ADATA"; + + TISAM_recordset mov_recset(query); + mov_recset.set_var("#DADATA", da_data); + mov_recset.set_var("#ADATA", a_data); + + for (bool ok = mov_recset.move_first(); ok; ok = mov_recset.move_next()) + { + const TString& codcaus = mov_recset.get(MOVMAG_CODCAUS).as_string(); + if (codcaus == caus_open) + elabora_apertura(mov_recset, log); else + if (codcaus == caus_close) + elabora_chiusura(mov_recset, log); + } log.preview(); }