From ed995a13c885c203982300f38895c45b328695c6 Mon Sep 17 00:00:00 2001 From: luca Date: Fri, 10 Nov 2006 14:48:27 +0000 Subject: [PATCH] Patch level :4.0 patch futura Files correlati : Ricompilazione Demo : [ ] Commento :continua implementazione stampa del reich! git-svn-id: svn://10.65.10.50/trunk@14470 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ca/ca3800a.rep | 152 +++++++++---------------------------------------- ca/ca3883.cpp | 102 +++++++++++++++++++++++++++++++-- ca/ca3883.h | 2 + 3 files changed, 128 insertions(+), 128 deletions(-) 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 -
    @@ -261,30 +183,12 @@ THEN
  • + + MESSAGE ADD,F2.69 +
  • 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); };