Patch level : 10.0

Files correlati     : ef0
Ricompilazione Demo : [ ]
Commento            :
Migliorato caricamento distinte incomplete


git-svn-id: svn://10.65.10.50/branches/R_10_00@22572 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2012-02-07 15:35:25 +00:00
parent 4d581f9409
commit 7d2fcdcfda
13 changed files with 121 additions and 172 deletions

View File

@ -45,7 +45,6 @@ protected:
bool user_destroy();
virtual TMask* get_mask(int mode) {return _msk;}
virtual bool changing_mask(int mode) {return FALSE;}
void enable_controeuro();
virtual void ini2mask(TConfig& ini, TMask& m, bool query);
@ -59,17 +58,6 @@ public:
// restituisce un riferimento all' applicazione
inline TVariazione_effetti& app() {return (TVariazione_effetti&)main_app();}
void TVariazione_effetti::enable_controeuro()
{
static int ce = -1;
if (ce < 0)
{
TConfig ini(CONFIG_DITTA, "ve");
ce = ini.get_bool("CONTROEURO");
}
_msk->enable(F_CONTROEURO, ce != 0);
}
// quando si va in query mode resetta i due campi della maschera
// relativi ai totali
void TVariazione_effetti::init_query_mode(TMask&)
@ -77,7 +65,6 @@ void TVariazione_effetti::init_query_mode(TMask&)
_msk->reset(F_TOTIMP);
_msk->reset(F_TOTIMPVAL);
_msk->enable(F_TIPOCF);
enable_controeuro();
}
bool TVariazione_effetti::protected_record(TRectype& rec)
@ -94,7 +81,6 @@ void TVariazione_effetti::init_insert_mode(TMask&)
righe_sheet().row(0) = riga;
righe_sheet().set_dirty();
_msk->enable(F_TIPOCF);
enable_controeuro();
}
void TVariazione_effetti::ini2mask(TConfig& ini, TMask& m, bool query)
{
@ -114,7 +100,6 @@ void TVariazione_effetti::ini2mask(TConfig& ini, TMask& m, bool query)
void TVariazione_effetti::init_modify_mode(TMask& m)
{
m.disable(F_TIPOCF);
enable_controeuro();
m.efield(F_IBAN_STATO).validate(K_TAB);
}

View File

@ -35,7 +35,6 @@
#define F_EFFCOMP 229
#define F_SHEET_EFF 230
#define F_TIPOCF 231
#define F_CONTROEURO 232
#define F_PROG 233
#define F_CUP 234
#define F_DCUP 235

View File

@ -142,7 +142,6 @@ BEGIN
DISPLAY "Codice" CODTAB
DISPLAY "Nome@50" S0
OUTPUT F_CODVAL CODTAB
OUTPUT F_CONTROEURO B1
OUTPUT F_CAMBIO S4
CHECKTYPE NORMAL
END
@ -159,7 +158,6 @@ BEGIN
DISPLAY "Data@12" D0
DISPLAY "Cambio@19" S4
OUTPUT F_DATACAM D0
OUTPUT F_CONTROEURO B1
OUTPUT F_CAMBIO S4
CHECKTYPE SEARCH
GROUP 1
@ -176,12 +174,6 @@ BEGIN
GROUP 1
END
BOOLEAN F_CONTROEURO
BEGIN
PROMPT 40 8 "Controeuro "
FIELD CONTROEURO
END
BOOLEAN F_ULTRATA
BEGIN
PROMPT 56 8 "Ultima rata"

View File

@ -64,7 +64,7 @@ public:
// riscrive l'effetto
int rewrite(TLocalisamfile& f) { return write(f, TRUE); }
// rimuove l'effetto
int remove(TLocalisamfile& f)const;
int remove(TLocalisamfile& f) const;
// restituisce il numero progressivo dell'effetto estraendolo dal record
long numero() const { return get_long(EFF_NPROGTR); }
// restituisce il codice del cliente intestatario dell'effetto estraendolo dal record

View File

@ -272,7 +272,7 @@ int TVariazione_distinte::read(TMask& m)
riga.add(TR("Varie"));
}
//gestisco il controllo sulla presenza o meno di una valuta
const TString16 codval(eff.get(EFF_CODVAL));
const TString4 codval(eff.get(EFF_CODVAL));
if (i == 0)
{
const bool valuta = ::is_true_value(codval);

View File

@ -1,5 +1,8 @@
#include "ef0301.h"
#include <recset.h>
#include <relation.h>
///////////////////////////////////////////////////
// Definizione dei metodi della classe TDistinta //
///////////////////////////////////////////////////
@ -7,7 +10,7 @@
// costruttore distinta utilizzando il record passato
TDistinta::TDistinta(const TRectype& rec, word lockop)
{
read(rec,lockop);
read(rec,lockop);
}
// costruisce la distinta del tipo e numero passati
@ -18,31 +21,51 @@ TDistinta::TDistinta(const char tipo, const long numero, word lockop)
TDistinta::~TDistinta()
{
TLocalisamfile f(LF_EFFETTI);
if (_righe_dist.items() > 0) // Se ha letto elementi sblocca eventualmente la prima riga
f.read((TRectype&)_righe_dist[0], _isequal,_unlock);
{
TLocalisamfile f(LF_EFFETTI);
f.read(eff(0), _isequal,_unlock);
}
}
const TString& TDistinta::query(const char tipo, const long numero, const int riga) const
{
TString& q = get_tmp_string();
q << "USE EFFETTI KEY 4"
<< "\nFROM TIPODIST=" << tipo << " NDIST=" << numero;
if (riga > 1)
q << " NRIGADIST=" << riga;
q << "\nTO TIPODIST=" << tipo << " NDIST=" << numero;
return q;
}
// permette di leggere la distinta del tipo e numero passati
int TDistinta::read(const char tipo, const long numero, word lockop)
{
int err = _iskeynotfound;
TLocalisamfile f(LF_EFFETTI); f.setkey(4);
if (_righe_dist.items() > 0) // Se ha letto una distinta precedente, sblocca la prima riga
if (_righe_dist.items()) // Se ha letto una distinta precedente, sblocca la prima riga
{
f.read((TRectype&)_righe_dist[0],_isequal,_unlock);
TLocalisamfile f(LF_EFFETTI); f.setkey(4);
f.read(eff(0),_isequal,_unlock);
_righe_dist.destroy(); // Rimuove tutte le righe precedenti
}
if (tipo >= ' ' && numero > 0)
{
err = NOERR;
for (int i = 1; err == NOERR ; i++)
TISAM_recordset reff(query(tipo, numero));
TLocalisamfile& f = reff.cursor()->file();
int i = 0;
for (bool ok = reff.move_first(); ok; ok = reff.move_next())
{
const word lock = (i == 0 && lockop == _lock) ? _lock : _nolock; // Lock solo sulla prima riga
const int n = reff.get(EFF_NRIGADIST).as_int();
TEffetto* effetto = new TEffetto;
word lock = (i == 1 && lockop == _lock) ? _lock : _nolock; // Lock solo sulla prima riga
err = effetto->read(f, tipo, numero, i, lock);//legge un effetto per chiave 4
err = effetto->read(f, tipo, numero, n, lock);//legge un effetto per chiave 4
if (err == NOERR)
_righe_dist.add(effetto);
{
i = _righe_dist.add(effetto) + 1;
effetto->put(EFF_NRIGADIST, i);
}
else
delete effetto;
}
@ -68,42 +91,36 @@ int TDistinta::write(bool force, TToken_string* dati_dist)
{
int err = NOERR;
//quanti effetti sono nella distinta (nell'array in memoria)
const int elem = items();
TLocalisamfile f(LF_EFFETTI); f.setkey(4);
for (int i=0; i<elem && err==NOERR; i++)
int nriga = 0;
FOR_EACH_ARRAY_ITEM(_righe_dist, i, obj)
{
TEffetto& effetto = eff(i);
TEffetto& effetto = *(TEffetto*)obj;
// token string che contiene i dati da registrare sull'effetto
if (dati_dist)
{
dati_dist->restart();
effetto.put(EFF_TIPODIST, dati_dist->get());
effetto.put(EFF_NDIST, dati_dist->get());
effetto.put(EFF_NDIST, dati_dist->get());
effetto.put(EFF_DATADIST, dati_dist->get());
effetto.put(EFF_CODABIP, dati_dist->get());
effetto.put(EFF_CODCABP, dati_dist->get());
effetto.put(EFF_PROGBNP, dati_dist->get());
effetto.put(EFF_NRIGADIST, i+1);
effetto.put(EFF_CODABIP, dati_dist->get());
effetto.put(EFF_CODCABP, dati_dist->get());
effetto.put(EFF_PROGBNP, dati_dist->get());
effetto.put(EFF_NRIGADIST, ++nriga);
}
else
nriga = effetto.get_int(EFF_NRIGADIST);
//riscrivo l'effetto con i dati della distinta a cui appartiene
err = effetto.rewrite(f);
err = effetto.rewrite_write(f);
if (err != NOERR)
break;
}
if (dati_dist)
{
f.setkey(4);
f.put(EFF_TIPODIST, dati_dist->get(0));
f.put(EFF_NDIST, dati_dist->get());
int i = elem;
f.put(EFF_NRIGADIST, ++i);
for (int e = f.read(); e == NOERR; e = f.read())
{
e = f.remove();
f.put(EFF_NRIGADIST, ++i);
}
const char td = dati_dist->get_char(0);
const long nd = dati_dist->get_long();
remove(td, nd, nriga+1);
}
return err;
@ -111,24 +128,28 @@ int TDistinta::write(bool force, TToken_string* dati_dist)
// rimuove la distinta (non si effettua la rimozione del record su file ma si
// elimina dal file il collegamento tra gli effetti e la distinta)
int TDistinta::remove(char tipodist, long ndist)
int TDistinta::remove(char tipodist, long ndist, int nriga)
{
int err;
TLocalisamfile file(LF_EFFETTI);
// scandisco tutti gli effetti della distinta (nell'array),
// cancello i dati della distinta e riscrivo gli effetti
for (int i = 0; i < items(); i++)
int err = NOERR;
TISAM_recordset eff(query(tipodist, ndist, nriga));
TLocalisamfile& file = eff.cursor()->file();
for (bool ok = eff.move_first(); ok && err == NOERR; ok = eff.move_next())
{
TEffetto& effetto = (TEffetto&)_righe_dist[i];
err = effetto.read(file, tipodist,ndist,i+1);
effetto.zero(EFF_TIPODIST);
effetto.zero(EFF_NDIST);
effetto.zero(EFF_DATADIST);
effetto.zero(EFF_NRIGADIST);
effetto.zero(EFF_CODABIP);
effetto.zero(EFF_CODCABP);
effetto.zero(EFF_PROGBNP);
err = effetto.rewrite(file);
const int i = file.get_int(EFF_NRIGADIST);
TEffetto effetto;
err = effetto.read(file, tipodist,ndist,i);
if (err == NOERR)
{
effetto.zero(EFF_TIPODIST);
effetto.zero(EFF_NDIST);
effetto.zero(EFF_DATADIST);
effetto.zero(EFF_NRIGADIST);
effetto.zero(EFF_CODABIP);
effetto.zero(EFF_CODCABP);
effetto.zero(EFF_PROGBNP);
err = effetto.rewrite(file);
}
}
reset();//elimino gli effetti dalla memoria resettando l'array
return err;
@ -136,11 +157,5 @@ int TDistinta::remove(char tipodist, long ndist)
bool TDistinta::contabilizzata() const
{
bool yes = FALSE;
if (_righe_dist.items() > 0)
{
const TRectype& eff = (const TRectype&)_righe_dist[0];
yes = eff.get_bool(EFF_EFFCONT);
}
return yes;
return _righe_dist.items() && eff(0).get_bool(EFF_EFFCONT);
}

View File

@ -17,6 +17,7 @@ class TDistinta : public TObject
protected:
TEffetto& eff(int n) { return (TEffetto&)_righe_dist[n]; }
const TEffetto& eff(int n) const { return (const TEffetto&)_righe_dist[n]; }
const TString& query(const char tipo, const long numero, const int riga = 0) const;
public:
//ritorna un riferimento all'array degli effetti nella distinta
@ -34,7 +35,7 @@ public:
//riscrive la distinta
int rewrite(TToken_string* dati_dist = NULL){ return write(TRUE, dati_dist); }
//rimuove la distinta del tipo e numero passati
int remove(char tipodist, long ndist);
int remove(char tipodist, long ndist, int nriga=0);
//restituisce il tipo di distinta
const char tipodist() const { return eff(0).get_char(EFF_TIPODIST); }
//restituisce il tipo degli effetti della distinta (<C>lienti/<F>ornitori)
@ -51,8 +52,6 @@ public:
TDate data_cam() const { return eff(0).get_date(EFF_DATACAMBIO); }
//restituisce il cambio delle distinta
real cambio() const { return eff(0).get_real(EFF_CAMBIO); }
//restituisce TRUE se il cambio delle distinta e' contro euro
bool contro_euro() const { return eff(0).get_bool(EFF_CONTROEURO); }
//restituisce il codice abi di presentazione effetti
const TString& abip()const { return eff(0).get(EFF_CODABIP); }
//restituisce il codice cab di presentazione effetti

View File

@ -81,18 +81,7 @@ class TContabilizzazione_effetti_app : public TSkeleton_application
_total_mov_val;// Same as above but in valuta
TString _desc_inc, _desc_pag; // Descrizioni movimento generato
TMask *_msk; // maschera di selezione dati
// TLocalisamfile *_attiv, // file delle attivita' (per far funzionare TRegistro)
// *_fcaus, // file delle causale (per far funzionare TCausale)
// *_frcaus, // file delle righe causali (per far funzionare TCausale)
// *_effetti, // file degli effetti (per TDistinta)
// *_reffetti, // file delle righe effetti (per TDistinta)
// *_cessionari, // file dei cessionari (per TDistinta)
// *_part, // file delle partite (per far funzionare TPartita)
// *_scad, // file delle scadenze (per far funzionare TPartita)
// *_pags, // file dei pagamenti (per far funzionare TPartita)
// *_clifo, // file dei clienti
// *_doc, // file dei documenti
// *_pcon; // file piano dei conti
TBill _banca, // conto di contropartita della banca
_cliente, // conto di contropartita del cliente
_trandiffcam; // conto di transizione per differenze cambi
@ -871,18 +860,7 @@ void TContabilizzazione_effetti_app::compile_head_mov(const TString & contsep)
mov.put(MOV_CODVAL, codval);
mov.put(MOV_DATACAM, _distinta->data_cam());
real cambio = _distinta->cambio();
const bool eurocambio = _distinta->contro_euro();
const TExchange chg(codval, cambio, eurocambio ? _exchange_contro : _exchange_base);
if (eurocambio && mov.curr().exist(MOV_CONTROEURO))
{
mov.put(MOV_CONTROEURO, eurocambio);
cambio = chg.get_contro_change();
}
else
{
cambio = chg.get_base_change();
}
const real cambio = _distinta->cambio();
mov.put(MOV_CAMBIO, cambio);
}
// MOV_TOTDOC e MOV_TOTDOCVAL vengono completati prima della scrittura del movimento
@ -909,17 +887,6 @@ void TContabilizzazione_effetti_app::compile_riga_partita(TRiga_partite& riga, c
riga.put(PART_DATACAM,effetto.get_date(EFF_DATACAMBIO));
real cambio = effetto.get(EFF_CAMBIO);
riga.put(PART_CAMBIO, cambio);
if (effetto.get_bool(EFF_CONTROEURO))
{
if (!((TRectype&)riga).exist(PART_CONTROEURO))
{
const TExchange chg(effetto.get(EFF_CODVAL), cambio, _exchange_contro);
const real cc = chg.get_base_change();
riga.put(PART_CAMBIO, cc);
}
else
riga.put(PART_CONTROEURO, TRUE);
}
riga.put(PART_TIPOCF,_cliente.tipo());
riga.put(PART_SOTTOCONTO,_cliente.sottoconto());
riga.put(PART_IMPTOTDOC,effetto.get(EFF_IMPORTO));
@ -1065,18 +1032,7 @@ void TContabilizzazione_effetti_app::compile_saldac(const TEffetto& eff,
const TString4 codval = eff.get(EFF_CODVAL);
const TDate datacam = eff.get(EFF_DATACAMBIO);
real cambio = eff.get(EFF_CAMBIO);
exchange_type et = eff.get_bool(EFF_CONTROEURO) ? _exchange_contro : _exchange_base;
if (et == _exchange_contro)
{
if (!((TRectype&)riga_part).exist(PART_CONTROEURO))
{
const TExchange chg(codval, cambio, et);
cambio = chg.get_base_change();
et = _exchange_base;
riga_part.put(PART_CAMBIO, cambio);
}
}
const TValuta valuta_eff(codval, datacam, cambio, et);
const TValuta valuta_eff(codval, datacam, cambio);
partita->modifica_pagamento(riga_pagamento, valuta_eff,
old_ap, old_abb, old_diffcam,
@ -1229,33 +1185,33 @@ error_type TContabilizzazione_effetti_app::write_all(bool change_status)
bool TContabilizzazione_effetti_app::has_diffcam(const TEffetto& eff) const
{
bool yes = FALSE;
bool yes = false;
if (eff.in_valuta()) // Considera solo effetti in valuta
{
const TExchange cambio(eff);
const bool always_diffcam = ini_get_bool(CONFIG_DITTA, "cg", "DiffCamAlways");
TLocalisamfile partite(LF_PARTITE);
for (int n = 1; yes == FALSE && n <= eff.rows_r(); n++)
for (int n = 1; !yes && n <= eff.rows_r(); n++)
{
const TRectype& riga = eff.row_r(n);
if (riga.get_char(REFF_ACCSAL) != 'S') // Ignora righe non saldanti
continue;
partite.put(PART_TIPOCF, eff.get(EFF_TIPOCF));
partite.put(PART_GRUPPO, 0);
partite.put(PART_CONTO, 0);
partite.put(PART_SOTTOCONTO, eff.get(EFF_CODCF));
partite.put(PART_ANNO, riga.get(REFF_ANNO));
partite.put(PART_NUMPART, riga.get(REFF_NUMPART));
partite.put(PART_NRIGA, riga.get(REFF_NRIGA));
int err = partite.read();
if (err == NOERR)
{
const TExchange cambiofatt(partite.curr());
yes = cambiofatt != cambio;
if (always_diffcam || riga.get_char(REFF_ACCSAL) == 'S') // Ignora righe non saldanti
{
partite.put(PART_TIPOCF, eff.get(EFF_TIPOCF));
partite.put(PART_GRUPPO, 0);
partite.put(PART_CONTO, 0);
partite.put(PART_SOTTOCONTO, eff.get(EFF_CODCF));
partite.put(PART_ANNO, riga.get(REFF_ANNO));
partite.put(PART_NUMPART, riga.get(REFF_NUMPART));
partite.put(PART_NRIGA, riga.get(REFF_NRIGA));
int err = partite.read();
if (err == NOERR)
{
const TExchange cambiofatt(partite.curr());
yes = cambiofatt != cambio;
}
else
NFCHECK("Effetto pagante fattura fantasma");
}
else
NFCHECK("Effetto pagante fattura fantasma");
}
}
return yes;
@ -1344,8 +1300,21 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon
_total_mov = 0.0;
_total_mov_val = 0.0;
distinta.read(tipo,numero,_lock); // Sblocca da solo quella precedente
const int items = distinta.items(); // Perche' sul file effetti il numero riga distinta e' un long ??
if (items == 0)
{
_error = generic_error;
error_box(FR("La distinta %c %ld non ha effetti"), tipo, numero);
return;
}
if (_caus != NULL)
{
delete _caus;
_caus = NULL;
}
const TString& cc = distinta.tipocf() == 'F' ? _cod_caus_pag : _cod_caus;
_caus = new TCausale(cc, _data_op.year());
@ -1392,7 +1361,6 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon
else
dettaglio_rate = _dett_rate_att;
const int items = distinta.items(); // Perche' sul file effetti il numero riga distinta e' un long ??
// compila la testata
compile_head_mov(key);
@ -1496,6 +1464,7 @@ void TContabilizzazione_effetti_app::contabilize_bill(const char tipo, const lon
void TContabilizzazione_effetti_app::contabilize()
{
const bool cont_sep = ini_get_bool(CONFIG_DITTA, "ef", "ContSep"); // Stramaledetta
_total_bills = 0;
const long cur_items = _dist_sheet->items(); // Quante distinte in totale ?
@ -1508,13 +1477,13 @@ void TContabilizzazione_effetti_app::contabilize()
TToken_string& t = _dist_sheet->row(j);
const char tipo = t.get_char(1);
const long numero = t.get_long(2);
if (ini_get_bool(CONFIG_DITTA, "ef", "ContSep"))
if (cont_sep)
{
_distinta->read(tipo,numero);
const int items = _distinta->items();
TAssoc_array codcs;
TAssoc_array codcs;
for (int i = 0; i < items; i++) // scorre le righe della distinta (effetti)
{
const TEffetto& eff = (*_distinta)[i];
@ -1525,7 +1494,9 @@ void TContabilizzazione_effetti_app::contabilize()
contabilize_bill(tipo,numero, key);
}
else
{
contabilize_bill(tipo,numero);
}
if (!good())
display_error();
}

View File

@ -690,7 +690,6 @@ void TPE_mask::save_rate()
const TString& codval = get(F_CODVAL);
const real cambio = get(F_CAMBIO);
const bool eurocambio = get_bool(F_EURO);
const int tipopag = get_int(F_TIPOPAG);
bool zeroes = false; // Esistono righe effetto da cancellare
@ -704,7 +703,7 @@ void TPE_mask::save_rate()
if (codval.full() && !imp.is_zero())
{
impval = imp;
TCurrency c(impval, codval, cambio, eurocambio ? _exchange_contro : _exchange_base);
TCurrency c(impval, codval, cambio);
c.change_to_firm_val();
imp = c.get_num();
}
@ -821,7 +820,6 @@ void TPE_mask::save_rate()
eff.put(EFF_IMPORTOVAL, totimpval);
eff.put(EFF_CODVAL, codval);
eff.put(EFF_CAMBIO, cambio);
eff.put(EFF_CONTROEURO, eurocambio);
eff.put(EFF_DATACAMBIO, get(F_DATACAMBIO));
eff.put(EFF_SPESE, get(F_SPESE));
}

View File

@ -8,7 +8,6 @@
#define F_DUMMYDIST 208
#define F_DATADIST 209
#define F_CODVAL 210
#define F_EURO 211
#define F_CAMBIO 212
#define F_DATACAMBIO 213
#define F_DESCAB 214

View File

@ -81,7 +81,6 @@ BEGIN
OUTPUT F_CODVAL CODVAL
OUTPUT F_CAMBIO CAMBIO
OUTPUT F_DATACAMBIO DATACAMBIO
OUTPUT F_EURO CONTROEURO
OUTPUT F_TIPOCF TIPOCF
OUTPUT F_ABI CODABIP
OUTPUT F_CAB CODCABP
@ -103,19 +102,12 @@ BEGIN
DISPLAY "Contro\nEuro@6" B1
DISPLAY "Denominazione@50" S0
OUTPUT F_CODVAL CODTAB
OUTPUT F_EURO B1
CHECKTYPE NORMAL
GROUP 3
MESSAGE EMPTY CLEAR,6@
MESSAGE ENABLE,6@
END
BOOLEAN F_EURO
BEGIN
PROMPT 64 1 "Contro Euro"
FLAGS "D"
END
DATE F_DATADIST
BEGIN
PROMPT 2 2 "Data "

View File

@ -1,3 +1,3 @@
31
0
$effetti|0|0|249|0|Effetti|||
$effetti|0|0|248|0|Effetti|||

View File

@ -1,5 +1,5 @@
31
37
36
NPROGTR|3|7|0|Numero progressivo effetto
DATASCAD|5|8|0|Data di scadenza
TIPOPAG|2|1|0|Tipo pagamento
@ -11,7 +11,6 @@ DATAEMISS|5|8|0|Data emissione
CODVAL|1|3|0|Codice valuta
DATACAMBIO|5|8|0|Data cambio
CAMBIO|4|15|6|Cambio
CONTROEURO|8|1|0|Cambio espresso contro Euro
CODABI|10|5|0|Codice ABI banca
CODCAB|10|5|0|Codice CAB banca
ULTRATA|8|1|0|Ultima rata