Patch level :10.0
Files correlati : Ricompilazione Demo : [ ] Commento : personalizzazione crpa in corso git-svn-id: svn://10.65.10.50/trunk@20385 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
bf98e83c14
commit
d241a8d841
174
ps/ps1001300.cpp
174
ps/ps1001300.cpp
@ -103,17 +103,19 @@ class TVariazione_budget_mask : public TAutomask
|
|||||||
protected:
|
protected:
|
||||||
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);
|
||||||
|
|
||||||
int carica_rmovana();
|
int load();
|
||||||
bool one_checked() const; //(on_field) controlla se nella colonna dei check ce ne è almeno 1 checkato
|
bool one_checked() const; //(on_field) controlla se nella colonna dei check ce ne è almeno 1 checkato
|
||||||
void check_all(const bool checked); //(on_field) checka-dechecka la colonna dei check
|
void check_all(const bool checked); //(on_field) checka-dechecka la colonna dei check
|
||||||
int find_sister_rows(const int curr_sister, int& first_sister, int& last_sister, const bool by_numreg = false); //(on_field) trova le righe..
|
int find_sister_rows(const int curr_sister, int& first_sister, int& last_sister, const bool by_numreg = false); //(on_field) trova le righe..
|
||||||
//con la stessa chiave della riga corrente e della chiave selezionata
|
//..con la stessa chiave della riga corrente e della chiave selezionata
|
||||||
void build_key(int i, TToken_string& key); //(find_sister_rows) crea la chiave cdc/fase/conto della riga con cui cercare le sorelle
|
void build_key(int i, TToken_string& key); //(find_sister_rows) crea la chiave cdc/fase/conto della riga con cui cercare le sorelle
|
||||||
void build_key_by_numreg(int i, TToken_string& key); //(find_sister_rows) crea la chiave numreg della riga con cui cercare le sorelle
|
void build_key_by_numreg(int i, TToken_string& key); //(find_sister_rows) crea la chiave numreg della riga con cui cercare le sorelle
|
||||||
void aggiorna_saldi_preventivi(TSheet_field& sf_righe, const int curr_riga); //(carica_rmovana()) crea i saldi preventivi in base agli importi
|
void aggiorna_saldi_preventivi(TSheet_field& sf_righe, const int curr_riga); //(load()) crea i saldi preventivi in base agli importi
|
||||||
bool save_commessa(); //(save()) salva i cambiamenti di date della commessa esaminata
|
bool save_commessa(); //(save()) salva i cambiamenti di date della commessa esaminata
|
||||||
bool save_sheet(); //(save()) salva i cambiamenti nello sheet
|
bool save_sheet(); //(save()) salva i cambiamenti nello sheet
|
||||||
bool save(); //(on_field) gestisce l'ordine dei salvataggi
|
bool save(); //(on_field) gestisce l'ordine dei salvataggi
|
||||||
|
int modifica_movana(const long numreg, TSheet_field& sf_righe, const int r); //((save_sheet()) gestisce la modifica di movana esistenti
|
||||||
|
int crea_movana(TSheet_field& sf_righe, const int n); //(save_sheet()) gestisce la creazione dei nuovi movana
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TVariazione_budget_mask();
|
TVariazione_budget_mask();
|
||||||
@ -164,7 +166,7 @@ void TVariazione_budget_mask::build_key(int i, TToken_string& key)
|
|||||||
key.add(curr_riga.get(_pos_conto));
|
key.add(curr_riga.get(_pos_conto));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//crea la chiave numreg/numrig o datacomp/autofcomp/datafcomp
|
||||||
void TVariazione_budget_mask::build_key_by_numreg(int i, TToken_string& key)
|
void TVariazione_budget_mask::build_key_by_numreg(int i, TToken_string& key)
|
||||||
{
|
{
|
||||||
TSheet_field& sf_righe = sfield(F_RIGHE);
|
TSheet_field& sf_righe = sfield(F_RIGHE);
|
||||||
@ -172,6 +174,14 @@ void TVariazione_budget_mask::build_key_by_numreg(int i, TToken_string& key)
|
|||||||
//chiave della riga sorella originale
|
//chiave della riga sorella originale
|
||||||
key.cut(0);
|
key.cut(0);
|
||||||
key.add(curr_riga.get(_pos_numreg));
|
key.add(curr_riga.get(_pos_numreg));
|
||||||
|
if (atol(key) == 0)
|
||||||
|
{
|
||||||
|
const TDate datacomp = curr_riga.get(_pos_datacomp);
|
||||||
|
key.add(datacomp.date2ansi());
|
||||||
|
key.add(curr_riga.get(_pos_autofcomp));
|
||||||
|
const TDate datafcomp = curr_riga.get(_pos_datafcomp);
|
||||||
|
key.add(datafcomp.date2ansi());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//cerca le righe sorelle per chiave cdc/fase/conto o numreg (dipende da by_numreg)
|
//cerca le righe sorelle per chiave cdc/fase/conto o numreg (dipende da by_numreg)
|
||||||
@ -227,7 +237,7 @@ bool TVariazione_budget_mask::on_field_event(TOperable_field& o, TField_event e,
|
|||||||
case F_CODCMS:
|
case F_CODCMS:
|
||||||
if (e == fe_modify)
|
if (e == fe_modify)
|
||||||
{
|
{
|
||||||
bool e = carica_rmovana() == 0;
|
bool e = load() == 0;
|
||||||
o.enable(e);
|
o.enable(e);
|
||||||
enable(F_DESCRIZ, e);
|
enable(F_DESCRIZ, e);
|
||||||
}
|
}
|
||||||
@ -424,28 +434,17 @@ bool TVariazione_budget_mask::save_commessa()
|
|||||||
return err == NOERR;
|
return err == NOERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
//salva lo sheet...lasciate ogni speranza voi che entrate!
|
//modifica movana esistente in base alle modifiche sulle righe
|
||||||
bool TVariazione_budget_mask::save_sheet()
|
int TVariazione_budget_mask::modifica_movana(const long numreg, TSheet_field& sf_righe, const int r)
|
||||||
{
|
{
|
||||||
//1)ordina le righe per numreg/numrig
|
TAnal_mov movana(numreg);
|
||||||
TSheet_field& sf_righe = sfield(F_RIGHE);
|
|
||||||
sf_righe.sort(compare_by_numrig);
|
|
||||||
|
|
||||||
//file dei movana qui richiamato in quanto può essere modificato in vari punti successivi...
|
|
||||||
TLocalisamfile file_movana(LF_MOVANA);
|
|
||||||
|
|
||||||
//2)cerca le sorelle per numreg/numrig
|
|
||||||
FOR_EACH_SHEET_ROW(sf_righe, r, riga)
|
|
||||||
{
|
|
||||||
int first, last;
|
int first, last;
|
||||||
|
|
||||||
|
//prende tutte le sorelle della riga, così da aggiornare un movana alla volta
|
||||||
const int sisters = find_sister_rows(r, first, last, true);
|
const int sisters = find_sister_rows(r, first, last, true);
|
||||||
const long numreg = sf_righe.row(r).get_long(_pos_numreg);
|
|
||||||
|
|
||||||
//giro di controllo sulle date; le righe sheet, eventualmente modificate, devono avere un intervallo date..
|
//giro di controllo sulle date; le righe sheet, eventualmente modificate, devono avere un intervallo date..
|
||||||
//..compatibile con quello del movimento
|
//..compatibile con quello del movimento
|
||||||
if (numreg > 0)
|
|
||||||
{
|
|
||||||
TAnal_mov movana(numreg);
|
|
||||||
const TDate datacomp = movana.get_date(MOVANA_DATACOMP);
|
const TDate datacomp = movana.get_date(MOVANA_DATACOMP);
|
||||||
TDate datafcomp = movana.get_date(MOVANA_DATAFCOMP);
|
TDate datafcomp = movana.get_date(MOVANA_DATAFCOMP);
|
||||||
const bool autofcomp = movana.get_bool(MOVANA_AUTOFCOMP);
|
const bool autofcomp = movana.get_bool(MOVANA_AUTOFCOMP);
|
||||||
@ -470,22 +469,26 @@ bool TVariazione_budget_mask::save_sheet()
|
|||||||
|
|
||||||
//le righe da liberare sono quelle che non rispettano i vincoli sulle date
|
//le righe da liberare sono quelle che non rispettano i vincoli sulle date
|
||||||
if (r_autofcomp != autofcomp || r_datacomp != datacomp || r_datafcomp != datafcomp || r_importo.is_zero())
|
if (r_autofcomp != autofcomp || r_datacomp != datacomp || r_datafcomp != datafcomp || r_importo.is_zero())
|
||||||
|
{
|
||||||
|
if (!r_importo.is_zero())
|
||||||
{
|
{
|
||||||
sf_righe.row(i).add("", _pos_numreg);
|
sf_righe.row(i).add("", _pos_numreg);
|
||||||
sf_righe.row(i).add("", _pos_numrig);
|
sf_righe.row(i).add("", _pos_numrig);
|
||||||
|
}
|
||||||
//elimina la riga dal movana
|
//elimina la riga dal movana
|
||||||
row_modified |= movana.destroy_row(r_numrig, true);
|
row_modified |= movana.destroy_row(r_numrig, true);
|
||||||
}
|
}
|
||||||
else //qui invece ci vanno le righe modificate che sono solo da riscrivere
|
else //qui invece ci vanno le righe modificate che sono solo da riscrivere (importo e/o descr modificate)
|
||||||
{
|
{
|
||||||
TRectype& rmovana = movana.body()[r_numrig];
|
TRectype& rmovana = movana.body()[r_numrig];
|
||||||
|
//importo
|
||||||
const real importo = rmovana.get_real(RMOVANA_IMPORTO);
|
const real importo = rmovana.get_real(RMOVANA_IMPORTO);
|
||||||
if (importo != r_importo)
|
if (importo != r_importo)
|
||||||
{
|
{
|
||||||
rmovana.put(RMOVANA_IMPORTO, r_importo);
|
rmovana.put(RMOVANA_IMPORTO, r_importo);
|
||||||
row_modified = true;
|
row_modified = true;
|
||||||
}
|
}
|
||||||
|
//descrizione
|
||||||
const char* r_descr = sf_righe.cell(i, _pos_descr);
|
const char* r_descr = sf_righe.cell(i, _pos_descr);
|
||||||
const TString& descr = rmovana.get(RMOVANA_DESCR);
|
const TString& descr = rmovana.get(RMOVANA_DESCR);
|
||||||
if (descr != r_descr)
|
if (descr != r_descr)
|
||||||
@ -494,20 +497,133 @@ bool TVariazione_budget_mask::save_sheet()
|
|||||||
row_modified = true;
|
row_modified = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} //for(int i=last;i<=first;i--)...
|
||||||
|
|
||||||
if (row_modified)
|
if (row_modified)
|
||||||
|
{
|
||||||
|
TLocalisamfile file_movana(LF_MOVANA);
|
||||||
|
if (movana.rows() > 0)
|
||||||
{
|
{
|
||||||
movana.update_totdoc();
|
movana.update_totdoc();
|
||||||
movana.rewrite(file_movana);
|
movana.rewrite(file_movana);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
movana.remove(file_movana);
|
||||||
}
|
}
|
||||||
//finito il giro sulle sorelle; si passa alla successiva famiglia (ovvero al successivo numreg)
|
return last;
|
||||||
r = last;
|
}
|
||||||
|
|
||||||
|
//crea un nuovo movana in base alle righe sullo sheet
|
||||||
|
int TVariazione_budget_mask::crea_movana(TSheet_field& sf_righe, const int n)
|
||||||
|
{
|
||||||
|
TAnal_mov new_movana;
|
||||||
|
//trovando numreg=0, le sorelle saranno solo quelle che hanno la stessa chiave datacomp/autofcomp/datafcomp,..
|
||||||
|
//..in modo da creare movana corretti in termini di date e coerenti con le righe contenute in loro
|
||||||
|
int first, last;
|
||||||
|
const int sisters = find_sister_rows(n, first, last, true);
|
||||||
|
|
||||||
|
//datacomp/autofcomp/datafcomp vengono presi una volta per tutte le sorelle in quanto sono la chiave della sorellanza
|
||||||
|
const bool r_autofcomp = *sf_righe.cell(n, _pos_autofcomp) > ' ';
|
||||||
|
const TDate r_datacomp = sf_righe.cell(n, _pos_datacomp);
|
||||||
|
TDate r_datafcomp = sf_righe.cell(n, _pos_datafcomp);
|
||||||
|
if (r_datafcomp < r_datacomp)
|
||||||
|
r_datafcomp = r_datacomp;
|
||||||
|
|
||||||
|
//riempie la testata del movana
|
||||||
|
const TEsercizi_contabili ec;
|
||||||
|
const int annoes = ec.date2esc(r_datacomp);
|
||||||
|
new_movana.put(MOVANA_ANNOES, annoes);
|
||||||
|
const TDate& datareg = get_date(F_DATAREG);
|
||||||
|
new_movana.put(MOVANA_DATAREG, datareg);
|
||||||
|
new_movana.put(MOVANA_DATACOMP, r_datacomp);
|
||||||
|
new_movana.put(MOVANA_AUTOFCOMP, r_autofcomp);
|
||||||
|
|
||||||
|
if (!r_autofcomp && r_datafcomp > r_datacomp)
|
||||||
|
new_movana.put(MOVANA_DATAFCOMP, r_datafcomp);
|
||||||
|
|
||||||
|
const TString& codcaus = get(F_CODCAUS);
|
||||||
|
new_movana.put(MOVANA_CODCAUS, codcaus);
|
||||||
|
TString descr;
|
||||||
|
descr << TR("Preventivo commessa ") << get(F_CODCMS);
|
||||||
|
new_movana.put(MOVANA_DESCR, descr);
|
||||||
|
new_movana.put(MOVANA_TIPOMOV, 'P');
|
||||||
|
|
||||||
|
|
||||||
|
//giro sulle sorelle; ogni riga, se di importo non nullo, va aggiunta al new_movana
|
||||||
|
for (int i = first; i <= last; i++)
|
||||||
|
{
|
||||||
|
const real importo = sf_righe.cell(i, _pos_imp);
|
||||||
|
if (importo != ZERO)
|
||||||
|
{
|
||||||
|
//aggiunge la rmovana al movana
|
||||||
|
TRectype& new_rmovana = new_movana.new_row();
|
||||||
|
//compila la rmovana
|
||||||
|
new_rmovana.put(RMOVANA_ANNOES, annoes);
|
||||||
|
new_rmovana.put(RMOVANA_DATACOMP, r_datacomp);
|
||||||
|
new_rmovana.put(RMOVANA_CODCMS, get(F_CODCMS));
|
||||||
|
const TString& cdc = sf_righe.cell(i, _pos_cdc);
|
||||||
|
new_rmovana.put(RMOVANA_CODCCOSTO, cdc);
|
||||||
|
const TString& fase = sf_righe.cell(i, _pos_fase);
|
||||||
|
new_rmovana.put(RMOVANA_CODFASE, fase);
|
||||||
|
const TString& conto = sf_righe.cell(i, _pos_conto);
|
||||||
|
new_rmovana.put(RMOVANA_CODCONTO, conto);
|
||||||
|
const TString& sezione = sf_righe.cell(i, _pos_cosric);
|
||||||
|
new_rmovana.put(RMOVANA_SEZIONE, sezione == "C" ? 'D' : 'A');
|
||||||
|
new_rmovana.put(RMOVANA_IMPORTO, importo);
|
||||||
|
const TString& descr = sf_righe.cell(i, _pos_descr);
|
||||||
|
new_rmovana.put(RMOVANA_DESCR, descr);
|
||||||
|
}
|
||||||
|
} //for(int i = last; i >= first; i--)...
|
||||||
|
|
||||||
|
//alla fine si scrive il nuovo movana solo se ha righe!!!
|
||||||
|
if (new_movana.rows() > 0)
|
||||||
|
{
|
||||||
|
new_movana.update_totdoc();
|
||||||
|
TLocalisamfile file_movana(LF_MOVANA);
|
||||||
|
new_movana.write(file_movana);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return last;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//salva lo sheet...lasciate ogni speranza voi che entrate!
|
||||||
|
bool TVariazione_budget_mask::save_sheet()
|
||||||
|
{
|
||||||
|
//1) ordina le righe per numreg/numrig
|
||||||
|
TSheet_field& sf_righe = sfield(F_RIGHE);
|
||||||
|
sf_righe.sort(compare_by_numrig);
|
||||||
|
|
||||||
|
//2) Aggiorna i movana con le righe di loro competenza: registra solo le righe con NUMREG !=0
|
||||||
|
FOR_EACH_SHEET_ROW(sf_righe, r, riga)
|
||||||
|
{
|
||||||
|
const long numreg = sf_righe.row(r).get_long(_pos_numreg);
|
||||||
|
|
||||||
|
if (numreg > 0)
|
||||||
|
r = modifica_movana(numreg, sf_righe, r);
|
||||||
|
|
||||||
|
} //FOR_EACH_SHEET_ROW(...
|
||||||
|
|
||||||
|
//riordina lo sheet per chiave numreg; in questo modo le righe senza numreg vanno all'inizio e vengono..
|
||||||
|
//..ordinate per datacomp/autofcomp/datafcomp; tali righe, se hanno importo != 0, vengono aggiunte ad..
|
||||||
|
//..un nuovo movimento analitico che viene creato sul campo!
|
||||||
|
sf_righe.sort(compare_by_numrig);
|
||||||
|
|
||||||
|
//3)cerca le sorelle per numreg/numrig: righe con NUMREG = 0
|
||||||
|
FOR_EACH_SHEET_ROW(sf_righe, n, line)
|
||||||
|
{
|
||||||
|
const long numreg = sf_righe.row(n).get_long(_pos_numreg);
|
||||||
|
//l'ultima sort mette in cima allo sheet tutte le righe con numreg=0; quindi alla prima con numreg>0..
|
||||||
|
//..tanto vale uscire definitivamente
|
||||||
|
if (numreg != 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
n = crea_movana(sf_righe, n);
|
||||||
|
|
||||||
|
} //FOR_EACH_SHEET_ROW(sf_righe,n...
|
||||||
|
|
||||||
//le righe vanno rimesse in ordine di chiave cdc/fase/conto
|
//le righe vanno rimesse in ordine di chiave cdc/fase/conto
|
||||||
sf_righe.sort(compare_by_fase);
|
load();
|
||||||
sf_righe.force_update();
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -576,7 +692,7 @@ void TVariazione_budget_mask::aggiorna_saldi_preventivi(TSheet_field& sf_righe,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int TVariazione_budget_mask::carica_rmovana()
|
int TVariazione_budget_mask::load()
|
||||||
{
|
{
|
||||||
TString query;
|
TString query;
|
||||||
query << "USE RMOVANA KEY 4\n";
|
query << "USE RMOVANA KEY 4\n";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user