diff --git a/ve/batbcaa.uml b/ve/batbcaa.uml index e7fc85530..231123420 100755 --- a/ve/batbcaa.uml +++ b/ve/batbcaa.uml @@ -1,105 +1,105 @@ -#include "BATBCAA.H" -#define LF_PCON 19 //PIANO DEI CONTI - -TOOLBAR "" 0 20 60 2 - #include -ENDPAGE - -PAGE "Tabella categoria acquisti articoli " 11 60 14 - -GROUPBOX DLG_NULL 75 7 -BEGIN - PROMPT 1 0 "" - FLAGS "R" -END - -STRING F_CODICE 3 -BEGIN - PROMPT 2 2 "Cod. Tabella " - FIELD CAA->CODTAB - KEY 1 - USE CAA - - FLAG "U" - INPUT CODTAB F_CODICE - - DISPLAY "Codice " CODTAB - DISPLAY "Descrizione@50 " S0 - - OUTPUT F_CODICE CODTAB - OUTPUT F_DESCR S0 - CHECKTYPE REQUIRED - -END - -STRING F_DESCR 50 -BEGIN - PROMPT 2 4 "Descrizione " - FIELD CAA->S0 - KEY 2 - USE CAA KEY 2 - INPUT S0 F_DESCR - - DISPLAY "Codice " CODTAB - DISPLAY "Descrizione@50 " S0 - - OUTPUT F_CODICE CODTAB - OUTPUT F_DESCR S0 - CHECKTYPE REQUIRED - -END - -STRING F_CODCON 3 -BEGIN - PROMPT 2 8 "Codice conto " - FIELD CAA->S1 - FLAG "R" -END - -STRING F_CODCON1 3 -BEGIN - PROMPT 25 8 "" - FIELD CAA->S2 - USE LF_PCON SELECT INDBIL=3 - FLAG "R" - INPUT GRUPPO F_CODCON - INPUT CONTO F_CODCON1 - DISPLAY "Gruppo " GRUPPO - DISPLAY "Conto " CONTO - DISPLAY "Descrizione@50" DESCR - OUTPUT F_CODCON GRUPPO - OUTPUT F_CODCON1 CONTO - OUTPUT F_DESCR1 DESCR - ADD RUN CG0 -0 -END - -STRING F_CODCON2 6 -BEGIN - PROMPT 34 8 "" - FIELD CAA->S3 - USE LF_PCON SELECT INDBIL=3 - FLAG "R" - INPUT GRUPPO F_CODCON - INPUT CONTO F_CODCON1 - INPUT SOTTOCONTO F_CODCON2 - DISPLAY "Gruppo " GRUPPO - DISPLAY "Conto " CONTO - DISPLAY "Sottoconto " SOTTOCONTO - DISPLAY "Descrizione@50" DESCR - OUTPUT F_CODCON GRUPPO - OUTPUT F_CODCON1 CONTO - OUTPUT F_CODCON2 SOTTOCONTO - OUTPUT F_DESCR1 DESCR - ADD RUN CG0 -0 -END - -STRING F_DESCR1 50 -BEGIN - PROMPT 17 10 "" - FLAG "D" -END - -ENDPAGE - - -ENDMASK +#include "BATBCAA.H" +#define LF_PCON 19 //PIANO DEI CONTI + +TOOLBAR "" 0 20 60 2 + #include +ENDPAGE + +PAGE "Tabella categoria acquisti articoli " 11 60 14 + +GROUPBOX DLG_NULL 75 7 +BEGIN + PROMPT 1 0 "" + FLAGS "R" +END + +STRING F_CODICE 3 +BEGIN + PROMPT 2 2 "Cod. Tabella " + FIELD CAA->CODTAB + KEY 1 + USE CAA + + FLAG "U" + INPUT CODTAB F_CODICE + + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50 " S0 + + OUTPUT F_CODICE CODTAB + OUTPUT F_DESCR S0 + CHECKTYPE REQUIRED + +END + +STRING F_DESCR 50 +BEGIN + PROMPT 2 4 "Descrizione " + FIELD CAA->S0 + KEY 2 + USE CAA KEY 2 + INPUT S0 F_DESCR + + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50 " S0 + + OUTPUT F_CODICE CODTAB + OUTPUT F_DESCR S0 + CHECKTYPE REQUIRED + +END + +STRING F_CODCON 3 +BEGIN + PROMPT 2 8 "Codice conto " + FIELD CAA->S1 + FLAG "R" +END + +STRING F_CODCON1 3 +BEGIN + PROMPT 25 8 "" + FIELD CAA->S2 + USE LF_PCON SELECT INDBIL=3 + FLAG "R" + INPUT GRUPPO F_CODCON + INPUT CONTO F_CODCON1 + DISPLAY "Gruppo " GRUPPO + DISPLAY "Conto " CONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODCON GRUPPO + OUTPUT F_CODCON1 CONTO + OUTPUT F_DESCR1 DESCR + ADD RUN CG0 -0 +END + +STRING F_CODCON2 6 +BEGIN + PROMPT 34 8 "" + FIELD CAA->S3 + USE LF_PCON SELECT INDBIL=3 + FLAG "R" + INPUT GRUPPO F_CODCON + INPUT CONTO F_CODCON1 + INPUT SOTTOCONTO F_CODCON2 + DISPLAY "Gruppo " GRUPPO + DISPLAY "Conto " CONTO + DISPLAY "Sottoconto " SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODCON GRUPPO + OUTPUT F_CODCON1 CONTO + OUTPUT F_CODCON2 SOTTOCONTO + OUTPUT F_DESCR1 DESCR + ADD RUN CG0 -0 +END + +STRING F_DESCR1 50 +BEGIN + PROMPT 17 10 "" + FLAG "D" +END + +ENDPAGE + + +ENDMASK diff --git a/ve/batbcra.uml b/ve/batbcra.uml index 8ad15f8eb..996ed7355 100755 --- a/ve/batbcra.uml +++ b/ve/batbcra.uml @@ -1,106 +1,106 @@ -#include "BATBCRA.H" -#define LF_PCON 19 //PIANO DEI CONTI - - -TOOLBAR "" 0 20 60 2 - #include -ENDPAGE - -PAGE "Tabella categoria ricavi articoli " 11 60 14 - -GROUPBOX DLG_NULL 75 7 -BEGIN - PROMPT 1 0 "" - FLAGS "R" -END - -STRING F_CODICE 3 -BEGIN - PROMPT 2 2 "Cod. Tabella " - FIELD CRA->CODTAB - KEY 1 - USE CRA - - FLAG "U" - INPUT CODTAB F_CODICE - - DISPLAY "Codice " CODTAB - DISPLAY "Descrizione@50 " S0 - - OUTPUT F_CODICE CODTAB - OUTPUT F_DESCR S0 - CHECKTYPE REQUIRED -END - -STRING F_DESCR 50 -BEGIN - PROMPT 2 4 "Descrizione " - FIELD CRA->S0 - KEY 2 - USE CRA KEY 2 - INPUT S0 F_DESCR - - DISPLAY "Codice " CODTAB - DISPLAY "Descrizione@50 " S0 - - OUTPUT F_CODICE CODTAB - OUTPUT F_DESCR S0 - CHECKTYPE REQUIRED - -END - -STRING F_CODCON 3 -BEGIN - PROMPT 2 8 "Codice conto " - FIELD CRA->S1 - FLAG "R" -END - -STRING F_CODCON1 3 -BEGIN - PROMPT 25 8 "" - FIELD CRA->S2 - USE LF_PCON SELECT INDBIL="4" - FLAG "R" - INPUT GRUPPO F_CODCON - INPUT CONTO F_CODCON1 - DISPLAY "Gruppo " GRUPPO - DISPLAY "Conto " CONTO - DISPLAY "Descrizione@50" DESCR - OUTPUT F_CODCON GRUPPO - OUTPUT F_CODCON1 CONTO - OUTPUT F_DESCR1 DESCR - ADD RUN CG0 -0 -END - -STRING F_CODCON2 6 -BEGIN - PROMPT 34 8 "" - FIELD CRA->S3 - USE LF_PCON SELECT INDBIL="4" - FLAG "R" - INPUT GRUPPO F_CODCON - INPUT CONTO F_CODCON1 - INPUT SOTTOCONTO F_CODCON2 - DISPLAY "Gruppo " GRUPPO - DISPLAY "Conto " CONTO - DISPLAY "Sottoconto " SOTTOCONTO - DISPLAY "Descrizione@50" DESCR - OUTPUT F_CODCON GRUPPO - OUTPUT F_CODCON1 CONTO - OUTPUT F_CODCON2 SOTTOCONTO - OUTPUT F_DESCR1 DESCR - ADD RUN CG0 -0 - -END - -STRING F_DESCR1 50 -BEGIN - PROMPT 17 10 "" - FLAG "D" -END - -ENDPAGE - - -ENDMASK +#include "BATBCRA.H" +#define LF_PCON 19 //PIANO DEI CONTI + + +TOOLBAR "" 0 20 60 2 + #include +ENDPAGE + +PAGE "Tabella categoria ricavi articoli " 11 60 14 + +GROUPBOX DLG_NULL 75 7 +BEGIN + PROMPT 1 0 "" + FLAGS "R" +END + +STRING F_CODICE 3 +BEGIN + PROMPT 2 2 "Cod. Tabella " + FIELD CRA->CODTAB + KEY 1 + USE CRA + + FLAG "U" + INPUT CODTAB F_CODICE + + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50 " S0 + + OUTPUT F_CODICE CODTAB + OUTPUT F_DESCR S0 + CHECKTYPE REQUIRED +END + +STRING F_DESCR 50 +BEGIN + PROMPT 2 4 "Descrizione " + FIELD CRA->S0 + KEY 2 + USE CRA KEY 2 + INPUT S0 F_DESCR + + DISPLAY "Codice " CODTAB + DISPLAY "Descrizione@50 " S0 + + OUTPUT F_CODICE CODTAB + OUTPUT F_DESCR S0 + CHECKTYPE REQUIRED + +END + +STRING F_CODCON 3 +BEGIN + PROMPT 2 8 "Codice conto " + FIELD CRA->S1 + FLAG "R" +END + +STRING F_CODCON1 3 +BEGIN + PROMPT 25 8 "" + FIELD CRA->S2 + USE LF_PCON SELECT INDBIL="4" + FLAG "R" + INPUT GRUPPO F_CODCON + INPUT CONTO F_CODCON1 + DISPLAY "Gruppo " GRUPPO + DISPLAY "Conto " CONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODCON GRUPPO + OUTPUT F_CODCON1 CONTO + OUTPUT F_DESCR1 DESCR + ADD RUN CG0 -0 +END + +STRING F_CODCON2 6 +BEGIN + PROMPT 34 8 "" + FIELD CRA->S3 + USE LF_PCON SELECT INDBIL="4" + FLAG "R" + INPUT GRUPPO F_CODCON + INPUT CONTO F_CODCON1 + INPUT SOTTOCONTO F_CODCON2 + DISPLAY "Gruppo " GRUPPO + DISPLAY "Conto " CONTO + DISPLAY "Sottoconto " SOTTOCONTO + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODCON GRUPPO + OUTPUT F_CODCON1 CONTO + OUTPUT F_CODCON2 SOTTOCONTO + OUTPUT F_DESCR1 DESCR + ADD RUN CG0 -0 + +END + +STRING F_DESCR1 50 +BEGIN + PROMPT 17 10 "" + FLAG "D" +END + +ENDPAGE + + +ENDMASK diff --git a/ve/batbnum.h b/ve/batbnum.h index fe1832092..866b7622a 100755 --- a/ve/batbnum.h +++ b/ve/batbnum.h @@ -1,32 +1,31 @@ -#define F_CODTAB 101 -#define F_DESNUM 102 -#define F_ULTNUM 103 -#define F_ULTNUMPROV 104 -#define F_PREFISSO 105 -#define F_SUFFISSO 106 -#define F_ULTDATA 107 -#define F_ANNO 108 -#define F_TIPODOC1 110 -#define F_DESDOC1 111 -#define F_TIPODOC2 112 -#define F_DESDOC2 113 -#define F_TIPODOC3 114 -#define F_DESDOC3 115 -#define F_TIPODOC4 116 -#define F_DESDOC4 117 -#define F_TIPODOC5 118 -#define F_DESDOC5 119 -#define F_TIPODOC6 120 -#define F_DESDOC6 121 -#define F_TIPODOC7 122 -#define F_DESDOC7 123 -#define F_TIPODOC8 124 -#define F_DESDOC8 125 -#define F_TIPODOC9 126 -#define F_DESDOC9 127 -#define F_TIPODOC10 128 -#define F_DESDOC10 129 -#define F_NUMPROVV 130 -#define F_NUMAUTO 131 -#define F_ULTDATAPROV 132 - \ No newline at end of file +#define F_CODTAB 101 +#define F_DESNUM 102 +#define F_ULTNUM 103 +#define F_ULTNUMPROV 104 +#define F_PREFISSO 105 +#define F_SUFFISSO 106 +#define F_ULTDATA 107 +#define F_ANNO 108 +#define F_TIPODOC1 110 +#define F_DESDOC1 111 +#define F_TIPODOC2 112 +#define F_DESDOC2 113 +#define F_TIPODOC3 114 +#define F_DESDOC3 115 +#define F_TIPODOC4 116 +#define F_DESDOC4 117 +#define F_TIPODOC5 118 +#define F_DESDOC5 119 +#define F_TIPODOC6 120 +#define F_DESDOC6 121 +#define F_TIPODOC7 122 +#define F_DESDOC7 123 +#define F_TIPODOC8 124 +#define F_DESDOC8 125 +#define F_TIPODOC9 126 +#define F_DESDOC9 127 +#define F_TIPODOC10 128 +#define F_DESDOC10 129 +#define F_NUMPROVV 130 +#define F_NUMAUTO 131 +#define F_ULTDATAPROV 132 diff --git a/ve/batbrfa.uml b/ve/batbrfa.uml index ebd7f5fb5..62c9c5e99 100755 --- a/ve/batbrfa.uml +++ b/ve/batbrfa.uml @@ -1,103 +1,103 @@ -#include "batbrfa.h" - -TOOLBAR "" 0 20 0 2 -#include -ENDPAGE - -PAGE "Raggruppamento fiscali articoli" -1 -1 78 9 - -GROUPBOX DLG_NULL 75 7 -BEGIN - PROMPT 1 0 "" - FLAGS "R" -END - -STRING FLD_TABRFA_CODTAB 5 -BEGIN - PROMPT 2 2 "Codice " - FIELD CODTAB - USE RFA - CHECKTYPE REQUIRED - INPUT CODTAB FLD_TABRFA_CODTAB - DISPLAY "Codice" CODTAB - DISPLAY "Descrizione@50" S0 - OUTPUT FLD_TABRFA_CODTAB CODTAB - OUTPUT FLD_TABRFA_S0 S0 - KEY 1 - FLAGS "U" -END - -STRING FLD_TABRFA_S0 50 -BEGIN - PROMPT 2 4 "Descrizione " - FIELD S0 - USE RFA KEY 2 - CHECKTYPE REQUIRED - WARNING "Manca la descrizione" - INPUT S0 FLD_TABRFA_S0 - DISPLAY "Descrizione@50" S0 - DISPLAY "Codice" CODTAB - COPY OUTPUT FLD_TABRFA_CODTAB - KEY 2 -END - -STRING FLD_TABRFA_S7 2 -BEGIN - PROMPT 2 8 "Unita' di misura " - FIELD S7 -END - -STRING FLD_TABRFA_S8 1 -BEGIN - PROMPT 2 10 "Classe fiscale " - FIELD S8 - USE ASF - INPUT CODTAB FLD_TABRFA_S8 - DISPLAY "Cl. Fisc." CODTAB - DISPLAY "Descrizione@30" S0 - OUTPUT FLD_TABRFA_S8 CODTAB - OUTPUT FLD_DESCFA S0 - CHECKTYPE NORMAL -END - -STRING FLD_DESCFA 30 -BEGIN - PROMPT 25 10 "" - FLAG "D" -END - -NUMBER FLD_TABRFA_R0 6 2 -BEGIN - PROMPT 2 12 "Perc. ricarico medio " - FIELD R0 -END - -NUMBER FLD_TABRFA_R1 12 2 -BEGIN - PROMPT 2 14 "Costo minimo " - FIELD R1 -END - -NUMBER FLD_TABRFA_R2 12 2 -BEGIN - PROMPT 45 14 "massimo " - FIELD R2 -END - -LIST FLD_TABRFA_I0 1 30 -BEGIN - PROMPT 2 16 "Tipo costo " - FIELD I0 - HELP "Inserire il tipo di costo" - ITEM "1|Costo medio annuale" - ITEM "2|Costo ultimi 3 mesi" - ITEM "3|Costo ultimo" - ITEM "4|Costo standard" - ITEM "5|Maggiore ultimi due costi" - ITEM "6|Costo massimo d'acquisto" - ITEM "7|Costo minimo d'acquisto" -END - -ENDPAGE - -ENDMASK +#include "batbrfa.h" + +TOOLBAR "" 0 20 0 2 +#include +ENDPAGE + +PAGE "Raggruppamento fiscali articoli" -1 -1 78 9 + +GROUPBOX DLG_NULL 75 7 +BEGIN + PROMPT 1 0 "" + FLAGS "R" +END + +STRING FLD_TABRFA_CODTAB 5 +BEGIN + PROMPT 2 2 "Codice " + FIELD CODTAB + USE RFA + CHECKTYPE REQUIRED + INPUT CODTAB FLD_TABRFA_CODTAB + DISPLAY "Codice" CODTAB + DISPLAY "Descrizione@50" S0 + OUTPUT FLD_TABRFA_CODTAB CODTAB + OUTPUT FLD_TABRFA_S0 S0 + KEY 1 + FLAGS "U" +END + +STRING FLD_TABRFA_S0 50 +BEGIN + PROMPT 2 4 "Descrizione " + FIELD S0 + USE RFA KEY 2 + CHECKTYPE REQUIRED + WARNING "Manca la descrizione" + INPUT S0 FLD_TABRFA_S0 + DISPLAY "Descrizione@50" S0 + DISPLAY "Codice" CODTAB + COPY OUTPUT FLD_TABRFA_CODTAB + KEY 2 +END + +STRING FLD_TABRFA_S7 2 +BEGIN + PROMPT 2 8 "Unita' di misura " + FIELD S7 +END + +STRING FLD_TABRFA_S8 1 +BEGIN + PROMPT 2 10 "Classe fiscale " + FIELD S8 + USE ASF + INPUT CODTAB FLD_TABRFA_S8 + DISPLAY "Cl. Fisc." CODTAB + DISPLAY "Descrizione@30" S0 + OUTPUT FLD_TABRFA_S8 CODTAB + OUTPUT FLD_DESCFA S0 + CHECKTYPE NORMAL +END + +STRING FLD_DESCFA 30 +BEGIN + PROMPT 25 10 "" + FLAG "D" +END + +NUMBER FLD_TABRFA_R0 6 2 +BEGIN + PROMPT 2 12 "Perc. ricarico medio " + FIELD R0 +END + +NUMBER FLD_TABRFA_R1 12 2 +BEGIN + PROMPT 2 14 "Costo minimo " + FIELD R1 +END + +NUMBER FLD_TABRFA_R2 12 2 +BEGIN + PROMPT 45 14 "massimo " + FIELD R2 +END + +LIST FLD_TABRFA_I0 1 30 +BEGIN + PROMPT 2 16 "Tipo costo " + FIELD I0 + HELP "Inserire il tipo di costo" + ITEM "1|Costo medio annuale" + ITEM "2|Costo ultimi 3 mesi" + ITEM "3|Costo ultimo" + ITEM "4|Costo standard" + ITEM "5|Maggiore ultimi due costi" + ITEM "6|Costo massimo d'acquisto" + ITEM "7|Costo minimo d'acquisto" +END + +ENDPAGE + +ENDMASK diff --git a/ve/riga2.uml b/ve/riga2.uml index e7376a63e..9ac3a3a93 100755 --- a/ve/riga2.uml +++ b/ve/riga2.uml @@ -1,64 +1,64 @@ -TOOLBAR "" 0 20 60 2 -BUTTON 1 10 2 -BEGIN -PROMPT -13 -1 "" -MESSAGE EXIT,312 -END -BUTTON 17 8 2 -BEGIN -PROMPT -23 -1 "~Elimina" -MESSAGE EXIT,127 -END -BUTTON 2 10 2 -BEGIN -PROMPT -33 -1 "" -MESSAGE EXIT,27 -END -END -PAGE "Riga base" 1 1 60 14 -STRING FS_TIPORIGA 2 -BEGIN -PROMPT 2 2 "Tipo riga " -END -STRING FS_CODMAG 3 -BEGIN -PROMPT 2 4 "Cod. Art. " -END -STRING FS_CODART 30 -BEGIN -PROMPT 2 4 "Cod. Art. " -END -STRING FS_DESCR 50 -BEGIN -PROMPT 2 6 "Descrizione " -END -STRING FS_UMQTA 2 -BEGIN -PROMPT 2 8 "UM " -END -NUMBER FS_QTA 11 03 -BEGIN -PROMPT 2 10 "Qt… " -END -NUMBER FS_TARA 15 02 -BEGIN -PROMPT 2 12 "Prezzo " -END -STRING FS_CODIVA 4 -BEGIN -PROMPT 2 14 "Cod.IVA " -END -BOOLEAN FS_ADDIVA -BEGIN -PROMPT 2 16 "Addebito IVA " -END -STRING FS_SCONTO 25 -BEGIN -PROMPT 2 18 "Sconto " -END -NUMBER FS_PERCPROV 5 02 -BEGIN -PROMPT 40 18 "Perc.Provv. " -END -END -ENDMASK +TOOLBAR "" 0 20 60 2 +BUTTON 1 10 2 +BEGIN +PROMPT -13 -1 "" +MESSAGE EXIT,312 +END +BUTTON 17 8 2 +BEGIN +PROMPT -23 -1 "~Elimina" +MESSAGE EXIT,127 +END +BUTTON 2 10 2 +BEGIN +PROMPT -33 -1 "" +MESSAGE EXIT,27 +END +END +PAGE "Riga base" 1 1 60 14 +STRING FS_TIPORIGA 2 +BEGIN +PROMPT 2 2 "Tipo riga " +END +STRING FS_CODMAG 3 +BEGIN +PROMPT 2 4 "Cod. Art. " +END +STRING FS_CODART 30 +BEGIN +PROMPT 2 4 "Cod. Art. " +END +STRING FS_DESCR 50 +BEGIN +PROMPT 2 6 "Descrizione " +END +STRING FS_UMQTA 2 +BEGIN +PROMPT 2 8 "UM " +END +NUMBER FS_QTA 11 03 +BEGIN +PROMPT 2 10 "Qt… " +END +NUMBER FS_TARA 15 02 +BEGIN +PROMPT 2 12 "Prezzo " +END +STRING FS_CODIVA 4 +BEGIN +PROMPT 2 14 "Cod.IVA " +END +BOOLEAN FS_ADDIVA +BEGIN +PROMPT 2 16 "Addebito IVA " +END +STRING FS_SCONTO 25 +BEGIN +PROMPT 2 18 "Sconto " +END +NUMBER FS_PERCPROV 5 02 +BEGIN +PROMPT 40 18 "Perc.Provv. " +END +END +ENDMASK diff --git a/ve/tclifor.cpp b/ve/tclifor.cpp index ef8daed65..c99c9c124 100755 --- a/ve/tclifor.cpp +++ b/ve/tclifor.cpp @@ -1,182 +1,182 @@ -#ifndef __TCLIFOR_H -#include "tclifor.h" -#endif - -#ifndef __VEUML1_H -#include "veuml1.h" -#endif - -#ifndef __VE1000O_H -#include "ve1000o.h" -#endif - -const TString& TData_picker::get( const TString& table, const TString& codtab, const TString& field ) -{ - if( table != _tablename ) - { - delete _table; - _table = new TTable( table ); - _tablename = table; - } - if( codtab != _table->curr( ).get( "CODTAB" ) ) - { - _table->zero( ); - _table->put( "CODTAB", codtab ); - _table->read( ); - } - return _table->get( field ); -}; - -void TData_picker::set( TMask& m, const int mskfield, const TString& value ) -{ - if( present( m, mskfield ) ) - { - m.set( mskfield, value, TRUE ); - m.field( mskfield ).check( ); - } -}; - -const TString& TData_picker::get( const int file, const TString& fieldname ) -{ - return lfile( file ).get( fieldname ); -} - -int TData_picker::get_int( const int file, const TString& fieldname ) -{ - return lfile( file ).get_int( fieldname ); -} - -long TData_picker::get_long( const int file, const TString& fieldname ) -{ - return lfile( file ).get_long( fieldname ); -} - -bool TData_picker::get_bool( const int file, const TString& fieldname ) -{ - return lfile( file ).get_bool( fieldname ); -} - -int TCliFor::write_occas( ) -{ - if( !occasionale( ) ) - return NOERR; - TRelation occas( LF_OCCAS ); - occas_mask( ).autosave( &occas ); - return occas.write( ); -} - -TCliFor::TCliFor( ) : TData_picker( LF_CLIFO ), _occas_mask( "ve1000o" ) -{ - _occas_mask.set_handler( O_CODICE, occas_code_handler ); - add( LF_CFVEN, "TIPOCF=TIPOCF|CODCF=CODCF" ); -} - -void TCliFor::load( const char tipocf, const long codcf, const TString& ocfpi ) -{ - _tipocf = tipocf; - _codcf = codcf; - zero( ); - curr( ).put( "TIPOCF", tipocf ); - curr( ).put( "CODCF", codcf ); - lfile( ).setkey( 1 ); - if( read( ) != NOERR ) - yesnofatal_box( "Il %s %d non è stato trovato!", tipocf == 'C'?"cliente":"fornitore", codcf ); - _occas = curr().get_bool( "OCCAS" ); - if ( occasionale( ) ) - { - TRelation occrel( LF_OCCAS ); - occrel.curr( ).zero( ); - occrel.curr( ).put( "CFPI", ocfpi ); - occrel.read( ); - occas_mask( ).autoload( &occrel ); - } -} - -void TCliForVendite::update_mask( TMask& m, bool onload ) -{ - // Setta i campi che appartengono al file LF_CLIFO - bool occas = occasionale( ); - show( m, F_OCFPI, occas ); - show( m, F_OCCASEDIT, occas ); - // In forse per l'Occasionale, sicuri per il Normale - m.show( F_COFI, !occas ); - m.show( F_STATOPAIVA, !occas ); - m.show( F_PAIVA, !occas ); - set( m, F_RAGSOC, LF_CLIFO, "RAGSOC" ); - if( !onload ) - { - set( m, F_CODVAL, LF_CLIFO, "CODVAL" ); - set( m, F_CODLIN, LF_CLIFO, "CODLIN" ); - set( m, F_CODPAG, LF_CLIFO, "CODPAG" ); - // Questo nonb va qua, ma nella read - set( m, F_DATAINSC, m.get( F_DATADOC ) ); - set( m, F_CODABIA, LF_CLIFO, "CODABI" ); - set( m, F_CODCABA, LF_CLIFO, "CODCAB" ); - // Setta i campi che appartengono al file LF_CFVEN - set( m, F_CODABIP, LF_CFVEN, "CODABIPR" ); - set( m, F_CODCABP, LF_CFVEN, "CODCABPR" ); - set( m, F_RAGGR, LF_CFVEN, "RAGGDOC" ); - set( m, F_CODINDSP, LF_CFVEN, "CODINDSP" ); - set( m, F_CODAG, LF_CFVEN, "CODAG" ); - set( m, F_CODSPMEZZO, LF_CFVEN, "CODSPMEZZO" ); - set( m, F_CODPORTO, LF_CFVEN, "CODPORTO" ); - set( m, F_CODNOTESP1, LF_CFVEN, "CODNOTESP1" ); - set( m, F_CODNOTESP2, LF_CFVEN, "CODNOTESP2" ); - set( m, F_CODVETT1, LF_CFVEN, "CODVETT1" ); - set( m, F_CODVETT2, LF_CFVEN, "CODVETT2" ); - set( m, F_CODVETT3, LF_CFVEN, "CODVETT3" ); - set( m, F_SPESEINC, LF_CFVEN, "ADDSPINC" ); - set( m, F_ADDBRB, LF_CFVEN, "ADDBOLLIRB" ); - set( m, F_ADDBTR, LF_CFVEN, "ADDBOLLITR" ); - } - if ( occasionale ( ) ) - { - // set( m, F_COFI, "" ); - // set( m, F_PAIVA, "" ); - set( m, F_OCFPI, occas_mask( ).get( O_CODICE ) ); - set( m, F_RAGSOC, occas_mask( ).get( O_RAGSOC ) ); - set( m, F_INDCF, occas_mask( ).get( O_INDIRIZZO ) ); - set( m, F_CIVCF, occas_mask( ).get( O_NUMERO ) ); - set( m, F_CAPCF, occas_mask( ).get( O_CAP ) ); - set( m, F_COMCF, occas_mask( ).get( O_COMUNE ) ); - set( m, F_STATOCF, occas_mask( ).get( O_STATO ) ); - } - else - { - set( m, F_COFI, LF_CLIFO, "COMCF" ); - set( m, F_INDCF, LF_CLIFO, "INDCF" ); - set( m, F_CIVCF, LF_CLIFO, "CIVCF" ); - set( m, F_STATOPAIVA, LF_CLIFO, "STATOPAIV" ); - set( m, F_PAIVA, LF_CLIFO, "PAIV" ); - set( m, F_LOCALITACF, LF_CLIFO, "LOCALITACF" ); - set( m, F_CAPCF, LF_CLIFO, "CAPCF" ); - set( m, F_COMCF, LF_CLIFO, "COMCF" ); - set( m, F_STATOCF, LF_CLIFO, "STATOCF" ); - } -} - -void TCliFor::edita_occasionale( ) -{ - CHECK( occasionale( ), "Impossibile editare come occasionale un cliente non occasionale!" ); - _occas_mask.run( ); -}; - -bool TCliFor::occas_code_handler(TMask_field& f, KEY key) -{ - if (key == K_TAB) - { - const char* code = f.get(); - if (*code) - { - TRelation occas(LF_OCCAS); - occas.lfile().put("CFPI", code); - if (occas.read(_isequal) == NOERR) - { - f.mask().autoload(&occas); - f.mask().send_key(K_TAB, O_COMUNE); // Forza decodifica comuni - f.mask().send_key(K_TAB, O_COMUNENAS); - } - } - } - return TRUE; -} +#ifndef __TCLIFOR_H +#include "tclifor.h" +#endif + +#ifndef __VEUML1_H +#include "veuml1.h" +#endif + +#ifndef __VE1000O_H +#include "ve1000o.h" +#endif + +const TString& TData_picker::get( const TString& table, const TString& codtab, const TString& field ) +{ + if( table != _tablename ) + { + delete _table; + _table = new TTable( table ); + _tablename = table; + } + if( codtab != _table->curr( ).get( "CODTAB" ) ) + { + _table->zero( ); + _table->put( "CODTAB", codtab ); + _table->read( ); + } + return _table->get( field ); +}; + +void TData_picker::set( TMask& m, const int mskfield, const TString& value ) +{ + if( present( m, mskfield ) ) + { + m.set( mskfield, value, TRUE ); + m.field( mskfield ).check( ); + } +}; + +const TString& TData_picker::get( const int file, const TString& fieldname ) +{ + return lfile( file ).get( fieldname ); +} + +int TData_picker::get_int( const int file, const TString& fieldname ) +{ + return lfile( file ).get_int( fieldname ); +} + +long TData_picker::get_long( const int file, const TString& fieldname ) +{ + return lfile( file ).get_long( fieldname ); +} + +bool TData_picker::get_bool( const int file, const TString& fieldname ) +{ + return lfile( file ).get_bool( fieldname ); +} + +int TCliFor::write_occas( ) +{ + if( !occasionale( ) ) + return NOERR; + TRelation occas( LF_OCCAS ); + occas_mask( ).autosave( &occas ); + return occas.write( ); +} + +TCliFor::TCliFor( ) : TData_picker( LF_CLIFO ), _occas_mask( "ve1000o" ) +{ + _occas_mask.set_handler( O_CODICE, occas_code_handler ); + add( LF_CFVEN, "TIPOCF=TIPOCF|CODCF=CODCF" ); +} + +void TCliFor::load( const char tipocf, const long codcf, const TString& ocfpi ) +{ + _tipocf = tipocf; + _codcf = codcf; + zero( ); + curr( ).put( "TIPOCF", tipocf ); + curr( ).put( "CODCF", codcf ); + lfile( ).setkey( 1 ); + if( read( ) != NOERR ) + yesnofatal_box( "Il %s %d non è stato trovato!", tipocf == 'C'?"cliente":"fornitore", codcf ); + _occas = curr().get_bool( "OCCAS" ); + if ( occasionale( ) ) + { + TRelation occrel( LF_OCCAS ); + occrel.curr( ).zero( ); + occrel.curr( ).put( "CFPI", ocfpi ); + occrel.read( ); + occas_mask( ).autoload( &occrel ); + } +} + +void TCliForVendite::update_mask( TMask& m, bool onload ) +{ + // Setta i campi che appartengono al file LF_CLIFO + bool occas = occasionale( ); + show( m, F_OCFPI, occas ); + show( m, F_OCCASEDIT, occas ); + // In forse per l'Occasionale, sicuri per il Normale + m.show( F_COFI, !occas ); + m.show( F_STATOPAIVA, !occas ); + m.show( F_PAIVA, !occas ); + set( m, F_RAGSOC, LF_CLIFO, "RAGSOC" ); + if( !onload ) + { + set( m, F_CODVAL, LF_CLIFO, "CODVAL" ); + set( m, F_CODLIN, LF_CLIFO, "CODLIN" ); + set( m, F_CODPAG, LF_CLIFO, "CODPAG" ); + // Questo nonb va qua, ma nella read + set( m, F_DATAINSC, m.get( F_DATADOC ) ); + set( m, F_CODABIA, LF_CLIFO, "CODABI" ); + set( m, F_CODCABA, LF_CLIFO, "CODCAB" ); + // Setta i campi che appartengono al file LF_CFVEN + set( m, F_CODABIP, LF_CFVEN, "CODABIPR" ); + set( m, F_CODCABP, LF_CFVEN, "CODCABPR" ); + set( m, F_RAGGR, LF_CFVEN, "RAGGDOC" ); + set( m, F_CODINDSP, LF_CFVEN, "CODINDSP" ); + set( m, F_CODAG, LF_CFVEN, "CODAG" ); + set( m, F_CODSPMEZZO, LF_CFVEN, "CODSPMEZZO" ); + set( m, F_CODPORTO, LF_CFVEN, "CODPORTO" ); + set( m, F_CODNOTESP1, LF_CFVEN, "CODNOTESP1" ); + set( m, F_CODNOTESP2, LF_CFVEN, "CODNOTESP2" ); + set( m, F_CODVETT1, LF_CFVEN, "CODVETT1" ); + set( m, F_CODVETT2, LF_CFVEN, "CODVETT2" ); + set( m, F_CODVETT3, LF_CFVEN, "CODVETT3" ); + set( m, F_SPESEINC, LF_CFVEN, "ADDSPINC" ); + set( m, F_ADDBRB, LF_CFVEN, "ADDBOLLIRB" ); + set( m, F_ADDBTR, LF_CFVEN, "ADDBOLLITR" ); + } + if ( occasionale ( ) ) + { + // set( m, F_COFI, "" ); + // set( m, F_PAIVA, "" ); + set( m, F_OCFPI, occas_mask( ).get( O_CODICE ) ); + set( m, F_RAGSOC, occas_mask( ).get( O_RAGSOC ) ); + set( m, F_INDCF, occas_mask( ).get( O_INDIRIZZO ) ); + set( m, F_CIVCF, occas_mask( ).get( O_NUMERO ) ); + set( m, F_CAPCF, occas_mask( ).get( O_CAP ) ); + set( m, F_COMCF, occas_mask( ).get( O_COMUNE ) ); + set( m, F_STATOCF, occas_mask( ).get( O_STATO ) ); + } + else + { + set( m, F_COFI, LF_CLIFO, "COMCF" ); + set( m, F_INDCF, LF_CLIFO, "INDCF" ); + set( m, F_CIVCF, LF_CLIFO, "CIVCF" ); + set( m, F_STATOPAIVA, LF_CLIFO, "STATOPAIV" ); + set( m, F_PAIVA, LF_CLIFO, "PAIV" ); + set( m, F_LOCALITACF, LF_CLIFO, "LOCALITACF" ); + set( m, F_CAPCF, LF_CLIFO, "CAPCF" ); + set( m, F_COMCF, LF_CLIFO, "COMCF" ); + set( m, F_STATOCF, LF_CLIFO, "STATOCF" ); + } +} + +void TCliFor::edita_occasionale( ) +{ + CHECK( occasionale( ), "Impossibile editare come occasionale un cliente non occasionale!" ); + _occas_mask.run( ); +}; + +bool TCliFor::occas_code_handler(TMask_field& f, KEY key) +{ + if (key == K_TAB) + { + const char* code = f.get(); + if (*code) + { + TRelation occas(LF_OCCAS); + occas.lfile().put("CFPI", code); + if (occas.read(_isequal) == NOERR) + { + f.mask().autoload(&occas); + f.mask().send_key(K_TAB, O_COMUNE); // Forza decodifica comuni + f.mask().send_key(K_TAB, O_COMUNENAS); + } + } + } + return TRUE; +} diff --git a/ve/tclifor.h b/ve/tclifor.h index 1fb920cac..51919a0bb 100755 --- a/ve/tclifor.h +++ b/ve/tclifor.h @@ -1,70 +1,70 @@ -#ifndef __TCLIFOR_H -#define __TCLIFOR_H - -#ifndef __CHECKS_H -#include -#endif - -#ifndef __RELATION_H -#include -#endif - -#ifndef __TABUTIL_H -#include -#endif - - -#ifndef __MASK_H -#include -#endif - -class TData_picker : public TRelation -{ - private: - - TTable* _table; - TString16 _tablename; - - public: - TData_picker( const int mainfile ) : TRelation ( mainfile ) { } - const TString& get( const TString& table, const TString& codtab, const TString& field ); - const TString& get( const int file, const TString& fieldname ); - int get_int( const int file, const TString& fieldname ); - long get_long( const int file, const TString& fieldname ); - bool get_bool( const int file, const TString& fieldname ); - bool present( TMask& m, const int mskfield ){ return ( m.id2pos( mskfield ) >= 0 ); } - void set( TMask& m, const int mskfield, const int file, const TString& filefield ){ set( m, mskfield, get( file, filefield ) ); }; - void set( TMask& m, const int mskfield, const TString& value ); - void show( TMask& m, const int mskfield, const bool show = TRUE ){ if( present( m, mskfield ) ) m.show( mskfield, show ); }; - void hide( TMask& m, const int mskfield ){ show( m, mskfield, FALSE ); }; -}; - -class TCliFor : public TData_picker -{ - private: - - char _tipocf; - long _codcf; - bool _occas; - TMask _occas_mask; - - public: - - TCliFor( ); - void load( const char tipocf, const long codcf, const TString& ocfpi ); - bool occasionale( ){ return get_bool( LF_CLIFO, "OCCAS" ); }; - TMask& occas_mask( ){ return _occas_mask; }; - static bool occas_code_handler(TMask_field& f, KEY key); - int write_occas( ); - void edita_occasionale( ); - -}; - -class TCliForVendite : public TCliFor -{ - public: - - void update_mask( TMask& m, bool onload = FALSE ); -}; - -#endif +#ifndef __TCLIFOR_H +#define __TCLIFOR_H + +#ifndef __CHECKS_H +#include +#endif + +#ifndef __RELATION_H +#include +#endif + +#ifndef __TABUTIL_H +#include +#endif + + +#ifndef __MASK_H +#include +#endif + +class TData_picker : public TRelation +{ +private: + + TTable* _table; + TString16 _tablename; + +public: + TData_picker( const int mainfile ) : TRelation ( mainfile ) { } + const TString& get( const TString& table, const TString& codtab, const TString& field ); + const TString& get( const int file, const TString& fieldname ); + int get_int( const int file, const TString& fieldname ); + long get_long( const int file, const TString& fieldname ); + bool get_bool( const int file, const TString& fieldname ); + bool present( TMask& m, const int mskfield ){ return ( m.id2pos( mskfield ) >= 0 ); } + void set( TMask& m, const int mskfield, const int file, const TString& filefield ){ set( m, mskfield, get( file, filefield ) ); }; + void set( TMask& m, const int mskfield, const TString& value ); + void show( TMask& m, const int mskfield, const bool show = TRUE ){ if( present( m, mskfield ) ) m.show( mskfield, show ); }; + void hide( TMask& m, const int mskfield ){ show( m, mskfield, FALSE ); }; +}; + +class TCliFor : public TData_picker +{ +private: + + char _tipocf; + long _codcf; + bool _occas; + TMask _occas_mask; + +public: + + TCliFor( ); + void load( const char tipocf, const long codcf, const TString& ocfpi ); + bool occasionale( ){ return get_bool( LF_CLIFO, "OCCAS" ); }; +TMask& occas_mask( ){ return _occas_mask; }; + static bool occas_code_handler(TMask_field& f, KEY key); + int write_occas( ); + void edita_occasionale( ); + +}; + +class TCliForVendite : public TCliFor +{ +public: + + void update_mask( TMask& m, bool onload = FALSE ); +}; + +#endif diff --git a/ve/ve0100.cpp b/ve/ve0100.cpp index a855b835f..b7d7923f0 100755 --- a/ve/ve0100.cpp +++ b/ve/ve0100.cpp @@ -1,1172 +1,1172 @@ -#include - -#ifndef __CHECKS_H -#include -#endif - -#ifndef __TABUTIL_H -#include -#endif - -#ifndef __BRWAPP_H -#include -#endif - -#ifndef __RELAPP_H -#include -#endif - -#ifndef __CONFIG_H -#include -#endif - -#ifndef __LFFILES_H -#include -#endif - -#ifndef __DEFMASK_H -#include "defmask.h" -#endif - -#ifndef __VEUML_H -#include "veuml.h" -#endif - -#ifndef __VEUML1_H -#include "veuml1.h" -#endif - -#ifndef __SHEET_H -#include -#endif - -#ifndef __REAL_H -#include -#endif - -#ifndef __MSKSHEET_H -#include -#endif - -#ifndef __VE0100_H -#include "ve0100.h" -#endif - -#ifndef __VE0100C_H -#include "ve0100c.h" -#endif - -#ifndef __VE0100D_H -#include "ve0100d.h" -#endif - -#ifndef __TCLIFOR_H -#include "tclifor.h" -#endif - -#ifndef __VE1000O_H -#include "ve1000o.h" -#endif - -// Numero di colonne presenti sullo sheet totale -#define MAX_COLUMNS 22 - -#define F_LBTIPORIGA 175 -#define NPIEDI 40 - -typedef real array_piede[ NPIEDI ]; - -// Definizione della classe dell'applicazione motore -class TMotore_application : public TRelation_application -{ - // Array di totalizzatori - array_piede _piedi; - array_piede _piedi_temp; - - // Record array per la gestione delle righe - TRecord_array* _righe_rec; - - // Puntatore al profilo del documento caricato - TConfig* _pro; - - // Puntatore al nome, per evitare di ricrearlo se è uguale - TFilename* _proname; - - // Puntatore alla maschera di ricerca - TMask* _msk; - - // Puntatore alla maschera di modifica/inserimento ( dipende dal profilo ) - TMask* _msk1; - - // puntatore alla relazione - TRelation* _rel; - - // Puntatore allo sheet delle righe documento - TSheet_field* _sheet; - - // Oggetto cliente per il motore - TCliForVendite* _clifor; - - // Indica se il documento ha come soggetto un liente o un ornitore - char _tipocf; - - // Ridefinizione dei metodi virtuali - virtual bool user_create( ); - virtual bool user_destroy( ); - virtual TMask* get_mask(int mode); - virtual bool changing_mask(int mode); - virtual TRelation* get_relation( ) const { return _rel;} - - virtual int read( TMask& m ); - virtual bool remove( void ); - virtual int write(const TMask& m); - virtual int rewrite(const TMask& m); - - // Punti di ingresso per le funzioni utente - - // Funzioni da associare ad ogni procedura - int user_function( int index ); - - // Funzioni per il calcolo delle righe - real user_row_calculate( TRectype& row, int index ); - - void user_set_handler( int fieldid, int index, TMask* m = NULL ); - - long prossimo_numero( bool provv ); - int avanza_numero( bool provv ); - void get_edit_mask( void ); - void azzera_piedi( bool temp = FALSE ); - void carica_piedi( ); - void somma_piedi( ); - void sottrai_piedi( ); - - // Esegue, se c'è, la procedura utente relativa ad una certa operazione - int esegui_procedura( int operazione ); - -protected: - - // Procedure e funzioni per la gestione della maschera e dei files - void read_rdoc(TMask& m); - - // formato dipendente dallo sheet (sono le varie colonne) - void load_riga( TSheet_field& f, int numrig, TRectype& r ); - void store_riga( TSheet_field& f, int numrig, TRectype& r ); - - void save(TRelation* r) const; - void set_descr (int numrig, const char* descr); - void carica_righe_libere(int from = -1); - bool check_key( TLocalisamfile& rdoc, TString16 codnum, bool provv, TString16 _anno, TString16 _ndoc ); - - // Procedure e funzioni per la gestione degli stati - void setta_stato_corrente( int nuovostato ); - const char* nome_sezione( int op ); - int stato_corrente( ); - int stato_finale( int operazione ); - bool stato_valido( int stato, int operazione ); - void segnala_stato_non_valido( int operazione ); - TString& stati_validi( int operazione ){ return ( pro( ).get( "STATIVALIDI", nome_sezione( operazione ) ) );}; - - void calcola_riga( TRectype& rdoc, bool temp = FALSE ); - - // Handle che ritorna la maschera per le righe - static TMask * ss_getmask( int numriga, TMask& fullmask, bool destroy ); - - // Handler che gestisce la richiesta del tipo riga in inserimento - static bool ss_handler( TSheet_field& ss, int r, KEY key ); - - // Handler per la maschera di ricerca - static bool ndoc_handler(TMask_field& f, KEY key); - static bool num_handler(TMask_field& f, KEY key); - static bool tip_handler(TMask_field& f, KEY key); - - // Handler per la maschera di modifica - static bool clifo_handler(TMask_field& f, KEY key); - static bool occas_handler(TMask_field& f, KEY key); - - // Configurazione dello sheet dato il profilo - void configura_sheet( TSheet_field& sheet, TConfig& config ); - -public: - - // Funzioni di accesso alle variabili privste - - TRecord_array& righe_rec( ) { CHECK( _righe_rec, "Record array delle righe nullo!" ); return * _righe_rec; }; - TConfig& pro( ) { CHECK( _pro, "Profilo del documento nullo!" ); return *_pro; }; - TFilename& proname( ) { CHECK( _proname, "Nome del profilo nullo!" ); return *_proname; }; - TMask& query_mask( ) { CHECK( _msk, "Maschera di ricerca nulla!" ); return *_msk; }; - TMask& edit_mask( ) { CHECK( _msk1, "Maschera di modifica nulla!" ); return *_msk1; }; - TRelation& rel( ) { CHECK( _rel, "Relazione nulla!" ); return *_rel; }; - TSheet_field& sheet( ) { CHECK( _sheet, "Sheet nullo!" ); return *_sheet; }; - TCliForVendite& clifo( ) { CHECK( _clifor, "Oggetto cliente nullo!" ); return *_clifor; }; - - // Operazione - - const char tipocf( ){ return _tipocf; } - void tipocf( const char tcf ){ _tipocf = tcf; } - bool valida_operazione( int operazione ); - - TSheet_field& ss( ) const { return *_sheet; } - TMotore_application( ) { _pro = NULL; } - virtual ~TMotore_application( ) { if ( _pro ) delete _pro; } - virtual const char* get_next_key( ); - -}; - -HIDDEN TMotore_application& app( ) { return (TMotore_application&) main_app( ); } - -int TMotore_application::user_function( int index ) -{ - switch( index ) - { - case 1: - break; - default: - yesnofatal_box( "Chiamata ad una procedura utente non definita: %d", index ); - return FALSE; - break; - }; - return NOERR; -}; - -// Funzione che dato il profilo di riga ottiene la maschera -// Serve per ottenere una maschera diversa per ogni riga -// Da migliorare, mettendo una cache - -TMask *TMotore_application::ss_getmask( int numriga, TMask& fullmask, bool destroy ) -{ - static TMask* m; - - if ( destroy ) - { - delete m; - return( NULL ); - } - else - { - TFilename nome_proriga( fullmask.get( 103 ) ); - nome_proriga.ext( "ini" ); - TConfig proriga( nome_proriga ); - m = new TMask( proriga.get( "MSK", "MAIN" ) ); - int numhandler = proriga.get_int( "NHANDLER", "HANDLERS" ); - for( int i = 1; i <= numhandler; i ++ ) - { - TString chiave; - chiave.format( "%d", i ); - TToken_string riga = proriga.get( chiave, "HANDLERS" ); - app().user_set_handler( riga.get_int( 0 ), riga.get_int( 1 ), m ); - }; - return( m ); - } -} - -real TMotore_application::user_row_calculate( TRectype& r, int index ) -{ - switch( index ) - { - case 100 : - return ( f100( r ) ); - break; - case 200 : - return ( f200( r ) ); - break; - case 300 : - return ( f300( r ) ); - break; - case 400 : - return ( f400( r ) ); - break; - case 500 : - return ( f500( r ) ); - break; - case 600 : - return ( f600( r ) ); - break; - default: - CHECK( FALSE, "Tentativo di chiamare una funzione di calcolo riga inesistente!" ); - return 0.0; - } -}; - -void TMotore_application::user_set_handler( int fieldid, int index, TMask* m ) -{ - if( !m ) - m = &edit_mask( ); - switch( index ) - { - case 1: - m->set_handler( fieldid, ora_hndl ); - break; - case 2: - m->set_handler( fieldid, codcli_hndl ); - break; - case 3: - m->set_handler( fieldid, dummy_hndl ); - break; - default: - CHECK( FALSE, "Tentativo di installare un handler non definito" ); - break; - } -}; - -bool TMotore_application::ss_handler( TSheet_field& ss, int r, KEY key ) -{ - if ( key == K_SPACE ) // Inizio modifica - { - app().azzera_piedi( TRUE ); - TRelation rdoc( LF_RIGHEDOC ); - ss.sheet_mask( ).autosave( &rdoc ); - // Mi calcolo nei piedi temporanei la riga - app().calcola_riga( rdoc.curr( ), TRUE ); - } - if ( key == K_INS ) // Inserimento - { - TMask& m = *app( )._msk1; - TTable tabtr( "%TRI" ); - tabtr.zero( ); - tabtr.put( "CODTAB", m.get( F_LBTIPORIGA ) ); - tabtr.read( ); - TToken_string& riga = ss.row( r ); - riga.add( 1, 0 ); - riga.add( m.get( F_LBTIPORIGA ), 1 ); - riga.add( tabtr.get( "S4" ), 2 ); - return TRUE; - } - if ( key == K_CTRL + K_INS ) // Dopo inserimento - { - TMask& m = *app( )._msk1; - TTable tabtr( "%TRI" ); - tabtr.zero( ); - tabtr.put( "CODTAB", m.get( F_LBTIPORIGA ) ); - tabtr.read( ); - TToken_string& riga = ss.row( r ); - TFilename nome_proriga( tabtr.get( "S4" ) ); - nome_proriga.ext( "ini" ); - TConfig pro( nome_proriga ); - int ncols = pro.get_int( "NCOLS", "COLUMNS" ); - // Disabilita tutte le colonne - for( int i = 1; i <= MAX_COLUMNS; i ++ ) - ss.disable_cell ( ss.items( ) - 1, i ); - // Abilita le colonne indicate nel profilo della riga - for( i = 1; i <= ncols; i ++ ) - { - TString16 chiave; - chiave.format( "%d", i ); - int coltoenable = pro.get_int( chiave, "COLUMNS" ); - ss.enable_cell ( ss.items( ) - 1, coltoenable - 1 ); - }; - ss.force_update( ); - app( ).curr_mask( ).send_key( K_ROWEDIT, F_SHEET ); - return TRUE; - } - if ( key == K_DEL ) // Cancellazione - { - // Sottraggo la riga appena cancellata ai totalizzatori - app().sottrai_piedi( ); - app().carica_piedi( ); - } - if ( key == K_ENTER ) // Modifica - { - app().sottrai_piedi( ); - TRelation rdoc( LF_RIGHEDOC ); - ss.sheet_mask( ).autosave( &rdoc ); - // Sommo la riga ai totalizzatori - app().calcola_riga( rdoc.curr( ) ); - app().sottrai_piedi( ); - } - return TRUE; -}; - -bool TMotore_application::num_handler( TMask_field& f, KEY key ) -{ - // Ottengo la maschera - TMask& m = f.mask( ); - - if (key == K_TAB && m.is_running( ) ) - { - // Se la numerazione non è specificata, - const TString16 value( m.get( F_CODNUM ) ); - if ( value.blank( ) ) - { - // Pulisce la descrizione - m.set(F_DESNUM, "" ); - // Pulisce i tipi di documento consentiti - m.set(F_TIPIDOCS, "" ); - // Pulisce il tipo di documento - m.set(F_TIPODOC, "" ); - return TRUE; - } - // Apro la tabella numerazioni - TTable tabnum( "NUM" ); - tabnum.zero( ); - tabnum.put( "CODTAB", value ); - if( tabnum.read( ) == NOERR ) - { - // Copio la descrizione della numerazione - m.set(F_DESNUM, tabnum.get("S0") ); - // Copio i tipi di documento validi per la numerazione - const TString tipidocs( tabnum.get("S2") ); - m.set(F_TIPIDOCS, tipidocs ); - // Propone il primo tipo di documento come default - m.set(F_TIPODOC, tipidocs.left( 4 ) ); - // m.field( F_TIPODOC ).check( ); - m.send_key( K_TAB, F_TIPODOC ); - - // Se per questa numerazione è abilitata le numerazione provvisoria - if ( tabnum.get_bool ( "B0" ) ) - { - // Setta di default la numerazione provvisoria - m.set( F_PROVV, "P" ); - // Abilita il campo per la selezione della numerazione - m.enable( F_PROVV ); - } - else // Altrimenti ... - { - // Setta la numerazione a definitiva - m.set( F_PROVV, "D" ); - // Disabilita il campo per la selezione della numerazione - m.disable( F_PROVV ); - }; - return TRUE; - } - message_box( "Numerazione non valida!" ); - return FALSE; - } - if (key == K_ENTER && m.is_running( ) ) - { // Se la numerazione non è specificata, - const TString16 value( m.get( F_CODNUM ) ); - if ( value.blank( ) ) - { - message_box( "Occorre una numerazione per inserire un documento!" ); - m.first_focus( F_NDOC ); - return FALSE; - } - } - return TRUE; -} - -bool TMotore_application::occas_handler(TMask_field& f, KEY key) -{ - if (key == K_SPACE && f.mask( ).is_running( ) ) - { - TMask& om = app( ).clifo( ). occas_mask( ); - om.run( ); - f.set_focus( ); - } - return TRUE; -} - - -bool TMotore_application::tip_handler(TMask_field& f, KEY key) -{ - TMask& m = f.mask( ); - if (key == K_TAB && m.is_running( ) ) - { - const TString16 value( m.get( F_TIPODOC ) ); - if ( value.blank( ) ) - { - // Pulisce il profilo - m.set(F_PROFILO, "" ); - return TRUE; - } - TString tipi_consentiti( m.get( F_TIPIDOCS ) ); - TString16 tipo( f.get( ) ); - tipo.trim( ); - bool tipo_valido = FALSE; - for ( int i = 0; i < 10; i ++ ) - { - TString16 curtipo( tipi_consentiti.mid( i * 4, 4 ) ); - curtipo.trim( ); - if( curtipo == tipo ) - { - tipo_valido = TRUE; - break; - } - } - if( ! tipo_valido ) - { - message_box( "Tipo non valido per la numerazione selezionata!" ); - f.set( "" ); - return FALSE; - } - TTable tabtip( "%TIP" ); - tabtip.read( ); - m.set(F_DESTIPODOC, tabtip.get("S0") ); - m.set(F_PROFILO, tabtip.get("S4") ); - } - if (key == K_ENTER && m.is_running( ) ) - { TString tipo( f.get( ) ); - if ( ! tipo.blank( ) ) - { TTable tabtip( "%TIP" ); - tabtip.read( ); - m.set(F_PROFILO, tabtip.get("S4") ); - } - else - { message_box( "Occorre un tipo documento per inserire un documento!" ); - m.first_focus( F_TIPODOC ); - return FALSE; - } - } - return TRUE; -} - -bool TMotore_application::ndoc_handler(TMask_field& f, KEY key) -{ - TMask& m = f.mask( ); - if (key == K_TAB && m.is_running( ) ) - { TLocalisamfile& doc = app( ).rel( ).lfile( ); - doc.zero( ); - doc.put("CODNUM", m.get( F_CODNUM ) ); - doc.put("PROVV", m.get( F_PROVV ) ); - doc.put("ANNO", m.get( F_ANNO ) ); - doc.put("NDOC", f.get( ) ); - if ( doc.read( ) == NOERR ) - { m.set(F_TIPODOC, doc.get( "TIPODOC" ) ); - m.set(F_STATO, doc.get( "STATO" ) ); - TTable tabtip( "%TIP" ); - tabtip.put( "CODTAB", doc.get( "TIPODOC" ) ); - tabtip.read( ); - m.set(F_PROFILO, tabtip.get("S4") ); - m.stop_run( K_AUTO_ENTER ); - } - } - return TRUE; -} - -bool TMotore_application::clifo_handler(TMask_field& f, KEY key) -{ - if (key == K_TAB && f.active()) - { - TMask& m = f.mask(); - - const char cf = app().tipocf(); - TLocalisamfile& clifo = ((TEdit_field&)f).browse()->cursor()->file(); - - if (clifo.get_char("TIPOCF") != cf || clifo.get("CODCF") != f.get()) - { - clifo.setkey(1); - clifo.put("TIPOCF", cf); - clifo.put("CODCF", f.get()); - clifo.read(); - CHECK(clifo.good(), "Impossibile ritrovare il clifo" ); - } - CHECKD(f.is_edit(), "Can't check suspension of a non edit-field ", f.dlg()); - const TEdit_field& c = (const TEdit_field&)f; - const TBrowse* b = c.browse(); - CHECKD(b, "Can't check suspension of a edit-field without a USE ", f.dlg()); - const TLocalisamfile& i = b->cursor()->file(); - // Tabella File - const char* sf = i.tab() ? "B2" : "SOSPESO"; - const bool suspended = i.get_bool(sf); - if (suspended) - { - sf = f.get(); - return f.error_box("Il codice '%s' e' sospeso e non puo' essere utilizzato", sf); - } - /* - if (!m.is_running() || f.dirty()) - { - // Equichecazzociva? - - } - */ - // Disabilitazioni varie, ma le demando all'oggetto cliente - if (f.focusdirty()) - { - app().clifo( ).load( cf, atol( f.get( ) ), "" ); - app().clifo( ).update_mask( m ); - if ( app( ).clifo( ).occasionale( ) && app( ).clifo( ).occas_mask( ).get(O_CODICE).empty( ) ) - m.send_key(K_SPACE, F_OCCASEDIT); // Lancia maschera occasionali - } - } - return TRUE; -} - -void TMotore_application::azzera_piedi( bool temp ) -{ - for ( int i = 0; i < NPIEDI; i++ ) - if ( temp ) - _piedi_temp[ i ] = 0.0; - else - _piedi[ i ] = 0.0; -} - -void TMotore_application::carica_piedi( ) -{ - TToken_string s( pro( ).get( "PROGPIEDE", "MAIN" ) ); - int i = s.get_int( ); - int j = 0; - while( i != 0 ) - { - real strpiede( _piedi[ i ] ); - edit_mask( ).set( BASE_PIEDE + ( ++j ), strpiede.stringa( 15 ) ); - i = s.get_int( ); - } -} - -void TMotore_application::somma_piedi( ) -{ - for ( int i = 0; i < NPIEDI; i++ ) - _piedi[ i ] += _piedi_temp[ i ]; -} - -void TMotore_application::sottrai_piedi( ) -{ - for ( int i = 0; i < NPIEDI; i++ ) - _piedi[ i ] -= _piedi_temp[ i ]; -} - -bool TMotore_application::changing_mask(int mode) -{ - static int lastmode = NO_MODE; - - const bool change = ( mode != lastmode ); - lastmode = mode; - return change; - -} - -void TMotore_application::configura_sheet( TSheet_field& sheet, TConfig& config ) -{ - int ncols = config.get_int( "NCOLS", "SHEET" ); - for( int i = 1; i <= ncols; i ++ ) - { - TString col; - col.format( "%d", i ); - TToken_string sheet_col( config.get( col, "SHEET" ) ); - const TString descr( sheet_col.get( 1 ) ); - if ( ! descr.blank( ) ) - sheet.set_column_header( i, descr ); - TString size( sheet_col.get( 2 ) ); - if ( ! size.blank( ) ) - sheet.set_column_width( i, sheet_col.get_int( 2 ) ); - int coltomove = sheet_col.get_int( 0 ) - 1; - sheet.move_column( coltomove, i ); - }; - for ( int j = MAX_COLUMNS; j >= i - 1; j -- ) - sheet.delete_column( j ); -}; - -void TMotore_application::get_edit_mask( void ) -{ - TFilename fn; - - fn = query_mask( ).get( F_PROFILO ); - // query_mask( ).enable(DLG_NEWREC); - fn.ext( "ini" ); - fn.upper( ); - if ( _pro ) - { - if( (*_proname) == fn ) - return; - delete _pro; - }; - _pro = new TConfig( fn ); - _proname = new TFilename( fn ); - _proname->upper( ); - if ( _msk1 ) delete _msk1; - _msk1 = new TMask( pro( ).get( "MSKFILE", "MAIN" ) ); - // edit_mask( ).set( F_PROFILO, query_mask( ).get( F_PROFILO ) ); - edit_mask( ).set( F_DESNUM, query_mask( ).get( F_DESNUM ) ); - _sheet = &(TSheet_field &)edit_mask( ).field(F_SHEET); - sheet( ).set_notify( ss_handler ); - TString tipocf( app( ).pro( ).get( "TIPOCF", "MAIN" ) ); - app( ).tipocf( tipocf[ 0 ] ); - configura_sheet( *_sheet, *_pro ); - TList_field& listbox = ( TList_field& ) _msk1->field( F_LBTIPORIGA ); - const int numtr = app( ).pro( ).get_int( "NTIPIRIGA", "RIGHE" ); - TTable tabtr( "%TRI" ); - TToken_string keys( "" ), descrs( "" ); - for ( int i = 1; i <= numtr; i ++ ) - { - TString chiave; - TToken_string item; - chiave.format( "%d", i ); - tabtr.zero( ); - TString tiporiga( app( ).pro( ).get( chiave, "RIGHE" ) ); - tabtr.put( "CODTAB", tiporiga ); - if ( tabtr.read( ) == NOERR ) - { - keys.add( tabtr.get( "CODTAB" ) ); - descrs.add( tabtr.get( "S0" ) ); - } - else - { - yesnofatal_box( "Inserito un tipo di riga non valido (%s)", (const char *)tiporiga ); - } - } - listbox.replace_items( keys, descrs ); - sheet( ).set_getmask( ss_getmask ); - int numhandler = pro( ).get_int( "NHANDLER", "HANDLERS" ); - for( i = 1; i <= numhandler; i ++ ) - { - TString chiave; - chiave.format( "%d", i ); - TToken_string riga = pro( ).get( chiave, "HANDLERS" ); - user_set_handler( riga.get_int( 0 ), riga.get_int( 1 ) ); - }; -} - -TMask* TMotore_application::get_mask( int mode ) -{ - switch ( mode ) - { - case MODE_INS: - case MODE_MOD: - get_edit_mask( ); - edit_mask( ).enable( DLG_PRINT, ( mode == MODE_MOD ) ); - edit_mask( ).set_handler( F_OCCASEDIT, occas_handler ); - edit_mask( ).set_handler( F_CODCF, clifo_handler ); - return ( _msk1 ); - break; - default: - return _msk; - break; - }; -} - -void TMotore_application::set_descr(int i, const char * dfi) -{ - TToken_string& r = ss( ).row(i); - r.add(dfi, 0); -} - -void TMotore_application::carica_righe_libere(int from) -{ - if (from < 0) from = ss( ).items( ); - for (int i = from; i < 20; i++) - set_descr( i, "" ); - ss( ).force_update( ); -} - -const char* TMotore_application::get_next_key( ) -{ - TToken_string key; - TMask& m = curr_mask( ); - - TString value = m.get( F_CODNUM ); - if ( value.blank( ) ) - return NULL; - TTable tabnum( "NUM" ); - tabnum.zero( ); - tabnum.put( "CODTAB", value ); - if( tabnum.read( ) == NOERR ) - { - // Se per questa numerazione è abilitata le numerazione automatica - if( tabnum.get_bool ( "B1" ) ) - { - TLocalisamfile doc( LF_DOC ); - doc.zero( ); - doc.put( "CODNUM", value ); - doc.put( "ANNO", m.get( F_ANNO ) ); - doc.put( "NDOC", 9999999L ); - // Se per questa numerazione è abilitata le numerazione provvisoria - if( tabnum.get_bool ( "B0" ) ) - { - doc.put( "PROVV", "P" ); - } - else // Altrimenti ... - { - doc.put( "PROVV", "D" ); - }; - if( doc.read( _isgteq ) == NOERR ) - { - doc.prev( ); - } - long num = ( value == doc.get( "CODNUM" ) ) ? doc.get_long( "NDOC" ) : 0; - key.format( "%d|%d", F_NDOC, num + 1 ); - return key; - } - }; - return NULL; -} - -int TMotore_application::read(TMask& m) -{ - azzera_piedi( ); - m.reset( ); - clifo( ).occas_mask( ).reset( ); - int err = TRelation_application::read( m ); - if ( err == NOERR ) - { - TString16 tipocf( m.get( F_TIPOCF ) ); - clifo( ).load( tipocf[ 0 ], m.get_int( F_CODCF ), rel( ).curr( ).get( "OCFPI" ) ); - clifo( ).update_mask( m, TRUE ); - TLocalisamfile& rdoc = rel( ).lfile(LF_RIGHEDOC); - TRectype r = rdoc.curr( ); - r.zero( ); - r.put( "CODNUM", m.get( F_CODNUM ) ); - r.put( "PROVV", m.get( F_PROVV ) ); - r.put( "ANNO", m.get( F_ANNO ) ); - r.put( "NDOC", m.get_long( F_NDOC ) ); - _righe_rec->read( r ); - TSheet_field& f = (TSheet_field&) m.field( F_SHEET ); - f.destroy( ); - int last = _righe_rec->last_row( ); - for( int i = 1; i <= last; i ++ ) - { - TRectype &rec = _righe_rec->row( i, TRUE ); - load_riga( f, i - 1, rec ); - calcola_riga( rec ); - }; - carica_piedi( ); - } - return err; -} - -bool TMotore_application::check_key( TLocalisamfile& rdoc, TString16 codnum, bool provv, TString16 anno, TString16 ndoc ) -{ - return ( ( rdoc.get("CODNUM") == codnum ) && - ( rdoc.get("NDOC") == ndoc ) && - ( rdoc.get("ANNO" ) == anno ) && - ( rdoc.get_bool( "PROVV" ) == provv ) ); -} - -int TMotore_application::write(const TMask& m) -{ - int err; - if ( esegui_procedura( OP_NUOVO ) != NOERR ) - return FALSE; - err = NOERR; // avanza_numero( m.get_bool( F_PROVV ) ); - if ( err == NOERR ) - { - err = app( ).clifo( ).write_occas( ); - } - - if ( err == NOERR ) - { - err = TRelation_application::write( m ); - if ( err == NOERR ) - { - TSheet_field& f = ss( ); - _righe_rec->destroy_rows( ); - if ( m.insert_mode( ) ) - _righe_rec->renum_key( "NRIGA", 1 ); - for ( int i = 0; i < f.items( ); i ++ ) - { - TToken_string& t = f.row( i ); - TRectype& rec = _righe_rec->row(i + 1, TRUE); - store_riga( f, i, rec ); - } - err = _righe_rec->write( ); - } - } - return err; -}; - -int TMotore_application::rewrite(const TMask& m) -{ - if ( ! valida_operazione( OP_MODIFICA ) ) - return FALSE; - int err = TRelation_application::rewrite( m ); - if ( err == NOERR ) - { - TSheet_field& f = ss( ); - _righe_rec->destroy_rows( ); - if ( m.insert_mode( ) ) - _righe_rec->renum_key( "NRIGA", 1 ); - for ( int i = 0; i < f.items( ); i ++ ) - { - TToken_string& t = f.row( i ); - TRectype& rec = _righe_rec->row(i + 1, TRUE); - store_riga( f, i, rec ); - } - err = _righe_rec->rewrite( ); - } - return err; -}; - - -// La funzione si trova in ve0100b - -long TMotore_application::prossimo_numero( bool provv ) -{ - long ret; - TTable tabnum( "NUM" ); - - tabnum.read( ); - if ( provv ) - ret = tabnum.get_long( "I0" ) + 1; - else - ret = tabnum.get_long( "I1" ) + 1; - return ( ret ); -}; - -int TMotore_application::avanza_numero( bool provv ) -{ - TTable tabnum( "NUM" ); - - int err = tabnum.read( ); - if ( err == NOERR ) - { - if ( provv ) - tabnum.put( "I0", tabnum.get_long( "I0" ) + 1 ); - else - tabnum.put( "I1", tabnum.get_long( "I1" ) + 1 ); - err = tabnum.rewrite( ); - } - return err; -}; - -bool TMotore_application::remove( void ) -{ - if ( ! valida_operazione( OP_CANCELLA ) ) - return FALSE; - return TRelation_application::remove && ( _righe_rec->remove( ) == NOERR ); -} - -void TMotore_application::load_riga( TSheet_field& f, int numrig, TRectype& r ) -{ - TToken_string& riga = f.row(numrig); - riga = r.get( "STATORIGA" ); - riga.add( r.get( "TIPORIGA" ) ); - TFilename proname( r.get( "PROFRIGA" ) ); - riga.add( proname ); - riga.add( r.get( "CODMAG" ) ); - riga.add( r.get( "CODART" ) ); - riga.add( r.get( "DESCR" ) ); - riga.add( r.get( "DESCLUNGA" ) ); - riga.add( r.get( "PREZZO" ) ); - riga.add( r.get( "UMQTA" ) ); - riga.add( r.get_real( "QTA" ).string(11) ); - riga.add( r.get( "QTAEVASA" ) ); - riga.add( r.get( "RIGAEVASA" ) ); - riga.add( r.get( "TARA" ) ); - riga.add( r.get( "PNETTO" ) ); - riga.add( r.get( "NCOLLI" ) ); - riga.add( r.get( "DAEVADERE" ) ); - riga.add( r.get( "SCONTO" ) ); - riga.add( r.get( "PERCPROV" ) ); - riga.add( r.get( "IMPFISSO" ) ); - riga.add( r.get( "IMPFISUN" ) ); - riga.add( r.get( "CODIVA" ) ); - riga.add( r.get( "ADDIVA" ) ); - riga.add( r.get( "ASPBENI" ) ); - proname.ext( "ini" ); - TConfig pro( proname ); - int ncols = pro.get_int( "NCOLS", "COLUMNS" ); - // Disabilita tutte le colonne - for( int i = 1; i <= MAX_COLUMNS; i ++ ) - f.disable_cell ( f.items( ) - 1, i ); - // Abilita le colonne indicate nel profilo della riga - for( i = 1; i <= ncols; i ++ ) - { - TString16 chiave; - chiave.format( "%d", i ); - int coltoenable = pro.get_int( chiave, "COLUMNS" ); - f.enable_cell ( numrig - 1, coltoenable - 1 ); - } -} - -void TMotore_application::store_riga( TSheet_field& f, int numrig, TRectype& r ) -{ - TToken_string& riga = f.row(numrig); - - r.put( "CODNUM", edit_mask( ).get( F_CODNUM ) ); - r.put( "ANNO", edit_mask( ).get( F_ANNO ) ); - r.put( "PROVV", edit_mask( ).get( F_PROVV ) ); - r.put( "NDOC", edit_mask( ).get_long( F_NDOC ) ); - r.put( "STATORIGA", riga.get( 0 ) ); - r.put( "TIPORIGA", riga.get( 1 ) ); - r.put( "PROFRIGA", riga.get( 2 ) ); - r.put( "CODMAG", riga.get( 3 ) ); - r.put( "CODART", riga.get( 4 ) ); - r.put( "DESCR", riga.get( 5 ) ); - r.put( "DESCLUNGA", riga.get( 6 ) ); - r.put( "PREZZO", riga.get( 7 ) ); - r.put( "UMQTA", riga.get( 8 ) ); - r.put( "QTA", riga.get( 9 ) ); - r.put( "QTAEVASA", riga.get( 10 ) ); - r.put( "RIGAEVASA", riga.get( 11 ) ); - r.put( "TARA", riga.get( 12 ) ); -} - - -void TMotore_application::calcola_riga( TRectype& r, bool temp ) -{ - TFilename proriganame( r.get("PROFRIGA") ); - proriganame.ext( "INI" ); - TConfig proriga( proriganame ); - TToken_string s(proriga.get("PROGPIEDE", "MAIN")); - int func = s.get_int( ); - while( func ) - { - if ( temp ) - _piedi_temp[ s.get_int( ) ] += user_row_calculate( r, func ); - else - _piedi[ s.get_int( ) ] += user_row_calculate( r, func ); - func = s.get_int( ); - } -} - - -bool TMotore_application::user_create( ) -{ - _clifor = new TCliForVendite( ); - azzera_piedi( ); - _msk = new TMask("VE1000A"); - query_mask( ).set_handler( F_NDOC, ndoc_handler ); - query_mask( ).set_handler( F_CODNUM, num_handler ); - query_mask( ).set_handler( F_TIPODOC, tip_handler ); - // La maschera di inserimento/modifica per ora non la so! - // Viene letta dal profilo non appena trovato il record - _msk1 = NULL; - - // Metto in relazione testata e righe - _rel = new TRelation(LF_DOC); - rel( ).add( LF_RIGHEDOC,"CODNUM=CODNUM|ANNO=ANNO|PROVV=PROVV|NDOC=NDOC" ); - - // Inizializzo il Record_array - _righe_rec = new TRecord_array( LF_RIGHEDOC, "NRIGA", 1 ); - - return TRUE; -} - -bool TMotore_application::user_destroy( ) -{ - // Se è ancora allocata, distruggo la maschera di modifica - if ( _msk1 ) delete _msk1; - - // Distruggo la maschera di modifica - delete _msk; - - // Distruggo la relazione - delete _rel; - - // Distruggo il Record_array - delete _righe_rec; - - return TRUE; -} - -int TMotore_application::esegui_procedura( int operazione ) -{ - // Accesso unico alla chiamata di procedure tramite operazione - int index = ( int )pro( ).get_long( nome_sezione( operazione ), "MAIN" ); - if ( index ) - return ( user_function( index ) ); - return ( NOERR ); -} - - -bool TMotore_application::valida_operazione( int operazione ) -{ - if ( operazione != OP_NUOVO ) - { - if ( !stato_valido( stato_corrente( ), operazione ) ) - { - segnala_stato_non_valido( operazione ); - return FALSE; - } - }; - if ( esegui_procedura( operazione ) == NOERR ) - return FALSE; - return TRUE; -} - -const char * TMotore_application::nome_sezione( int op ) -{ - switch( op ) - { - case OP_NUOVO: - return "INSERIMENTO"; - break; - case OP_MODIFICA: - return "MODIFICA"; - break; - case OP_CANCELLA: - return "CANCELLAZIONE"; - break; - case OP_STAMPA: - return "STAMPA"; - break; - case OP_RAGGRUPPA: - return "RAGGRUPPA"; - break; - case OP_USER: - return "SPECIALE"; - break; - default: - CHECK( FALSE, "tentativo di ottenere il nome di una operazione inesistente!" ); - // Per evitare la warning - return ""; - break; - } -} - -int TMotore_application::stato_finale( int operazione ) -{ - TString s( pro( ).get( "STATOFINALE", nome_sezione( operazione ) ) ); - if( strcmp( s, "N" ) == 0 ) return NO_CHANGE_STATUS; - return ( atoi( s ) ); -}; - -bool TMotore_application::stato_valido( int stato, int operazione ) -{ -#ifdef _DEBUG - warning_box( "Controllo stati validi!\nStato corrente %d.\nStati validi %s.", stato_corrente( ), ( const char * )stati_validi( operazione ) ); -#endif - char p[2] = "0"; - TToken_string ret ( stati_validi( operazione ), ',' ); - p[0] += (char)stato; - return ( ret.get_pos( p ) != -1 ); -}; - -void TMotore_application::setta_stato_corrente( int nuovostato ) -{ - // warning_box( "Settaggio stati validi!\nStato corrente %s.\nStati validi %s.\nStato finale %s.", stato_corrente( ), stati_validi( operazione ), stato_finale( operazione ) ); - TString p; - p.format( "%d", nuovostato ); - - TLocalisamfile& doc = rel( ).lfile(LF_DOC); - - p[0] += (char)nuovostato; - doc.put("STATO", p); - doc.rewrite( ); - query_mask( ).set( F_STATO, p ); - // warning_box( "Settaggio stati validi!\nStato corrente %s.\nStati validi %s.\nStato finale %s.", stato_corrente( ), stati_validi( operazione ), stato_finale( operazione ) ); -} - -int TMotore_application::stato_corrente( ) -{ - int i = query_mask( ).get_int( F_STATO ); - return ( i == 0 ? NO_DOC_STATUS : i ); -}; - -void TMotore_application::segnala_stato_non_valido( int operazione ) -{ - TString messaggio; - switch( operazione ) - { - case OP_NUOVO: - // Sempre valido - break; - case OP_MODIFICA: - messaggio = "Il documento non si trova in uno stato valido per poter essere modificato!"; - break; - case OP_CANCELLA: - messaggio = "Il documento non si trova in uno stato valido per poter essere cancellato!"; - break; - case OP_STAMPA: - messaggio = "Il documento non si trova in uno stato valido per poter essere stampato!"; - break; - case OP_RAGGRUPPA: - messaggio = "Il documento non si trova in uno stato valido per poter essere raggruppato!"; - break; - case OP_USER: - messaggio = "Il documento non si trova in uno stato valido per effettuare la operazione richiesta!"; - break; - default: - CHECK( FALSE, "Tentativo di segnalare stato non valido di una operazione non esistente!" ); - break; - }; - messaggio << "\nStato corrente :%d.\nStati validi :%s."; - warning_box( messaggio, stato_corrente( ), ( const char * )stati_validi( operazione ) ); -}; - -int ve0100(int argc, char** argv) -{ - TMotore_application a; - - a.run(argc, argv, "Gestione documenti"); - return 0; -} +#include + +#ifndef __CHECKS_H +#include +#endif + +#ifndef __TABUTIL_H +#include +#endif + +#ifndef __BRWAPP_H +#include +#endif + +#ifndef __RELAPP_H +#include +#endif + +#ifndef __CONFIG_H +#include +#endif + +#ifndef __LFFILES_H +#include +#endif + +#ifndef __DEFMASK_H +#include "defmask.h" +#endif + +#ifndef __VEUML_H +#include "veuml.h" +#endif + +#ifndef __VEUML1_H +#include "veuml1.h" +#endif + +#ifndef __SHEET_H +#include +#endif + +#ifndef __REAL_H +#include +#endif + +#ifndef __MSKSHEET_H +#include +#endif + +#ifndef __VE0100_H +#include "ve0100.h" +#endif + +#ifndef __VE0100C_H +#include "ve0100c.h" +#endif + +#ifndef __VE0100D_H +#include "ve0100d.h" +#endif + +#ifndef __TCLIFOR_H +#include "tclifor.h" +#endif + +#ifndef __VE1000O_H +#include "ve1000o.h" +#endif + +// Numero di colonne presenti sullo sheet totale +#define MAX_COLUMNS 22 + +#define F_LBTIPORIGA 175 +#define NPIEDI 40 + +typedef real array_piede[ NPIEDI ]; + +// Definizione della classe dell'applicazione motore +class TMotore_application : public TRelation_application +{ + // Array di totalizzatori + array_piede _piedi; + array_piede _piedi_temp; + + // Record array per la gestione delle righe + TRecord_array* _righe_rec; + + // Puntatore al profilo del documento caricato + TConfig* _pro; + + // Puntatore al nome, per evitare di ricrearlo se è uguale + TFilename* _proname; + + // Puntatore alla maschera di ricerca + TMask* _msk; + + // Puntatore alla maschera di modifica/inserimento ( dipende dal profilo ) + TMask* _msk1; + + // puntatore alla relazione + TRelation* _rel; + + // Puntatore allo sheet delle righe documento + TSheet_field* _sheet; + + // Oggetto cliente per il motore + TCliForVendite* _clifor; + + // Indica se il documento ha come soggetto un liente o un ornitore + char _tipocf; + + // Ridefinizione dei metodi virtuali + virtual bool user_create( ); + virtual bool user_destroy( ); + virtual TMask* get_mask(int mode); + virtual bool changing_mask(int mode); + virtual TRelation* get_relation( ) const { return _rel;} + + virtual int read( TMask& m ); + virtual bool remove( void ); + virtual int write(const TMask& m); + virtual int rewrite(const TMask& m); + + // Punti di ingresso per le funzioni utente + + // Funzioni da associare ad ogni procedura + int user_function( int index ); + + // Funzioni per il calcolo delle righe + real user_row_calculate( TRectype& row, int index ); + + void user_set_handler( int fieldid, int index, TMask* m = NULL ); + + long prossimo_numero( bool provv ); + int avanza_numero( bool provv ); + void get_edit_mask( void ); + void azzera_piedi( bool temp = FALSE ); + void carica_piedi( ); + void somma_piedi( ); + void sottrai_piedi( ); + + // Esegue, se c'è, la procedura utente relativa ad una certa operazione + int esegui_procedura( int operazione ); + +protected: + + // Procedure e funzioni per la gestione della maschera e dei files + void read_rdoc(TMask& m); + + // formato dipendente dallo sheet (sono le varie colonne) + void load_riga( TSheet_field& f, int numrig, TRectype& r ); + void store_riga( TSheet_field& f, int numrig, TRectype& r ); + + void save(TRelation* r) const; + void set_descr (int numrig, const char* descr); + void carica_righe_libere(int from = -1); + bool check_key( TLocalisamfile& rdoc, TString16 codnum, bool provv, TString16 _anno, TString16 _ndoc ); + + // Procedure e funzioni per la gestione degli stati + void setta_stato_corrente( int nuovostato ); + const char* nome_sezione( int op ); + int stato_corrente( ); + int stato_finale( int operazione ); + bool stato_valido( int stato, int operazione ); + void segnala_stato_non_valido( int operazione ); + TString& stati_validi( int operazione ){ return ( pro( ).get( "STATIVALIDI", nome_sezione( operazione ) ) );}; + + void calcola_riga( TRectype& rdoc, bool temp = FALSE ); + + // Handle che ritorna la maschera per le righe + static TMask * ss_getmask( int numriga, TMask& fullmask, bool destroy ); + + // Handler che gestisce la richiesta del tipo riga in inserimento + static bool ss_handler( TSheet_field& ss, int r, KEY key ); + + // Handler per la maschera di ricerca + static bool ndoc_handler(TMask_field& f, KEY key); + static bool num_handler(TMask_field& f, KEY key); + static bool tip_handler(TMask_field& f, KEY key); + + // Handler per la maschera di modifica + static bool clifo_handler(TMask_field& f, KEY key); + static bool occas_handler(TMask_field& f, KEY key); + + // Configurazione dello sheet dato il profilo + void configura_sheet( TSheet_field& sheet, TConfig& config ); + +public: + + // Funzioni di accesso alle variabili privste + + TRecord_array& righe_rec( ) { CHECK( _righe_rec, "Record array delle righe nullo!" ); return * _righe_rec; }; + TConfig& pro( ) { CHECK( _pro, "Profilo del documento nullo!" ); return *_pro; }; + TFilename& proname( ) { CHECK( _proname, "Nome del profilo nullo!" ); return *_proname; }; + TMask& query_mask( ) { CHECK( _msk, "Maschera di ricerca nulla!" ); return *_msk; }; + TMask& edit_mask( ) { CHECK( _msk1, "Maschera di modifica nulla!" ); return *_msk1; }; + TRelation& rel( ) { CHECK( _rel, "Relazione nulla!" ); return *_rel; }; + TSheet_field& sheet( ) { CHECK( _sheet, "Sheet nullo!" ); return *_sheet; }; + TCliForVendite& clifo( ) { CHECK( _clifor, "Oggetto cliente nullo!" ); return *_clifor; }; + + // Operazione + + const char tipocf( ){ return _tipocf; } + void tipocf( const char tcf ){ _tipocf = tcf; } + bool valida_operazione( int operazione ); + + TSheet_field& ss( ) const { return *_sheet; } + TMotore_application( ) { _pro = NULL; } + virtual ~TMotore_application( ) { if ( _pro ) delete _pro; } + virtual const char* get_next_key( ); + +}; + +HIDDEN TMotore_application& app( ) { return (TMotore_application&) main_app( ); } + +int TMotore_application::user_function( int index ) +{ + switch( index ) + { + case 1: + break; + default: + yesnofatal_box( "Chiamata ad una procedura utente non definita: %d", index ); + return FALSE; + break; + }; + return NOERR; +}; + +// Funzione che dato il profilo di riga ottiene la maschera +// Serve per ottenere una maschera diversa per ogni riga +// Da migliorare, mettendo una cache + +TMask *TMotore_application::ss_getmask( int numriga, TMask& fullmask, bool destroy ) +{ + static TMask* m; + + if ( destroy ) + { + delete m; + return( NULL ); + } + else + { + TFilename nome_proriga( fullmask.get( 103 ) ); + nome_proriga.ext( "ini" ); + TConfig proriga( nome_proriga ); + m = new TMask( proriga.get( "MSK", "MAIN" ) ); + int numhandler = proriga.get_int( "NHANDLER", "HANDLERS" ); + for( int i = 1; i <= numhandler; i ++ ) + { + TString chiave; + chiave.format( "%d", i ); + TToken_string riga = proriga.get( chiave, "HANDLERS" ); + app().user_set_handler( riga.get_int( 0 ), riga.get_int( 1 ), m ); + }; + return( m ); + } +} + +real TMotore_application::user_row_calculate( TRectype& r, int index ) +{ + switch( index ) + { + case 100 : + return ( f100( r ) ); + break; + case 200 : + return ( f200( r ) ); + break; + case 300 : + return ( f300( r ) ); + break; + case 400 : + return ( f400( r ) ); + break; + case 500 : + return ( f500( r ) ); + break; + case 600 : + return ( f600( r ) ); + break; + default: + CHECK( FALSE, "Tentativo di chiamare una funzione di calcolo riga inesistente!" ); + return 0.0; + } +}; + +void TMotore_application::user_set_handler( int fieldid, int index, TMask* m ) +{ + if( !m ) + m = &edit_mask( ); + switch( index ) + { + case 1: + m->set_handler( fieldid, ora_hndl ); + break; + case 2: + m->set_handler( fieldid, codcli_hndl ); + break; + case 3: + m->set_handler( fieldid, dummy_hndl ); + break; + default: + CHECK( FALSE, "Tentativo di installare un handler non definito" ); + break; + } +}; + +bool TMotore_application::ss_handler( TSheet_field& ss, int r, KEY key ) +{ + if ( key == K_SPACE ) // Inizio modifica + { + app().azzera_piedi( TRUE ); + TRelation rdoc( LF_RIGHEDOC ); + ss.sheet_mask( ).autosave( &rdoc ); + // Mi calcolo nei piedi temporanei la riga + app().calcola_riga( rdoc.curr( ), TRUE ); + } + if ( key == K_INS ) // Inserimento + { + TMask& m = *app( )._msk1; + TTable tabtr( "%TRI" ); + tabtr.zero( ); + tabtr.put( "CODTAB", m.get( F_LBTIPORIGA ) ); + tabtr.read( ); + TToken_string& riga = ss.row( r ); + riga.add( 1, 0 ); + riga.add( m.get( F_LBTIPORIGA ), 1 ); + riga.add( tabtr.get( "S4" ), 2 ); + return TRUE; + } + if ( key == K_CTRL + K_INS ) // Dopo inserimento + { + TMask& m = *app( )._msk1; + TTable tabtr( "%TRI" ); + tabtr.zero( ); + tabtr.put( "CODTAB", m.get( F_LBTIPORIGA ) ); + tabtr.read( ); + TToken_string& riga = ss.row( r ); + TFilename nome_proriga( tabtr.get( "S4" ) ); + nome_proriga.ext( "ini" ); + TConfig pro( nome_proriga ); + int ncols = pro.get_int( "NCOLS", "COLUMNS" ); + // Disabilita tutte le colonne + for( int i = 1; i <= MAX_COLUMNS; i ++ ) + ss.disable_cell ( ss.items( ) - 1, i ); + // Abilita le colonne indicate nel profilo della riga + for( i = 1; i <= ncols; i ++ ) + { + TString16 chiave; + chiave.format( "%d", i ); + int coltoenable = pro.get_int( chiave, "COLUMNS" ); + ss.enable_cell ( ss.items( ) - 1, coltoenable - 1 ); + }; + ss.force_update( ); + app( ).curr_mask( ).send_key( K_ROWEDIT, F_SHEET ); + return TRUE; + } + if ( key == K_DEL ) // Cancellazione + { + // Sottraggo la riga appena cancellata ai totalizzatori + app().sottrai_piedi( ); + app().carica_piedi( ); + } + if ( key == K_ENTER ) // Modifica + { + app().sottrai_piedi( ); + TRelation rdoc( LF_RIGHEDOC ); + ss.sheet_mask( ).autosave( &rdoc ); + // Sommo la riga ai totalizzatori + app().calcola_riga( rdoc.curr( ) ); + app().sottrai_piedi( ); + } + return TRUE; +}; + +bool TMotore_application::num_handler( TMask_field& f, KEY key ) +{ + // Ottengo la maschera + TMask& m = f.mask( ); + + if (key == K_TAB && m.is_running( ) ) + { + // Se la numerazione non è specificata, + const TString16 value( m.get( F_CODNUM ) ); + if ( value.blank( ) ) + { + // Pulisce la descrizione + m.set(F_DESNUM, "" ); + // Pulisce i tipi di documento consentiti + m.set(F_TIPIDOCS, "" ); + // Pulisce il tipo di documento + m.set(F_TIPODOC, "" ); + return TRUE; + } + // Apro la tabella numerazioni + TTable tabnum( "NUM" ); + tabnum.zero( ); + tabnum.put( "CODTAB", value ); + if( tabnum.read( ) == NOERR ) + { + // Copio la descrizione della numerazione + m.set(F_DESNUM, tabnum.get("S0") ); + // Copio i tipi di documento validi per la numerazione + const TString tipidocs( tabnum.get("S2") ); + m.set(F_TIPIDOCS, tipidocs ); + // Propone il primo tipo di documento come default + m.set(F_TIPODOC, tipidocs.left( 4 ) ); + // m.field( F_TIPODOC ).check( ); + m.send_key( K_TAB, F_TIPODOC ); + + // Se per questa numerazione è abilitata le numerazione provvisoria + if ( tabnum.get_bool ( "B0" ) ) + { + // Setta di default la numerazione provvisoria + m.set( F_PROVV, "P" ); + // Abilita il campo per la selezione della numerazione + m.enable( F_PROVV ); + } + else // Altrimenti ... + { + // Setta la numerazione a definitiva + m.set( F_PROVV, "D" ); + // Disabilita il campo per la selezione della numerazione + m.disable( F_PROVV ); + }; + return TRUE; + } + message_box( "Numerazione non valida!" ); + return FALSE; + } + if (key == K_ENTER && m.is_running( ) ) + { // Se la numerazione non è specificata, + const TString16 value( m.get( F_CODNUM ) ); + if ( value.blank( ) ) + { + message_box( "Occorre una numerazione per inserire un documento!" ); + m.first_focus( F_NDOC ); + return FALSE; + } + } + return TRUE; +} + +bool TMotore_application::occas_handler(TMask_field& f, KEY key) +{ + if (key == K_SPACE && f.mask( ).is_running( ) ) + { + TMask& om = app( ).clifo( ). occas_mask( ); + om.run( ); + f.set_focus( ); + } + return TRUE; +} + + +bool TMotore_application::tip_handler(TMask_field& f, KEY key) +{ + TMask& m = f.mask( ); + if (key == K_TAB && m.is_running( ) ) + { + const TString16 value( m.get( F_TIPODOC ) ); + if ( value.blank( ) ) + { + // Pulisce il profilo + m.set(F_PROFILO, "" ); + return TRUE; + } + TString tipi_consentiti( m.get( F_TIPIDOCS ) ); + TString16 tipo( f.get( ) ); + tipo.trim( ); + bool tipo_valido = FALSE; + for ( int i = 0; i < 10; i ++ ) + { + TString16 curtipo( tipi_consentiti.mid( i * 4, 4 ) ); + curtipo.trim( ); + if( curtipo == tipo ) + { + tipo_valido = TRUE; + break; + } + } + if( ! tipo_valido ) + { + message_box( "Tipo non valido per la numerazione selezionata!" ); + f.set( "" ); + return FALSE; + } + TTable tabtip( "%TIP" ); + tabtip.read( ); + m.set(F_DESTIPODOC, tabtip.get("S0") ); + m.set(F_PROFILO, tabtip.get("S4") ); + } + if (key == K_ENTER && m.is_running( ) ) + { TString tipo( f.get( ) ); + if ( ! tipo.blank( ) ) + { TTable tabtip( "%TIP" ); + tabtip.read( ); + m.set(F_PROFILO, tabtip.get("S4") ); + } + else + { message_box( "Occorre un tipo documento per inserire un documento!" ); + m.first_focus( F_TIPODOC ); + return FALSE; + } + } + return TRUE; +} + +bool TMotore_application::ndoc_handler(TMask_field& f, KEY key) +{ + TMask& m = f.mask( ); + if (key == K_TAB && m.is_running( ) ) + { TLocalisamfile& doc = app( ).rel( ).lfile( ); + doc.zero( ); + doc.put("CODNUM", m.get( F_CODNUM ) ); + doc.put("PROVV", m.get( F_PROVV ) ); + doc.put("ANNO", m.get( F_ANNO ) ); + doc.put("NDOC", f.get( ) ); + if ( doc.read( ) == NOERR ) + { m.set(F_TIPODOC, doc.get( "TIPODOC" ) ); + m.set(F_STATO, doc.get( "STATO" ) ); + TTable tabtip( "%TIP" ); + tabtip.put( "CODTAB", doc.get( "TIPODOC" ) ); + tabtip.read( ); + m.set(F_PROFILO, tabtip.get("S4") ); + m.stop_run( K_AUTO_ENTER ); + } + } + return TRUE; +} + +bool TMotore_application::clifo_handler(TMask_field& f, KEY key) +{ + if (key == K_TAB && f.active()) + { + TMask& m = f.mask(); + + const char cf = app().tipocf(); + TLocalisamfile& clifo = ((TEdit_field&)f).browse()->cursor()->file(); + + if (clifo.get_char("TIPOCF") != cf || clifo.get("CODCF") != f.get()) + { + clifo.setkey(1); + clifo.put("TIPOCF", cf); + clifo.put("CODCF", f.get()); + clifo.read(); + CHECK(clifo.good(), "Impossibile ritrovare il clifo" ); + } + CHECKD(f.is_edit(), "Can't check suspension of a non edit-field ", f.dlg()); + const TEdit_field& c = (const TEdit_field&)f; + const TBrowse* b = c.browse(); + CHECKD(b, "Can't check suspension of a edit-field without a USE ", f.dlg()); + const TLocalisamfile& i = b->cursor()->file(); + // Tabella File + const char* sf = i.tab() ? "B2" : "SOSPESO"; + const bool suspended = i.get_bool(sf); + if (suspended) + { + sf = f.get(); + return f.error_box("Il codice '%s' e' sospeso e non puo' essere utilizzato", sf); + } + /* + if (!m.is_running() || f.dirty()) + { + // Equichecazzociva? + + } + */ + // Disabilitazioni varie, ma le demando all'oggetto cliente + if (f.focusdirty()) + { + app().clifo( ).load( cf, atol( f.get( ) ), "" ); + app().clifo( ).update_mask( m ); + if ( app( ).clifo( ).occasionale( ) && app( ).clifo( ).occas_mask( ).get(O_CODICE).empty( ) ) + m.send_key(K_SPACE, F_OCCASEDIT); // Lancia maschera occasionali + } + } + return TRUE; +} + +void TMotore_application::azzera_piedi( bool temp ) +{ + for ( int i = 0; i < NPIEDI; i++ ) + if ( temp ) + _piedi_temp[ i ] = 0.0; + else + _piedi[ i ] = 0.0; +} + +void TMotore_application::carica_piedi( ) +{ + TToken_string s( pro( ).get( "PROGPIEDE", "MAIN" ) ); + int i = s.get_int( ); + int j = 0; + while( i != 0 ) + { + real strpiede( _piedi[ i ] ); + edit_mask( ).set( BASE_PIEDE + ( ++j ), strpiede.stringa( 15 ) ); + i = s.get_int( ); + } +} + +void TMotore_application::somma_piedi( ) +{ + for ( int i = 0; i < NPIEDI; i++ ) + _piedi[ i ] += _piedi_temp[ i ]; +} + +void TMotore_application::sottrai_piedi( ) +{ + for ( int i = 0; i < NPIEDI; i++ ) + _piedi[ i ] -= _piedi_temp[ i ]; +} + +bool TMotore_application::changing_mask(int mode) +{ + static int lastmode = NO_MODE; + + const bool change = ( mode != lastmode ); + lastmode = mode; + return change; + +} + +void TMotore_application::configura_sheet( TSheet_field& sheet, TConfig& config ) +{ + int ncols = config.get_int( "NCOLS", "SHEET" ); + for( int i = 1; i <= ncols; i ++ ) + { + TString col; + col.format( "%d", i ); + TToken_string sheet_col( config.get( col, "SHEET" ) ); + const TString descr( sheet_col.get( 1 ) ); + if ( ! descr.blank( ) ) + sheet.set_column_header( i, descr ); + TString size( sheet_col.get( 2 ) ); + if ( ! size.blank( ) ) + sheet.set_column_width( i, sheet_col.get_int( 2 ) ); + int coltomove = sheet_col.get_int( 0 ) - 1; + sheet.move_column( coltomove, i ); + }; + for ( int j = MAX_COLUMNS; j >= i - 1; j -- ) + sheet.delete_column( j ); +}; + +void TMotore_application::get_edit_mask( void ) +{ + TFilename fn; + + fn = query_mask( ).get( F_PROFILO ); + // query_mask( ).enable(DLG_NEWREC); + fn.ext( "ini" ); + fn.upper( ); + if ( _pro ) + { + if( (*_proname) == fn ) + return; + delete _pro; + }; + _pro = new TConfig( fn ); + _proname = new TFilename( fn ); + _proname->upper( ); + if ( _msk1 ) delete _msk1; + _msk1 = new TMask( pro( ).get( "MSKFILE", "MAIN" ) ); + // edit_mask( ).set( F_PROFILO, query_mask( ).get( F_PROFILO ) ); + edit_mask( ).set( F_DESNUM, query_mask( ).get( F_DESNUM ) ); + _sheet = &(TSheet_field &)edit_mask( ).field(F_SHEET); + sheet( ).set_notify( ss_handler ); + TString tipocf( app( ).pro( ).get( "TIPOCF", "MAIN" ) ); + app( ).tipocf( tipocf[ 0 ] ); + configura_sheet( *_sheet, *_pro ); + TList_field& listbox = ( TList_field& ) _msk1->field( F_LBTIPORIGA ); + const int numtr = app( ).pro( ).get_int( "NTIPIRIGA", "RIGHE" ); + TTable tabtr( "%TRI" ); + TToken_string keys( "" ), descrs( "" ); + for ( int i = 1; i <= numtr; i ++ ) + { + TString chiave; + TToken_string item; + chiave.format( "%d", i ); + tabtr.zero( ); + TString tiporiga( app( ).pro( ).get( chiave, "RIGHE" ) ); + tabtr.put( "CODTAB", tiporiga ); + if ( tabtr.read( ) == NOERR ) + { + keys.add( tabtr.get( "CODTAB" ) ); + descrs.add( tabtr.get( "S0" ) ); + } + else + { + yesnofatal_box( "Inserito un tipo di riga non valido (%s)", (const char *)tiporiga ); + } + } + listbox.replace_items( keys, descrs ); + sheet( ).set_getmask( ss_getmask ); + int numhandler = pro( ).get_int( "NHANDLER", "HANDLERS" ); + for( i = 1; i <= numhandler; i ++ ) + { + TString chiave; + chiave.format( "%d", i ); + TToken_string riga = pro( ).get( chiave, "HANDLERS" ); + user_set_handler( riga.get_int( 0 ), riga.get_int( 1 ) ); + }; +} + +TMask* TMotore_application::get_mask( int mode ) +{ + switch ( mode ) + { + case MODE_INS: + case MODE_MOD: + get_edit_mask( ); + edit_mask( ).enable( DLG_PRINT, ( mode == MODE_MOD ) ); + edit_mask( ).set_handler( F_OCCASEDIT, occas_handler ); + edit_mask( ).set_handler( F_CODCF, clifo_handler ); + return ( _msk1 ); + break; + default: + return _msk; + break; + }; +} + +void TMotore_application::set_descr(int i, const char * dfi) +{ + TToken_string& r = ss( ).row(i); + r.add(dfi, 0); +} + +void TMotore_application::carica_righe_libere(int from) +{ + if (from < 0) from = ss( ).items( ); + for (int i = from; i < 20; i++) + set_descr( i, "" ); + ss( ).force_update( ); +} + +const char* TMotore_application::get_next_key( ) +{ + TToken_string key; + TMask& m = curr_mask( ); + + TString value = m.get( F_CODNUM ); + if ( value.blank( ) ) + return NULL; + TTable tabnum( "NUM" ); + tabnum.zero( ); + tabnum.put( "CODTAB", value ); + if( tabnum.read( ) == NOERR ) + { + // Se per questa numerazione è abilitata le numerazione automatica + if( tabnum.get_bool ( "B1" ) ) + { + TLocalisamfile doc( LF_DOC ); + doc.zero( ); + doc.put( "CODNUM", value ); + doc.put( "ANNO", m.get( F_ANNO ) ); + doc.put( "NDOC", 9999999L ); + // Se per questa numerazione è abilitata le numerazione provvisoria + if( tabnum.get_bool ( "B0" ) ) + { + doc.put( "PROVV", "P" ); + } + else // Altrimenti ... + { + doc.put( "PROVV", "D" ); + }; + if( doc.read( _isgteq ) == NOERR ) + { + doc.prev( ); + } + long num = ( value == doc.get( "CODNUM" ) ) ? doc.get_long( "NDOC" ) : 0; + key.format( "%d|%d", F_NDOC, num + 1 ); + return key; + } + }; + return NULL; +} + +int TMotore_application::read(TMask& m) +{ + azzera_piedi( ); + m.reset( ); + clifo( ).occas_mask( ).reset( ); + int err = TRelation_application::read( m ); + if ( err == NOERR ) + { + TString16 tipocf( m.get( F_TIPOCF ) ); + clifo( ).load( tipocf[ 0 ], m.get_int( F_CODCF ), rel( ).curr( ).get( "OCFPI" ) ); + clifo( ).update_mask( m, TRUE ); + TLocalisamfile& rdoc = rel( ).lfile(LF_RIGHEDOC); + TRectype r = rdoc.curr( ); + r.zero( ); + r.put( "CODNUM", m.get( F_CODNUM ) ); + r.put( "PROVV", m.get( F_PROVV ) ); + r.put( "ANNO", m.get( F_ANNO ) ); + r.put( "NDOC", m.get_long( F_NDOC ) ); + _righe_rec->read( r ); + TSheet_field& f = (TSheet_field&) m.field( F_SHEET ); + f.destroy( ); + int last = _righe_rec->last_row( ); + for( int i = 1; i <= last; i ++ ) + { + TRectype &rec = _righe_rec->row( i, TRUE ); + load_riga( f, i - 1, rec ); + calcola_riga( rec ); + }; + carica_piedi( ); + } + return err; +} + +bool TMotore_application::check_key( TLocalisamfile& rdoc, TString16 codnum, bool provv, TString16 anno, TString16 ndoc ) +{ + return ( ( rdoc.get("CODNUM") == codnum ) && + ( rdoc.get("NDOC") == ndoc ) && + ( rdoc.get("ANNO" ) == anno ) && + ( rdoc.get_bool( "PROVV" ) == provv ) ); +} + +int TMotore_application::write(const TMask& m) +{ + int err; + if ( esegui_procedura( OP_NUOVO ) != NOERR ) + return FALSE; + err = NOERR; // avanza_numero( m.get_bool( F_PROVV ) ); + if ( err == NOERR ) + { + err = app( ).clifo( ).write_occas( ); + } + + if ( err == NOERR ) + { + err = TRelation_application::write( m ); + if ( err == NOERR ) + { + TSheet_field& f = ss( ); + _righe_rec->destroy_rows( ); + if ( m.insert_mode( ) ) + _righe_rec->renum_key( "NRIGA", 1 ); + for ( int i = 0; i < f.items( ); i ++ ) + { + TToken_string& t = f.row( i ); + TRectype& rec = _righe_rec->row(i + 1, TRUE); + store_riga( f, i, rec ); + } + err = _righe_rec->write( ); + } + } + return err; +}; + +int TMotore_application::rewrite(const TMask& m) +{ + if ( ! valida_operazione( OP_MODIFICA ) ) + return FALSE; + int err = TRelation_application::rewrite( m ); + if ( err == NOERR ) + { + TSheet_field& f = ss( ); + _righe_rec->destroy_rows( ); + if ( m.insert_mode( ) ) + _righe_rec->renum_key( "NRIGA", 1 ); + for ( int i = 0; i < f.items( ); i ++ ) + { + TToken_string& t = f.row( i ); + TRectype& rec = _righe_rec->row(i + 1, TRUE); + store_riga( f, i, rec ); + } + err = _righe_rec->rewrite( ); + } + return err; +}; + + +// La funzione si trova in ve0100b + +long TMotore_application::prossimo_numero( bool provv ) +{ + long ret; + TTable tabnum( "NUM" ); + + tabnum.read( ); + if ( provv ) + ret = tabnum.get_long( "I0" ) + 1; + else + ret = tabnum.get_long( "I1" ) + 1; + return ( ret ); +}; + +int TMotore_application::avanza_numero( bool provv ) +{ + TTable tabnum( "NUM" ); + + int err = tabnum.read( ); + if ( err == NOERR ) + { + if ( provv ) + tabnum.put( "I0", tabnum.get_long( "I0" ) + 1 ); + else + tabnum.put( "I1", tabnum.get_long( "I1" ) + 1 ); + err = tabnum.rewrite( ); + } + return err; +}; + +bool TMotore_application::remove( void ) +{ + if ( ! valida_operazione( OP_CANCELLA ) ) + return FALSE; + return TRelation_application::remove && ( _righe_rec->remove( ) == NOERR ); +} + +void TMotore_application::load_riga( TSheet_field& f, int numrig, TRectype& r ) +{ + TToken_string& riga = f.row(numrig); + riga = r.get( "STATORIGA" ); + riga.add( r.get( "TIPORIGA" ) ); + TFilename proname( r.get( "PROFRIGA" ) ); + riga.add( proname ); + riga.add( r.get( "CODMAG" ) ); + riga.add( r.get( "CODART" ) ); + riga.add( r.get( "DESCR" ) ); + riga.add( r.get( "DESCLUNGA" ) ); + riga.add( r.get( "PREZZO" ) ); + riga.add( r.get( "UMQTA" ) ); + riga.add( r.get_real( "QTA" ).string(11) ); + riga.add( r.get( "QTAEVASA" ) ); + riga.add( r.get( "RIGAEVASA" ) ); + riga.add( r.get( "TARA" ) ); + riga.add( r.get( "PNETTO" ) ); + riga.add( r.get( "NCOLLI" ) ); + riga.add( r.get( "DAEVADERE" ) ); + riga.add( r.get( "SCONTO" ) ); + riga.add( r.get( "PERCPROV" ) ); + riga.add( r.get( "IMPFISSO" ) ); + riga.add( r.get( "IMPFISUN" ) ); + riga.add( r.get( "CODIVA" ) ); + riga.add( r.get( "ADDIVA" ) ); + riga.add( r.get( "ASPBENI" ) ); + proname.ext( "ini" ); + TConfig pro( proname ); + int ncols = pro.get_int( "NCOLS", "COLUMNS" ); + // Disabilita tutte le colonne + for( int i = 1; i <= MAX_COLUMNS; i ++ ) + f.disable_cell ( f.items( ) - 1, i ); + // Abilita le colonne indicate nel profilo della riga + for( i = 1; i <= ncols; i ++ ) + { + TString16 chiave; + chiave.format( "%d", i ); + int coltoenable = pro.get_int( chiave, "COLUMNS" ); + f.enable_cell ( numrig - 1, coltoenable - 1 ); + } +} + +void TMotore_application::store_riga( TSheet_field& f, int numrig, TRectype& r ) +{ + TToken_string& riga = f.row(numrig); + + r.put( "CODNUM", edit_mask( ).get( F_CODNUM ) ); + r.put( "ANNO", edit_mask( ).get( F_ANNO ) ); + r.put( "PROVV", edit_mask( ).get( F_PROVV ) ); + r.put( "NDOC", edit_mask( ).get_long( F_NDOC ) ); + r.put( "STATORIGA", riga.get( 0 ) ); + r.put( "TIPORIGA", riga.get( 1 ) ); + r.put( "PROFRIGA", riga.get( 2 ) ); + r.put( "CODMAG", riga.get( 3 ) ); + r.put( "CODART", riga.get( 4 ) ); + r.put( "DESCR", riga.get( 5 ) ); + r.put( "DESCLUNGA", riga.get( 6 ) ); + r.put( "PREZZO", riga.get( 7 ) ); + r.put( "UMQTA", riga.get( 8 ) ); + r.put( "QTA", riga.get( 9 ) ); + r.put( "QTAEVASA", riga.get( 10 ) ); + r.put( "RIGAEVASA", riga.get( 11 ) ); + r.put( "TARA", riga.get( 12 ) ); +} + + +void TMotore_application::calcola_riga( TRectype& r, bool temp ) +{ + TFilename proriganame( r.get("PROFRIGA") ); + proriganame.ext( "INI" ); + TConfig proriga( proriganame ); + TToken_string s(proriga.get("PROGPIEDE", "MAIN")); + int func = s.get_int( ); + while( func ) + { + if ( temp ) + _piedi_temp[ s.get_int( ) ] += user_row_calculate( r, func ); + else + _piedi[ s.get_int( ) ] += user_row_calculate( r, func ); + func = s.get_int( ); + } +} + + +bool TMotore_application::user_create( ) +{ + _clifor = new TCliForVendite( ); + azzera_piedi( ); + _msk = new TMask("VE1000A"); + query_mask( ).set_handler( F_NDOC, ndoc_handler ); + query_mask( ).set_handler( F_CODNUM, num_handler ); + query_mask( ).set_handler( F_TIPODOC, tip_handler ); + // La maschera di inserimento/modifica per ora non la so! + // Viene letta dal profilo non appena trovato il record + _msk1 = NULL; + + // Metto in relazione testata e righe + _rel = new TRelation(LF_DOC); + rel( ).add( LF_RIGHEDOC,"CODNUM=CODNUM|ANNO=ANNO|PROVV=PROVV|NDOC=NDOC" ); + + // Inizializzo il Record_array + _righe_rec = new TRecord_array( LF_RIGHEDOC, "NRIGA", 1 ); + + return TRUE; +} + +bool TMotore_application::user_destroy( ) +{ + // Se è ancora allocata, distruggo la maschera di modifica + if ( _msk1 ) delete _msk1; + + // Distruggo la maschera di modifica + delete _msk; + + // Distruggo la relazione + delete _rel; + + // Distruggo il Record_array + delete _righe_rec; + + return TRUE; +} + +int TMotore_application::esegui_procedura( int operazione ) +{ + // Accesso unico alla chiamata di procedure tramite operazione + int index = ( int )pro( ).get_long( nome_sezione( operazione ), "MAIN" ); + if ( index ) + return ( user_function( index ) ); + return ( NOERR ); +} + + +bool TMotore_application::valida_operazione( int operazione ) +{ + if ( operazione != OP_NUOVO ) + { + if ( !stato_valido( stato_corrente( ), operazione ) ) + { + segnala_stato_non_valido( operazione ); + return FALSE; + } + }; + if ( esegui_procedura( operazione ) == NOERR ) + return FALSE; + return TRUE; +} + +const char * TMotore_application::nome_sezione( int op ) +{ + switch( op ) + { + case OP_NUOVO: + return "INSERIMENTO"; + break; + case OP_MODIFICA: + return "MODIFICA"; + break; + case OP_CANCELLA: + return "CANCELLAZIONE"; + break; + case OP_STAMPA: + return "STAMPA"; + break; + case OP_RAGGRUPPA: + return "RAGGRUPPA"; + break; + case OP_USER: + return "SPECIALE"; + break; + default: + CHECK( FALSE, "tentativo di ottenere il nome di una operazione inesistente!" ); + // Per evitare la warning + return ""; + break; + } +} + +int TMotore_application::stato_finale( int operazione ) +{ + TString s( pro( ).get( "STATOFINALE", nome_sezione( operazione ) ) ); + if( strcmp( s, "N" ) == 0 ) return NO_CHANGE_STATUS; + return ( atoi( s ) ); +}; + +bool TMotore_application::stato_valido( int stato, int operazione ) +{ +#ifdef _DEBUG + warning_box( "Controllo stati validi!\nStato corrente %d.\nStati validi %s.", stato_corrente( ), ( const char * )stati_validi( operazione ) ); +#endif + char p[2] = "0"; + TToken_string ret ( stati_validi( operazione ), ',' ); + p[0] += (char)stato; + return ( ret.get_pos( p ) != -1 ); +}; + +void TMotore_application::setta_stato_corrente( int nuovostato ) +{ + // warning_box( "Settaggio stati validi!\nStato corrente %s.\nStati validi %s.\nStato finale %s.", stato_corrente( ), stati_validi( operazione ), stato_finale( operazione ) ); + TString p; + p.format( "%d", nuovostato ); + + TLocalisamfile& doc = rel( ).lfile(LF_DOC); + + p[0] += (char)nuovostato; + doc.put("STATO", p); + doc.rewrite( ); + query_mask( ).set( F_STATO, p ); + // warning_box( "Settaggio stati validi!\nStato corrente %s.\nStati validi %s.\nStato finale %s.", stato_corrente( ), stati_validi( operazione ), stato_finale( operazione ) ); +} + +int TMotore_application::stato_corrente( ) +{ + int i = query_mask( ).get_int( F_STATO ); + return ( i == 0 ? NO_DOC_STATUS : i ); +}; + +void TMotore_application::segnala_stato_non_valido( int operazione ) +{ + TString messaggio; + switch( operazione ) + { + case OP_NUOVO: + // Sempre valido + break; + case OP_MODIFICA: + messaggio = "Il documento non si trova in uno stato valido per poter essere modificato!"; + break; + case OP_CANCELLA: + messaggio = "Il documento non si trova in uno stato valido per poter essere cancellato!"; + break; + case OP_STAMPA: + messaggio = "Il documento non si trova in uno stato valido per poter essere stampato!"; + break; + case OP_RAGGRUPPA: + messaggio = "Il documento non si trova in uno stato valido per poter essere raggruppato!"; + break; + case OP_USER: + messaggio = "Il documento non si trova in uno stato valido per effettuare la operazione richiesta!"; + break; + default: + CHECK( FALSE, "Tentativo di segnalare stato non valido di una operazione non esistente!" ); + break; + }; + messaggio << "\nStato corrente :%d.\nStati validi :%s."; + warning_box( messaggio, stato_corrente( ), ( const char * )stati_validi( operazione ) ); +}; + +int ve0100(int argc, char** argv) +{ + TMotore_application a; + + a.run(argc, argv, "Gestione documenti"); + return 0; +} diff --git a/ve/ve0100d.cpp b/ve/ve0100d.cpp index 6bc1137b8..9c76d41db 100755 --- a/ve/ve0100d.cpp +++ b/ve/ve0100d.cpp @@ -1,40 +1,40 @@ -#ifndef __VE0100D_H -#include "ve0100d.h" -#endif - -// IMPORTO NETTO -real f100( TRectype& r ) -{ - return( r.get_real( "PREZZO" ) * r.get_real( "QTA" ) ); -}; - -// IMPORTO NETTO PROVVIGIONI -real f200( TRectype& r ) -{ - return( f100(r) * r.get_real( "PERCPROV" ) ); -}; - -// ARTICOLI -real f300( TRectype& r ) -{ - return( 1 ); -}; - -// QUANTITA' -real f400( TRectype& r ) -{ - return( r.get_real( "QTA" ) ); -}; - -// PREZZO -real f500( TRectype& r ) -{ - return( r.get_real( "PREZZO" ) ); -}; - -// SCONTO *** -real f600( TRectype& r ) -{ - return( 13 ); -}; - +#ifndef __VE0100D_H +#include "ve0100d.h" +#endif + +// IMPORTO NETTO +real f100( TRectype& r ) +{ + return( r.get_real( "PREZZO" ) * r.get_real( "QTA" ) ); +}; + +// IMPORTO NETTO PROVVIGIONI +real f200( TRectype& r ) +{ + return( f100(r) * r.get_real( "PERCPROV" ) ); +}; + +// ARTICOLI +real f300( TRectype& r ) +{ + return( 1 ); +}; + +// QUANTITA' +real f400( TRectype& r ) +{ + return( r.get_real( "QTA" ) ); +}; + +// PREZZO +real f500( TRectype& r ) +{ + return( r.get_real( "PREZZO" ) ); +}; + +// SCONTO *** +real f600( TRectype& r ) +{ + return( 13 ); +}; + diff --git a/ve/ve0100d.h b/ve/ve0100d.h index 09fa2cf33..c09be85ce 100755 --- a/ve/ve0100d.h +++ b/ve/ve0100d.h @@ -1,17 +1,17 @@ -#define __VE0100D_H - -#ifndef __REAL_H -#include "real.h" -#endif - -#ifndef __ISAM_H -#include "isam.h" -#endif - - -real f100( TRectype& r ); -real f200( TRectype& r ); -real f300( TRectype& r ); -real f400( TRectype& r ); -real f500( TRectype& r ); -real f600( TRectype& r ); +#define __VE0100D_H + +#ifndef __REAL_H +#include "real.h" +#endif + +#ifndef __ISAM_H +#include "isam.h" +#endif + + +real f100( TRectype& r ); +real f200( TRectype& r ); +real f300( TRectype& r ); +real f400( TRectype& r ); +real f500( TRectype& r ); +real f600( TRectype& r ); diff --git a/ve/ve0300.cpp b/ve/ve0300.cpp index 552b5b154..d6c6c0d05 100755 --- a/ve/ve0300.cpp +++ b/ve/ve0300.cpp @@ -1,1213 +1,1213 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - - "Compilatore di profili" per la gestione vendite. - Considerando: - - Profilo documento - - Configurazione vendite per la ditta - - Condizioni atmosferiche - genera le maschere appropriate. - Accetta sulla riga di comando il nome del profilo documento per cui deve generare - la maschera. Il nome del file .MSK viene dedotto dal profilo documento stesso. - - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#ifndef __CHECKS_H -#include -#endif - -#ifndef __FSTREAM_H -#include -#endif - -#ifndef __SCANNER_H -#include -#endif - -#ifndef __CONFIG_H -#include -#endif - -#ifndef __APPLICATION_H -#include -#endif - -#ifndef __UTILITY_H -#include -#endif - -#ifndef __DEFMASK_H -#include -#endif - -#ifndef __VE0100_H -#include "ve0100.h" -#endif - -#ifndef __VEUML_H -#include "veuml.h" -#endif - -#ifndef __LFFILES_H -#include "lffiles.h" -#endif - -#ifndef __VEINI_H -#include "veini.h" -#endif - -// Significato delle colonne nella tabella _tab0300b -#define B_NOME 0 -#define B_MSKTYPE 1 -#define B_MSKSIZE 2 -#define B_DESCR 3 -#define B_WIDTH 4 - -// Significato dei campi nel profilo del documento -#define P_STATO 0 -#define P_PROMPT 1 -#define P_HELP 2 -#define P_WARNING 3 - - -// Numero massimo di linee per pagina - -#define MAX_LINES_PER_PAGE 16 -#define MASK_FIRST_LINE 6 - -class TMaschera : public TObject -{ - -private: - - // Linea corrente - int _curline; - - // Pagina corrente - int _curpage; - -public: - - void advance_line( ){ _curline ++; }; - - // Genera una serie di righe uguali per funzione ( DISPLAY, ecc. ) - void outline( const TString& s = "", const TString& prefix = "", const char sep = '~' ); - - // Crea un controllo del tipo specificato - void control( const int type, const int id = DLG_NULL, const int size = -1 ); - - // CHECKTYPE - void check( const int i ); - - // PAGE - void pagina( const int i ){ _out << "PA \"Pagina " << i << "\" 11 60 14\n"; }; - - // PROMPT - void prompt( const int x, const int y, const TString& s = "" ){ _out << "PR " << x << " " << y << " \"" << s << "\"\n"; }; - - // BEGIN - void begin( void ) { outline ( "BE" ); }; - - // END - void end( void ) { outline ( "EN" ); }; - - // ENDMASK - void endmask( void ) { outline ( "ENDMASK" ); }; - - // FLAG - void flag( const TString& s ) { _out << "FLAG \"" << s << "\"\n"; }; - - // HELP - void help( const TString& s ) { _out << "HE \"" << s << "\"\n"; }; - - // WARNING - void warning( const TString& s ) { _out << "WA \"" << s << "\"\n"; }; - - // GROUP - void group( const int g ) { _out << "GR " << g << "\n"; }; - - // FIELD - void field( const TString& s ) { outline( s, "FI "); }; - - // ITEM - void item( const TString& s ); - - // MESSAGE - void message( const TString& s ) { outline( s, "ME "); }; - - // USE - void use( const TString& s ){ outline( s, "US " ); }; - void use( const int file, const int key ){ _out << "US " << file << " KEY " << key << "\n"; }; - - // DISPLAY - void display( const TString& s ){ outline( s, "DI " ); }; - - // INPUT - void input( const TString& s ){ outline( s, "IN " ); }; - - // OUTPUT - void output( const TString& s ){ outline( s, "OU " ); }; - - // Funzioni per la lettura/scrittura di CURPAGE - int page( ) { return _curpage; }; - void page( const int i ){ _curpage = i; }; - - // Funzioni per la lettura/scrittura di CURLINE - int line( ) { return _curline; }; - void line( const int i ){ _curline = i; }; - - // Costruttore, vuole il nome del file .INI - TMaschera( const TFilename outfile ); - - // Vero se la pagina è aperta - bool _pageopen; - - // File .MSK di output - ofstream _out; - - -}; - - -TMaschera::TMaschera( const TFilename outfile ) : _out( outfile ) -{ - _curline = 1; - _curpage = 1; - _pageopen = FALSE; - bool _groupopen = FALSE; -} - -void TMaschera::outline( const TString& s, const TString& prefix, const char sep ) -{ - if ( s.left( 1 ) == "@" ) - _out << "CO " << prefix << s.mid( 1 ) << "\n"; - else - { TToken_string u( s, sep ); - for ( int i = 0; i < u.items(); i ++ ) - _out << prefix << u.get( i ) << "\n"; - } -} - -void TMaschera::check( const int i ) -{ - switch( i ) - { - case S_OBBLIGATORIO: - outline ( "CH REQUIRED" ); - break; - default: - outline ( "CH NORMAL" ); - break; - } -} - -void TMaschera::control( const int type, const int id, const int size ) -{ - switch ( type ) - { - case T_DATA: - _out << "DA"; - break; - case T_STRINGA: - _out << "ST"; - break; - case T_CHECKBOX: - _out << "BO"; - break; - case T_NUMERO: - _out << "NU"; - break; - case T_LISTA: - _out << "LI"; - break; - case T_MEMO: - _out << "ME"; - break; - case T_CORNICE: - _out << "GR"; - break; - case T_BOTTONE: - _out << "BU"; - break; - } - _out << " " << id; - if ( size > 0 ) - { - if ( size > 100 ) - _out << " " << ( int )( size / 100 ) << " " << ( size % 100 ); - else - _out << " " << size; - } - _out << "\n"; -} - -void TMaschera::item( const TString& str ) -{ - int i, j; - TToken_string u( str, '@' ); - TToken_string s; - - for( i = 0; i < u.items(); i ++ ) - { - _out << "IT \"" << s[ 0 ] << "\"\n"; - for( j = 1; j < s.items(); j ++ ) - _out << "ME " << s[ j ] << "\n"; - } -} - -class TGruppo : public TObject -{ -protected: - - int _id; - int _height; - bool _present; - -public: - - void id( int id ){ _id = id; } - int id( ){ return _id; } - void height( int h ){ _height = h; } - int height( ){ return _height; } - void present( bool p ){ _present = p; } - bool present( ){ return _present; } - - TGruppo ( int i ); - TGruppo ( int i, TConfig& pro ); -}; - -TGruppo::TGruppo( int i ) -{ - TConfig pro( "ve0300c.ini" ); - _id = i; - _height = pro.get_int( "HEIGHT", format( "%d", i ) ); -}; - -TGruppo::TGruppo( int i, TConfig& pro ) -{ - _id = i; - _height = pro.get_int( "HEIGHT", format( "%d", i ) ); -}; - -class TField : public TObject -{ -protected: - - TString _nome; - int _gruppo; - int _id; - int _type; - int _size; - int _stato; - int _x, _y; - TString _prompt, _flag, _help, _warning, _fieldname; - TToken_string _use, _input, _display, _output, _special, _items, _configs; - -public: - - TField( TString& campo, TConfig& pro ); - TField( ); - - void genera( TMaschera& _m ); - void configura( TConfig& pro ); - - void x( int x ){ _x = x; } - void y( int y ){ _y = y; } - void gruppo( int gruppo ){ _gruppo = gruppo; } - void id( int id ){ _id = id; } - void type( int type ){ _type = type; } - void size( int size ){ _size = size; } - void stato( int stato ){ _stato = stato; } - int x( ){ return _x; } - int y( ){ return _y; } - int gruppo( ){ return _gruppo; } - int id( ){ return _id; } - int type( ){ return _type; } - int size( ){ return _size; } - int stato( ){ return _stato; } - - - void nome( TString& nome ){ _nome = nome; } - void prompt( TString& prompt ){ _prompt = prompt; } - void flag( TString& flag ){ _flag = flag; } - void help( TString& help ){ _help = help; } - void warning( TString& warning ){ _warning = warning; } - void fieldname( TString& fieldname ){ _fieldname = fieldname; } - TString& nome( ){ return _nome; } - TString& prompt( ){ return _prompt; } - TString& flag( ){ return _flag; } - TString& help( ){ return _help; } - TString& warning( ){ return _warning; } - TString& fieldname( ){ return _fieldname; } - - void use( TToken_string& use ){ _use = use; } - void input( TToken_string& input ){ _input = input; } - void display( TToken_string& display ){ _display = display; } - void output( TToken_string& output ){ _output = output; } - void special( TToken_string& special ){ _special = special; } - void items( TToken_string& items ){ _items = items; } - void configs( TToken_string& configs ){ _configs = configs; } - TToken_string& use( ){ return _use; } - TToken_string& input( ){ return _input; } - TToken_string& display( ){ return _display; } - TToken_string& output( ){ return _output; } - TToken_string& special( ){ return _special; } - TToken_string& items( ){ return _items; } - TToken_string& configs( ){ return _configs; } - - - friend int sort_by_group(const TObject** o1, const TObject** o2 ); - // friend int TMask_generator::group( const TField& f1 ); -}; - -int sort_by_group(const TObject** o1, const TObject** o2 ) -{ - int g1 = ((TField * )( *o1 ))->_gruppo; - int g2 = ((TField * )( *o2 ))->_gruppo; - return ( g1 < g2 ) ? -1 : ( ( g1 = g2 ) ? 0 : 1 ); -}; - -TField::TField( TString& campo, TConfig& pro ) : _nome( campo ) -{ - _nome.trim( ); - _fieldname = pro.get( "FIELDNAME", campo ); - _x = _gruppo = pro.get_int( "X", campo ); - _y = _gruppo = pro.get_int( "Y", campo ); - _gruppo = pro.get_int( "GROUP", campo ); - CHECK( _gruppo != 0, "Gruppo uguale a 0" ); - _id = pro.get_int( "MSKID", campo ); - CHECK( _id != 0, "Campo con MSKID uguale a 0" ); - _type = pro.get_int( "TYPE", campo ); - _size = pro.get_int( "SIZE", campo ); - _prompt = pro.get( "PROMPT", campo ); - if( _prompt[ 0 ] == '\"' ) - { - _prompt.ltrim( 1 ); - _prompt.rtrim( 1 ); - }; - _flag = pro.get( "FLAG", campo ); - _help = pro.get( "FLAG", campo ); - _warning = pro.get( "FLAG", campo ); - _use = pro.get( "USE", campo ); - _use.separator( '~' ); - _input = pro.get( "INPUT", campo ); - _input.separator( '~' ); - _display = pro.get( "DISPLAY", campo ); - _display.separator( '~' ); - _output = pro.get( "OUTPUT", campo ); - _output.separator( '~' ); - _special = pro.get( "SPECIAL", campo ); - _special.separator( '~' ); - _configs = pro.get( "CONFIGS", campo ); - _configs.separator( '~' ); - _items = ""; - int last = pro.get_int( "NITEMS", campo ); - for( int i = 1; i <= last; i ++ ) - _items.add( pro.get( "ITEM", campo, i ) ); -}; - -TField::TField( ) -{ - _nome = ""; - _fieldname = ""; - _x = 0; - _y = 0; - _gruppo = 0; - _id = 0; - _type = 0; - _size = 0; - _prompt = ""; - _flag = ""; - _help = ""; - _warning = ""; - _use = ""; - _use.separator( '~' ); - _input = ""; - _input.separator( '~' ); - _display = ""; - _display.separator( '~' ); - _output = ""; - _output.separator( '~' ); - _special = ""; - _special.separator( '~' ); - _configs = ""; - _configs.separator( '~' ); - _items = ""; - _items.separator( '@' ); -} - -void TField::configura( TConfig& pro ) -{ - TToken_string riga_profilo( pro.get( _nome, "PROFILO" ) ); - TString newprompt( riga_profilo.get( P_PROMPT ) ) ; - TString newhelp( riga_profilo.get( P_HELP ) ) ; - TString newwarning( riga_profilo.get( P_WARNING ) ) ; - if ( ! newprompt.blank( ) ) - _prompt = newprompt; - if ( ! newhelp.blank( ) ) - _help = newhelp; - if ( ! newwarning.blank( ) ) - _warning = newwarning; -} - -void TField::genera( TMaschera& m ) -{ - TString s; - - if ( _stato == S_NASCOSTO ) - return; - if ( _size != 0 ) - m.control( _type, _id, _size ); - else - m.control( _type, _id ); - m.begin(); - switch( _stato ) - { - case S_DISABILITATO : - m.prompt( _x, _y + m.line( ), _prompt ); - s = "D"; - s << _flag; - m.flag( s ) ; - break; - case S_NORMALE : - case S_OBBLIGATORIO : - m.prompt( _x, _y + m.line( ), _prompt ); - m.flag( _flag ); - break; - } - m.check( _stato ); - if ( !_fieldname.blank( ) ) m.field( _fieldname ); - if ( !_items.blank( ) ) m.item( _items ); - if ( !_use.blank( ) ) m.use( _use ); - if ( !_input.blank( ) ) m.input( _input ); - if ( !_display.blank( ) ) m.display( _display ); - if ( !_output.blank( ) ) m.output( _output ); - if ( !_help.blank( ) ) m.help( _help ); - if ( !_warning.blank( ) ) m.warning( _warning ); - if ( !_special.blank( ) ) m.outline( _special ); - m.end(); - if ( ( m.line() > MAX_LINES_PER_PAGE ) && ( m._pageopen == TRUE)) - { - m.end(); - m._pageopen = FALSE; - m.line( MASK_FIRST_LINE ); - } -} - - -class TMask_generator -{ - -private: - - // Identificatore corrente per lo sheet - int _curid; - - // vero se il gruppo è aperto - bool _groupopen; - - // nome del file di .INI di input - TFilename _proname; - - // File .INI di riferimento per i campi - TConfig _fieldsini; - - // File .INI di riferimento per i gruppi - TConfig _groupsini; - - // File .INI di input - TConfig* _pro; - - TConfig _ditta; - - // Tabelle per la generazione - - // Campi dei documenti - TString_array _fields; - - // Campi dello sheet - TString_array _tab0300b; - -protected: - - // Carica un file di tabella in un TString array - void carica_tabella( const TFilename& fn, TString_array& tabella ); - - // Scrive sul file di output una serie di righe uguali per funzione ( DISPLAY, ecc. ) - void outline( const TString& s = "", const TString& prefix = "", const char sep = '~' ); - - - // Crea un controllo del tipo specificato - void control( const int type, const int id = DLG_NULL, const int size = -1 ); - - // Ritorna vero se una componente della maschera è presente - int present( const int i, TToken_string line ){ const TString s = line.get( i ); return !(s.blank( )); }; - - // Carica dati dei campi - void carica_dati_campi( const TFilename& fn, TArray& a ); - - // Funzioni di accesso alle variabili private - // ------------------------------------------ - - // Funzioni per la lettura/scrittura di ID. Si incrementa da solo. - int id ( ) { return( _curid++ ); }; - void id( const int i ){ _curid = i; }; - - - // Funzioni di generazione ad alto livello - // --------------------------------------- - - // Genera un campo a partire da una linea del file VE0300A.DAT - void genera_campo( TToken_string _line ); - - // Genera un campo dello sheet a partire da una linea del file VE0300B.DAT - void genera_campo_sheet( TToken_string _line ); - - - // Genera la colonna dello sheet a partire da una linea del file VE0300B.DAT - void genera_item_sheet( TToken_string _line ); - - // Genera l'intestazione di una pagina ( non la prima ) - void intestazione_pagina( ); - - // Ritorna lo stato che dovrà avere il campo sulla maschera da generare - int stato_del_campo( TString campo ); - -public: - - TMaschera * _m; - - // Costruttore, vuole il nome del file .INI - TMask_generator( const TString& profilo ); - - // Attiva la generazione della maschera - void genera( ); - - // Distruttore - virtual ~TMask_generator( ); - -}; - -// Definizione dei metodi di TMask_generator -// ----------------------------------------- - -TMask_generator::TMask_generator( const TString& profilo ) : _proname( profilo ), _fieldsini( "ve0300a.ini" ), _groupsini( "ve0300c.ini" ), _ditta( CONFIG_DITTA ) -{ - // All'inizio il gruppo è 'chiuso' - _groupopen = FALSE; - - // Forza l'estensione al profilo - _proname.ext( "ini" ); - - // Se il file di profilo non esiste, esci con un errore fatale - if ( !fexist( _proname ) ) - fatal_box( "Il file %s non esiste!", ( const char * )_proname ); - - CHECK( fexist( "ve0300a.ini" ), "Il file ve0300a.ini non esiste!" ); - _fieldsini.list_paragraphs( _fields ); - CHECK( fexist( "ve0300b.dat" ), "Il file ve0300b.dat non esiste!" ); - carica_tabella( "ve0300b.dat", _tab0300b ); - - _pro = new TConfig( _proname ); - - TFilename _mskname( _pro->get( "MSKFILE", "MAIN") ); - _mskname.ext( "msk" ); - - - _m = new TMaschera( _mskname ); - -}; - -TMask_generator::~TMask_generator( ) -{ - delete _m; - delete _pro; -}; - - -void TMask_generator::carica_dati_campi( const TFilename& fn, TArray& a ) -{ - TScanner infile( fn ); - TString line; - TField *campo = NULL; - - while ( infile.ok( ) ) - { - line = infile.line( ); - line.trim( ); - while ( ( line.empty() || line[ 0 ] == '#' || line.left( 2 ) == "//" ) && infile.ok( ) ) - { - line = infile.line( ); - line.trim(); - } - if( infile.ok( ) ) - { - if ( line[ 0 ] == '[' ) // Carica un un campo - { - line.strip( "[]" ); - if ( campo ) - a.add( campo ); - campo = new TField(); - campo->nome( line ); - } - else - { - int pos; - if( ( pos = line.find( '=' ) ) == 0 ) - yesnofatal_box( "Linea errata nel file.INI: %s", (const char *) line ); - else - { - TString key = line.sub( 0, pos ); - key.trim(); - TString value = line.mid( pos + 1 ); - value.trim(); - if( key == "X" ) - campo->x( atoi( value ) ); - else if( key == "Y" ) - campo->y( atoi( value ) ); - else if( key == "GROUP" ) - campo->gruppo( atoi( value ) ); - else if( key == "FIELDNAME" ) - campo->fieldname( value ); - else if( key == "MSKID" ) - campo->id( atoi( value ) ); - else if( key == "TYPE" ) - campo->type( atoi( value ) ); - else if( key == "SIZE" ) - campo->size( atoi( value ) ); - else if( key == "PROMPT" ) - { - if( value[ 0 ] == '"' ) - { - value.rtrim( 1 ); - value.ltrim( 1 ); - }; - campo->prompt( value ); - } - else if( key == "FLAG" ) - campo->flag( value ); - else if( key == "USE" ) - campo->use( (TToken_string & ) value ); - else if( key == "INPUT" ) - campo->input( (TToken_string & )value ); - else if( key == "DISPLAY" ) - campo->display( (TToken_string & )value ); - else if( key == "OUTPUT" ) - campo->output( (TToken_string & )value ); - else if( key == "WARNING" ) - campo->warning( value ); - else if( key == "HELP" ) - campo->help( value ); - else if( key == "SPECIAL" ) - campo->special( (TToken_string & )value ); - else if( key == "ITEMS" ) - campo->items( (TToken_string & )value ); - else if( key == "CONFIGS" ) - campo->configs( (TToken_string & )value ); - else yesnofatal_box( "Chiave non trovata(%s)", (const char *) key ); - } - } - } - } - if ( campo ) - a.add( campo ); -} - -void TMask_generator::carica_tabella( const TFilename& fn, TString_array& tabella ) -{ TScanner in( fn ); - TToken_string line = in.line(); - while( line.not_empty( ) ) - { // Attacca tutte le righe che finiscono con § - while ( line.right( 1 ) == "§" ) - { line.rtrim( 1 ); - line << in.line( ); - }; - tabella.add( line ); - line = in.line(); - } -}; - -int TMask_generator::stato_del_campo( TString campo ) -{ - // Strategia al 28/08/95 - // Se il campo, nel file .INI di definizione dei campi, è legato a qualche voce in - // configurazione, legge il suo stato, altrimenti assume il massimo. - // Va poi a verificare nel .INI da compilare, e verifica li' la impostazione. - // Controlla poi la impostazione per il gruppo, come impostato nel file .INI - // e nella sezione CONFIGS nel .INI di defiunizione dei gruppi. - // Utilizza poi la minore delle due. - TToken_string config( _fieldsini.get( "CONFIGS", campo ) ); - int items = config.items( ); - int stato = S_OBBLIGATORIO; - for ( int i = 0; i < items; i += 3 ) - { TString chiave = config[ i ]; - TString valore = config[ i + 1 ]; - TString reale = _ditta.get( chiave, "VE" ); - if ( reale == valore ) - stato = atoi( ( char * ) config[ i + 2 ] ); - }; - TToken_string riga_profilo( _pro->get( campo, "PROFILO" ) ); - int stato_profilo = riga_profilo.get_int( P_STATO ); - stato = ( stato < stato_profilo )? stato : stato_profilo; - TString gruppo ( _fieldsini.get( "GROUP", campo ) ); - gruppo.trim( ); - config = ( _groupsini.get( "CONFIGS", gruppo ) ); - int stato_gruppo = S_OBBLIGATORIO; - for ( i = 0; i < items; i += 3 ) - { TString chiave = config[ i ]; - TString valore = config[ i + 1 ]; - TString reale = _ditta.get( chiave, "VE" ); - if ( reale == valore ) - stato_gruppo = atoi( ( char * ) config[ i + 2 ] ); - }; - stato = ( stato < stato_gruppo )? stato : stato_gruppo; - int stato_gruppo_profilo = _pro->get_int( gruppo, "PROFILOGRUPPO" ); - stato = ( stato < stato_gruppo_profilo )? stato : stato_gruppo_profilo; - return stato; - -} - -void TMask_generator::genera_campo_sheet( TToken_string _line ) -{ - const int type( _line.get_int( B_MSKTYPE ) ); - _m->control( type, id( ), _line.get_int( B_MSKSIZE ) ); - _m->begin( ); - _m->prompt( 2, 2 ); - _m->field( _line.get( B_NOME ) ); - _m->end( ); -} - -void TMask_generator::genera_item_sheet( TToken_string _line ) -{ - _m->_out << "IT \"" << _line.get( B_DESCR ); - _m->_out << "@" << _line.get_int( B_WIDTH ) << "\"\n"; -} - -void TMask_generator::intestazione_pagina( ) -{ - _m->page( _m->page( ) + 1 ); - _m->pagina( _m->page( ) ); - - _m->control( T_CORNICE, DLG_NULL, 7806 ); - _m->begin( ); - _m->prompt( 1, 0, "" ); - _m->end( ); - - _m->control( T_STRINGA, DLG_NULL, 4 ); - _m->begin(); - _m->prompt( 2, 1, "Cod. num. " ); - _m->group( 2 ); - _m->flag( "DUZ" ); - _m->end(); - - _m->control( T_STRINGA, DLG_NULL, 50 ); - _m->begin(); - _m->prompt( 24, 1 ); - _m->flag( "DU" ); - _m->group( 3 ); - _m->end(); - - _m->control( T_STRINGA, DLG_NULL, 4 ); - _m->begin(); - _m->prompt( 2, 2, "Tipo doc. " ); - _m->flag( "DU" ); - _m->group( 4 ); - _m->end(); - - _m->control( T_STRINGA, DLG_NULL, 50 ); - _m->begin(); - _m->prompt( 24, 2 ); - _m->flag( "DU" ); - _m->group( 5 ); - _m->end(); - - _m->control( T_NUMERO, DLG_NULL, 6 ); - _m->begin(); - _m->prompt( 2, 3, "Doc.: nr. " ); - _m->group( 6 ); - _m->flag( "D" ); - _m->end(); - - _m->control( T_DATA ); - _m->begin(); - _m->prompt( 24, 3, "Data " ); - _m->group( 7 ); - _m->flag( "D" ); - _m->end(); - - _m->control( T_NUMERO, DLG_NULL, 1 ); - _m->begin(); - _m->prompt( 50, 3, "Stato " ); - _m->group( 8 ); - _m->flag( "D" ); - _m->end(); - - _m->control( T_STRINGA, DLG_NULL, 4 ); - _m->begin(); - _m->prompt( 66, 3, "Es. " ); - _m->flag( "D" ); - _m->group( 9 ); - _m->end(); - - _m->control( T_STRINGA, DLG_NULL, 6 ); - _m->begin(); - if ( _pro->get( "TIPOCF", "MAIN" ) == "C" ) - _m->prompt( 2, 4, "Cliente " ); - else - _m->prompt( 2, 4, "Fornitore " ); - _m->flag( "D" ); - _m->group( 10 ); - _m->end(); - - _m->control( T_STRINGA, DLG_NULL, 50 ); - _m->begin(); - _m->prompt( 24, 4, "" ); - _m->flag( "D" ); - _m->group( 11 ); - _m->end(); - -} - -void TMask_generator::genera( ) -{ - int i; - TString temp_s; - - - // Definizione della toolbar - - - _m->outline( "TOOLBAR \"\" 0 20 0 2" ); - - _m->control( T_BOTTONE, 18, 802 ); - _m->begin(); - _m->prompt( -15, -1, "~Registra" ); - _m->message( "EXIT,20082" ); - _m->end(); - - _m->control( T_BOTTONE, 17, 802 ); - _m->begin(); - _m->prompt( -25, -1, "~Elimina" ); - _m->message( "EXIT,127" ); - _m->end(); - - _m->control( T_BOTTONE, 99, 802 ); - _m->begin(); - _m->prompt( -35, -1, "E~labora" ); - _m->message( "EXIT,345" ); - _m->end(); - - _m->control( T_BOTTONE, 24, 802 ); - _m->begin(); - _m->prompt( -45, -1 ); - _m->message( "EXIT,346" ); - _m->end(); - - _m->control( T_BOTTONE, 2, 802 ); - _m->begin(); - _m->prompt( -55, -1 ); - _m->message( "EXIT,27" ); - _m->end(); - - // End della toolbar - _m->end(); - - - // Header della prima pagina - - _m->outline( "PA \"Pagina \" 11 60 14" ); - - _m->control( T_CORNICE, DLG_NULL, 7806 ); - _m->begin( ); - _m->prompt( 1, 0, "" ); - _m->end( ); - - _m->control( T_STRINGA, F_CODNUM, 4 ); - _m->begin(); - _m->prompt( 2, 1, "Cod. num. " ); - _m->field( "CODNUM" ); - _m->flag( "GDUZ" ); - _m->message( "CO,2@" ); - _m->end(); - - _m->control( T_STRINGA, F_DESNUM, 50 ); - _m->begin(); - _m->prompt( 24, 1 ); - _m->flag( "GDU" ); - _m->message( "CO,3@" ); - _m->end(); - - _m->control( T_STRINGA, F_TIPODOC, 4 ); - _m->begin(); - _m->prompt( 2, 2, "Tipo doc. " ); - _m->flag( "GDU" ); - _m->message( "CO,4@" ); - _m->end(); - - _m->control( T_STRINGA, F_TIPOCF, 1 ); - _m->begin(); - _m->prompt( 2, 2, "Tipo CF " ); - _m->field( "TIPOCF" ); - _m->flag( "H" ); - _m->end(); - - _m->control( T_STRINGA, F_PROVV, 1 ); - _m->begin(); - _m->prompt( 2, 2, "

" ); - _m->field( "PROVV" ); - _m->flag( "H" ); - _m->end(); - - - _m->control( T_STRINGA, F_DESTIPODOC, 50 ); - _m->begin(); - _m->prompt( 24, 2 ); - _m->flag( "GDU" ); - _m->message( "CO,5@" ); - _m->end(); - - _m->control( T_NUMERO, F_NDOC, 6 ); - _m->begin(); - _m->prompt( 2, 3, "Doc.: nr. " ); - _m->field( "NDOC" ); - _m->message( "CO,6@" ); - _m->flag( "GDR" ); - _m->end(); - - _m->control( T_DATA, F_DATADOC ); - _m->begin(); - _m->prompt( 24, 3, "Data " ); - _m->field( "DATADOC" ); - _m->message( "CO,7@" ); - _m->flag( "A" ); - _m->end(); - - _m->control( T_NUMERO, F_STATO, 1 ); - _m->begin(); - _m->prompt( 50, 3, "Stato " ); - _m->field( "STATO" ); - _m->message( "CO,8@" ); - _m->flag( "D" ); - _m->end(); - - _m->control( T_STRINGA, F_ANNO, 4 ); - _m->begin(); - _m->prompt( 66, 3, "Es. " ); - _m->field( "ANNO" ); - _m->flag( "GD" ); - _m->message( "CO,9@" ); - _m->end(); - - _m->control( T_STRINGA, F_CODCF, 6 ); - _m->begin(); - if ( _pro->get( "TIPOCF", "MAIN" ) == "C" ) - { - _m->prompt( 2, 4, "Cliente " ); - _m->warning( "Cliente assente" ); - _m->help( "Codice del cliente del documento" ); - - } - else - { - _m->prompt( 2, 4, "Fornitore " ); - _m->warning( "Fornitore assente" ); - _m->help( "Codice del fornitore del documento" ); - } - _m->flag( "R" ); - _m->field( "CODCF" ); - _m->group( 1 ); - _m->use( LF_CLIFO, 1 ); - temp_s.format( "TIPOCF \"C\"~CODCF %d", F_CODCF); - _m->input( temp_s ); - _m->display( "\"Codice\" CODCF~\"Ragione Sociale@50\" RAGSOC~\"Partita IVA@12\" PAIV~\"Sospeso\" SOSPESO" ); - temp_s.format( "%d CODCF~%d RAGSOC", F_CODCF, F_DESCF ); - _m->output( temp_s ); - _m->check( S_OBBLIGATORIO ); - _m->outline( "ADD RU cg0 -1 C" ); - _m->end(); - - _m->control( T_STRINGA, F_DESCF, 50 ); - _m->begin( ); - if ( _pro->get( "TIPOCF", "MAIN" ) == "C" ) - { - _m->warning( "Cliente assente" ); - _m->help( "Ragione sociale del cliente del documento" ); - - } - else - { - _m->warning( "Fornitore assente" ); - _m->help( "Ragione sociale del fornitore del documento" ); - } - _m->prompt( 24, 4, "" ); - _m->group( 1 ); - _m->use( LF_CLIFO, 2 ); - temp_s.format( "TIPOCF \"C\"~RAGSOC %d", F_DESCF); - _m->input( temp_s ); - _m->display( "\"Ragione Sociale@50\" RAGSOC~\"Partita IVA@12\" PAIV~\"Codice\" CODCF" ); - temp_s.format( "%d CODCF~%d RAGSOC", F_CODCF, F_DESCF ); - _m->output( temp_s ); - _m->check( S_OBBLIGATORIO ); - _m->outline( "ADD RU cg0 -1 C" ); - _m->end(); - _m->line( MASK_FIRST_LINE ); - - // Generazione - - // Scorro l'array dei campi, per vedere gli stati ed i gruppi - - TArray campi; - TAssoc_array gruppi; - - carica_dati_campi( "ve0300a.ini", campi ); - int last = campi.items( ); - for( i = 0; i < last; i ++ ) - { - TString nome = (( TField & )campi[ i ]).nome( ); - int stato = stato_del_campo( nome ); - if( stato != S_NASCOSTO ) - { - const int addgruppo = (( TField & )campi[ i ]).gruppo( ); - TString16 chiave; - chiave.format( "%5d", addgruppo ); - if ( !gruppi.is_key( chiave ) ) - gruppi.add( chiave, new TGruppo( addgruppo, _groupsini ) ); - } - (( TField & )campi[ i ]).stato( stato ); - }; - campi.sort( sort_by_group ); - - // Generazione vera e propria - _m->_pageopen = TRUE; - last = campi.items( ); - int curgruppo = 0; - for( i = 0; i < last; i ++ ) - { - if ( _m->_pageopen == FALSE) - { - intestazione_pagina( ); - _m->_pageopen = TRUE; - } - TField& campo = ( TField& ) campi[ i ]; - if ( campo.gruppo( ) != curgruppo ) - { - TString16 chiave; - chiave.format( "%5d", campo.gruppo( ) ); - if ( gruppi.is_key( chiave ) ) - { - TGruppo& gruppo = ( TGruppo& ) gruppi[ chiave ]; - if ( _m->line( ) + gruppo.height( ) > MAX_LINES_PER_PAGE ) - { - _m->end( ); - intestazione_pagina( ); - _m->line( MASK_FIRST_LINE ); - } - else - { - TString16 vecchiachiave; - vecchiachiave.format( "%5d", curgruppo ); - if ( gruppi.is_key( vecchiachiave ) ) - { - _m->line( _m->line( ) + ( ( TGruppo& ) gruppi[ vecchiachiave ]).height( ) ); - } - } - }; - curgruppo = campo.gruppo( ); - }; - campo.configura( *_pro ); - campo.genera( *_m ); - } - if ( _m->_pageopen == TRUE ) _m->end( ); - intestazione_pagina( ); - - // Generazione del listbox per i tipi di riga da aggiungere nello sheet - _m->control ( T_LISTA, F_LBTIPORIGA, 30 ); - _m->begin(); - _m->prompt( 2, 7, "Tipo riga da aggiungere " ); - _m->end( ); - - // Generazione dello sheet : vedi il profilo - TScanner sheet_in( "ve0300b.dat" ); - _m->_out << "SPREADSHEET " << F_SHEET << "\n"; - _m->begin(); - _m->prompt( 2, 8 ); - for( i = 0; i < _tab0300b.items( ); i ++ ) - genera_item_sheet( _tab0300b.row( i ) ); - _m->end(); - _m->end(); - - // Generazione pagina dei piedi - TToken_string s(_pro->get( "PROGPIEDE", "MAIN" ) ); - if ( s.not_empty() ) - { - intestazione_pagina( ); - int cp = 1; - int piede = s.get_int();; - while ( piede != 0 ) - { - _m->control( T_NUMERO, BASE_PIEDE + cp, 1805 ); - _m->begin(); - TString header = _ditta.get( "PIEDE", "ve", piede ); - while( header.len() < 40 ) header << " "; - _m->prompt( 2, 7 + cp, header ); - _m->flag( "D" ); - _m->end(); - cp ++; - piede = s.get_int(); - } - _m->end(); - }; - _m->endmask( ); - - // Stategia al 30/06/95 - // Creo una maschera con tutte le colonne, poi, a RUNTIME, - // dal motore, nascondo e adatto le colonne. - - // Generazione maschera dello sheet - _m->_out << "PA \"Pagina 1\" 8 5 64 13\n"; - - id( 101 ); - for( i = 0; i < _tab0300b.items( ); i ++ ) - genera_campo_sheet( _tab0300b.row( i ) ); - _m->end(); - _m->end(); - _m->endmask( ); -} - - -// Applicazione guscio - -class TGenMask_application : public TApplication -{ - -protected: - - virtual bool create( ); - virtual bool menu( MENU_TAG _m ); - -}; - - -bool TGenMask_application::menu(MENU_TAG _m) -{ - TMask_generator a( argv( 2 ) ); - a.genera( ); - return( TRUE ); -}; - -bool TGenMask_application::create( ) -{ - TApplication::create(); - menu( 0 ); - return FALSE; -}; - -int ve0300( int argc, char** argv ) -{ - - if ( argc < 3 ) - fatal_box( "Sintassi: VE0 -3 " ); - - TGenMask_application a; - a.run ( argc, argv, "Generazione in corso ..." ); - return 0; -} +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + + "Compilatore di profili" per la gestione vendite. + Considerando: + - Profilo documento + - Configurazione vendite per la ditta + - Condizioni atmosferiche + genera le maschere appropriate. + Accetta sulla riga di comando il nome del profilo documento per cui deve generare + la maschera. Il nome del file .MSK viene dedotto dal profilo documento stesso. + + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef __CHECKS_H +#include +#endif + +#ifndef __FSTREAM_H +#include +#endif + +#ifndef __SCANNER_H +#include +#endif + +#ifndef __CONFIG_H +#include +#endif + +#ifndef __APPLICATION_H +#include +#endif + +#ifndef __UTILITY_H +#include +#endif + +#ifndef __DEFMASK_H +#include +#endif + +#ifndef __VE0100_H +#include "ve0100.h" +#endif + +#ifndef __VEUML_H +#include "veuml.h" +#endif + +#ifndef __LFFILES_H +#include "lffiles.h" +#endif + +#ifndef __VEINI_H +#include "veini.h" +#endif + +// Significato delle colonne nella tabella _tab0300b +#define B_NOME 0 +#define B_MSKTYPE 1 +#define B_MSKSIZE 2 +#define B_DESCR 3 +#define B_WIDTH 4 + +// Significato dei campi nel profilo del documento +#define P_STATO 0 +#define P_PROMPT 1 +#define P_HELP 2 +#define P_WARNING 3 + + +// Numero massimo di linee per pagina + +#define MAX_LINES_PER_PAGE 16 +#define MASK_FIRST_LINE 6 + +class TMaschera : public TObject +{ + +private: + + // Linea corrente + int _curline; + + // Pagina corrente + int _curpage; + +public: + + void advance_line( ){ _curline ++; }; + + // Genera una serie di righe uguali per funzione ( DISPLAY, ecc. ) + void outline( const TString& s = "", const TString& prefix = "", const char sep = '~' ); + + // Crea un controllo del tipo specificato + void control( const int type, const int id = DLG_NULL, const int size = -1 ); + + // CHECKTYPE + void check( const int i ); + + // PAGE + void pagina( const int i ){ _out << "PA \"Pagina " << i << "\" 11 60 14\n"; }; + + // PROMPT + void prompt( const int x, const int y, const TString& s = "" ){ _out << "PR " << x << " " << y << " \"" << s << "\"\n"; }; + + // BEGIN + void begin( void ) { outline ( "BE" ); }; + + // END + void end( void ) { outline ( "EN" ); }; + + // ENDMASK + void endmask( void ) { outline ( "ENDMASK" ); }; + + // FLAG + void flag( const TString& s ) { _out << "FLAG \"" << s << "\"\n"; }; + + // HELP + void help( const TString& s ) { _out << "HE \"" << s << "\"\n"; }; + + // WARNING + void warning( const TString& s ) { _out << "WA \"" << s << "\"\n"; }; + + // GROUP + void group( const int g ) { _out << "GR " << g << "\n"; }; + + // FIELD + void field( const TString& s ) { outline( s, "FI "); }; + + // ITEM + void item( const TString& s ); + + // MESSAGE + void message( const TString& s ) { outline( s, "ME "); }; + + // USE + void use( const TString& s ){ outline( s, "US " ); }; + void use( const int file, const int key ){ _out << "US " << file << " KEY " << key << "\n"; }; + + // DISPLAY + void display( const TString& s ){ outline( s, "DI " ); }; + + // INPUT + void input( const TString& s ){ outline( s, "IN " ); }; + + // OUTPUT + void output( const TString& s ){ outline( s, "OU " ); }; + + // Funzioni per la lettura/scrittura di CURPAGE + int page( ) { return _curpage; }; + void page( const int i ){ _curpage = i; }; + + // Funzioni per la lettura/scrittura di CURLINE + int line( ) { return _curline; }; + void line( const int i ){ _curline = i; }; + + // Costruttore, vuole il nome del file .INI + TMaschera( const TFilename outfile ); + + // Vero se la pagina è aperta + bool _pageopen; + + // File .MSK di output + ofstream _out; + + +}; + + +TMaschera::TMaschera( const TFilename outfile ) : _out( outfile ) +{ + _curline = 1; + _curpage = 1; + _pageopen = FALSE; + bool _groupopen = FALSE; +} + +void TMaschera::outline( const TString& s, const TString& prefix, const char sep ) +{ + if ( s.left( 1 ) == "@" ) + _out << "CO " << prefix << s.mid( 1 ) << "\n"; + else + { TToken_string u( s, sep ); + for ( int i = 0; i < u.items(); i ++ ) + _out << prefix << u.get( i ) << "\n"; + } +} + +void TMaschera::check( const int i ) +{ + switch( i ) + { + case S_OBBLIGATORIO: + outline ( "CH REQUIRED" ); + break; + default: + outline ( "CH NORMAL" ); + break; + } +} + +void TMaschera::control( const int type, const int id, const int size ) +{ + switch ( type ) + { + case T_DATA: + _out << "DA"; + break; + case T_STRINGA: + _out << "ST"; + break; + case T_CHECKBOX: + _out << "BO"; + break; + case T_NUMERO: + _out << "NU"; + break; + case T_LISTA: + _out << "LI"; + break; + case T_MEMO: + _out << "ME"; + break; + case T_CORNICE: + _out << "GR"; + break; + case T_BOTTONE: + _out << "BU"; + break; + } + _out << " " << id; + if ( size > 0 ) + { + if ( size > 100 ) + _out << " " << ( int )( size / 100 ) << " " << ( size % 100 ); + else + _out << " " << size; + } + _out << "\n"; +} + +void TMaschera::item( const TString& str ) +{ + int i, j; + TToken_string u( str, '@' ); + TToken_string s; + + for( i = 0; i < u.items(); i ++ ) + { + _out << "IT \"" << s[ 0 ] << "\"\n"; + for( j = 1; j < s.items(); j ++ ) + _out << "ME " << s[ j ] << "\n"; + } +} + +class TGruppo : public TObject +{ +protected: + + int _id; + int _height; + bool _present; + +public: + + void id( int id ){ _id = id; } + int id( ){ return _id; } + void height( int h ){ _height = h; } + int height( ){ return _height; } + void present( bool p ){ _present = p; } + bool present( ){ return _present; } + + TGruppo ( int i ); + TGruppo ( int i, TConfig& pro ); +}; + +TGruppo::TGruppo( int i ) +{ + TConfig pro( "ve0300c.ini" ); + _id = i; + _height = pro.get_int( "HEIGHT", format( "%d", i ) ); +}; + +TGruppo::TGruppo( int i, TConfig& pro ) +{ + _id = i; + _height = pro.get_int( "HEIGHT", format( "%d", i ) ); +}; + +class TField : public TObject +{ +protected: + + TString _nome; + int _gruppo; + int _id; + int _type; + int _size; + int _stato; + int _x, _y; + TString _prompt, _flag, _help, _warning, _fieldname; + TToken_string _use, _input, _display, _output, _special, _items, _configs; + +public: + + TField( TString& campo, TConfig& pro ); + TField( ); + + void genera( TMaschera& _m ); + void configura( TConfig& pro ); + + void x( int x ){ _x = x; } + void y( int y ){ _y = y; } + void gruppo( int gruppo ){ _gruppo = gruppo; } + void id( int id ){ _id = id; } + void type( int type ){ _type = type; } + void size( int size ){ _size = size; } + void stato( int stato ){ _stato = stato; } + int x( ){ return _x; } + int y( ){ return _y; } + int gruppo( ){ return _gruppo; } + int id( ){ return _id; } + int type( ){ return _type; } + int size( ){ return _size; } + int stato( ){ return _stato; } + + + void nome( TString& nome ){ _nome = nome; } + void prompt( TString& prompt ){ _prompt = prompt; } + void flag( TString& flag ){ _flag = flag; } + void help( TString& help ){ _help = help; } + void warning( TString& warning ){ _warning = warning; } + void fieldname( TString& fieldname ){ _fieldname = fieldname; } + TString& nome( ){ return _nome; } + TString& prompt( ){ return _prompt; } + TString& flag( ){ return _flag; } + TString& help( ){ return _help; } + TString& warning( ){ return _warning; } + TString& fieldname( ){ return _fieldname; } + + void use( TToken_string& use ){ _use = use; } + void input( TToken_string& input ){ _input = input; } + void display( TToken_string& display ){ _display = display; } + void output( TToken_string& output ){ _output = output; } + void special( TToken_string& special ){ _special = special; } + void items( TToken_string& items ){ _items = items; } + void configs( TToken_string& configs ){ _configs = configs; } + TToken_string& use( ){ return _use; } + TToken_string& input( ){ return _input; } + TToken_string& display( ){ return _display; } + TToken_string& output( ){ return _output; } + TToken_string& special( ){ return _special; } + TToken_string& items( ){ return _items; } + TToken_string& configs( ){ return _configs; } + + + friend int sort_by_group(const TObject** o1, const TObject** o2 ); + // friend int TMask_generator::group( const TField& f1 ); +}; + +int sort_by_group(const TObject** o1, const TObject** o2 ) +{ + int g1 = ((TField * )( *o1 ))->_gruppo; + int g2 = ((TField * )( *o2 ))->_gruppo; + return ( g1 < g2 ) ? -1 : ( ( g1 = g2 ) ? 0 : 1 ); +}; + +TField::TField( TString& campo, TConfig& pro ) : _nome( campo ) +{ + _nome.trim( ); + _fieldname = pro.get( "FIELDNAME", campo ); + _x = _gruppo = pro.get_int( "X", campo ); + _y = _gruppo = pro.get_int( "Y", campo ); + _gruppo = pro.get_int( "GROUP", campo ); + CHECK( _gruppo != 0, "Gruppo uguale a 0" ); + _id = pro.get_int( "MSKID", campo ); + CHECK( _id != 0, "Campo con MSKID uguale a 0" ); + _type = pro.get_int( "TYPE", campo ); + _size = pro.get_int( "SIZE", campo ); + _prompt = pro.get( "PROMPT", campo ); + if( _prompt[ 0 ] == '\"' ) + { + _prompt.ltrim( 1 ); + _prompt.rtrim( 1 ); + }; + _flag = pro.get( "FLAG", campo ); + _help = pro.get( "FLAG", campo ); + _warning = pro.get( "FLAG", campo ); + _use = pro.get( "USE", campo ); + _use.separator( '~' ); + _input = pro.get( "INPUT", campo ); + _input.separator( '~' ); + _display = pro.get( "DISPLAY", campo ); + _display.separator( '~' ); + _output = pro.get( "OUTPUT", campo ); + _output.separator( '~' ); + _special = pro.get( "SPECIAL", campo ); + _special.separator( '~' ); + _configs = pro.get( "CONFIGS", campo ); + _configs.separator( '~' ); + _items = ""; + int last = pro.get_int( "NITEMS", campo ); + for( int i = 1; i <= last; i ++ ) + _items.add( pro.get( "ITEM", campo, i ) ); +}; + +TField::TField( ) +{ + _nome = ""; + _fieldname = ""; + _x = 0; + _y = 0; + _gruppo = 0; + _id = 0; + _type = 0; + _size = 0; + _prompt = ""; + _flag = ""; + _help = ""; + _warning = ""; + _use = ""; + _use.separator( '~' ); + _input = ""; + _input.separator( '~' ); + _display = ""; + _display.separator( '~' ); + _output = ""; + _output.separator( '~' ); + _special = ""; + _special.separator( '~' ); + _configs = ""; + _configs.separator( '~' ); + _items = ""; + _items.separator( '@' ); +} + +void TField::configura( TConfig& pro ) +{ + TToken_string riga_profilo( pro.get( _nome, "PROFILO" ) ); + TString newprompt( riga_profilo.get( P_PROMPT ) ) ; + TString newhelp( riga_profilo.get( P_HELP ) ) ; + TString newwarning( riga_profilo.get( P_WARNING ) ) ; + if ( ! newprompt.blank( ) ) + _prompt = newprompt; + if ( ! newhelp.blank( ) ) + _help = newhelp; + if ( ! newwarning.blank( ) ) + _warning = newwarning; +} + +void TField::genera( TMaschera& m ) +{ + TString s; + + if ( _stato == S_NASCOSTO ) + return; + if ( _size != 0 ) + m.control( _type, _id, _size ); + else + m.control( _type, _id ); + m.begin(); + switch( _stato ) + { + case S_DISABILITATO : + m.prompt( _x, _y + m.line( ), _prompt ); + s = "D"; + s << _flag; + m.flag( s ) ; + break; + case S_NORMALE : + case S_OBBLIGATORIO : + m.prompt( _x, _y + m.line( ), _prompt ); + m.flag( _flag ); + break; + } + m.check( _stato ); + if ( !_fieldname.blank( ) ) m.field( _fieldname ); + if ( !_items.blank( ) ) m.item( _items ); + if ( !_use.blank( ) ) m.use( _use ); + if ( !_input.blank( ) ) m.input( _input ); + if ( !_display.blank( ) ) m.display( _display ); + if ( !_output.blank( ) ) m.output( _output ); + if ( !_help.blank( ) ) m.help( _help ); + if ( !_warning.blank( ) ) m.warning( _warning ); + if ( !_special.blank( ) ) m.outline( _special ); + m.end(); + if ( ( m.line() > MAX_LINES_PER_PAGE ) && ( m._pageopen == TRUE)) + { + m.end(); + m._pageopen = FALSE; + m.line( MASK_FIRST_LINE ); + } +} + + +class TMask_generator +{ + +private: + + // Identificatore corrente per lo sheet + int _curid; + + // vero se il gruppo è aperto + bool _groupopen; + + // nome del file di .INI di input + TFilename _proname; + + // File .INI di riferimento per i campi + TConfig _fieldsini; + + // File .INI di riferimento per i gruppi + TConfig _groupsini; + + // File .INI di input + TConfig* _pro; + + TConfig _ditta; + + // Tabelle per la generazione + + // Campi dei documenti + TString_array _fields; + + // Campi dello sheet + TString_array _tab0300b; + +protected: + + // Carica un file di tabella in un TString array + void carica_tabella( const TFilename& fn, TString_array& tabella ); + + // Scrive sul file di output una serie di righe uguali per funzione ( DISPLAY, ecc. ) + void outline( const TString& s = "", const TString& prefix = "", const char sep = '~' ); + + + // Crea un controllo del tipo specificato + void control( const int type, const int id = DLG_NULL, const int size = -1 ); + + // Ritorna vero se una componente della maschera è presente + int present( const int i, TToken_string line ){ const TString s = line.get( i ); return !(s.blank( )); }; + + // Carica dati dei campi + void carica_dati_campi( const TFilename& fn, TArray& a ); + + // Funzioni di accesso alle variabili private + // ------------------------------------------ + + // Funzioni per la lettura/scrittura di ID. Si incrementa da solo. + int id ( ) { return( _curid++ ); }; + void id( const int i ){ _curid = i; }; + + + // Funzioni di generazione ad alto livello + // --------------------------------------- + + // Genera un campo a partire da una linea del file VE0300A.DAT + void genera_campo( TToken_string _line ); + + // Genera un campo dello sheet a partire da una linea del file VE0300B.DAT + void genera_campo_sheet( TToken_string _line ); + + + // Genera la colonna dello sheet a partire da una linea del file VE0300B.DAT + void genera_item_sheet( TToken_string _line ); + + // Genera l'intestazione di una pagina ( non la prima ) + void intestazione_pagina( ); + + // Ritorna lo stato che dovrà avere il campo sulla maschera da generare + int stato_del_campo( TString campo ); + +public: + + TMaschera * _m; + + // Costruttore, vuole il nome del file .INI + TMask_generator( const TString& profilo ); + + // Attiva la generazione della maschera + void genera( ); + + // Distruttore + virtual ~TMask_generator( ); + +}; + +// Definizione dei metodi di TMask_generator +// ----------------------------------------- + +TMask_generator::TMask_generator( const TString& profilo ) : _proname( profilo ), _fieldsini( "ve0300a.ini" ), _groupsini( "ve0300c.ini" ), _ditta( CONFIG_DITTA ) +{ + // All'inizio il gruppo è 'chiuso' + _groupopen = FALSE; + + // Forza l'estensione al profilo + _proname.ext( "ini" ); + + // Se il file di profilo non esiste, esci con un errore fatale + if ( !fexist( _proname ) ) + fatal_box( "Il file %s non esiste!", ( const char * )_proname ); + + CHECK( fexist( "ve0300a.ini" ), "Il file ve0300a.ini non esiste!" ); + _fieldsini.list_paragraphs( _fields ); + CHECK( fexist( "ve0300b.dat" ), "Il file ve0300b.dat non esiste!" ); + carica_tabella( "ve0300b.dat", _tab0300b ); + + _pro = new TConfig( _proname ); + + TFilename _mskname( _pro->get( "MSKFILE", "MAIN") ); + _mskname.ext( "msk" ); + + + _m = new TMaschera( _mskname ); + +}; + +TMask_generator::~TMask_generator( ) +{ + delete _m; + delete _pro; +}; + + +void TMask_generator::carica_dati_campi( const TFilename& fn, TArray& a ) +{ + TScanner infile( fn ); + TString line; + TField *campo = NULL; + + while ( infile.ok( ) ) + { + line = infile.line( ); + line.trim( ); + while ( ( line.empty() || line[ 0 ] == '#' || line.left( 2 ) == "//" ) && infile.ok( ) ) + { + line = infile.line( ); + line.trim(); + } + if( infile.ok( ) ) + { + if ( line[ 0 ] == '[' ) // Carica un un campo + { + line.strip( "[]" ); + if ( campo ) + a.add( campo ); + campo = new TField(); + campo->nome( line ); + } + else + { + int pos; + if( ( pos = line.find( '=' ) ) == 0 ) + yesnofatal_box( "Linea errata nel file.INI: %s", (const char *) line ); + else + { + TString key = line.sub( 0, pos ); + key.trim(); + TString value = line.mid( pos + 1 ); + value.trim(); + if( key == "X" ) + campo->x( atoi( value ) ); + else if( key == "Y" ) + campo->y( atoi( value ) ); + else if( key == "GROUP" ) + campo->gruppo( atoi( value ) ); + else if( key == "FIELDNAME" ) + campo->fieldname( value ); + else if( key == "MSKID" ) + campo->id( atoi( value ) ); + else if( key == "TYPE" ) + campo->type( atoi( value ) ); + else if( key == "SIZE" ) + campo->size( atoi( value ) ); + else if( key == "PROMPT" ) + { + if( value[ 0 ] == '"' ) + { + value.rtrim( 1 ); + value.ltrim( 1 ); + }; + campo->prompt( value ); + } + else if( key == "FLAG" ) + campo->flag( value ); + else if( key == "USE" ) + campo->use( (TToken_string & ) value ); + else if( key == "INPUT" ) + campo->input( (TToken_string & )value ); + else if( key == "DISPLAY" ) + campo->display( (TToken_string & )value ); + else if( key == "OUTPUT" ) + campo->output( (TToken_string & )value ); + else if( key == "WARNING" ) + campo->warning( value ); + else if( key == "HELP" ) + campo->help( value ); + else if( key == "SPECIAL" ) + campo->special( (TToken_string & )value ); + else if( key == "ITEMS" ) + campo->items( (TToken_string & )value ); + else if( key == "CONFIGS" ) + campo->configs( (TToken_string & )value ); + else yesnofatal_box( "Chiave non trovata(%s)", (const char *) key ); + } + } + } + } + if ( campo ) + a.add( campo ); +} + +void TMask_generator::carica_tabella( const TFilename& fn, TString_array& tabella ) +{ TScanner in( fn ); + TToken_string line = in.line(); + while( line.not_empty( ) ) + { // Attacca tutte le righe che finiscono con § + while ( line.right( 1 ) == "§" ) + { line.rtrim( 1 ); + line << in.line( ); + }; + tabella.add( line ); + line = in.line(); + } +}; + +int TMask_generator::stato_del_campo( TString campo ) +{ + // Strategia al 28/08/95 + // Se il campo, nel file .INI di definizione dei campi, è legato a qualche voce in + // configurazione, legge il suo stato, altrimenti assume il massimo. + // Va poi a verificare nel .INI da compilare, e verifica li' la impostazione. + // Controlla poi la impostazione per il gruppo, come impostato nel file .INI + // e nella sezione CONFIGS nel .INI di defiunizione dei gruppi. + // Utilizza poi la minore delle due. + TToken_string config( _fieldsini.get( "CONFIGS", campo ) ); + int items = config.items( ); + int stato = S_OBBLIGATORIO; + for ( int i = 0; i < items; i += 3 ) + { TString chiave = config[ i ]; + TString valore = config[ i + 1 ]; + TString reale = _ditta.get( chiave, "VE" ); + if ( reale == valore ) + stato = atoi( ( char * ) config[ i + 2 ] ); + }; + TToken_string riga_profilo( _pro->get( campo, "PROFILO" ) ); + int stato_profilo = riga_profilo.get_int( P_STATO ); + stato = ( stato < stato_profilo )? stato : stato_profilo; + TString gruppo ( _fieldsini.get( "GROUP", campo ) ); + gruppo.trim( ); + config = ( _groupsini.get( "CONFIGS", gruppo ) ); + int stato_gruppo = S_OBBLIGATORIO; + for ( i = 0; i < items; i += 3 ) + { TString chiave = config[ i ]; + TString valore = config[ i + 1 ]; + TString reale = _ditta.get( chiave, "VE" ); + if ( reale == valore ) + stato_gruppo = atoi( ( char * ) config[ i + 2 ] ); + }; + stato = ( stato < stato_gruppo )? stato : stato_gruppo; + int stato_gruppo_profilo = _pro->get_int( gruppo, "PROFILOGRUPPO" ); + stato = ( stato < stato_gruppo_profilo )? stato : stato_gruppo_profilo; + return stato; + +} + +void TMask_generator::genera_campo_sheet( TToken_string _line ) +{ + const int type( _line.get_int( B_MSKTYPE ) ); + _m->control( type, id( ), _line.get_int( B_MSKSIZE ) ); + _m->begin( ); + _m->prompt( 2, 2 ); + _m->field( _line.get( B_NOME ) ); + _m->end( ); +} + +void TMask_generator::genera_item_sheet( TToken_string _line ) +{ + _m->_out << "IT \"" << _line.get( B_DESCR ); + _m->_out << "@" << _line.get_int( B_WIDTH ) << "\"\n"; +} + +void TMask_generator::intestazione_pagina( ) +{ + _m->page( _m->page( ) + 1 ); + _m->pagina( _m->page( ) ); + + _m->control( T_CORNICE, DLG_NULL, 7806 ); + _m->begin( ); + _m->prompt( 1, 0, "" ); + _m->end( ); + + _m->control( T_STRINGA, DLG_NULL, 4 ); + _m->begin(); + _m->prompt( 2, 1, "Cod. num. " ); + _m->group( 2 ); + _m->flag( "DUZ" ); + _m->end(); + + _m->control( T_STRINGA, DLG_NULL, 50 ); + _m->begin(); + _m->prompt( 24, 1 ); + _m->flag( "DU" ); + _m->group( 3 ); + _m->end(); + + _m->control( T_STRINGA, DLG_NULL, 4 ); + _m->begin(); + _m->prompt( 2, 2, "Tipo doc. " ); + _m->flag( "DU" ); + _m->group( 4 ); + _m->end(); + + _m->control( T_STRINGA, DLG_NULL, 50 ); + _m->begin(); + _m->prompt( 24, 2 ); + _m->flag( "DU" ); + _m->group( 5 ); + _m->end(); + + _m->control( T_NUMERO, DLG_NULL, 6 ); + _m->begin(); + _m->prompt( 2, 3, "Doc.: nr. " ); + _m->group( 6 ); + _m->flag( "D" ); + _m->end(); + + _m->control( T_DATA ); + _m->begin(); + _m->prompt( 24, 3, "Data " ); + _m->group( 7 ); + _m->flag( "D" ); + _m->end(); + + _m->control( T_NUMERO, DLG_NULL, 1 ); + _m->begin(); + _m->prompt( 50, 3, "Stato " ); + _m->group( 8 ); + _m->flag( "D" ); + _m->end(); + + _m->control( T_STRINGA, DLG_NULL, 4 ); + _m->begin(); + _m->prompt( 66, 3, "Es. " ); + _m->flag( "D" ); + _m->group( 9 ); + _m->end(); + + _m->control( T_STRINGA, DLG_NULL, 6 ); + _m->begin(); + if ( _pro->get( "TIPOCF", "MAIN" ) == "C" ) + _m->prompt( 2, 4, "Cliente " ); + else + _m->prompt( 2, 4, "Fornitore " ); + _m->flag( "D" ); + _m->group( 10 ); + _m->end(); + + _m->control( T_STRINGA, DLG_NULL, 50 ); + _m->begin(); + _m->prompt( 24, 4, "" ); + _m->flag( "D" ); + _m->group( 11 ); + _m->end(); + +} + +void TMask_generator::genera( ) +{ + int i; + TString temp_s; + + + // Definizione della toolbar + + + _m->outline( "TOOLBAR \"\" 0 20 0 2" ); + + _m->control( T_BOTTONE, 18, 802 ); + _m->begin(); + _m->prompt( -15, -1, "~Registra" ); + _m->message( "EXIT,20082" ); + _m->end(); + + _m->control( T_BOTTONE, 17, 802 ); + _m->begin(); + _m->prompt( -25, -1, "~Elimina" ); + _m->message( "EXIT,127" ); + _m->end(); + + _m->control( T_BOTTONE, 99, 802 ); + _m->begin(); + _m->prompt( -35, -1, "E~labora" ); + _m->message( "EXIT,345" ); + _m->end(); + + _m->control( T_BOTTONE, 24, 802 ); + _m->begin(); + _m->prompt( -45, -1 ); + _m->message( "EXIT,346" ); + _m->end(); + + _m->control( T_BOTTONE, 2, 802 ); + _m->begin(); + _m->prompt( -55, -1 ); + _m->message( "EXIT,27" ); + _m->end(); + + // End della toolbar + _m->end(); + + + // Header della prima pagina + + _m->outline( "PA \"Pagina \" 11 60 14" ); + + _m->control( T_CORNICE, DLG_NULL, 7806 ); + _m->begin( ); + _m->prompt( 1, 0, "" ); + _m->end( ); + + _m->control( T_STRINGA, F_CODNUM, 4 ); + _m->begin(); + _m->prompt( 2, 1, "Cod. num. " ); + _m->field( "CODNUM" ); + _m->flag( "GDUZ" ); + _m->message( "CO,2@" ); + _m->end(); + + _m->control( T_STRINGA, F_DESNUM, 50 ); + _m->begin(); + _m->prompt( 24, 1 ); + _m->flag( "GDU" ); + _m->message( "CO,3@" ); + _m->end(); + + _m->control( T_STRINGA, F_TIPODOC, 4 ); + _m->begin(); + _m->prompt( 2, 2, "Tipo doc. " ); + _m->flag( "GDU" ); + _m->message( "CO,4@" ); + _m->end(); + + _m->control( T_STRINGA, F_TIPOCF, 1 ); + _m->begin(); + _m->prompt( 2, 2, "Tipo CF " ); + _m->field( "TIPOCF" ); + _m->flag( "H" ); + _m->end(); + + _m->control( T_STRINGA, F_PROVV, 1 ); + _m->begin(); + _m->prompt( 2, 2, "

" ); + _m->field( "PROVV" ); + _m->flag( "H" ); + _m->end(); + + + _m->control( T_STRINGA, F_DESTIPODOC, 50 ); + _m->begin(); + _m->prompt( 24, 2 ); + _m->flag( "GDU" ); + _m->message( "CO,5@" ); + _m->end(); + + _m->control( T_NUMERO, F_NDOC, 6 ); + _m->begin(); + _m->prompt( 2, 3, "Doc.: nr. " ); + _m->field( "NDOC" ); + _m->message( "CO,6@" ); + _m->flag( "GDR" ); + _m->end(); + + _m->control( T_DATA, F_DATADOC ); + _m->begin(); + _m->prompt( 24, 3, "Data " ); + _m->field( "DATADOC" ); + _m->message( "CO,7@" ); + _m->flag( "A" ); + _m->end(); + + _m->control( T_NUMERO, F_STATO, 1 ); + _m->begin(); + _m->prompt( 50, 3, "Stato " ); + _m->field( "STATO" ); + _m->message( "CO,8@" ); + _m->flag( "D" ); + _m->end(); + + _m->control( T_STRINGA, F_ANNO, 4 ); + _m->begin(); + _m->prompt( 66, 3, "Es. " ); + _m->field( "ANNO" ); + _m->flag( "GD" ); + _m->message( "CO,9@" ); + _m->end(); + + _m->control( T_STRINGA, F_CODCF, 6 ); + _m->begin(); + if ( _pro->get( "TIPOCF", "MAIN" ) == "C" ) + { + _m->prompt( 2, 4, "Cliente " ); + _m->warning( "Cliente assente" ); + _m->help( "Codice del cliente del documento" ); + + } + else + { + _m->prompt( 2, 4, "Fornitore " ); + _m->warning( "Fornitore assente" ); + _m->help( "Codice del fornitore del documento" ); + } + _m->flag( "R" ); + _m->field( "CODCF" ); + _m->group( 1 ); + _m->use( LF_CLIFO, 1 ); + temp_s.format( "TIPOCF \"C\"~CODCF %d", F_CODCF); + _m->input( temp_s ); + _m->display( "\"Codice\" CODCF~\"Ragione Sociale@50\" RAGSOC~\"Partita IVA@12\" PAIV~\"Sospeso\" SOSPESO" ); + temp_s.format( "%d CODCF~%d RAGSOC", F_CODCF, F_DESCF ); + _m->output( temp_s ); + _m->check( S_OBBLIGATORIO ); + _m->outline( "ADD RU cg0 -1 C" ); + _m->end(); + + _m->control( T_STRINGA, F_DESCF, 50 ); + _m->begin( ); + if ( _pro->get( "TIPOCF", "MAIN" ) == "C" ) + { + _m->warning( "Cliente assente" ); + _m->help( "Ragione sociale del cliente del documento" ); + + } + else + { + _m->warning( "Fornitore assente" ); + _m->help( "Ragione sociale del fornitore del documento" ); + } + _m->prompt( 24, 4, "" ); + _m->group( 1 ); + _m->use( LF_CLIFO, 2 ); + temp_s.format( "TIPOCF \"C\"~RAGSOC %d", F_DESCF); + _m->input( temp_s ); + _m->display( "\"Ragione Sociale@50\" RAGSOC~\"Partita IVA@12\" PAIV~\"Codice\" CODCF" ); + temp_s.format( "%d CODCF~%d RAGSOC", F_CODCF, F_DESCF ); + _m->output( temp_s ); + _m->check( S_OBBLIGATORIO ); + _m->outline( "ADD RU cg0 -1 C" ); + _m->end(); + _m->line( MASK_FIRST_LINE ); + + // Generazione + + // Scorro l'array dei campi, per vedere gli stati ed i gruppi + + TArray campi; + TAssoc_array gruppi; + + carica_dati_campi( "ve0300a.ini", campi ); + int last = campi.items( ); + for( i = 0; i < last; i ++ ) + { + TString nome = (( TField & )campi[ i ]).nome( ); + int stato = stato_del_campo( nome ); + if( stato != S_NASCOSTO ) + { + const int addgruppo = (( TField & )campi[ i ]).gruppo( ); + TString16 chiave; + chiave.format( "%5d", addgruppo ); + if ( !gruppi.is_key( chiave ) ) + gruppi.add( chiave, new TGruppo( addgruppo, _groupsini ) ); + } + (( TField & )campi[ i ]).stato( stato ); + }; + campi.sort( sort_by_group ); + + // Generazione vera e propria + _m->_pageopen = TRUE; + last = campi.items( ); + int curgruppo = 0; + for( i = 0; i < last; i ++ ) + { + if ( _m->_pageopen == FALSE) + { + intestazione_pagina( ); + _m->_pageopen = TRUE; + } + TField& campo = ( TField& ) campi[ i ]; + if ( campo.gruppo( ) != curgruppo ) + { + TString16 chiave; + chiave.format( "%5d", campo.gruppo( ) ); + if ( gruppi.is_key( chiave ) ) + { + TGruppo& gruppo = ( TGruppo& ) gruppi[ chiave ]; + if ( _m->line( ) + gruppo.height( ) > MAX_LINES_PER_PAGE ) + { + _m->end( ); + intestazione_pagina( ); + _m->line( MASK_FIRST_LINE ); + } + else + { + TString16 vecchiachiave; + vecchiachiave.format( "%5d", curgruppo ); + if ( gruppi.is_key( vecchiachiave ) ) + { + _m->line( _m->line( ) + ( ( TGruppo& ) gruppi[ vecchiachiave ]).height( ) ); + } + } + }; + curgruppo = campo.gruppo( ); + }; + campo.configura( *_pro ); + campo.genera( *_m ); + } + if ( _m->_pageopen == TRUE ) _m->end( ); + intestazione_pagina( ); + + // Generazione del listbox per i tipi di riga da aggiungere nello sheet + _m->control ( T_LISTA, F_LBTIPORIGA, 30 ); + _m->begin(); + _m->prompt( 2, 7, "Tipo riga da aggiungere " ); + _m->end( ); + + // Generazione dello sheet : vedi il profilo + TScanner sheet_in( "ve0300b.dat" ); + _m->_out << "SPREADSHEET " << F_SHEET << "\n"; + _m->begin(); + _m->prompt( 2, 8 ); + for( i = 0; i < _tab0300b.items( ); i ++ ) + genera_item_sheet( _tab0300b.row( i ) ); + _m->end(); + _m->end(); + + // Generazione pagina dei piedi + TToken_string s(_pro->get( "PROGPIEDE", "MAIN" ) ); + if ( s.not_empty() ) + { + intestazione_pagina( ); + int cp = 1; + int piede = s.get_int();; + while ( piede != 0 ) + { + _m->control( T_NUMERO, BASE_PIEDE + cp, 1805 ); + _m->begin(); + TString header = _ditta.get( "PIEDE", "ve", piede ); + while( header.len() < 40 ) header << " "; + _m->prompt( 2, 7 + cp, header ); + _m->flag( "D" ); + _m->end(); + cp ++; + piede = s.get_int(); + } + _m->end(); + }; + _m->endmask( ); + + // Stategia al 30/06/95 + // Creo una maschera con tutte le colonne, poi, a RUNTIME, + // dal motore, nascondo e adatto le colonne. + + // Generazione maschera dello sheet + _m->_out << "PA \"Pagina 1\" 8 5 64 13\n"; + + id( 101 ); + for( i = 0; i < _tab0300b.items( ); i ++ ) + genera_campo_sheet( _tab0300b.row( i ) ); + _m->end(); + _m->end(); + _m->endmask( ); +} + + +// Applicazione guscio + +class TGenMask_application : public TApplication +{ + +protected: + + virtual bool create( ); + virtual bool menu( MENU_TAG _m ); + +}; + + +bool TGenMask_application::menu(MENU_TAG _m) +{ + TMask_generator a( argv( 2 ) ); + a.genera( ); + return( TRUE ); +}; + +bool TGenMask_application::create( ) +{ + TApplication::create(); + menu( 0 ); + return FALSE; +}; + +int ve0300( int argc, char** argv ) +{ + + if ( argc < 3 ) + fatal_box( "Sintassi: VE0 -3 " ); + + TGenMask_application a; + a.run ( argc, argv, "Generazione in corso ..." ); + return 0; +} diff --git a/ve/ve2200.cpp b/ve/ve2200.cpp index a6943688d..0e492e174 100755 --- a/ve/ve2200.cpp +++ b/ve/ve2200.cpp @@ -155,8 +155,8 @@ bool TCondizioni_vendita::handle_mask(TMask &m, KEY k) { appname << _condven; // aggiunge al lancio dell'applicazione la selezione del tipo di archivio TMessage msg(cmd2name(appname), MSG_FS, (const char *)body); // istanzia il messaggio per l'applicazione msg.send(); // invia il messaggio all'applicazione - TExternal_app ve2_3(appname); // istanzia l'applicazione esterna... - ve2_3.run(); // ...la lancia e rimane in attesa del suo termine + TExternal_app ve2_2(appname); // istanzia l'applicazione esterna... + ve2_2.run(); // ...la lancia e rimane in attesa del suo termine } return TRUE; } diff --git a/ve/ve2200x.uml b/ve/ve2200x.uml index f5bfe28f3..c36d43b10 100755 --- a/ve/ve2200x.uml +++ b/ve/ve2200x.uml @@ -125,13 +125,6 @@ BEGIN //FLAG "R" END -// bottone di lancio dell'applicazione delle righe -BUTTON BTN_RIGHE 63 1 -BEGIN - PROMPT 0 -1 "Editing delle righe di questa testata" - MESSAGE K_F5 -END - STRING F_DESCR 50 BEGIN PROMPT 2 7 "Descrizione " @@ -236,6 +229,13 @@ BEGIN CHECKTYPE NORMAL END +// bottone di lancio dell'applicazione delle righe +BUTTON BTN_RIGHE 63 1 +BEGIN + PROMPT 0 -1 "Editing delle righe di questa testata" + MESSAGE K_F5 +END + ENDPAGE ENDMASK diff --git a/ve/ve2300x.uml b/ve/ve2300x.uml index 5d34141a7..d53f68f54 100755 --- a/ve/ve2300x.uml +++ b/ve/ve2300x.uml @@ -62,7 +62,7 @@ STRING F_R_L_COD 3 // campo riservato ai listini BEGIN PROMPT 2 3 "Codice listino " FIELD LF_RCONDV->COD - FLAG "UP" + FLAG "UPG" KEY 1 USE LF_CONDV INPUT TIPO F_R_TIPO SELECT @@ -81,7 +81,7 @@ NUMBER F_R_C_COD 3 // campo riservato ai contratti BEGIN PROMPT 2 3 "Numero contratto " FIELD LF_RCONDV->COD - FLAG "P" + FLAG "PG" KEY 1 USE LF_CONDV INPUT TIPO F_R_TIPO SELECT @@ -103,7 +103,7 @@ STRING F_R_O_COD 3 // campo riservato alle offerte BEGIN PROMPT 2 2 "Codice offerta " FIELD LF_RCONDV->COD - FLAG "UP" + FLAG "UPG" KEY 1 USE LF_CONDV INPUT TIPO F_R_TIPO SELECT @@ -150,7 +150,7 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_R_CODRIGA_G CODTAB CHECKTYPE REQUIRED - MESSAGE COPY,F_CODRIGA_A + MESSAGE COPY,F_R_CODRIGA_A END STRING F_R_CODRIGA_R 20 @@ -164,7 +164,7 @@ BEGIN DISPLAY "Descrizione@50" S0 OUTPUT F_R_CODRIGA_R CODTAB CHECKTYPE REQUIRED - MESSAGE COPY,F_CODRIGA_A + MESSAGE COPY,F_R_CODRIGA_A END STRING F_R_NSCAGL 1 @@ -288,8 +288,8 @@ BOOLEAN F_R_ADDIVA BEGIN PROMPT 2 11 "Addebito IVA" FIELD LF_RCONDV->ADDIVA - MESSAGE TRUE ENABLE,F_CODIVA - MESSAGE FALSE DISABLE,F_CODIVA + MESSAGE TRUE ENABLE,F_R_CODIVA + MESSAGE FALSE DISABLE,F_R_CODIVA END STRING F_R_CODIVA 4 @@ -309,7 +309,7 @@ NUMBER F_R_PERCPROVV 5 2 BEGIN PROMPT 2 12 "Provvigione % " FIELD LF_RCONDV->PERCPROVV - NUM_EXPR (#F_PERCPROVV>=0)&&(#F_PERCPROVV<=100) + NUM_EXPR (#F_R_PERCPROVV>=0)&&(#F_R_PERCPROVV<=100) WARNING "La percentuale di provvigione deve essere compresa tra 0 e 100" END diff --git a/ve/ve3.cpp b/ve/ve3.cpp new file mode 100755 index 000000000..0a508d84c --- /dev/null +++ b/ve/ve3.cpp @@ -0,0 +1,24 @@ + +#include +#include + +//extern int ve3100(int argc, char* argv[]); // stampa tabelle sconti (di riga/di documento/incondizionati) +//extern int ve3200(int argc, char* argv[]); // stampa testate listini/contratti/offerte +//extern int ve3300(int argc, char* argv[]); // stampa righe listini/contratti/offerte +extern int ve3400(int argc, char* argv[]); // stampa anagrafica di magazzino + + + +int main( int argc, char** argv) { + int rt= -1; + const int r= (argc>1)?(atoi(&argv[1][1])):(-1); + + switch (r) { + //case 0: rt = ve3100(argc, argv); break; + //case 1: rt = ve3200(argc, argv); break; + //case 2: rt = ve3300(argc, argv); break; + case 3: rt = ve3400(argc, argv); break; + default: error_box("Sintassi: %s -[0 [R|D|I] | 1 [L|C|O] | 2 [L|C|O] | 3]", argv[0]); break; + } + return (rt); +} diff --git a/ve/ve3.h b/ve/ve3.h new file mode 100755 index 000000000..3f1db8f8e --- /dev/null +++ b/ve/ve3.h @@ -0,0 +1,17 @@ +#ifndef __VE2_H +#define __VE2_H + +#ifdef MAIN +#define extern +#endif + +int ve2100(int argc, char* argv[]); // Tabella testate listini e righe listini +int ve2200(int argc, char* argv[]); // Archivio contratti e righe contratti +int ve2300(int argc, char* argv[]); // Archivio indirizzo clienti + +#ifdef MAIN +#undef extern +#endif + +#endif + diff --git a/ve/ve3.url b/ve/ve3.url new file mode 100755 index 000000000..37aa69f18 --- /dev/null +++ b/ve/ve3.url @@ -0,0 +1,27 @@ +#include + +MENU TASK_MENUBAR + SUBMENU MENU_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + + +MENUBAR MENU_BAR(1) + +MENU MENU_BAR(1) + SUBMENU MENU_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + + +MENUBAR MENU_BAR(2) + +MENU MENU_BAR(2) + SUBMENU MENU_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + +MENUBAR MENU_BAR(3) + +MENU MENU_BAR(3) + SUBMENU MENU_FILE "~File" + ITEM BAR_ITEM(1) "~Parametri" + + diff --git a/ve/ve3400.cpp b/ve/ve3400.cpp new file mode 100755 index 000000000..b748fddeb --- /dev/null +++ b/ve/ve3400.cpp @@ -0,0 +1,236 @@ + +#include +#include +#include +#include + +#include "ve3400.h" + +#define GMC1 101 +#define GMC2 102 +#define GMC3 103 + +#define ANAMAG_APP "ve2 -3" + + + +int max3(int a, int b, int c) { // funzione che ritorna il massimo di tre valori + if (a>b) { + if (a>c) return a; // a>b & a>c -> abc | acb + else return c; // a>b & c>a -> cab + } else { + if (b>c) return b; // b>a & b>c -> bca | bac + else return c; // b>a & c>b -> cba + } +} + + + +class TStampa_anagrafica_magazzino: public TPrint_application { + TRelation *_rel; // relazione principale + TLocalisamfile *_umart, *_codcorr; // file per l'accesso a unità di misura articoli e codici corrispondenti + TRecord_array *_arr_umart, *_arr_codcorr; // record array per la lettura di u. m. articoli e codici corrisp. + bool _st_umart, _st_codcorr, _st_fisc; // booleano per la stampa condizionale di u. m. artic., cod. corrisp. e dati fisc. + int _anagr_link_id; // id del link ipertestuale all'anagrafica di magazzino +protected: + virtual bool user_create(void); + virtual bool user_destroy(void); + virtual bool set_print(int); + virtual void set_page(int, int); + virtual void preprocess_header(void); + virtual void process_link(int, const char *); +}; + + + +bool TStampa_anagrafica_magazzino::user_create() { + _rel= new TRelation(LF_ANAGR); // crea la relazione principale + _rel->add("%GMC", "CODTAB==GRMERC1", 1, 0, GMC1); // aggancia la tabella Gruppi Merceologici al primo campo GRMERC1 + _rel->add("%GMC", "CODTAB==GRMERC2", 1, 0, GMC2); // aggancia la tabella Gruppi Merceologici al secondo campo GRMERC2 + _rel->add("%GMC", "CODTAB==GRMERC3", 1, 0, GMC3); // aggancia la tabella Gruppi Merceologici al terzo campo GRMERC3 + _rel->add(LF_UMART, "CODART==CODART"); // aggancia il file con le unità di misura dell'articolo + _rel->add(LF_CODCORR, "CODART==CODART"); // aggancia il file con i codici corrispondenti + _rel->add(LF_CLIFO, "TIPOCF==\"F\"|CODCF==CODFORN"); // aggancia il file clienti/fornitori + _arr_umart= _arr_codcorr= NULL; // annulla file e record array su unità di misura articoli e codici corrispondenti + _umart= _codcorr= NULL; + add_cursor(new TCursor(_rel)); // costruisce il cursore sulla relazione e lo passa alla stampa + add_file(LF_ANAGR); // notifica il file principale alla stampa + enable_print_menu(); // abilita il menù di stampa + enable_setprint_menu(); // abilita il menù di settaggio della stampa + return TRUE; +} + +bool TStampa_anagrafica_magazzino::user_destroy() { + if (_st_codcorr) { // se è abilitata la stampa dei codici corrispondenti vengono chiusi i file relativi + delete _arr_codcorr; // distrugge il record array sui codici corrispondenti + delete _codcorr; // distrugge il file dei codici corrispondenti + } + if (_st_umart) { // se è abilitata la stampa delle unità di misura vengono chiusi i file relativi + delete _umart; // distrugge il file delle unità di misura degli articoli + delete _arr_umart; // distrugge il record array sulle unità di misura degli articoli + } + delete _rel; // distrugge la relazione principale + return TRUE; +} + +bool TStampa_anagrafica_magazzino::set_print(int) { + TMask mask("ve3400"); // istanzia la maschera di selezione del filtro di stampa + if (mask.run()== K_ENTER) { // lancia la maschera, se viene confermata vengono trovati gli estremi del cursore + _st_umart= mask.get_bool(F_ST_UMART); // legge il booleano di stampa delle unità di misura + _st_codcorr= mask.get_bool(F_ST_CODCORR); // legge il booleano di stampa dei codici corrispondenti + _st_fisc= mask.get_bool(F_ST_FISC); // legge il booleano di stampa dei dati fiscali + TLocalisamfile &anagr= _rel->lfile(); // prende il file principale + TRectype da(anagr.curr()), a(anagr.curr()); // prende due copie del record del file principale + da.zero(); // azzera il record di inizio + a.zero(); // azzera il record di fine + if (mask.get(F_CODART_1).not_empty()) { // se il campo "dall'articolo..." non è vuoto viene trovato il record di inizio + anagr.zero(); // svuota il record corrente + anagr.put("CODART", mask.get(F_CODART_1)); // compone la chiave + if (anagr.read()== NOERR) da= anagr.curr(); // si posiziona, se il record esiste il record iniziale viene riempito + } + if (mask.get(F_CODART_2).not_empty()) { // se il campo "all'articolo..." non è vuoto viene trovato il record di fine + anagr.zero(); // svuota il record corrente + anagr.put("CODART", mask.get(F_CODART_2)); // compone la chiave + if (anagr.read()== NOERR) a= anagr.curr(); // si posiziona, se il record esiste il record finale viene riempito + } + current_cursor()->setregion(da, a); // viene settata la regione del cursore + if (_st_umart) { // se la stampa delle unità di misura è abilitata vengono aperti i file relativi + _umart= new TLocalisamfile(LF_UMART); // crea il file sulle unità di misura dell'articolo + _arr_umart= new TRecord_array(LF_UMART, "NRIGA"); // crea il record array sulle unità di misura degli articoli + } + if (_st_codcorr) { // se la stampa dei codici corrispondenti è abilitata vengono aperti i file relativi + _codcorr= new TLocalisamfile(LF_CODCORR); // crea il file con i codici corrispondenti dell'articolo + _arr_codcorr= new TRecord_array(LF_CODCORR, "NRIGA"); // crea il record array sui codici corrispondenti + } + force_setpage(); // forza il lancio della set_page() ad ogni record del file da stampare + disable_links(); // disabilita tutti i link ipertestuali + _anagr_link_id= enable_link("Collegamento a anagrafica di magazzino", 'g'); // abilita il collegamento all'anagrafica di magazzino + return TRUE; + } else return FALSE; +} + +/* 1 1 1 1 + 1 2 3 4 5 6 7 8 9 0 1 2 3 + 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012 + + Prima riga + CODART T DESCR GRMER GRMERC-DESCR + 12345678901234567890 1 12345678901234567890123456789012345678901234567890 12345 12345678901234567890123456789012345678901234567890 + + Righe successive + CODARTALT T nota "Codice alternativo" UM UM-FC GRMER GRMERC-DESCR + 12345678901234567890 1 123456789012345678 12 1234567890,12345 12345 12345678901234567890123456789012345678901234567890 + + Penultima riga + CODCF CODCF-RAGSOC COSTOST UP PESO TARA + 12345 12345678901234567890123456789012345678901234567890 123456789012345,67890 12 123456789012345,67890 123456789012345,67890 + + Ultima riga + PPCONF PPCOLLO AP RD AF RAGFI C CCA GRP CON SOTTOC CCV GRP CON SOTTOC CLASSDOG IVA IVAR + 123456789012345,67890 123456789012345,67890 12 12 12 12345 1 123 123 123 123456 123 123 123 123456 1234567890 1234 1234 + + + + + + */ + +void TStampa_anagrafica_magazzino::preprocess_header() +{ + reset_header(); // l'header viene resettato + int i= 1; // contatore delle linee + set_header(i, "@125gPag @#"); // la prima linea contiene, sicuramente, il numero di pagina + const long firm= get_firm(); // legge l'id della ditta corrente + TLocalisamfile ditte(LF_NDITTE); // apre il file ditte + ditte.zero(); // vuota il record + ditte.put("CODDITTA", firm); // riempie la chiave + if (ditte.read()== NOERR) { // se il record della ditta viene trovato viene settato l'header + const TString &s= ditte.get("RAGSOC"); // legge la ragione sociale della ditta + set_header(i, "Ditta %ld %s", firm, (const char *)s); // setta il nome e l'id della ditta della prima linea dell'header + } + set_header(++i, "Codice articolo@22gT@24gDescrizione@75gGrMer@81gDescrizione gruppo merceologico"); // setta la linea successiva dell'header + if (_st_umart || _st_codcorr) set_header(++i, ""); // crea una linea vuota se almeno una stampa condizionale è abilitata + if (_st_codcorr) set_header(i, "Cod. art. altern."); // se è abilitata la stampa dei codici corrispondenti l'header lo indica + if (_st_umart) set_header(i, "@50gUM@53gFatt. conv."); // se è abilitata la stampa delle unità di misura l'header lo indica + set_header(++i, "Forn.@7gRagione sociale@58gCosto standard@83gPeso@105gTara"); // la linea successiva contiene il fornitore e altri dati + if (_st_umart) set_header(i, "@80gUP"); // su questa linea viene indicata anche l'unità di misura del peso (se abilitata) + set_header(++i, "Pezzi x conf.@23gPezzi x collo@45gAR@48gRD"); // l'ultima linea d'header contiene i pezzi per confezione e altri dati + if (_st_fisc) set_header(i, "@51gAF@54gRagFs@60gC@62gCCA@66gGrA@70gCnA@74gSottCA@81gCCV@85gGrV@89gCnV@93gSottCV@100gClasseDog@111gIva@116gIvaR"); // aggiunge i dati fiscali sull'ultima linea + set_header(++i, ""); // aggiunge due linee vuote + set_header(++i, ""); +} + +void TStampa_anagrafica_magazzino::set_page(int file, int) { + if (file== LF_ANAGR) { // se il file in stampa non è il file principale non c'è nulla da fare + TLocalisamfile &anagr= _rel->lfile(); // prende il riferimento al file principale + set_row(1, "$[g]@20s$[n]@22g@1s@24g@50s@75g@5s@81g@50s", FLD(LF_ANAGR, "CODART"), FLD(LF_ANAGR, "TIPO"), FLD(LF_ANAGR, "DESCR"), FLD(LF_ANAGR, "GRMERC1"), FLD(-GMC1, "S0")); // imposta la prima linea di dati + int n_codcorr= 0, n_umart= 0, n_gmc= (anagr.get("GRMERC2").not_empty())?(1):(0)+(anagr.get("GRMERC3").not_empty())?(1):(0); // legge il numero di gruppi merc. + if (_st_codcorr) { // se è abilitata la stampa dei codici corrispondenti viene letto il numero di codici presenti, altrimenti viene lasciato a 0 + _codcorr->zero(); // il record corrente del file dei codici corrispondenti viene vuotato + _codcorr->put("CODART", anagr.get("CODART")); // viene composta la chiave + _arr_codcorr->read(_codcorr->curr()); // il record array dei codici viene caricato + n_codcorr= _arr_codcorr->rows(); // viene settato il numero di codici trovato + } + if (_st_umart) { // se è abilitata la stampa delle unità di misura viene letto il numero di unità di mis. da stampare, altrimenti viene lasciato a 0 + _umart->zero(); // il record corrente del file delle unità di misura viene vuotato + _umart->put("CODART", anagr.get("CODART")); // viene composta la chiave + _arr_umart->read(_umart->curr()); // il record array delle unità di misura viene caricato + n_umart= _arr_umart->rows(); // viene settato il numero di unità di misura trovate + } + int n_max= max3(n_gmc, n_codcorr, n_umart); // viene trovato il maggiore dei tre contatori (gruppi merc., unità di mis. e codici corrisp.) + for (int i=1; i<=n_max; i++) { // ciclo sul maggiore dei contatori + set_row(i+1, ""); // vuota la linea di stampa corrente + if (i<=n_codcorr) { // se ci sono ancora codici corrispondenti gli spazi relativi della riga vengono riempiti + TString codartalt(_arr_codcorr->row(i, FALSE).get("CODARTALT")); // legge il codice corrispondente dell'articolo + TString tipo(_arr_codcorr->row(i, FALSE).get("TIPO")); // legge il tipo + set_row(i+1, "@1g%-20s@22g%1s@24gCodice alternativo", (const char *)codartalt, (const char *)tipo); // setta gli spazi della riga con i valori letti + } + if (i<=n_umart) { // se ci sono ancora unità di misura gli spazi relativi della riga vengono riempiti + TString um(_arr_umart->row(i, FALSE).get("UM")); // legge l'id dell'unità di misura + real fc(_arr_umart->row(i, FALSE).get_real("FC")); // legge il suo fattore di conversione + set_row(i+1, "@50g%-2s@53g%-s", (const char *)um, fc.string(10, 5)); // setta gli spazi della riga con i valori letti + } + if (i<=n_gmc) { // se ci sono ancora gruppi merceologici gli spazi relativi della riga vengono riempiti + TString grmerc, descr; // istanzia le due variabili per codice del gruppo e descrizione + if (i==1) { // se è il primo deve essere letto dal secondo campo GRMERC del file dell'anagrafica + grmerc= anagr.get("GRMERC2"); // legge il codice del gruppo + descr= _rel->lfile(-GMC2).get("S0"); // legge la sua descrizione dalla tabella + } else { // se è il secondo deve essere letto dal terzo campo GRMERC del file dell'anagrafica + grmerc= anagr.get("GRMERC3"); // legge il codice del gruppo + descr= _rel->lfile(-GMC3).get("S0"); // legge la sua descriziona dalla tabella + } + set_row(i+1, "@75g%-5s@81g%-50s", (const char *)grmerc, (const char *)descr); + } + } + set_row(n_max+2, "@5s@7g@50s@58g@15.5n@83g@15.5n@105g@15.5n", FLD(LF_ANAGR, "CODFORN"), FLD(LF_CLIFO, "RAGSOC"), FLD(LF_ANAGR, "COSTSTD"), FLD(LF_ANAGR, "PESO"), FLD(LF_ANAGR, "TARA")); // imposta la penultima linea + if (_st_umart) set_row(n_max+2, "@80g@2s", FLD(LF_ANAGR, "UMP")); // se è abilitata la stampa delle unità di misura aggiunge l'u.m. del peso + set_row(n_max+3, "@15.5n@23g@15.5n@45g@f@48g@f", FLD(LF_ANAGR, "PPCONF"), FLD(LF_ANAGR, "PPCOLLO"), FLD(LF_ANAGR, "ARTPROD"), FLD(LF_ANAGR, "RIORDINO")); // imposta l'ultima linea + if (_st_fisc) set_row(n_max+3, "@51g@f@54g@5s@60g@1s@62g@3s@66g@3n@70g@3n@74g@6n@81g@3s@85g@3n@89g@3n@93g@6n@100g@10s@111g@4s@116g@4s", // imposta i dati fiscali sull'ultima linea + FLD(LF_ANAGR, "ARTFIS"), FLD(LF_ANAGR, "RAGGFIS"), FLD(LF_ANAGR, "CLASSEFIS"), + FLD(LF_ANAGR, "CATCONA"), FLD(LF_ANAGR, "GRUPPOA"), FLD(LF_ANAGR, "CONTOA"), FLD(LF_ANAGR, "SOTTOCA"), + FLD(LF_ANAGR, "CATCONV"), FLD(LF_ANAGR, "GRUPPOV"), FLD(LF_ANAGR, "CONTOV"), FLD(LF_ANAGR, "SOTTOCV"), + FLD(LF_ANAGR, "CLASSDOG"), FLD(LF_ANAGR, "CODIVA"), FLD(LF_ANAGR, "CODIVAR")); + set_row(n_max+4, ""); // aggiunge due linee vuote + set_row(n_max+5, ""); + } +} + +void TStampa_anagrafica_magazzino::process_link(int id, const char *text) { + if (id== _anagr_link_id) { + TString body= "1|"; // istanzia la stringa per il corpo del messaggio e gli aggiunge il numero della chiave e il separatore + body << text; // aggiunge al corpo del messaggio il codice dell'articolo per riempire la chiave + TMessage msg(ANAMAG_APP, MSG_LN, (const char *)body); // crea il messaggio per l'applicazione di anagrafica di magazzino + msg.send(); // invia il messaggio + TExternal_app ve2_3(ANAMAG_APP); // crea l'applicazione esterna dell'anagrafica di magazzino + ve2_3.run(); // lancia l'applicazione esterna + } +} + + + +int ve3400(int argc, char* argv[]) { + TStampa_anagrafica_magazzino a; + + a.run(argc, argv, "Stampa anagrafica magazzino"); + return 0; +} diff --git a/ve/ve3400.h b/ve/ve3400.h new file mode 100755 index 000000000..520b98d71 --- /dev/null +++ b/ve/ve3400.h @@ -0,0 +1,10 @@ + +#define F_CODART_1 101 +#define F_DESCR_1 102 + +#define F_CODART_2 111 +#define F_DESCR_2 112 + +#define F_ST_UMART 121 +#define F_ST_CODCORR 122 +#define F_ST_FISC 123 diff --git a/ve/ve3400.uml b/ve/ve3400.uml new file mode 100755 index 000000000..9b50606b8 --- /dev/null +++ b/ve/ve3400.uml @@ -0,0 +1,94 @@ +#include +#include "VE3400.H" + +PAGE "Stampa anagrafica di magazzino " -1 -1 72 14 + +STRING F_CODART_1 20 +BEGIN + PROMPT 2 1 "Dall'art. " + FLAG "U" + USE LF_ANAGR + INPUT CODART F_CODART_1 + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART_1 CODART + OUTPUT F_DESCR_1 DESCR + CHECKTYPE NORMAL +END + +STRING F_DESCR_1 50 +BEGIN + PROMPT 2 2 "Descrizione " + USE LF_ANAGR KEY 2 + INPUT DESCR F_DESCR_1 + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART_1 CODART + OUTPUT F_DESCR_1 DESCR +END + +STRING F_CODART_2 20 +BEGIN + PROMPT 2 4 "All'art. " + FLAG "U" + USE LF_ANAGR + INPUT CODART F_CODART_2 + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART_2 CODART + OUTPUT F_DESCR_2 DESCR + CHECKTYPE NORMAL +END + +STRING F_DESCR_2 50 +BEGIN + PROMPT 2 5 "Descrizione " + USE LF_ANAGR KEY 2 + INPUT DESCR F_DESCR_2 + DISPLAY "Codice@20" CODART + DISPLAY "Descrizione@50" DESCR + OUTPUT F_CODART_2 CODART + OUTPUT F_DESCR_2 DESCR +END + +GROUPBOX DLG_NULL 71 7 +BEGIN + PROMPT 0 0 "" +//FLAG "R" +END + +BOOLEAN F_ST_UMART +BEGIN + PROMPT 2 8 "Stampa unita' di misura" +END + +BOOLEAN F_ST_CODCORR +BEGIN + PROMPT 2 9 "Stampa codici corrispondenti" +END + +BOOLEAN F_ST_FISC +BEGIN + PROMPT 2 10 "Stampa dati fiscali" +END + +GROUPBOX DLG_NULL 71 5 +BEGIN + PROMPT 0 7 "Controllo stampa" +//FLAG "R" +END + +BUTTON DLG_SELECT 9 2 +BEGIN + PROMPT -12 -1 "Selezione" + MESSAGE EXIT,K_ENTER +END + +BUTTON DLG_QUIT 9 2 +BEGIN + PROMPT -22 -1 "" +END + +ENDPAGE + +ENDMASK diff --git a/ve/veini.h b/ve/veini.h index bec3dc8b8..d18bf7188 100755 --- a/ve/veini.h +++ b/ve/veini.h @@ -1,13 +1,13 @@ -#define T_DATA 1 -#define T_STRINGA 2 -#define T_NUMERO 3 -#define T_CHECKBOX 4 -#define T_LISTA 5 -#define T_MEMO 6 -#define T_CORNICE 7 -#define T_BOTTONE 8 - -#define S_NASCOSTO 0 -#define S_DISABILITATO 1 -#define S_NORMALE 2 -#define S_OBBLIGATORIO 3 +#define T_DATA 1 +#define T_STRINGA 2 +#define T_NUMERO 3 +#define T_CHECKBOX 4 +#define T_LISTA 5 +#define T_MEMO 6 +#define T_CORNICE 7 +#define T_BOTTONE 8 + +#define S_NASCOSTO 0 +#define S_DISABILITATO 1 +#define S_NORMALE 2 +#define S_OBBLIGATORIO 3 diff --git a/ve/veuml.h b/ve/veuml.h index f3c37f561..2a747fd2b 100755 --- a/ve/veuml.h +++ b/ve/veuml.h @@ -1,85 +1,85 @@ -#ifndef __VEUML_H -#define __VEUML_H - -#define F_CODNUM 101 // GESTITO DAL MOTORE -#define F_ANNO 102 // GESTITO DAL MOTORE -#define F_PROVV 103 // GESTITO DAL MOTORE -#define F_NDOC 104 // GESTITO DAL MOTORE -#define F_STATO 105 // GESTITO DAL MOTORE -#define F_DATADOC 106 -#define F_TIPOCF 107 // GESTITO DAL MOTORE -#define F_CODCF 108 -#define F_OCFPI 109 -#define F_OCCAS 110 -#define F_CODVAL 111 -#define F_CAMBIO 112 -#define F_CODLIN 113 -#define F_RAGGR 114 // GESTITO DAL MOTORE -#define F_CODPAG 115 -#define F_DATAINSC 116 -#define F_CODABIA 117 -#define F_CODCABA 118 -#define F_CODABIP 119 -#define F_CODCABP 120 -#define F_CODLIST 121 -#define F_CODCONT 122 -#define F_CODCAMP 123 -#define F_SCONTOPERC 124 -#define F_CODINDSP 125 -#define F_DATADOCRIF 126 -#define F_NUMDOCRIF 127 -#define F_CODAG 128 -#define F_CODAGVIS 129 -#define F_CODSPMEZZO 130 -#define F_CODPORTO 131 -#define F_CODNOTESP1 132 -#define F_CODNOTESP2 133 -#define F_CAUSTRASP 134 -#define F_CODVETT1 135 -#define F_CODVETT2 136 -#define F_CODVETT3 137 -#define F_NCOPIE 138 // GESTITO DAL MOTORE -#define F_DATAPART 139 -#define F_ORAPART 140 -#define F_IMPPAGATO 141 -#define F_ACCSALDO 142 -#define F_DOC1 143 -#define F_DOC2 144 -#define F_DOC3 145 -#define F_DATACONS 146 -#define F_ASPBENI1 147 -#define F_ASPBENI2 148 -#define F_IMPNETTI 149 -#define F_RAGGREFF 150 // GESTITO DAL MOTORE -#define F_SPESEINC 151 -#define F_ADDBRB 152 -#define F_ADDBTR 153 -#define F_ADDBDE 154 -#define F_CODIVABRB 155 -#define F_CODIVABTR 156 -#define F_CODIVABTRE 157 -#define F_CODIVABDE 158 -#define F_UMTARA 159 -#define F_TARA 160 -#define F_UMPNETTO 161 -#define F_PNETTO 162 -#define F_NCOLLI 163 -#define F_CAUSMAG1 164 -#define F_CAUSMAG2 165 -#define F_NOTE 166 -#define F_G1 167 -#define F_G2 168 -#define F_DATAAGG 169 // GESTITO DAL MOTORE -#define F_UTENTE 170 // GESTITO DAL MOTORE -#define F_PROFILO 171 // GESTITO DAL MOTORE -#define F_TIPODOC 172 // GESTITO DAL MOTORE -#define F_DESNUM 173 // GESTITO DAL MOTORE -#define F_TIPIDOCS 174 // GESTITO DAL MOTORE -#define F_LBTIPORIGA 175 // GESTITO DAL MOTORE -#define F_DESTIPODOC 176 // GESTITO DAL MOTORE -#define F_DESCF 177 // GESTITO DAL MOTORE -#define DLG_ELABORA 178 // GESTITO DAL MOTORE: bottone Elabora -#define F_ATTIVAANNO 179 // GESTITO DAL MOTORE -#define F_OCCASEDIT 180 // GESTITO DAL MOTORE - -#endif // veuml.h +#ifndef __VEUML_H +#define __VEUML_H + +#define F_CODNUM 101 // GESTITO DAL MOTORE +#define F_ANNO 102 // GESTITO DAL MOTORE +#define F_PROVV 103 // GESTITO DAL MOTORE +#define F_NDOC 104 // GESTITO DAL MOTORE +#define F_STATO 105 // GESTITO DAL MOTORE +#define F_DATADOC 106 +#define F_TIPOCF 107 // GESTITO DAL MOTORE +#define F_CODCF 108 +#define F_OCFPI 109 +#define F_OCCAS 110 +#define F_CODVAL 111 +#define F_CAMBIO 112 +#define F_CODLIN 113 +#define F_RAGGR 114 // GESTITO DAL MOTORE +#define F_CODPAG 115 +#define F_DATAINSC 116 +#define F_CODABIA 117 +#define F_CODCABA 118 +#define F_CODABIP 119 +#define F_CODCABP 120 +#define F_CODLIST 121 +#define F_CODCONT 122 +#define F_CODCAMP 123 +#define F_SCONTOPERC 124 +#define F_CODINDSP 125 +#define F_DATADOCRIF 126 +#define F_NUMDOCRIF 127 +#define F_CODAG 128 +#define F_CODAGVIS 129 +#define F_CODSPMEZZO 130 +#define F_CODPORTO 131 +#define F_CODNOTESP1 132 +#define F_CODNOTESP2 133 +#define F_CAUSTRASP 134 +#define F_CODVETT1 135 +#define F_CODVETT2 136 +#define F_CODVETT3 137 +#define F_NCOPIE 138 // GESTITO DAL MOTORE +#define F_DATAPART 139 +#define F_ORAPART 140 +#define F_IMPPAGATO 141 +#define F_ACCSALDO 142 +#define F_DOC1 143 +#define F_DOC2 144 +#define F_DOC3 145 +#define F_DATACONS 146 +#define F_ASPBENI1 147 +#define F_ASPBENI2 148 +#define F_IMPNETTI 149 +#define F_RAGGREFF 150 // GESTITO DAL MOTORE +#define F_SPESEINC 151 +#define F_ADDBRB 152 +#define F_ADDBTR 153 +#define F_ADDBDE 154 +#define F_CODIVABRB 155 +#define F_CODIVABTR 156 +#define F_CODIVABTRE 157 +#define F_CODIVABDE 158 +#define F_UMTARA 159 +#define F_TARA 160 +#define F_UMPNETTO 161 +#define F_PNETTO 162 +#define F_NCOLLI 163 +#define F_CAUSMAG1 164 +#define F_CAUSMAG2 165 +#define F_NOTE 166 +#define F_G1 167 +#define F_G2 168 +#define F_DATAAGG 169 // GESTITO DAL MOTORE +#define F_UTENTE 170 // GESTITO DAL MOTORE +#define F_PROFILO 171 // GESTITO DAL MOTORE +#define F_TIPODOC 172 // GESTITO DAL MOTORE +#define F_DESNUM 173 // GESTITO DAL MOTORE +#define F_TIPIDOCS 174 // GESTITO DAL MOTORE +#define F_LBTIPORIGA 175 // GESTITO DAL MOTORE +#define F_DESTIPODOC 176 // GESTITO DAL MOTORE +#define F_DESCF 177 // GESTITO DAL MOTORE +#define DLG_ELABORA 178 // GESTITO DAL MOTORE: bottone Elabora +#define F_ATTIVAANNO 179 // GESTITO DAL MOTORE +#define F_OCCASEDIT 180 // GESTITO DAL MOTORE + +#endif // veuml.h diff --git a/ve/veuml1.h b/ve/veuml1.h index fcbcb8680..615c91ca7 100755 --- a/ve/veuml1.h +++ b/ve/veuml1.h @@ -1,62 +1,62 @@ -#ifndef __VEUML1_H -#define __VEUML1_H - -#ifndef __VEUML_H -#include "VEUML.H" -#endif - -// gruppo dei vettori - -#define GR_VETTORI 15 - -// campi della maschera totale - -#define F_RAGSOC 301 -#define F_INDCF 302 -#define F_CIVCF 303 -#define F_NOME_VAL 304 -#define F_DESCODPAG 305 -#define F_DATASCAD1 306 -#define F_DATASCAD2 307 -#define F_DATASCAD3 308 -#define F_DATASCAD4 309 -#define F_DATASCAD5 310 -#define F_BANCA_APP 311 -#define F_BANCA_PRE 312 -#define F_INDSP 313 -#define F_CIVSP 314 -#define F_CAPSP 315 -#define F_LOCALITASP 316 -#define F_PORTO 317 -#define F_DENCAUSTRASP 318 -#define F_NOMEVETT1 319 -#define F_NOMEVETT2 320 -#define F_NOMEVETT3 321 -#define F_DESCRBENI1 322 -#define F_DESCRBENI2 323 -#define F_DESUMTARA 324 -#define F_DESUMPNETTO 325 -#define F_DESCRMAG1 326 -#define F_DESCRMAG2 327 -#define F_COFI 328 -#define F_STATOPAIVA 329 -#define F_LOCALITACF 330 -#define F_CAPCF 331 -#define F_COMCF 332 -#define F_PROVCOM 333 -#define F_STATOCF 334 -#define F_DATACAMBIO 335 -#define F_DESBANAPP 336 -#define F_DESLIN 337 -#define F_DESBANPRE 338 -#define F_NOMEVAL 339 -#define F_PAIVA 340 -#define F_DENCOM 341 -#define F_DESSTATOCF 342 -#define F_COMSP 343 -#define F_DENCOMSP 344 -#define F_PROVCOMSP 345 -#define F_STATOSP 346 -#define F_DESSTATOSP 347 -#define F_DESLIST 348 -#endif // __VEUML1_H +#ifndef __VEUML1_H +#define __VEUML1_H + +#ifndef __VEUML_H +#include "VEUML.H" +#endif + +// gruppo dei vettori + +#define GR_VETTORI 15 + +// campi della maschera totale + +#define F_RAGSOC 301 +#define F_INDCF 302 +#define F_CIVCF 303 +#define F_NOME_VAL 304 +#define F_DESCODPAG 305 +#define F_DATASCAD1 306 +#define F_DATASCAD2 307 +#define F_DATASCAD3 308 +#define F_DATASCAD4 309 +#define F_DATASCAD5 310 +#define F_BANCA_APP 311 +#define F_BANCA_PRE 312 +#define F_INDSP 313 +#define F_CIVSP 314 +#define F_CAPSP 315 +#define F_LOCALITASP 316 +#define F_PORTO 317 +#define F_DENCAUSTRASP 318 +#define F_NOMEVETT1 319 +#define F_NOMEVETT2 320 +#define F_NOMEVETT3 321 +#define F_DESCRBENI1 322 +#define F_DESCRBENI2 323 +#define F_DESUMTARA 324 +#define F_DESUMPNETTO 325 +#define F_DESCRMAG1 326 +#define F_DESCRMAG2 327 +#define F_COFI 328 +#define F_STATOPAIVA 329 +#define F_LOCALITACF 330 +#define F_CAPCF 331 +#define F_COMCF 332 +#define F_PROVCOM 333 +#define F_STATOCF 334 +#define F_DATACAMBIO 335 +#define F_DESBANAPP 336 +#define F_DESLIN 337 +#define F_DESBANPRE 338 +#define F_NOMEVAL 339 +#define F_PAIVA 340 +#define F_DENCOM 341 +#define F_DESSTATOCF 342 +#define F_COMSP 343 +#define F_DENCOMSP 344 +#define F_PROVCOMSP 345 +#define F_STATOSP 346 +#define F_DESSTATOSP 347 +#define F_DESLIST 348 +#endif // __VEUML1_H