#include "hacnv100.h" #include "hacnv100a.h" #include "halib.h" #include #include #include #include #include #include #include #include #include #include "..\pr\agenti.h" const char* const APPNAME = TR("Importazione anagrafiche HARDY"); /////////////////////////////////////////////////////////// // THardy_log /////////////////////////////////////////////////////////// class THardy_log : public TLog_report { public: THardy_log() : TLog_report(APPNAME) {} }; /////////////////////////////////////////////////////////// // THardy_iterator /////////////////////////////////////////////////////////// bool THardy_iterator::cancelled() const { return _pi != NULL && _pi->iscancelled(); } bool THardy_iterator::ok() const { if (cancelled()) return _ht->log_cancelled(); return _rec >= 0 && _rec < _ht->recordset().items(); } THardy_iterator& THardy_iterator::operator=(TRecnotype n) { if (_pi != NULL) _pi->setstatus(n+1); _ht->recordset().move_to(_rec = n); return *this; } THardy_iterator& THardy_iterator::operator++() { return *this = ++_rec; } THardy_iterator::THardy_iterator(THardy_transfer* ht) : _ht(ht), _pi(NULL) { const TRecnotype tot = _ht->recordset().items(); TString title; title << _ht->title() << ": " << tot << ' ' << TR("righe"); if (tot > 1) _pi = new TProgind(tot, title, true, true); else ::begin_wait(); if (tot > 0) _ht->log(title); _rec = -1; } THardy_iterator::~THardy_iterator() { if (_pi != NULL) delete _pi; else ::end_wait(); } /////////////////////////////////////////////////////////// // Cache tabelle /////////////////////////////////////////////////////////// class TCache_tab : public TCache_th { protected: virtual TObject* key2obj(const char* key); public: virtual const TString& decode(const TToken_string& cod_codtab); TCache_tab(THardy_transfer* ht) : TCache_th(ht) {} }; const TString& TCache_tab::decode(const TToken_string& cod_codtab) { TString4 cod; cod_codtab.get(0, cod); if (cod.full()) { const TRectype& rec = *(const TRectype*)objptr(cod_codtab); if (!rec.empty()) { const char* field = "CODTAB"; if (cod == "%TPM" || cod == "%TPP" || cod == "%TPI") // Tipo trasporto e porto field = "S6"; return rec.get(field); } } return EMPTY_STRING; } TObject* TCache_tab::key2obj(const char* key) { TToken_string tok(key); TString4 tab = tok.get(); tab.upper(); TString80 cod = tok.get(); cod.upper(); if (tab == "%IVA") { // Campo non digerisce i codici IVA numerici di un solo carattere if (cod.len() < 2 && isdigit(cod[0])) cod.right_just(2, '0'); // per cui aggiungo uno 0 iniziale } TTable table(tab); table.put("CODTAB", cod); if (table.read() != NOERR) { table.zero(); table.put("CODTAB", cod); table.put("S0", cod); test_write(table); } return table.curr().dup(); } /////////////////////////////////////////////////////////// // THardy_transfer /////////////////////////////////////////////////////////// void THardy_transfer::init(const char* title, const char* qry_hdr, THardy_log& log) { _log = &log; _log->reset(); _log->set_title(title); _query_header = qry_hdr; _write_enabled = true; } const TString& THardy_transfer::title() const { return _log->title(); } void THardy_transfer::log(const char* msg, int sev) const { _log->log(sev, msg); } TRecordset& THardy_transfer::create_recordset(const char* query) { if (_recset != NULL) { delete _recset; _recset = NULL; } if (_outset != NULL) { _outset->exec("COMMIT TRANS"); delete _outset; _outset = NULL; } TString qry = query; if (!qry.starts_with("US") && !qry.starts_with("ODBC")) qry.insert(query_header()); _recset = ::create_recordset(qry); return *_recset; } const TRecordset& THardy_transfer::recordset() const { CHECK(_recset != NULL, "NULL recordset"); return *_recset; } TRecordset& THardy_transfer::recordset() { CHECK(_recset != NULL, "NULL recordset"); return *_recset; } long THardy_transfer::odbc_exec(const char* cmd) { long err = 0; if (_write_enabled) { if (_outset == NULL) { _outset = new TODBC_recordset(query_header()); err = _outset->exec("BEGIN TRANS"); } if (err >= 0) { err = _outset->exec(cmd); if (err < 0) { log("", 0); // Salto una riga TParagraph_string msg(cmd, 100); FOR_EACH_TOKEN(msg, str) log(str, 0); // Riporto tutta la query log_error(TR("ERRORE in esecuzione della query.")); } } else { TString msg; msg << TR("ERRORE di connessione a ") << _outset->dsn() << " : BEGIN TRANS"; log_error(msg); } } return err; } bool THardy_transfer::log_error(const char* msg) { log(msg, 2); if (_write_enabled) { _write_enabled = false; log(""); log(TR("LA SCRITTURA SUGLI ARCHIVI VIENE DISABILITATA DA QUESTO MOMENTO IN POI"), 2); log(""); } return false; } bool THardy_transfer::log_cancelled() { return log_error(TR("Procedura interrotta dall'utente")); } bool THardy_transfer::test_write(TBaseisamfile& file) { int err = NOERR; if (_write_enabled) { err = file.write_rewrite(); if (err != NOERR) { TString msg; TString80 code, desc; const int logic = file.num(); if (logic == LF_TAB || logic == LF_TABCOM || logic == LF_TABMOD) { code = file.get("CODTAB"); desc = file.get("S0"); } else { code = file.curr().build_key(1); desc = file.curr().build_key(2); } msg.format(FR("Errore %d durante la scrittura sul file %d: %s - %s"), err, logic, (const char*)code, (const char*)desc); log_error(msg); } } return err == NOERR; } const TString& THardy_transfer::get_str(const char* field) const { return recordset().get(field).as_string(); } const TString& THardy_transfer::get_real_str(const char* campo) const { const TVariant& var = recordset().get(campo); if (var.is_zero()) return EMPTY_STRING; return var.as_string(); } long THardy_transfer::get_long(const char* field) const { return recordset().get(field).as_int(); } const TString& THardy_transfer::decode_value(const char* tab, const TString& cod) { if (cod.full()) { if (_tab == NULL) _tab = new TCache_tab(this); TToken_string tok; tok.add(tab); tok.add(cod); return _tab->decode(tok); } return EMPTY_STRING; } const TString& THardy_transfer::decode_field(const char* tab, const char* field) { const TString& cod = get_str(field); return decode_value(tab, cod); } const TString& THardy_transfer::build_insert_query(const char* table, const char* f, const char* v) const { TString qry(255); qry << "INSERT INTO " << table; TAuto_token_string fields(f); TToken_string values(v); if (fields.items() > 0) { qry << " ("; FOR_EACH_TOKEN(fields, tok) qry << tok << ','; qry.rtrim(1); qry << ')'; } qry << " VALUES ("; TString tmp; FOR_EACH_TOKEN(values, tok) { tmp = tok; if (tmp.full() && !tmp.starts_with("0") && real::is_natural(tmp)) qry << tok; else { if (tmp[0] != '\'') { for (int i = tmp.len()-1; i >= 0; i--) { if (tmp[i] == '\'') tmp.insert("'", i); } qry << '\'' << tmp << '\''; } else qry << tmp; } qry << ','; } qry.rtrim(1); qry << ')'; return get_tmp_string() = qry; } THardy_transfer::THardy_transfer() : _log(NULL), _config("hacnv100a.ini"), _recset(NULL), _outset(NULL), _tab(NULL) {} THardy_transfer::~THardy_transfer() { if (_tab != NULL) delete _tab; if (_outset != NULL) { _outset->exec("COMMIT TRANS"); delete _outset; } if (_recset != NULL) delete _recset; } void THardy_transfer::aggiorna_record(TRectype& rec, const TString_array& lista_campi) { TString campo_dest, campo_orig, valore, str; FOR_EACH_ARRAY_ROW(lista_campi,i,row) { row->get(0, campo_dest); row->get(1, campo_orig); if (campo_orig.full()) { if (campo_orig[0] == '_') { if (campo_orig.starts_with("_FISSO")) // valore fisso indicato in configurazione { valore = campo_orig.after(','); valore.trim(); } else if (campo_orig.starts_with("_STREXPR")) // formato _STREXPR, espressione { TExpression expr(campo_orig.after(','), _strexpr); for (int v = 0; v < expr.numvar(); v++) { const char* varname = expr.varname(v); expr.setvar(v, get_str(varname)); } valore = expr.as_string(); valore.trim(); } else if (campo_orig.starts_with("_TAB")) // formato _TAB,,, { TToken_string elabora(campo_orig, ','); const TString4 tab = elabora.get(1); // tabella da leggere const TString16 codtab = get_str(elabora.get()); const TString16 campotab = elabora.get(); valore = cache().get(tab, codtab, campotab); } else if (campo_orig.starts_with("_TRADUCI")) { const TString80 campo = campo_orig.after(','); const TString80 contenuto = get_str(campo); TConfig& ini = config(); valore = ini.get(contenuto,campo); } else valore.cut(0); } else valore = get_str(campo_orig); rec.put(campo_dest, valore); } } } /////////////////////////////////////////////////////////// // THardy_pag /////////////////////////////////////////////////////////// bool THardy_pag::trasferisci() { TString query = "SELECT * " "FROM dbo.Pagamenti "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "CPG", true); TTable table("%CPG"); TRectype& rec = table.curr(); THardy_iterator hi(this); while (++hi) { rec.zero(); aggiorna_record(rec, lista_campi); test_write(table); } return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_iva /////////////////////////////////////////////////////////// bool THardy_iva::trasferisci() { TString query = "SELECT * " "FROM dbo.AliquoteIVA "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "IVA", true); TTable table("%IVA"); TRectype& rec = table.curr(); THardy_iterator hi(this); while (++hi) { rec.zero(); aggiorna_record(rec, lista_campi); test_write(table); } return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_catmerc /////////////////////////////////////////////////////////// bool THardy_catmerc::trasferisci() { TString query = "SELECT * " "FROM dbo.CategorieMerc "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "GMC", true); TTable table("GMC"); TRectype& rec = table.curr(); THardy_iterator hi(this); while (++hi) { rec.zero(); aggiorna_record(rec, lista_campi); test_write(table); } return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_catfisc /////////////////////////////////////////////////////////// bool THardy_catfisc::trasferisci() { TString query = "SELECT * " "FROM dbo.CategorieFisc "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "ASF", true); TTable table("%ASF"); TRectype& rec = table.curr(); THardy_iterator hi(this); while (++hi) { rec.zero(); aggiorna_record(rec, lista_campi); test_write(table); } return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_ban /////////////////////////////////////////////////////////// bool THardy_ban::trasferisci() { bool ok = trasferisci_abi(); if (ok) ok = trasferisci_cab(); return ok; } bool THardy_ban::trasferisci_abi() { TString query = "SELECT * " "FROM dbo.Banche "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "ABI", true); TSystemisamfile table(LF_TABCOM); table.open(_lock); TRectype& rec = table.curr(); THardy_iterator hi(this); while (++hi) { TString16 codtab = get_str("IdBanca"); codtab.lpad(5,'0'); rec.zero(); rec.put("COD", "BAN"); rec.put("CODTAB", codtab); aggiorna_record(rec, lista_campi); test_write(table); } table.close(); return write_enabled(); } bool THardy_ban::trasferisci_cab() { TString query = "SELECT * " "FROM dbo.Agenzie "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "CAB", true); TSystemisamfile table(LF_TABCOM); table.open(_lock); TRectype& rec = table.curr(); THardy_iterator hi(this); while (++hi) { TString16 codtab = get_str("IdBanca"); codtab.lpad(5,'0'); codtab << get_str("Cab"); rec.zero(); rec.put("COD", "BAN"); rec.put("CODTAB", codtab); aggiorna_record(rec, lista_campi); test_write(table); } table.close(); return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_caucont /////////////////////////////////////////////////////////// bool THardy_caucont::trasferisci() { TString query = "SELECT * " "FROM dbo.CausaliContab "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "CAUCONT", true); TSystemisamfile table(LF_CAUSALI); table.open(_lock); TRectype& rec = table.curr(); THardy_iterator hi(this); while (++hi) { rec.zero(); aggiorna_record(rec, lista_campi); test_write(table); } table.close(); return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_caumag /////////////////////////////////////////////////////////// bool THardy_caumag::trasferisci() { TString query = "SELECT * " "FROM dbo.CausaliMagaz "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "CAUMAG", true); TTable table("%CAU"); TRectype& rec = table.curr(); THardy_iterator hi(this); while (++hi) { rec.zero(); aggiorna_record(rec, lista_campi); test_write(table); } return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_um /////////////////////////////////////////////////////////// bool THardy_um::trasferisci() { TString query = "SELECT * " "FROM dbo.UnitaMisura "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "UM", true); TTable table("%UMS"); TRectype& rec = table.curr(); THardy_iterator hi(this); while (++hi) { rec.zero(); aggiorna_record(rec, lista_campi); test_write(table); } return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_art /////////////////////////////////////////////////////////// bool THardy_art::trasferisci() { TString query = "SELECT * " "FROM dbo.Articoli "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi_anamag, lista_campi_umart; ini.list_variables(lista_campi_anamag, true, "ANAMAG", true); ini.list_variables(lista_campi_umart, true, "UMART", true); TSystemisamfile anamag(LF_ANAMAG); anamag.open(_lock); TRectype& rec_anamag = anamag.curr(); TSystemisamfile umart(LF_UMART); umart.open(_lock); TRectype& rec_umart = umart.curr(); THardy_iterator hi(this); while (++hi) { aggiorna_record(rec_anamag, lista_campi_anamag); test_write(anamag); aggiorna_record(rec_umart, lista_campi_umart); test_write(umart); } anamag.close(); umart.close(); return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_conti /////////////////////////////////////////////////////////// bool THardy_pcon::trasferisci() { if (trasferisci_gruppi()) if (trasferisci_conti()) return trasferisci_sottoconti(); return false; } bool THardy_pcon::trasferisci_gruppi() { TString query = "SELECT * " "FROM dbo.Mastri " "WHERE Livello=2"; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "MASTRI", true); TSystemisamfile pcon(LF_PCON); pcon.open(_lock); TRectype& rec = pcon.curr(); THardy_iterator hi(this); while (++hi) { // costruisco la chiave gr.co.sc const TString16 key = get_str("IdMastro"); const TString& gruppo = key.mid(0,2); rec.zero(); rec.put(PCN_GRUPPO, gruppo); aggiorna_record(rec, lista_campi); test_write(pcon); } pcon.close(); return write_enabled(); } bool THardy_pcon::trasferisci_conti() { TString query = "SELECT * " "FROM dbo.Mastri " "WHERE Livello=1"; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi_pcon; ini.list_variables(lista_campi_pcon, true, "MASTRI", true); const TString& esclusi = ini.get("PCON", "PARAMETRI"); TSystemisamfile pcon(LF_PCON); pcon.open(_lock); TRectype& rec_pcon = pcon.curr(); THardy_iterator hi(this); while (++hi) { // costruisco la chiave gr.co const TString16 key = get_str("IdMastro"); const int gr = atoi(key.mid(0,2)); int co = atoi(key.mid(2,2)); const int so = atoi(key.mid(4,3)); if ((gr != 0) && (co != 0)) { if (esclusi.find(key.mid(0,2))>=0) co = co*10+so; rec_pcon.zero(); rec_pcon.put(PCN_GRUPPO, gr); rec_pcon.put(PCN_CONTO, co); aggiorna_record(rec_pcon, lista_campi_pcon); test_write(pcon); } } pcon.close(); return write_enabled(); } bool THardy_pcon::trasferisci_sottoconti() { TString query = "SELECT * " "FROM dbo.Conti "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi_pcon, lista_cf; ini.list_variables(lista_campi_pcon, true, "CONTI", true); const TString& esclusi = ini.get("PCON", "PARAMETRI"); TSystemisamfile pcon(LF_PCON); pcon.open(_lock); TRectype& rec_pcon = pcon.curr(); THardy_iterator hi(this); while (++hi) { // costruisco la chiave gr.co.sc const TString16 key = get_str("IdConto"); const int gr = atoi(key.mid(1,2)); const int co = atoi(key.mid(3,2)); const int so = atoi(key.mid(5,3)); rec_pcon.zero(); rec_pcon.put(PCN_GRUPPO, gr); if ((gr != 0) && (co != 0) && (so!= 0)) { if (esclusi.find(key.mid(1,2))>=0) rec_pcon.put(PCN_CONTO, co*10+so); else { rec_pcon.put(PCN_CONTO, co); rec_pcon.put(PCN_SOTTOCONTO, so); } aggiorna_record(rec_pcon, lista_campi_pcon); test_write(pcon); } } pcon.close(); return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_clienti /////////////////////////////////////////////////////////// bool THardy_clienti::trasferisci() { bool ok = trasferisci_clienti(); if (ok) ok = trasferisci_destinazioni(); return ok; } // trasferisce i clienti bool THardy_clienti::trasferisci_clienti() { TString query = "SELECT * " "FROM dbo.Clienti "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "CLIENTI", true); TSystemisamfile clienti(LF_CLIFO); clienti.open(_lock); TRectype& rec = clienti.curr(); TSystemisamfile cfven(LF_CFVEN); cfven.open(_lock); TRectype& cfv_rec = cfven.curr(); THardy_iterator hi(this); while (++hi) { // costruisco la chiave const TString& key = get_str("IdConto"); const long codcf = hd_key2cli(key); if (codcf > 0) { rec.zero(); rec.put(CLI_TIPOCF, "C"); rec.put(CLI_CODCF, codcf); // banca TString8 codabi = get_str("IdBanca"); codabi.lpad(5,'0'); TString8 codcab = get_str("IdAgenzia"); codcab.lpad(5,'0'); TString16 codtab = codabi; codtab << codcab; const TRectype& ban = cache().get("%BAN", codtab); if (ban.empty()) { codabi = ""; codcab = ""; } rec.put(CLI_CODABI, codabi); rec.put(CLI_CODCAB, codcab); // ricerca comune const TString8 cap = get_str("IdCap"); //cap TString80 loc = get_str("Localita"); //località const TString4 com = cap2comune(cap,loc); //codice comune const TString4 stato = get_str("IdNazione"); //stato rec.put(CLI_CAPCF, cap); if (com.full()) { rec.put(CLI_COMCF, com); //se riesce la CAP2COMUNE, inserisco il codice comune loc = ""; rec.put(CLI_LOCCF, loc); } else { rec.put(CLI_COMCF, com); if (stato != "IT" && !stato.blank()) //altrimenti metto tutto nella località, eventualmente concatenando lo stato loc << " - " << stato; rec.put(CLI_LOCCF, loc); } aggiorna_record(rec, lista_campi); if (test_write(clienti)) { TString msg; msg << TR("Inserito cliente ") << " '" << key << "\' -> " << codcf << " - " << rec.get(CLI_RAGSOC); log(msg); } //Adesso tocca all'agente che va messo in cfven cfv_rec.zero(); cfv_rec.put(CFV_TIPOCF, "C"); cfv_rec.put(CFV_CODCF, codcf); const TString4 codzona = get_str("IdZona"); cfv_rec.put(CFV_CODZONA, codzona); TString8 codag = get_str("IdAgente1"); //agente principale codag.right_just(5, '0'); cfv_rec.put(CFV_CODAG, codag); test_write(cfven); } else { TString msg; msg << TR("Impossibile determinare il codice del cliente") << " '" << key << '\''; log(msg); } } cfven.close(); clienti.close(); return write_enabled(); } // verifica se esiste un altro cliente con stessa partita iva (solo tra 200000 e 300000) // per decidere se fare scambio dati tra destinazioni e clienti oppure inserire un indirizzo di spedizione bool THardy_clienti::is_piva_doppia(const long codcf) { TToken_string tok; tok.add("C"); tok.add(codcf); const TRectype& cli = cache().get(LF_CLIFO, tok); const TString& statopaiv = cli.get(CLI_STATOPAIV); const TString& paiv = cli.get(CLI_PAIV); TISAM_recordset clifo("USE CLIFO KEY 5\n" "SELECT (CODCF>200000)&&(CODCF<300000)\n" "FROM TIPOCF='C' STATOPAIV=#STATOPAIV PAIV=#PAIV\n" "TO TIPOCF='C' STATOPAIV=#STATOPAIV PAIV=#PAIV"); clifo.set_var("#STATOPAIV", TVariant(statopaiv)); clifo.set_var("#PAIV", TVariant(paiv)); return (clifo.items() > 1); // Spiegare?????????? } // restituisce il codice indirizzo di spedizione da usare per inserimento record int THardy_clienti::get_next_key_indsped(const char tipocf, const long codcf) const { TISAM_recordset indsped("USE INDSPED\nFROM TIPOCF=#TIPO CODCF=#CODE\nTO TIPOCF=#TIPO CODCF=#CODE"); TString4 str; str << tipocf; indsped.set_var("#TIPO", TVariant(str)); indsped.set_var("#CODE", TVariant(codcf)); int codind = 1; if (indsped.items() > 0) // La move_last da errore fatale su recordset vuoti! { indsped.move_last(); codind += indsped.get("CODIND").as_int(); } return codind; } // trasferisce la tabella Destinazioni che vale sia come indirizzi di spedizione sia come verifica dei dati sui clienti // in caso di partita iva doppia (solo clienti tra 200000 e 300000) prende i dati su Destinazioni // come dati anagrafici del clienti (esempio Esselunga) bool THardy_clienti::trasferisci_destinazioni() { TString query = "SELECT * " "FROM dbo.Destinazioni"; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi, lista_campi_indsped; ini.list_variables(lista_campi, true, "DESTINAZIONI", true); ini.list_variables(lista_campi_indsped, true, "INDSPED", true); TSystemisamfile clifo(LF_CLIFO); TSystemisamfile indsped(LF_INDSP); clifo.open(_lock); indsped.open(_lock); TRectype& rec = clifo.curr(); TRectype& rec_indsped = indsped.curr(); THardy_iterator hi(this); while (++hi) { // costruisco la chiave const TString& key = get_str("IdConto"); const long codcf = hd_key2cli(key); rec.zero(); rec.put(CLI_TIPOCF, "C"); rec.put(CLI_CODCF, codcf); bool good = clifo.read() == NOERR; if (good) { if (codcf > 200000 && codcf < 300000 && is_piva_doppia(codcf)) { // cambio dati tra clienti e destinazione // ricerca comune const TString8 cap = get_str("IdCap"); //cap TString80 loc = get_str("Localita"); //località const TString4 com = cap2comune(cap,loc); //codice comune const TString4 stato = get_str("IdNazione"); //stato rec.put(CLI_CAPCF, cap); if (com.full() && !com.blank()) { rec.put(CLI_COMCF, com); //se riesce la CAP2COMUNE, inserisco il codice comune loc = ""; rec.put(CLI_LOCCF, loc); } else { rec.put(CLI_COMCF, com); if (stato != "IT" && !stato.blank()) //altrimenti metto tutto nella località, eventualmente concatenando lo stato loc << " - " << stato; rec.put(CLI_LOCCF, loc); } aggiorna_record(rec, lista_campi); if (test_write(clifo)) { TString msg; msg << TR("Modificato cliente ") << " '" << key << '\'' << TR(" con codice ") << codcf ; log(msg); } } else { // inserisco indirizzo di spedizione int codind = get_next_key_indsped('C', codcf); rec_indsped.zero(); rec_indsped.put(IND_TIPOCF, "C"); rec_indsped.put(IND_CODCF, codcf); rec_indsped.put(IND_CODIND, codind); aggiorna_record(rec_indsped, lista_campi_indsped); if (test_write(indsped)) { TString msg; msg << TR("Inserito indirizzo di spedizione ") << " '" << key << '\'' ; log(msg); } } } else { TString msg; msg << TR("Impossibile stabilire cliente del codice destinazione") << " '" << key << '\''; log(msg); } } clifo.close(); indsped.close(); return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_fornitori /////////////////////////////////////////////////////////// long THardy_fornitori::key2forn(const TString& key) const { const long codcf = atol(key.mid(3,6)); return codcf; } bool THardy_fornitori::trasferisci() { TString query = "SELECT * " "FROM dbo.Fornitori "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "FORNITORI", true); TSystemisamfile clienti(LF_CLIFO); clienti.open(_lock); TRectype& rec = clienti.curr(); THardy_iterator hi(this); while (++hi) { const TString& key = get_str("IdConto"); const long codcf = key2forn(key); if (codcf > 0) { rec.zero(); rec.put(CLI_TIPOCF, "F"); rec.put(CLI_CODCF, codcf); // ricerca comune const TString8 cap = get_str("IdCap"); //cap TString80 loc = get_str("Localita"); //località const TString4 com = cap2comune(cap,loc); //codice comune const TString4 stato = get_str("IdNazione"); //stato rec.put(CLI_CAPCF, cap); if (com.full()) { rec.put(CLI_COMCF, com); //se riesce la CAP2COMUNE, inserisco il codice comune loc = ""; rec.put(CLI_LOCCF, loc); } else { rec.put(CLI_COMCF, com); if (stato != "IT" && !stato.blank()) //altrimenti metto tutto nella località, eventualmente concatenando lo stato loc << " - " << stato; rec.put(CLI_LOCCF, loc); } aggiorna_record(rec, lista_campi); test_write(clienti); } else { TString msg; msg << TR("Impossibile determinare il codice del fornitore") << " '" << key << '\''; log(msg); } } clienti.close(); return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_agenti /////////////////////////////////////////////////////////// const TString& THardy_agenti::get_codage(const TString& key) const { TString& codage = get_tmp_string(); codage = key; codage.right_just(5,'0'); return codage; } bool THardy_agenti::trasferisci() { TString query = "SELECT * " "FROM dbo.Agenti "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "AGENTI", true); TSystemisamfile agenti(LF_AGENTI); agenti.open(_lock); TRectype& rec = agenti.curr(); THardy_iterator hi(this); while (++hi) { const TString8 key = get_str("IdAgente"); if (!real::is_null(key)) { rec.zero(); rec.put(AGE_CODAGE, get_codage(key)); aggiorna_record(rec, lista_campi); if (test_write(agenti)) { TString msg; msg << TR("Inserito agente ") << " '" << key << "\' -> " << rec.get(AGE_CODAGE) << " - " << rec.get(AGE_RAGSOC); log(msg); } } else { TString msg; msg << TR("Impossibile determinare il codice dell'agente") << " '" << key << '\''; log(msg); } } agenti.close(); return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_listini /////////////////////////////////////////////////////////// bool THardy_listini::trasferisci() { if (trasferisci_listini()) return trasferisci_listinid(); return false; } // trasferisce tabella Listini (condv L) bool THardy_listini::trasferisci_listini() { TString query = "SELECT * " "FROM dbo.Listini "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "LISTINI", true); TSystemisamfile condv(LF_CONDV); condv.open(_lock); TRectype& rec = condv.curr(); THardy_iterator hi(this); while (++hi) { aggiorna_record(rec, lista_campi); test_write(condv); } condv.close(); return write_enabled(); } // trasferisce tabella ListiniD (rcondv L) bool THardy_listini::trasferisci_listinid() { TString query = "SELECT * " "FROM dbo.ListiniD "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "LISTINID", true); TSystemisamfile rcondv(LF_RCONDV); rcondv.open(_lock); TRectype& rec = rcondv.curr(); THardy_iterator hi(this); while (++hi) { aggiorna_record(rec, lista_campi); test_write(rcondv); } rcondv.close(); return write_enabled(); } /////////////////////////////////////////////////////////// // THardy_contratti /////////////////////////////////////////////////////////// // trasferisce tabella ListiniCF (condv C) // inserisco una testata per ogni cliente e tutte le righe relative agli articoli di quel cliente // tralasciando le righe con DataFine < data impostata da parametri bool THardy_contratti::trasferisci() { TString query = "SELECT * " "FROM dbo.ListiniCF " "ORDER BY IdConto "; TRecordset& recset = create_recordset(query); TConfig& ini = config(); TString_array lista_campi; ini.list_variables(lista_campi, true, "CONTRATTI", true); TSystemisamfile condv(LF_CONDV); TSystemisamfile rcondv(LF_RCONDV); condv.open(_lock); rcondv.open(_lock); TRectype& rec_condv = condv.curr(); TRectype& rec_rcondv = rcondv.curr(); THardy_iterator hi(this); int oldconto = -1; int codcontratto = 0; while (++hi) { aggiorna_record(rec_condv, lista_campi); test_write(condv); } condv.close(); return write_enabled(); } /////////////////////////////////////////////////////////// // TImportazioneHardy_mask /////////////////////////////////////////////////////////// class TImportazioneHardy_mask : public TAutomask { protected: virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); void serialize(bool bSave); public: void trasferisci(); TImportazioneHardy_mask(); virtual ~TImportazioneHardy_mask(); }; // Funzione di tarsferimento dati da/verso file .ini con lo stesso nome della maschera // Andrebbe messo in libreria void TImportazioneHardy_mask::serialize(bool bSave) { TFilename n = source_file(); n.ext("ini"); // Construisce il nome del .ini in base al .msk TConfig cfg(n, "Main"); // Crea il file di configurazione TString4 id; for (int i = fields()-1; i >= 0; i--) // Scandisce tutti i campi della maschera ... { TMask_field& f = fld(i); if (f.active() && f.is_loadable()) // ... selezionando solo quelli editabili { id.format("%d", f.dlg()); if (bSave) // A seconda del flag di scrittura ... cfg.set(id, f.get()); // ... o scrive sul .ini else f.set(cfg.get(id)); // ... o legge dal .ini } } } void TImportazioneHardy_mask::trasferisci() { TString query_header; query_header << "ODBC(" << get(F_DSN) << ',' << get(F_USR) << ',' << get(F_PWD) << ")\n"; TReport_book book; THardy_log log; bool rep_to_print = false; bool go_on = true; if (go_on && get_bool(F_PAG)) { THardy_pag pc; pc.init(TR("Condizioni di pagamento"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_IVA)) { THardy_iva pc; pc.init(TR("Aliquote IVA"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_CATMERC)) { THardy_catmerc pc; pc.init(TR("Categorie merceologiche"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_CATFISC)) { THardy_catfisc pc; pc.init(TR("Categorie fiscali"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_BAN)) { THardy_ban pc; pc.init(TR("Banche"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_CAUCONT)) { THardy_caucont pc; pc.init(TR("Causali contabili"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_CAUMAG)) { THardy_caumag pc; pc.init(TR("Causali magazzino"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_UM)) { THardy_um pc; pc.init(TR("Unità di misura"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_ARTICOLI)) { THardy_art pc; pc.init(TR("Articoli"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_PCON)) { THardy_pcon pc; pc.init(TR("Piano dei conti"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_CLI)) { THardy_clienti pc; pc.init(TR("Clienti"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_FOR)) { THardy_fornitori pc; pc.init(TR("Fornitori"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_AGENTI)) { THardy_agenti pc; pc.init(TR("Agenti"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_LISTINI)) { THardy_listini pc; pc.init(TR("Listini"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (go_on && get_bool(F_CONTRATTI)) { THardy_contratti pc; pc.init(TR("Contratti"), query_header, log); go_on = pc.trasferisci(); book.add(log); rep_to_print = true; } if (rep_to_print && book.pages() > 0) book.preview(); } bool TImportazioneHardy_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) { switch (o.dlg()) { case DLG_OK: if (e == fe_button) serialize(true); break; default: break; } return true; } TImportazioneHardy_mask::TImportazioneHardy_mask() : TAutomask("hacnv100a") { serialize(false); } TImportazioneHardy_mask::~TImportazioneHardy_mask() { } /////////////////////////////////////////////////////////// // TImportazioneHardy /////////////////////////////////////////////////////////// class TImportazioneHardy : public TSkeleton_application { protected: virtual void main_loop(); }; void TImportazioneHardy::main_loop() { TImportazioneHardy_mask mask; while (mask.run() == K_ENTER) mask.trasferisci(); } int hacnv100(int argc, char* argv[]) { TImportazioneHardy ih; ih.run(argc, argv, APPNAME); return 0; }