Files correlati : Ricompilazione Demo : [ ] Commento :aggiunti files discolatio alla 32 bit git-svn-id: svn://10.65.10.50/trunk@11035 c028cbd2-c16b-5b4b-a496-9718f37d4682
309 lines
8.7 KiB
C++
Executable File
309 lines
8.7 KiB
C++
Executable File
#include <applicat.h>
|
||
#include <automask.h>
|
||
#include <execp.h>
|
||
#include <filetext.h>
|
||
#include <isamrpc.h>
|
||
#include <mask.h>
|
||
#include <relation.h>
|
||
#include <tabutil.h>
|
||
#include <printer.h>
|
||
#include <progind.h>
|
||
#include <recarray.h>
|
||
#include <utility.h>
|
||
|
||
#include <doc.h>
|
||
#include <rdoc.h>
|
||
|
||
#include "dl0.h"
|
||
#include "dl0900a.h"
|
||
#include "dlutils.h"
|
||
|
||
|
||
/////////////////////////////////////////////////////
|
||
// Classe TSend_order: maschera //
|
||
/////////////////////////////////////////////////////
|
||
|
||
class TSend_ord_mask : public TAutomask
|
||
{
|
||
TRelation * _rel;
|
||
TCursor * _cur;
|
||
|
||
protected:
|
||
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||
public:
|
||
|
||
TSend_ord_mask();
|
||
|
||
virtual ~TSend_ord_mask(){};
|
||
};
|
||
|
||
TSend_ord_mask::TSend_ord_mask() :TAutomask ("dl0900a")
|
||
{
|
||
}
|
||
|
||
bool TSend_ord_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||
{
|
||
/* switch (o.dlg())
|
||
{
|
||
default:
|
||
break;
|
||
} */
|
||
return TRUE;
|
||
}
|
||
|
||
/////////////////////////////////////////////////////
|
||
// Classe TSend_order: applicazione principale //
|
||
/////////////////////////////////////////////////////
|
||
|
||
class TSend_ord: public TSkeleton_application
|
||
{
|
||
TMask* _msk;
|
||
TString _coddl, _codindsped, _codord, _statoini, _statoend,
|
||
_address, _path, _user, _password, _lastorddate, _lastordsent;
|
||
TFilename _filename;
|
||
TArray _testatedoc;
|
||
|
||
protected:
|
||
virtual bool create(void);
|
||
virtual void main_loop();
|
||
virtual bool destroy(void);
|
||
|
||
void select_ord(void);
|
||
bool send_ord(void);
|
||
|
||
public:
|
||
const TMask& msk() const { return *_msk; }
|
||
TSend_ord() {}
|
||
virtual ~TSend_ord() {}
|
||
};
|
||
|
||
// restituisce un riferimento all' applicazione
|
||
inline TSend_ord& app() { return (TSend_ord&) main_app();}
|
||
|
||
// creazione dell'applicazione
|
||
bool TSend_ord::create()
|
||
{
|
||
open_files(LF_DOC, LF_RIGHEDOC, 0);
|
||
_msk = new TMask("dl0900a");
|
||
// file di configurazione (discolat.ini); vengono letti i dati ed inviati alla maschera
|
||
TConfig config("discolat.ini","SENDORD");
|
||
_coddl = config.get("CODDL");
|
||
_codindsped = config.get("CODINDSPED");
|
||
_codord = config.get("CODORD");
|
||
_statoini = config.get("STATOINI");
|
||
_statoend = config.get("STATOEND");
|
||
_lastorddate = config.get("LASTORDDATE");
|
||
_lastordsent = config.get("LASTORDSENT");
|
||
_address = config.get("ADDRESS");
|
||
_path = config.get("PATH");
|
||
_user = config.get("USER");
|
||
_password = config.get("PASSWORD");
|
||
_msk->set(F_CODCLI, _coddl);
|
||
_msk->set(F_CODINDSPED, _codindsped);
|
||
_msk->set(F_CODNUM, _codord);
|
||
_msk->set(F_STATOINI, _statoini);
|
||
_msk->set(F_STATOEND, _statoend);
|
||
_msk->set(F_LASTORDDATE, _lastorddate);
|
||
_msk->set(F_LASTORDSENT, _lastordsent);
|
||
_msk->set(F_ORDINI, atol(_lastordsent)+1);
|
||
_msk->set(F_ADDRESS, _address);
|
||
_msk->set(F_PATH, _path);
|
||
_msk->set(F_USER, _user);
|
||
_msk->set(F_PASSWORD, _password);
|
||
|
||
return TSkeleton_application::create();
|
||
}
|
||
|
||
// distruzione dell'applicazione
|
||
bool TSend_ord::destroy()
|
||
{
|
||
delete _msk;
|
||
return TSkeleton_application::destroy();
|
||
}
|
||
|
||
// carica la maschera
|
||
void TSend_ord::main_loop()
|
||
{
|
||
// Preimposta gli eventuali valori specificati sulla riga di comando
|
||
//error_box("Attenzione: manca la configurazione del trasferimento!");
|
||
KEY key = K_ENTER;
|
||
while (key != K_QUIT)
|
||
{
|
||
key = _msk->run();
|
||
if (key == K_ENTER)
|
||
{
|
||
_coddl = _msk->get(F_CODCLI);
|
||
_codindsped = _msk->get(F_CODINDSPED);
|
||
_codord = _msk->get(F_CODNUM);
|
||
_statoini = _msk->get(F_STATOINI);
|
||
_statoend = _msk->get(F_STATOEND);
|
||
_lastorddate = _msk->get(F_LASTORDDATE);
|
||
_lastordsent = _msk->get(F_LASTORDSENT);
|
||
_address = _msk->get(F_ADDRESS);
|
||
_path = _msk->get(F_PATH);
|
||
_user = _msk->get(F_USER);
|
||
_password = _msk->get(F_PASSWORD);
|
||
|
||
select_ord();
|
||
bool ok = send_ord();
|
||
|
||
if (ok)
|
||
{
|
||
TConfig config("discolat.ini","SENDORD");
|
||
config.set("CODDL", _coddl);
|
||
config.set("CODINDSPED", _codindsped);
|
||
config.set("CODORD", _codord);
|
||
config.set("STATOINI", _statoini);
|
||
config.set("STATOEND", _statoend);
|
||
config.set("LASTORDDATE", _lastorddate);
|
||
config.set("LASTORDSENT", _lastordsent);
|
||
config.set("ADDRESS", _address);
|
||
config.set("PATH", _path);
|
||
config.set("USER", _user);
|
||
config.set("PASSWORD", _password);
|
||
//occhio ai campi disabilitati sulla maschera!
|
||
_msk->set(F_LASTORDDATE, _lastorddate);
|
||
_msk->set(F_LASTORDSENT, _lastordsent);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// selezione ordini da mandare
|
||
void TSend_ord::select_ord()
|
||
{
|
||
// relazione sui DOC; seleziona quelli con datadoc inclusa in intervallo, codnum=_codord ecc.
|
||
TRelation reldoc(LF_DOC);
|
||
|
||
long ordini = _msk->get_long(F_ORDINI);
|
||
long ordfine = _msk->get_long(F_ORDFINE);
|
||
const int anno = _msk->get_int(F_ANNO);
|
||
|
||
TRectype darec(LF_DOC), arec(LF_DOC);
|
||
|
||
darec.put(DOC_PROVV, "D");
|
||
darec.put(DOC_ANNO, anno);
|
||
darec.put(DOC_CODNUM, _codord);
|
||
darec.put(DOC_NDOC, ordini);
|
||
|
||
arec.put(DOC_PROVV, "D");
|
||
arec.put(DOC_ANNO, anno);
|
||
arec.put(DOC_CODNUM, _codord);
|
||
if (ordfine >= ordini)
|
||
arec.put(DOC_NDOC, ordfine);
|
||
|
||
TString filtro = "STATO==\"";
|
||
filtro<<_statoini<<"\"";
|
||
|
||
TCursor cursore (&reldoc, filtro, 1, &darec, &arec);
|
||
long nitems = cursore.items();
|
||
cursore.freeze();
|
||
|
||
TRectype riga(LF_RIGHEDOC);
|
||
TRecord_array righedoc(LF_RIGHEDOC,RDOC_NRIGA); //clamoroso recordarray del file 34 (righedoc)
|
||
TProgind pi(nitems, "Generazione ordini in corso...", FALSE, TRUE);
|
||
|
||
TString rigafile;
|
||
|
||
_filename = _path;
|
||
_filename.add(_coddl);
|
||
_filename.ext("txt");
|
||
ofstream out(_filename);
|
||
|
||
|
||
for (cursore=0;cursore.pos()<nitems;++cursore)
|
||
{
|
||
pi.addstatus(1);
|
||
const long ndoc = cursore.curr().get_long(DOC_NDOC);
|
||
const TDate datadoc = cursore.curr().get_date(DOC_DATADOC);
|
||
|
||
_testatedoc.add(cursore.curr());
|
||
|
||
//per ogni documento in testata (con chiave 1)...
|
||
riga.put(RDOC_CODNUM, _codord);
|
||
riga.put(RDOC_ANNO, datadoc.year());
|
||
riga.put(RDOC_PROVV, "D");
|
||
riga.put(RDOC_NDOC, ndoc);
|
||
|
||
//...scandisce tutte le sue righemov
|
||
righedoc.read(riga);
|
||
|
||
//aggiunge il file con nome _coddl+datadoc+ndoc al TStringarray con i nomi dei files
|
||
for (int i=1; i<=righedoc.rows(); i++)
|
||
{
|
||
const TRectype& rigai = righedoc[i];
|
||
const TString80 codart = rigai.get(RDOC_CODARTMAG);
|
||
const long qta = rigai.get_long(RDOC_QTA);
|
||
|
||
rigafile.format("%-6s%-4s%10s%7ld%3d%-20s%8ld%23s",
|
||
(const char *)_coddl, (const char *)_codindsped,(const char *)datadoc.string(),ndoc,i,(const char *)codart,qta,"");
|
||
out << rigafile;
|
||
}
|
||
|
||
//aggiorna il valore dell'ultimo ordine creato
|
||
_lastorddate = datadoc;
|
||
_lastordsent.format("%ld",ndoc);
|
||
}
|
||
|
||
}
|
||
|
||
// trasferimento files ordini
|
||
bool TSend_ord::send_ord()
|
||
{
|
||
// crea un file txt contenente i comandi per l'invio ftp
|
||
/* TFilename ftpsend = _path; ftpsend.add("ftps.txt");
|
||
ofstream out(ftpsend);
|
||
out << "USER " << _user << " " << _password << endl;
|
||
|
||
for (int i = 0; i < _listafiles.items(); i++)
|
||
out << "PUT " << _path << "/" << i << " " << _listafiles.row(i) << endl;
|
||
|
||
out << "QUIT" << endl;
|
||
out.close();
|
||
//crea un file .bat per eseguire i comandi ftp contenuti nel file di testo
|
||
TFilename ftpbat = _path; ftpbat.add("ftps.bat");
|
||
ofstream outbat(ftpbat);
|
||
outbat << "FTP -n " << _address << " < " << ftpsend;
|
||
outbat.close();
|
||
//stringa magica che permette l'esecuzione dei comandi ftp lanciando e chiudendo la shell dos
|
||
//COMSPEC e' la variabile d'ambiente che contiene l'indirizzo del command.com
|
||
// /c significa 'chiudi la shell dopo l'esecuzione del comando!'
|
||
TString cmd;
|
||
cmd << getenv("COMSPEC") << " /c " << ftpbat;
|
||
TExternal_app app(cmd);
|
||
app.run(TRUE, FALSE, FALSE, FALSE); */
|
||
|
||
TString site, service, authorization;
|
||
split_url(_address, site, service);
|
||
cifratura_laziale(_user, _password, authorization);
|
||
|
||
byte* answer = NULL;
|
||
size_t length = 0;
|
||
bool ok = http_post(site, service, _filename, authorization, answer, length);
|
||
|
||
if (ok)
|
||
{
|
||
message_box("Esito della transazione:\n%s", answer);
|
||
//se la transazione <20> andata a buon fine cambia stato ai documenti inviati
|
||
if (answer[0] == 'O' && answer[1] == 'K')
|
||
{
|
||
TLocalisamfile docfile(LF_DOC);
|
||
for (int i = _testatedoc.last(); i>=0; i--)
|
||
{
|
||
TRectype& doc = (TRectype&) _testatedoc[i];
|
||
doc.put(DOC_STATO, _statoend);
|
||
doc.rewrite(docfile);
|
||
}
|
||
}
|
||
}
|
||
|
||
return ok;
|
||
}
|
||
|
||
int dl0900(int argc, char* argv[])
|
||
{
|
||
TSend_ord a ;
|
||
a.run(argc, argv, "Invio ordini");
|
||
return 0;
|
||
}
|