Patch level : 2.2 bopath

Files correlati     : ca0, ca2 e tracciati
Ricompilazione Demo : [ ]
Commento            :

Prima versione funzionante :-) dei movimenti di contabilita' analitica
Richiesto aggiornamento modulo 'include' per poter utilizzare il nuovo
fantastico costruttore dei TRecord_array


git-svn-id: svn://10.65.10.50/trunk@12688 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2005-02-11 15:31:10 +00:00
parent fb861c0822
commit 08d0526d91
11 changed files with 700 additions and 273 deletions

View File

@ -41,3 +41,8 @@
#define F_PDCI_4 136 #define F_PDCI_4 136
#define F_DESPDCI_4 137 #define F_DESPDCI_4 137
#define F_USE_PDCC 138 #define F_USE_PDCC 138
#define F_CDCREQ 140
#define F_CMSREQ 141
#define F_FSCREQ 142
#define F_PDCREQ 143

View File

@ -61,24 +61,28 @@ BEGIN
FIELD FathFasi FIELD FathFasi
END END
GROUPBOX DLG_NULL 78 7 ENDPAGE
PAGE "Pagina 2" -1 -1 78 10
GROUPBOX DLG_NULL 78 8
BEGIN BEGIN
PROMPT 1 8 "@bCentro di costo" PROMPT 1 1 "@bCentro di costo"
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 4 9 "Formato codice" PROMPT 4 2 "Formato codice"
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 27 9 "Descrizione" PROMPT 27 2 "Descrizione"
END END
STRING F_CDC_1 20 STRING F_CDC_1 20
BEGIN BEGIN
PROMPT 2 10 "1 " PROMPT 2 3 "1 "
MESSAGE EMPTY CLEAR,F_CDC_2|CLEAR,F_DESCDC_2|K_TAB,F_CDC_2|RESET,F_DESCDC_1 MESSAGE EMPTY CLEAR,F_CDC_2|CLEAR,F_DESCDC_2|K_TAB,F_CDC_2|RESET,F_DESCDC_1
MESSAGE ENABLE,F_CDC_2|ENABLE,F_DESCDC_2 MESSAGE ENABLE,F_CDC_2|ENABLE,F_DESCDC_2
FIELD CdC(1) FIELD CdC(1)
@ -86,13 +90,13 @@ END
STRING F_DESCDC_1 50 STRING F_DESCDC_1 50
BEGIN BEGIN
PROMPT 27 10 "" PROMPT 27 3 ""
FIELD CdCDes(1) FIELD CdCDes(1)
END END
STRING F_CDC_2 20 STRING F_CDC_2 20
BEGIN BEGIN
PROMPT 2 11 "2 " PROMPT 2 4 "2 "
MESSAGE EMPTY CLEAR,F_CDC_3|CLEAR,F_DESCDC_3|K_TAB,F_CDC_3|RESET,F_DESCDC_2 MESSAGE EMPTY CLEAR,F_CDC_3|CLEAR,F_DESCDC_3|K_TAB,F_CDC_3|RESET,F_DESCDC_2
MESSAGE ENABLE,F_CDC_3|ENABLE,F_DESCDC_3 MESSAGE ENABLE,F_CDC_3|ENABLE,F_DESCDC_3
FLAGS "G" FLAGS "G"
@ -101,13 +105,13 @@ END
STRING F_DESCDC_2 50 STRING F_DESCDC_2 50
BEGIN BEGIN
PROMPT 27 11 "" PROMPT 27 4 ""
FIELD CdCDes(2) FIELD CdCDes(2)
END END
STRING F_CDC_3 20 STRING F_CDC_3 20
BEGIN BEGIN
PROMPT 2 12 "3 " PROMPT 2 5 "3 "
MESSAGE EMPTY CLEAR,F_CDC_4|CLEAR,F_DESCDC_4|K_TAB,F_CDC_4|RESET,F_DESCDC_3 MESSAGE EMPTY CLEAR,F_CDC_4|CLEAR,F_DESCDC_4|K_TAB,F_CDC_4|RESET,F_DESCDC_3
MESSAGE ENABLE,F_CDC_4|ENABLE,F_DESCDC_4 MESSAGE ENABLE,F_CDC_4|ENABLE,F_DESCDC_4
FLAGS "G" FLAGS "G"
@ -116,13 +120,13 @@ END
STRING F_DESCDC_3 50 STRING F_DESCDC_3 50
BEGIN BEGIN
PROMPT 27 12 "" PROMPT 27 5 ""
FIELD CdCDes(3) FIELD CdCDes(3)
END END
STRING F_CDC_4 20 STRING F_CDC_4 20
BEGIN BEGIN
PROMPT 2 13 "4 " PROMPT 2 6 "4 "
MESSAGE EMPTY RESET,F_DESCDC_4 MESSAGE EMPTY RESET,F_DESCDC_4
FLAGS "G" FLAGS "G"
FIELD CdC(4) FIELD CdC(4)
@ -130,28 +134,34 @@ END
STRING F_DESCDC_4 50 STRING F_DESCDC_4 50
BEGIN BEGIN
PROMPT 27 13 "" PROMPT 27 6 ""
FIELD CdCDes(4) FIELD CdCDes(4)
END END
GROUPBOX DLG_NULL 78 7 BOOLEAN F_CDCREQ
BEGIN BEGIN
PROMPT 1 15 "@bCommessa" PROMPT 2 7 "Obbligatorio nelle righe dei movimenti"
FIELD CdcRequired
END
GROUPBOX DLG_NULL 78 8
BEGIN
PROMPT 1 9 "@bCommessa"
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 4 16 "Formato codice" PROMPT 4 10 "Formato codice"
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 27 16 "Descrizione" PROMPT 27 10 "Descrizione"
END END
STRING F_CMS_1 20 STRING F_CMS_1 20
BEGIN BEGIN
PROMPT 2 17 "1 " PROMPT 2 11 "1 "
MESSAGE EMPTY CLEAR,F_CMS_2|CLEAR,F_DESCMS_2|K_TAB,F_CMS_2|RESET,F_DESCMS_1 MESSAGE EMPTY CLEAR,F_CMS_2|CLEAR,F_DESCMS_2|K_TAB,F_CMS_2|RESET,F_DESCMS_1
MESSAGE ENABLE,F_CMS_2|ENABLE,F_DESCMS_2 MESSAGE ENABLE,F_CMS_2|ENABLE,F_DESCMS_2
FIELD Cms(1) FIELD Cms(1)
@ -159,13 +169,13 @@ END
STRING F_DESCMS_1 50 STRING F_DESCMS_1 50
BEGIN BEGIN
PROMPT 27 17 "" PROMPT 27 11 ""
FIELD CmsDes(1) FIELD CmsDes(1)
END END
STRING F_CMS_2 20 STRING F_CMS_2 20
BEGIN BEGIN
PROMPT 2 18 "2 " PROMPT 2 12 "2 "
MESSAGE EMPTY CLEAR,F_CMS_3|CLEAR,F_DESCMS_3|K_TAB,F_CMS_3|RESET,F_DESCMS_2 MESSAGE EMPTY CLEAR,F_CMS_3|CLEAR,F_DESCMS_3|K_TAB,F_CMS_3|RESET,F_DESCMS_2
MESSAGE ENABLE,F_CMS_3|ENABLE,F_DESCMS_3 MESSAGE ENABLE,F_CMS_3|ENABLE,F_DESCMS_3
FLAGS "G" FLAGS "G"
@ -174,13 +184,13 @@ END
STRING F_DESCMS_2 50 STRING F_DESCMS_2 50
BEGIN BEGIN
PROMPT 27 18 "" PROMPT 27 12 ""
FIELD CmsDes(2) FIELD CmsDes(2)
END END
STRING F_CMS_3 20 STRING F_CMS_3 20
BEGIN BEGIN
PROMPT 2 19 "3 " PROMPT 2 13 "3 "
MESSAGE EMPTY CLEAR,F_CMS_4|CLEAR,F_DESCMS_4|K_TAB,F_CMS_4|RESET,F_DESCMS_3 MESSAGE EMPTY CLEAR,F_CMS_4|CLEAR,F_DESCMS_4|K_TAB,F_CMS_4|RESET,F_DESCMS_3
MESSAGE ENABLE,F_CMS_4|ENABLE,F_DESCMS_4 MESSAGE ENABLE,F_CMS_4|ENABLE,F_DESCMS_4
FLAGS "G" FLAGS "G"
@ -189,13 +199,13 @@ END
STRING F_DESCMS_3 50 STRING F_DESCMS_3 50
BEGIN BEGIN
PROMPT 27 19 "" PROMPT 27 13 ""
FIELD CmsDes(3) FIELD CmsDes(3)
END END
STRING F_CMS_4 20 STRING F_CMS_4 20
BEGIN BEGIN
PROMPT 2 20 "4 " PROMPT 2 14 "4 "
MESSAGE EMPTY RESET,F_DESCMS_4 MESSAGE EMPTY RESET,F_DESCMS_4
FLAGS "G" FLAGS "G"
FIELD Cms(4) FIELD Cms(4)
@ -203,15 +213,21 @@ END
STRING F_DESCMS_4 50 STRING F_DESCMS_4 50
BEGIN BEGIN
PROMPT 27 20 "" PROMPT 27 14 ""
FIELD CmsDes(4) FIELD CmsDes(4)
END END
BOOLEAN F_CMSREQ
BEGIN
PROMPT 2 15 "Obbligatorio nelle righe dei movimenti"
FIELD CmsRequired
END
ENDPAGE ENDPAGE
PAGE "Pagina 2" -1 -1 78 10 PAGE "Pagina 3" -1 -1 78 10
GROUPBOX DLG_NULL 78 7 GROUPBOX DLG_NULL 78 8
BEGIN BEGIN
PROMPT 1 1 "@bFase" PROMPT 1 1 "@bFase"
END END
@ -284,85 +300,108 @@ BEGIN
FIELD FscDes(4) FIELD FscDes(4)
END END
GROUPBOX DLG_NULL 78 8 BOOLEAN F_FSCREQ
BEGIN BEGIN
PROMPT 1 8 "@bPiano dei conti industriale" PROMPT 2 7 "Obbligatorio nelle righe dei movimenti"
FIELD FscRequired
END
GROUPBOX DLG_NULL 78 9
BEGIN
PROMPT 1 10 "@bPiano dei conti industriale"
END END
BOOLEAN F_USE_PDCC BOOLEAN F_USE_PDCC
BEGIN BEGIN
PROMPT 2 9 "Utilizza il piano dei conti contabile" PROMPT 2 11 "Utilizza il piano dei conti contabile"
MESSAGE TRUE CLEAR,F_PDCI_1|CLEAR,F_DESPDCI_1 MESSAGE TRUE HIDE,5@
MESSAGE FALSE ENABLE,F_PDCI_1|ENABLE,F_DESPDCI_1 MESSAGE FALSE SHOW,5@
FIELD UsePdcc FIELD UsePdcc
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 4 10 "Formato codice" PROMPT 4 12 "Formato codice"
GROUP 5
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 27 10 "Descrizione" PROMPT 27 12 "Descrizione"
GROUP 5
END END
STRING F_PDCI_1 20 STRING F_PDCI_1 20
BEGIN BEGIN
PROMPT 2 11 "1 " PROMPT 2 13 "1 "
MESSAGE EMPTY CLEAR,F_PDCI_2|CLEAR,F_DESPDCI_2|K_TAB,F_PDCI_2|RESET,F_DESPDCI_1 MESSAGE EMPTY CLEAR,F_PDCI_2|CLEAR,F_DESPDCI_2|K_TAB,F_PDCI_2|RESET,F_DESPDCI_1
MESSAGE ENABLE,F_PDCI_2|ENABLE,F_DESPDCI_2 MESSAGE ENABLE,F_PDCI_2|ENABLE,F_DESPDCI_2
FIELD Pdci(1) FIELD Pdci(1)
GROUP 5
END END
STRING F_DESPDCI_1 50 STRING F_DESPDCI_1 50
BEGIN BEGIN
PROMPT 27 11 "" PROMPT 27 13 ""
FIELD PdciDes(1) FIELD PdciDes(1)
GROUP 5
END END
STRING F_PDCI_2 20 STRING F_PDCI_2 20
BEGIN BEGIN
PROMPT 2 12 "2 " PROMPT 2 14 "2 "
MESSAGE EMPTY CLEAR,F_PDCI_3|CLEAR,F_DESPDCI_3|K_TAB,F_PDCI_3|RESET,F_DESPDCI_2 MESSAGE EMPTY CLEAR,F_PDCI_3|CLEAR,F_DESPDCI_3|K_TAB,F_PDCI_3|RESET,F_DESPDCI_2
MESSAGE ENABLE,F_PDCI_3|ENABLE,F_DESPDCI_3 MESSAGE ENABLE,F_PDCI_3|ENABLE,F_DESPDCI_3
FLAGS "G" FLAGS "G"
FIELD Pdci(2) FIELD Pdci(2)
GROUP 5
END END
STRING F_DESPDCI_2 50 STRING F_DESPDCI_2 50
BEGIN BEGIN
PROMPT 27 12 "" PROMPT 27 14 ""
FIELD PdciDes(2) FIELD PdciDes(2)
GROUP 5
END END
STRING F_PDCI_3 20 STRING F_PDCI_3 20
BEGIN BEGIN
PROMPT 2 13 "3 " PROMPT 2 15 "3 "
MESSAGE EMPTY CLEAR,F_PDCI_4|CLEAR,F_DESPDCI_4|K_TAB,F_PDCI_4|RESET,F_DESPDCI_3 MESSAGE EMPTY CLEAR,F_PDCI_4|CLEAR,F_DESPDCI_4|K_TAB,F_PDCI_4|RESET,F_DESPDCI_3
MESSAGE ENABLE,F_PDCI_4|ENABLE,F_DESPDCI_4 MESSAGE ENABLE,F_PDCI_4|ENABLE,F_DESPDCI_4
FLAGS "G" FLAGS "G"
FIELD Pdci(3) FIELD Pdci(3)
GROUP 5
END END
STRING F_DESPDCI_3 50 STRING F_DESPDCI_3 50
BEGIN BEGIN
PROMPT 27 13 "" PROMPT 27 15 ""
FIELD PdciDes(3) FIELD PdciDes(3)
GROUP 5
END END
STRING F_PDCI_4 20 STRING F_PDCI_4 20
BEGIN BEGIN
PROMPT 2 14 "4 " PROMPT 2 16 "4 "
MESSAGE EMPTY RESET,F_DESPDCI_4 MESSAGE EMPTY RESET,F_DESPDCI_4
FLAGS "G" FLAGS "G"
FIELD Pdci(4) FIELD Pdci(4)
GROUP 5
END END
STRING F_DESPDCI_4 50 STRING F_DESPDCI_4 50
BEGIN BEGIN
PROMPT 27 14 "" PROMPT 27 16 ""
FIELD PdciDes(4) FIELD PdciDes(4)
GROUP 5
END
BOOLEAN F_PDCREQ
BEGIN
PROMPT 2 17 "Obbligatorio nelle righe dei movimenti"
FIELD PdciRequired
GROUP 5
END END
ENDPAGE ENDPAGE

View File

@ -32,10 +32,10 @@ BEGIN
USE LF_RIP USE LF_RIP
INPUT TIPO F_TIPO SELECT INPUT TIPO F_TIPO SELECT
INPUT CODICE F_CODICE_I INPUT CODICE F_CODICE_I
DISPLAY "Codice " CODICE DISPLAY "Codice@8" CODICE
DISPLAY "Gruppo" GRUPPO DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" CONTO DISPLAY "Sottoconto" SOTTOCONTO
DISPLAY "Descrizione@50" DESCRIZ DISPLAY "Descrizione@50" DESCRIZ
OUTPUT F_CODICE_I CODICE OUTPUT F_CODICE_I CODICE
OUTPUT F_DESCRIZ_I DESCRIZ OUTPUT F_DESCRIZ_I DESCRIZ

View File

@ -1,7 +1,9 @@
#include <automask.h> #include <automask.h>
#include <defmask.h> #include <defmask.h>
#include <recarray.h> #include <recarray.h>
#include <recset.h>
#include <relapp.h> #include <relapp.h>
#include <statbar.h>
#include "ca2.h" #include "ca2.h"
#include "ca2100a.h" #include "ca2100a.h"
@ -9,24 +11,80 @@
#include "../cg/cglib01.h" #include "../cg/cglib01.h"
#include <mov.h>
#include <rmov.h>
#include "movana.h" #include "movana.h"
#include "rmovana.h" #include "rmovana.h"
#include "saldana.h"
class TMovanal_msk : public TAutomask class TMovanal_msk : public TAutomask
{ {
TAssoc_array _saldi;
protected: protected:
virtual bool on_field_event(TOperable_field& o, TField_event fe, long jolly); virtual bool on_field_event(TOperable_field& o, TField_event fe, long jolly);
virtual bool can_be_closed() const; virtual bool can_be_closed() const;
virtual bool on_key(KEY key); virtual bool on_key(KEY key);
const TToken_string& rec2key(const TRectype& rec) const;
void aggiorna_saldo_riga(int r);
const TString& somma_campi(TToken_string& row, int first) const;
// Lettura movimento contabile
TToken_string& get_rip_row(const TRectype& rrip);
void split_cg_row(const TRectype& row, const TRecord_array& rrip);
void load_cg_row(const TRectype& row);
void load_cg_mov();
public: public:
void reset_saldi();
TImporto& saldo(const TRectype& row);
void show_locked_buttons(); void show_locked_buttons();
bool row2rec(int row, TRectype& rec) const;
void row2imp(const TToken_string& row, TImporto& imp) const;
bool row2imp(int r, TImporto& imp) const;
void imp2row(const TImporto& imp, TToken_string& row) const;
void spezza_campo(const TString& str, TToken_string& row, int first) const;
TMovanal_msk(); TMovanal_msk();
virtual ~TMovanal_msk() { } virtual ~TMovanal_msk() { }
}; };
class TMovanal_app : public TRelation_application
{
TRelation* _rel;
TMovanal_msk* _msk;
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual TMask* get_mask(int);
virtual TRelation* get_relation() const;
virtual bool get_next_key(TToken_string& key);
void write_rows(const TMask& m);
void read_rows(const TMask& m);
virtual bool protected_record(TRectype& rec);
virtual int write(const TMask& m);
virtual int rewrite(const TMask& m);
virtual int read(TMask& m);
virtual void init_query_mode(TMask& m);
virtual void init_insert_mode(TMask& m);
virtual void init_modify_mode(TMask& m);
};
static TMovanal_app& app() { return (TMovanal_app&)main_app(); }
///////////////////////////////////////////////////////////
// TMovanal_msk
///////////////////////////////////////////////////////////
bool TMovanal_msk::can_be_closed() const bool TMovanal_msk::can_be_closed() const
{ {
return mode() != MODE_MOD || !get_bool(F_BLOCCATO); return mode() != MODE_MOD || !get_bool(F_BLOCCATO);
@ -46,11 +104,147 @@ void TMovanal_msk::show_locked_buttons()
{ {
const bool editmode = mode() == MODE_MOD; const bool editmode = mode() == MODE_MOD;
const bool unlocked = can_be_closed(); const bool unlocked = can_be_closed();
const bool is_trans = app().is_transaction();
show (F_BLOCCATO, editmode); show (F_BLOCCATO, editmode);
enable(F_BLOCCATO, unlocked); enable(F_BLOCCATO, unlocked);
enable(DLG_SAVEREC, unlocked && edit_mode()); // Abilito il "Registra" solo in modo modifica enable(DLG_SAVEREC, unlocked && (editmode || mode() == MODE_INS));
enable(DLG_DELREC, unlocked && editmode); enable(DLG_DELREC, unlocked && editmode);
enable(DLG_QUIT, unlocked); enable(DLG_QUIT, unlocked && !is_trans);
enable(DLG_CANCEL, mode() == MODE_QUERY || !is_trans);
enable(F_RESET, unlocked);
}
TToken_string& TMovanal_msk::get_rip_row(const TRectype& rrip)
{
TSheet_field& sheet = sfield(F_RIGHE);
const int pos_cdc = sheet.cid2index(S_CDC1);
const int pos_cms = sheet.cid2index(S_CMS1);
const int pos_fas = sheet.cid2index(S_FAS1);
const int pos_con = sheet.cid2index(S_CON1);
TToken_string keyrip, keyrow;
keyrip.add(rrip.get("CODCOSTO"));
keyrip.add(rrip.get("CODCMS"));
keyrip.add(rrip.get("CODFASE"));
keyrip.add(rrip.get("CODCONTO"));
if (sheet.items() > 0)
{
FOR_EACH_SHEET_ROW(sheet, i, row)
{
keyrow = somma_campi(*row, pos_cdc);
keyrow.add(somma_campi(*row, pos_cms));
keyrow.add(somma_campi(*row, pos_fas));
keyrow.add(somma_campi(*row, pos_con));
if (keyrow == keyrip)
return *row;
}
}
TToken_string& row = sheet.row(-1);
spezza_campo(keyrip.get(0), row, pos_cdc);
spezza_campo(keyrip.get(1), row, pos_cms);
spezza_campo(keyrip.get(2), row, pos_fas);
spezza_campo(keyrip.get(3), row, pos_con);
return row;
}
void TMovanal_msk::split_cg_row(const TRectype& row, const TRecord_array& rrip)
{
// Importo totale da distribuire arrotondato ai decimali della valuta di conto
TGeneric_distrib distrib(row.get_real(RMV_IMPORTO), TCurrency::get_firm_dec());
// Calcolo tutte le percentuali da ripartire
int i;
for (i = 1; i <= rrip.rows(); i++)
distrib.add(rrip[i].get_real("RIPARTO"));
for (i = 1; i <= rrip.rows(); i++)
{
TToken_string& riga = get_rip_row(rrip[i]); // Cerca o crea la riga cui sommare la quota
TImporto impriga; row2imp(riga, impriga); // Legge l'importo della riga
const TImporto imp(row.get_char(RMV_SEZIONE), distrib.get()); // Legge la quota da distribuire
impriga += imp; impriga.normalize(); // Incrementa l'importo della riga e lo normalizza
imp2row(impriga, riga); // Aggiorna la riga
TString80 desc; riga.get(2); // Legge descrizione riga corrente
if (desc.blank()) // Se e' vuota allora ...
riga.add(row.get(RMV_DESCR), 2); // ... ci copio la descrizione della riga contabile
}
}
void TMovanal_msk::load_cg_row(const TRectype& row)
{
// Cerco la ripartizione del sottoconto, se non la trovo uso quella del conto o del gruppo
for (int i = 3; i > 0; i--)
{
TString query = "USE RIP SELECT";
query << " (GRUPPO=" << row.get(RMV_GRUPPO) << ')'; // Il gruppo c'e' sempre
if (i > 1)
query << "&&(CONTO=" << row.get(RMV_CONTO) << ')'; // Il conto c'e' per i = 2 o 3
if (i > 2)
query << "&&(SOTTOCONTO=" << row.get(RMV_SOTTOCONTO) << ')'; // Il sottoconto c'e' per i = 3
query << "\nFROM TIPO='I'\nTO TIPO='I'";
TISAM_recordset rs(query);
if (rs.items() > 0) // Ho trovato la ripartizione: evviva!
{
TString16 codice = rs.get("CODICE").as_string();
codice.insert("I|");
TRecord_array rrip(codice, LF_RRIP); // Carico le righe di ripartizione
if (rrip.rows() > 0)
{
split_cg_row(row, rrip);
break;
}
}
}
if (i == 0) // Non ho trovato nessuno schema di riaprtizione valido
{
// Creo una riga nuova
TToken_string& riga = sfield(F_RIGHE).row(-1);
const TImporto imp(row.get_char(RMV_SEZIONE), row.get_real(RMV_IMPORTO));
imp2row(imp, riga); // Ci copio l'importo
riga.add(row.get(RMV_DESCR), 2); // e la descrizione della riga contabile
}
statbar_set_title(TASK_WIN, NULL); // Restore mask mode deleted by query stats
}
// A partire dal movimento contabile calcola il totale documento ed eventualmente prepara lo sheet
void TMovanal_msk::load_cg_mov()
{
const TString& numregcg = get(F_NUMREGCG);
const TRectype& mov = cache().get(LF_MOV, numregcg);
set(F_DATAREG, mov.get(MOV_DATAREG));
if (mode() == MODE_INS)
{
set(F_DATACOMP, mov.get(MOV_DATACOMP));
set(F_DESCR, mov.get(MOV_DESCR));
}
set(F_CODCAUS, mov.get(MOV_CODCAUS), 0x2);
set(F_NUMDOC, mov.get(MOV_NUMDOC));
set(F_DATADOC, mov.get(MOV_DATADOC));
set(F_TIPODOC, mov.get(MOV_TIPODOC));
TImporto totdoc;
TRecord_array cg(numregcg, LF_RMOV);
const bool autoinsert = sfield(F_RIGHE).items() == 0;
for (int i = 1; i <= cg.rows(); i++)
{
const TRectype& row = cg.row(i);
const TBill zio(row);
if (zio.is_analitico())
{
const TImporto imp(row.get_char(RMV_SEZIONE), row.get_real(RMV_IMPORTO));
totdoc += imp;
if (autoinsert)
load_cg_row(row);
}
}
set(F_TOTDOC, totdoc.valore());
const char sez[2] = { totdoc.sezione(), '\0' };
set(F_SEZIONE, sez);
} }
bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly) bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
@ -91,42 +285,246 @@ bool TMovanal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
return error_box(FR("La data di competenza deve appartenere all'esercizio in corso o al precedente")); return error_box(FR("La data di competenza deve appartenere all'esercizio in corso o al precedente"));
} }
break; break;
case F_TOTDOC: case F_RIGHE:
if (e == se_enter)
{
const int r = int(jolly);
aggiorna_saldo_riga(r);
}
if (e == fe_close) if (e == fe_close)
{ {
const real imp = o.get(); const TImporto totdoc(get(F_SEZIONE)[0], get_real(F_TOTDOC));
const char sez = get(F_SEZIONE)[0];
const TImporto totdoc(sez, imp);
TImporto totrig; TImporto totrig;
TSheet_field& sf = sfield(F_RIGHE); TSheet_field& sf = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(sf, i, row) FOR_EACH_SHEET_ROW(sf, i, row)
{ {
const real dare = row->get(0); TImporto imp; row2imp(*row, imp);
const real avere = row->get();
TImporto imp;
if (dare.is_zero())
imp.set('A', avere);
else
imp.set('D', dare);
totrig += imp; totrig += imp;
} }
if (totrig != totdoc) if (totrig != totdoc)
return error_box(FR("Il totale delle righe e' %s %s"), return error_box(FR("Il totale delle righe e' %s %s, mentre il totale documento e' %s %s"),
totrig.valore().string(), totrig.valore().string(), totrig.sezione() == 'D' ? TR("Dare") : TR("Avere"),
totrig.sezione() == 'D' ? TR("Dare") : TR("Avere")); totdoc.valore().string(), totdoc.sezione() == 'D' ? TR("Dare") : TR("Avere"));
}
break;
case S_DARE:
case S_AVERE:
if (e == fe_modify)
{
TSheet_field& sf = sfield(F_RIGHE);
if (!o.empty())
o.mask().reset(o.dlg() == S_DARE ? S_AVERE : S_DARE);
const int r = sfield(F_RIGHE).selected();
sf.update_row(r);
aggiorna_saldo_riga(r);
}
break;
case F_NUMREGCG:
if (e == fe_init)
{
const bool vuoto = o.empty();
enable(-5, vuoto);
if (!vuoto)
load_cg_mov();
} }
break; break;
case F_BLOCCATO: case F_BLOCCATO:
if (e == fe_modify) if (e == fe_modify)
show_locked_buttons(); {
enable(DLG_SAVEREC); // Altrimenti non riesco a registrare la variazione di stato
}
break;
case F_RESET:
if (e == fe_button)
{
TSheet_field& sf = sfield(F_RIGHE);
sf.destroy();
load_cg_mov();
sf.force_update();
}
break; break;
default: default:
if (e == fe_modify && o.dlg() >= S_CDC1 && o.dlg() <= S_CON4)
{
TSheet_field& sf = sfield(F_RIGHE);
const int r = sf.selected();
sf.update_row(r);
aggiorna_saldo_riga(r);
}
break; break;
} }
return true; return true;
} }
const TString& TMovanal_msk::somma_campi(TToken_string& row, int first) const
{
TSheet_field& sheet = sfield(F_RIGHE);
TMask& m = sheet.sheet_mask();
const short id = S_DARE + 100 + first;
TString& str = get_tmp_string(20);
TString80 token;
for (int i = 0; i < 4; i++)
{
if (m.id2pos(id+i) < 0)
break;
const TEdit_field& fld = m.efield(id+i);
token = row.get(first+i);
token.left_just(fld.size());
str << token;
}
return str;
}
void TMovanal_msk::spezza_campo(const TString& str, TToken_string& row, int first) const
{
TSheet_field& sheet = sfield(F_RIGHE);
TMask& m = sheet.sheet_mask();
TString80 token;
const short id = 201 + first;
int start = 0;
for (int i = 0; i < 4; i++)
{
if (m.id2pos(id+i) < 0)
break;
const TEdit_field& fld = m.efield(id+i);
const int len = fld.size();
token = str.mid(start, len); token.trim();
row.add(token, first+i);
start += len;
}
}
// Prende dalla riga r dello sheet i dati da scrivere nel record rec dei movimenti analitici
bool TMovanal_msk::row2rec(int r, TRectype& rec) const
{
TSheet_field& sheet = sfield(F_RIGHE);
if (r < 0 || r >= sheet.items())
return false;
TToken_string& row = sheet.row(r);
rec.put(RMOVANA_ANNOES, get(F_ANNOES));
rec.put(RMOVANA_DATAREG, get(F_DATAREG));
rec.put(RMOVANA_DESCR, row.get(sheet.cid2index(S_DESCR)));
const real dare = row.get(sheet.cid2index(S_DARE)), avere = row.get();
if (dare.is_zero())
{
rec.put(RMOVANA_SEZIONE, 'A');
rec.put(RMOVANA_IMPORTO, avere);
}
else
{
rec.put(RMOVANA_SEZIONE, 'D');
rec.put(RMOVANA_IMPORTO, dare);
}
rec.put(RMOVANA_CODCCOSTO, somma_campi(row, sheet.cid2index(S_CDC1)));
rec.put(RMOVANA_CODCMS, somma_campi(row, sheet.cid2index(S_CMS1)));
rec.put(RMOVANA_CODFASE, somma_campi(row, sheet.cid2index(S_FAS1)));
rec.put(RMOVANA_CODCONTO, somma_campi(row, sheet.cid2index(S_CON1)));
return true;
}
void TMovanal_msk::imp2row(const TImporto& imp, TToken_string& row) const
{
row.add(imp.sezione() == 'D' ? imp.valore().string() : "", 0);
row.add(imp.sezione() == 'A' ? imp.valore().string() : "", 1);
}
void TMovanal_msk::row2imp(const TToken_string& row, TImporto& imp) const
{
real dare; row.get(0, dare);
real avere; row.get(1, avere);
if (dare.is_zero())
imp.set('A', avere);
else
imp.set('D', dare);
}
bool TMovanal_msk::row2imp(int r, TImporto& imp) const
{
TSheet_field& sf = sfield(F_RIGHE);
if (r >= 0 && r < sf.items())
{
const TToken_string& row = sf.row(r);
row2imp(row, imp);
}
else
imp.set('D', ZERO);
return !imp.is_zero();
}
const TToken_string& TMovanal_msk::rec2key(const TRectype& rec) const
{
TToken_string& key = get_tmp_string();
key = get(F_TIPO);
key.add(rec.get(RMOVANA_ANNOES));
key.add(rec.get(RMOVANA_CODCCOSTO));
key.add(rec.get(RMOVANA_CODCMS));
key.add(rec.get(RMOVANA_CODFASE));
key.add(rec.get(RMOVANA_CODCONTO));
return key;
}
void TMovanal_msk::reset_saldi()
{
_saldi.destroy();
}
TImporto& TMovanal_msk::saldo(const TRectype& rec)
{
const TToken_string& key = rec2key(rec);
TImporto* imp = (TImporto*)_saldi.objptr(key);
if (imp == NULL)
{
const TRectype& saldo = cache().get(LF_SALDANA, key);
const char* fld_sez = NULL;
const char* fld_val = NULL;
switch (get(F_TIPO)[0])
{
case 'P': fld_sez = SALDANA_SEZIONEP; fld_val = SALDANA_SALDOP; break;
case 'V': fld_sez = SALDANA_SEZIONEV; fld_val = SALDANA_SALDOV; break;
default : fld_sez = SALDANA_SEZIONE; fld_val = SALDANA_SALDO; break;
}
imp = new TImporto(saldo.get_char(fld_sez), saldo.get_real(fld_val));
_saldi.add(key, imp);
}
return *imp;
}
void TMovanal_msk::aggiorna_saldo_riga(int r)
{
TRectype rec(LF_RMOVANA);
row2rec(r, rec);
const TToken_string& key = rec2key(rec);
TImporto sld = saldo(rec);
TSheet_field& sheet = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(sheet, i, row)
{
row2rec(i, rec);
const TToken_string& k = rec2key(rec);
if (k == key)
{
real dare; row->get(0, dare);
real avere; row->get(1, avere);
if (dare.is_zero())
sld += TImporto('A', avere);
else
sld += TImporto('D', dare);
}
}
sld.normalize();
set(F_DARE, sld.sezione() == 'D' ? sld.valore() : ZERO);
set(F_AVERE, sld.sezione() == 'A' ? sld.valore() : ZERO);
}
TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a") TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a")
{ {
TSheet_field& sf = sfield(F_RIGHE); TSheet_field& sf = sfield(F_RIGHE);
@ -157,6 +555,36 @@ TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a")
sf.set_column_header(id, prompt); sf.set_column_header(id, prompt);
sf.set_column_justify(id, f.is_kind_of(CLASS_REAL_FIELD)); sf.set_column_justify(id, f.is_kind_of(CLASS_REAL_FIELD));
sf.set_column_width(id, (max(3+size, prompt.len()+1)) * CHARX); sf.set_column_width(id, (max(3+size, prompt.len()+1)) * CHARX);
switch (100+(f.dlg()%100))
{
case S_CDC1:
case S_CDC2:
case S_CDC3:
case S_CDC4:
f.check_type(ini.get_bool("CdcRequired") ? CHECK_REQUIRED : CHECK_NORMAL);
break;
case S_CMS1:
case S_CMS2:
case S_CMS3:
case S_CMS4:
f.check_type(ini.get_bool("CmsRequired") ? CHECK_REQUIRED : CHECK_NORMAL);
break;
case S_FAS1:
case S_FAS2:
case S_FAS3:
case S_FAS4:
f.check_type(ini.get_bool("FscRequired") ? CHECK_REQUIRED : CHECK_NORMAL);
break;
case S_CON1:
case S_CON2:
case S_CON3:
case S_CON4:
f.check_type(ini.get_bool("PdciRequired") ? CHECK_REQUIRED : CHECK_NORMAL);
break;
default:
break;
}
} }
else else
{ {
@ -165,31 +593,9 @@ TMovanal_msk::TMovanal_msk() : TAutomask("ca2100a")
} }
} }
class TMovanal_app : public TRelation_application ///////////////////////////////////////////////////////////
{ // TMovanal_app
TRelation* _rel; ///////////////////////////////////////////////////////////
TMovanal_msk* _msk;
protected:
virtual bool user_create();
virtual bool user_destroy();
virtual TMask* get_mask(int);
virtual TRelation* get_relation() const;
const TString& somma_campi(TToken_string& row, int first) const;
void spezza_campo(const TString& str, TToken_string& row, int first) const;
int write_rows(const TMask& m);
void read_rows(const TMask& m);
virtual bool protected_record(TRectype& rec);
virtual int write(const TMask& m);
virtual int rewrite(const TMask& m);
virtual int read(TMask& m);
virtual void init_query_mode(TMask& m);
virtual void init_insert_mode(TMask& m);
virtual void init_modify_mode(TMask& m);
};
TMask* TMovanal_app::get_mask(int) TMask* TMovanal_app::get_mask(int)
{ {
@ -201,82 +607,31 @@ TRelation* TMovanal_app::get_relation() const
return _rel; return _rel;
} }
const TString& TMovanal_app::somma_campi(TToken_string& row, int first) const bool TMovanal_app::get_next_key(TToken_string& key)
{ {
TSheet_field& sheet = _msk->sfield(F_RIGHE); long num = 1;
TMask& m = sheet.sheet_mask(); TLocalisamfile movana(LF_MOVANA);
if (movana.last() == NOERR)
const short id = 201 + first; num += movana.get_long(MOVANA_NUMREG);
TString& str = get_tmp_string(20); key.format("%d|%ld", F_NUMREG, num);
for (int i = 0; i < 4; i++) return true;
{
TString80 token = row.get(first+i);
if (m.id2pos(id+i) < 0)
break;
const TEdit_field& fld = m.efield(id+i);
token.left_just(fld.size());
str << token;
}
return str;
} }
int TMovanal_app::write_rows(const TMask& m) void TMovanal_app::write_rows(const TMask& m)
{ {
TAnal_mov& mov = (TAnal_mov&)_rel->curr(); TAnal_mov& mov = (TAnal_mov&)_rel->curr();
mov.destroy_rows(); mov.destroy_rows();
TSheet_field& sheet = _msk->sfield(F_RIGHE);
// Calcola le posizioni dei campi multilivello generati
const int pos_cdc = sheet.cid2index(S_CDC1);
const int pos_cms = sheet.cid2index(S_CMS1);
const int pos_fas = sheet.cid2index(S_FAS1);
const int pos_con = sheet.cid2index(S_CON1);
// Scandisce lo sheet e riempie il recarray // Scandisce lo sheet e riempie il recarray
TSheet_field& sheet = _msk->sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(sheet, i, row) FOR_EACH_SHEET_ROW(sheet, i, row)
{ {
TRectype& rec = mov.new_row(); // Crea una riga nuova
rec.put(RMOVANA_ANNOES, m.get(F_ANNOES));
rec.put(RMOVANA_DATAREG, m.get(F_DATAREG));
rec.put(RMOVANA_DESCR, row->get(sheet.cid2index(S_DESCR)));
const real dare = row->get(0), avere = row->get(); const real dare = row->get(0), avere = row->get();
if (!avere.is_zero()) if (dare.is_zero() && avere.is_zero()) // Scarta righe vuote
{ continue;
rec.put(RMOVANA_SEZIONE, 'A');
rec.put(RMOVANA_IMPORTO, avere);
}
else
{
rec.put(RMOVANA_SEZIONE, 'D');
rec.put(RMOVANA_IMPORTO, dare);
}
rec.put(RMOVANA_CODCCOSTO, somma_campi(*row, pos_cdc));
rec.put(RMOVANA_CODCMS, somma_campi(*row, pos_cms));
rec.put(RMOVANA_CODFASE, somma_campi(*row, pos_fas));
rec.put(RMOVANA_CODCONTO, somma_campi(*row, pos_con));
}
return NOERR;
}
void TMovanal_app::spezza_campo(const TString& str, TToken_string& row, int first) const TRectype& rec = mov.new_row(); // Crea una riga nuova
{ _msk->row2rec(i, rec);
TSheet_field& sheet = _msk->sfield(F_RIGHE);
TMask& m = sheet.sheet_mask();
TString80 token;
const short id = 201 + first;
int start = 0;
for (int i = 0; i < 4; i++)
{
if (m.id2pos(id+i) < 0)
break;
const TEdit_field& fld = m.efield(id+i);
const int len = fld.size();
token = str.mid(start, len); token.trim();
row.add(token, first+i);
start += len;
} }
} }
@ -287,14 +642,13 @@ void TMovanal_app::read_rows(const TMask& m)
TSheet_field& sheet = m.sfield(F_RIGHE); TSheet_field& sheet = m.sfield(F_RIGHE);
sheet.destroy(); sheet.destroy();
_msk->reset_saldi();
for (int i = 1; i <= a.rows(); i++) for (int i = 1; i <= a.rows(); i++)
{ {
const TRectype& rec = a.row(i); const TRectype& rec = a.row(i);
TToken_string& row = sheet.row(i-1); TToken_string& row = sheet.row(i-1);
const char sez = rec.get_char(RMOVANA_SEZIONE); const TImporto imp(rec.get_char(RMOVANA_SEZIONE), rec.get_real(RMOVANA_IMPORTO));
const real imp = rec.get(RMOVANA_IMPORTO); _msk->imp2row(imp, row);
row.add(sez == 'D' ? imp.string() : "");
row.add(sez == 'A' ? imp.string() : "");
row.add(rec.get(RMOVANA_DESCR)); row.add(rec.get(RMOVANA_DESCR));
// Calcola le posizioni dei campi multilivello generati // Calcola le posizioni dei campi multilivello generati
@ -302,10 +656,13 @@ void TMovanal_app::read_rows(const TMask& m)
const int pos_cms = sheet.cid2index(S_CMS1); const int pos_cms = sheet.cid2index(S_CMS1);
const int pos_fas = sheet.cid2index(S_FAS1); const int pos_fas = sheet.cid2index(S_FAS1);
const int pos_con = sheet.cid2index(S_CON1); const int pos_con = sheet.cid2index(S_CON1);
spezza_campo(rec.get(RMOVANA_CODCCOSTO), row, pos_cdc); _msk->spezza_campo(rec.get(RMOVANA_CODCCOSTO), row, pos_cdc);
spezza_campo(rec.get(RMOVANA_CODCMS), row, pos_cms); _msk->spezza_campo(rec.get(RMOVANA_CODCMS), row, pos_cms);
spezza_campo(rec.get(RMOVANA_CODFASE), row, pos_fas); _msk->spezza_campo(rec.get(RMOVANA_CODFASE), row, pos_fas);
spezza_campo(rec.get(RMOVANA_CODCONTO), row, pos_con); _msk->spezza_campo(rec.get(RMOVANA_CODCONTO), row, pos_con);
TImporto& sld = _msk->saldo(rec);
sld -= imp;
} }
} }
@ -315,25 +672,15 @@ bool TMovanal_app::protected_record(TRectype& rec)
} }
int TMovanal_app::write(const TMask& m) int TMovanal_app::write(const TMask& m)
{
int err = m.get_bool(F_BLOCCATO) ? _islocked : NOERR;
if (err == NOERR)
{ {
write_rows(m); write_rows(m);
err = TRelation_application::write(m); return TRelation_application::write(m);
}
return err;
} }
int TMovanal_app::rewrite(const TMask& m) int TMovanal_app::rewrite(const TMask& m)
{
int err = m.get_bool(F_BLOCCATO) ? _islocked : NOERR;
if (err == NOERR)
{ {
write_rows(m); write_rows(m);
err = TRelation_application::rewrite(m); return TRelation_application::rewrite(m);
}
return err;
} }
int TMovanal_app::read(TMask& m) int TMovanal_app::read(TMask& m)

View File

@ -1,27 +1,29 @@
#define F_NUMREG 101 #define F_NUMREG 201
#define F_ANNOES 102 #define F_ANNOES 202
#define F_DESCR 103 #define F_DESCR 203
#define F_DATAREG 104 #define F_DATAREG 204
#define F_DATACOMP 105 #define F_DATACOMP 205
#define F_DATADOC 106 #define F_DATADOC 206
#define F_CODDITTA 107 #define F_CODDITTA 207
#define F_RAGSOC 108 #define F_RAGSOC 208
#define F_TIPODOC 109 #define F_TIPODOC 209
#define F_SEZIONE 110 #define F_SEZIONE 210
#define F_TOTDOC 111 #define F_TOTDOC 211
#define F_NUMREGCG 112 #define F_NUMREGCG 212
#define F_CODCAUS 113 #define F_CODCAUS 213
#define F_DESCAUS 114 #define F_DESCAUS 214
#define F_DARE 115 #define F_DARE 215
#define F_AVERE 116 #define F_AVERE 216
#define F_BLOCCATO 117 #define F_BLOCCATO 217
#define F_TIPO 118 #define F_TIPO 218
#define F_NUMDOC 219
#define F_RESET 220
#define F_NUMREG2 201 #define F_NUMREG2 301
#define F_ANNOES2 202 #define F_ANNOES2 302
#define F_DATAREG2 203 #define F_DATAREG2 303
#define F_DESCR2 204 #define F_DESCR2 304
#define F_RIGHE 300 #define F_RIGHE 400
#define S_DARE 101 #define S_DARE 101
#define S_AVERE 102 #define S_AVERE 102

View File

@ -15,9 +15,9 @@ END
NUMBER F_CODDITTA 5 NUMBER F_CODDITTA 5
BEGIN BEGIN
PROMPT 3 2 "Codice " PROMPT 2 2 ""
FLAGS "DFR" FLAGS "DFR"
USE LF_NDITTE KEY 1 USE LF_NDITTE
INPUT CODDITTA F_CODDITTA INPUT CODDITTA F_CODDITTA
OUTPUT F_RAGSOC RAGSOC OUTPUT F_RAGSOC RAGSOC
CHECKTYPE NORMAL CHECKTYPE NORMAL
@ -25,7 +25,7 @@ END
STRING F_RAGSOC 50 52 STRING F_RAGSOC 50 52
BEGIN BEGIN
PROMPT 17 2 "" PROMPT 9 2 "Ragione sociale "
FLAGS "D" FLAGS "D"
END END
@ -34,25 +34,37 @@ BEGIN
PROMPT 1 4 "@bTestata" PROMPT 1 4 "@bTestata"
END END
LIST F_TIPO 1 25
BEGIN
PROMPT 2 5 "Tipo movimento "
ITEM " |Normale"
ITEM "P|Preventivo"
ITEM "V|Variazione preventivo"
FIELD TIPOMOV
END
DATE F_DATAREG DATE F_DATAREG
BEGIN BEGIN
PROMPT 2 5 "Data di registrazione " PROMPT 2 6 "Data di registrazione "
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
MESSAGE COPY,F_DATAREG2 MESSAGE COPY,F_DATAREG2
FIELD DATAREG FIELD DATAREG
FLAGS "A" FLAGS "A"
WARNING "La data di registrazione non appartiene ad un esercizio valido" WARNING "La data di registrazione non appartiene ad un esercizio valido"
GROUP 5
END END
NUMBER F_NUMREG 7 NUMBER F_NUMREG 7
BEGIN BEGIN
PROMPT 52 5 "Movimento n. " PROMPT 52 6 "Movimento n. "
USE LF_MOVANA USE LF_MOVANA
INPUT NUMREG F_NUMREG INPUT NUMREG F_NUMREG
DISPLAY "Numero@7" NUMREG DISPLAY "Numero@7" NUMREG
DISPLAY "Tipo" TIPOMOV
DISPLAY "Data reg.@10" DATAREG DISPLAY "Data reg.@10" DATAREG
DISPLAY "Data comp.@10" DATACOMP DISPLAY "Data comp.@10" DATACOMP
DISPLAY "Eser." ANNOES DISPLAY "Eser." ANNOES
DISPLAY "P. nota" NUMREGCG
DISPLAY "Descrizione@50" DESCR DISPLAY "Descrizione@50" DESCR
OUTPUT F_NUMREG NUMREG OUTPUT F_NUMREG NUMREG
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
@ -63,37 +75,19 @@ END
DATE F_DATACOMP DATE F_DATACOMP
BEGIN BEGIN
PROMPT 2 6 "Data di competenza " PROMPT 2 7 "Data di competenza "
FIELD DATACOMP FIELD DATACOMP
WARNING "La data di competenza non appartiene ad un esercizio valido" WARNING "La data di competenza non appartiene ad un esercizio valido"
END END
NUMBER F_ANNOES 4 NUMBER F_ANNOES 4
BEGIN BEGIN
PROMPT 52 6 "Esercizio " PROMPT 52 7 "Esercizio "
FIELD ANNOES FIELD ANNOES
MESSAGE COPY,F_ANNOES2 MESSAGE COPY,F_ANNOES2
FLAGS "DG" FLAGS "DG"
END END
DATE F_DATADOC
BEGIN
PROMPT 2 7 "Data del documento "
FIELD DATADOC
END
STRING F_TIPODOC 2
BEGIN
PROMPT 42 7 "Tipo documento "
USE %TPD
INPUT CODTAB F_TIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@60" S0
OUTPUT F_TIPODOC CODTAB
CHECKTYPE NORMAL
FIELD TIPODOC
END
STRING F_DESCR 50 STRING F_DESCR 50
BEGIN BEGIN
PROMPT 2 8 "Descrizione " PROMPT 2 8 "Descrizione "
@ -109,14 +103,16 @@ END
NUMBER F_NUMREGCG 7 NUMBER F_NUMREGCG 7
BEGIN BEGIN
PROMPT 2 11 "Numero " PROMPT 2 11 "Numero "
FLAGS "D" FLAGS "DG"
FIELD NUMREGCG FIELD NUMREGCG
MESSAGE EMPTY ENABLE,F_TIPO|HIDE,F_RESET
MESSAGE DISABLE,F_TIPO|SHOW,F_RESET
END END
STRINGA F_CODCAUS 3 STRINGA F_CODCAUS 3
BEGIN BEGIN
PROMPT 19 11 "Causale " PROMPT 19 11 "Causale "
USE LF_CAUSALI USE LF_CAUSALI SELECT MOVIND!=''
INPUT CODCAUS F_CODCAUS INPUT CODCAUS F_CODCAUS
DISPLAY "Codice" CODCAUS DISPLAY "Codice" CODCAUS
DISPLAY "Descrizione@50" DESCR DISPLAY "Descrizione@50" DESCR
@ -124,17 +120,47 @@ BEGIN
OUTPUT F_DESCAUS DESCR OUTPUT F_DESCAUS DESCR
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
FIELD CODCAUS FIELD CODCAUS
GROUP 5
END END
STRINGA F_DESCAUS 50 40 STRINGA F_DESCAUS 50 40
BEGIN BEGIN
PROMPT 34 11 "" PROMPT 34 11 ""
USE LF_CAUSALI KEY 2 USE LF_CAUSALI KEY 2 SELECT MOVIND!=''
INPUT DESCR F_DESCAUS INPUT DESCR F_DESCAUS
DISPLAY "Descrizione@50" DESCR DISPLAY "Descrizione@50" DESCR
DISPLAY "Codice" CODCAUS DISPLAY "Codice" CODCAUS
COPY OUTPUT F_CODCAUS COPY OUTPUT F_CODCAUS
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
GROUP 5
END
STRING F_TIPODOC 2
BEGIN
PROMPT 2 12 "Documento: Tipo "
USE %TPD
INPUT CODTAB F_TIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@60" S0
OUTPUT F_TIPODOC CODTAB
CHECKTYPE NORMAL
FIELD TIPODOC
GROUP 5
END
STRING F_NUMDOC 5
BEGIN
PROMPT 27 12 "Numero "
CHECKTYPE NORMAL
FIELD NUMDOC
GROUP 5
END
DATE F_DATADOC
BEGIN
PROMPT 48 12 "Data "
FIELD DATADOC
GROUP 5
END END
GROUPBOX DLG_NULL 78 4 GROUPBOX DLG_NULL 78 4
@ -142,27 +168,20 @@ BEGIN
PROMPT 1 14 "@bMovimento" PROMPT 1 14 "@bMovimento"
END END
LIST F_TIPO 1 25
BEGIN
PROMPT 2 15 "Tipo "
ITEM " |Normale"
ITEM "P|Preventivo"
ITEM "V|Variazione preventivo"
FIELD TIPOMOV
END
CURRENCY F_TOTDOC 18 CURRENCY F_TOTDOC 18
BEGIN BEGIN
PROMPT 2 16 "Totale documento " PROMPT 2 15 "Totale documento "
FIELD TOTDOC FIELD TOTDOC
GROUP 5
END END
LISTBOX F_SEZIONE 1 5 LISTBOX F_SEZIONE 1 5
BEGIN BEGIN
PROMPT 39 16 "" PROMPT 39 15 ""
ITEM "D|Dare" ITEM "D|Dare"
ITEM "A|Avere" ITEM "A|Avere"
FIELD SEZIONE FIELD SEZIONE
GROUP 5
END END
BOOLEAN F_BLOCCATO BOOLEAN F_BLOCCATO
@ -177,48 +196,48 @@ PAGE "Righe" -1 -1 80 20
GROUPBOX DLG_NULL 78 4 GROUPBOX DLG_NULL 78 4
BEGIN BEGIN
PROMPT 1 1 "@bMovimento" PROMPT 1 0 "@bMovimento"
END END
NUMBER F_NUMREG2 7 NUMBER F_NUMREG2 7
BEGIN BEGIN
PROMPT 2 2 "Numero " PROMPT 2 1 "Numero "
FLAGS "D" FLAGS "D"
END END
NUMBER F_DATAREG2 7 NUMBER F_DATAREG2 7
BEGIN BEGIN
PROMPT 22 2 "Data registrazione " PROMPT 22 1 "Data registrazione "
FLAGS "D" FLAGS "D"
END END
NUMBER F_ANNOES2 7 NUMBER F_ANNOES2 7
BEGIN BEGIN
PROMPT 59 2 "Esercizio " PROMPT 59 1 "Esercizio "
FLAGS "D" FLAGS "D"
END END
STRING F_DESCR2 50 STRING F_DESCR2 50
BEGIN BEGIN
PROMPT 2 3 "Descrizione " PROMPT 2 2 "Descrizione "
FLAGS "D" FLAGS "D"
END END
CURRENCY F_DARE 18 CURRENCY F_DARE 18
BEGIN BEGIN
PROMPT 1 5 "Saldo riga corrente: Dare " PROMPT 2 4 "Saldo riga corrente: Dare "
FLAGS "D" FLAGS "D"
END END
CURRENCY F_AVERE 18 CURRENCY F_AVERE 18
BEGIN BEGIN
PROMPT 41 5 "Avere " PROMPT 52 4 "Avere "
FLAGS "D" FLAGS "D"
END END
SPREADSHEET F_RIGHE SPREADSHEET F_RIGHE -1 -2
BEGIN BEGIN
PROMPT 0 6 "" PROMPT 0 5 ""
ITEM "Dare@15" ITEM "Dare@15"
ITEM "Avere@15" ITEM "Avere@15"
ITEM "Descrizione@30" ITEM "Descrizione@30"
@ -240,6 +259,12 @@ BEGIN
ITEM "Con 4" ITEM "Con 4"
END END
BUTTON F_RESET 78 2
BEGIN
PROMPT -11 -1 "Rigenera le righe in base alle tabelle di ripartizione"
FLAGS "H"
END
ENDPAGE ENDPAGE
ENDMASK ENDMASK

View File

@ -1,9 +1,10 @@
#include "calib01.h" #include <currency.h>
#include "calibmsk.h"
#include <tree.h> #include <tree.h>
#include <pconti.h> #include <pconti.h>
#include "calib01.h"
#include "calibmsk.h"
#include "movana.h" #include "movana.h"
#include "rmovana.h" #include "rmovana.h"
#include "saldana.h" #include "saldana.h"
@ -959,6 +960,7 @@ void TAnal_mov::load_saldi(bool reset)
if (reset) if (reset)
_saldi.destroy(); _saldi.destroy();
const int dec = TCurrency::get_firm_dec();
const TRecord_array& a = body(LF_RMOVANA); const TRecord_array& a = body(LF_RMOVANA);
for (int i = a.last_row(); i > 0; i--) for (int i = a.last_row(); i > 0; i--)
{ {
@ -969,6 +971,7 @@ void TAnal_mov::load_saldi(bool reset)
sld -= imp; sld -= imp;
else else
sld += imp; sld += imp;
sld.valore().round(dec);
} }
} }
@ -985,12 +988,12 @@ void TAnal_mov::update_saldi(bool kill)
load_saldi(true); load_saldi(true);
} }
void TAnal_mov::save_saldi() bool TAnal_mov::save_saldi()
{ {
TLocalisamfile saldi(LF_SALDANA); TLocalisamfile saldi(LF_SALDANA);
FOR_EACH_ASSOC_OBJECT(_saldi, h, k, o) FOR_EACH_ASSOC_OBJECT(_saldi, h, k, o)
{ {
const TImporto& imp = (const TImporto&)o; const TImporto& imp = *(const TImporto*)o;
if (!imp.is_zero()) if (!imp.is_zero())
{ {
TToken_string key = k; TToken_string key = k;
@ -1009,16 +1012,18 @@ void TAnal_mov::save_saldi()
saldi.put(SALDANA_COMMESSA, key.get()); saldi.put(SALDANA_COMMESSA, key.get());
saldi.put(SALDANA_FASE, key.get()); saldi.put(SALDANA_FASE, key.get());
saldi.put(SALDANA_CONTO, key.get()); saldi.put(SALDANA_CONTO, key.get());
saldi.write(); err = saldi.write();
} }
if (err == NOERR)
{
const char* fld_sez = NULL; const char* fld_sez = NULL;
const char* fld_val = NULL; const char* fld_val = NULL;
switch (tipo) switch (tipo)
{ {
case 'P': fld_sez = SALDANA_SEZIONEP; fld_val = SALDANA_SEZIONEP; break; case 'P': fld_sez = SALDANA_SEZIONEP; fld_val = SALDANA_SALDOP; break;
case 'V': fld_sez = SALDANA_SEZIONEV; fld_val = SALDANA_SEZIONEV; break; case 'V': fld_sez = SALDANA_SEZIONEV; fld_val = SALDANA_SALDOV; break;
default : fld_sez = SALDANA_SEZIONE; fld_val = SALDANA_SEZIONE; break; default : fld_sez = SALDANA_SEZIONE; fld_val = SALDANA_SALDO; break;
} }
TImporto saldo(saldi.get_char(fld_sez), saldi.get_real(fld_val)); TImporto saldo(saldi.get_char(fld_sez), saldi.get_real(fld_val));
saldo += imp; saldo += imp;
@ -1026,9 +1031,14 @@ void TAnal_mov::save_saldi()
saldi.put(fld_sez, saldo.sezione()); saldi.put(fld_sez, saldo.sezione());
saldi.put(fld_val, saldo.valore()); saldi.put(fld_val, saldo.valore());
saldi.rewrite(); err = saldi.rewrite();
}
if (err != NOERR)
return error_box(TR("Impossibile aggiornare i saldi"));
} }
} }
return true;
} }
int TAnal_mov::readat(TBaseisamfile& f, TRecnotype nrec, word lockop) int TAnal_mov::readat(TBaseisamfile& f, TRecnotype nrec, word lockop)
@ -1059,9 +1069,7 @@ int TAnal_mov::rewrite(TBaseisamfile& f) const
{ {
const int err = TMultiple_rectype::rewrite(f); const int err = TMultiple_rectype::rewrite(f);
if (err == NOERR) if (err == NOERR)
{
((TAnal_mov*)this)->update_saldi(false); ((TAnal_mov*)this)->update_saldi(false);
}
return err; return err;
} }
@ -1081,7 +1089,7 @@ int TAnal_mov::read(long numreg, word lock)
TAnal_mov::TAnal_mov(long numreg) : TMultiple_rectype(LF_MOVANA) TAnal_mov::TAnal_mov(long numreg) : TMultiple_rectype(LF_MOVANA)
{ {
add_file(LF_RMOVANA, "NUMRIG"); add_file(LF_RMOVANA, RMOVANA_NUMRIG);
if (numreg > 0) if (numreg > 0)
read(numreg); read(numreg);
} }

View File

@ -119,7 +119,7 @@ protected:
TImporto& saldo(const TRectype& rec); TImporto& saldo(const TRectype& rec);
void load_saldi(bool reset); void load_saldi(bool reset);
void update_saldi(bool kill); void update_saldi(bool kill);
void save_saldi(); bool save_saldi();
public: public:
virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop); virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop);

View File

@ -1,3 +1,3 @@
107 107
0 0
$movana|1|1|152|0|Movimenti di Analitica||| $movana|1|2|152|0|Movimenti di Analitica|||

View File

@ -17,6 +17,7 @@ CAMBIO|4|15|6|Cambio della valuta
TOTDOC|4|18|3|Totale documento TOTDOC|4|18|3|Totale documento
SEZIONE|1|1|0|Sezione del totale documento SEZIONE|1|1|0|Sezione del totale documento
BLOCCATO|8|1|0|Movimento bloccato BLOCCATO|8|1|0|Movimento bloccato
2 3
NUMREG| NUMREG|
DATAREG+NUMREG|X DATAREG+NUMREG|X
NUMREGCG|

View File

@ -2,10 +2,10 @@
#define __SALDANA_H #define __SALDANA_H
#define SALDANA_ANNO "ANNO" #define SALDANA_ANNO "ANNO"
#define SALDANA_COSTO "CODCCOSTO" #define SALDANA_COSTO "COSTO"
#define SALDANA_COMMESSA "CODCMS" #define SALDANA_COMMESSA "COMMESSA"
#define SALDANA_FASE "CODFASE" #define SALDANA_FASE "FASE"
#define SALDANA_CONTO "CODCONTO" #define SALDANA_CONTO "CONTO"
#define SALDANA_SEZIONE "SEZIONE" #define SALDANA_SEZIONE "SEZIONE"
#define SALDANA_SALDO "SALDO" #define SALDANA_SALDO "SALDO"