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:
guy 1996-08-08 09:24:17 +00:00
parent ce6869e681
commit 07bcd60df8
7 changed files with 411 additions and 1590 deletions

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

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