05f6b4d1eb
Files correlati : Commento : Aggiornati alcune personalizzazioni per poterle compilare sulla 12.0 git-svn-id: svn://10.65.10.50/branches/R_10_00@23223 c028cbd2-c16b-5b4b-a496-9718f37d4682
250 lines
6.1 KiB
C++
Executable File
250 lines
6.1 KiB
C++
Executable File
#include <applicat.h>
|
|
#include <automask.h>
|
|
#include <progind.h>
|
|
#include <utility.h>
|
|
#include <relation.h>
|
|
#include <textset.h>
|
|
#include <sheet.h>
|
|
|
|
#include "../mg/anamag.h"
|
|
#include "../mg/umart.h"
|
|
|
|
#include "ps1104.h"
|
|
#include "ps1104100a.h"
|
|
|
|
///////////////////////////////////////////////////////////
|
|
// TAutomask
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TImporta_penne_mask : public TAutomask
|
|
{
|
|
protected:
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
|
|
public:
|
|
TImporta_penne_mask();
|
|
};
|
|
|
|
TImporta_penne_mask::TImporta_penne_mask() :TAutomask ("ps1104100a")
|
|
{
|
|
}
|
|
|
|
bool TImporta_penne_mask::on_field_event(TOperable_field& f, TField_event e, long jolly)
|
|
{
|
|
switch (f.dlg())
|
|
{
|
|
//giochetto per avere la lista dei files validi nella directory di trasferimento!
|
|
case F_NAME:
|
|
if (e == fe_button)
|
|
{
|
|
TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"),
|
|
"File@32");
|
|
TFilename path = get(F_PATH);
|
|
path.add("*.csv"); //files delle testate
|
|
list_files(path, as.rows_array());
|
|
TFilename name;
|
|
FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
|
|
{
|
|
name = *row;
|
|
*row = name.name();
|
|
}
|
|
if (as.run() == K_ENTER)
|
|
{
|
|
f.set(as.row(as.selected()));
|
|
}
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
///////////////////////////////////////////////
|
|
//// CLASSI DERIVATE PER IMPORTAZIONE DATI ////
|
|
///////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
// Recordset specifici per i dati da trasferire
|
|
/////////////////////////////////////////////////////////////
|
|
class TImporta_penne_recordset : public TCSV_recordset
|
|
{
|
|
char _sep;
|
|
|
|
protected:
|
|
virtual TRecnotype new_rec(const char* buf = NULL);
|
|
|
|
public:
|
|
TImporta_penne_recordset(const char * fileName, char sep);
|
|
};
|
|
|
|
TRecnotype TImporta_penne_recordset::new_rec(const char* buf)
|
|
{
|
|
TToken_string str(256,'\t'); //nuovo record tab separator
|
|
|
|
if(buf && *buf)
|
|
{
|
|
bool apici = false;
|
|
|
|
for (const char* c = buf; *c ; c++)
|
|
{
|
|
if (*c == '"')
|
|
{
|
|
apici = !apici;
|
|
}
|
|
else
|
|
{
|
|
if (*c == _sep) //tipo di separatore dei campi che si trova nel record di origine
|
|
{
|
|
if (!apici)
|
|
str << str.separator();
|
|
else
|
|
str << *c;
|
|
}
|
|
else
|
|
str << *c;
|
|
}
|
|
}
|
|
}
|
|
|
|
const TRecnotype n = TText_recordset::new_rec(str);
|
|
|
|
if (n >= 0)
|
|
row(n).separator(str.separator());
|
|
|
|
return n;
|
|
}
|
|
|
|
|
|
TImporta_penne_recordset::TImporta_penne_recordset(const char * filename, char sep)
|
|
: TCSV_recordset("CSV(;)"), _sep(sep) //separatore
|
|
{
|
|
TString query;
|
|
query << "CSV(" << sep << ")\n"
|
|
<< "SELECT * FROM " << filename;
|
|
|
|
TFilename n;
|
|
if (parse_query(query, n) == _qt_select && n.exist())
|
|
load_file(n);
|
|
|
|
}
|
|
|
|
///////////////////////////////////////
|
|
// TSkeleton_application
|
|
///////////////////////////////////////
|
|
class TImporta_penne : public TSkeleton_application
|
|
{
|
|
virtual bool check_autorization() const { return false; }
|
|
virtual const char * extra_modules() const { return "ve"; }
|
|
|
|
TImporta_penne_mask* _msk;
|
|
|
|
protected:
|
|
|
|
public:
|
|
virtual bool create();
|
|
virtual bool destroy();
|
|
virtual void main_loop();
|
|
bool transfer(const TFilename& file);
|
|
|
|
TImporta_penne() {};
|
|
};
|
|
|
|
bool TImporta_penne::transfer(const TFilename& file)
|
|
{
|
|
//che tipo di separatore dei campi si e' scelto?
|
|
const char sep = _msk->get(F_SEP)[0];
|
|
//crea il recordset sul file di input utilizzando il separatore
|
|
TImporta_penne_recordset s(file, sep);
|
|
|
|
TProgind pi(s.items(),"Importazione articoli in corso ...",true,true);
|
|
|
|
//dichiarazione di files e record da usare;si fa qui per non doverla ripetere ad ogni record letto;
|
|
//il record rec_anamag e' generico e vuoto (anche rec_umart ovviamente)
|
|
TLocalisamfile anamag(LF_ANAMAG);
|
|
TRectype& rec_anamag = anamag.curr();
|
|
TLocalisamfile umart(LF_UMART);
|
|
TRectype& rec_umart = umart.curr();
|
|
|
|
//giro su tutti i record del recordset per importarli
|
|
for (bool ok = s.move_first(); ok; ok = s.move_next())
|
|
{
|
|
if (!pi.addstatus(1))
|
|
break;
|
|
|
|
//prende i dati dal record di input del file csv
|
|
//codart ci deve essere e va maiuscolizzato
|
|
TString80 codart = s.get(0).as_string();
|
|
if (codart.blank())
|
|
continue;
|
|
codart.upper();
|
|
//descrizione
|
|
const TString80 descr = s.get(1).as_string();
|
|
//prezzo (inizialmente come stringa x poter fare le replace)
|
|
TString80 str_prezzo = s.get(2).as_string();
|
|
str_prezzo.replace(',','.');
|
|
const real prezzo = str_prezzo;
|
|
//unita' di misura dalla maschera
|
|
const TString4 um = _msk->get(F_UMS);
|
|
|
|
//aggiorna i files ANAMAG e UMART
|
|
//ANAMAG
|
|
rec_anamag.put(ANAMAG_CODART, codart);
|
|
rec_anamag.put(ANAMAG_DESCR, descr);
|
|
//tenta la rewrite nel caso l'articolo esista gia'; se non esiste fa la write di brutto
|
|
int err = anamag.rewrite_write();
|
|
|
|
//UMART
|
|
//procede solo se la scrittura su anamag e' riuscita, in modo da evitare scritture incomplete
|
|
if (err == NOERR)
|
|
{
|
|
rec_umart.put(UMART_CODART, codart);
|
|
rec_umart.put(UMART_NRIGA, 1);
|
|
rec_umart.put(UMART_UM, um);
|
|
rec_umart.put(UMART_PREZZO, prezzo);
|
|
|
|
err = umart.rewrite_write();
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool TImporta_penne::create()
|
|
{
|
|
_msk = new TImporta_penne_mask();
|
|
return TSkeleton_application::create();
|
|
}
|
|
|
|
bool TImporta_penne::destroy()
|
|
{
|
|
delete _msk;
|
|
return TApplication::destroy();
|
|
}
|
|
|
|
void TImporta_penne::main_loop()
|
|
{
|
|
KEY tasto;
|
|
tasto = _msk->run();
|
|
if (tasto == K_ENTER)
|
|
{
|
|
//genero il nome del file da caricare
|
|
TFilename name = _msk->get(F_PATH);
|
|
name.add(_msk->get(F_NAME));
|
|
if (transfer(name))
|
|
{
|
|
message_box(TR("Importazione articoli completata"));
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
TImporta_penne& app() { return (TImporta_penne&) main_app(); }
|
|
|
|
|
|
int ps1104100 (int argc, char* argv[])
|
|
{
|
|
TImporta_penne main_app;
|
|
main_app.run(argc, argv, TR("Importazione articoli TENDER"));
|
|
return true;
|
|
} |