12cf07f356
Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/trunk@18313 c028cbd2-c16b-5b4b-a496-9718f37d4682
1200 lines
36 KiB
C++
Executable File
1200 lines
36 KiB
C++
Executable File
#include <applicat.h>
|
|
#include <dongle.h>
|
|
#include <execp.h>
|
|
#include <odbcrset.h>
|
|
#include <tabutil.h>
|
|
#include <utility.h>
|
|
|
|
#include <clifo.h>
|
|
#include <cfven.h>
|
|
#include <mov.h>
|
|
|
|
#include "../ce/collces.h"
|
|
#include "../ve/velib.h"
|
|
#include "../cg/cg2103.h"
|
|
|
|
#include "../ca/movana.h"
|
|
#include "../ca/rmovana.h"
|
|
|
|
// Fine del comando sql con separatore magico per crpa.exe
|
|
#define SQL_EOL "æ"
|
|
|
|
class TIni2Sql: public TSkeleton_application
|
|
{
|
|
TRelation* _clifo;
|
|
TConfig* _configfile;
|
|
TConfig* _inputfile;
|
|
ofstream* _sqlfile;
|
|
TLocalisamfile* _anamag;
|
|
TLocalisamfile* _fcaus;
|
|
TLocalisamfile* _frcaus;
|
|
TCausale * _caus;
|
|
long _firm;
|
|
TDocumento* _doc;
|
|
TDocumento* _dadoc;
|
|
TRiga_documento* _rigadoc;
|
|
TFilename _inputfilename;
|
|
TBill _conto;
|
|
TToken_string _search_seq;
|
|
// Sequenza di ricerca del conto costo/ricavo la correttezza dell'ordinamento
|
|
// va controllata nel programma di modifica parametri:
|
|
// "" = fine ordinamento
|
|
// CF = cliente fornitore
|
|
// CA = causale
|
|
// AR = articolo (costo/ricavo)
|
|
// GM = gruppo merceologico
|
|
// SM = sottogruppo merceologico
|
|
// RF = raggruppamento fiscale
|
|
// CV = categoria di vendita
|
|
// CC = categoria contabile
|
|
// Gli utlimi 6 fanno parte della ricerca per costi ricavi, in particolare AR,GM,SM e RF
|
|
// non possono essere interrotti da CV o CC. Ad es. CA|CF|AR|CV|GM|CC|RF non e' valida come stringa
|
|
// di ricerca.
|
|
|
|
|
|
protected:
|
|
virtual bool create(void);
|
|
virtual void main_loop();
|
|
virtual bool destroy(void);
|
|
virtual const char * extra_modules() const { return "BA"; }
|
|
void process_field(const TString& inputfield, TString& outputstr, int len = -1, const bool apici = TRUE);
|
|
void validate(const TString& elabfield, TString& outputstr);
|
|
void leggidadoc(const TString& elabfield, TString& outputstr);
|
|
void build_paragraph(const TString& paragrafo, TString& outputstr);
|
|
int build_nriga(const TString& paragrafo);
|
|
int get_tipo_dadoc(const TDocumento& doc) const;
|
|
int get_tipo_doc(const TDocumento& doc) const;
|
|
bool get_fdaric_dadoc(const TDocumento& doc) const;
|
|
long get_protiva(const TDocumento& doc) const;
|
|
bool search_costo_ricavo(TBill& conto, const TRiga_documento& r);
|
|
bool search_conto_cespite(TBill& conto, const TRiga_documento& r);
|
|
bool test_swap() const;
|
|
bool test_swap_conto(const int gr, const int co, const char sezione) const;
|
|
|
|
public:
|
|
void write_sqlinsert();
|
|
void write_sqldelete();
|
|
|
|
TIni2Sql();
|
|
virtual ~TIni2Sql() {}
|
|
};
|
|
|
|
TIni2Sql::TIni2Sql()
|
|
{
|
|
if (user().blank())
|
|
user() = dongle().administrator();
|
|
}
|
|
|
|
// restituisce un riferimento all' applicazione
|
|
inline TIni2Sql& app() { return (TIni2Sql&) main_app();}
|
|
|
|
// creazione dell'applicazione
|
|
bool TIni2Sql::create()
|
|
{
|
|
if (argc() > 1)
|
|
{
|
|
_inputfilename = argv(1);
|
|
if (_inputfilename[0] == '/' || _inputfilename[0] == '-')
|
|
_inputfilename.ltrim(2);
|
|
if (_inputfilename.exist())
|
|
{
|
|
open_files(LF_MOV, LF_RMOV, LF_RMOVIVA, LF_DOC, LF_RIGHEDOC, LF_MOVANA, LF_RMOVANA, LF_CLIFO, LF_PCON, LF_ABPCON, LF_CFVEN, LF_TABCOM, LF_TAB, 0);
|
|
_inputfile = new TConfig(_inputfilename);
|
|
_configfile = new TConfig("crpa.ini");
|
|
_sqlfile = NULL;
|
|
_doc = NULL;
|
|
_dadoc = NULL;
|
|
_rigadoc = NULL;
|
|
_clifo = new TRelation(LF_CLIFO);
|
|
_clifo->add(LF_CFVEN,"TIPOCF=TIPOCF|CODCF=CODCF");
|
|
_anamag = new TLocalisamfile(LF_ANAMAG);
|
|
_fcaus = new TLocalisamfile(LF_CAUSALI);
|
|
_frcaus = new TLocalisamfile(LF_RCAUSALI);// Per far andare TCausale
|
|
return TSkeleton_application::create();
|
|
}
|
|
else
|
|
error_box("Il file %s non esiste", (const char*) _inputfilename);
|
|
}
|
|
else
|
|
error_box("Usage: CRPA0 -i<filename>");
|
|
return FALSE;
|
|
}
|
|
|
|
bool TIni2Sql::test_swap_conto(const int gr, const int co, const char sezione) const
|
|
{
|
|
TString8 key; key.format("%d|%d", gr, co);
|
|
const int indbil = atoi(cache().get(LF_PCON, key, "INDBIL"));
|
|
return ((indbil == 3) && (sezione == 'A')) || ((indbil == 4) && (sezione == 'D'));
|
|
}
|
|
|
|
bool TIni2Sql::test_swap() const
|
|
{
|
|
bool s = false;
|
|
if (_caus != NULL && *_caus->codice() > ' ') // esiste la causale
|
|
{
|
|
const char sez = _caus->sezione_clifo();
|
|
const TipoIVA iva = _caus->iva();
|
|
const bool vendite = iva == nessuna_iva ? _doc->tipocf() == 'C' : iva == iva_vendite;
|
|
s = vendite ^ (sez == 'D');
|
|
}
|
|
return s;
|
|
}
|
|
|
|
// legge da documento o da riga il campo indicato (primo carattere = #)
|
|
// se occorre usare una funzione dei doc. o delle righe si fa seguire al carattere # la stringa
|
|
// ?? !_,<nome elaborazione>
|
|
void TIni2Sql::leggidadoc(const TString& elabfield, TString& tmpstr)
|
|
{
|
|
tmpstr="";
|
|
TToken_string s(elabfield, ',') ;
|
|
const TString code(s.get(0));
|
|
const TString field(s.get(1));
|
|
if (code == "!_")
|
|
{
|
|
if (field == "IMPORTO")
|
|
{
|
|
if (_rigadoc != NULL)
|
|
{
|
|
bool non_rilevante = false;
|
|
const bool acquisto = _doc->tipocf() == 'F';
|
|
if (acquisto)
|
|
{
|
|
const TString& codcms = _rigadoc->codice_commessa();
|
|
non_rilevante = cache().get("CMS", codcms, "S7") == "NR";
|
|
}
|
|
|
|
real importo = _rigadoc->importo(true, non_rilevante);
|
|
|
|
if (acquisto && !non_rilevante)
|
|
{
|
|
const TString4 tipodet = _rigadoc->get(RDOC_TIPODET);
|
|
|
|
CHECK(_caus,"Causale documento non valida");
|
|
if (tipodet.full())
|
|
{
|
|
const int anno = _doc->get_date(DOC_DATADOC).year();
|
|
int tdet = 0;
|
|
const real perc_ind = indetraibile_al(tipodet, *_caus, anno, tdet);
|
|
const int dec = _rigadoc->doc().decimals();
|
|
real impind = importo * perc_ind / CENTO; impind.round(dec);
|
|
const TCodiceIVA iva(_rigadoc->get(RDOC_CODIVA));
|
|
const real ivaind = iva.imposta(impind, dec);
|
|
|
|
importo += ivaind;
|
|
}
|
|
}
|
|
if (test_swap())
|
|
importo = -importo;
|
|
tmpstr = importo.string();
|
|
}
|
|
}
|
|
else if (field == "QTA")
|
|
{
|
|
if (_rigadoc != NULL)
|
|
{
|
|
real qta;
|
|
if (_doc->is_evaso())
|
|
qta = _rigadoc->qtaevasa();
|
|
else
|
|
qta = _rigadoc->quantita();
|
|
tmpstr = qta.string();
|
|
}
|
|
}
|
|
else if (field == "COMMESSA")
|
|
{
|
|
if (_rigadoc != NULL)
|
|
{
|
|
tmpstr = _rigadoc->codice_commessa();
|
|
tmpstr.upper();
|
|
tmpstr.replace('/','_');
|
|
}
|
|
}
|
|
else if (field == "FASE")
|
|
{
|
|
if (_rigadoc != NULL)
|
|
{
|
|
tmpstr = _rigadoc->fase_commessa();
|
|
tmpstr.upper();
|
|
tmpstr.replace('/','_');
|
|
}
|
|
}
|
|
else if (field == "DATACONS")
|
|
{
|
|
if (_rigadoc != NULL)
|
|
{
|
|
TString str = _rigadoc->get(field);
|
|
TDate datactrl(str);
|
|
if (!datactrl.ok())
|
|
{
|
|
str = _doc->get(field);
|
|
datactrl = TDate(str);
|
|
}
|
|
if (datactrl.ok())
|
|
tmpstr.format("TO_DATE('%s','dd-mm-yyyy')", (const char*) str);
|
|
}
|
|
}
|
|
}
|
|
else if (code == "DRDOC")
|
|
{
|
|
if (_rigadoc != NULL)
|
|
{
|
|
TString str = _rigadoc->get(field);
|
|
TDate datactrl(str);
|
|
if (datactrl.ok())
|
|
tmpstr.format("TO_DATE('%s','dd-mm-yyyy')", (const char*) str);
|
|
}
|
|
}
|
|
else if (code == "DOC")
|
|
{
|
|
if (_doc != NULL)
|
|
tmpstr = _doc->get(field);
|
|
}
|
|
else if (code == "RDOC")
|
|
{
|
|
if (_rigadoc != NULL)
|
|
tmpstr = _rigadoc->get(field);
|
|
}
|
|
}
|
|
|
|
bool TIni2Sql::search_costo_ricavo(TBill& conto, const TRiga_documento& r)
|
|
{
|
|
if (_search_seq.empty())
|
|
{
|
|
TConfig conf(CONFIG_DITTA, "ve");
|
|
_search_seq = conf.get("RICERCACR");
|
|
// costruisce la stringa che controlla la ricerca del conto costo/ricavo
|
|
// Attenzione! non esegue alcun controllo di consistenza sulla corretta sequenza
|
|
// presuppone che il programma di configurazione abbia generato correttamente
|
|
// il tutto.
|
|
if (_search_seq.items() == 0)
|
|
{
|
|
error_box("Non e' abilitata alcuna ricerca per il conto di costo/ricavo in configurazione.");
|
|
return FALSE;
|
|
}
|
|
}
|
|
const int items = _search_seq.items();
|
|
TLocalisamfile& cli_file = _clifo->lfile(); // YES, arriva qui dentro quando la relazione e' gia' posizionata
|
|
const bool is_cli = cli_file.get(CLI_TIPOCF) == "C";
|
|
bool skip_art_related = FALSE;
|
|
bool skip_clifo = _clifo->bad();
|
|
TCodiceIVA codiva(r.get(RDOC_CODIVA));
|
|
const char t = r.tipo().tipo();
|
|
|
|
// Istanzia la causale del documento corrente...
|
|
const TTipo_documento& tipo = _doc->tipo(); // deve diventare tipo_riclassificato()
|
|
TString16 codcaus(tipo.causale());
|
|
|
|
TToken_string key;
|
|
key.add(_doc->get(DOC_TIPOCF));
|
|
key.add(_doc->get(DOC_CODCF));
|
|
|
|
const TRectype & cfven = cache().get(LF_CFVEN, key);
|
|
const TString16 caus_cli(cfven.get(CFV_CODCAUS));
|
|
|
|
if (caus_cli.not_empty())
|
|
codcaus = caus_cli;
|
|
TDate data = _doc->data();
|
|
_caus = new TCausale(codcaus, data.year());
|
|
|
|
int gr,co;
|
|
long so;
|
|
|
|
switch (t)
|
|
{
|
|
case 'O': // righe omaggio come articoli spiaccicato identico (avranno imponibile 0)
|
|
case 'M': // righe di merce
|
|
{
|
|
// posiziona l'anagrafica sull'articolo specificato sulla ..iga
|
|
TString80 codart = r.get(RDOC_CODARTMAG);
|
|
if (codart.blank())
|
|
codart = r.get(RDOC_CODART);
|
|
_anamag->put(ANAMAG_CODART, codart);
|
|
if (_anamag->read() != NOERR) // se non trova l'articolo saltera' anche gmc,smc,rfa.
|
|
skip_art_related = TRUE;
|
|
|
|
TString16 tok;
|
|
// Scorre la stringa di ricerca
|
|
for (int i=0;i<items;i++)
|
|
{
|
|
tok = _search_seq.get(i);
|
|
if (tok == "CF")
|
|
{
|
|
if (skip_clifo) continue;
|
|
gr = cli_file.get_int(CLI_GRUPPORIC);
|
|
co = cli_file.get_int(CLI_CONTORIC);
|
|
so = cli_file.get_long(CLI_SOTTOCRIC);
|
|
conto.set(gr,co,so);
|
|
if (conto.ok()) break; // se lo trova esce (tutti != 0)
|
|
}
|
|
else
|
|
if (tok == "CA")
|
|
{
|
|
|
|
CHECK(_caus,"Causale documento non valida");
|
|
if (_caus->IVA2bill(codiva,conto)) break; // se lo trova esce
|
|
}
|
|
else
|
|
if (tok == "AR")
|
|
{
|
|
if (skip_art_related) continue;
|
|
gr = _anamag->get_int(is_cli ? ANAMAG_GRUPPOV : ANAMAG_GRUPPOA);
|
|
co = _anamag->get_int(is_cli ? ANAMAG_CONTOV : ANAMAG_CONTOA);
|
|
so = _anamag->get_long(is_cli ? ANAMAG_SOTTOCV : ANAMAG_SOTTOCA);
|
|
conto.set(gr,co,so);
|
|
if (!conto.ok()) // se il conto non c'e' guarda la categoria acquisti/vendite
|
|
{
|
|
const TString16 catcon = _anamag->get(is_cli ? ANAMAG_CATCONV : ANAMAG_CATCONA);
|
|
const TRectype& cat = cache().get(is_cli ? "CRA" : "CAA", catcon);
|
|
if (!cat.empty())
|
|
{
|
|
gr = cat.get_int("S1");
|
|
co = cat.get_int("S2");
|
|
so = cat.get_long("S3");
|
|
conto.set(gr,co,so);
|
|
}
|
|
}
|
|
if (conto.ok())
|
|
break;
|
|
}
|
|
else
|
|
if (tok == "GM" || tok == "SM" || tok == "RF")
|
|
{
|
|
if (skip_art_related) continue;
|
|
const bool is_fis = tok == "RF";
|
|
TString16 codtab = _anamag->get(is_fis ? ANAMAG_RAGGFIS : ANAMAG_GRMERC);
|
|
if (tok == "GM" && codtab.len() > 3)
|
|
codtab.cut(3); // gli ultimi 2 si riferiscono al sottogruppo.
|
|
const TRectype& tab = cache().get(is_fis ? "RFA" : "GMC", codtab);
|
|
if (!tab.empty())
|
|
{
|
|
gr = tab.get_int(is_cli ? "I3" : "I0");
|
|
co = tab.get_int(is_cli ? "I4" : "I1");
|
|
so = tab.get_long(is_cli ? "I5" : "I2");
|
|
conto.set(gr,co,so);
|
|
}
|
|
if (conto.ok()) break;
|
|
}
|
|
else
|
|
if (tok == "CV" || tok == "CC")
|
|
{
|
|
const bool is_cve = tok == "CV";
|
|
if (is_cve && !is_cli)
|
|
continue; // se e' un fornitore salta questa condizione
|
|
TString16 cod = is_cve ? r.doc().get(DOC_CATVEN) : EMPTY_STRING;
|
|
if (cod.empty())
|
|
{
|
|
if (skip_clifo) continue; // se non aveva trovato il cliente salta al prossimo
|
|
cod = _clifo->lfile(LF_CFVEN).get(is_cve ? CFV_CATVEN : CFV_CODCATC);
|
|
}
|
|
const TRectype& t = cache().get(is_cve ? "CVE" : "CCO", cod);
|
|
if (!t.empty())
|
|
{
|
|
const bool x =(is_cve || is_cli);
|
|
gr = t.get_int(x ? "I3" : "I0");
|
|
co = t.get_int(x ? "I4" : "I1");
|
|
so = t.get_long(x ? "I5": "I2");
|
|
conto.set(gr,co,so);
|
|
}
|
|
if (conto.ok())
|
|
break;
|
|
}
|
|
}
|
|
break; // case 'M'
|
|
}
|
|
case 'P': // righe prestazione
|
|
case 'S': // righe spese
|
|
{
|
|
const TRectype& tab = cache().get(t == 'P' ? "PRS" : "SPP", r.get(RDOC_CODART));
|
|
if (!tab.empty())
|
|
{
|
|
gr = tab.get_int(is_cli ? "I0" : "I3");
|
|
co = tab.get_int(is_cli ? "I1" : "I4");
|
|
so = tab.get_long(is_cli ? "I2" : "I5");
|
|
conto.set(gr,co,so);
|
|
if (!is_cli && !conto.ok())
|
|
{
|
|
gr = r.get_int("QTAGG1");
|
|
co = r.get_int("QTAGG2");
|
|
so = r.get_long("QTAGG3");
|
|
conto.set(gr,co,so);
|
|
}
|
|
}
|
|
|
|
if (!conto.find() && t == 'P') // Cerca il conto nella stringa di ricerca (solo per prestazioni)
|
|
{
|
|
TString16 tok;
|
|
// Scorre la stringa di ricerca ma solo per causale o CLI/FO
|
|
for (int i=0;i<items;i++)
|
|
{
|
|
tok = _search_seq.get(i);
|
|
if (tok == "CF")
|
|
{
|
|
if (skip_clifo) continue;
|
|
gr = cli_file.get_int(CLI_GRUPPORIC);
|
|
co = cli_file.get_int(CLI_CONTORIC);
|
|
so = cli_file.get_long(CLI_SOTTOCRIC);
|
|
conto.set(gr,co,so);
|
|
if (conto.ok()) break;
|
|
}
|
|
else
|
|
if (tok == "CA")
|
|
{
|
|
CHECK(_caus,"Causale documento non valida");
|
|
if (_caus->IVA2bill(codiva,conto)) break;
|
|
}
|
|
}
|
|
}
|
|
break; // case 'P','S'
|
|
}
|
|
case 'C':
|
|
// righe sconti: vengono considerate in adjust_sconto_rows()
|
|
case 'D': // righe descrizioni (saltare)
|
|
default :
|
|
break;
|
|
} // end of switch
|
|
return (conto.ok());
|
|
}
|
|
|
|
long TIni2Sql::get_protiva(const TDocumento& doc) const
|
|
{
|
|
long protiva = 0;
|
|
// solo se é un documento di spesa (chiedere??)
|
|
// e solo se é stato contabilizzato
|
|
if (!doc.tipo().is_generic())
|
|
{
|
|
// creo un cursore con
|
|
// tipocf, codcf, datareg = datadoc
|
|
TRelation relmov(LF_MOV);
|
|
TRectype da(LF_MOV);
|
|
da.put(MOV_TIPO, doc.tipocf());
|
|
da.put(MOV_CODCF, doc.codcf());
|
|
da.put(MOV_DATAREG, doc.data());
|
|
TCursor curmov(&relmov, "", 3, &da, &da);
|
|
TString str;
|
|
const TString& rif = doc.riferimento(str);
|
|
long count = curmov.items();
|
|
curmov = 0;
|
|
while ((curmov.pos() < count) && (protiva == 0))
|
|
{
|
|
TString desmov = curmov.curr().get(MOV_DESCR);
|
|
if (desmov.find(rif) >= 0)
|
|
protiva = curmov.curr().get_long(MOV_PROTIVA);
|
|
++curmov;
|
|
}
|
|
}
|
|
return protiva;
|
|
}
|
|
|
|
int TIni2Sql::get_tipo_doc(const TDocumento& doc) const
|
|
{
|
|
const TString4 codnum = doc.get(DOC_CODNUM);
|
|
int tipo = atoi(cache().get("%NUM", codnum, "I1"));
|
|
return tipo;
|
|
}
|
|
|
|
int TIni2Sql::get_tipo_dadoc(const TDocumento& doc) const
|
|
{
|
|
int datipo = 0;
|
|
for (int r = 1; r <= doc.rows(); r++)
|
|
{
|
|
const TRiga_documento& rdoc = doc[r];
|
|
const TString4 dacodnum = rdoc.get(RDOC_DACODNUM);
|
|
if (dacodnum.not_empty())
|
|
{
|
|
datipo = atoi(cache().get("%NUM", dacodnum, "I1"));
|
|
break;
|
|
}
|
|
}
|
|
return datipo;
|
|
}
|
|
|
|
|
|
bool TIni2Sql::get_fdaric_dadoc(const TDocumento& doc) const
|
|
{
|
|
bool daric = FALSE;
|
|
for (int r = 1; r <= doc.rows(); r++)
|
|
{
|
|
const TRiga_documento& rdoc = doc[r];
|
|
const TString4 dacodnum = rdoc.get(RDOC_DACODNUM);
|
|
if (dacodnum.not_empty())
|
|
{
|
|
daric = cache().get("%NUM", dacodnum).get_bool("B3");
|
|
break;
|
|
}
|
|
}
|
|
return daric;
|
|
}
|
|
|
|
// esegue l'elaborazione indicata
|
|
void TIni2Sql::validate(const TString& elabfield, TString& str)
|
|
{
|
|
TString tmpstr = "";
|
|
str="";
|
|
TToken_string s(elabfield, ',') ;
|
|
const TString code(s.get(0));
|
|
if (code == "_D") // campo da trasformare in data
|
|
{
|
|
tmpstr = _inputfile->get((s.get()));
|
|
TDate datactrl(tmpstr);
|
|
if (datactrl.ok())
|
|
str.format("TO_DATE('%s','dd-mm-yyyy')", (const char*) tmpstr);
|
|
}
|
|
else if (code == "_T") // campo da tagliare alla lunghezza indicata
|
|
{
|
|
int len = atoi(s.get(1));
|
|
tmpstr = s.get(2);
|
|
process_field(tmpstr, str, len, FALSE);
|
|
|
|
}
|
|
else if (code == "_DATAORA") // campo che contiene data e ora del momento
|
|
{
|
|
TDate today(TODAY);
|
|
char time[128];
|
|
_strtime(time);
|
|
str.format("TO_DATE('%s %s','dd-mm-yyyy hh24:mi:ss')", today.string(), time);
|
|
|
|
}
|
|
else if (code == "_FIRM") // campo ditta (01, 02, ...)
|
|
{
|
|
tmpstr = s.get();
|
|
if (tmpstr.empty())
|
|
str.format("%02ld", _firm);
|
|
else
|
|
str.format("%02ld%s", _firm, (const char*) tmpstr);
|
|
}
|
|
else if (code == "_UNICMOV") // campo UNICARCH nel caso di movimenti
|
|
{
|
|
const char* codcaus = _inputfile->get("CODCAUS","107");
|
|
const char* annoes = _inputfile->get("ANNOES", "107");
|
|
long numreg = _inputfile->get_long(MOVANA_NUMREGCG, "107");
|
|
if (numreg <= 0)
|
|
numreg = _inputfile->get_long(MOVANA_NUMREG, "107");
|
|
str.format("%s-%s-%ld", codcaus, annoes, numreg);
|
|
}
|
|
else if (code == "_UNICDOC") // campo UNICARCH nel caso di documenti
|
|
str.format("%s-%s-%s", (const char*) _inputfile->get("CODNUM", "33"), (const char*) _inputfile->get("ANNO", "33"), (const char*) _inputfile->get("NDOC", "33"));
|
|
else if (code == "_CODVAL") // campo codice valuta
|
|
{
|
|
tmpstr = _inputfile->get("CODVAL");
|
|
if ((tmpstr[0] == '"') || (tmpstr.empty()))
|
|
{
|
|
TExchange e;
|
|
tmpstr = e.get_value();
|
|
}
|
|
str = _configfile->get(tmpstr, "Codice valuta");
|
|
}
|
|
else if (code == "_ELSPESAMOV" || code == "_ELSPESADOC") // campo ELSPESA
|
|
{
|
|
TToken_string key;
|
|
if (code == "_ELSPESAMOV") // per righe movimenti
|
|
{
|
|
key = _inputfile->get("CODCONTO");
|
|
key.insert("|", 6);
|
|
key.insert("|", 3);
|
|
}
|
|
else // per righe documenti
|
|
key.format("%d|%d|%ld", _conto.gruppo(), _conto.conto(), _conto.sottoconto());
|
|
if (!key.empty_items())
|
|
{
|
|
key = cache().get(LF_PCON, key, "CODCBL");
|
|
str = cache().get(LF_ABPCON, key, "DESCRIZ");
|
|
str.cut(6);
|
|
str.upper();
|
|
}
|
|
else
|
|
str.cut(0);
|
|
}
|
|
else if (code == "_DESRMOV") // campo DESART per righe movimenti
|
|
{
|
|
process_field("DESCR", tmpstr, -1, FALSE);
|
|
str.format("%s-%s", (const char*) _inputfile->get("CODCAUS","107"), (const char*) tmpstr);
|
|
}
|
|
else if (code == "_DESMOV") // campo DESART per movimenti
|
|
{
|
|
process_field("DESCR", tmpstr, -1, FALSE);
|
|
str.format("%s (%s)", (const char*) tmpstr, (const char*) _inputfile->get("PROTIVA"));
|
|
}
|
|
else if (code == "_CODART") // campo CODART per movimenti
|
|
{
|
|
str = _inputfile->get("CODCONTO");
|
|
str.format("%d-%d-%ld", atoi(str.left(3)), atoi(str.mid(3,3)), atol(str.right(6)));
|
|
}
|
|
else if (code == "_IMPORTORMOV") // campo importo per righe movimenti
|
|
{
|
|
real importo(_inputfile->get("IMPORTO"));
|
|
//const int gruppo = atoi(_inputfile->get("GRUPPO"));
|
|
//const int conto = atoi(_inputfile->get("CONTO"));
|
|
TString80 codcosto;
|
|
codcosto = _inputfile->get("CODCCOSTO");
|
|
const int gruppo = atoi(codcosto.sub(0,3));
|
|
const int conto = atoi(codcosto.sub(3,3));
|
|
str = _inputfile->get("SEZIONE");
|
|
const char sezione = str[0];
|
|
if (test_swap_conto(gruppo, conto, sezione))
|
|
importo = importo * (-1);
|
|
str = importo.string();
|
|
}
|
|
else if (code == "_SEZIONERMOV") // campo sezione per righe movimenti
|
|
{
|
|
//const int gruppo = atoi(_inputfile->get("GRUPPO"));
|
|
//const int conto = atoi(_inputfile->get("CONTO"));
|
|
TString80 codcosto;
|
|
codcosto = _inputfile->get("CODCCOSTO");
|
|
const int gruppo = atoi(codcosto.sub(0,3));
|
|
const int conto = atoi(codcosto.sub(3,3));
|
|
str = _inputfile->get("SEZIONE");
|
|
const char sezione = str[0];
|
|
if (test_swap_conto(gruppo, conto, sezione))
|
|
{
|
|
if (sezione == 'D')
|
|
str = "A";
|
|
else if (sezione == 'A')
|
|
str = "D";
|
|
}
|
|
}
|
|
else if (code == "_DESDOC") // campo DESDOC per documenti
|
|
{
|
|
TString16 key = _doc->numerazione();
|
|
TString desnum = cache().get("%NUM", key, "S0");
|
|
key = _inputfile->get("TIPOCF");
|
|
key << '|' << _inputfile->get("CODCF");
|
|
TString ragsoc = cache().get(LF_CLIFO, key, "RAGSOC");
|
|
long protiva = get_protiva(*_doc);
|
|
str.format("%s-%s",(const char*) desnum, (const char*) ragsoc);
|
|
if (protiva != 0)
|
|
str << '(' << protiva << ')';
|
|
TString16 tipodoc = _doc->tipo().codice();
|
|
TToken_string descrizioni = _configfile->get(tipodoc, "Descrizioni");
|
|
TString16 separatore = _configfile->get("SEPARATORE", "Descrizioni");
|
|
TString80 cod;
|
|
FOR_EACH_TOKEN(descrizioni,tok)
|
|
{
|
|
cod = tok;
|
|
int virgola = cod.find(',');
|
|
if (virgola > -1)
|
|
{
|
|
TString80 prompt = cod.sub(0,virgola);
|
|
TString80 campo = cod.sub(virgola+1);
|
|
str << separatore;
|
|
str << prompt;
|
|
str << _doc->get(campo);
|
|
}
|
|
}
|
|
}
|
|
else if (code == "_TIPODOC") // campo TIPDOC
|
|
{
|
|
if (_doc != NULL)
|
|
{
|
|
const int tipodoc = get_tipo_doc(*_doc);
|
|
if (tipodoc == TTipo_documento::_ordine)
|
|
tmpstr = "O";
|
|
else if (tipodoc == TTipo_documento::_bolla)
|
|
{
|
|
// restituisce il tipo documento origine della prima riga che ha un doc. di origine
|
|
const int datipodoc = get_tipo_dadoc(*_doc); // si assume che sia il tipo documento di origine per tutto il documento
|
|
tmpstr = (datipodoc == TTipo_documento::_ordine) ? "BO" : "B";
|
|
}
|
|
else if (tipodoc == TTipo_documento::_fattura || tipodoc == TTipo_documento::_altro)
|
|
{
|
|
const bool daricevere = cache().get("%NUM", _doc->numerazione()).get_bool("B3");
|
|
if (daricevere)
|
|
tmpstr = "FR";
|
|
else if (tipodoc == TTipo_documento::_fattura)
|
|
{
|
|
const int datipodoc = get_tipo_dadoc(*_doc);
|
|
if (datipodoc == TTipo_documento::_bolla)
|
|
tmpstr = "FB";
|
|
else if (datipodoc == TTipo_documento::_ordine)
|
|
tmpstr = "FO";
|
|
else
|
|
{
|
|
const bool daric = get_fdaric_dadoc(*_doc);
|
|
tmpstr = daric ? "FF" : "F";
|
|
}
|
|
}
|
|
}
|
|
str = _configfile->get(tmpstr, "Tipo documento");
|
|
}
|
|
}
|
|
else if ((code == "_RIFORD") || (code == "_RIFBOL")) // campi RIFORD e RIFBOL
|
|
{
|
|
if (_dadoc != NULL)
|
|
{
|
|
const int ord_bol = get_tipo_doc(*_dadoc);
|
|
const bool daricevere = cache().get("%NUM", _dadoc->numerazione()).get_bool("B3");
|
|
if (((ord_bol == TTipo_documento::_ordine || daricevere) && (code == "_RIFORD")) || ((ord_bol == TTipo_documento::_bolla) && (code == "_RIFBOL")))
|
|
{
|
|
str << _dadoc->numerazione() << '-';
|
|
str << _dadoc->anno() << '-';
|
|
str << _dadoc->numero();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// prende nome campo di input indicato nel file crpa.ini (puo' essere un campo o una elaborazione)
|
|
// e mi restituisce il valore da inserire in VALUES
|
|
void TIni2Sql::process_field(const TString& inputfield, TString& tmpstr, int len, const bool apici)
|
|
{
|
|
tmpstr.cut(0);
|
|
if (inputfield.not_empty())
|
|
{
|
|
// campo elaborato
|
|
if (inputfield[0] == '!')
|
|
validate(inputfield.sub(1), tmpstr);
|
|
// valore fisso
|
|
else if (inputfield[0] == ':')
|
|
tmpstr = inputfield.sub(1);
|
|
// il campo va letto dai documenti o dalle righe
|
|
else if (inputfield[0] == '#')
|
|
leggidadoc(inputfield.sub(1), tmpstr);
|
|
// campo da leggere dal file di input
|
|
else if (inputfield == "CODVAL")
|
|
{
|
|
tmpstr = _inputfile->get(inputfield);
|
|
if ((tmpstr[0] == '"') || (tmpstr.empty()))
|
|
{
|
|
TExchange e;
|
|
tmpstr = e.get_value();
|
|
tmpstr = tmpstr.sub(0,2);
|
|
}
|
|
}
|
|
else if (inputfield == "CODCMS")
|
|
{
|
|
tmpstr = _inputfile->get(inputfield);
|
|
tmpstr.upper();
|
|
tmpstr.replace('/','_');
|
|
}
|
|
else if (inputfield == "FASCMS")
|
|
{
|
|
tmpstr = _inputfile->get(inputfield);
|
|
tmpstr.upper();
|
|
tmpstr.replace('/','_');
|
|
}
|
|
else if (inputfield == "CODCF")
|
|
{
|
|
long codcf = _inputfile->get_long(inputfield);
|
|
if (codcf != 0)
|
|
{
|
|
if (_firm == 2)
|
|
codcf+=100000;
|
|
tmpstr.format("%ld", codcf);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
tmpstr = _inputfile->get(inputfield);
|
|
if (tmpstr.find('.') >= 0 && real::is_real(tmpstr))
|
|
{
|
|
const real n = tmpstr;
|
|
tmpstr = n.string();
|
|
}
|
|
}
|
|
tmpstr.trim();
|
|
if (tmpstr.not_empty())
|
|
{
|
|
if ((tmpstr.sub(0,7) != "TO_DATE") && apici)
|
|
{
|
|
int l = tmpstr.find("'");
|
|
while (l >= 0)
|
|
{
|
|
tmpstr.insert("'",l);
|
|
l = tmpstr.find("'",l+2);
|
|
}
|
|
}
|
|
int l = tmpstr.len();
|
|
if ((tmpstr[0] == '"') && (tmpstr[l-1] == '"'))
|
|
tmpstr = tmpstr.sub(1,l-1);
|
|
tmpstr.trim();
|
|
if (len >= 0)
|
|
tmpstr.cut(len);
|
|
if (apici && tmpstr.not_empty() && (tmpstr.sub(0,7) != "TO_DATE"))
|
|
{
|
|
tmpstr.insert("'"); tmpstr << '\'';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// distruzione dell'applicazione
|
|
bool TIni2Sql::destroy()
|
|
{
|
|
delete _fcaus;
|
|
delete _frcaus;
|
|
delete _anamag;
|
|
delete _clifo;
|
|
delete _inputfile;
|
|
delete _configfile;
|
|
if (_sqlfile != NULL)
|
|
delete _sqlfile;
|
|
if (_doc != NULL)
|
|
delete _doc;
|
|
if (_dadoc != NULL)
|
|
delete _doc;
|
|
if (_rigadoc != NULL)
|
|
delete _rigadoc;
|
|
return TSkeleton_application::destroy();
|
|
}
|
|
|
|
void TIni2Sql::build_paragraph(const TString& paragrafo, TString& output)
|
|
{
|
|
output = paragrafo;
|
|
const int posvirgola = output.find(',');
|
|
if (posvirgola > 0)
|
|
output.cut(posvirgola);
|
|
}
|
|
|
|
int TIni2Sql::build_nriga(const TString& paragrafo)
|
|
{
|
|
int nriga = 0;
|
|
const int posvirgola = paragrafo.find(',');
|
|
if (posvirgola > 0)
|
|
nriga = atoi(paragrafo.sub(posvirgola+1));
|
|
return nriga;
|
|
}
|
|
|
|
bool TIni2Sql::search_conto_cespite(TBill& conto, const TRiga_documento& r)
|
|
{
|
|
int gr,co;
|
|
long so;
|
|
int codcat;
|
|
|
|
TString16 idcesp = r.get(RDOC_CODART);
|
|
if (idcesp.empty())
|
|
codcat = r.doc().get_int(DOC_NDOC);
|
|
else
|
|
{
|
|
const TRectype& cespi = cache().get(LF_CESPI, idcesp);
|
|
codcat = cespi.get_int("CODCAT");
|
|
}
|
|
TEsercizi_contabili esercizi;
|
|
int esc = esercizi.date2esc(r.doc().get_date(DOC_DATADOC));
|
|
TString16 str; str.format("%04d", esc);
|
|
|
|
TTable tabccb("CCB");
|
|
tabccb.put("CODTAB", str);
|
|
tabccb.read();
|
|
TString80 codtab = tabccb.get("CODTAB");
|
|
if (codtab.sub(0,4) == str)
|
|
{
|
|
int codgruppo = atoi(codtab.sub(5,6));
|
|
const char* codspecie = codtab.sub(7,10);
|
|
TLocalisamfile collces(LF_COLLCES);
|
|
collces.zero();
|
|
collces.put(COLLCES_CODGRUPPO, codgruppo);
|
|
collces.put(COLLCES_CODSPECIE, codspecie);
|
|
collces.put(COLLCES_CODCAT, codcat);
|
|
collces.read();
|
|
gr = collces.get_int(COLLCES_GRUPPOQNO);
|
|
co = collces.get_int(COLLCES_CONTOQNO);
|
|
so = collces.get_int(COLLCES_SOTTOCQNO);
|
|
conto.set(gr,co,so);
|
|
}
|
|
return (conto.ok());
|
|
}
|
|
|
|
// scrive il file che contiene il comando insert completo dei record da inserire
|
|
void TIni2Sql::write_sqlinsert()
|
|
{
|
|
bool is_cespite = false;
|
|
TString80 numcesp = _configfile->get("CodNum", "Cespiti");
|
|
TString_array lp;
|
|
if (_inputfile->list_paragraphs(lp) > 0)
|
|
{
|
|
bool almenounariga = false;
|
|
TString insert, colonne, valori;
|
|
_firm = _inputfile->get_int("Firm", "Transaction");
|
|
TString16 firm;
|
|
firm.format("%ld", _firm);
|
|
if (_configfile->get(firm, "Ditte")[0] == 'S')
|
|
{
|
|
if (_firm != get_firm())
|
|
{
|
|
set_firm(_firm);
|
|
_search_seq.cut(0); // Forzo ricostruzione della sequenza
|
|
}
|
|
FOR_EACH_ARRAY_ROW(lp, p, paragrafo)
|
|
{
|
|
if (*paragrafo == "Transaction")
|
|
{
|
|
}
|
|
else
|
|
{
|
|
TString strpar;
|
|
build_paragraph(*paragrafo, strpar);
|
|
insert.format("INSERT INTO %s", (const char*) _configfile->get("TABLE", strpar));
|
|
colonne = NULL;
|
|
valori = NULL;
|
|
_inputfile->set_paragraph(*paragrafo);
|
|
bool ok = TRUE; // se e' una riga va passata solo ad alcune condizioni
|
|
if (strpar == "33") // creo subito il TDocumento per usare tutti i metodi offerti gratis
|
|
{
|
|
if (_doc == NULL)
|
|
{
|
|
const TString16 codnum = _inputfile->get("CODNUM");
|
|
is_cespite = (codnum == numcesp);
|
|
const char provv = _inputfile->get("PROVV")[0];
|
|
const int anno = atoi(_inputfile->get("ANNO"));
|
|
const long numdoc = atol(_inputfile->get("NDOC"));
|
|
_doc = new TDocumento(provv, anno, codnum, numdoc);
|
|
_clifo->lfile().put(CLI_TIPOCF, _doc->tipocf());
|
|
_clifo->lfile().put(CLI_CODCF, _doc->codcf());
|
|
_clifo->read();
|
|
}
|
|
}
|
|
// se riga movimento deve avere gruppo inserito nel pragrafo gruppi di crpa.ini
|
|
if (strpar == "24")
|
|
{
|
|
const TString8 gruppo = _inputfile->get("GRUPPO");
|
|
ok = _configfile->get_bool(gruppo, "Gruppi");
|
|
}
|
|
if (strpar == "108")
|
|
{
|
|
TString16 gruppo = _inputfile->get("CODCONTO");
|
|
gruppo.cut(3);
|
|
gruppo.format("%d", atoi(gruppo));
|
|
ok = _configfile->get_bool(gruppo, "Gruppi");
|
|
}
|
|
// vecchia condizione: se riga documento deve avere codice iva oppure essere tipo riga spesa e avere gruppo 4 o 5 (andare su anamag con codart o )
|
|
// se riga documento preocedo come la contabilizzazione per cercare il gruppo-conto-sottoconto, che deve essere presente in crpa.ini
|
|
if (strpar == "34")
|
|
{
|
|
const TString8 codiva = _inputfile->get("CODIVA");
|
|
const TString8 tiporiga = _inputfile->get("TIPORIGA");
|
|
const char tiporigatab = cache().get("%TRI", tiporiga, "S7")[0];
|
|
ok = (codiva.not_empty()) || (tiporigatab == 'S');
|
|
if (ok)
|
|
{
|
|
const int nriga = build_nriga(*paragrafo);
|
|
if (nriga <= _doc->rows())
|
|
{
|
|
if (_caus != NULL)
|
|
_caus = NULL;
|
|
_rigadoc = new TRiga_documento((*_doc)[nriga]);
|
|
if (is_cespite)
|
|
ok = search_conto_cespite(_conto, (*_rigadoc));
|
|
else
|
|
ok = search_costo_ricavo(_conto, (*_rigadoc));
|
|
if (ok)
|
|
{
|
|
TString8 gruppos;
|
|
int gruppo = _conto.gruppo();
|
|
gruppos.format("%d", _conto.gruppo());
|
|
ok = (_configfile->get_bool(gruppos, "Gruppi"));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// verifico che la riga abbia una commessa
|
|
if ((ok) && (strpar == "24" || strpar == "34"))
|
|
{
|
|
TString80 codcms;
|
|
if (strpar == "24")
|
|
codcms = _inputfile->get("CODCMS");
|
|
if (strpar == "34")
|
|
{
|
|
if (_rigadoc != NULL)
|
|
codcms = _rigadoc->codice_commessa();
|
|
}
|
|
ok = codcms.not_empty();
|
|
}
|
|
if (ok)
|
|
{
|
|
if ((strpar=="24") || (strpar=="34") || (strpar=="108"))
|
|
almenounariga = true;
|
|
if ((strpar== "34") && (_rigadoc != NULL))
|
|
{
|
|
TString16 codnum = _rigadoc->get("DACODNUM");
|
|
const char provv = _rigadoc->get("DAPROVV")[0];
|
|
const int anno = _rigadoc->get_int("DAANNO");
|
|
const long numdoc = _rigadoc->get_long("DANDOC");
|
|
if (codnum.not_empty())
|
|
_dadoc = new TDocumento(provv, anno, (const char*) codnum, numdoc);
|
|
}
|
|
TString_array lv;
|
|
_configfile->list_variables(lv, TRUE, strpar);
|
|
TString16 key;
|
|
TString str;
|
|
TString risultato;
|
|
FOR_EACH_ARRAY_ROW(lv, r, row)
|
|
{
|
|
_inputfile->set_paragraph(*paragrafo);
|
|
key = row->get(0);
|
|
str = row->get();
|
|
if (strcmp(key,"TABLE") == 0)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
process_field(str, risultato);
|
|
if (risultato.not_empty())
|
|
{
|
|
if (colonne.len()>0)
|
|
colonne << ", ";
|
|
colonne << key;
|
|
if (valori.len()>0)
|
|
valori << ", ";
|
|
valori << risultato;
|
|
}
|
|
}
|
|
}
|
|
if (_rigadoc != NULL)
|
|
_rigadoc =NULL;
|
|
if (_dadoc != NULL)
|
|
_dadoc = NULL;
|
|
}
|
|
}
|
|
if (colonne.len() > 0)
|
|
{
|
|
colonne.insert(" ("); colonne << ") ";
|
|
valori.insert(" VALUES ("); valori << ") ";
|
|
|
|
*_sqlfile << insert << endl;
|
|
*_sqlfile << colonne << endl;
|
|
*_sqlfile << valori << endl;
|
|
*_sqlfile << SQL_EOL << endl;
|
|
}
|
|
}
|
|
if (!almenounariga)
|
|
{
|
|
if (_sqlfile != NULL)
|
|
delete _sqlfile;
|
|
_sqlfile = new ofstream("crpa.sql");
|
|
write_sqldelete();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// scrive il file che contiene il comando delete completo dei record da cancellare
|
|
void TIni2Sql::write_sqldelete()
|
|
{
|
|
TString_array lp;
|
|
if (_inputfile->list_paragraphs(lp) > 0)
|
|
{
|
|
TString cancella, condizione;
|
|
_firm = _inputfile->get_int("Firm", "Transaction");
|
|
|
|
TString strpar, risultato;
|
|
|
|
// Vado all'indietro per cancellare prima le righe e poi la testata
|
|
FOR_EACH_ARRAY_ROW_BACK(lp, p, paragrafo)
|
|
{
|
|
build_paragraph(*paragrafo, strpar);
|
|
const int numpar = atoi(strpar);
|
|
const int numrig = build_nriga(*paragrafo);
|
|
|
|
condizione.cut(0);
|
|
if (
|
|
(numpar == 107 || numpar == 33) || // Inizialmente era richiesto di cancellare solo le testate ...
|
|
((numpar == 108 || numpar == 34) && numrig == 1) // ... ovviamente ora non più
|
|
)
|
|
{
|
|
cancella.format("DELETE FROM %s", (const char*) _configfile->get("TABLE", strpar));
|
|
_inputfile->set_paragraph(*paragrafo);
|
|
|
|
process_field(_configfile->get("ARCH"), risultato);
|
|
if (risultato.not_empty())
|
|
condizione << "(ARCH=" << risultato << ')';
|
|
|
|
process_field(_configfile->get("UNICARCH"), risultato);
|
|
if (risultato.not_empty())
|
|
{
|
|
if (condizione.not_empty())
|
|
condizione << " AND ";
|
|
condizione << "(UNICARCH=" << risultato << ')';
|
|
}
|
|
}
|
|
|
|
if (condizione.not_empty())
|
|
{
|
|
condizione.insert(" WHERE ("); condizione << ") ";
|
|
*_sqlfile << cancella << condizione << endl;
|
|
*_sqlfile << SQL_EOL << endl;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// carica la maschera
|
|
void TIni2Sql::main_loop()
|
|
{
|
|
_sqlfile = new ofstream("crpa.sql");
|
|
|
|
TString16 action = _inputfile->get("Action", "Transaction");
|
|
action.upper();
|
|
switch (action[0])
|
|
{
|
|
case 'I':
|
|
write_sqlinsert();
|
|
break;
|
|
case 'D':
|
|
write_sqldelete();
|
|
break;
|
|
case 'M':
|
|
{
|
|
write_sqldelete();
|
|
write_sqlinsert();
|
|
}
|
|
break;
|
|
|
|
}
|
|
|
|
int err = 0;
|
|
|
|
if (_sqlfile != NULL)
|
|
{
|
|
_sqlfile->flush();
|
|
delete _sqlfile;
|
|
_sqlfile = NULL;
|
|
if (_configfile->get("Run", "Oracle") == "OK")
|
|
{
|
|
|
|
TString rigapar;
|
|
if ((_inputfilename[0] != '.') && (_inputfilename[1] != ':'))
|
|
_inputfilename.insert("./", 0);
|
|
rigapar << "crpa.exe crpa.sql " << _inputfilename;
|
|
TExternal_app esegui_sql(rigapar);
|
|
esegui_sql.run();
|
|
}
|
|
else
|
|
{
|
|
ifstream f("crpa.sql");
|
|
TString query;
|
|
TString header;
|
|
TString & buffer = get_tmp_string(4096);
|
|
char * b = buffer.get_buffer(4096);
|
|
|
|
header << "ODBC(" << _configfile->get("Connect") << ',' << _configfile->get("Username") << ',' <<_configfile->get("Password") << ")\n";
|
|
|
|
TODBC_recordset pmc40(header);
|
|
|
|
while (f.good())
|
|
{
|
|
f.getline(b, 4096);
|
|
query << buffer;
|
|
}
|
|
int err = pmc40.exec(query);
|
|
if (err != 0)
|
|
{
|
|
_inputfile->set("Result", "Error", "Transaction");
|
|
_inputfile->set("Error", err, "Transaction");
|
|
}
|
|
}
|
|
}
|
|
// non devo scrivere niente nelle tavole oracle
|
|
// ma devo comunque segnalare come eseguita la transazione altrimenti rimane nel postino
|
|
else
|
|
{
|
|
_inputfile->set("Result", "OK", "Transaction");
|
|
_inputfile->set("Error", "0", "Transaction");
|
|
}
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
TIni2Sql a;
|
|
a.run(argc, argv, TR("Trasferimento dati da EuroCampo"));
|
|
return 0;
|
|
}
|