0b6be77607
Files correlati : Ricompilazione Demo : [ ] Commento : handler di riga git-svn-id: svn://10.65.10.50/trunk@17794 c028cbd2-c16b-5b4b-a496-9718f37d4682
257 lines
7.9 KiB
C++
Executable File
257 lines
7.9 KiB
C++
Executable File
#include "../ve/ve0100.h"
|
||
#include "../ve/veini.h"
|
||
#include "../ve/veuml.h"
|
||
#include "../ve/verig.h"
|
||
|
||
#include "lv0.h"
|
||
#include "lvlib.h"
|
||
#include "lvcondv.h"
|
||
#include "lvrcondv.h"
|
||
|
||
//definizione della maschera di inserimento
|
||
class TGestione_bolle_msk : public TDocumento_mask
|
||
{
|
||
protected:
|
||
static bool lv_bolla_handler(TMask_field& f, KEY k);
|
||
static bool lv_qta_handler(TMask_field& f, KEY k);
|
||
public:
|
||
virtual void user_set_handler( int fieldid, int index);
|
||
virtual void user_set_row_handler(TMask& rm, int field, int index);
|
||
TGestione_bolle_msk(const char* tipodoc):TDocumento_mask(tipodoc) {}
|
||
};
|
||
|
||
bool TGestione_bolle_msk::lv_qta_handler(TMask_field& f, KEY k)
|
||
{
|
||
if (f.to_check(k, false))
|
||
{
|
||
TMask& msk = f.mask();
|
||
real ritirato = msk.get_real(FR_QTA);
|
||
if (msk.field(FR_QTAGG1).empty())
|
||
{
|
||
const int r = msk.get_sheet()->selected()+1;
|
||
TDocumento_mask& dmsk = (TDocumento_mask&) f.mask().get_sheet()->mask();
|
||
const TRiga_documento& rdoc = dmsk.doc()[r];
|
||
const TDocumento doc = rdoc.doc();
|
||
|
||
//recupero dal documento i dati di interesse per recuperare...
|
||
//...i dati dalla riga contratto
|
||
const long codcf = doc.get_long(DOC_CODCF);
|
||
const int indsped = doc.get_int(DOC_CODINDSP);
|
||
TDate datadoc = doc.get_date(DOC_DATADOC);
|
||
if (!datadoc.ok())
|
||
datadoc = TODAY;
|
||
const long codcont = lv_find_contract(codcf,indsped,datadoc);
|
||
//preparo la chiave per la tabella righe contratti
|
||
TToken_string keyrcont;
|
||
keyrcont.add(codcf);
|
||
keyrcont.add(codcont);
|
||
keyrcont.add(msk.get(FR_CODART));
|
||
//instanzio una cache sulla tabella delle righe contratti
|
||
const TRectype& rcont = cache().get(LF_LVRCONDV,keyrcont);
|
||
//recupero i dati di interesse dalla riga del contratto
|
||
const bool arrot = rcont.get_bool(LVRCONDV_ARROT);
|
||
|
||
//instanzio una cache sulla tabella del magazzino
|
||
const TRectype& anamag = cache().get(LF_ANAMAG,msk.get(FR_CODART));
|
||
//recupero i dati di interesse dall'anagrafica di magazzino
|
||
const real ppconf = anamag.get_real(ANAMAG_PPCONF);
|
||
|
||
if (arrot)
|
||
{
|
||
//calcolo di quanti pezzi sforo
|
||
long arr = ritirato.integer() % ppconf.integer();
|
||
//se sforo (arr > 0) allora calcolo quanti pezzi in pi<70> gli devo dare e aggiorno la quantit<69>
|
||
if (arr > 0)
|
||
{
|
||
arr = ppconf.integer() - arr;
|
||
ritirato += arr;
|
||
}
|
||
}
|
||
msk.set(FR_QTAGG1,ritirato);
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
bool TGestione_bolle_msk::lv_bolla_handler(TMask_field& f, KEY k)
|
||
{
|
||
bool ok = true;
|
||
switch(f.dlg())
|
||
{
|
||
case F_CODCF: ok = TDocumento_mask::clifo_handler( f, k ); break;
|
||
case F_DATADOC: ok = data_hndl( f, k ); break;
|
||
default: break;
|
||
}
|
||
|
||
if (ok && k == K_TAB && f.focusdirty())
|
||
{
|
||
TMask& msk = f.mask();
|
||
|
||
TDocumento_mask& dmsk = (TDocumento_mask&)msk;
|
||
TDocumento& doc = dmsk.doc();
|
||
|
||
static long stcodcf = 0, stcodcont = 0;
|
||
|
||
TSheet_field& sheet = dmsk.sfield(F_SHEET);
|
||
int nrighe = sheet.items();
|
||
|
||
const long codcf = msk.get_long(F_CODCF);
|
||
const int indsped = msk.get_int(F_CODINDSP);
|
||
TDate datadoc = msk.get_date(F_DATADOC);
|
||
if (!datadoc.ok())
|
||
datadoc = TODAY;
|
||
const int anno = datadoc.year();
|
||
|
||
if (codcf <= 0)
|
||
return true;
|
||
|
||
const long codcont = lv_find_contract(codcf,indsped,datadoc);
|
||
|
||
if (stcodcf == codcf && stcodcont == codcont && nrighe > 0)
|
||
return true;
|
||
|
||
if (codcont == 0)
|
||
return error_box(TR("Non ci sono contratti in essere alla data indicata"));
|
||
|
||
dmsk.mask2doc();
|
||
|
||
stcodcf = codcf;
|
||
stcodcont = codcont;
|
||
|
||
//elimino tutte le righe del documento
|
||
doc.destroy_rows();
|
||
|
||
//tipo riga
|
||
const TString4 tprig = msk.get(F_LBTIPORIGA);
|
||
|
||
//preparo la chiave per la tabella contratti
|
||
TToken_string keycont;
|
||
keycont.add(codcf);
|
||
keycont.add(codcont);
|
||
//instanzio una cache sulla tabella dei contratti
|
||
const TRectype& tcont = cache().get(LF_LVCONDV,keycont);
|
||
//estraggo i dati di interesse dalla cache
|
||
const int tplis = tcont.get_int(LVCONDV_TIPOLIS); //tipo listino
|
||
const bool prinbo = tcont.get_bool(LVCONDV_STPRZBOL); //prezzo in bolla
|
||
|
||
//instanzio un recordset sulle righe del contratto considerato
|
||
TISAM_recordset rcont("USE LVRCONDV\nFROM CODCF=#CODCF CODCONT=#CODCONT\nTO CODCF=#CODCF CODCONT=#CODCONT");
|
||
rcont.set_var("#CODCF",codcf);
|
||
rcont.set_var("#CODCONT",codcont);
|
||
|
||
//per ogni riga estraggo l'articolo, il relativo prezzo e l'eventaule sconto da applicare,
|
||
//...riportati in bolla solo se necessario
|
||
for (bool ok = rcont.move_first(); ok; ok = rcont.move_next())
|
||
{
|
||
//creo una nuova riga documento
|
||
TRiga_documento& rdoc = doc.new_row(tprig);
|
||
|
||
//recupero i dati di interesse dalla riga del contratto e li inserisco sullo sheet
|
||
const TString80 codart = rcont.get(LVRCONDV_CODART).as_string();
|
||
//instanzio una cache sulla tabella del magazzino
|
||
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
|
||
|
||
TString descr = anamag.get(ANAMAG_DESCR);
|
||
TString um = rcont.get(LVRCONDV_UM).as_string();
|
||
TString cau = rcont.get(LVRCONDV_CAUSLAV).as_string();
|
||
|
||
rdoc.put(RDOC_CODART,codart);
|
||
rdoc.put(RDOC_CODARTMAG,codart);
|
||
rdoc.put(RDOC_CHECKED,'X');
|
||
rdoc.put(RDOC_DESCR,anamag.get(ANAMAG_DESCR));
|
||
rdoc.put(RDOC_UMQTA,rcont.get(LVRCONDV_UM).as_string());
|
||
rdoc.put(RDOC_CAUSMAG,rcont.get(LVRCONDV_CAUSLAV).as_string());
|
||
|
||
//elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino
|
||
if (prinbo)
|
||
{
|
||
TString16 scontostr = "";
|
||
TString16 prezzostr = "";
|
||
real prezzo;
|
||
real sconto = rcont.get(LVRCONDV_SCONTPERC).as_real();
|
||
scontostr << sconto;
|
||
//controllo da dove devo prendere il prezzo
|
||
if (tplis == 0)
|
||
prezzo = rcont.get(LVRCONDV_PREZZO).as_real();
|
||
else
|
||
{
|
||
prezzo = anamag.get_real(ANAMAG_COSTSTD);
|
||
}
|
||
prezzostr << prezzo;
|
||
rdoc.put(RDOC_PREZZO,prezzo);
|
||
}
|
||
}
|
||
dmsk.doc2mask(false);
|
||
|
||
FOR_EACH_MASK_FIELD(dmsk, i, f)
|
||
{
|
||
if (f->has_check())
|
||
f->check(STARTING_CHECK);
|
||
if (f->is_edit())
|
||
f->on_hit();
|
||
}
|
||
}
|
||
return ok;
|
||
}
|
||
|
||
void TGestione_bolle_msk::user_set_row_handler(TMask& rm, int field, int index)
|
||
{
|
||
switch(index)
|
||
{
|
||
case 4101: set_field_handler(field, lv_qta_handler); break;
|
||
default : TDocumento_mask::user_set_row_handler(rm, field, index); break;
|
||
}
|
||
|
||
}
|
||
|
||
void TGestione_bolle_msk::user_set_handler( int fieldid, int index)
|
||
{
|
||
if (index == 4101)
|
||
set_field_handler(fieldid, lv_bolla_handler);
|
||
else
|
||
TDocumento_mask::user_set_handler(fieldid, index);
|
||
}
|
||
|
||
// Definizione della classe dell'applicazione motore
|
||
class TGestione_bolle_app : public TMotore_application
|
||
{
|
||
|
||
protected:
|
||
virtual TMask* get_mask( int mode );
|
||
public:
|
||
TGestione_bolle_app() {}
|
||
};
|
||
|
||
inline TGestione_bolle_app& gbapp() { return (TGestione_bolle_app &) main_app(); };
|
||
|
||
TMask* TGestione_bolle_app::get_mask( int mode )
|
||
{
|
||
if (mode == MODE_INS || mode == MODE_MOD)
|
||
{
|
||
TString4 tipodoc;
|
||
if (mode == MODE_MOD)
|
||
tipodoc = get_relation()->curr().get(DOC_TIPODOC); // Lo prendo dalla relazione (Gelai)
|
||
else
|
||
tipodoc = TMotore_application::get_mask(MODE_QUERY)->get(F_TIPODOC);
|
||
if (_doc_masks.objptr(tipodoc) == NULL)
|
||
{
|
||
TGestione_bolle_msk* m = new TGestione_bolle_msk(tipodoc);
|
||
_doc_masks.add(tipodoc, m);
|
||
const TTipo_documento& tdoc = m->doc().tipo();
|
||
const TString_array& handlers = tdoc.handlers();
|
||
FOR_EACH_ARRAY_ROW(handlers, i, row)
|
||
{
|
||
m->user_set_handler( row->get_int( 0 ), row->get_int( 1 ) );
|
||
}
|
||
}
|
||
}
|
||
return TMotore_application::get_mask(mode);
|
||
}
|
||
|
||
int lv3100( int argc, char* argv[])
|
||
{
|
||
TGestione_bolle_app a;
|
||
|
||
a.run( argc, argv, TR("Documenti di Trasporto"));
|
||
return 0;
|
||
} |