Patch level : 2.0 496

Files correlati     : ve0.exe ve6.exe ve0100b.msk
Ricompilazione Demo : [ ]
Commento            :

GF20033
Se cerco da un d.d.t. di importare degli ordini, li avede, ma nelle righe
del documento bolla non agginge alcuna riga.

GF20034
Se nell'elaborazione differita di bollettazione ordine inserisco il codice
di un articolo e la relativa qtà da evadere una volta che mi sono
ricollegato al primo ordine e ho evaso parte di quell'articolo il campo qtà
dell'elaborazione differita invece di essere aggiornato per la qtà ancora
da evadere viene azzerato.


git-svn-id: svn://10.65.10.50/trunk@11234 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2003-06-12 09:07:55 +00:00
parent fbce256e5d
commit 2613e57dd1
3 changed files with 296 additions and 63 deletions

View File

@ -7,7 +7,7 @@ BEGIN
PROMPT -12 -1 ""
END
BUTTON DLG_CANCEL 10 2
BUTTON DLG_QUIT 10 2
BEGIN
PROMPT -22 -1 ""
END

View File

@ -12,22 +12,25 @@
class TConsegna_mask : public TAutomask
{
bool _ordina_per_codice;
protected:
virtual bool on_field_event(class TOperable_field& f, TField_event e, long jolly);
public:
void doc2mask(const TDocumento& doc);
void doc2mask(const TDocumento& doc, const TString & articolo);
TConsegna_mask() : TAutomask("velib04d") { }
TConsegna_mask(int header_code = 0, bool per_codice = FALSE);
virtual ~TConsegna_mask() { }
};
bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, long jolly)
{
bool update_row = FALSE;
switch (f.dlg())
{
case S_QTADAEVADERE:
if (e == fe_modify)
if (e == fe_modify && jolly > 0)
{
TMask& m = f.mask();
const real qta_residua = m.get_real(S_QTARESIDUA);
@ -48,6 +51,20 @@ bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, lo
m.set(S_RIGAEVASA, " ");
m.enable(S_RIGAEVASA);
}
update_row = !m.is_running();
}
break;
case S_RIGAEVASA:
if (e == fe_modify && jolly > 0 && f.get().not_empty())
{
TMask& m = f.mask();
const real qta_daevadere = m.get(S_QTADAEVADERE);
if (qta_daevadere.is_zero())
{
const TString& residuo = m.get(S_QTARESIDUA);
m.set(S_QTADAEVADERE, residuo, TRUE);
update_row = !m.is_running();
}
}
break;
case F_CONSEGNA:
@ -55,17 +72,19 @@ bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, lo
{
TSheet_field& s = sfield(F_ROWS);
FOR_EACH_SHEET_ROW(s, n, row)
{
const real residuo = row->get(S_QTARESIDUA-FIRST_FIELD);
const real evaso = row->get(S_QTADAEVADERE-FIRST_FIELD);
if (evaso == ZERO && residuo > ZERO)
{
row->add(residuo.string(), S_QTADAEVADERE-FIRST_FIELD);
row->add("X", S_RIGAEVASA-FIRST_FIELD);
s.disable_cell(n, S_RIGAEVASA-FIRST_FIELD);
if (!s.cell_disabled(n,S_RIGACONSEGNATA-FIRST_FIELD))
{
const real residuo = row->get(S_QTARESIDUA-FIRST_FIELD);
const real evaso = row->get(S_QTADAEVADERE-FIRST_FIELD);
if (evaso == ZERO && residuo > ZERO)
{
row->add(residuo.string(), S_QTADAEVADERE-FIRST_FIELD);
row->add("X", S_RIGAEVASA-FIRST_FIELD);
s.disable_cell(n, S_RIGAEVASA-FIRST_FIELD);
}
row->add("X", S_RIGACONSEGNATA-FIRST_FIELD);
}
row->add("X", S_RIGACONSEGNATA-FIRST_FIELD);
}
s.force_update();
}
break;
@ -74,11 +93,60 @@ bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, lo
return FALSE;
default:break;
}
if (update_row)
{
TSheet_field& s = sfield(F_ROWS);
const int riga = s.selected();
s.update_row(riga);
s.force_update(riga);
}
return TRUE;
}
void TConsegna_mask::doc2mask(const TDocumento& doc)
rows_sort_func(TSheet_field & s, int i, int j)
{
TToken_string & s1 = (TToken_string & )(s.row(i));
TToken_string & s2 = (TToken_string & )(s.row(j));
TString ss1, ss2;
TDate dd1, dd2;
real rr1, rr2;
int fields[] = {S_CODART, S_LIVGIAC1, S_LIVGIAC2, S_LIVGIAC3, S_LIVGIAC4,
S_CODMAG, S_CODDEP, S_RIGAEVASA, S_DATACONS, S_QTARESIDUA, -1};
int ret(0), field(0);
while (fields[field] >= 0)
{
if (fields[field] == S_QTARESIDUA)
{
s1.get(fields[field]-FIRST_FIELD, rr1);
s2.get(fields[field]-FIRST_FIELD, rr2);
ret = rr2 < rr1 ? -1 : (rr2 > rr1 ? 1 : 0);
}
else
{
s1.get(fields[field]-FIRST_FIELD ,ss1);
s2.get(fields[field]-FIRST_FIELD ,ss2);
if (fields[field] == S_DATACONS)
{
dd1 = ss1;
dd2 = ss2;
ret = int (dd1.date2ansi() - dd2.date2ansi());
}
else
ret = ss1.compare(ss2);
}
if (ret != 0)
break;
field++;
}
return ret;
}
void TConsegna_mask::doc2mask(const TDocumento& doc, const TString & articolo)
{
TWait_cursor hourglass;
for (int n = fields()-1; n >= 0; n--)
{
TMask_field& f = fld(n);
@ -89,38 +157,84 @@ void TConsegna_mask::doc2mask(const TDocumento& doc)
f.set(val);
}
}
const bool show_evaded = doc.tipo().mostra_righe_evase_in_elaborazione();
TSheet_field& s = sfield(F_ROWS);
s.destroy();
const int rows = doc.physical_rows();
for (int i = 0; i < rows; i++)
{
const TRiga_documento& rec = doc[i+1];
TToken_string& r = s.row(i);
r = " ";
const real residuo = rec.qtaresidua();
const bool evasa = residuo.is_zero();
bool evasa = rec.get_bool(RDOC_RIGAEVASA);
const real residuo = rec.get_real(RDOC_QTA) - rec.get_real(RDOC_QTAEVASA);
if (residuo <= ZERO)
if ((show_evaded || !evasa) && (articolo.empty() || articolo == rec.get(RDOC_CODART)))
{
r.add(" ");
evasa = TRUE;
TToken_string& r = s.row(-1);
r = " ";
if (evasa)
r.add(" ");
else
r.add(residuo.string());
r.add(" "); // Da evadere
if (evasa)
{
s.disable_cell(i, -1); // Disbilita tutta la riga ...
s.enable_cell(i, 0); // ... tranne il flag di consegna
r.add("X"); // La considera evasa
}
else
r.add(" ");
r.add(rec.get(RDOC_CODMAG).left(3));
r.add(rec.get(RDOC_CODMAG).mid(3));
r.add(rec.get(RDOC_CODART));
const TString& livello = rec.get(RDOC_LIVELLO);
for (int l = 1; l <= 4; l++)
r.add(livelli_giacenza().unpack_grpcode(livello, l));
if (rec.get_date(RDOC_DATACONS).ok())
r.add(rec.get_date(RDOC_DATACONS));
else
r.add(doc.get_date(DOC_DATACONS));
r.add(rec.get(RDOC_PREZZO), s.cid2index(S_PREZZO));
r.add(rec.get(RDOC_DESCR), s.cid2index(S_DESCR));
r.add(rec.get(RDOC_TIPORIGA), s.cid2index(S_TIPORIGA));
r.add(rec.get(RDOC_NRIGA),s.cid2index(S_NUMRIGA));
}
else
r.add(residuo.string());
r.add(" "); // Da evadere
if (evasa)
{
s.disable_cell(i, -1);
r.add("X");
}
else
r.add(" ");
r.add(rec.get(RDOC_CODMAG).left(3));
r.add(rec.get(RDOC_CODMAG).mid(3));
r.add(rec.get(RDOC_CODART));
r.add(rec.get(RDOC_DESCR));
r.add(rec.get(RDOC_TIPORIGA));
}
if (_ordina_per_codice)
s.sort(rows_sort_func);
}
TConsegna_mask::TConsegna_mask(int header_code, bool per_codice)
: TAutomask("velib04d") , _ordina_per_codice(per_codice)
{
TCodgiac_livelli cl;
TSheet_field& s = sfield(F_ROWS);
cl.set_sheet_columns(s, S_LIVGIAC1);
if (header_code == 1)
{
TString h;
h = "Quantita'\nconsegnata";
s.set_column_header(S_QTARESIDUA, h);
s.sheet_mask().field(S_QTARESIDUA).set_prompt("Q.ta' consegnata");
h = "Quantita'\nda fatturare";
s.set_column_header(S_QTADAEVADERE, h);
s.sheet_mask().field(S_QTADAEVADERE).set_prompt("Q.ta' da fatturare");
}
else
if (header_code == 2)
{
TString h;
h = "Residuo";
s.set_column_header(S_QTARESIDUA, h);
s.sheet_mask().field(S_QTARESIDUA).set_prompt("Residuo ");
h = "Da evadere";
s.set_column_header(S_QTADAEVADERE, h);
s.sheet_mask().field(S_QTADAEVADERE).set_prompt("Da evadere ");
}
}
///////////////////////////////////////////////////////////
@ -140,47 +254,167 @@ bool TConsegna_ordini::elabora(TLista_documenti& doc_in, TLista_documenti& doc_o
CHECK(items_in > 0, "Nessun documento da elaborare");
CHECK(items_out> 0, "Nessun documento da generare");
CHECK(items_in == 1 || items_out == 1 || items_out == items_in,
"Numero di documenti da elborare 'strano'");
"Numero di documenti da elaborare 'strano'");
bool ok = TRUE;
TConsegna_mask m;
const int header_code = intestazioni_sheet();
TConsegna_mask m(header_code, ordina_per_codice());
const int items_max = items_in > items_out ? items_in : items_out;
for (int d = 0; d < items_max && ok; d++)
{
TDocumento& indoc = doc_in[d < items_in ? d : 0];
TDocumento& outdoc = doc_out[d < items_out ? d : 0];
const TString& articolo = params().get("ARTICOLO");
m.doc2mask(indoc);
m.doc2mask(indoc, articolo);
TArticolo art;
if (articolo.not_empty())
{
art.read(articolo);
params().set("QUANTITA", ZERO);
}
ok = m.run() == K_ENTER;
if (ok)
{
TSheet_field& s = m.sfield(F_ROWS);
FOR_EACH_SHEET_ROW(s, n, row) if (*row->get(0) > ' ')
{
TRiga_documento& inrec = indoc[n+1];
const real daeva = row->get(S_QTADAEVADERE - FIRST_FIELD);
if (daeva > ZERO)
if (gestione_riferimenti())
{
// Determina ed eventualmente crea la riga di riferimento
const int riga_rif = riferimenti_in_testa() ? 1 : outdoc.physical_rows()+1;
if (riga_rif > outdoc.physical_rows())
{
const real qtaevasa = inrec.get_real(RDOC_QTAEVASA) + daeva;
inrec.put(RDOC_QTAEVASA, qtaevasa);
inrec.put(RDOC_RIGAEVASA, row->get(S_RIGAEVASA - FIRST_FIELD));
TRiga_documento& rout = outdoc.new_row();
rout.forza_sola_descrizione();
}
TRiga_documento& rout = outdoc[riga_rif];
// Costruisce la stringa di riferimento
TString riferimento;
indoc.riferimento(riferimento);
if (riferimento.empty())
riferimento = indoc.tipo().descrizione();
if (usa_doc_rif() && indoc.get(DOC_NUMDOCRIF).not_empty())
{
riferimento << " n. " << indoc.get(DOC_NUMDOCRIF);
riferimento << " del " << indoc.get(DOC_DATADOCRIF);
}
const TString16 tiporiga = inrec.get(RDOC_TIPORIGA);
TRiga_documento& outrec = outdoc.new_row(tiporiga);
outrec = inrec;
outrec.set_numero(outdoc.physical_rows());
outrec.put(RDOC_QTA, daeva);
outrec.zero(RDOC_QTAEVASA);
outrec.zero(RDOC_RIGAEVASA);
else
{
riferimento << " n. " << indoc.numero();
riferimento << " del " << indoc.data().string();
}
// Setta la descrizione se vuota
if (rout.get("DESCR").empty())
rout.put("DESCR", riferimento);
else
{
// Altrimenti aggiungi il riferimento al memo
TString memo(1024);
memo = rout.get("DESCEST");
if (memo.empty())
{
TString80 rif(rout.get("DESCR"));
rif << '\n';
rout.put("DESCR", rif);
rout.put("DESCLUNGA", "X");
}
else
memo << '\n';
memo << riferimento;
rout.put("DESCEST", memo);
}
}
TToken_string campi_riga(80);
const bool ragg_rig = raggruppa_righe();
if (ragg_rig)
{
campi_riga = "CODART|LIVELLO|UMQTA"; // Uguali sempre
// Uguali opzionalmente
if (riga_uguale(0)) campi_riga.add("CODMAG");
if (riga_uguale(1)) campi_riga.add("CODIVA");
if (riga_uguale(2)) campi_riga.add("PREZZO|SCONTO");
}
TSheet_field& s = m.sfield(F_ROWS);
int r = 0;
FOR_EACH_SHEET_ROW(s, n, row)
{
r = row->get_int(S_NUMRIGA - FIRST_FIELD);
if (*row->get(0) > ' ') // E' da consegnare?
{
TRiga_documento& inrec = indoc[r];
const real daeva = row->get(S_QTADAEVADERE - FIRST_FIELD);
if (daeva > ZERO || row->get_char(S_RIGAEVASA-FIRST_FIELD) > ' ')
{
const char* fqe = inrec.field_qtaevasa();
const real qtaevasa = inrec.get_real(fqe) + daeva;
inrec.put(fqe, qtaevasa);
inrec.put(RDOC_RIGAEVASA, row->get(S_RIGAEVASA - FIRST_FIELD));
}
if (articolo.not_empty())
{
const TString16 um(inrec.get(RDOC_UMQTA));
const real qta = art.convert_to_um(daeva, params().get("UM"), um);
params().set("QUANTITA", qta + params().get_real("QUANTITA"));
}
bool elaborata = FALSE;
if (ragg_rig)
{
for (int i = 1; i <= outdoc.physical_rows(); i++)
{
TRiga_documento& outrec = outdoc[i];
if (outrec.sola_descrizione()) // Ignora le righe descrittive
continue;
if (inrec.raggruppabile(outrec, campi_riga)) // Se esiste una riga compatibile ...
{
const TString& qta_field = outrec.field_qta();
const real qta = outrec.get_real(qta_field) + daeva;
outrec.put(qta_field, qta);
if (qta_field != RDOC_QTA)
outrec.put(RDOC_QTA, 1); // Pezza temporanea
outrec.dirty_fields(); // Forza ricalcolo peso etc.
elaborata = TRUE; // Ricorda di averla gia' elaborata
break;
}
}
}
if (!elaborata) // Se la riga non e' stata gia' sommata ...
{
const TString16 tiporiga = inrec.get(RDOC_TIPORIGA);
TRiga_documento & outrec = outdoc.new_row(tiporiga);
const TString& qta_field = outrec.field_qta();
TDocumento::copy_data(outrec, inrec);
outrec.put(qta_field, daeva);
if (qta_field != RDOC_QTA)
{
real q = inrec.get(RDOC_QTA);
if (q.is_zero()) q = 1.0;
outrec.put(RDOC_QTA, q); // Pezza temporanea
}
outrec.dirty_fields(); // Forza ricalcolo peso etc.
outrec.zero(RDOC_QTAEVASA);
outrec.zero(RDOC_RIGAEVASA);
outrec.set_original_rdoc_key(inrec);
}
}
}
}
if (indoc.is_evaso())
{
indoc.stato(stato_finale()[0]);
indoc.stato(stato_finale_doc_iniziale()[0]);
}
}
return ok;

View File

@ -1724,10 +1724,10 @@ bool TElabora_mask::elabora()
TLista_documenti in;
TLista_documenti out;
TDocumento& app_doc = ((TDocumento_mask *)_main)->doc();
long numdoc = get_long(F_NDOC_ELAB);
const long numdoc = get_long(F_NDOC_ELAB);
const bool update_header = get_bool(F_UPDATE_HEADER);
TDocumento* newdoc = new TDocumento(*get(F_PROVV_ELAB), get_int(F_ANNO_ELAB), get(F_CODNUM_ELAB), numdoc);
TDocumento* newdoc = new TDocumento(get(F_PROVV_ELAB)[0], get_int(F_ANNO_ELAB), get(F_CODNUM_ELAB), numdoc);
TDocumento& d = *newdoc;
if (numdoc <= 0)
@ -1814,8 +1814,7 @@ bool TElabora_mask::elabora()
if (d != in[0])
in.rewrite();
}
TString8 num_in(e->codice_numerazione_iniziale());
const TString8 num_in = e->codice_numerazione_iniziale();
set(F_CODNUM_ELAB, num_in);
set(F_NDOC_ELAB, "");
set(F_NUMDOCRIF_ELAB, "");
@ -2142,7 +2141,7 @@ bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key )
bool update_mask = FALSE;
const char stato_iniziale = m.doc().stato();
while (selection->run() != K_ESC)
while (selection->run() == K_ENTER)
{
m.mask2doc();
update_mask |= selection->elabora();