#include #include #include #include #include #include #include #include #include #include "../ve/condv.h" #include "../ve/velib.h" class THardy_config : public TConfig { public: virtual const TString& get(const char* var, const char* section = NULL, int index = -1, const char* def = ""); THardy_config(const char* ini_name); }; const TString& THardy_config::get(const char* var, const char* section, int index, const char* def) { const TString& original_val = TConfig::get(var, section, index, def); if (original_val[0] == '"' && original_val.ends_with("\"")) { TString& val = get_tmp_string(); val = original_val; val.rtrim(1); val.ltrim(1); val.trim(); return val; } return original_val; } THardy_config::THardy_config(const char* ini_name) : TConfig(ini_name, "Transaction") { } ///////////////////////////////////////////////////////////// // Recordset specifici per i dati da trasferire ///////////////////////////////////////////////////////////// //classe generica per poter aggiungere pedissequamente i campi seguendo le tracce sulla documentazione #define T_N "N" #define T_2N "2N" #define T_2Nv2N "2N,2N" #define T_X "X" class THardy_recordset : public TAS400_recordset { protected: void add_field(const char* name, const char* tipo, int pos, int len); public: THardy_recordset(const char* query); }; //questo è il metodo magico void THardy_recordset::add_field(const char* name, const char* tipo, int pos, int len) { const TFixed_string str_tipo(tipo); if (str_tipo.ends_with("N")) { create_field(name, pos-1, len, _intzerofld); return; } create_field(name, pos-1, len, _alfafld); } THardy_recordset::THardy_recordset(const char* query) : TAS400_recordset(query) {} //Clienti //------- class TEsporta_clienti_recordset : public THardy_recordset { protected: public: TEsporta_clienti_recordset(); }; TEsporta_clienti_recordset::TEsporta_clienti_recordset() : THardy_recordset("AS400(248)") { add_field("CodiceTerminale", T_N, 1, 3); add_field("Segno", T_X, 4, 1); add_field(CLI_CODCF, T_X, 5, 6); add_field(CLI_RAGSOC, T_X, 11, 34); add_field(CLI_INDCF, T_X, 45, 34); add_field(CLI_LOCCF, T_X, 79, 20); add_field(CLI_CAPCF, T_X, 99, 5); add_field("Provincia", T_X, 104, 2); add_field(CLI_PAIV, T_X, 106, 11); add_field(CLI_CODPAG, T_X, 117, 1); add_field("CodiceListino", T_X, 118, 3); add_field("CodicePromozione", T_X, 121, 3); add_field("ScontoFineFattura", T_2Nv2N, 124, 4); //ne mancano ancora parecchi } ///////////////////////////////////////////////////////////// // Applicazione ///////////////////////////////////////////////////////////// class TIni2Txt: public TSkeleton_application { TFilename _output_dir; protected: void crea_nome_txt(const TString& prefisso, TFilename& output_path); void genera_cliente_txt(TConfig& ini); virtual void main_loop(); public: TIni2Txt(); }; TIni2Txt::TIni2Txt() { if (user().blank()) user() = dongle().administrator(); } //metodo che genera in automatico il nome del file .txt in output (maggggico) void TIni2Txt::crea_nome_txt(const TString& prefisso, TFilename& output_path) { TString_array lista_files; output_path = _output_dir; TString wrkstring; wrkstring << prefisso << "??????.txt"; output_path.add(wrkstring); const int items = list_files(output_path, lista_files); long n = 1; if (items > 0) { lista_files.sort(); TFilename ultimo_txt = lista_files.row(items - 1); ultimo_txt = ultimo_txt.name(); const long last_txt = atol(ultimo_txt.mid(prefisso.len(), 6)); n += last_txt; } //risfruttiamo lo stesso filename che risparmiamo output_path = _output_dir; output_path.add(prefisso); TString8 numero; numero.format("%06ld", n); output_path << numero; output_path.ext("txt"); } void TIni2Txt::genera_cliente_txt(TConfig& ini) { //recordset per i clienti TEsporta_clienti_recordset clienti; clienti.new_rec(""); //controlla il tipo di transazione... TString4 segno = "+"; const TString& action = ini.get("Action", "Transaction"); if (action == "R") segno = "-"; //...e poi si lancia a capofitto a riempire il recordset! //campi da clifo (20) //------------------- ini.set_paragraph("20"); clienti.set("CodiceTerminale", 0L); clienti.set("Segno", segno); clienti.set(CLI_CODCF, ini.get_long(CLI_CODCF)); clienti.set(CLI_RAGSOC, ini.get(CLI_RAGSOC)); clienti.set(CLI_INDCF, ini.get(CLI_INDCF)); clienti.set(CLI_LOCCF, ini.get(CLI_LOCCF)); clienti.set(CLI_CAPCF, ini.get(CLI_CAPCF)); const TString& statocf = ini.get(CLI_STATOCF); if (statocf.blank()) { const TString& comcf = ini.get(CLI_COMCF); TToken_string key; key.add(statocf); key.add(comcf); const TString& provcf = cache().get(LF_COMUNI, key, COM_PROVCOM); clienti.set("Provincia", provcf); } clienti.set(CLI_PAIV, ini.get(CLI_PAIV)); const TString& codpag = ini.get(CLI_CODPAG); if (codpag.full()) { const TString& tipo_pag = cache().get("%CPG", codpag, "S4"); clienti.set(CLI_CODPAG, tipo_pag == "1" ? "1" : "2"); } TString query; query << "USE CONDV"; query << "\nFROM TIPO=C TIPOCF=C CODCF=#CODCF"; query << "\nTO TIPO=C TIPOCF=C CODCF=#CODCF"; TISAM_recordset contratti(query); contratti.set_var("#CODCF", ini.get_long(CLI_CODCF)); if (contratti.move_last()) { const TString& cod_contr = contratti.get(CONDV_COD).as_string(); clienti.set("CodiceListino", cod_contr); } //clienti.set("CodicePromozione", ); //campi da cfven(17) //------------------ ini.set_paragraph("17"); const TString& str_sconto = ini.get(CFV_SCONTO); TString goodexp; real val_perc; if (scontoexpr2perc(str_sconto, false, goodexp, val_perc)) { val_perc = CENTO - (val_perc * CENTO); val_perc *= CENTO; val_perc.round(); clienti.set("ScontoFineFattura", val_perc); } //prepara il nome corretto del file .txt da generare const TString prefisso = "clientivar"; TFilename output_path; crea_nome_txt(prefisso, output_path); //..e alla fine della fiera salva il file di testo nell directory selezionata clienti.save_as(output_path, fmt_text); } void TIni2Txt::main_loop() { //stabilisce una volta per tutte ad inizio programma quale cavolo è la directory dove sbattere i .txt generati TConfig hardy(CONFIG_DITTA, "ha"); _output_dir = hardy.get("OuputPath"); //dalla riga di comando raccatta il path completo del file .ini da tradurre TFilename path = argv(2); if (path.exist()) { //crea un config del .ini di tipo Hardy_config con le get astute! THardy_config input_ini_file(path); //elabora il .ini TString_array ini_paragraphs; input_ini_file.list_paragraphs(ini_paragraphs); //clienti if (ini_paragraphs.find("20") >= 0) genera_cliente_txt(input_ini_file); //sospesi //listino //prodotti //barcode } } int main(int argc, char** argv) { TIni2Txt a; a.run(argc, argv, "Generazione .txt da .ini"); return 0; }