Patch level : 10.0 patch 260

Files correlati     : lv2
Ricompilazione Demo : [ ]
Commento            :
Acquisizione da contapezzi - pronto per i test


git-svn-id: svn://10.65.10.50/trunk@18525 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca83 2009-03-16 16:30:01 +00:00
parent 0d264463b2
commit 81008377a7
3 changed files with 284 additions and 131 deletions

View File

@ -6,10 +6,11 @@
#include "lv2600a.h"
///////////////////////////////////////////////////////////
// TAcquisizione_msk
///////////////////////////////////////////////////////////
/////////////////////////////////
//// TACQUISIZIONE_MSK ////
/////////////////////////////////
//classe TAcquisizione_msk
class TAcquisizione_msk: public TAutomask
{
protected:
@ -18,33 +19,23 @@ public:
TAcquisizione_msk();
};
//ON_FIELD_EVENT: metodo che gestisce gli eventi sui campi della maschera
bool TAcquisizione_msk::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"),
HR("File@32"));
TFilename path = get(F_PATH);
path.add("*.dat"); //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;
case F_PATH:
//se il campo è vuoto, provo a scriverlo dalla configurazione
if (f.empty())
{
TConfig* configlv = new TConfig(CONFIG_DITTA,"lv");
TString path = configlv->get("PathContapezzi");
if (path.full())
f.set(path);
}
break;
default:
break;
}
return true;
}
@ -53,14 +44,14 @@ TAcquisizione_msk::TAcquisizione_msk():TAutomask("lv2600a")
{
}
///////////////////////////////////////////////////////////
// TAcquisizione_cache
///////////////////////////////////////////////////////////
///////////////////////////////////
//// TACQUISIZIONE_CACHE ////
///////////////////////////////////
//classe TAcquisizione_cache
class TAcquisizione_cache : TCache
{
TString4 _codnum,_tipodoc,_stato;
TString4 _codnum, _tipodoc, _stato;
protected:
virtual void discarding(const THash_object* obj);
@ -71,50 +62,51 @@ public:
TAcquisizione_cache();
};
//DISCARDING: metodo che salva un documento sul disco prima di eliminarlo dalla cache
void TAcquisizione_cache::discarding(const THash_object* obj)
{
TDocumento& doc = (TDocumento&)obj->obj();
doc.rewrite();
}
//KEY2OBJ: metodo che sceglie il documento giusto da disco in modo da poterlo continuare, o lo crea se non c'è
TObject* TAcquisizione_cache::key2obj(const char* key)
{
TToken_string chiave(key);
const TDate datadoc=chiave.get();
const long codcf=chiave.get_long();
const TDate datadoc = chiave.get();
const long codcf = chiave.get_long();
TString query;
query<< "USE DOC KEY 2 SELECT STATO=#STATO\n";
for (int i=0;i<2; i++)
for (int i = 0; i < 2; i++)
{
query << (i?"TO":"FROM") << " "
<< "TIPOCF=C CODCF=#CODCF ANNO=#ANNO DATADOC=#DATADOC CODNUM=#CODNUM\n";
query << (i ? "TO" : "FROM") << " "
<< "TIPOCF=C CODCF=#CODCF ANNO=#ANNO DATADOC=#DATADOC CODNUM=#CODNUM\n";
}
TISAM_recordset rset(query);
rset.set_var("#STATO",TVariant(_stato));
rset.set_var("#CODCF",codcf);
rset.set_var("#ANNO",long(datadoc.year()));
rset.set_var("#DATADOC",datadoc);
rset.set_var("#CODNUM",TVariant(_codnum));
rset.set_var("#STATO", TVariant(_stato));
rset.set_var("#CODCF", codcf);
rset.set_var("#ANNO", long(datadoc.year()));
rset.set_var("#DATADOC", datadoc);
rset.set_var("#CODNUM", TVariant(_codnum));
TDocumento* doc=NULL;
TDocumento* doc = NULL;
if (rset.move_first())
{
doc=new TDocumento(rset.cursor()->curr());
}
if (rset.move_first())
doc = new TDocumento(rset.cursor()->curr());
else
{
doc=new TDocumento('D',datadoc.year(),_codnum,0);
doc->put(DOC_TIPODOC,_tipodoc);
doc->put(DOC_STATO,_stato);
doc->put(DOC_DATADOC,datadoc);
doc->put(DOC_TIPOCF,"C");
doc->put(DOC_CODCF,codcf);
doc = new TDocumento('D',datadoc.year(),_codnum,0);
doc->put(DOC_TIPODOC, _tipodoc);
doc->put(DOC_STATO, _stato);
doc->put(DOC_DATADOC, datadoc);
doc->put(DOC_TIPOCF, "C");
doc->put(DOC_CODCF, codcf);
}
return doc;
}
//DOC: metodo che restituisce un puntatore ad un documento identificato dalla coppia data - cliente
TDocumento& TAcquisizione_cache::doc(const TDate& gg, const long cc)
{
TString16 key;
@ -122,66 +114,187 @@ TDocumento& TAcquisizione_cache::doc(const TDate& gg, const long cc)
return *(TDocumento*)objptr(key);
}
//metodo costruttore di una cache di 17 elementi
TAcquisizione_cache::TAcquisizione_cache() : TCache(17)
{
TConfig cfg(CONFIG_DITTA,"lv");
_codnum=cfg.get("NUM_RIT",NULL,0);
_tipodoc=cfg.get("TIPOOC_RIT",NULL,0);
_stato=cfg.get("STATO_RIT",NULL,0);
TConfig cfg(CONFIG_DITTA, "lv");
_codnum = cfg.get("NUM_RIT", NULL, 0);
_tipodoc = cfg.get("TIPOOC_RIT", NULL, 0);
_stato = cfg.get("STATO_RIT", NULL, 0);
}
///////////////////////////////////////////////////////////
// TAcquisizione_lavanderie_app
///////////////////////////////////////////////////////////
////////////////////////////////////////////
//// TACQUISIZIONE_LAVANDERIE_APP ////
////////////////////////////////////////////
//classe TAcquisizione_lavanderie_app
class TAcquisizione_lavanderie_app : public TSkeleton_application
{
TAcquisizione_msk* _msk;
protected:
virtual void main_loop();
virtual bool create();
virtual bool destroy();
void elabora_file(const TString& file, bool new_file);
public:
bool transfer();
virtual void main_loop();
};
//CREATE: metodo costruttore
bool TAcquisizione_lavanderie_app::create()
{
_msk = new TAcquisizione_msk();
TSheet_field& sheet = _msk->sfield(F_SHEET_NAME);
sheet.set_auto_append();
return TSkeleton_application::create();
}
//DESTROY: metodo distruttore
bool TAcquisizione_lavanderie_app::destroy()
{
delete _msk;
return TApplication::destroy();
}
//ELABORA_FILE: metodo che effettivamente fa l'elaborazione del file, creando i documenti
void TAcquisizione_lavanderie_app::elabora_file(const TString& file, bool new_file)
{
TAcquisizione_cache ca;
//scandisco il file
TScanner s(file);
while (s.ok())
{
TString80 riga = s.line();
if (riga.blank())
continue;
TDate datadoc;
long codcf;
TString80 codart;
long qta;
long rotti;
long ndoc;
TString16 tipo_conteggio;
TString80 operatore;
//controllo quale tracciato record devo seguire
if (riga.len() == 34) // -> MONTANARI
{
//leggo i campi dalla riga del file
datadoc.set_day(atoi(riga.mid(0,2)));
datadoc.set_month(atoi(riga.mid(2,2)));
datadoc.set_year(atoi(riga.mid(4,4)));
codcf = atol(riga.mid(8,6));
codart = riga.mid(14,8);
qta = atol(riga.mid(22,6));
rotti = atol(riga.mid(28,6));
}
else if (riga.len() == 121) // ->SKEMA
{
//leggo i campi dalla riga del file
TDate datadoc;
datadoc.set_year(atoi(riga.mid(0,4)));
datadoc.set_month(atoi(riga.mid(4,2)));
datadoc.set_day(atoi(riga.mid(6,2)));
codart = riga.mid(8,20);
codcf = atol(riga.mid(28,20));
qta = atoi(riga.mid(48,11));
ndoc = atoi(riga.mid(59,11));
switch (atoi(riga.mid(70,11)))
{
case 1: tipo_conteggio = "Automatico"; break;
case 2: tipo_conteggio = "Manuale"; break;
case 3: tipo_conteggio = "Scarto"; break;
default: break;
}
operatore = riga.mid(81,40);
}
bool found = false;
TDocumento& doc = ca.doc(datadoc,codcf);
//cerco se esiste già una riga sul documento selezionato per quell'articolo;
//se la trovo sommo la quantità appena letta a quella già esistente,
//altrimenti creo una nuova riga documento
if (doc.rows() > 0 && new_file)
{
if (!yesno_box(TR("ATTENZIONE: il documento che si sta importando esiste già!\nSi desidera continuare?")))
return;
else if (yesno_box(TR("ATTENZIONE: Si desidera sovrascrivere il documento esistente(rispondendo NO le quantità verranno sommate a quelle esistenti)?")))
doc.destroy_rows();
}
for (int i = 1; i <= doc.rows(); i++)
{
TRiga_documento& rdoc = doc[i];
if (rdoc.get(RDOC_CODART) == codart)
{
long qtardoc = rdoc.get_long(RDOC_QTA);
qtardoc += qta;
rdoc.put(RDOC_QTA,qtardoc);
found = true;
break;
}
}
if (found == false)
{
TRiga_documento& rdoc = doc.new_row("01");
rdoc.put(RDOC_CODART,codart);
rdoc.put(RDOC_QTA,qta);
}
new_file = false;
}
}
//TRANSFER: metodo che scorre i campi nome e, se sono pieni, richiama il metodo
//ELABORA_FILE(), che effettivamente fa l'elaborazione
bool TAcquisizione_lavanderie_app::transfer()
{
//prendo il path dalla maschera
const TString& path = _msk->get(F_PATH);
TSheet_field& sheet = _msk->sfield(F_SHEET_NAME);
TFilename file;
//per ogni riga dello sheet, leggo il suo contenuto, se contiene dei caratteri jolly
//preparo la lista dei file che soddisfano la maschera in quella directory e li elaboro
//tutti, altrimenti elaboro esattamente il file che è scritto sullo sheet
FOR_EACH_SHEET_ROW(sheet, r1, row1)
{
if(row1->full())
{
file = path;
file.add(*row1);
if (file.find('*') >= 0 || file.find('?') >= 0)
{
TString_array lista_file;
list_files(file, lista_file);
FOR_EACH_ARRAY_ROW(lista_file, r2, row2)
elabora_file(*row2, true);
}
else
elabora_file(file, true);
}
}
return true;
}
void TAcquisizione_lavanderie_app::main_loop()
{
TAcquisizione_msk msk;
while (msk.run()!=K_QUIT)
{
TFilename name;
name=msk.get(F_PATH);
name.add(msk.get(F_NAME));
TAcquisizione_cache ca;
TCSV_recordset csvbolle(name);
for(bool ok=csvbolle.move_first(); ok; ok=csvbolle.move_next())
{
const long cli = csvbolle.get(0).as_int();
const TDate dtdoc = csvbolle.get(1).as_date();
const TString80 codart = csvbolle.get(2).as_string();
const long qta = csvbolle.get(3).as_int();
const TString4 um= csvbolle.get(4).as_string();
bool found=false;
TDocumento& doc = ca.doc(dtdoc,cli);
for (int i=1; doc.rows(); i++)
{
TRiga_documento& rdoc = doc[i];
if (rdoc.get(RDOC_CODART)==codart)
{
long qtardoc = rdoc.get_long(RDOC_QTA);
qtardoc+=qta;
rdoc.put(RDOC_QTA,qtardoc);
found=true;
break;
}
}
if (found==false)
{
TRiga_documento& rdoc = doc.new_row("01");
rdoc.put(RDOC_CODART,codart);
rdoc.put(RDOC_QTA,qta);
}
}
}
while (_msk->run() == K_ENTER)
transfer();
}
int lv2600(int argc, char *argv[])

View File

@ -1,2 +1,7 @@
#define F_PATH 101
#define F_NAME 102
//Acquisizione da contapezzi
//Campi Maschera lv2600a
#define F_PATH 201
#define F_SHEET_NAME 202
//campo dello sheet
#define F_S_NAME 101

View File

@ -1,37 +1,72 @@
#include "lv2600a.h"
PAGE "Aquisizione" -1 -1 40 5
TOOLBAR "Topbar" 0 0 0 2
GROUPBOX DLG_NULL 76 4
BEGIN
PROMPT 2 4 "@bSorgente"
END
STRING F_PATH 256 39
BEGIN
PROMPT 3 5 "Cartella "
DSELECT
CHECKTYPE REQUIRED
END
STRING F_NAME 18
BEGIN
PROMPT 3 6 "File "
CHECKTYPE REQUIRED
END
STRING DLG_PROFILE 50
BEGIN
PROMPT 1 -1 "Profilo "
SHEET PSELECT
FLAGS "H"
END
ENDPAGE
TOOLBAR "" 0 0 0 2
#include <elabar.h>
ENDPAGE
PAGE "Aquisizione da Contapezzi" -1 -1 80 10
STRING DLG_PROFILE 50
BEGIN
PROMPT 1 -1 "Profilo "
PSELECT
FLAGS "H"
END
GROUPBOX DLG_NULL 78 3
BEGIN
PROMPT 1 1 "@bSorgente"
END
STRING F_PATH 255 50
BEGIN
PROMPT 10 2 "Cartella "
DSELECT
CHECKTYPE REQUIRED
END
SPREADSHEET F_SHEET_NAME 78 10
BEGIN
PROMPT 1 5 "Nomi file"
ITEM "Nome file"
END
ENDPAGE
ENDMASK
PAGE "Nomi file" -1 -1 80 3
GROUPBOX DLG_NULL 78 3
BEGIN
PROMPT 1 1 "@bNome file"
END
STRING F_S_NAME 68
BEGIN
PROMPT 3 2 "File "
END
ENDPAGE
TOOLBAR "" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT 2 1 "Elimina"
MESSAGE EXIT,K_DEL
PICTURE BMP_DELREC
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 4 1 ""
END
ENDPAGE
ENDMASK