Patch level :10.0

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
ma 'sti cazzo di listini non finiscono mai???!!!


git-svn-id: svn://10.65.10.50/trunk@19414 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2009-10-09 11:19:34 +00:00
parent c98dffca3b
commit 609a8d508f
2 changed files with 124 additions and 43 deletions

View File

@ -1396,7 +1396,7 @@ void TStampaDoc_application::print_selected(KEY k)
pr.set_printtype(screenvis);
else
{
if (pr.printtype() != acrobatprinter)
//if (pr.printtype() != acrobatprinter)
pr.set_printtype(winprinter);
}
}

View File

@ -24,6 +24,7 @@ class TAggiorna_listini_edit_mask : public TAutomask
TMask* _query_mask; //puntatore alla maschera di query
TString8 _curr_grmerc; //iniziale grmerc-sotgrmerc
bool _ges_um; //gestione unità di misura del listino padre
bool _ask_save; //chiede di salvare al cambio grmerc se effettuati cambiamenti nello sheet
protected:
//Metodi dello sheet listini figli
@ -42,6 +43,7 @@ protected:
void check_all(const bool checked); //checka-dechecka la colonna dei check (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)
real get_price(TSheet_field& sf, const int row, const int col) const;
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
@ -180,6 +182,19 @@ void TAggiorna_listini_edit_mask::save_children_list()
//metodi F_MULTILISTINI
real TAggiorna_listini_edit_mask::get_price(TSheet_field& sf, const int row, const int col) const
{
if (col == sf.cid2index(F_PREZZO))
{
TString16 str_prezzo = sf.cell(row, col);
str_prezzo.strip(".");
str_prezzo.replace(',', '.');
return real(str_prezzo);
}
return real(sf.cell(row, col));
}
//cerca nello sheet la coppia codart+um che gli viene passata restituendo la posizione della riga ALTA..
//della coppia di righe sheet interessate (è la riga disabilitata);
int TAggiorna_listini_edit_mask::find_codart(TSheet_field& sf, const TString& codart, const TString& codum) const
@ -307,12 +322,28 @@ void TAggiorna_listini_edit_mask::fill_multilistini_sheet()
//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)
const int riga_alta = find_or_add_codart(sf_multilistini, codart, um);
const int riga_bassa = riga_alta + 1;
//mette il prezzo al posto giusto (padre e figlio)
if (pos <= 0)
sf_multilistini.row(riga_alta + 1).add(prezzo.string(), prezzo_pos);
if (pos <= 0) //padre
{
const TPrice prezzo_base(prezzo);
sf_multilistini.row(riga_bassa).add(prezzo_base.string(true), prezzo_pos);
}
else
{
sf_multilistini.row(riga_alta).add(prezzo.string(), prezzo_pos + pos);
sf_multilistini.row(riga_bassa).add(prezzo.string(), prezzo_pos + pos);
real fath_prezzo = get_price(sf_multilistini, riga_bassa, prezzo_pos);
//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())
{
TSheet_field& listini_figli = sfield(F_LISTINI_FIGLI);
const real ricarico = listini_figli.cell(pos - 1, listini_figli.cid2index(F_RICARICO));
const TPrice prezzo_base(prezzo * CENTO / (CENTO + ricarico));
sf_multilistini.row(riga_bassa).add(prezzo_base.string(true), prezzo_pos);
}
}
} //for(bool ok..
} //FOR_EACH_TOKEN..
@ -339,7 +370,7 @@ void TAggiorna_listini_edit_mask::update_sons_prices()
const real old_son_prezzo = sf_listini.cell(i - 1, son_prezzo_pos);
if (old_son_prezzo > ZERO)
{
const real fath_prezzo = riga->get(fath_prezzo_pos);
const real fath_prezzo = get_price(sf_listini, i, fath_prezzo_pos);
const TPrice son_prezzo = fath_prezzo * (CENTO + ricarico) / CENTO;
riga->add(son_prezzo.get_num().string(), son_prezzo_pos);
}
@ -434,7 +465,10 @@ void TAggiorna_listini_edit_mask::add_art()
um = riga->get(2); um.trim();
const int numriga = find_or_add_codart(sf_listini, codart, um);
if (numriga >= 0)
sf_listini.row(numriga + 1).add(riga->get(3), prezzo_pos);
{
const TPrice prezzo(real(riga->get(3)));
sf_listini.row(numriga + 1).add(prezzo.string(true), prezzo_pos);
}
}
sf_listini.force_update();
}
@ -479,49 +513,69 @@ void TAggiorna_listini_edit_mask::save_listini()
recset_rows.set_var("#COD", cod);
const long recset_rows_items = recset_rows.items();
TLocalisamfile& file = recset_rows.cursor()->file();
//eliminatore di articoli cancellati dallo sheet
for (bool ok = recset_rows.move_first(); ok; ok = recset_rows.move_next())
{
TLocalisamfile& file = recset_rows.cursor()->file();
//prende codart e um dal record su file rcondv
const TString& codart = recset_rows.get(RCONDV_CODRIGA).as_string();
const TString& um = recset_rows.get(RCONDV_UM).as_string();
//cerca sullo sheet la coppia codart+um
const int riga_alta = find_codart(sf_listini, codart, um);
const real prezzo = sf_listini.row(riga_alta + 1).get(prezzo_pos + pos);
const real prezzo = get_price(sf_listini, riga_alta + 1, prezzo_pos + pos);
//se non la trova o se il prezzo è 0 elimina la riga dal file
if (riga_alta < 0 || prezzo == ZERO)
{
file.remove();
continue;
}
//alla fine della storia registra tutto lo sheet sul file
FOR_EACH_SHEET_ROW(sf_listini, r, riga)
{
//file.zero(); //achtung! se l'articolo è nuovo ci può stare, ma se c'era già no
file.put(RCONDV_TIPO, "L");
file.put(RCONDV_CATVEN, catven);
file.put(RCONDV_COD, cod);
file.put(RCONDV_TIPORIGA, "A");
file.put(RCONDV_CODRIGA, codart);
file.put(RCONDV_UM, um);
file.put(RCONDV_PREZZO, prezzo);
}
file.setkey(1);
const int nuovo_articolo = file.read();
//alla fine della fiera deve salvare su file veramente!
//se è in inserimento deve fare un write, se in modifica la rewrite
if (nuovo_articolo > 0)
file.rewrite_write();
else
file.write_rewrite();
}
}
TRectype key_rec(LF_RCONDV);
//alla fine della storia registra tutto lo sheet sul file
FOR_EACH_SHEET_ROW(sf_listini, r, riga) if (r & 1)
{
const real prezzo = get_price(sf_listini, r, prezzo_pos + pos);
if (prezzo > ZERO)
{
const TString codart = riga->get(1);
const TString4 um = _ges_um ? sf_listini.row(r - 1).get(2) : "";
//si costruisce un record con la chiave che trova sullo sheet in modo da poterlo cercare..
//..sul file rcondv
key_rec.zero();
key_rec.put(RCONDV_TIPO, "L");
key_rec.put(RCONDV_CATVEN, catven);
key_rec.put(RCONDV_COD, cod);
key_rec.put(RCONDV_TIPORIGA, "A");
key_rec.put(RCONDV_CODRIGA, codart);
if (_ges_um)
key_rec.put(RCONDV_UM, um);
//c'e' l'articolo nel listino?
file.curr() = key_rec;
int err = file.read();
//alla fine della fiera deve salvare su file veramente!
//se è in inserimento deve fare un write, se in modifica la rewrite
if (err == NOERR) //lo trova già esistente -> aggiorna il prezzo
{
file.put(RCONDV_PREZZO, prezzo);
err = file.rewrite_write();
}
else //non lo trova quindi lo aggiunge
{
if (err == _isreinsert)
{
file.curr() = key_rec;
file.put(RCONDV_PREZZO, prezzo);
err = file.write_rewrite();
}
} //if(err==NOERR..
if (err != NOERR)
error_box(FR("Errore %d durante l'aggiornamento dell'articolo %s nel listino %s"), err, (const char*)codart, (const char*)cod);
}
} //FOR_EACH_SHEET_ROW...
} //FOR_EACH_TOKEN...
}
@ -553,18 +607,42 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
grmerc.format("%-3s%-2s", (const char*)get(F_GRMERC),(const char*)get(F_SOTGRMERC));
if (grmerc != _curr_grmerc)
{
if (_ask_save)
{
if (yesno_box(TR("Registrare le modifiche effettuate?")))
save_listini();
}
fill_ricarichi_children_list();
fill_multilistini_sheet();
_ask_save = false;
}
}
break;
case F_PREZZO:
if (e == fe_modify && real::is_null(o.get()))
if (e == fe_modify)
{
TSheet_field& sf_listini = sfield(F_MULTILISTINI);
TMask& rowmask = sf_listini.sheet_mask();
rowmask.field(DLG_USER).on_hit();
if (real::is_null(o.get()))
{
TMask& rowmask = o.mask();
rowmask.field(DLG_USER).on_hit();
}
_ask_save = true;
}
break;
case F_LIST1:
case F_LIST2:
case F_LIST3:
case F_LIST4:
case F_LIST5:
case F_LIST6:
case F_LIST7:
case F_LIST8:
case F_LIST9:
case F_LIST10:
if (e == fe_modify)
{
_ask_save = true;
}
break;
case DLG_USER:
@ -583,8 +661,8 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
case DLG_APPLICA:
if (e == fe_button)
{
update_sons_prices();
save_children_list();
update_sons_prices();
_ask_save = true;
}
break;
case DLG_CHECKALL:
@ -604,6 +682,7 @@ bool TAggiorna_listini_edit_mask::on_field_event(TOperable_field& o, TField_even
case DLG_SAVEREC:
if (e == fe_button)
{
save_children_list();
save_listini();
}
break;
@ -714,6 +793,8 @@ TAggiorna_listini_edit_mask::TAggiorna_listini_edit_mask(TMask* query_mask)
const TRectype& rec_padre = cache().get(LF_CONDV, chiave);
_ges_um = rec_padre.get_bool(CONDV_GESTUM);
_ask_save = false;
//popola lo sheet dei listini figli
fill_children_list();
//e poi setta le intestazioni dello sheet multilistini