Cominciata nuova stesura del programma di fatturazione bolle e corrette le tabelle usate.
git-svn-id: svn://10.65.10.50/trunk@3339 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
ce6869e681
commit
07bcd60df8
@ -2,7 +2,8 @@
|
||||
#define F_CODICE 101
|
||||
#define F_DESCR 102
|
||||
#define F_TIPO 103
|
||||
#define F_CODNUM 104
|
||||
#define F_CODNUM_I 104
|
||||
#define F_CODNUM_F 105
|
||||
#define F_TIPODOC_I_1 111
|
||||
#define F_STATO_I_DOC_I_1 121
|
||||
#define F_STATO_F_DOC_I 131
|
||||
@ -16,3 +17,8 @@
|
||||
#define F_STATO_I_DOC_I_5 125
|
||||
#define F_TIPODOC_F 140
|
||||
#define F_STATO_F_DOC_F 141
|
||||
#define F_DOC1 151
|
||||
#define F_DOC2 152
|
||||
#define F_DOC3 153
|
||||
#define F_DOC4 154
|
||||
#define F_DOC5 155
|
||||
|
110
ve/batbeld.uml
110
ve/batbeld.uml
@ -26,7 +26,6 @@ BEGIN
|
||||
OUTPUT F_DESCR S0
|
||||
KEY 1
|
||||
HELP "Codice dell'elaborazione differita da eseguire"
|
||||
MESSAGE ENABLE, F_PROGRAMMA
|
||||
END
|
||||
|
||||
STRING F_DESCR 50
|
||||
@ -53,27 +52,78 @@ BEGIN
|
||||
ITEM "TC|Trasferimento a contabilita'"
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 78 5
|
||||
GROUPBOX DLG_NULL 78 6
|
||||
BEGIN
|
||||
PROMPT 1 6 "@bDocumento originale"
|
||||
END
|
||||
|
||||
STRING F_CODNUM_I 4
|
||||
BEGIN
|
||||
PROMPT 2 7 "Codice numerazione "
|
||||
FLAGS "U"
|
||||
FIELD S5
|
||||
USE NUM
|
||||
INPUT CODTAB F_CODNUM_I
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_CODNUM_I CODTAB
|
||||
OUTPUT F_DOC1 S2[1,4]
|
||||
OUTPUT F_DOC2 S2[5,8]
|
||||
OUTPUT F_DOC3 S2[9,12]
|
||||
OUTPUT F_DOC4 S2[13,16]
|
||||
OUTPUT F_DOC5 S2[17,20]
|
||||
CHECKTYPE NORMAL
|
||||
WARNING "Numerazione errata"
|
||||
END
|
||||
|
||||
STRING F_DOC1 4
|
||||
BEGIN
|
||||
PROMPT 30 7 ""
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
STRING F_DOC2 4
|
||||
BEGIN
|
||||
PROMPT 36 7 ""
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
STRING F_DOC3 4
|
||||
BEGIN
|
||||
PROMPT 42 7 ""
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
STRING F_DOC4 4
|
||||
BEGIN
|
||||
PROMPT 48 7 ""
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
STRING F_DOC5 4
|
||||
BEGIN
|
||||
PROMPT 54 7 ""
|
||||
FLAGS "D"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC_I_1 4
|
||||
BEGIN
|
||||
PROMPT 2 7 "Tipo documento "
|
||||
PROMPT 2 8 "Tipo documento "
|
||||
FLAGS "U"
|
||||
FIELD S2[1,4]
|
||||
CHECKTYPE REQUIRED
|
||||
WARNING "E' necessario specificare un valore"
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC_I_1
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Tipo documento@50" S0
|
||||
OUTPUT F_TIPODOC_I_1 CODTAB
|
||||
CHECKTYPE REQUIRED
|
||||
STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)}
|
||||
WARNING "E' necessario specificare un valore valido e previsto dalla numerazione"
|
||||
END
|
||||
|
||||
STRING F_STATO_I_DOC_I_1 1
|
||||
BEGIN
|
||||
PROMPT 2 8 "Stato iniziale "
|
||||
PROMPT 2 9 "Stato iniziale "
|
||||
FLAGS "U"
|
||||
FIELD S7[1,1]
|
||||
CHECKTYPE REQUIRED
|
||||
@ -82,7 +132,7 @@ END
|
||||
|
||||
STRING F_STATO_F_DOC_I 1
|
||||
BEGIN
|
||||
PROMPT 2 9 "Stato finale "
|
||||
PROMPT 2 10 "Stato finale "
|
||||
FLAGS "U"
|
||||
FIELD S4
|
||||
CHECKTYPE REQUIRED
|
||||
@ -91,19 +141,21 @@ END
|
||||
|
||||
STRING F_TIPODOC_I_2 4
|
||||
BEGIN
|
||||
PROMPT 30 7 ""
|
||||
PROMPT 30 8 ""
|
||||
FLAGS "U"
|
||||
FIELD S2[5,8]
|
||||
WARNING "E' necessario specificare un valore"
|
||||
COPY USE F_TIPODOC_I_1
|
||||
INPUT CODTAB F_TIPODOC_I_2
|
||||
COPY DISPLAY F_TIPODOC_I_1
|
||||
OUTPUT F_TIPODOC_I_2 CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)}
|
||||
WARNING "E' necessario specificare un valore valido e previsto dalla numerazione"
|
||||
END
|
||||
|
||||
STRING F_STATO_I_DOC_I_2 1
|
||||
BEGIN
|
||||
PROMPT 30 8 ""
|
||||
PROMPT 30 9 ""
|
||||
FLAGS "U"
|
||||
FIELD S7[2,2]
|
||||
WARNING "E' necessario specificare un valore"
|
||||
@ -112,19 +164,21 @@ END
|
||||
|
||||
STRING F_TIPODOC_I_3 4
|
||||
BEGIN
|
||||
PROMPT 39 7 ""
|
||||
PROMPT 39 8 ""
|
||||
FLAGS "U"
|
||||
FIELD S2[9,12]
|
||||
WARNING "E' necessario specificare un valore"
|
||||
COPY USE F_TIPODOC_I_1
|
||||
INPUT CODTAB F_TIPODOC_I_3
|
||||
COPY DISPLAY F_TIPODOC_I_1
|
||||
OUTPUT F_TIPODOC_I_3 CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)}
|
||||
WARNING "E' necessario specificare un valore valido e previsto dalla numerazione"
|
||||
END
|
||||
|
||||
STRING F_STATO_I_DOC_I_3 1
|
||||
BEGIN
|
||||
PROMPT 39 8 ""
|
||||
PROMPT 39 9 ""
|
||||
FLAGS "U"
|
||||
FIELD S7[3,3]
|
||||
WARNING "E' necessario specificare un valore"
|
||||
@ -133,19 +187,21 @@ END
|
||||
|
||||
STRING F_TIPODOC_I_4 4
|
||||
BEGIN
|
||||
PROMPT 48 7 ""
|
||||
PROMPT 48 8 ""
|
||||
FLAGS "U"
|
||||
FIELD S2[13,15]
|
||||
WARNING "E' necessario specificare un valore"
|
||||
COPY USE F_TIPODOC_I_1
|
||||
INPUT CODTAB F_TIPODOC_I_4
|
||||
COPY DISPLAY F_TIPODOC_I_1
|
||||
OUTPUT F_TIPODOC_I_4 CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)}
|
||||
WARNING "E' necessario specificare un valore valido e previsto dalla numerazione"
|
||||
END
|
||||
|
||||
STRING F_STATO_I_DOC_I_4 1
|
||||
BEGIN
|
||||
PROMPT 48 8 ""
|
||||
PROMPT 48 9 ""
|
||||
FLAGS "U"
|
||||
FIELD S7[4,4]
|
||||
WARNING "E' necessario specificare un valore"
|
||||
@ -154,19 +210,21 @@ END
|
||||
|
||||
STRING F_TIPODOC_I_5 4
|
||||
BEGIN
|
||||
PROMPT 57 7 ""
|
||||
PROMPT 57 8 ""
|
||||
FLAGS "U"
|
||||
FIELD S2[16,19]
|
||||
WARNING "E' necessario specificare un valore"
|
||||
COPY USE F_TIPODOC_I_1
|
||||
INPUT CODTAB F_TIPODOC_I_4
|
||||
COPY DISPLAY F_TIPODOC_I_1
|
||||
OUTPUT F_TIPODOC_I_4 CODTAB
|
||||
CHECKTYPE NORMAL
|
||||
STR_EXPR {(#F_CODNUM_I=="")||(#THIS_FIELD==#F_DOC1)||(#THIS_FIELD==#F_DOC2)||(#THIS_FIELD==#F_DOC3)||(#THIS_FIELD==#F_DOC4)||(#THIS_FIELD==#F_DOC5)}
|
||||
WARNING "E' necessario specificare un valore valido e previsto dalla numerazione"
|
||||
END
|
||||
|
||||
STRING F_STATO_I_DOC_I_5 1
|
||||
BEGIN
|
||||
PROMPT 57 8 ""
|
||||
PROMPT 57 9 ""
|
||||
FLAGS "U"
|
||||
FIELD S7[5,5]
|
||||
WARNING "E' necessario specificare un valore"
|
||||
@ -175,12 +233,12 @@ END
|
||||
|
||||
GROUPBOX DLG_NULL 78 5
|
||||
BEGIN
|
||||
PROMPT 1 11 "@bDocumento finale"
|
||||
PROMPT 1 12 "@bDocumento finale"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC_F 4
|
||||
BEGIN
|
||||
PROMPT 2 12 "Tipo documento "
|
||||
PROMPT 2 13 "Tipo documento "
|
||||
FIELD S8
|
||||
CHECKTYPE REQUIRED
|
||||
WARNING "E' necessario specificare un valore"
|
||||
@ -192,22 +250,22 @@ END
|
||||
|
||||
STRING F_STATO_F_DOC_F 1
|
||||
BEGIN
|
||||
PROMPT 2 13 "Stato finale "
|
||||
PROMPT 2 14 "Stato finale "
|
||||
FLAGS "U"
|
||||
FIELD S9
|
||||
CHECKTYPE REQUIRED
|
||||
WARNING "E' necessario specificare uno stato finale"
|
||||
END
|
||||
|
||||
STRING F_CODNUM 4
|
||||
STRING F_CODNUM_F 4
|
||||
BEGIN
|
||||
PROMPT 2 14 "Codice numerazione "
|
||||
PROMPT 2 15 "Codice numerazione "
|
||||
FIELD S5
|
||||
USE NUM
|
||||
INPUT CODTAB F_CODNUM
|
||||
INPUT CODTAB F_CODNUM_F
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_CODNUM CODTAB
|
||||
OUTPUT F_CODNUM_F CODTAB
|
||||
CHECKTYPE REQUIRED
|
||||
WARNING "E' necessario specificare un codice di numerazione"
|
||||
END
|
||||
|
116
ve/batbnum.uml
116
ve/batbnum.uml
@ -77,7 +77,7 @@ PAGE "Numerazione documenti" -1 -1 60 14
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Numerazioni documenti pag.2" -1 -1 60 14
|
||||
PAGE "Tipi documento validi" -1 -1 60 14
|
||||
|
||||
GROUPBOX DLG_NULL 64 15
|
||||
BEGIN
|
||||
@ -112,7 +112,7 @@ PAGE "Numerazioni documenti pag.2" -1 -1 60 14
|
||||
|
||||
STRING F_TIPODOC2 4
|
||||
BEGIN
|
||||
PROMPT 2 5 ""
|
||||
PROMPT 2 6 ""
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC2
|
||||
DISPLAY "Codice" CODTAB
|
||||
@ -126,13 +126,13 @@ PAGE "Numerazioni documenti pag.2" -1 -1 60 14
|
||||
|
||||
STRING F_DESDOC2 40
|
||||
BEGIN
|
||||
PROMPT 12 5 ""
|
||||
PROMPT 12 6 ""
|
||||
FLAG "D"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC3 4
|
||||
BEGIN
|
||||
PROMPT 2 6 ""
|
||||
PROMPT 2 8 ""
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC3
|
||||
DISPLAY "Codice" CODTAB
|
||||
@ -146,13 +146,13 @@ PAGE "Numerazioni documenti pag.2" -1 -1 60 14
|
||||
|
||||
STRING F_DESDOC3 40
|
||||
BEGIN
|
||||
PROMPT 12 6 ""
|
||||
PROMPT 12 8 ""
|
||||
FLAG "D"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC4 4
|
||||
BEGIN
|
||||
PROMPT 2 7 ""
|
||||
PROMPT 2 10 ""
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC4
|
||||
DISPLAY "Codice" CODTAB
|
||||
@ -166,13 +166,13 @@ PAGE "Numerazioni documenti pag.2" -1 -1 60 14
|
||||
|
||||
STRING F_DESDOC4 40
|
||||
BEGIN
|
||||
PROMPT 12 7 ""
|
||||
PROMPT 12 10 ""
|
||||
FLAG "D"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC5 4
|
||||
BEGIN
|
||||
PROMPT 2 8 ""
|
||||
PROMPT 2 12 ""
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC5
|
||||
DISPLAY "Codice" CODTAB
|
||||
@ -185,109 +185,9 @@ PAGE "Numerazioni documenti pag.2" -1 -1 60 14
|
||||
END
|
||||
|
||||
STRING F_DESDOC5 40
|
||||
BEGIN
|
||||
PROMPT 12 8 ""
|
||||
FLAG "D"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC6 4
|
||||
BEGIN
|
||||
PROMPT 2 9 ""
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC6
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_TIPODOC6 CODTAB
|
||||
OUTPUT F_DESDOC6 S0
|
||||
HELP "Tipo di documento 6"
|
||||
FIELD S2[21,24]
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_DESDOC6 40
|
||||
BEGIN
|
||||
PROMPT 12 9 ""
|
||||
FLAG "D"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC7 4
|
||||
BEGIN
|
||||
PROMPT 2 10 ""
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC7
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_TIPODOC7 CODTAB
|
||||
OUTPUT F_DESDOC7 S0
|
||||
HELP "Tipo di documento 7"
|
||||
FIELD S2[25,28]
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_DESDOC7 40
|
||||
BEGIN
|
||||
PROMPT 12 10 ""
|
||||
FLAG "D"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC8 4
|
||||
BEGIN
|
||||
PROMPT 2 11 ""
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC8
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_TIPODOC8 CODTAB
|
||||
OUTPUT F_DESDOC8 S0
|
||||
HELP "Tipo di documento 8"
|
||||
FIELD S2[29,32]
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_DESDOC8 40
|
||||
BEGIN
|
||||
PROMPT 12 11 ""
|
||||
FLAG "D"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC9 4
|
||||
BEGIN
|
||||
PROMPT 2 12 ""
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC9
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_TIPODOC9 CODTAB
|
||||
OUTPUT F_DESDOC9 S0
|
||||
HELP "Tipo di documento 9"
|
||||
FIELD S2[32,36]
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_DESDOC9 40
|
||||
BEGIN
|
||||
PROMPT 12 12 ""
|
||||
FLAG "D"
|
||||
END
|
||||
|
||||
STRING F_TIPODOC10 4
|
||||
BEGIN
|
||||
PROMPT 2 13 ""
|
||||
USE %TIP
|
||||
INPUT CODTAB F_TIPODOC10
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_TIPODOC10 CODTAB
|
||||
OUTPUT F_DESDOC10 S0
|
||||
HELP "Tipo di documento 10"
|
||||
FIELD S2[37,40]
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_DESDOC10 40
|
||||
BEGIN
|
||||
PROMPT 12 13 ""
|
||||
FLAG "D"
|
||||
END
|
||||
|
||||
ENDMASK
|
||||
|
1060
ve/ve6200.cpp
1060
ve/ve6200.cpp
File diff suppressed because it is too large
Load Diff
424
ve/ve6300.cpp
424
ve/ve6300.cpp
@ -1,430 +1,6 @@
|
||||
// ve6300.cpp. Composizione interattiva dei documenti.
|
||||
|
||||
#include <config.h>
|
||||
#include <application.h>
|
||||
#include <mask.h>
|
||||
#include <relation.h>
|
||||
#include <urldefid.h>
|
||||
#include <utility.h>
|
||||
#include <tabutil.h>
|
||||
|
||||
#include "ve6retv.h"
|
||||
#include "ve6300.h"
|
||||
#include "ve6gen.h"
|
||||
|
||||
class TInterattivo_crea_doc : public TBatch_crea_doc
|
||||
{
|
||||
private:
|
||||
virtual bool menu (MENU_TAG);
|
||||
virtual bool create ();
|
||||
virtual bool destroy();
|
||||
|
||||
// int set_vars(); // setta le variabili della classe
|
||||
int componi_doc_finale(); // corpo del programma
|
||||
static bool tipo_doc_handler (TMask_field&, KEY); // handler per il campo tipo doc. destinaz. della maschera
|
||||
// static bool filterfunct(const TRelation*); // funzione per filtrare i documenti originali
|
||||
|
||||
int _rdoc; // numero di righe nel documento finale
|
||||
public:
|
||||
TInterattivo_crea_doc(void) {}
|
||||
~TInterattivo_crea_doc() {}
|
||||
};
|
||||
|
||||
inline TInterattivo_crea_doc& app() { return (TInterattivo_crea_doc&) main_app(); }
|
||||
|
||||
bool TInterattivo_crea_doc::create()
|
||||
{
|
||||
_interattivo = TRUE;
|
||||
|
||||
const int cargc = argc();
|
||||
const char **vargv = argv();
|
||||
|
||||
if (cargc >= 2)
|
||||
{
|
||||
if (cargc < 5)
|
||||
return error_box ("Numero di parametri insufficiente: chiave incompleta!");
|
||||
|
||||
if (cargc >= 5)
|
||||
{
|
||||
_codnum = vargv[2];
|
||||
_anno = vargv[3];
|
||||
_provv = vargv[4];
|
||||
_ndoc = vargv[5];
|
||||
_crea_doc = (cargc == 7);
|
||||
}
|
||||
|
||||
if (cargc > 7)
|
||||
message_box ("Sono presenti piu' di 6 argomenti sulla linea di comando: possibile errore");
|
||||
}
|
||||
|
||||
dispatch_e_menu(BAR_ITEM(1));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TInterattivo_crea_doc::destroy()
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool TInterattivo_crea_doc::menu(MENU_TAG)
|
||||
{
|
||||
// if (errore_fatale (set_vars())) return FALSE;
|
||||
if (errore_fatale (componi_doc_finale()))
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
TInterattivo_crea_doc::set_vars()
|
||||
{
|
||||
TMask m("ve6300.uml");
|
||||
|
||||
m.set_handler (F_TIPODOCDES, tipo_doc_handler);
|
||||
if (m.run()==K_ESC) return ESC_PRESSED;
|
||||
_datadoc = m.get(F_DATADOC); // data da assegnare al documento da creare
|
||||
_first_codcf = _last_codcf = m.get_long(F_CODCF); // codice cliente
|
||||
_tipo_doc_des = m.get(F_TIPODOCDES); // tipo del documento da creare
|
||||
_codnum = m.get(F_CODNUM); // codice numerazione per il documento da creare
|
||||
_anno << _datadoc.year(); // anno fiscale del documento da creare
|
||||
_provv = m.get(F_PROVV); // indica se il la numerazione _codnum e' provvisoria o definitiva
|
||||
|
||||
// cerca il record di ELD che corrisponde a _tipo_doc_des
|
||||
// TRelation rel("ELD");
|
||||
// TString16 filter ("S8==\"");
|
||||
// filter << _tipo_doc_des << '"';
|
||||
// TCursor curs(&rel, filter);
|
||||
// if (curs.items()==0)
|
||||
// {
|
||||
// fatal_box (TString("Nessuna elaborazione genera documenti del tipo ") << _tipo_doc_des);
|
||||
// return NO_ELABS;
|
||||
// }
|
||||
// else if (curs.items()>1)
|
||||
// warning_box ("Trovate %d elaborazioni per la generazione dei documenti di tipo %s", curs.items(), (const char*)_tipo_doc_des);
|
||||
//
|
||||
// return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
// handler per il tipo documento di destinazione
|
||||
bool TInterattivo_crea_doc::tipo_doc_handler (TMask_field& field, KEY key)
|
||||
{
|
||||
if (key == K_TAB)
|
||||
{
|
||||
if (field.to_check(key))
|
||||
{
|
||||
TFixed_string tdd(field.get(),4); // tipo del documento destinazione selezionato
|
||||
tdd.trim();
|
||||
TTable t("%TIP");
|
||||
t.zero();
|
||||
t.put ("CODTAB", tdd); // cerca tipo del documento destinazione
|
||||
t.read (_isgteq);
|
||||
/* if (err = t.read (_isgteq)) // si posiziona sul record relativo al documento del tipo specificato
|
||||
{
|
||||
error_box ("TElaborazioni::run_mask() : errore di lettura %d da tab(TIP)", err);
|
||||
return READ_ERROR;
|
||||
}
|
||||
*/
|
||||
if (t.get ("CODTAB") != tdd) // verifica che il tipo di documento trovato sia quello richiesto
|
||||
{
|
||||
error_box ("TElaborazioni::run_mask() : non esiste il tipo documento %s in tab(TIP)", (const char *)tdd);
|
||||
return DOC_TYPE_NOT_FOUND;
|
||||
}
|
||||
TFilename profilo(t.get ("S4")); // nome del profilo documento (nome del .ini associato al tipo documento originale)
|
||||
profilo.ext("ini");
|
||||
TConfig profilo_doc(profilo); // file di configurazione (ini) del documento
|
||||
TString tipocf = (profilo_doc.get("TIPOCF", "MAIN"));
|
||||
tipocf.cut(1);
|
||||
field.mask().set(F_TIPOCF, tipocf);
|
||||
}
|
||||
}
|
||||
|
||||
TMask& mask = field.mask();
|
||||
TFixed_string s(mask.get(F_TIPIDOC), 40);
|
||||
if (key==K_ENTER || key==K_TAB)
|
||||
return (s.find(field.get()) % 4) == 0; // per evitare che trovi "0010" in "00010002"
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int TInterattivo_crea_doc::componi_doc_finale()
|
||||
{
|
||||
int err; // errori ritornati dalle funzioni
|
||||
// long n; // numero della fattura nella numerazione corrente
|
||||
bool no_select = TRUE; // TRUE se non sono stati selezionati documenti dallo sheet
|
||||
bool no_elab = TRUE; // TRUE se non ha ancora elaborato nessun documento
|
||||
TLocalisamfile f(LF_DOC); // per gestire la testata dei documenti
|
||||
TLocalisamfile rdoc(LF_RIGHEDOC); // per gestire le righe dei documenti
|
||||
int current = 0; // chiave corrente
|
||||
TRectype pilota (LF_DOC); // record per il documento pilota
|
||||
TTable t("NUM"); // tabella numerazioni
|
||||
TRectype tempr(LF_DOC); // record del documento originale che si sta elaborando
|
||||
TRectype temprdoc (LF_RIGHEDOC); // record per trovare le righe dei documenti originale
|
||||
// int nrdoc; // numero di righe scritte nella fattura
|
||||
// bool end = FALSE; // true non ci sono piu' documenti originali da elaborare
|
||||
bool altri; // TRUE se ci sono altri documenti da includere nella fattura
|
||||
// se _crea_doc, il documento destinazione (testata) deve essere inizializzato
|
||||
// con i valori del primo documento originale selezionato
|
||||
bool primo_pilota = _crea_doc;
|
||||
|
||||
f.put ("CODNUM", _codnum); // la fattura va numerata in base alla codnum specificata in ELD
|
||||
f.put ("ANNO", _anno); // imposta l'anno del documento
|
||||
f.put ("PROVV", _provv); // imposta provv./def. del documento
|
||||
f.put ("NDOC", _ndoc); // imposta il numero del documento
|
||||
|
||||
err = f.read(_isgteq); // cerca il documento
|
||||
if (err) // guarda se si è verificato un errore
|
||||
{
|
||||
error_box ("Errore di lettura %d in doc, cercando il documento", err);
|
||||
return READ_ERROR;
|
||||
}
|
||||
/* else if (_crea_doc) f.curr() = pilota; // tutti i campi della fattura sono uguali al documento pilota, tranne alcuni (impostati più sotto)
|
||||
else {
|
||||
// confronta f.curr() e pilota (se pilota ha dei campi diversi, segnalalo e chiedi conferma
|
||||
}
|
||||
*/
|
||||
// }
|
||||
_first_codcf = _last_codcf = f.get_long("CODCF"); // valori del campo CODCF dei records first e last, per potervi accedere dalla filterfunct()
|
||||
_tipo_doc_des = f.get ("TIPODOC"); // imposta il tipo di documento
|
||||
_stato_f_doc_f = f.get ("STATO"); // stato della fattura appena creata
|
||||
|
||||
TRelation rel (LF_DOC);
|
||||
TString tdfilter(1024);
|
||||
tdfilter =""; // non so se e' necessaria
|
||||
#ifdef _TDD_IN_FILTER
|
||||
// filtro costruito in base a tutti i tipi di doc. che hanno un ELD che li trasforma in _tipo_doc_des
|
||||
tdfilter = td_ELD_to_filter(_tipo_doc_des);
|
||||
#endif
|
||||
|
||||
TSorted_cursor curs (&rel, "NDOC", tdfilter); // lista i documenti ordinati per numero
|
||||
curs.set_filterfunction (filterfunct);
|
||||
|
||||
// non dovrebbe servire : _raggruppa = TRUE;
|
||||
_per_articolo = TRUE;
|
||||
|
||||
// Cursore per selezionare le testate dei documenti
|
||||
if (curs.items() == 0) // se non ci sono bolle allo stato richiesto, indica errore
|
||||
{
|
||||
error_box ("Nessun documento da elaborare.");
|
||||
return NO_ORG_DOCS;
|
||||
}
|
||||
curs.freeze(); // non perdere tempo a riaggiornarti
|
||||
// curs=0; // comincia dal primo documento della lista
|
||||
|
||||
// scandaglia tutto curs e setta _processed tutti i doc. originali che non sono selezionati
|
||||
TString80 Titolo("Documenti elaborabili che possono diventare ");
|
||||
Titolo << _tipo_doc_des;
|
||||
TCursor_sheet docs_sheet(&curs,
|
||||
" |NDOC|TIPODOC|DATADOC|TIPOCF|CODCF|OCFPI",
|
||||
Titolo,
|
||||
"@1|Numero@7|Tipo@4|Data@10|C/F|Cod. cliente|CF o P.IVA@16");
|
||||
|
||||
docs_sheet.enable_check();
|
||||
if (docs_sheet.run()==K_ESC) return ESC_PRESSED;
|
||||
for (int i=0; i<docs_sheet.items(); i++)
|
||||
if (!docs_sheet.checked(i))_processed.set(i);
|
||||
else no_select = FALSE;
|
||||
if (no_select)
|
||||
{
|
||||
error_box ("Nessun documento selezionato.");
|
||||
return NO_ORG_DOCS;
|
||||
}
|
||||
|
||||
// scandaglia tutto curs e torna con errore se un doc. originale non hanno la ELD
|
||||
for (int l=0; l<curs.items();l++)
|
||||
if (!_processed[l])
|
||||
{
|
||||
if ((err = esiste_ELD(curs,l,DONT_SET_PROCESSED))==ELAB_NOT_FOUND) return err;
|
||||
TRectype &curr = curs.curr();
|
||||
TConfig doc_config (getini(curr,err), "RAGGRUPPA"); // prende il .ini di curr
|
||||
_stati_validi_doc_i = doc_config.get ("STATIVALIDI"); // stato iniziale del documento originale
|
||||
if (!statovalido(curr))
|
||||
{
|
||||
error_box("Documento selezionato (tipo %s,numero %s) non e' in uno stato adatto all'elaborazione",
|
||||
curr.get("TIPODOC"), curr.get("NDOC"));
|
||||
return ERR_STATO_NON_VALIDO;
|
||||
}
|
||||
}
|
||||
|
||||
while (next_pilota(curs,pilota)) // ciclo di generazione fattura
|
||||
// locka automaticamente il documento (pilota) che sta elaborando
|
||||
{
|
||||
// get_info(pilota);
|
||||
//*****************************************************
|
||||
//* questa sezione serve a CREARE il documento finale *
|
||||
//*****************************************************
|
||||
|
||||
// imposta il numero per la fattura da creare
|
||||
// inserisce il record di testata della fattura che va a creare
|
||||
|
||||
tempr = pilota; // il primo documento org. da elaborare è quello pilota
|
||||
|
||||
// qui inizia il ciclo per la creazione della fattura
|
||||
// N.B.: appende ogni documento originale nella fattura
|
||||
TRecord_array doc_destinazione (LF_RIGHEDOC, "NRIGA"); // array contenente le righe della fattura
|
||||
TRectype r (LF_RIGHEDOC); // costruisce ed imposta la chiave per doc_destinazione
|
||||
r.zero();
|
||||
r.put ("CODNUM", _codnum);
|
||||
r.put ("ANNO", _anno);
|
||||
r.put ("PROVV", _provv);
|
||||
r.put ("NDOC", _ndoc);
|
||||
doc_destinazione.read(r);
|
||||
// doc_destinazione.set_key(&r);
|
||||
|
||||
// legge tutte le fatture
|
||||
do
|
||||
{
|
||||
// appende il documento originale al documento di destinazione
|
||||
get_info(tempr);
|
||||
bool raggr_parz = get_raggr_parz(tempr,err);
|
||||
TString met = metodo(tempr);
|
||||
// elab_righe restituisce TRUE solo se tutte le righe del documento originale
|
||||
// sono state elaborate, quando cioe' il doc_destinazione deve cambiare stato
|
||||
if (elab_righe(met,raggr_parz,tempr,doc_destinazione,temprdoc))
|
||||
{
|
||||
curs.file(LF_DOC).put ("STATO", _stato_f_doc_i); // aggiorna lo stato del documento originale
|
||||
curs.file(LF_DOC).setkey(1);
|
||||
if (err = curs.file(LF_DOC).rewrite())
|
||||
{
|
||||
error_box ("ve6200: Errore fatale: %d scrivendo sul file DOC", err);
|
||||
return RECORD_WRITE_ERROR;
|
||||
}
|
||||
}
|
||||
if (primo_pilota)
|
||||
{
|
||||
primo_pilota = FALSE;
|
||||
f.curr() = tempr;
|
||||
f.put ("CODNUM", _codnum);
|
||||
f.put ("ANNO", _anno);
|
||||
f.put ("PROVV", _provv);
|
||||
f.put ("NDOC", _ndoc);
|
||||
f.put ("TIPODOC", _tipo_doc_des); // reimposta il tipo di documento
|
||||
f.put ("STATO", _stato_f_doc_f); // stato della fattura appena creata
|
||||
// curs.file(LF_DOC).setkey(1);
|
||||
if (err = f.rewrite())
|
||||
{
|
||||
error_box ("ve6200: Errore fatale: %d scrivendo sul file DOC", err);
|
||||
return RECORD_WRITE_ERROR;
|
||||
}
|
||||
}
|
||||
// unlocka il record del documento processato
|
||||
curs.file(LF_DOC).setkey(2);
|
||||
curs.unlock();
|
||||
// indica che il documento e' stato processato
|
||||
_processed.set(curs.pos());
|
||||
// cerca il prossimo doc. org. da inserire. Se non ce ne sono piu', termina la generazione fattura
|
||||
// se ce ne sono ancora, mette in tempr il record di doc del prossimo documento da agguungere
|
||||
altri = search(pilota, tempr, curs);
|
||||
}
|
||||
while (altri); // fine del ciclo che raggruppa le bolle dentro una fattura
|
||||
|
||||
// controlla se deve raggruppare le righe per codice articolo
|
||||
if (_per_articolo && (doc_destinazione.rows() > 1)) // se deve raggr. e ci sono almeno 2 righe
|
||||
raggruppa_righe (doc_destinazione);
|
||||
|
||||
// salva la fattura creata
|
||||
if (err = doc_destinazione.write())
|
||||
{
|
||||
error_box ("Errore nella scrittura del doc. destinazione. err = %d", err);
|
||||
return RECORD_WRITE_ERROR;
|
||||
}
|
||||
|
||||
no_elab = FALSE; // ha elaborato almeno un documento
|
||||
|
||||
// cerca il prossimo documeto pilota
|
||||
}; // finche' i documenti non finiscono
|
||||
if (no_elab) // se non ci sono bolle allo stato richiesto, indica errore
|
||||
{
|
||||
error_box ("Nessun documento elaborato.");
|
||||
return NO_ORG_DOCS;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ve6300 (int argc, char** argv)
|
||||
{
|
||||
TInterattivo_crea_doc a;
|
||||
a.run (argc, argv, "Composizione documenti");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
TPerson p ("MATTEO LIGABUE");
|
||||
p.send_message(
|
||||
"DISCLAIMER: se leggerai questo pseudocodice e lo troverai childish, sappi che dopo la prima
|
||||
stesura non l'ho piu' modificato, quindi questa e' l'idea che inizialmente avevo del programma
|
||||
di composizione interattiva.");
|
||||
p.bye();
|
||||
|
||||
- il prg per ora fa:
|
||||
|
||||
a) runna una maschera in cui chiede:
|
||||
a1) il codice di numerazione del doc da comporre (+PROVV)
|
||||
a2) il tipo di documento da comporre
|
||||
a3) la data (AUTOMAGIC)
|
||||
a4) TIPOCF/CODCF del doc da comporre (e degli originali da selezionare)
|
||||
a5) tipo di documento originale (da TOGLIERE !!!)
|
||||
|
||||
b) runna un TCursor_Sheet con i documenti individuati da scegliere ed elaborare
|
||||
|
||||
c) runna un TInterattivo_sheet (TCursor_Sheet) con le singole righe da elaborare (selezionabili)
|
||||
|
||||
d) se la relativa tabella ELD permette l'evasione di parti di riga,
|
||||
a1) mostrare il TCursor_sheet o TSpreadsheet (TSheet_field con maschera ve6301.uml)
|
||||
a2) che possa trattare l'evasione parziale (TCursor_sheet -> con un campo number staccato dallo sheet)
|
||||
a3) oppure il TSpreadsheet (TSheet_field) con tutte le colonne disabilitate, tranne la QTA_DA_EVADERE
|
||||
|
||||
il programma deve ancora:
|
||||
|
||||
a) passare la trasformazione al ve6200, che nella sua parte centrale (elaborazione del singolo doc.)
|
||||
deve avere la eventuale selezione (da richiedersi in base ad un flag che ve6200 e ve6300 devono
|
||||
settare rispettivamente a FALSE e TRUE, alla propria entrata) delle singole righe....
|
||||
aggiornare la qtaevase dei singoli sorgenti...
|
||||
lo stato del documento varia solo con la completa evasione delle righe !!!
|
||||
|
||||
... da continuare ...
|
||||
|
||||
- controllare lo stato dei documenti originali
|
||||
|
||||
-*chiama una funzione che runna la maschera e copia i nomi dei campi in variabili private
|
||||
-*chiama una funzione che trova il record di ELD relativo al documento destinazione specificato
|
||||
e setta le rimanenti variabili private
|
||||
-*chiama una funzione che trova i documenti (testate) validi. Usare un TSorted_cursor od un
|
||||
TRecord_array
|
||||
|
||||
componi la testata del documento originale con le variabili private (non metterci NDOC)
|
||||
while l'utente non preme il button "Salva" per salvare il documento composto
|
||||
se l'utente vuole inserire un documento dalla lista allora
|
||||
mostra la lista
|
||||
per ogni documento selezionato
|
||||
se il flag "raggruppa unito" e' true, allora // caso doc. orig = BOLLE
|
||||
fagli vedere le righe
|
||||
attendi che prema un button
|
||||
se preme ok aggiungi le righe al documento finale
|
||||
end se ru=TRUE
|
||||
altrimenti // caso doc. orig = ORDINI
|
||||
fagli vedere le righe
|
||||
attendi che selezioni le righe (possibilita' di selezionarle tutte)
|
||||
//
|
||||
usare un TBit_array per indicare se una riga va evasa tutta oppure se ne e' stata specificata una parte
|
||||
settare a TRUE tutto il TBit_array; ??????????
|
||||
se doubleclicka una riga
|
||||
chiedigli la quantita' da evadere (puo' essere inferiore alla quantita' ordinata su quella riga)
|
||||
scrivi nel documento originale la quantita' evasa
|
||||
setta il TBit_array per indicare che nella bolla deve essere scritta la quantita' evasa
|
||||
end se dblclk riga
|
||||
//
|
||||
...preferisco usare un TArray delle quantita' evase
|
||||
|
||||
end altrimenti (ru=FALSE)
|
||||
end per ogni documento selezionato
|
||||
end se seleziona dei documenti
|
||||
altrimenti // vuole aggiungere delle righe
|
||||
leggi i campi della riga (settando automaticamente codnum, ecc.)
|
||||
metti la riga letta nel documento finale
|
||||
end altrimenti (inserimento righe)
|
||||
end
|
||||
|
||||
scrivi NDOC nella testata del documento
|
||||
scrivi la testata del documento
|
||||
salva il documento destinazione
|
||||
end
|
||||
*/
|
||||
|
201
ve/velib01.cpp
Executable file
201
ve/velib01.cpp
Executable file
@ -0,0 +1,201 @@
|
||||
#include <clifo.h>
|
||||
|
||||
#include "velib01.h"
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Documento per vendite
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
TDocumento_vendita::TDocumento_vendita()
|
||||
: _head(LF_DOC), _rows(LF_RIGHEDOC, "NRIGA")
|
||||
{
|
||||
}
|
||||
|
||||
TDocumento_vendita::TDocumento_vendita(const char* codnum, int anno, char provv, long numdoc)
|
||||
: _head(LF_DOC), _rows(LF_RIGHEDOC, "NRIGA")
|
||||
{
|
||||
read(codnum, anno, provv, numdoc);
|
||||
}
|
||||
|
||||
int TDocumento_vendita::read(const TRectype& rec)
|
||||
{
|
||||
_head = rec; // Inizializza i campi chiave in ogni caso
|
||||
|
||||
TLocalisamfile doc(LF_DOC);
|
||||
int err = _head.read(doc);
|
||||
if (err == NOERR)
|
||||
{
|
||||
TRectype* key = new TRectype(LF_RIGHEDOC);
|
||||
key->put("CODNUM", doc.get("CODNUM"));
|
||||
key->put("ANNO", doc.get("ANNO"));
|
||||
key->put("PROVV", doc.get("PROVV"));
|
||||
key->put("NUMDOC", doc.get("NUMDOC"));
|
||||
err = _rows.read(key);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
int TDocumento_vendita::read(const char* codnum, int anno, char provv, long numdoc)
|
||||
{
|
||||
CHECK(codnum && *codnum && anno > 0 && (provv == 'D' || provv == 'P') && numdoc > 0,
|
||||
"Codice documento non valido");
|
||||
|
||||
_head.zero();
|
||||
_head.put("CODNUM", codnum);
|
||||
_head.put("ANNO", anno);
|
||||
_head.put("PROVV", provv);
|
||||
_head.put("NUMDOC", numdoc);
|
||||
|
||||
return read(_head);
|
||||
}
|
||||
|
||||
int TDocumento_vendita::write(bool re) const
|
||||
{
|
||||
TLocalisamfile doc(LF_DOC);
|
||||
int err = re ? _head.rewrite(doc) : _head.write(doc);
|
||||
if (err != NOERR)
|
||||
err = re ? _head.write(doc) : _head.rewrite(doc);
|
||||
if (err == NOERR)
|
||||
err = _rows.write(re);
|
||||
return err;
|
||||
}
|
||||
|
||||
int TDocumento_vendita::remove() const
|
||||
{
|
||||
TLocalisamfile doc(LF_DOC);
|
||||
int err = _head.remove(doc);
|
||||
if (err == NOERR)
|
||||
err = _rows.remove();
|
||||
return err;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// Cliente per vendite
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
void TLista_clienti::TCliente::init(const TRectype& rec)
|
||||
{
|
||||
CHECK(rec.num() == LF_CFVEN, "E' necessario un cliente per vendite");
|
||||
_codice = rec.get_long(CLI_CODCF);
|
||||
_agente = rec.get_long(CLI_CODAG);
|
||||
_zona = rec.get_long(CLI_CODZONA);
|
||||
}
|
||||
|
||||
bool TLista_clienti::TCliente::read(long cod)
|
||||
{
|
||||
TRelation clifo(LF_CLIFO);
|
||||
clifo.add(LF_CFVEN, "TIPOCF=TIPOCF|CODCF=CODCF");
|
||||
|
||||
clifo.curr().put(CLI_TIPOCF, "C");
|
||||
clifo.curr().put(CLI_CODCF, cod);
|
||||
if (clifo.read() == NOERR)
|
||||
init(clifo.curr(LF_CFVEN));
|
||||
else
|
||||
zero();
|
||||
|
||||
return ok();
|
||||
}
|
||||
|
||||
TLista_clienti::TCliente::TCliente(const TRectype& rec)
|
||||
{
|
||||
if (rec.num() == LF_CFVEN)
|
||||
init(rec);
|
||||
else
|
||||
{
|
||||
_codice = rec.get_long(CLI_CODCF);
|
||||
read(_codice);
|
||||
}
|
||||
}
|
||||
|
||||
int TLista_clienti::leggi(long dc, long ac, long da, long aa, long dz, long az)
|
||||
{
|
||||
TRelation clifo(LF_CLIFO);
|
||||
clifo.add(LF_CFVEN, "TIPOCF=TIPOCF|CODCF=CODCF");
|
||||
|
||||
TRectype start(LF_CLIFO), stop(LF_CLIFO);
|
||||
|
||||
start.put(CLI_TIPOCF, 'C');
|
||||
stop.put(CLI_TIPOCF, 'C');
|
||||
|
||||
if (dc > 0)
|
||||
start.put(CLI_CODCF, dc);
|
||||
|
||||
if (ac > 0)
|
||||
stop.put(CLI_CODCF, ac);
|
||||
|
||||
TString filter(32);
|
||||
if (da > 0)
|
||||
filter << '(' << LF_CFVEN << "->" << CLI_CODAG << ">=" << da << ')';
|
||||
if (aa > 0)
|
||||
{
|
||||
if (filter.not_empty()) filter << "&&";
|
||||
filter << '(' << LF_CFVEN << "->" << CLI_CODAG << "<=" << aa << ')';
|
||||
}
|
||||
if (dz > 0)
|
||||
{
|
||||
if (filter.not_empty()) filter << "&&";
|
||||
filter << '(' << LF_CFVEN << "->" << CLI_CODZONA << ">=" << dz << ')';
|
||||
}
|
||||
if (az > 0)
|
||||
{
|
||||
if (filter.not_empty()) filter << "&&";
|
||||
filter << '(' << LF_CFVEN << "->" << CLI_CODZONA << "<=" << az << ')';
|
||||
}
|
||||
|
||||
TCursor cur(&clifo, filter, 1, &start, &stop);
|
||||
for (cur = 0; cur.ok(); ++cur)
|
||||
{
|
||||
TCliente* c = new TCliente(cur.curr(LF_CFVEN));
|
||||
_clienti.add(c);
|
||||
}
|
||||
|
||||
if (dc > 0 || ac > 0) ordina_per_codice(); else
|
||||
if (da > 0 || aa > 0) ordina_per_agente(); else
|
||||
if (dz > 0 || az > 0) ordina_per_zona();
|
||||
|
||||
return _clienti.items();
|
||||
}
|
||||
|
||||
int TLista_clienti::sort_by_code(const TObject** o1, const TObject** o2)
|
||||
{
|
||||
TLista_clienti::TCliente* c1 = (TLista_clienti::TCliente*)*o1;
|
||||
TLista_clienti::TCliente* c2 = (TLista_clienti::TCliente*)*o2;
|
||||
const long d = c1->codice() - c2->codice();
|
||||
return d == 0L ? 0 : (d > 0 ? +1 : -1);
|
||||
}
|
||||
|
||||
int TLista_clienti::sort_by_agent(const TObject** o1, const TObject** o2)
|
||||
{
|
||||
TLista_clienti::TCliente* c1 = (TLista_clienti::TCliente*)*o1;
|
||||
TLista_clienti::TCliente* c2 = (TLista_clienti::TCliente*)*o2;
|
||||
const long d = c1->agente() - c2->agente();
|
||||
return d == 0L ? 0 : (d > 0 ? +1 : -1);
|
||||
}
|
||||
|
||||
int TLista_clienti::sort_by_zone(const TObject** o1, const TObject** o2)
|
||||
{
|
||||
TLista_clienti::TCliente* c1 = (TLista_clienti::TCliente*)*o1;
|
||||
TLista_clienti::TCliente* c2 = (TLista_clienti::TCliente*)*o2;
|
||||
const long d = c1->zona() - c2->zona();
|
||||
return d == 0L ? 0 : (d > 0 ? +1 : -1);
|
||||
}
|
||||
|
||||
int TLista_clienti::ordina_per_codice()
|
||||
{
|
||||
_clienti.sort(sort_by_code);
|
||||
return _clienti.items();
|
||||
}
|
||||
|
||||
int TLista_clienti::ordina_per_agente()
|
||||
{
|
||||
_clienti.sort(sort_by_agent);
|
||||
return _clienti.items();
|
||||
}
|
||||
|
||||
int TLista_clienti::ordina_per_zona()
|
||||
{
|
||||
_clienti.sort(sort_by_zone);
|
||||
return _clienti.items();
|
||||
}
|
||||
|
82
ve/velib01.h
Executable file
82
ve/velib01.h
Executable file
@ -0,0 +1,82 @@
|
||||
#ifndef __VELIB01_H
|
||||
#define __VELIB01_H
|
||||
|
||||
#ifndef __RELATION_H
|
||||
#include <relation.h>
|
||||
#endif
|
||||
|
||||
class TDocumento_vendita : public TObject
|
||||
{
|
||||
TRectype _head; // Record di testata
|
||||
TRecord_array _rows; // Array di TRectype per le righe documenti di vendita.
|
||||
|
||||
public:
|
||||
int rows() const { return _rows.rows(); }
|
||||
|
||||
const TRectype& head() const { return _head; } // Ritorna la testata del documento
|
||||
const TRectype& operator[](int index) const { return _rows.row(index); } // Ritorna la riga n-esima del documento
|
||||
TRectype& operator[](int index) { return _rows.row(index, FALSE); }
|
||||
TRectype& add_row() { return _rows.row(-1, TRUE); }
|
||||
bool destroy_row(int n) { return _rows.destroy_row(n); }
|
||||
|
||||
int read(const char* codnum, int anno, char provv, long numdoc);
|
||||
int read(const TRectype& rec);
|
||||
int write(bool re = FALSE) const;
|
||||
int rewrite() const { return write(TRUE); }
|
||||
int remove() const;
|
||||
|
||||
TDocumento_vendita ();
|
||||
TDocumento_vendita(const char* codnum, int anno, char provv, long numdoc);
|
||||
virtual ~TDocumento_vendita() { }
|
||||
};
|
||||
|
||||
class TLista_clienti : public TObject
|
||||
{
|
||||
class TCliente : public TObject
|
||||
{
|
||||
long _codice;
|
||||
long _agente;
|
||||
long _zona;
|
||||
|
||||
protected:
|
||||
void zero() { _codice = _agente = _zona = 0L; }
|
||||
void init(const TRectype& rec);
|
||||
bool read(long cod);
|
||||
|
||||
public: // TObject
|
||||
virtual bool ok() const { return _codice > 0; }
|
||||
|
||||
public:
|
||||
long codice() const { return _codice; }
|
||||
long agente() const { return _agente; }
|
||||
long zona() const { return _zona; }
|
||||
|
||||
TCliente() { zero(); }
|
||||
TCliente(long cod) { read(cod); }
|
||||
TCliente(const TRectype& rec);
|
||||
virtual ~TCliente() { }
|
||||
};
|
||||
|
||||
TArray _clienti;
|
||||
|
||||
protected:
|
||||
const TCliente& cliente(int n) const { return (TCliente&)_clienti[n]; }
|
||||
|
||||
static int sort_by_code(const TObject** o1, const TObject** o2);
|
||||
static int sort_by_agent(const TObject** o1, const TObject** o2);
|
||||
static int sort_by_zone(const TObject** o1, const TObject** o2);
|
||||
|
||||
public:
|
||||
int ordina_per_codice();
|
||||
int ordina_per_agente();
|
||||
int ordina_per_zona();
|
||||
|
||||
int leggi(long dc, long ac, long da = 0, long aa = 0, long dz = 0, long az = 0);
|
||||
|
||||
long operator[] (int n) const { return cliente(n).codice(); }
|
||||
|
||||
TLista_clienti() { }
|
||||
virtual ~TLista_clienti() { }
|
||||
};
|
||||
|
||||
#endif
|
Loading…
x
Reference in New Issue
Block a user