Cambiata gestione provvigioni per agente:

la chiave e' ora CODAGE+ANNO+CODNUM+NDOC+NRIGA.
  effettuate le modifiche del caso a prlib01 e pr0700


git-svn-id: svn://10.65.10.50/trunk@5356 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1997-10-13 15:21:11 +00:00
parent 1a74003000
commit 8ec9b32ff8
6 changed files with 259 additions and 123 deletions

View File

@ -26,4 +26,4 @@ PAGMAT|4|18|2|Pagamento maturato
PROVVMAT|4|18|2|Provvigione maturata
TIPOPAGPR|2|1|0|Tipo pagamento della provvigione (?)
1
CODAGE+NRIGA|
CODAGE+ANNO+CODNUM+NDOC+NRIGA|

View File

@ -2,7 +2,8 @@
#include <applicat.h>
#include <msksheet.h>
#include <urldefid.h>
#include <colors.h>
#include "../ve/velib.h"
#include "prlib.h"
#include "provv.h"
#include "pr0700a.h"
@ -12,7 +13,13 @@
class TGestione_provv_app:public TApplication
{
TMask *_msk;
TLocalisamfile *_provv;
TDocumento *_documento;
TLocalisamfile *_provv,
*_rdoc,
*_doc,
*_tab,
*_occas,
*_cfven;
TProvvigioni_agente *_prag;
bool _dirty;
@ -27,9 +34,11 @@ protected:
static bool rate_sheet_notify(TSheet_field& rs, int r, KEY key);
static bool nrata_handler(TMask_field& f, KEY key);
static bool ndoc_handler(TMask_field& f, KEY key);
static bool calcola_rate_handler(TMask_field& f, KEY k);
static bool datascad_handler(TMask_field& f, KEY key);
static bool imprata_handler(TMask_field& f, KEY key);
static bool improvv_handler(TMask_field& f, KEY key);
static bool enable_handler(TMask_field& f, KEY k);
static void fill_rate_doc(TRate_doc& rd, TSheet_field& sf);
public:
TGestione_provv_app() {};
@ -41,34 +50,79 @@ static TString16 __current_key;
////////////////////////////////////////////////////////////////////////////////////////
// Da fare :
// - abilitazione colonne provvpag e pagato con pulsante
// - Calcolo provvigioni in caso di selezione documento
//
// - Errore: quando si elimina una rata il pgm vuota lo spreadsheet e non aggiorna il video
// con i dati del documento corrente
// - Ultimo ma non meno importante (da ritenersi visualmente valido) lo riempimento fisso
// degli sheet (documenti e rate) in modo da evitare il fastidiosissimo sfarfallio in
// inserimento righe con elementi vuoti
////////////////////////////////////////////////////////////////////////////////////////
bool TGestione_provv_app::nrata_handler(TMask_field& f, KEY key)
bool TGestione_provv_app::calcola_rate_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER)
{ // Scorre tutte le righe dello spreadsheet esaminando il numero di rata
// nel caso trovi un'altra riga con lo stesso numero, visualizza un errore
const int nrata = atoi(f.get());
TSheet_field& s = *f.mask().get_sheet();
const int selected = s.selected();
const int items = s.items(); // Numero di righe dello spreadsheet
for (int i = 0; i < items; i++)
if (i != selected)
// - Impostazione importi e provvigioni (documento) in caso di selezione documento
// - Calcolo righe di provvigioni in caso di selezione documento (integrato in TDocumento)
// - Rata 0 : importo rata = 0; importo provvigione = provvigione all'atto della fattura (percentuale sugli agenti)
// la provvigione rimanente va suddivisa in rate a seconda del codice pagamento
if (f.focusdirty() && key == K_TAB)
{
TMask& m = f.mask();
TLocalisamfile& doc = *app()._doc;
doc.put(DOC_PROVV,"D");
doc.put(DOC_ANNO,m.get_int(F_ANNO));
doc.put(DOC_CODNUM,m.get(F_CODNUM));
doc.put(DOC_NDOC,m.get(F_NDOC));
if (doc.read() == NOERR) // Se esiste il documento allora prende i valori relativi al totale documento, totale provvigione e base di calcolo provvigione
{
TDocumento* documento = app()._documento;
int err = documento->read(doc.curr());
if (err == NOERR)
{
int other_rata = s.row(i).get_int(0);
if (nrata == other_rata)
return f.error_box("Non e' possibile inserire due rate con lo stesso numero");
m.set(F_DATADOC, documento->data());
m.set(F_CLIENTE, documento->codcf());
m.set(F_CODVAL,documento->valuta());
m.set(F_CAMBIO,documento->cambio());
m.set(F_DATACAMBIO,documento->get_date(DOC_DATACAMBIO));
m.set(F_IMPDOC,documento->totale_doc());
m.set(F_IMPPRDOC,documento->provvigione());
m.set(F_IMPNETDOC, ZERO /* documento->totale_basec() ???*/);
// Adesso calcoliamo la provvigione all'atto della fatturazione da inserire
// nella rata 0. Il residuo va ripartito nelle rate del documento
TProvvigioni_agente& pra = documento->calc_provvigioni();
// Adesso genera le righe da mettere nello spreadsheet. Quando si uscira' dalla riga
// attuale verra' chiamata la doc_sheet_notify() con K_ENTER, che memorizza il tutto
// gestendo automaticamente la eventuale modifica di un documento gia' presente o meno.
TSheet_field & rs = (TSheet_field&)app()._msk->field(F_RATE_SHEET);// Resetta lo spreadsheet
rs.reset();
TRate_doc& rd = pra.rate(documento->anno(), m.get(F_CODNUM), documento->numero()); // Estrae le rate appena calcolate
const int numrate = rd.items(); /* Numero rate per questo documento */
for (int i = 0; i < numrate; i++)
{
TToken_string& ttt = rs.row(i);
TRata& rt = rd[i];
ttt.add(rt.rata()); // Numero di rata
ttt.add(rt.datascad()); // Data scadenza della rata
ttt.add(rt.imprata().string()); // Importo della rata (occhio alla valuta)
ttt.add(rt.impprovv().string()); // Importo della provvigione per questa rata
ttt.add(""); // Tutti gli altri valori sono a 0
ttt.add(""); ttt.add(""); ttt.add("");
ttt.add(""); ttt.add("");
}
rs.force_update();
f.set_focusdirty(FALSE);
f.set_dirty(FALSE);
}
else
return f.error_box("Errore %d tentando di leggere il documento specificato",err);
} // Altrimenti l'utente e' libero di inserire importi e rate
}
return TRUE;
}
bool TGestione_provv_app::ndoc_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER)
if (key == K_ENTER) // Quando sta cambiando riga...
{ // Scorre tutte le righe dello spreadsheet esaminando ANNO+CODNUM+NDOC
// nel caso trovi un'altra riga con la stessa chiave, visualizza un errore
TSheet_field& s = *f.mask().get_sheet();
@ -93,10 +147,25 @@ bool TGestione_provv_app::ndoc_handler(TMask_field& f, KEY key)
return f.error_box("Non e' possibile inserire due documenti con lo stessa chiave");
}
}
if (key == K_TAB)
{
// - Impostazione importi e provvigioni in caso di selezione documento
// - Calcolo righe di provvigioni in caso di selezione documento
return calcola_rate_handler(f, key);
}
bool TGestione_provv_app::nrata_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER)
{ // Scorre tutte le righe dello spreadsheet esaminando il numero di rata
// nel caso trovi un'altra riga con lo stesso numero, visualizza un errore
const int nrata = atoi(f.get());
TSheet_field& s = *f.mask().get_sheet();
const int selected = s.selected();
const int items = s.items(); // Numero di righe dello spreadsheet
for (int i = 0; i < items; i++)
if (i != selected)
{
int other_rata = s.row(i).get_int(0);
if (nrata == other_rata)
return f.error_box("Non e' possibile inserire due rate con lo stesso numero");
}
}
return TRUE;
}
@ -114,6 +183,14 @@ bool TGestione_provv_app::datascad_handler(TMask_field& f, KEY key)
return TRUE;
}
// Abilita le colonne PAGATO e PROVVPAG per evntuale editing degli importi
bool TGestione_provv_app::enable_handler(TMask_field& f, KEY key)
{
if (key == K_SPACE)
f.mask().enable(-5);
return TRUE;
}
bool TGestione_provv_app::imprata_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER && __current_key.not_empty())
@ -239,8 +316,6 @@ bool TGestione_provv_app::doc_sheet_notify(TSheet_field& ds, int r, KEY key)
ttt.add(rt.provvpag().string());
ttt.add(rt.saldata() ? "X" : " ");
ttt.add(rt.tipopagpr());
int i = 1;
i++;
}
rs.force_update();
}
@ -290,10 +365,16 @@ bool TGestione_provv_app::create()
{
_msk = new TMask("pr0700b") ;
_provv = new TLocalisamfile(LF_PROVV);
_doc = new TLocalisamfile(LF_DOC);
_rdoc = new TLocalisamfile(LF_RIGHEDOC);
_cfven = new TLocalisamfile(LF_CFVEN);
_occas = new TLocalisamfile(LF_OCCAS);
_tab = new TLocalisamfile(LF_TAB);
_prag = new TProvvigioni_agente;
_documento = new TDocumento;
TSheet_field & sf = (TSheet_field&)_msk->field(F_DOC_SHEET);
sf.set_notify(doc_sheet_notify);
sf.sheet_mask().set_handler(F_ANNO,ndoc_handler);
sf.sheet_mask().set_handler(F_NDOC,ndoc_handler);
TSheet_field & rs = (TSheet_field&)_msk->field(F_RATE_SHEET);
rs.set_notify(rate_sheet_notify);
TMask& sm = rs.sheet_mask();
@ -301,6 +382,7 @@ bool TGestione_provv_app::create()
sm.set_handler(F_DATASCAD,datascad_handler);
sm.set_handler(F_IMPRATA,imprata_handler);
sm.set_handler(F_IMPPROVV,improvv_handler);
sm.set_handler(DLG_ENABLE,enable_handler);
dispatch_e_menu(MENU_ITEM(1));
return TRUE;
@ -309,8 +391,14 @@ bool TGestione_provv_app::create()
bool TGestione_provv_app::destroy()
{
delete _msk;
delete _provv;
delete _documento;
delete _prag;
delete _provv;
delete _doc;
delete _rdoc;
delete _tab;
delete _cfven;
delete _occas;
return TRUE;
}
@ -368,7 +456,7 @@ void TGestione_provv_app::load_provvigioni(TMask* m)
KEY k;
bool repeat;
const char* msg = _prag->rows() == 0 ? "Registrare i dati inseriti" : "Registrare le modifiche" ;
const char* msg = _prag->items() == 0 ? "Registrare i dati inseriti" : "Registrare le modifiche" ;
fill_sheet_doc(); // Inizializza lo sheet dei documenti
_dirty = FALSE;

View File

@ -35,4 +35,5 @@
#define F_PROVVPAG 108
#define F_SALDATA 109
#define F_TIPOPAGPR 110
#define DLG_ENABLE 401

View File

@ -115,17 +115,17 @@ BEGIN
INPUT ANNO F_ANNO
INPUT CODNUM F_CODNUM
INPUT NDOC F_NDOC
DISPLAY "Anno" ANNO
DISPLAY "Codice numerazione" CODNUM
DISPLAY "Numero documento" NDOC
DISPLAY "Anno@10" ANNO
DISPLAY "Cod. num.@15" CODNUM
DISPLAY "Num. doc.@15" NDOC
OUTPUT F_ANNO ANNO
OUTPUT F_CODNUM CODNUM
OUTPUT F_NDOC NDOC
OUTPUT F_DATADOC DATADOC
OUTPUT F_CLIENTE CODCF
OUTPUT F_CODVAL CODVAL
OUTPUT F_CAMBIO CAMBIO
OUTPUT F_DATACAMBIO DATACAMBIO
// OUTPUT F_DATADOC DATADOC
// OUTPUT F_CLIENTE CODCF
// OUTPUT F_CODVAL CODVAL
// OUTPUT F_CAMBIO CAMBIO
// OUTPUT F_DATACAMBIO DATACAMBIO
OUTPUT F_TIPOPAG -401->S4
ADD RUN VE0 -1
END
@ -138,13 +138,13 @@ END
NUMBER F_IMPDOC 18 2
BEGIN
PROMPT 2 4 "Importo doc. "
PICTURE "##.###.###.###.###"
PICTURE "."
END
NUMBER F_IMPPRDOC 18 2
BEGIN
PROMPT 2 5 "Importo provv. doc. "
PICTURE "##.###.###.###.###"
PICTURE "."
NUM_EXPR {(#THIS_FIELD <= #F_IMPDOC)}
WARNING "L'importo della provvigione deve essere minore dell'importo documento"
END
@ -152,7 +152,7 @@ END
NUMBER F_IMPNETDOC 18 2
BEGIN
PROMPT 2 6 "Base di calcolo "
PICTURE "##.###.###.###.###"
PICTURE "."
NUM_EXPR {(#THIS_FIELD <= #F_IMPDOC)}
WARNING "L'importo della base di calcolo deve essere minore dell'importo documento"
END
@ -249,19 +249,19 @@ END
NUMBER F_IMPRATA 18 2
BEGIN
PROMPT 2 3 "Importo rata "
PICTURE "##.###.###.###.###"
PICTURE "."
END
NUMBER F_IMPPROVV 18 2
BEGIN
PROMPT 2 4 "Importo provvigione "
PICTURE "##.###.###.###.###"
PICTURE "."
END
NUMBER F_PAGMAT 18 2
BEGIN
PROMPT 2 7 "Importo pagamento maturato "
PICTURE "##.###.###.###.###"
PICTURE "."
NUM_EXPR {(#THIS_FIELD <= #F_IMPRATA)}
WARNING "L'importo pagamento maturato deve essere minore dell'importo della rata"
END
@ -269,7 +269,7 @@ END
NUMBER F_PROVVMAT 18 2
BEGIN
PROMPT 2 8 "Importo provvigione maturata "
PICTURE "##.###.###.###.###"
PICTURE "."
NUM_EXPR {(#THIS_FIELD <= #F_IMPPROVV)}
WARNING "L'importo provvigione maturata deve essere minore dell'importo della provvigione"
END
@ -277,15 +277,17 @@ END
NUMBER F_PAGATO 18 2
BEGIN
PROMPT 2 5 "Importo rata pagata "
PICTURE "##.###.###.###.###"
PICTURE "."
FLAGS "D"
GROUP 5
END
NUMBER F_PROVVPAG 18 2
BEGIN
PROMPT 2 6 "Importo provvigione pagata "
PICTURE "##.###.###.###.###"
PICTURE "."
FLAGS "D"
GROUP 5
END
BOOLEAN F_SALDATA
@ -309,17 +311,22 @@ END
BUTTON DLG_OK 9 2
BEGIN
PROMPT -13 -1 ""
PROMPT -14 -1 ""
END
BUTTON DLG_CANCEL 9 2
BEGIN
PROMPT -23 -1 ""
PROMPT -24 -1 ""
END
BUTTON DLG_DELREC 9 2
BEGIN
PROMPT -33 -1 ""
BEGIN
PROMPT -34 -1 ""
END
BUTTON DLG_ENABLE 9 2
BEGIN
PROMPT -44 -1 "~Abilita"
END
ENDPAGE

View File

@ -9,6 +9,8 @@
#include <recarray.h>
#endif
#include "agenti.h"
class TRata : public TSortable
{
TDate _datascad;
@ -26,11 +28,15 @@ public:
const real impprovv() const { return _impprovv;}
const real pagato() const { return _pagato;}
const real provvpag() const { return _provvpag;}
const real provvmat() const { return _pagmat;}
const real pagmat() const { return _provvmat;}
const real provvmat() const { return _provvmat;}
const real pagmat() const { return _pagmat;}
const bool saldata() const { return _saldata;}
const char generata() const { return _generata;}
const int tipopagpr()const { return _tipopagpr;}
void set_rata(int n) { _nrata = n; }
void set_datascad(TDate& d) { _datascad = d; }
void set_imprata(real& r) { _imprata = r; }
void set_impprovv(real& r) { _impprovv = r; }
void set_saldata(bool b = TRUE) { _saldata = b; }
void set_generata(char g = ' ') { _generata = g; }
void set(TRectype& rec);
@ -66,8 +72,8 @@ public:
const real cambio() const { return _cambio;}
const real impnet() const { return _impnetdoc;}
const int items() { return _rows.items();}
TRata& row(int i) { return (TRata&) _rows[i]; }
TRata& operator[](int i) { return row(i); }
TRata& row(int i, bool create = FALSE);
TRata& operator[](int i){ return row(i,FALSE); }
void add_rata(TRata* r) {_rows.add(r);}
void remove_rata(int i = -1) {_rows.destroy(i,TRUE);}
// Ordina le rate
@ -80,26 +86,30 @@ public:
~TRate_doc() {}
};
class TProvvigioni_agente : public TObject
class TProvvigioni_agente : public TRectype
{
TString16 _agente; // Codice agente
TRecord_array *_rows; // Righe provvigionali (LF_PROVV) usato per leggere/scrivere
//TRecord_array *_rows; // Righe provvigionali (LF_PROVV) usato per leggere/scrivere
TRelation* _provv_rel;
TCursor* _provv_cur;
TAssoc_array _rate; // Array associativo per ANNO+CODNUM+NDOC
// contiene le informazioni del documento con le relative rate.
protected:
void rate2rows();
int rate2rows(int action);
public:
const TString16& agente () const { return _agente;}
const TString16& agente () const { return _agente;}
real perc_fatt() const { return get_real(AGE_PERCFATT);}
real perc_fissa() const { return get_real(AGE_PERCPROVV);}
// Per operare direttamente sulle righe
const TRectype& operator [](int index) const
{ return _rows->operator[](index);}
TRectype& operator[] (int index) { return _rows->operator[](index);}
const int rows() const { return _rows->rows();}
//const TRectype& operator [](int index) const
// { return _rows->operator[](index);}
//TRectype& operator[] (int index) { return _rows->operator[](index);}
const int items() const { return _rate.items();}
// lettura, scrittura ecc...
int read(const char* agente);
int write(bool rows = FALSE); // Se rows == TRUE scrive le righe cosi' come sono, senza chiamare la rate2rows
int rewrite(bool rows = FALSE);
int remove(bool rows = FALSE);
int read(const char* agente, const int anno = 0, const char* codnum = NULL, const long = 0L);
int write() { return rate2rows(0); }
int rewrite() { return rate2rows(1); }
int remove() { return rate2rows(2); }
// Restituisce un elenco di documenti che hanno rate per le provvigioni di questo agente
int documenti(TString_array& kl) { return _rate.get_keys(kl); }
// Per accedere tramite singole rate...
@ -108,6 +118,7 @@ public:
// Rimuove le rate del documento indicato
void remove_rate(int anno, const char* codnum, long ndoc);
void remove_rate(const char* key);
void destroy() { _rate.destroy(); }
TProvvigioni_agente(const char* agente);
TProvvigioni_agente() ;
~TProvvigioni_agente();

View File

@ -5,47 +5,68 @@
// TProvvigioni_agente
TProvvigioni_agente::TProvvigioni_agente()
TProvvigioni_agente::TProvvigioni_agente() : TRectype(LF_AGENTI)
{
_rows = new TRecord_array(LF_PROVV,PROV_NRIGA);
// _rows = new TRecord_array(LF_PROVV,PROV_NRIGA);
_provv_rel = new TRelation(LF_PROVV);
_provv_cur = new TCursor(_provv_rel);
}
TProvvigioni_agente::TProvvigioni_agente(const char* agente)
TProvvigioni_agente::TProvvigioni_agente(const char* agente) : TRectype(LF_AGENTI)
{
_rows = new TRecord_array(LF_PROVV,PROV_NRIGA);
//_rows = new TRecord_array(LF_PROVV,PROV_NRIGA);
_provv_rel = new TRelation(LF_PROVV);
_provv_cur = new TCursor(_provv_rel);
read(agente);
}
TProvvigioni_agente::~TProvvigioni_agente()
{
delete _rows;
// delete _rows;
delete _provv_rel;
delete _provv_cur;
}
int TProvvigioni_agente::read(const char* agente)
int TProvvigioni_agente::read(const char* agente, const int anno, const char* codnum, const long ndoc)
{
int err = NOERR;
TRectype rec(LF_PROVV);
rec.put(PROV_CODAGE,agente);
_agente = agente;
_rate.destroy();
_rows->destroy_rows();
err = _rows->read(rec); // Legge tutte le righe provvigionali di codesto agente
destroy(); // Cancella eventuali residui
TLocalisamfile age(LF_AGENTI);
TRectype::put(AGE_CODAGE,agente);
err = TRectype::read(age); // Carica i dati dell'agente
if (err != NOERR)
return err;
const int rows = _rows->rows();
int anno;
long ndoc;
TString key,codnum;
for (int i = 1; i <= rows; i++) // Compila l'assoc_array per documenti/rate
_agente = agente;
TRectype rec_from(LF_PROVV);
rec_from.put(PROV_CODAGE,agente);
if (anno != 0)
rec_from.put(PROV_ANNO, anno);
if (codnum != NULL)
rec_from.put(PROV_CODNUM, codnum);
if (ndoc != 0L)
rec_from.put(PROV_NDOC, ndoc);
TRectype rec_to(rec_from);
_provv_cur->setregion(rec_from, rec_to); // Cursore da leggere contenente le provvigioni
const long items = _provv_cur->items();
TRectype& r = _provv_cur->file().curr();
TString key, codnum1;
int anno1;
long ndoc1;
for (long i = 0; i < items; i++) // Compila l'assoc_array per documenti/rate
{
TRectype& r = _rows->row(i,FALSE);
anno = r.get_int(DOC_ANNO);
codnum = r.get(DOC_CODNUM);
ndoc = r.get_long(DOC_NDOC);
key.format("%4d%4s%7ld",anno,(const char*)codnum,ndoc); // Compone la chiave
*_provv_cur = i; // posiziona il cursore
anno1 = r.get_int(PROV_ANNO);
codnum1 = r.get(PROV_CODNUM);
ndoc1 = r.get_long(PROV_NDOC);
key.format("%4d%4s%7ld",anno1,(const char*)codnum1,ndoc1); // Compone la chiave
const bool exist = _rate.is_key(key); // Guarda se esiste gia' questo documento
TRate_doc com_rata(r);
@ -63,32 +84,39 @@ int TProvvigioni_agente::read(const char* agente)
return err;
}
void TProvvigioni_agente::rate2rows()
int TProvvigioni_agente::rate2rows(int action)
{
_rows->destroy_rows();
// Setta la chiave del TRecord_array
TRectype* chiave = new TRectype(LF_PROVV);
chiave->put(PROV_CODAGE, _agente);
_rows->set_key(chiave);
// Scorre gli elementi di _rate (TDoc_rate) uno ad uno
// per settare le righe provvigionali
TString_array kl;
const int items = documenti(kl); // Prende l'elenco dei documenti
kl.sort(); // ordina per documento
int nrow = 1;
for (int i = 0; i < items; i++)
int err = NOERR;
for (int i = 0; i < items && err == NOERR; i++)
{
TRate_doc& rd = (TRate_doc&)_rate[kl.row(i)];
const int anno = rd.anno();
const long ndoc = rd.ndoc();
TString codnum(rd.codnum());
TRecord_array* rows = new TRecord_array(LF_PROVV,PROV_NRIGA);
// Chiave del TRecord_array
TRectype* k = new TRectype(LF_PROVV);
k->put(PROV_CODAGE, _agente);
k->put(PROV_ANNO,anno);
k->put(PROV_CODNUM,codnum);
k->put(PROV_NDOC,ndoc);
rows->set_key(k);
const int ritems = rd.items(); // Ciclo per rate di questo documento
int nrow = 1;
for (int j = 0; j < ritems; j++)
{
TRata& rt = rd[j];
TRectype* record = new TRectype(LF_PROVV);
record->put(PROV_CODAGE,_agente);
record->put(PROV_ANNO,anno);
record->put(PROV_CODNUM,codnum);
record->put(PROV_NDOC,ndoc);
record->put(PROV_NRIGA,nrow++);
record->put(PROV_ANNO,rd.anno());
record->put(PROV_CODNUM,rd.codnum());
record->put(PROV_NDOC,rd.ndoc());
record->put(PROV_NRATA,rt.rata());
record->put(PROV_GENERATA,rt.generata());
record->put(PROV_SALDATA,rt.saldata());
@ -109,30 +137,25 @@ void TProvvigioni_agente::rate2rows()
record->put(PROV_PROVVPAG,rt.provvpag());
record->put(PROV_PAGMAT,rt.pagmat());
record->put(PROV_PROVVMAT,rt.provvmat());
_rows->add_row(record);
rows->add_row(record);
}
switch (action)
{
case 0: // write
err = rows->write();
break;
case 1: // rewrite
err = rows->rewrite();
break;
case 2: // remove
err = rows->remove();
break;
default: // remove
break;
}
delete rows;
}
}
int TProvvigioni_agente::write(bool rows)
{
if (!rows)
rate2rows();
return _rows->write();
}
int TProvvigioni_agente::rewrite(bool rows)
{
if (!rows)
rate2rows();
return _rows->rewrite();
}
int TProvvigioni_agente::remove(bool rows)
{
if (!rows)
rate2rows();
return _rows->remove();
return err;
}
TRate_doc& TProvvigioni_agente::rate(int anno, const char* codnum, long ndoc, bool create)
@ -184,12 +207,18 @@ void TProvvigioni_agente::remove_rate(const char* key)
/////////////////////////////////////////////////////////////////////////////////
// TRate_doc
/////////////////////////////////////////////////////////////////////////////////
TRate_doc::TRate_doc(TRectype& rec)
{
set(rec); // bleah!
}
TRata& TRate_doc::row(int i, bool create)
{
if (create && _rows.objptr(i) == NULL) // Parametro di creazione
_rows.add(new TRata(),i);
return (TRata&) _rows[i];
}
bool TRate_doc::ok_provvigione()
{
real totprov;