Patch level :2.2 160

Files correlati     :ca3700a.rep, ca3.exe
Ricompilazione Demo : [ ]
Commento            :rendiconto! seconde modifiche richieste dal CREPA


git-svn-id: svn://10.65.10.50/trunk@13298 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2005-07-27 17:16:36 +00:00
parent 555197d9dd
commit 355c9013a3
2 changed files with 95 additions and 49 deletions

View File

@ -85,6 +85,11 @@ bool TPrint_rendiconto_ca_mask::on_field_event(TOperable_field& o, TField_event
if (!data.empty() && esc.date2esc(data) != anno) if (!data.empty() && esc.date2esc(data) != anno)
return error_box(TR("La data deve appartenere all'anno selezionato")); return error_box(TR("La data deve appartenere all'anno selezionato"));
} }
else //se l'esercizio è vuoto le date diventano obbligatorie!!
{
if (o.empty())
return error_box(TR("La data è obbligatoria in quanto manca l'esercizio"));
}
} }
break; break;
case F_REPORT: case F_REPORT:
@ -371,17 +376,6 @@ static const TPrint_rendiconto_ca_recordset* myself = NULL;
TPrint_rendiconto_ca_recordset* rendiconto_recordset() { return (TPrint_rendiconto_ca_recordset* ) myself;} TPrint_rendiconto_ca_recordset* rendiconto_recordset() { return (TPrint_rendiconto_ca_recordset* ) myself;}
/*//metodo per riconoscere se il record corrente soddisfa i filtri della maschera...strafighissimo!
bool TPrint_rendiconto_ca_recordset::valid_record(const TRelation& rel) const
{
return true;
}*/
/*bool TPrint_rendiconto_ca_recordset::mov_filter(const TRelation* rel)
{
return myself->valid_record(*rel);
}*/
void TPrint_rendiconto_ca_recordset::set_custom_filter(TCursor& cur) const void TPrint_rendiconto_ca_recordset::set_custom_filter(TCursor& cur) const
{ {
relation()->replace(_tmp); //sostituisce il vero file rmovana con quello temporaneo relation()->replace(_tmp); //sostituisce il vero file rmovana con quello temporaneo
@ -597,9 +591,9 @@ void TPrint_rendiconto_ca_recordset::salva_rmovana(const TRectype& rmovana, cons
bool should_delete = false; bool should_delete = false;
if (newdoc == NULL && movana.get(MOVANA_DNDOC).not_empty()) if (newdoc == NULL && movana.get(MOVANA_DNDOC).not_empty())
{ {
const TString16 dacodnum = movana.get(MOVANA_DCODNUM); const TString4 dacodnum = movana.get(MOVANA_DCODNUM);
newdoc = new TDocumento('D', movana.get_int(MOVANA_DANNO), dacodnum, movana.get_long(MOVANA_DNDOC)); newdoc = new TDocumento('D', movana.get_int(MOVANA_DANNO), dacodnum, movana.get_long(MOVANA_DNDOC));
should_delete = true; should_delete = true; //settato true per cancellare il doc al termine del metodo(sennò addio memoria!)
} }
const bool dadoc = newdoc != NULL; const bool dadoc = newdoc != NULL;
@ -613,12 +607,13 @@ void TPrint_rendiconto_ca_recordset::salva_rmovana(const TRectype& rmovana, cons
} //..non esiste il campo in movana } //..non esiste il campo in movana
else //movimento normale (senza documento) else //movimento normale (senza documento)
{ {
tmpcurr.put("CODNUM", movana.get(MOVANA_NUMDOC)); tmpcurr.put("CODNUM", "");
tmpcurr.put("ANNO", movana.get(MOVANA_ANNOES)); //anno del movimento tmpcurr.put("ANNO", movana.get(MOVANA_ANNOES)); //anno del movimento
tmpcurr.put("NUMRD", movana.get(MOVANA_NUMREG)); //numreg del movana tmpcurr.put("NUMRD", movana.get(MOVANA_NUMREG)); //numreg del movana
tmpcurr.put("DATA", movana.get(MOVANA_DATACOMP)); //data del movana tmpcurr.put("DATA", movana.get(MOVANA_DATACOMP)); //data del movana
} }
//ricerca del mitico documento padre della riga documento attuale!
int selettore = 0; int selettore = 0;
if (newdoc != NULL) if (newdoc != NULL)
{ {
@ -626,42 +621,58 @@ void TPrint_rendiconto_ca_recordset::salva_rmovana(const TRectype& rmovana, cons
tmpcurr.put("DATADOCRIF", newdoc->get(DOC_DATADOCRIF)); //datadocrif del documento originante il movana tmpcurr.put("DATADOCRIF", newdoc->get(DOC_DATADOCRIF)); //datadocrif del documento originante il movana
const int tipo_documento = newdoc->tipo().tipo(); const int tipo_documento = newdoc->tipo().tipo();
int tipo_babbo = 0; int tipo_babbo = TTipo_documento::_altro;
TString80 riferimento; //stringa su cui scrivere gli estremi del doc padre (se lo trova!)
real totale_doc_babbo; //totale del doc padre
const int rows = newdoc->physical_rows(); //righe del doc attuale
TString80 riferimento;
const int rows = newdoc->physical_rows();
for (int i = 1; riferimento.empty() && i <= rows; i++) for (int i = 1; riferimento.empty() && i <= rows; i++)
{ {
const TRiga_documento& riga = (*newdoc)[i]; const TRiga_documento& riga = (*newdoc)[i];
const TRectype* babbo = riga.find_original_rdoc(); const TRectype* babbo = riga.find_original_rdoc(); //cerca il doc padre della riga doc attuale
if (babbo != NULL) if (babbo != NULL) //se trova il doc padre..
{ {
const TString8 codnum = babbo->get(RDOC_CODNUM); const TString8 codnum = babbo->get(RDOC_CODNUM);
const int anno = babbo->get_int(RDOC_ANNO); const int anno = babbo->get_int(RDOC_ANNO);
const long ndoc = babbo->get_long(RDOC_NDOC); const long ndoc = babbo->get_long(RDOC_NDOC);
riferimento << codnum << '-' << anno << '-' << ndoc; riferimento << codnum << '-' << anno << '-' << ndoc;
TDocumento doc_babbo('D', anno, codnum, ndoc); TDocumento doc_babbo('D', anno, codnum, ndoc); //crea una copia del doc padre per prendere..
tipo_babbo = doc_babbo.tipo().tipo(); tipo_babbo = doc_babbo.tipo().tipo(); //..il tipo documento..
} totale_doc_babbo = doc_babbo.totale_doc(); //..il suo totale
} } //if (babbo != NULL)..
} //for (int i..
/*[Tipo documento] //schema per destinare gli importi nei campi corretti
O=I**
B=IM*
BO=*M*
FB=**F
FO=*MF
F=IMF*/
switch (tipo_documento) switch (tipo_documento)
{ {
case TTipo_documento::_bolla: case TTipo_documento::_bolla: //bolla B -> IM a meno che non sia bolla da ordine BO -> M
selettore = MATURATO; selettore = MATURATO;
if (tipo_babbo != TTipo_documento::_ordine) if (tipo_babbo != TTipo_documento::_ordine)
selettore |= IMPEGNATO; selettore |= IMPEGNATO;
break; break;
case TTipo_documento::_fattura:
case TTipo_documento::_fattura: //fattura F -> IMF se non deriva da alcun documento origine
selettore = FATTURATO; selettore = FATTURATO;
if (tipo_babbo == TTipo_documento::_ordine) if (tipo_babbo == TTipo_documento::_ordine) //fattura da ordine FO -> MF
{
selettore |= MATURATO; selettore |= MATURATO;
else tmpcurr.put("IMPEGNATO", totale_doc_babbo);
} else
if (tipo_babbo = TTipo_documento::_altro) //fattura senza padri
selettore |= (IMPEGNATO | MATURATO); selettore |= (IMPEGNATO | MATURATO);
break; break;
case TTipo_documento::_ordine: case TTipo_documento::_ordine:
selettore = IMPEGNATO; selettore = IMPEGNATO;
break; break;
case TTipo_documento::_altro: case TTipo_documento::_altro:
default: default:
break; break;
@ -669,19 +680,6 @@ void TPrint_rendiconto_ca_recordset::salva_rmovana(const TRectype& rmovana, cons
tmpcurr.put("DOCORIG", riferimento); tmpcurr.put("DOCORIG", riferimento);
} //if(newdoc != NULL) } //if(newdoc != NULL)
//campi comuni
tmpcurr.put("DESC", movana.get(MOVANA_DESCR)); //descrizione movana
tmpcurr.put("NRIGA", rmovana.get(RMOVANA_NUMRIG)); //numero riga
tmpcurr.put("DESCRIGA", rmovana.get(RMOVANA_DESCR)); //descrizione rmovana
/*[Tipo documento]
O=I**
B=IM*
BO=*M*
FB=**F
FO=*MF
F=IMF*/
//****modificare il metodo per accelerare //****modificare il metodo per accelerare
const char sezione = rmovana.get_char(RMOVANA_SEZIONE); const char sezione = rmovana.get_char(RMOVANA_SEZIONE);
@ -708,6 +706,28 @@ F=IMF*/
if (selettore & IMPEGNATO) if (selettore & IMPEGNATO)
tmpcurr.put("IMPEGNATO", imp.valore()); tmpcurr.put("IMPEGNATO", imp.valore());
//campi comuni a rmovana e rdoc senza particolari operazioni
TString descr = movana.get(MOVANA_DESCR);
int pos = descr.find('$'); //solo per il CRPA!
if (pos > 0)
{
descr.ltrim(pos+1);
descr.trim();
}
tmpcurr.put("DESC", descr); //descrizione movana
tmpcurr.put("NRIGA", rmovana.get(RMOVANA_NUMRIG)); //numero riga
tmpcurr.put("DESCRIGA", rmovana.get(RMOVANA_DESCR)); //descrizione rmovana
/* int err = _tmp->write(); // aggiunge i record al file temporaneo
if (err != NOERR)
{
TString msg;
msg.format(FR("Errore di scrittura %d sul file temporaneo\n"), err);
msg << "Documento " <<
error_box (msg);
}*/
_tmp->write(); // aggiunge i record al file temporaneo _tmp->write(); // aggiunge i record al file temporaneo
if (should_delete) if (should_delete)
@ -798,14 +818,18 @@ void TPrint_rendiconto_ca_recordset::crea_righe_rdoc(const TPrint_rendiconto_ca_
//se siamo fortunati l'anno si può trovare così.. //se siamo fortunati l'anno si può trovare così..
int anno = msk.get_int(F_ANNO); int anno = msk.get_int(F_ANNO);
if (anno == 0 && _dadata.year() == _adata.year())
anno = _adata.year();
if (anno > 0) if (anno > 0)
{ {
dardoc.put(RDOC_ANNO, anno); dardoc.put(RDOC_ANNO, anno);
ardoc.put(RDOC_ANNO, anno); ardoc.put(RDOC_ANNO, anno);
} }
else
{
dardoc.put(RDOC_ANNO, _dadata.year());
ardoc.put(RDOC_ANNO, _adata.year());
if (_dadata.year() == _adata.year())
anno = _dadata.year();
}
if (_dadata.ok()) if (_dadata.ok())
filtro_date << "(ANSI(33->DATADOC)>=" << _dadata.date2ansi() << ")"; filtro_date << "(ANSI(33->DATADOC)>=" << _dadata.date2ansi() << ")";
@ -825,12 +849,13 @@ void TPrint_rendiconto_ca_recordset::crea_righe_rdoc(const TPrint_rendiconto_ca_
FOR_EACH_SHEET_ROW(sheet, r, row) FOR_EACH_SHEET_ROW(sheet, r, row)
{ {
const TString4 codnum(row->get(0)); //prende il codice numerazione sulla riga const TString4 codnum(row->get(0)); //prende il codice numerazione sulla riga
if (anno > 0) if (anno > 0) //se c'e' l'anno posso aggiungere codnum perchè è il campo successivo sulla chiave
{ {
dardoc.put(RDOC_CODNUM, codnum); dardoc.put(RDOC_CODNUM, codnum);
ardoc.put(RDOC_CODNUM, codnum); ardoc.put(RDOC_CODNUM, codnum);
} }
//aggiunge il filtro per codice numerazione e stato documento
TString filtro = filtro_date; TString filtro = filtro_date;
if (filtro.not_empty()) if (filtro.not_empty())
filtro << "&&"; filtro << "&&";
@ -838,6 +863,27 @@ void TPrint_rendiconto_ca_recordset::crea_righe_rdoc(const TPrint_rendiconto_ca_
filtro << "&&(33->STATO>=\"" << row->get(2) << "\")"; filtro << "&&(33->STATO>=\"" << row->get(2) << "\")";
filtro << "&&(33->STATO<=\"" << row->get(3) << "\")"; filtro << "&&(33->STATO<=\"" << row->get(3) << "\")";
//poi deve aggiungere il filtro per cdc/cms/fas
if (_codcosto.not_empty())
{
if (filtro.not_empty())
filtro << "&&";
filtro << "(" << RDOC_CODCOSTO << "==\"" << _codcosto << "\")";
}
if (_codcms.not_empty())
{
if (filtro.not_empty())
filtro << "&&";
filtro << "(" << RDOC_CODCMS << "==\"" << _codcms << "\")";
}
if (_codfas.not_empty())
{
if (filtro.not_empty())
filtro << "&&";
filtro << "(" << RDOC_FASCMS << "==\"" << _codfas << "\")";
}
//il filtro è completo;può eseguire la scansione
TCursor cur_rdoc(&rel_rdoc, filtro, 1, &dardoc, &ardoc); TCursor cur_rdoc(&rel_rdoc, filtro, 1, &dardoc, &ardoc);
const long rdoc_items = cur_rdoc.items(); const long rdoc_items = cur_rdoc.items();
cur_rdoc.freeze(); cur_rdoc.freeze();

View File

@ -102,7 +102,7 @@ MESSAGE RESET,F2.103</prescript>
<source>ANNO</source> <source>ANNO</source>
</field> </field>
<field x="10" type="Testo" width="1" pattern="1" text="-" /> <field x="10" type="Testo" width="1" pattern="1" text="-" />
<field x="11" type="Numero" align="right" width="7" pattern="1"> <field x="11" type="Stringa" width="7" pattern="1">
<source>NUMRD</source> <source>NUMRD</source>
</field> </field>
<field x="20" type="Data" width="10" pattern="1"> <field x="20" type="Data" width="10" pattern="1">
@ -160,15 +160,15 @@ MESSAGE RESET,F2.103</prescript>
</field> </field>
<field x="123" y="2.5" type="Valuta" align="right" width="15" id="201" pattern="1" text="###.###.###,@@"> <field x="123" y="2.5" type="Valuta" align="right" width="15" id="201" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#H101-#101</source> <source>#103-#101</source>
</field> </field>
<field x="139" y="2.5" type="Valuta" align="right" width="15" id="202" pattern="1" text="###.###.###,@@"> <field x="139" y="2.5" type="Valuta" align="right" width="15" id="202" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#H102-#102</source> <source>#103-#102</source>
</field> </field>
<field x="155" y="2.5" type="Valuta" align="right" width="15" id="203" pattern="1" text="###.###.###,@@"> <field x="155" y="2.5" type="Valuta" align="right" width="15" id="203" pattern="1" text="###.###.###,@@">
<font face="Courier New" bold="1" size="8" /> <font face="Courier New" bold="1" size="8" />
<source>#H103-#103</source> <source>#H1.103-#103</source>
</field> </field>
</section> </section>
<sql>USE 1000</sql> <sql>USE 1000</sql>