diff --git a/ca/ca3800a.rep b/ca/ca3800a.rep
index 8c7ec5914..6605e3d86 100755
--- a/ca/ca3800a.rep
+++ b/ca/ca3800a.rep
@@ -25,18 +25,11 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
@@ -114,71 +107,30 @@ MESSAGE RESET,F3.108
-
+
CODCMS
-
+
DESCRIZ
-
+
FASE
-
+
ROUND(AVANZAMENTO;0)
-
-
- #RIC
- MESSAGE ADD,F3.101
+
+
+ MESSAGE ADD,F3.69
-
- #COSC01
- MESSAGE ADD,F3.102
+
+ #MARGINE
+ MESSAGE ADD,F3.169
-
- #COSC02
- MESSAGE ADD,F3.103
-
-
- #COSC03
- MESSAGE ADD,F3.104
-
-
- #COSC04
- MESSAGE ADD,F3.105
-
-
- #COSC05
- MESSAGE ADD,F3.106
-
-
- #COS
- MESSAGE ADD,F3.107
-
-
- #RIC-#COS
- MESSAGE ADD,F3.108
-
-
+
- #RIC @
-0
-=
-IF
-0
-ELSE
-1
-#COS @
-#RIC @
-F;
--
-100
-*
-0
-ROUND
-THEN
-#THIS !
+ #PERCMARGINE
@@ -186,14 +138,8 @@ THEN
-
-
-
-
-
-
-
-
+
+
@@ -212,41 +158,17 @@ THEN
H2.102
-
-
+
- MESSAGE ADD,F1.101
+ MESSAGE ADD,F1.69
+
MESSAGE COPY,F2.101
-
+
- MESSAGE ADD,F1.102
-
-
-
- MESSAGE ADD,F1.103
-
-
-
- MESSAGE ADD,F1.104
-
-
-
- MESSAGE ADD,F1.105
-
-
-
- MESSAGE ADD,F1.106
-
-
-
- MESSAGE ADD,F1.107
-
-
-
- MESSAGE ADD,F1.108
+ MESSAGE ADD,F1.169
@@ -261,30 +183,12 @@ THEN
+
+ MESSAGE ADD,F2.69
+
-
- MESSAGE ADD,F2.101
-
-
- MESSAGE ADD,F2.102
-
-
- MESSAGE ADD,F2.103
-
-
- MESSAGE ADD,F2.104
-
-
- MESSAGE ADD,F2.105
-
-
- MESSAGE ADD,F2.106
-
-
- MESSAGE ADD,F2.107
-
-
- MESSAGE ADD,F2.108
+
+ MESSAGE ADD,F2.169
USE SALDANA
diff --git a/ca/ca3883.cpp b/ca/ca3883.cpp
index fcce77c49..ca4670633 100755
--- a/ca/ca3883.cpp
+++ b/ca/ca3883.cpp
@@ -103,11 +103,13 @@ void TCRPA_report::merge_array(TString_array& c, TString_array& t,
void TCRPA_report::analize_pconana_structure (const TString& prefix, const int depth,
TString_array& codici, TString_array& testate) const
{
+ //cerca quale e' la lunghezza della stringa conto da considerare in base alla depth scelta
TConfig& cfg = ca_config();
const TMultilevel_code_info& pconana_info = ca_multilevel_code_info(LF_PCONANA);
const long total_length = pconana_info.total_len(depth);
-
-
+
+ //scandisce il piano dei conti analitico alla ricerca dei conti di lunghezza pari a..
+ //..quella appena ricavata
TISAM_recordset recset("USE PCONANA\nSELECT LEN(CODCONTO)=#LUN\nFROM CODCONTO=#PREFIX\nTO CODCONTO=#PREFIX");
recset.set_var("#LUN", TVariant(total_length));
recset.set_var("#PREFIX", TVariant(prefix));
@@ -115,12 +117,14 @@ void TCRPA_report::analize_pconana_structure (const TString& prefix, const int d
TString_array codici_c, testate_c, codici_r, testate_r;
+ //riempie gli array con i codici conto di lunghezza opportuna e relative testate
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
const TString& codconto = recset.get(PCONANA_CODCONTO).as_string();
const TAnal_bill zio(codconto);
const int indbil = zio.indicatore_bilancio();
+ //solo Costi e Ricavi!
if (indbil == 3 || indbil == 4)
{
const TString& codice = codconto.mid(prefix_length);
@@ -137,15 +141,105 @@ void TCRPA_report::analize_pconana_structure (const TString& prefix, const int d
}
}
}
-
+ //se c'e' piu' di un campo da stampare per i Ricavi -> ci vuole un campo Totale per i ricavi
+ if (codici_r.items() > 1)
+ {
+ codici_r.add("#RICAVI");
+ testate_r.add(TR("RICAVI"));
+ }
+ //..analogo per i Costi
+ if (codici_c.items() > 1)
+ {
+ codici_c.add("#COSTI");
+ testate_c.add(TR("COSTI"));
+ }
+ //condensa gli array di Costo e Ricavo in un unico array che servira' di base per la stampa
merge_array(codici_r, testate_r, codici, testate);
merge_array(codici_c, testate_c, codici, testate);
}
+void TCRPA_report::offset_and_fill_columns(TReport_section& rep_sect, const TString_array& str_arr)
+{
+ TReport_field& rep_field = *rep_sect.find_field(69);
+
+ //deve spostare i campi a destra della colonna modello
+ //prende il rettangolo del campo..
+ const TRectangle& rep_field_rect = rep_field.get_rect();
+ //si memorizza i campi a destra del campo modello per poterli mettere a destra di tutti..
+ //..i campi che saranno generati
+ TPointer_array campi_a_destra;
+ for (int j = 0; j < rep_sect.items(); j++)
+ {
+ const TReport_field& campo = rep_sect.field(j);
+ const TRectangle& rct = campo.get_rect();
+ //se il campo e' a destra del modello lo aggiunge all'array dei campi_a_destra
+ if (rct.left() >= rep_field_rect.right())
+ campi_a_destra.add(campo);
+ }
+
+ //duplica il campo modello e riempie i duplicati con i valori degli array
+ //serve il tipo di sezione poiche' gli header vanno trattati diversamente dai body
+ const char sect_type = rep_sect.type();
+
+ //ciclo su tutti gli elementi dell'array con i valori da settare nei nuovi campi
+ for (int i = 0; i < str_arr.items(); i++)
+ {
+ TReport_field* new_field = i == 0 ? &rep_field : (TReport_field*)rep_field.dup();
+ if (i > 0)
+ {
+ rep_sect.add(new_field);
+ new_field->set_pos(rep_field_rect.left() + rep_field_rect.width() * i, rep_field_rect.top());
+ new_field->set_id(rep_field.id() + i);
+ }
+ if (sect_type == 'H')
+ new_field->set_picture(str_arr.row(i));
+ else
+ new_field->set_field(str_arr.row(i));
+ }
+
+ const TReport_field& ultimo_campo = rep_sect.field(rep_sect.last());
+ const TPoint offset(ultimo_campo.get_rect().right() - rep_field.get_rect().right(), 0);
+
+ for (int k = 0; k < campi_a_destra.items(); k++)
+ {
+ TReport_field& campo = (TReport_field&)campi_a_destra[k];
+ campo.offset(offset);
+ }
+}
+
+
+bool TCRPA_report::generate_columns (TString_array& codici, TString_array& testate)
+{
+ //sezioni del report da modificare
+ TReport_section& h0 = section('H', 0);
+ TReport_section& b1 = section('B', 1);
+
+ //controllo dell'esistenza dei campi modello da replicare e loro duplicazione e riempimento!
+ TReport_field* b1_69 = b1.find_field(69);
+ if (b1_69 == NULL)
+ return false;
+ offset_and_fill_columns(b1, codici);
+
+ TReport_field* h0_69 = h0.find_field(69);
+ if (h0_69 == NULL)
+ return warning_box(TR("Manca l'intestazione della colonna modello (H0.69)"));
+ offset_and_fill_columns(h0, testate);
+
+ return true;
+}
+
+
TCRPA_report::TCRPA_report (const char* rep_name, const TString& prefix, const int depth)
{
- load(rep_name);
+ //che report usare?
+ load (rep_name);
+ //array contenenti i conti analitici e le loro descrizioni di testata che diventeranno..
+ //.colonne del report dopo lungo e periglioso travaglio
TString_array codici, testate;
+ //per prima cosa si deve analizzare la struttura del piano conti..
+ //..da stampare fino al livello richiesto!
analize_pconana_structure (prefix, depth, codici, testate);
+ //poi vanno generate le colonne del report corrispondenti alla struttura analizzata
+ generate_columns (codici, testate);
}
diff --git a/ca/ca3883.h b/ca/ca3883.h
index 3354959d5..91f9a0f58 100755
--- a/ca/ca3883.h
+++ b/ca/ca3883.h
@@ -32,6 +32,8 @@ protected:
TString_array& codici, TString_array& testate) const;
void analize_pconana_structure (const TString& prefix, const int depth,
TString_array& codici, TString_array& testate) const;
+ bool generate_columns (TString_array& codici, TString_array& testate);
+ void offset_and_fill_columns(TReport_section& rep_sect, const TString_array& str_arr);
public:
TCRPA_report (const char* rep_name, const TString& prefix, const int depth);
};