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:
parent
fbce256e5d
commit
2613e57dd1
@ -7,7 +7,7 @@ BEGIN
|
||||
PROMPT -12 -1 ""
|
||||
END
|
||||
|
||||
BUTTON DLG_CANCEL 10 2
|
||||
BUTTON DLG_QUIT 10 2
|
||||
BEGIN
|
||||
PROMPT -22 -1 ""
|
||||
END
|
||||
|
348
ve/velib04d.cpp
348
ve/velib04d.cpp
@ -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;
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user