Creato programma stampa anagrafica magazzino, modificati prec. prog. di vendita

git-svn-id: svn://10.65.10.50/trunk@1817 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
gianluca 1995-09-12 09:08:09 +00:00
parent 6d115b8fef
commit 662b7d8bba
23 changed files with 3688 additions and 3281 deletions

View File

@ -29,4 +29,3 @@
#define F_NUMPROVV 130
#define F_NUMAUTO 131
#define F_ULTDATAPROV 132


View File

@ -12,28 +12,28 @@
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 );
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( );
}
{
m.set( mskfield, value, TRUE );
m.field( mskfield ).check( );
}
};
const TString& TData_picker::get( const int file, const TString& fieldname )
@ -83,13 +83,13 @@ void TCliFor::load( const char tipocf, const long codcf, const TString& ocfpi )
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 );
}
{
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 )

View File

@ -20,51 +20,51 @@
class TData_picker : public TRelation
{
private:
private:
TTable* _table;
TString16 _tablename;
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 ); };
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:
private:
char _tipocf;
long _codcf;
bool _occas;
TMask _occas_mask;
char _tipocf;
long _codcf;
bool _occas;
TMask _occas_mask;
public:
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( );
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:
public:
void update_mask( TMask& m, bool onload = FALSE );
void update_mask( TMask& m, bool onload = FALSE );
};
#endif

View File

@ -563,19 +563,19 @@ bool TMotore_application::clifo_handler(TMask_field& f, KEY key)
return f.error_box("Il codice '%s' e' sospeso e non puo' essere utilizzato", sf);
}
/*
if (!m.is_running() || f.dirty())
{
// Equichecazzociva?
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
m.send_key(K_SPACE, F_OCCASEDIT); // Lancia maschera occasionali
}
}
return TRUE;
@ -606,13 +606,13 @@ void TMotore_application::carica_piedi( )
void TMotore_application::somma_piedi( )
{
for ( int i = 0; i < NPIEDI; i++ )
_piedi[ i ] += _piedi_temp[ i ];
_piedi[ i ] += _piedi_temp[ i ];
}
void TMotore_application::sottrai_piedi( )
{
for ( int i = 0; i < NPIEDI; i++ )
_piedi[ i ] -= _piedi_temp[ i ];
_piedi[ i ] -= _piedi_temp[ i ];
}
bool TMotore_application::changing_mask(int mode)
@ -949,12 +949,12 @@ void TMotore_application::load_riga( TSheet_field& f, int numrig, TRectype& r )
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 );
}
{
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 )

View File

@ -204,30 +204,30 @@ 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;
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 )
@ -462,17 +462,17 @@ void TField::genera( TMaschera& m )
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;
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 );
@ -675,14 +675,14 @@ void TMask_generator::carica_dati_campi( const TFilename& fn, TArray& a )
else if( key == "SIZE" )
campo->size( atoi( value ) );
else if( key == "PROMPT" )
{
if( value[ 0 ] == '"' )
{
if( value[ 0 ] == '"' )
{
value.rtrim( 1 );
value.ltrim( 1 );
};
campo->prompt( value );
}
value.rtrim( 1 );
value.ltrim( 1 );
};
campo->prompt( value );
}
else if( key == "FLAG" )
campo->flag( value );
else if( key == "USE" )

View File

@ -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;
}

View File

@ -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

View File

@ -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

24
ve/ve3.cpp Executable file
View File

@ -0,0 +1,24 @@
#include <checks.h>
#include <xvt.h>
//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);
}

17
ve/ve3.h Executable file
View File

@ -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

27
ve/ve3.url Executable file
View File

@ -0,0 +1,27 @@
#include <default.url>
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"

236
ve/ve3400.cpp Executable file
View File

@ -0,0 +1,236 @@
#include <printapp.h>
#include <mailbox.h>
#include <mask.h>
#include <execp.h>
#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;
}

10
ve/ve3400.h Executable file
View File

@ -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

94
ve/ve3400.uml Executable file
View File

@ -0,0 +1,94 @@
#include <lffiles.h>
#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

View File

@ -58,5 +58,5 @@
#define F_PROVCOMSP 345
#define F_STATOSP 346
#define F_DESSTATOSP 347
#define F_DESLIST 348
#define F_DESLIST 348
#endif // __VEUML1_H