Patch level :10.0
Files correlati : Ricompilazione Demo : [ ] Commento : aggiunta la trattazione degli arrotondamenti git-svn-id: svn://10.65.10.50/trunk@19471 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
d01fb5405e
commit
0cf8d61a82
108
ve/ve2700.cpp
108
ve/ve2700.cpp
@ -44,8 +44,10 @@ protected:
|
|||||||
void add_art(); //aggiunge un articolo ai listini (on_field)
|
void add_art(); //aggiunge un articolo ai listini (on_field)
|
||||||
void save_listini(); //salva tutte le righe listini (padre e figli) così come sono sullo sheet (on_field)
|
void save_listini(); //salva tutte le righe listini (padre e figli) così come sono sullo sheet (on_field)
|
||||||
|
|
||||||
real get_price(TSheet_field& sf, const int row, const int col) const;
|
real get_price(TSheet_field& sf, const int row, const short dlg_id) const;
|
||||||
void set_price(TSheet_field& sf, const int row, const int col, real& price);
|
void set_price(TSheet_field& sf, const int row, const short dlg_id, real& price);
|
||||||
|
void set_price(const short fld_id, real& price);
|
||||||
|
bool arrotonda(const short dlg_id, real& price);
|
||||||
void get_correct_grmerc(TString& grmerc, const bool asterisk) const;
|
void get_correct_grmerc(TString& grmerc, const bool asterisk) const;
|
||||||
|
|
||||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||||
@ -201,9 +203,11 @@ void TAggiorna_listini_edit_mask::save_children_list()
|
|||||||
|
|
||||||
//metodi F_MULTILISTINI
|
//metodi F_MULTILISTINI
|
||||||
|
|
||||||
real TAggiorna_listini_edit_mask::get_price(TSheet_field& sf, const int row, const int col) const
|
//prende il prezzo del padre e sostituisce i '.' con le ','
|
||||||
|
real TAggiorna_listini_edit_mask::get_price(TSheet_field& sf, const int row, const short dlg_id) const
|
||||||
{
|
{
|
||||||
if (col == sf.cid2index(S2_PREZZO))
|
const int col = sf.cid2index(dlg_id);
|
||||||
|
if (dlg_id == S2_PREZZO)
|
||||||
{
|
{
|
||||||
TString16 str_prezzo = sf.cell(row, col);
|
TString16 str_prezzo = sf.cell(row, col);
|
||||||
str_prezzo.strip(".");
|
str_prezzo.strip(".");
|
||||||
@ -213,9 +217,59 @@ real TAggiorna_listini_edit_mask::get_price(TSheet_field& sf, const int row, con
|
|||||||
return real(sf.cell(row, col));
|
return real(sf.cell(row, col));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TAggiorna_listini_edit_mask::set_price(TSheet_field& sf, const int row, const int col, real& price)
|
bool TAggiorna_listini_edit_mask::arrotonda(const short dlg_id, real& price)
|
||||||
{
|
{
|
||||||
|
TString str_arr;
|
||||||
|
const bool is_father_list = dlg_id == S2_PREZZO;
|
||||||
|
if (is_father_list)
|
||||||
|
{
|
||||||
|
str_arr = get(F_ARROTONDA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
TSheet_field& figli = sfield(F_LISTINI_FIGLI);
|
||||||
|
str_arr = figli.cell(dlg_id - S2_LIST1, figli.cid2index(S1_ARROTONDA));
|
||||||
|
}
|
||||||
|
str_arr.replace(',', '.');
|
||||||
|
const real num_arr = abs(real(str_arr));
|
||||||
|
if (!num_arr.is_zero())
|
||||||
|
{
|
||||||
|
price /= num_arr;
|
||||||
|
switch (str_arr[0])
|
||||||
|
{
|
||||||
|
case '+': price.ceil(); break;
|
||||||
|
case '-': price.floor(); break;
|
||||||
|
default : price.round(); break;
|
||||||
|
}
|
||||||
|
price *= num_arr;
|
||||||
|
}
|
||||||
|
else //se non specificato alcun arrotondamento usa quello standard dei prezzi
|
||||||
|
{
|
||||||
|
const TPrice p(price);
|
||||||
|
price = p.get_num();
|
||||||
|
}
|
||||||
|
return is_father_list;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TAggiorna_listini_edit_mask::set_price(TSheet_field& sf, const int row, const short dlg_id, real& price)
|
||||||
|
{
|
||||||
|
const bool is_father_list = arrotonda(dlg_id, price);
|
||||||
|
const int prezzo_pos = sf.cid2index(dlg_id);
|
||||||
|
|
||||||
|
if (is_father_list)
|
||||||
|
sf.row(row).add(price.stringa(), prezzo_pos);
|
||||||
|
else
|
||||||
|
sf.row(row).add(price.string(), prezzo_pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TAggiorna_listini_edit_mask::set_price(const short fld_id, real& price)
|
||||||
|
{
|
||||||
|
const bool is_father_list = arrotonda(fld_id, price);
|
||||||
|
if (is_father_list)
|
||||||
|
set(fld_id, price.stringa());
|
||||||
|
else
|
||||||
|
set(fld_id, price.string());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -354,7 +408,7 @@ void TAggiorna_listini_edit_mask::fill_multilistini_sheet()
|
|||||||
//dati riga corrente
|
//dati riga corrente
|
||||||
const TString& codart = recset_rows.get(RCONDV_CODRIGA).as_string();
|
const TString& codart = recset_rows.get(RCONDV_CODRIGA).as_string();
|
||||||
const TString& um = recset_rows.get(RCONDV_UM).as_string();
|
const TString& um = recset_rows.get(RCONDV_UM).as_string();
|
||||||
const real prezzo = recset_rows.get(RCONDV_PREZZO).as_real();
|
real prezzo = recset_rows.get(RCONDV_PREZZO).as_real();
|
||||||
//cerca se esiste o se deve aggiungerla: la find_cor_add_odart restituisce il numero della riga alta..
|
//cerca se esiste o se deve aggiungerla: la find_cor_add_odart restituisce il numero della riga alta..
|
||||||
//..(descrizione/um) del codart in questione (che starà la riga sotto, ovvero riga_alta+1)
|
//..(descrizione/um) del codart in questione (che starà la riga sotto, ovvero riga_alta+1)
|
||||||
const int riga_alta = find_or_add_codart(sf_multilistini, codart, um);
|
const int riga_alta = find_or_add_codart(sf_multilistini, codart, um);
|
||||||
@ -363,21 +417,23 @@ void TAggiorna_listini_edit_mask::fill_multilistini_sheet()
|
|||||||
//mette il prezzo al posto giusto (padre e figlio)
|
//mette il prezzo al posto giusto (padre e figlio)
|
||||||
if (pos <= 0) //padre
|
if (pos <= 0) //padre
|
||||||
{
|
{
|
||||||
const TPrice prezzo_base(prezzo);
|
set_price(sf_multilistini, riga_bassa, S2_PREZZO, prezzo);
|
||||||
sf_multilistini.row(riga_bassa).add(prezzo_base.string(true), prezzo_pos);
|
//il padre viene arrotondato al suo arrotondamento (se c'e')
|
||||||
|
//sf_multilistini.row(riga_bassa).add(prezzo.stringa(), prezzo_pos + pos);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
//nella riga alta visualizza prezzo originale (no arrotondamento)
|
||||||
sf_multilistini.row(riga_alta).add(prezzo.string(), prezzo_pos + pos);
|
sf_multilistini.row(riga_alta).add(prezzo.string(), prezzo_pos + pos);
|
||||||
sf_multilistini.row(riga_bassa).add(prezzo.string(), prezzo_pos + pos);
|
set_price(sf_multilistini, riga_bassa, S2_PREZZO + pos, prezzo);
|
||||||
real fath_prezzo = get_price(sf_multilistini, riga_bassa, prezzo_pos);
|
real fath_prezzo = get_price(sf_multilistini, riga_bassa, S2_PREZZO);
|
||||||
//se il figlio ha un prezzo ma il padre no, ricalcola il valore dell'articolo nel padre usando il ricarico
|
//se il figlio ha un prezzo ma il padre no, ricalcola il valore dell'articolo nel padre usando il ricarico
|
||||||
if (fath_prezzo.is_zero())
|
if (fath_prezzo.is_zero())
|
||||||
{
|
{
|
||||||
TSheet_field& listini_figli = sfield(F_LISTINI_FIGLI);
|
TSheet_field& listini_figli = sfield(F_LISTINI_FIGLI);
|
||||||
const real ricarico = listini_figli.cell(pos - 1, listini_figli.cid2index(S1_RICARICO));
|
const real ricarico = listini_figli.cell(pos - 1, listini_figli.cid2index(S1_RICARICO));
|
||||||
const TPrice prezzo_base(prezzo * CENTO / (CENTO + ricarico));
|
real prezzo_base(prezzo * CENTO / (CENTO + ricarico));
|
||||||
sf_multilistini.row(riga_bassa).add(prezzo_base.string(true), prezzo_pos);
|
set_price(sf_multilistini, riga_bassa, S2_PREZZO, prezzo_base);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} //for(bool ok..
|
} //for(bool ok..
|
||||||
@ -395,20 +451,18 @@ void TAggiorna_listini_edit_mask::update_sons_prices()
|
|||||||
//PrezzoNuovoFiglio = Ricaricofiglio * PrezzoPadre (questo vale per ogni articolo)
|
//PrezzoNuovoFiglio = Ricaricofiglio * PrezzoPadre (questo vale per ogni articolo)
|
||||||
TSheet_field& sf_figli = sfield(F_LISTINI_FIGLI);
|
TSheet_field& sf_figli = sfield(F_LISTINI_FIGLI);
|
||||||
TSheet_field& sf_listini = sfield(F_MULTILISTINI);
|
TSheet_field& sf_listini = sfield(F_MULTILISTINI);
|
||||||
const int fath_prezzo_pos = sf_listini.cid2index(S2_PREZZO);
|
|
||||||
|
|
||||||
FOR_EACH_SHEET_ROW(sf_figli, r, riga_figlio)
|
FOR_EACH_SHEET_ROW(sf_figli, r, riga_figlio)
|
||||||
{
|
{
|
||||||
const real ricarico = riga_figlio->get(2);
|
const real ricarico = riga_figlio->get(2);
|
||||||
const int son_prezzo_pos = fath_prezzo_pos + 1 + r;
|
|
||||||
FOR_EACH_SHEET_ROW(sf_listini, i, riga) if (riga->get_char(0) > ' ') //è come dire checked (ignoranti!)
|
FOR_EACH_SHEET_ROW(sf_listini, i, riga) if (riga->get_char(0) > ' ') //è come dire checked (ignoranti!)
|
||||||
{
|
{
|
||||||
const real old_son_prezzo = sf_listini.cell(i - 1, son_prezzo_pos);
|
const real old_son_prezzo = get_price(sf_listini, i - 1, S2_LIST1 + r);
|
||||||
if (old_son_prezzo > ZERO)
|
if (old_son_prezzo > ZERO)
|
||||||
{
|
{
|
||||||
const real fath_prezzo = get_price(sf_listini, i, fath_prezzo_pos);
|
const real fath_prezzo = get_price(sf_listini, i, S2_PREZZO);
|
||||||
const TPrice son_prezzo = fath_prezzo * (CENTO + ricarico) / CENTO;
|
real son_prezzo = fath_prezzo * (CENTO + ricarico) / CENTO;
|
||||||
riga->add(son_prezzo.get_num().string(), son_prezzo_pos);
|
set_price(sf_listini, i, S2_LIST1 + r, son_prezzo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -587,7 +641,7 @@ void TAggiorna_listini_edit_mask::save_listini()
|
|||||||
const TString& um = recset_rows.get(RCONDV_UM).as_string();
|
const TString& um = recset_rows.get(RCONDV_UM).as_string();
|
||||||
//cerca sullo sheet la coppia codart+um
|
//cerca sullo sheet la coppia codart+um
|
||||||
const int riga_alta = find_codart(sf_listini, codart, um);
|
const int riga_alta = find_codart(sf_listini, codart, um);
|
||||||
const real prezzo = get_price(sf_listini, riga_alta + 1, prezzo_pos + pos);
|
const real prezzo = get_price(sf_listini, riga_alta + 1, S2_PREZZO + pos);
|
||||||
//se non la trova o se il prezzo è 0 elimina la riga dal file
|
//se non la trova o se il prezzo è 0 elimina la riga dal file
|
||||||
if (riga_alta < 0 || prezzo == ZERO)
|
if (riga_alta < 0 || prezzo == ZERO)
|
||||||
file.remove();
|
file.remove();
|
||||||
@ -598,7 +652,7 @@ void TAggiorna_listini_edit_mask::save_listini()
|
|||||||
//alla fine della storia registra tutto lo sheet sul file
|
//alla fine della storia registra tutto lo sheet sul file
|
||||||
FOR_EACH_SHEET_ROW(sf_listini, r, riga) if ((r & 1) && (riga->get_char(0) > ' ')) //è come dire riga dispari e checked (ignoranti!)
|
FOR_EACH_SHEET_ROW(sf_listini, r, riga) if ((r & 1) && (riga->get_char(0) > ' ')) //è come dire riga dispari e checked (ignoranti!)
|
||||||
{
|
{
|
||||||
const real prezzo = get_price(sf_listini, r, prezzo_pos + pos);
|
const real prezzo = get_price(sf_listini, r, S2_PREZZO + pos);
|
||||||
if (prezzo > ZERO)
|
if (prezzo > ZERO)
|
||||||
{
|
{
|
||||||
const TString codart = riga->get(1);
|
const TString codart = riga->get(1);
|
||||||
@ -696,6 +750,11 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
|
|||||||
else //se invece viene cambiato il prezzo del padre ed i figli hanno tutti i prezzi nulli..
|
else //se invece viene cambiato il prezzo del padre ed i figli hanno tutti i prezzi nulli..
|
||||||
//..(articolo nuovo o resettato), sui prezzi figli viene messo il prezzo del padre
|
//..(articolo nuovo o resettato), sui prezzi figli viene messo il prezzo del padre
|
||||||
{
|
{
|
||||||
|
//per prima cosa sistema se stesso (è un padre ignobile!)
|
||||||
|
real father_price = o.get();
|
||||||
|
set_price(o.dlg(), father_price);
|
||||||
|
|
||||||
|
//poi i figli
|
||||||
TMask& rowmask = o.mask(); //serve la maschera di riga! (sennò funziona solo sullo sheet)
|
TMask& rowmask = o.mask(); //serve la maschera di riga! (sennò funziona solo sullo sheet)
|
||||||
real somma_prezzi_figli = ZERO;
|
real somma_prezzi_figli = ZERO;
|
||||||
for (int i = S2_LIST1; i <= S2_LIST10; i++)
|
for (int i = S2_LIST1; i <= S2_LIST10; i++)
|
||||||
@ -706,16 +765,15 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
|
|||||||
TSheet_field& sf_listini = sfield(F_LISTINI_FIGLI);
|
TSheet_field& sf_listini = sfield(F_LISTINI_FIGLI);
|
||||||
const int col_ricarichi = sf_listini.cid2index(S1_RICARICO);
|
const int col_ricarichi = sf_listini.cid2index(S1_RICARICO);
|
||||||
|
|
||||||
for (int i = S2_LIST1; i <= S2_LIST10; i++)
|
for (short i = S2_LIST1; i <= S2_LIST10; i++)
|
||||||
{
|
{
|
||||||
TMask_field& campo = rowmask.efield(i);
|
TMask_field& campo = rowmask.efield(i);
|
||||||
//se il campo è visibile, allora il listino figlio è tra quelli attivi e lo aggiorna
|
//se il campo è visibile, allora il listino figlio è tra quelli attivi e lo aggiorna
|
||||||
if (campo.shown())
|
if (campo.shown())
|
||||||
{
|
{
|
||||||
const real ricarico = sf_listini.cell(i - S2_LIST1, col_ricarichi);
|
const real ricarico = sf_listini.cell(i - S2_LIST1, col_ricarichi);
|
||||||
real prezzo_figlio = o.get();
|
real prezzo_figlio = father_price * (CENTO + ricarico) / CENTO;
|
||||||
prezzo_figlio = prezzo_figlio * (CENTO + ricarico) / CENTO;
|
set_price(i, prezzo_figlio);
|
||||||
campo.set(prezzo_figlio.string());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -735,6 +793,8 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
|
|||||||
case S2_LIST10:
|
case S2_LIST10:
|
||||||
if (e == fe_modify)
|
if (e == fe_modify)
|
||||||
{
|
{
|
||||||
|
real price = o.get();
|
||||||
|
set_price(o.dlg(), price);
|
||||||
_ask_save = true;
|
_ask_save = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user