#include #include #include #include #include #include #include #include #include #include #include "..\ve\velib.h" #include "si0100a.h" ///////////////////////////////////////////////////// // Classe TPag_file customizzata dalla TFile_text // ///////////////////////////////////////////////////// class TPag_file: public TFile_text { protected: virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); public: TPag_file(const TString& file_name, const TString& config_name); virtual ~TPag_file() { } }; // gestione dei messaggi estesi nei campi void TPag_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) { const TString code(s.get(0)); TString valore; str = valore; } TPag_file::TPag_file(const TString& file_name, const TString& config_name) : TFile_text(file_name, config_name) { } ///////////////////////////////////////////////////// // Classe TCli_file customizzata dalla TFile_text // ///////////////////////////////////////////////////// class TCli_file: public TFile_text { protected: virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); public: TCli_file(const TString& file_name, const TString& config_name); virtual ~TCli_file() { } }; // gestione dei messaggi estesi nei campi void TCli_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) { const TString code(s.get(0)); TString valore; str = valore; } TCli_file::TCli_file(const TString& file_name, const TString& config_name) : TFile_text(file_name, config_name) { } ///////////////////////////////////////////////////// // Classe TArt_file customizzata dalla TFile_text // ///////////////////////////////////////////////////// class TArt_file: public TFile_text { protected: virtual void validate(TCursor& cur,TRecord_text &rec, TToken_string &val, TString& str); public: TArt_file(const TString& file_name, const TString& config_name); virtual ~TArt_file() { } }; // gestione dei messaggi estesi nei campi void TArt_file::validate(TCursor& cur,TRecord_text &rec, TToken_string &s, TString& str) { const TString code(s.get(0)); TString valore; str = valore; } TArt_file::TArt_file(const TString& file_name, const TString& config_name) : TFile_text(file_name, config_name) { } class TImport: public TSkeleton_application { protected: virtual bool create(void); virtual void main_loop(); virtual bool destroy(void) ; void transfer(void); bool check_seq(TConfig & c); bool localita2comune(const TString & cap, const TString & localita, TString & codice); void update_cli(TCli_file & in, TRecord_text & r, TLocalisamfile & cli); void update_art(TArt_file & in, TRecord_text & r, TLocalisamfile & art, TLocalisamfile & umart); void update_doc(TPag_file & in, TRecord_text & r, TDocumento &doc, const char * codnum, const char * tipodoc, const char * tiporiga, const char * codiva, const char * codivaz); virtual const char * extra_modules() const { return "BA"; } public: TImport() {} virtual ~TImport() {} }; // restituisce un riferimento all' applicazione inline TImport& app() { return (TImport&) main_app();} // creazione dell'applicazione bool TImport::create() { open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON, LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0); return TSkeleton_application::create(); } // distruzione dell'applicazione bool TImport::destroy() { return TSkeleton_application::destroy(); } // carica la maschera void TImport::main_loop() { transfer(); } // trasferimento dati su file per ct bo void TImport::transfer() { TMask msk("si0100a"); TConfig c(CONFIG_STUDIO, "sipag"); msk.set(F_FILESEQ, c.get("FileSeq")); msk.set(F_FILEPAG, c.get("FilePag")); msk.set(F_FILECLI, c.get("FileCli")); msk.set(F_FILEART, c.get("FileArt")); while (msk.run() != K_QUIT) { c.set("FileSeq", msk.get(F_FILESEQ)); c.set("FilePag", msk.get(F_FILEPAG)); c.set("FileCli", msk.get(F_FILECLI)); c.set("FileArt", msk.get(F_FILEART)); if (check_seq(c)) { TRecord_text rec; TProgind p(3L, "Trasferimento da AS/400"); TFilename clisrc(msk.get(F_FILECLI)); if (clisrc.exist()) { TCli_file clifile(clisrc, "cli.ini"); TLocalisamfile clienti(LF_CLIFO); clifile.open(clisrc,'r'); while (clifile.read(rec) == NOERR) update_cli(clifile, rec, clienti); clifile.close(); } p.addstatus(1L); TFilename artsrc(msk.get(F_FILEART)); if (artsrc.exist()) { TArt_file artfile(artsrc, "art.ini"); TLocalisamfile articoli(LF_ANAMAG); TLocalisamfile umart(LF_UMART); artfile.open(artsrc,'r'); while (artfile.read(rec) == NOERR) update_art(artfile, rec, articoli, umart); artfile.close(); } p.addstatus(1L); TFilename pagsrc(msk.get(F_FILEPAG)); if (pagsrc.exist()) { TPag_file pagfile(pagsrc, "pag.ini"); TDocumento doc; TString codnum(c.get("CodNum")); TString tipodoc(c.get("TipoDoc")); TString tiporiga(c.get("TipoRiga")); TString codiva(c.get("CodIva")); TString codivaz(c.get("CodIvaZ")); pagfile.open(pagsrc,'r'); while (pagfile.read(rec) == NOERR) update_doc(pagfile, rec, doc, codnum, tipodoc, tiporiga, codiva, codivaz); pagfile.close(); } p.addstatus(1L); message_box("Operazione terminata"); } } } //inizializza il cursore bool TImport::check_seq(TConfig & c) { TScanner seq(c.get("FileSeq")); const int expected_seq = c.get_int("Seq") + 1; const int seqnum = seq.integer(); if (expected_seq != seqnum) return error_box("Il numero di sequenza trovato %d\nnon coincide con quello atteso %d", seqnum, expected_seq); c.set("Seq", seqnum); return TRUE; } int si0100(int argc, char* argv[]) { TImport a ; a.run(argc, argv, "Ricezione da AS/400"); return 0; } bool TImport::localita2comune(const TString & caporig, const TString & localita, TString & codice) { TLocalisamfile comuni (LF_COMUNI); TString cap(caporig); bool found = FALSE; if (cap.mid(2,1) == "1") { cap = cap.left(3); cap << "00"; } comuni.setkey(3); comuni.zero(); comuni.put("CAPCOM", cap); TRectype com (comuni.curr()); codice = ""; for (comuni.read(_isgteq); !comuni.eof() && !found; comuni.next()) { if (comuni.curr() != com) break; found = localita.compare(comuni.get("DENCOM"), 3, FALSE) == 0; if (found) codice = comuni.get("COM"); } return found; } void TImport::update_cli(TCli_file & in, TRecord_text & r, TLocalisamfile & cli) { cli.zero(); cli.put("TIPOCF", "C"); cli.put("CODCF", in.get_field(r, 1)); bool newrec = cli.read() != NOERR; if (newrec) { cli.zero(); cli.put("TIPOCF", "C"); cli.put("CODCF", in.get_field(r, 1)); } cli.put("RAGSOC", in.get_field(r, 2)); TString ind(in.get_field(r, 3)); TString loc; int p = ind.find('-'); if (p > 0) { loc = ind.mid(p+1); loc.strip("-"); loc.trim(); ind.cut(p); ind.trim(); } p = ind.rfind(','); if (p > 0) { cli.put("INDCF", ind.left(p)); cli.put("CIVCF", ind.mid(p+1)); } else cli.put("INDCF", ind.left(35)); TString cap(in.get_field(r, 4)); cli.put("CAPCF", cap); cli.put("COFI", in.get_field(r, 6)); cli.put("PAIV", in.get_field(r, 7)); TString localita(in.get_field(r, 8)); TString codice; if (localita2comune(cap, localita, codice) == TRUE) localita = ""; if (loc.not_empty()) { localita.insert(" "); localita.insert(loc); } cli.put("COMCF", codice); cli.put("LOCALITACF", localita); if (newrec) cli.write(); else cli.rewrite(); } void TImport::update_art(TArt_file & in, TRecord_text & r, TLocalisamfile & art, TLocalisamfile & umart) { art.zero(); art.put("CODART", in.get_field(r, 0)); bool newrec = art.read() != NOERR; if (newrec) { art.zero(); art.put("CODART", in.get_field(r, 0)); } art.put("DESCR", in.get_field(r, 1)); if (newrec) { art.write(); umart.zero(); umart.put("CODART", in.get_field(r, 0)); umart.put("NRIGA", "1"); umart.put("UM", "N."); umart.put("FC", "1.00"); umart.write(); } else art.rewrite(); } void TImport::update_doc(TPag_file & in, TRecord_text & r, TDocumento &doc, const char * codnum, const char * tipodoc, const char * tiporiga, const char * codiva, const char * codivaz) { doc.zero(); const bool newdoc = doc.read('D', TDate(TODAY).year(), codnum, atol(in.get_field(r, 1))) != NOERR; const TDate oggi(TODAY); if (newdoc) { doc.zero(); TDocumento::set_key(doc, 'D', oggi.year(), codnum, atol(in.get_field(r, 1))); doc.set_tipo(tipodoc); doc.put("TIPOCF", "C"); doc.put("CODCF", in.get_field(r, 1)); doc.put("DATADOC", oggi); doc.put("DATACONS", oggi); } TRiga_documento & riga = doc.new_row(tiporiga); const TString & cod = in.get_field(r, 2); riga.put("CODART", cod); riga.put("CODARTMAG", cod); TString descr = cache().get(LF_ANAMAG, cod, "DESCR"); riga.put("DESCR", descr); riga.put("CHECKED", "X"); doc.put("DATACONS", oggi); real qta(in.get_field(r, 3)); if (qta == ZERO) qta = 1.00; riga.put("UMQTA", "N."); riga.put("QTA", qta); TString prezzo_str(in.get_field(r, 4)); prezzo_str.replace(',', '.'); const real prezzo(prezzo_str); riga.put("PREZZO", prezzo); if (cod[0] == 'Z') riga.put("CODIVA", codivaz); else riga.put("CODIVA", codiva); if (newdoc) doc.write(); else doc.rewrite(); }