Patch level :10.0

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
stampa assurda per SMaryOfAngels fine fase 1 (scritta senza report, mai provata)


git-svn-id: svn://10.65.10.50/trunk@19742 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2009-12-09 16:24:42 +00:00
parent 94dd8c8234
commit 6f60b2a026
8 changed files with 699 additions and 16 deletions

View File

@ -11,6 +11,7 @@ int main(int argc, char** argv)
case 4: ca1500(argc,argv); break; // stampa centri di costo
case 5: ca1600(argc,argv); break; // stampa commesse
case 6: ca1700(argc,argv); break; // stampa fasi
case 7: ca1800(argc,argv); break; // stampa movimenti raggruppati per conto cms (antico prg cm0100)
default: ca1100(argc,argv); break; // stampa tabelle
}
exit(0);

View File

@ -6,5 +6,6 @@ int ca1400(int argc, char* argv[]);
int ca1500(int argc, char* argv[]);
int ca1600(int argc, char* argv[]);
int ca1700(int argc, char* argv[]);
int ca1800(int argc, char* argv[]);
#endif // __CA1_H

352
ca/ca1800.cpp Executable file
View File

@ -0,0 +1,352 @@
#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include <progind.h>
#include <recset.h>
#include <reprint.h>
#include <textset.h>
#include <utility.h>
#include "rmovana.h"
#include "calib02.h"
#include "ca1800a.h"
////////////////////////////////////////////////////////
// MASCHERA
////////////////////////////////////////////////////////
class TPrint_contixcms_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TPrint_contixcms_mask();
};
TPrint_contixcms_mask::TPrint_contixcms_mask() : TAutomask("ca1800a")
{
}
bool TPrint_contixcms_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch(o.dlg())
{
case DLG_PRINT:
if (e == fe_button)
{
main_app().print();
return false;
}
break;
case DLG_PREVIEW:
if (e == fe_button)
{
main_app().preview();
return false;
}
break;
default:
break;
}
return true;
}
////////////////////////////////////////////////////////
// REPORT
////////////////////////////////////////////////////////
class TPrint_contixcms_report : public TReport
{
protected:
//virtual bool use_mask() { return false; } //questo ci vuole quando la maschera ha un nome != dai report
public:
TPrint_contixcms_report() {}
};
////////////////////////////////////////////////////////
// RECORDSET
////////////////////////////////////////////////////////
class TPrint_contixcms_recordset : public TAS400_recordset
{
protected:
long trova_riga(const TToken_string& key);
public:
bool aggiungi_riga(TISAM_recordset& recset);
TPrint_contixcms_recordset();
};
TPrint_contixcms_recordset::TPrint_contixcms_recordset()
: TAS400_recordset("AS400(80)")
{
create_field(RMOVANA_CODCMS, -1, 20, _alfafld, true);
create_field(RMOVANA_CODFASE, -1, 10, _alfafld, false);
create_field(RMOVANA_CODCONTO, -1, 12, _alfafld, true);
create_field("INDBIL", -1, 1, _intfld, true);
create_field(RMOVANA_DATACOMP, -1, 8, _datefld, true);
create_field(RMOVANA_IMPORTO, -1, 18, _realfld, true);
create_field(RMOVANA_SEZIONE, -1, 1, _alfafld, true);
}
//cerca se una riga con chiave key esiste già
long TPrint_contixcms_recordset::trova_riga(const TToken_string& key)
{
long first = 0;
long last = items() - 1;
long riga = -1;
while(first <= last)
{
const long guess = (first + last) / 2;
move_to(guess);
TToken_string guess_key;
guess_key.add(get(RMOVANA_CODCMS).as_string()); //commessa
guess_key.add(get(RMOVANA_CODCONTO).as_string()); //conto
const int diff = guess_key.compare(key);
if (diff == 0)
{
riga = guess;
break;
}
if (diff > 0)
{
last = guess - 1;
}
else
{
first = guess + 1;
}
}
return riga;
}
//funzione di ordinamento per il campo codcms/codconto
//sono 2 stringhe
static int compare_cms_conto(const TObject** o1, const TObject** o2)
{
TString& s1 = *(TString*)*o1;
TString& s2 = *(TString*)*o2;
const TString& cms1 = s1.left(20);
const TString& cms2 = s2.left(20);
int cmp = cms1.compare(cms2);
if (cmp == 0)
{
const TString& cnt1 = s1.mid(30, 12);
const TString& cnt2 = s2.mid(30, 12);
cmp = cnt1.compare(cnt2);
}
return cmp;
}
//metodo per aggiungere righe al recordset da stampare
bool TPrint_contixcms_recordset::aggiungi_riga(TISAM_recordset& recset)
{
//raccatta i dati che servono alla riga da stampare prendendoli dal record corrente del..
//..recordset in esame riempito dalla query iniziale
const TString& codcms = recset.get(RMOVANA_CODCMS).as_string();
const TString& codfase = recset.get(RMOVANA_CODFASE).as_string();
const TString& codconto = recset.get(RMOVANA_CODCONTO).as_string();
TAnal_bill zio(codconto);
const TIndbil ib = zio.indicatore_bilancio();
const TDate& datacomp = recset.get(RMOVANA_DATACOMP).as_date();
const real curr_valore = recset.get(RMOVANA_IMPORTO).as_real();
const char curr_sezione = recset.get(RMOVANA_SEZIONE).as_string()[0];
TImporto curr_imp(curr_sezione, curr_valore); //importo riga correntemente in esame
//chiave della riga (solo su commessa e conto!; la fase è solo un filtro in input)
TToken_string key;
key.add(codcms);
key.add(codconto);
//cerca se per caso la riga non esista già con questa chiave
long numriga = trova_riga(key);
//se la riga con la chiave key non esiste nel printrecordset la aggiunge
if (numriga < 0)
{
new_rec("");
set(RMOVANA_CODCMS, TVariant(codcms));
set(RMOVANA_CODFASE, TVariant(codfase));
set(RMOVANA_CODCONTO, TVariant(codconto));
set("INDBIL", TVariant(long(ib)));
set(RMOVANA_DATACOMP, TVariant(datacomp));
//deve ordinare il recordset
sort(compare_cms_conto);
//dopo che la riga è stata aggiunta riesegue la trova_riga in modo da ottenere il numero di riga
numriga = trova_riga(key);
}
//importo riga con indice numriga
const char tot_sezione = get(RMOVANA_SEZIONE).as_string()[0];
const real tot_valore = get(RMOVANA_IMPORTO).as_real();
TImporto tot_imp(tot_sezione, tot_valore);
//aggiunge l'importo alla riga (nuova o vecchia)
tot_imp += curr_imp;
//normalizza e risalva il valore aggiornato sulla riga
tot_imp.normalize();
TString4 str_sez;
str_sez << tot_imp.sezione();
set(RMOVANA_SEZIONE, str_sez);
set(RMOVANA_IMPORTO, tot_imp.valore());
return true;
}
////////////////////////////////////////////////////////
// APPLICAZIONE
////////////////////////////////////////////////////////
class TPrint_contixcms : public TSkeleton_application
{
TPrint_contixcms_mask* _mask;
protected:
virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM
virtual bool create();
virtual void print();
virtual void preview();
virtual void print_or_preview(const bool stampa);
TPrint_contixcms_recordset* elabora() const;
public:
virtual void main_loop();
};
//metodo di alto livello per la gestione dell'elaborazione
TPrint_contixcms_recordset* TPrint_contixcms::elabora() const
{
//creazione dell'as400 recordset che verra' riempito dai record del recordset righe
TPrint_contixcms_recordset* printset = new TPrint_contixcms_recordset();
//creazione della query per la creazione del recordset
TString query;
query << "USE RMOVANA KEY 3\n";
query << "SELECT (BETWEEN(CODCMS,#DACODCMS,#ACODCMS))&&(BETWEEN(CODFASE,#DACODFASE,#ACODFASE))&&(BETWEEN(CODCONTO,#DACODCONTO,#ACODCONTO))\n";
//query << "JOIN MOVANA INTO NUMREG==NUMREG\n";
//query << "JOIN PCON INTO GRUPPO=CODCONTO[1,3] CONTO=CODCONTO[4,6] SOTTOCONTO=CODCONTO[7,12]\n";
query << "FROM DATACOMP=#DADATA\n";
query << "TO DATACOMP=#ADATA";
TISAM_recordset recset(query);
recset.set_var("#DACODCMS", TVariant(_mask->get(F_DACODCMS)));
recset.set_var("#ACODCMS", TVariant(_mask->get(F_ACODCMS)));
recset.set_var("#DACODFASE", TVariant(_mask->get(F_DACODFASE)));
recset.set_var("#ACODFASE", TVariant(_mask->get(F_ACODFASE)));
//per il conto va gestito il fatto che il conto è contabile e non analitico ed è 0-filled
TString contone;
int gruppo = _mask->get_int(F_GRUPPOINI);
int conto = _mask->get_int(F_CONTOINI);
long sottoconto = _mask->get_long(F_SOTTOCINI);
contone.format("%03d%03d%06ld", gruppo, conto, sottoconto);
recset.set_var("#DACODCONTO", contone);
gruppo = _mask->get_int(F_GRUPPOFIN);
conto = _mask->get_int(F_CONTOFIN);
sottoconto = _mask->get_long(F_SOTTOCFIN);
contone.format("%03d%03d%06ld", gruppo, conto, sottoconto);
recset.set_var("#ACODCONTO", contone);
//e alla fine le decisivissime date (che sono l'intervallo di scelta più importante)
recset.set_var("#DADATA", _mask->get_date(F_DATAINI));
recset.set_var("#ADATA", _mask->get_date(F_DATAFIN));
//se ci sono record che soddisfano le pesanti richieste dell'utonto...
const long recset_items = recset.items();
if (recset_items > 0)
{
//E crea pure la progind..
TProgind pi(recset_items, TR("Elaborazione dati per la stampa..."), true, true);
//Scansione del recordset trovato
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
if (!pi.addstatus(1))
break;
//scrive sul CSV i campi che servono al report
printset->aggiungi_riga(recset);
}
}
return printset;
}
//fantastico metodo per gestire stampa o anteprima
void TPrint_contixcms::print_or_preview(const bool stampa)
{
if (_mask->check_fields())
{
//l'utonto può scegliere che report usare (personalizzato!)
TString rep_name = _mask->get(F_REPORT);
//se il rep non è selezionato usa quello standard
if (rep_name.empty())
rep_name << "ca1800a.rep";
TPrint_contixcms_report rep;
rep.load(rep_name);
rep.mask2report(*_mask); //setta i valori della maschera sul report
//metodo per la generazione del recordset che contiene tutti i dati da stampare
//insomma, il vero programma!
TPrint_contixcms_recordset* printset = elabora();
//appioppa il recordset al report
rep.set_recordset(printset);
TReport_book book;
book.add(rep);
if (stampa)
book.print();
else
book.preview();
}
}
void TPrint_contixcms::print()
{
print_or_preview(true);
}
void TPrint_contixcms::preview()
{
print_or_preview(false);
}
void TPrint_contixcms::main_loop()
{
_mask = new TPrint_contixcms_mask;
_mask->run();
delete _mask;
_mask = NULL;
}
bool TPrint_contixcms::create()
{
return TSkeleton_application::create();
}
int ca1800(int argc, char* argv[])
{
TPrint_contixcms a;
a.run(argc, argv, TR("Stampa saldi conti per commessa"));
return 0;
}

26
ca/ca1800a.h Executable file
View File

@ -0,0 +1,26 @@
// campi per la maschera ca1800a
#define F_CODDITTA 101
#define F_RAGSOC 102
#define F_ANNO 103
#define F_DATAINI 104
#define F_DATAFIN 105
#define F_DACODCMS 106
#define F_ACODCMS 107
#define F_DACODFASE 108
#define F_ACODFASE 109
#define F_GRUPPOINI 110
#define F_CONTOINI 111
#define F_SOTTOCINI 112
#define F_DESCRINI 113
#define F_GRUPPOFIN 114
#define F_CONTOFIN 115
#define F_SOTTOCFIN 116
#define F_DESCRFIN 117
#define F_DETTAGLI 120
#define F_TOTCONTI 121
#define F_TOTCMS 122
#define F_REPORT 123

14
ca/ca1800a.rep Executable file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" ?>
<report name="ca1800a" orientation="2" lpi="6">
<font face="Arial" size="8" />
<section type="Head" />
<section type="Head" level="1" />
<section type="Body" />
<section type="Body" level="1">
<field x="1" type="Stringa" width="20" pattern="1">
<source>CODCONTO</source>
</field>
</section>
<section type="Foot" />
<section type="Foot" level="1" />
</report>

269
ca/ca1800a.uml Executable file
View File

@ -0,0 +1,269 @@
#include "ca1800a.h"
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_PREVIEW 2 2
BEGIN
PROMPT 1 1 "~Anteprima"
PICTURE TOOL_PREVIEW
END
#include <printbar.h>
ENDPAGE
PAGE "Conti per CDC/Commessa" 0 2 0 0
GROUPBOX DLG_NULL 79 3
BEGIN
PROMPT 1 0 "@bDitta"
END
NUMBER F_CODDITTA 5
BEGIN
PROMPT 2 1 "Codice "
FLAGS "DF"
USE LF_NDITTE
INPUT CODDITTA F_CODDITTA
DISPLAY "Codice" CODDITTA
DISPLAY "Ragione sociale@50" RAGSOC
OUTPUT F_RAGSOC RAGSOC
CHECKTYPE REQUIRED
END
STRING F_RAGSOC 50
BEGIN
PROMPT 17 1 "Rag. Soc. "
FLAGS "D"
END
GROUPBOX DLG_NULL 79 4
BEGIN
PROMPT 1 3 "@bPeriodo"
END
NUMBER F_ANNO 4
BEGIN
PROMPT 2 4 "Codice esercizio "
HELP "Codice esercizio per cui si vuole la lista"
USE ESC
INPUT CODTAB F_ANNO
DISPLAY "Codice" CODTAB
DISPLAY "Data inizio esercizio" D0
DISPLAY "Data fine esercizio" D1
OUTPUT F_ANNO CODTAB
FLAGS "RZ"
ADD RUN cg0 -5 esc
CHECKTYPE NORMAL
WARNING "Codice esercizio assente"
END
DATE F_DATAINI
BEGIN
PROMPT 2 5 "Dalla data "
END
DATE F_DATAFIN
BEGIN
PROMPT 50 5 "alla data "
VALIDATE DATE_CMP_FUNC >= F_DATAINI
WARNING "La data finale deve essere succeviva a quella iniziale"
END
GROUPBOX DLG_NULL 79 4
BEGIN
PROMPT 1 7 "@bSelezione commesse"
END
STRING F_DACODCMS 20
BEGIN
PROMPT 2 8 "Da Commessa "
FLAGS "UZ"
USE COMMESSE
INPUT CODCMS F_DACODCMS
DISPLAY "Codice@20" CODCMS
DISPLAY "Descrizione@50" DESCRIZ
OUTPUT F_DACODCMS CODCMS
CHECKTYPE SEARCH
END
STRING F_DACODFASE 10
BEGIN
PROMPT 50 8 "Da fase "
FLAGS "UZ"
USE FASI
INPUT CODFASE F_DACODFASE
DISPLAY "Codice@20" CODFASE
DISPLAY "Descrizione@50" DESCRIZ
OUTPUT F_DACODFASE CODFASE
CHECKTYPE SEARCH
END
STRING F_ACODCMS 20
BEGIN
PROMPT 2 9 "A Commessa "
FLAGS "UZ"
COPY USE F_DACODCMS
INPUT CODCMS F_ACODCMS
COPY DISPLAY F_DACODCMS
OUTPUT F_ACODCMS CODCMS
CHECKTYPE SEARCH
END
STRING F_ACODFASE 10
BEGIN
PROMPT 50 9 "A fase "
FLAGS "UZ"
COPY USE F_DACODFASE
INPUT CODFASE F_ACODFASE
COPY DISPLAY F_DACODFASE
OUTPUT F_ACODFASE CODFASE
CHECKTYPE SEARCH
END
GROUPBOX DLG_NULL 79 6
BEGIN
PROMPT 1 12 "@bSelezione conti"
END
NUMBER F_GRUPPOINI 3
BEGIN
PROMPT 2 13 "Da Gruppo - Conto - Sottoconto "
END
NUMBER F_CONTOINI 3
BEGIN
PROMPT 39 13 ""
USE LF_PCON SELECT (CONTO!="")&&(SOTTOCONTO="")
INPUT GRUPPO F_GRUPPOINI
INPUT CONTO F_CONTOINI
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Descrizione@50" DESCR
DISPLAY "Tipo" TMCF
OUTPUT F_GRUPPOINI GRUPPO
OUTPUT F_CONTOINI CONTO
CHECKTYPE NORMAL
WARNING "Conto inesistente o mancante"
VALIDATE REQIF_FUNC 1 F_SOTTOCINI
END
NUMBER F_SOTTOCINI 6
BEGIN
PROMPT 46 13 ""
USE LF_PCON SELECT SOTTOCONTO!=""
INPUT GRUPPO F_GRUPPOINI
INPUT CONTO F_CONTOINI
INPUT SOTTOCONTO F_SOTTOCINI
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" SOTTOCONTO
DISPLAY "Descrizione@50" DESCR
OUTPUT F_GRUPPOINI GRUPPO
OUTPUT F_CONTOINI CONTO
OUTPUT F_SOTTOCINI SOTTOCONTO
OUTPUT F_DESCRINI DESCR
CHECKTYPE SEARCH
ADD RUN cg0 -0
END
STRING F_DESCRINI 50
BEGIN
PROMPT 2 14 "Descrizione "
USE LF_PCON KEY 2
CHECKTYPE NORMAL
INPUT DESCR F_DESCRINI
DISPLAY "Descrizione@50" DESCR
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" SOTTOCONTO
COPY OUTPUT F_SOTTOCINI
ADD RUN cg0 -0
END
NUMBER F_GRUPPOFIN 3
BEGIN
PROMPT 2 15 "A Gruppo - Conto - Sottoconto "
END
NUMBER F_CONTOFIN 3
BEGIN
PROMPT 39 15 ""
USE LF_PCON SELECT (CONTO!="")&&(SOTTOCONTO="")
INPUT GRUPPO F_GRUPPOFIN
INPUT CONTO F_CONTOFIN
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Descrizione@50" DESCR
DISPLAY "Tipo" TMCF
OUTPUT F_GRUPPOFIN GRUPPO
OUTPUT F_CONTOFIN CONTO
CHECKTYPE NORMAL
VALIDATE REQIF_FUNC 1 F_SOTTOCFIN
WARNING "Conto inesistente o mancante"
END
NUMBER F_SOTTOCFIN 6
BEGIN
PROMPT 46 15 ""
USE LF_PCON SELECT SOTTOCONTO!=""
INPUT GRUPPO F_GRUPPOFIN
INPUT CONTO F_CONTOFIN
INPUT SOTTOCONTO F_SOTTOCFIN
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" SOTTOCONTO
DISPLAY "Descrizione@50" DESCR
OUTPUT F_GRUPPOFIN GRUPPO
OUTPUT F_CONTOFIN CONTO
OUTPUT F_SOTTOCFIN SOTTOCONTO
OUTPUT F_DESCRFIN DESCR
CHECKTYPE SEARCH
WARNING "Sottoconto inesistente o mancante"
ADD RUN cg0 -0
END
STRING F_DESCRFIN 50
BEGIN
PROMPT 2 16 "Descrizione "
USE LF_PCON KEY 2
CHECKTYPE NORMAL
INPUT DESCR F_DESCRFIN
DISPLAY "Descrizione@50" DESCR
DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" SOTTOCONTO
COPY OUTPUT F_SOTTOCFIN
ADD RUN cg0 -0
END
GROUPBOX DLG_NULL 79 3
BEGIN
PROMPT 1 18 "@bSelezione elementi da stampare"
END
BOOLEAN F_DETTAGLI
BEGIN
PROMPT 2 19 "Dettagli sottoconto"
END
BOOLEAN F_TOTCONTI
BEGIN
PROMPT 31 19 "Totali per conto"
END
BOOLEAN F_TOTCMS
BEGIN
PROMPT 57 19 "Totali per commessa"
END
STRING F_REPORT 50
BEGIN
PROMPT 1 21 "Report personalizzato "
RSELECT ""
CHECKTYPE NORMAL
END
ENDPAGE
ENDMASK

View File

@ -760,6 +760,11 @@ void TPrint_rendiconto_ca_recordset::scrive_riga(TLocalisamfile& tmp, const TRec
//---- DOC D'ORIGINE DELL' ANALMOV ----//
//tipo movimento CONSUNTIVO (o TEMPORANEO); per i movimenti di budget (P o V) vedi l'else
const char tipomov = movana.get_char(MOVANA_TIPOMOV);
#ifdef DBG
const long cazzone_numreg = movana.get_long(MOVANA_NUMREG);
if (cazzone_numreg == 23004)
const int cazzone = 1;
#endif
//serve un documento da cui ricavare i parametri di stampa
TDocumento* newdoc = (TDocumento*)doc;

View File

@ -10,7 +10,7 @@ PAGE "Selezione archivi per Utente" 0 0 0 2
STRING F_AUC_CODICE 16
BEGIN
PROMPT 2 2 "Utente "
PROMPT 2 2 "Utente "
USE %AUC
JOIN LF_USER INTO USERNAME==CODTAB
FIELD CODTAB
@ -27,7 +27,7 @@ END
STRING F_AUC_CODICE1 16
BEGIN
PROMPT 2 2 "Utente "
PROMPT 2 2 "Utente "
FIELD CODTAB
FLAGS "HG"
KEY 1
@ -44,58 +44,73 @@ END
STRING F_AUC_DESCR 50
BEGIN
PROMPT 2 3 "Nome "
PROMPT 2 3 "Nome "
FLAGS "D"
END
STRING F_AUC_COMMESSE 70 50
GROUPBOX DLG_NULL 78 5
BEGIN
PROMPT 2 4 "Filtro commesse "
PROMPT 1 4 "@bFiltri"
END
STRING F_AUC_COMMESSE 70 65
BEGIN
PROMPT 2 5 "Commesse "
FIELD S0
END
STRING F_AUC_CDC 70 50
STRING F_AUC_CDC 70 65
BEGIN
PROMPT 2 5 "Filtro C.D.C "
PROMPT 2 6 "C.D.C "
FIELD S1
END
STRING F_AUC_FASI 70 50
STRING F_AUC_FASI 70 65
BEGIN
PROMPT 2 6 "Filtro Fasi "
PROMPT 2 7 "Fasi "
FIELD S2
END
TEXT -1
BEGIN
PROMPT 2 8 "I campi soprastanti sono di tipo formula. Si usano per indicare Commesse, Fasi,"
PROMPT 2 10 "I campi soprastanti sono di tipo formula. Si usano per indicare Commesse, Fasi,"
END
TEXT -1
BEGIN
PROMPT 2 9 "e CdC che l'utente selezionato è autorizzato o meno a consultare/modificare."
PROMPT 2 11 "e CdC che l'utente selezionato è autorizzato o meno a consultare/modificare."
END
TEXT -1
BEGIN
PROMPT 2 10 "Esempi"
PROMPT 2 12 "Esempi"
END
TEXT -1
BEGIN
PROMPT 2 11 "CODCMS=codicecommessa"
PROMPT 2 13 "CODCMS=codicecommessa, CODCMS=cod*"
END
TEXT -1
BEGIN
PROMPT 2 12 "CODCOSTO=codicecdc"
PROMPT 2 14 "CODCOSTO=codicecdc, CODCOSTO=cod*"
END
TEXT -1
BEGIN
PROMPT 2 13 "CODFASE=codicefase"
PROMPT 2 15 "CODFASE=codicefase, CODFASE=cod*"
END
TEXT -1
BEGIN
PROMPT 2 16 "Nota: il filtro sulle fasi è applicabile solo se le fasi NON sono collegate a"
END
TEXT -1
BEGIN
PROMPT 2 17 "commesse e CdC"
END
ENDPAGE
ENDMASK