Terminati ??? programmi di fatturazione bolle etc...:wq
git-svn-id: svn://10.65.10.50/trunk@2671 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
21d7280d7e
commit
359af91a58
11
ve/batbeld.h
Executable file
11
ve/batbeld.h
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
// campi della tabella di gestione delle elaborazioni differite
|
||||||
|
#define F_CODICE 101
|
||||||
|
#define F_DESCR 102
|
||||||
|
#define F_TIPODOC 103
|
||||||
|
#define F_STATO_I_DOC_I 104
|
||||||
|
#define F_STATO_F_DOC_I 106
|
||||||
|
#define F_TIPODOCDES 105
|
||||||
|
#define F_STATO_F_DOC_F 107
|
||||||
|
#define F_PROGRAMMA 108
|
||||||
|
#define F_CODNUM 109
|
||||||
|
#define F_AVVIA 110 // button per lanciare l'elaborazione selezionata
|
122
ve/batbeld.uml
Executable file
122
ve/batbeld.uml
Executable file
@ -0,0 +1,122 @@
|
|||||||
|
#include "batbeld.h"
|
||||||
|
|
||||||
|
TOOLBAR "" 0 20 0 2
|
||||||
|
#include <toolbar.h>
|
||||||
|
ENDPAGE
|
||||||
|
|
||||||
|
PAGE "Tabella elaborazioni differite" 0 0 0 0
|
||||||
|
|
||||||
|
STRING F_CODICE 8 // campo della maschera: stringa, id = F_CODICE, 8 caratteri
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 2 "Codice " // scrivi nella maschera alle coord. (x,y) = (1,2) il prompt "Codice"
|
||||||
|
FLAG "U"
|
||||||
|
FIELD CODTAB // campo del database tabelle (tab) in cui salvare il valore immesso dall'utente
|
||||||
|
CHECKTYPE REQUIRED // indica che il campo deve essere compilato per poter salvare
|
||||||
|
WARNING "E' necessario specificare un valore"
|
||||||
|
USE ELD // indica quale tabella utilizzare per le ricerche
|
||||||
|
INPUT CODTAB F_CODICE // cerca nel dbase la prima occorrenza di F_CODICE cercando nel campo CODTAB
|
||||||
|
DISPLAY "Codice@10" CODTAB // visualizza i codici trovati (CODTAB)
|
||||||
|
DISPLAY "Descrizione@50" S0 // visualizza la descrizione (campo S0 in uno spazio di 50 caratteri)
|
||||||
|
OUTPUT F_CODICE CODTAB // metti F_CODICE nel campo codtab
|
||||||
|
OUTPUT F_DESCR S0 // metti F_DESCR nel campo S0
|
||||||
|
KEY 1
|
||||||
|
HELP "Codice dell'elaborazione differita da eseguire"
|
||||||
|
MESSAGE ENABLE, F_PROGRAMMA
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_DESCR 50
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 3 "Descrizione "
|
||||||
|
FIELD S0
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
WARNING "E' necessario specificare un valore"
|
||||||
|
USE ELD KEY 2
|
||||||
|
INPUT S0 F_DESCR
|
||||||
|
DISPLAY "Descrizione@50" S0
|
||||||
|
DISPLAY "Codice" CODTAB
|
||||||
|
COPY OUTPUT F_CODICE // usa il segmento di codice per OUTPUT F_CODICE
|
||||||
|
KEY 2
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_TIPODOC 4
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 4 "Tipo documento originale "
|
||||||
|
FIELD S6 // usa il campo S6 del database tab
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
WARNING "E' necessario specificare un valore"
|
||||||
|
USE %TIP
|
||||||
|
INPUT CODTAB F_TIPODOC
|
||||||
|
DISPLAY "Codice" CODTAB
|
||||||
|
DISPLAY "Tipo documento@50" S0
|
||||||
|
OUTPUT F_TIPODOC CODTAB
|
||||||
|
END
|
||||||
|
|
||||||
|
|
||||||
|
// STRING F_STATO_I_DOC_I 1
|
||||||
|
// BEGIN
|
||||||
|
// PROMPT 1 5 "Stato del documento originale "
|
||||||
|
// FIELD S7
|
||||||
|
// CHECKTYPE REQUIRED
|
||||||
|
// WARNING "E' necessario specificare un valore"
|
||||||
|
// END
|
||||||
|
|
||||||
|
// STRING F_STATO_F_DOC_I 1
|
||||||
|
// BEGIN
|
||||||
|
// PROMPT 1 6 "Stato finale del documento originale "
|
||||||
|
// FIELD S4
|
||||||
|
// CHECKTYPE REQUIRED
|
||||||
|
// WARNING "E' necessario specificare un valore"
|
||||||
|
// END
|
||||||
|
|
||||||
|
STRING F_TIPODOCDES 4
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 7 "Tipo documento di destinazione "
|
||||||
|
FIELD S8
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
WARNING "E' necessario specificare un valore"
|
||||||
|
USE %TIP
|
||||||
|
INPUT CODTAB F_TIPODOCDES
|
||||||
|
COPY DISPLAY F_TIPODOC
|
||||||
|
OUTPUT F_TIPODOCDES CODTAB
|
||||||
|
END
|
||||||
|
|
||||||
|
// STRING F_STATO_F_DOC_F 1
|
||||||
|
// BEGIN
|
||||||
|
// PROMPT 1 8 "Stato finale del documento finale "
|
||||||
|
// FIELD S9
|
||||||
|
// CHECKTYPE REQUIRED
|
||||||
|
// WARNING "E' necessario specificare un valore"
|
||||||
|
// END
|
||||||
|
|
||||||
|
STRING F_CODNUM 4
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 9 "Codice numerazione per il documento di destinazione: "
|
||||||
|
FIELD S5
|
||||||
|
USE NUM
|
||||||
|
INPUT CODTAB F_CODNUM
|
||||||
|
DISPLAY "Codice" CODTAB
|
||||||
|
DISPLAY "Descrizione@50" S0
|
||||||
|
OUTPUT F_CODNUM CODTAB
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
WARNING "E' necessario specificare un valore"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_PROGRAMMA 50
|
||||||
|
BEGIN
|
||||||
|
// PROMPT 1 10 "Programma (nome + parametri): "
|
||||||
|
PROMPT 1 10 "Metodo di elaborazione "
|
||||||
|
FLAGS "G"
|
||||||
|
FIELD S1
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON F_AVVIA 21 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 11 "Lancia elaborazione"
|
||||||
|
MESSAGE RUN,#F_PROGRAMMA
|
||||||
|
FL "D"
|
||||||
|
END
|
||||||
|
|
||||||
|
ENDPAGE
|
||||||
|
|
||||||
|
ENDMASK
|
15
ve/ve6.cpp
15
ve/ve6.cpp
@ -1,11 +1,10 @@
|
|||||||
#include <xvt.h>
|
|
||||||
#include <strings.h>
|
|
||||||
#include <checks.h>
|
#include <checks.h>
|
||||||
#include <rectypes.h>
|
#include <stdlib.h>
|
||||||
|
#include <xvt.h>
|
||||||
|
|
||||||
#include "ve6.h" // dichiarazioni delle procedure
|
#include "ve6.h" // dichiarazioni delle procedure
|
||||||
|
|
||||||
#define usage "Errore - Utilizzo: %s -1"
|
#define usage "Errore - Utilizzo: %s -1 -2 -3"
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
@ -15,7 +14,13 @@ int main( int argc, char** argv )
|
|||||||
switch (r)
|
switch (r)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
rt = ve6100( argc, argv);
|
rt = ve6100( argc, argv ); // gestione tabella ELD
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rt = ve6200 (argc, argv); // creazione fatture partendo da bolle
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
rt = ve6300 (argc, argv);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error_box( usage, argv[0] );
|
error_box( usage, argv[0] );
|
||||||
|
21
ve/ve6.h
21
ve/ve6.h
@ -1,15 +1,10 @@
|
|||||||
// Dichiarazione della classe per l'applicazione ve6.cpp
|
// Dichiarazione delle funzioni per ve6.cpp
|
||||||
|
|
||||||
|
#if !defined (_VE6_H)
|
||||||
|
#define _VE6_H
|
||||||
|
|
||||||
|
int ve6100 (int, char**);
|
||||||
|
int ve6200 (int, char**);
|
||||||
|
int ve6300 (int, char**);
|
||||||
|
|
||||||
#if !defined(_VE6_ELAB_STRUCT)
|
|
||||||
#define _VE6_ELAB_STRUCT
|
|
||||||
/* struttura in cui sono memorizzati i campi dell'elaborazione differita che
|
|
||||||
servono sia alla ve6gen che alle procedure particolari di generazione */
|
|
||||||
typedef struct TElab_structTag
|
|
||||||
{
|
|
||||||
TString tipo_doc_org; // tipo documento originale
|
|
||||||
TString tipo_doc_des; // tipo documento finale
|
|
||||||
TString stato_doc_ini; // stato documento originale prima dell'elaborazione
|
|
||||||
TString stato_doc_fin; // dopo l'elaborazione
|
|
||||||
TString codnum; // codice per la numerazione del documento di destinazione
|
|
||||||
} TElab_struct;
|
|
||||||
#endif
|
#endif
|
||||||
|
29
ve/ve6.url
29
ve/ve6.url
@ -1,36 +1,23 @@
|
|||||||
#include <default.url>
|
#include <default.url>
|
||||||
|
|
||||||
/* ba1 -0 */
|
/* ve6 */
|
||||||
MENU TASK_MENUBAR
|
MENU TASK_MENUBAR
|
||||||
SUBMENU MENU_FILE "~File"
|
SUBMENU MENU_FILE "~File"
|
||||||
|
|
||||||
|
/* ve6 -1 */
|
||||||
/* ba1 -1 */
|
|
||||||
MENUBAR MENU_BAR(1)
|
MENUBAR MENU_BAR(1)
|
||||||
|
|
||||||
MENU MENU_BAR(1)
|
MENU MENU_BAR(1)
|
||||||
SUBMENU MENU_FILE "~File"
|
SUBMENU MENU_FILE "~File"
|
||||||
ITEM BAR_ITEM(1) "~Test"
|
|
||||||
|
|
||||||
|
/* ve6 -2 */
|
||||||
/* ba1 -2 */
|
|
||||||
MENUBAR MENU_BAR(2)
|
MENUBAR MENU_BAR(2)
|
||||||
|
|
||||||
MENU MENU_BAR(2)
|
MENU MENU_BAR(2)
|
||||||
SUBMENU MENU_FILE "~File"
|
SUBMENU MENU_FILE "~File"
|
||||||
ITEM BAR_ITEM(1) "~Test"
|
|
||||||
ITEM BAR_ITEM(2) "~Debug"
|
|
||||||
|
|
||||||
/* ba1 -3 */
|
/* ve6 -3 */
|
||||||
MENUBAR MENU_BAR(3)
|
MENUBAR MENU_BAR(3)
|
||||||
|
|
||||||
MENU MENU_BAR(3)
|
MENU MENU_BAR(3)
|
||||||
SUBMENU MENU_FILE "~File"
|
SUBMENU MENU_FILE "~File"
|
||||||
|
|
||||||
/* ba1 -4 */
|
|
||||||
MENUBAR MENU_BAR(4)
|
|
||||||
|
|
||||||
MENU MENU_BAR(4)
|
|
||||||
SUBMENU MENU_FILE "~File"
|
|
||||||
|
|
||||||
|
|
||||||
|
207
ve/ve6100.cpp
207
ve/ve6100.cpp
@ -1,185 +1,58 @@
|
|||||||
// ve6100.cpp: modulo per la generazione delle fatture.
|
// ve6100.cpp: modulo per la gestione della tabella elaborazioni differite.
|
||||||
|
|
||||||
#include "ve6retv.h" // valori di ritorno dalle varie funzioni
|
#include <tabapp.h>
|
||||||
|
#include "batbeld.h"
|
||||||
|
|
||||||
class TCrea_fatture : public TElaborazioni
|
class TGestione_ELD : public Tab_application
|
||||||
{
|
{
|
||||||
protected:
|
protected: // TRelation_application
|
||||||
virtual bool menu (MENU_TAG);
|
virtual bool user_create() ;
|
||||||
virtual bool create () ;
|
virtual bool protected_record(TRectype& rec) ;
|
||||||
virtual bool destroy();
|
virtual void init_insert_mode(TMask& m) ;
|
||||||
|
virtual void init_modify_mode(TMask& m);
|
||||||
|
virtual int rewrite(const TMask& m);
|
||||||
|
virtual void init_query_mode (TMask& m);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TCrea_fatture (void) {} // costruttore
|
TGestione_ELD() {}
|
||||||
|
virtual ~TGestione_ELD() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
bool TCrea_fatture::create()
|
inline bool TGestione_ELD::user_create()
|
||||||
|
{ return Tab_application::user_create(); }
|
||||||
|
|
||||||
|
inline bool TGestione_ELD::protected_record(TRectype& rec)
|
||||||
|
{ return Tab_application::protected_record(rec); }
|
||||||
|
|
||||||
|
inline void TGestione_ELD::init_insert_mode(TMask& m)
|
||||||
{
|
{
|
||||||
cod_elab = "01"; // imposta il codice elaborazione (per il riferimento alla tabella ELD)
|
Tab_application::init_insert_mode(m);
|
||||||
dispatch_e_menu(BAR_ITEM(1)); // chiama il metodo menu
|
m.disable (F_AVVIA); // disabilita il button quando il record non e' ancora stato registrato
|
||||||
return TRUE;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TCrea_fatture::destroy()
|
inline int TGestione_ELD::rewrite(const TMask& m)
|
||||||
|
{ return Tab_application::rewrite (m); }
|
||||||
|
|
||||||
|
void TGestione_ELD::init_modify_mode(TMask& m)
|
||||||
{
|
{
|
||||||
delete _msk;
|
Tab_application::init_modify_mode(m);
|
||||||
return TRUE;
|
m.enable (F_AVVIA); // abilita la pressione del tasto solo quando il record e' stato registrato
|
||||||
|
TString temp = m.get(F_CODICE);
|
||||||
|
if (temp == "01")
|
||||||
|
m.enable(F_PROGRAMMA, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TCrea_fatture::menu(MENU_TAG)
|
void TGestione_ELD::init_query_mode (TMask& m)
|
||||||
{
|
{
|
||||||
int err; // errore ritornato dalle funzioni
|
Tab_application::init_query_mode(m);
|
||||||
if (err = scan_doc()) // se durante la scansione c'è un errore, esci
|
m.enable (F_AVVIA, FALSE); // disabilita il button anche in modalita' ricerca
|
||||||
return !errore_fatale(err);
|
return;
|
||||||
|
}
|
||||||
switch (ordinamento) // in base all'ordinamento, lancia diverse procedure di creazione
|
|
||||||
{
|
|
||||||
case CLIENTE:
|
|
||||||
// crea fatture raggruppando per cliente
|
|
||||||
err = per_cliente();
|
|
||||||
break;
|
|
||||||
case AGENTE:
|
|
||||||
// crea fatture per agente
|
|
||||||
break;
|
|
||||||
case ZONA:
|
|
||||||
// crea fatture per zona
|
|
||||||
break;
|
|
||||||
case DATA_NUMDOC:
|
|
||||||
if (raggruppa)
|
|
||||||
// crea fatture per data/numero documento
|
|
||||||
else
|
|
||||||
// crea una fattura per ogni cliente
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (err) while (!getchar()); // se c'è un errore, attende la pressione di invio
|
|
||||||
return !errore_fatale(err) // ritorna FALSE se c'è stato un errore fatale
|
|
||||||
}
|
|
||||||
|
|
||||||
int per_cliente(void)
|
|
||||||
{
|
|
||||||
TLocalisamfile f(LF_DOC);
|
|
||||||
TLocalisamfile rdoc(LF_RDOC);
|
|
||||||
int current = 0; // chiave corrente
|
|
||||||
TToken_string tempt; // ttoken string temporanea
|
|
||||||
TString cliente;
|
|
||||||
TRectype tempr (LF_DOC);
|
|
||||||
TRectype temprdoc (LF_RDOC);
|
|
||||||
TTable t("NUM"); // tabella numerazioni
|
|
||||||
int nrdoc=0; // numero di riga della fattura
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
// memorizza il record del documento pilota
|
|
||||||
f.zero();
|
|
||||||
tempt = _chiavi->row(current); // rileva la chiave corrente
|
|
||||||
codnum = tempt.get(0)
|
|
||||||
f.put ("CODNUM", codnum); // memorizza i valori della chiave corrente nel record
|
|
||||||
f.put ("ANNO", tempt.get());
|
|
||||||
f.put ("PROVV", tempt.get());
|
|
||||||
f.put ("NDOC", tempt.get());
|
|
||||||
if (!f.read (_isequal)) // cerca il record corrispondente alla chiave corrente
|
|
||||||
{
|
|
||||||
error_box ("TCrea_fatture::per_cliente() : errore %d durante la lettura su doc", err);
|
|
||||||
return READ_ERROR;
|
|
||||||
}
|
|
||||||
tempr = f.curr(); // copia ilrecord del doc. pilota in tempr
|
|
||||||
|
|
||||||
// imposta il numero documento per la fattura da creare
|
|
||||||
t.zero();
|
|
||||||
t.put ("CODTAB", _elab.codnum); // codice numerazione per le fatture
|
|
||||||
t.read (_isgteq); // legge il primo record con lo stesso codice di numerazione
|
|
||||||
if (t.get("CODTAB") == _elab.codnum) // controlla che il codice numerazione sia effettivamente lo stesso
|
|
||||||
{
|
|
||||||
n = t.get("I1"); // legge l'ultimo numero di documento utilizzato (o il primo disponibile)
|
|
||||||
// supponiamo che sia l'ultimo utilizzato
|
|
||||||
n++; // ora n è il numero della mia fattura (da mettere in NDOC);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
n = 1; // se non esiste alcun documento con il codice numerazione specificato, allora la fattura corrente è la n° 1
|
|
||||||
|
|
||||||
// inserisce il record del documento pilota in doc
|
|
||||||
f.curr() = tempr // tutti i campi della fattura sono uguali al documento pilota, tranne alcuni (impostati più sotto)
|
|
||||||
f.put ("NDOC", n); // imposta il numero del documento
|
|
||||||
f.put ("TIPODOC", _elab.tipo_doc_des); // imposta il tipo di documento
|
|
||||||
f.put ("STATO", ???); // stato della fattura appena creata
|
|
||||||
|
|
||||||
if ((err = f.write()) == NOERR) // se nonci sono problemi
|
|
||||||
{
|
|
||||||
t--; // si posiziona sul record precedente nella tabella numerazione
|
|
||||||
t.put ("I1", n); // imposta nuovo numero del documento
|
|
||||||
t.write(); // registra
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
switch (err)
|
|
||||||
{
|
|
||||||
case REINSERT:
|
|
||||||
message_box ("ve6100: Errore fatale: il record con la chiave specificata esiste già: impossibile sovrascrivere");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
message_box ("ve6100: Errore fatale: %d scrivendo sulla tabella NDOC", err);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return RECORD_WRITE_ERROR; // indica al chiamante un errore nella scrittura di un record
|
|
||||||
}
|
|
||||||
|
|
||||||
// cerca la prima riga del documento pilota in rdoc
|
|
||||||
nrdoc = 1; // comincia dalla prima riga
|
|
||||||
temprdoc.zero();
|
|
||||||
temprdoc.put ("CODNUM", tempr.get("CODNUM"));
|
|
||||||
temprdoc.put ("ANNO", tempr.get ("ANNO"));
|
|
||||||
temprdoc.put ("PROVV", tempr.get("PROVV"));
|
|
||||||
temprdoc.put ("NDOC", tempr.get("NDOC"));
|
|
||||||
|
|
||||||
TRecord_array doc_originale;
|
|
||||||
doc_originale.read (temprdoc); // legge tutte le righe del documento originale
|
|
||||||
|
|
||||||
// con la funzione doc_originale.row(i) ho l'i-esima riga del doc. originale
|
|
||||||
TRecord_array doc_destinazione;
|
|
||||||
temprdoc.put ("CODNUM", _elab.codnum); // imposta il codice numerazione per la fattura
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
prendi la prima chiave
|
|
||||||
|
|
||||||
ripeti
|
|
||||||
cerca su doc il record corrispondente alla chiave corrente
|
|
||||||
|
|
||||||
prendi il codcf (codice cliente) // costruzion file pilota per il cliente corrente
|
|
||||||
prendi tutti i campi obbligatori // meglio: copia il record trovato in un oggetto record
|
|
||||||
|
|
||||||
scrivi su doc il record relativo alla nuova fattura creata
|
|
||||||
cerca su rdoc la prima riga del doc. pilota // inserimento del doc. pilota nella fattura
|
|
||||||
copia le righe del doc. pilota nella fattura
|
|
||||||
segna a[0] come processato
|
|
||||||
|
|
||||||
per ogni chiave dell'array (dopo la prima)
|
|
||||||
se non è processata
|
|
||||||
cerca su doc il record corrispondente
|
|
||||||
se codcf è uguale a codcf del doc. pilota // meglio: crea un record campione con codcf e campi obbligatori = a guelli del record pilota e cerca il
|
|
||||||
allora se i campi obbligatori sono uguali a quelli del doc. pilota
|
|
||||||
allora copia tutte le righe del doc. attuale nella fattura
|
|
||||||
indica il record come processato
|
|
||||||
|
|
||||||
prendi dall'array la prima chiave non processata
|
|
||||||
finché la chiave corrente è oltre l'ultimo record. (chiave corrente == a.items()
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
Per numerazione fatture:
|
|
||||||
TTable t ("NUM");
|
|
||||||
metto in codtab il codice numerazione
|
|
||||||
leggo il record con quel codice
|
|
||||||
nel campi I1 c'è il numero del primo campo disponibile (o dell'ultimo utilizzato)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ve6100 (int argc, char **argv)
|
int ve6100 (int argc, char **argv)
|
||||||
{
|
{
|
||||||
TCrea_fatture a;
|
TGestione_ELD a;
|
||||||
a.run (argc, argv, "Fatturazione");
|
a.run (argc, argv, "Gestione elaborazioni differite");
|
||||||
return 0;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
1071
ve/ve6200.cpp
Executable file
1071
ve/ve6200.cpp
Executable file
File diff suppressed because it is too large
Load Diff
432
ve/ve6300.cpp
Executable file
432
ve/ve6300.cpp
Executable file
@ -0,0 +1,432 @@
|
|||||||
|
// ve6300.cpp. Composizione interattiva dei documenti.
|
||||||
|
|
||||||
|
#include <sheet.h>
|
||||||
|
#include <application.h>
|
||||||
|
#include <stdtypes.h>
|
||||||
|
#include <mask.h>
|
||||||
|
#include <relation.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <isam.h>
|
||||||
|
#include <real.h>
|
||||||
|
#include <maskfld.h>
|
||||||
|
#include <urldefid.h>
|
||||||
|
#include <config.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;
|
||||||
|
// _stesso_anno_fiscale = FALSE;
|
||||||
|
|
||||||
|
int cargc = argc();
|
||||||
|
const char **vargv = argv();
|
||||||
|
|
||||||
|
if (cargc>=2)
|
||||||
|
{
|
||||||
|
if (cargc<5) fatal_box ("Numero di parametri insufficiente: chiave incompleta!");
|
||||||
|
if (cargc>=5)
|
||||||
|
{
|
||||||
|
_codnum = vargv[2];
|
||||||
|
_anno = vargv[3];
|
||||||
|
_provv = vargv[4];
|
||||||
|
_ndoc = vargv[5];
|
||||||
|
}
|
||||||
|
if (cargc==7) _crea_doc = TRUE;
|
||||||
|
else _crea_doc = FALSE;
|
||||||
|
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 = 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
|
||||||
|
*/
|
14
ve/ve6300.h
Executable file
14
ve/ve6300.h
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
// Include file per ve6300.uml
|
||||||
|
|
||||||
|
#define F_CODNUM 101
|
||||||
|
#define F_TIPIDOC 102
|
||||||
|
#define F_PROVV 103
|
||||||
|
#define F_TIPODOCDES 104
|
||||||
|
#define F_DESCR_TIPODOCDES 105
|
||||||
|
#define F_DATADOC 106
|
||||||
|
#define F_TIPOCF 107
|
||||||
|
#define F_CODCF 108
|
||||||
|
#define F_RAGSOC 109
|
||||||
|
#define F_TIPODOCORG 110
|
||||||
|
#define F_DESCR_TIPODOCORG 111
|
||||||
|
#define F_INIDOCORG 112
|
118
ve/ve6300.uml
Executable file
118
ve/ve6300.uml
Executable file
@ -0,0 +1,118 @@
|
|||||||
|
PAGE "Selezione parametri" 0 0 0 0
|
||||||
|
|
||||||
|
#include <ve6300.h>
|
||||||
|
|
||||||
|
BUTTON DLG_OK 9 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT 20 19 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_CANCEL 9 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT 40 19 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_CODNUM 4
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 1 "Codice numerazione: "
|
||||||
|
FLAG "U"
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
USE NUM KEY 1
|
||||||
|
INPUT CODTAB F_CODNUM
|
||||||
|
DISPLAY "Codice" CODTAB
|
||||||
|
DISPLAY "Descrizione@50" S0
|
||||||
|
OUTPUT F_CODNUM CODTAB
|
||||||
|
OUTPUT F_TIPIDOC S2
|
||||||
|
OUTPUT F_PROVV S8
|
||||||
|
HELP "Codice numerazione per il documento da creare"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_TIPIDOC 40
|
||||||
|
BEGIN
|
||||||
|
PROMPT 28 1 "Tipi documenti"
|
||||||
|
FLAG ""
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_PROVV 1
|
||||||
|
BEGIN
|
||||||
|
PROMPT 84 1 "Provv"
|
||||||
|
FLAG ""
|
||||||
|
HELP "Indica se la numerazione e' provvisoria (P) o definitiva (D)"
|
||||||
|
WARNING "I tipi di numerazione ammessi sono provvisoria (P) e definitiva (D)"
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_TIPODOCDES 4
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 2 "Tipo documento: "
|
||||||
|
FLAG "U"
|
||||||
|
USE %TIP KEY 1
|
||||||
|
INPUT CODTAB F_TIPODOCDES
|
||||||
|
DISPLAY "Codice" CODTAB
|
||||||
|
DISPLAY "Descrizione@50" S0
|
||||||
|
OUTPUT F_TIPODOCDES CODTAB
|
||||||
|
OUTPUT F_DESCR_TIPODOCDES S0
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
HELP "Tipo del documento da creare"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_DESCR_TIPODOCDES 50
|
||||||
|
BEGIN
|
||||||
|
PROMPT 28 2 "Descrizione: "
|
||||||
|
USE %TIP KEY 1
|
||||||
|
INPUT F_DESCR_TIPODOCDES S0
|
||||||
|
DISPLAY "Descrizione@50" S0
|
||||||
|
DISPLAY "Codice" CODTAB
|
||||||
|
COPY OUTPUT F_TIPODOCDES
|
||||||
|
END
|
||||||
|
|
||||||
|
DATE F_DATADOC
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 3 "Data: "
|
||||||
|
FLAG "A"
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
HELP "Data da assegnare al documento"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_TIPOCF 1
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 5 "Tipo Cliente/Fornitore "
|
||||||
|
FLAG "D"
|
||||||
|
// FLAG "U"
|
||||||
|
// HELP "Indica C se cliente, F se fornitore"
|
||||||
|
// WARNING "Ho detto: C se cliente, F se fornitore (obbligatorio)"
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
NUMBER F_CODCF 6
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 6 "Codice cliente: "
|
||||||
|
FLAG "UR"
|
||||||
|
USE LF_CLIFO KEY 1
|
||||||
|
INPUT TIPOCF F_TIPOCF
|
||||||
|
INPUT CODCF F_CODCF
|
||||||
|
DISPLAY "Codice" CODCF
|
||||||
|
DISPLAY "Descrizione@50" RAGSOC
|
||||||
|
OUTPUT F_CODCF CODCF
|
||||||
|
OUTPUT F_RAGSOC RAGSOC
|
||||||
|
HELP "Inserisci il codice del cliente/fornitore"
|
||||||
|
WARNING "Codice cliente/fornitore non trovato"
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_RAGSOC 50
|
||||||
|
BEGIN
|
||||||
|
PROMPT 27 6 "Ragione sociale "
|
||||||
|
FLAG "U"
|
||||||
|
USE LF_CLIFO KEY 2
|
||||||
|
INPUT TIPOCF F_TIPOCF
|
||||||
|
INPUT RAGSOC F_RAGSOC
|
||||||
|
DISPLAY "Descrizione@50" RAGSOC
|
||||||
|
DISPLAY "Codice" CODCF
|
||||||
|
COPY OUTPUT F_CODCF
|
||||||
|
HELP "Inserisci la ragione sociale del cliente"
|
||||||
|
WARNING "Ragione sociale non trovata nell'elenco clienti/fornitori"
|
||||||
|
END
|
||||||
|
|
||||||
|
END
|
||||||
|
ENDMASK
|
22
ve/ve6301.uml
Executable file
22
ve/ve6301.uml
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
PAGE "Selezione parametri" 0 0 0 0
|
||||||
|
|
||||||
|
#include <ve6300.h>
|
||||||
|
|
||||||
|
BUTTON DLG_OK 9 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT 20 19 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_CANCEL 9 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT 40 19 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
SPREADSHEET F_SHEET 70 15
|
||||||
|
BEGIN
|
||||||
|
PROMPT 5 4 ""
|
||||||
|
|
||||||
|
END
|
||||||
|
|
||||||
|
END
|
||||||
|
ENDMASK
|
194
ve/ve6gen.cpp
194
ve/ve6gen.cpp
@ -1,7 +1,6 @@
|
|||||||
// Classe che contiene i data members comuni a tutti gli oggetti di creazione
|
// Classe che contiene i data members comuni a tutti gli oggetti di creazione
|
||||||
// e la funzione di scansione.
|
// e la funzione di scansione.
|
||||||
|
|
||||||
#include <applicat.h>
|
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <mask.h>
|
#include <mask.h>
|
||||||
#include <tabutil.h>
|
#include <tabutil.h>
|
||||||
@ -9,27 +8,11 @@
|
|||||||
#include <rectypes.h>
|
#include <rectypes.h>
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <checks.h>
|
#include <checks.h>
|
||||||
|
#include <execp.h>
|
||||||
#include "ve6retv.h" // definizione dei valori di ritorno
|
#include "ve6retv.h" // definizione dei valori di ritorno
|
||||||
#include "ve6.h"
|
#include "ve6.h"
|
||||||
#include "ve6000.h" // identificativi dei campi della maschera
|
#include "ve6000.h" // identificativi dei campi della maschera
|
||||||
|
#include "ve6gen.h" // dichiarazione della classe
|
||||||
class TElaborazioni : public TApplication
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
// i data members sono protected in modo che gli oggetti generatori
|
|
||||||
// possano accedervi senza la necessità di funzioni specifiche
|
|
||||||
TString_array *_chiavi; // array contenente i valori delle chiavi per ogni record selezionato da scan_doc
|
|
||||||
TString _codelab; // codice elaborazione differita
|
|
||||||
TElab_struct _elab; // struttura per memorizzare i campi significativi dei records di doc
|
|
||||||
int _ordinamento; // indica il tipo di ordinamento
|
|
||||||
bool _raggruppa; // indica se si deve raggruppare o no
|
|
||||||
|
|
||||||
int scan_doc (void); // lancia le altre due procedure
|
|
||||||
int run_mask (void); // lancia la maschera e scandisce i records
|
|
||||||
int get_info (void); // imposta la struttura elab leggendo il record per l'elaborazione corrente
|
|
||||||
bool errore_fatale(int); // ritorna true se l'errore passato come argomento è nella lista degli errori fatali
|
|
||||||
};
|
|
||||||
|
|
||||||
bool TElaborazioni::errore_fatale (int err)
|
bool TElaborazioni::errore_fatale (int err)
|
||||||
{
|
{
|
||||||
@ -40,179 +23,10 @@ bool TElaborazioni::errore_fatale (int err)
|
|||||||
case ELAB_NOT_FOUND:
|
case ELAB_NOT_FOUND:
|
||||||
case DOC_TYPE_NOT_FOUND:
|
case DOC_TYPE_NOT_FOUND:
|
||||||
case READ_ERROR:
|
case READ_ERROR:
|
||||||
|
case ESC_PRESSED:
|
||||||
|
case NO_ELABS:
|
||||||
return TRUE;
|
return TRUE;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int TElaborazioni::get_info(void)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
|
|
||||||
// informazioni dalla tabella elaborazioni differite
|
|
||||||
TTable t("ELD"); // tabella elaborazioni differite
|
|
||||||
t.zero();
|
|
||||||
t.put ("CODTAB", _codelab); // imposta il codice elaborazione da cercare
|
|
||||||
if (!(err = t.read (_isgteq))) // si posiziona sul record dell'elab. differita con codice cod_elab
|
|
||||||
{
|
|
||||||
error_box ("TElaborazioni::get_info() : errore di lettura %d da tab(ELD)", err);
|
|
||||||
return READ_ERROR;
|
|
||||||
}
|
|
||||||
if (t.get("CODTAB") != _codelab) // controlla se il codice trovato è proprio cod_tab
|
|
||||||
{
|
|
||||||
error_box ("TElaborazioni::get_info() : non esiste l'elaborazione con codice %s in tab(ELD)", (const char *)_codelab);
|
|
||||||
return ELAB_NOT_FOUND;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Imposta i dati relativi all'elaborazione differita corrente
|
|
||||||
_elab.tipo_doc_org = t.get("S6"); // tipo documento originale
|
|
||||||
_elab.tipo_doc_des = t.get ("S8"); // tipo documento destinazione
|
|
||||||
_elab.stato_doc_ini = t.get ("S7"); // stato iniziale del documento originale
|
|
||||||
_elab.stato_doc_fin = t.get ("S9"); // stato finale (dopo l'elaborazione) del documento originale
|
|
||||||
_elab.codnum = t.get ("S5"); // codice numerazione per il documento finale
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TElaborazioni::run_mask(void)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
TMask *_msk = new TMask ("ve6000"); // carica la maschera
|
|
||||||
|
|
||||||
// Imposta il flag di autorizzazione agente
|
|
||||||
TTable t("TIP"); // tabella tipi documento
|
|
||||||
t.zero(); // azzera i campi
|
|
||||||
t.put ("CODTAB", _elab.tipo_doc_org); // tipo del documento originale
|
|
||||||
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") != _elab.tipo_doc_org) // 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 *)_elab.tipo_doc_org);
|
|
||||||
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"); // necessario per aggiungere l'estensione
|
|
||||||
TConfig profilo_doc(profilo); // oggetto configurazione (file ini del documento)
|
|
||||||
TConfig p(CONFIG_DITTA); // crea l'oggetto per rilevare l'autorizzazione dall'ini della ditta
|
|
||||||
// gestione agente abilitata <==> abilitata in profilo documento e nell'ini della ditta
|
|
||||||
int agente = (profilo_doc.get_int ("CODAG", "PROFILO") && p.get_int("AGENTE", "VE"));
|
|
||||||
|
|
||||||
/* se il flag per la gestione agenti è != 0, allora visualizza i campi agente ed
|
|
||||||
adotta la stessa convenzione usata per codice cliente e zona per gestire l'eventualita' che
|
|
||||||
l'utente non specifichi nulla.
|
|
||||||
Se è disabilitata, allora lascia vuoti i campi codice agente da e codice agente a, in modo
|
|
||||||
da eliminare una condizione durante il test per il filtraggio dei records.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// nasconde i campi se la gestione agenti è disabilitata
|
|
||||||
if (!agente)
|
|
||||||
{
|
|
||||||
_msk->show (F_CODICE_AGENTE_DA, FALSE);
|
|
||||||
_msk->show (F_CODICE_AGENTE_A, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_msk->run() == K_ESC) // se premuto esc, esci
|
|
||||||
return ESC_PRESSED;
|
|
||||||
|
|
||||||
_ordinamento = _msk->get_int (F_ORDINAMENTO_EMISSIONE);
|
|
||||||
_raggruppa = _msk->get_int (F_RAGGRUPPA);
|
|
||||||
|
|
||||||
TString temps; // stringa temporanea
|
|
||||||
|
|
||||||
// Imposta i campi dei records campione per il filtraggio
|
|
||||||
TLocalisamfile f(LF_DOC); // file doc
|
|
||||||
f.zero(); // azzera i campi
|
|
||||||
TRectype first(f.curr()), last(f.curr()); // dichiara due records con la stessa struttura dei records di $doc
|
|
||||||
|
|
||||||
first.put("TIPOCF", 'C'); // trattare solo clienti
|
|
||||||
last.put ("TIPOCF", 'C');
|
|
||||||
first.put ("TIPODOC", _elab.tipo_doc_org); // tipo documento (da tab. ELD)
|
|
||||||
last.put ("TIPODOC", _elab.tipo_doc_org);
|
|
||||||
first.put ("STATO", _elab.stato_doc_ini); // stato documento originale
|
|
||||||
last.put ("STATO", _elab.stato_doc_ini);
|
|
||||||
|
|
||||||
// codice cliente
|
|
||||||
temps = _msk->get(F_CODICE_CLIENTE_DA);
|
|
||||||
if (temps.not_empty())
|
|
||||||
first.put ("CODCF", temps);
|
|
||||||
temps = _msk->get(F_CODICE_CLIENTE_A);
|
|
||||||
if (temps.not_empty())
|
|
||||||
last.put ("CODCF", temps);
|
|
||||||
|
|
||||||
// data
|
|
||||||
first.put ("DATADOC", _msk->get(F_DATA_DOCUMENTO_DA)); // nessun controllo perché data doc. da e data doc. a sono checktype required
|
|
||||||
last.put ("DATADOC", _msk->get(F_DATA_DOCUMENTO_A));
|
|
||||||
|
|
||||||
// codice zona
|
|
||||||
temps = _msk->get (F_CODICE_ZONA_DA); // mette in temps il valore del campo codice zona da
|
|
||||||
if (temps.not_empty()) // se è stato inserito un valore...
|
|
||||||
// ******************** N.B.: il campo ZONA va aggiunto a $doc. verificare se il campo è proprio ZONA *****************
|
|
||||||
first.put("ZONA", temps); // mettilo nel campo zona
|
|
||||||
temps = _msk->get (F_CODICE_ZONA_A);
|
|
||||||
if (temps.not_empty())
|
|
||||||
last.put ("ZONA", temps);
|
|
||||||
|
|
||||||
// codice agente: imposta i campi solo se ne è abilitata la gestione
|
|
||||||
// se agente è disabilitato, i campi agente rimangono vuoti
|
|
||||||
if (agente)
|
|
||||||
{
|
|
||||||
temps = _msk->get (F_CODICE_AGENTE_DA);
|
|
||||||
if (temps.not_empty())
|
|
||||||
first.put("CODCF", temps);
|
|
||||||
temps = _msk->get (F_CODICE_AGENTE_A);
|
|
||||||
if (temps.not_empty())
|
|
||||||
last.put ("CODCF", temps);
|
|
||||||
}
|
|
||||||
|
|
||||||
f.put ("STATO", _elab.stato_doc_ini);
|
|
||||||
if (! (err = f.read (_isgteq)))
|
|
||||||
error_box ("TElaborazioni::run_mask() : errore di lettura &d da doc", err);
|
|
||||||
if (f.get ("STATO") != _elab.stato_doc_ini)
|
|
||||||
{
|
|
||||||
error_box ("TElaborazioni::run_mask() : non esistrono documenti allo stato %s", (const char *)_elab.stato_doc_ini);
|
|
||||||
return NO_ORG_DOCS;
|
|
||||||
}
|
|
||||||
|
|
||||||
do // scandisce tutti i records a partire dal primo che ha lo stato richiesto
|
|
||||||
{
|
|
||||||
TToken_string tempt; // ttoken string per aggiungere chiavi all'array
|
|
||||||
if (f.curr() >= first && f.curr() <= last)
|
|
||||||
{
|
|
||||||
tempt = f.get("CODNUM"); // utilizza la chiave 1 di $doc
|
|
||||||
tempt.add( (const char *)f.get("ANNO") );
|
|
||||||
tempt.add( (const char *)f.get("PROVV") );
|
|
||||||
tempt.add( (const char *)f.get ("NDOC") );
|
|
||||||
_chiavi->add(tempt); // aggiunge la chiave del record alla lista
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (err = f.read(_isnext));
|
|
||||||
if (err !=NOERR)
|
|
||||||
{
|
|
||||||
error_box ("TElaborazioni::run_mask() : errore di lettura %d da doc", err);
|
|
||||||
return READ_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_chiavi->items()) // se l'array è vuoto, indica al chiamante che non ci sono documenti da raggruppare
|
|
||||||
{
|
|
||||||
error_box ("TElaborazioni::run_mask() : nessun documento originale soddisfa le condizioni richieste");
|
|
||||||
return NO_ORG_DOCS;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i<_chiavi->items()-1; i++)
|
|
||||||
message_box ("Record %d: %s", i, (const char *)_chiavi->row(i));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int TElaborazioni::scan_doc(void)
|
|
||||||
{
|
|
||||||
int err; // codice ritornato dalle procedure
|
|
||||||
|
|
||||||
if (err = get_info())
|
|
||||||
return err; // ritorna al chiamante l'errore di get_info, senza eseguire run_mask
|
|
||||||
return run_mask(); // ritorna il codice di errore di run_mask
|
|
||||||
}
|
|
||||||
|
128
ve/ve6gen.h
Executable file
128
ve/ve6gen.h
Executable file
@ -0,0 +1,128 @@
|
|||||||
|
// Dichiarazione della classe generale.
|
||||||
|
|
||||||
|
#ifndef _TELABORAZIONI_DECL
|
||||||
|
#define _TELABORAZIONI_DECL
|
||||||
|
|
||||||
|
#include <sheet.h>
|
||||||
|
#include <application.h>
|
||||||
|
#include <stdtypes.h>
|
||||||
|
#include <mask.h>
|
||||||
|
#include <relation.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <isam.h>
|
||||||
|
#include <real.h>
|
||||||
|
#include <maskfld.h>
|
||||||
|
#include <urldefid.h>
|
||||||
|
#include <config.h>
|
||||||
|
#include <utility.h>
|
||||||
|
#include "ve6retv.h"
|
||||||
|
#include "ve6300.h"
|
||||||
|
#include "ve6gen.h"
|
||||||
|
|
||||||
|
#include <applicat.h>
|
||||||
|
//#include <strings.h>
|
||||||
|
#include "ve6.h"
|
||||||
|
#include <array.h>
|
||||||
|
|
||||||
|
#define _TDD_IN_FILTER
|
||||||
|
|
||||||
|
#define STATO_PPT '*'
|
||||||
|
#define SET_PROCESSED TRUE
|
||||||
|
#define DONT_SET_PROCESSED FALSE
|
||||||
|
|
||||||
|
class TElaborazioni : public TApplication
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
// i data members sono protected in modo che gli oggetti generatori
|
||||||
|
// possano accedervi senza la necessità di funzioni specifiche
|
||||||
|
TString16 _codnum; // (stringa di 4)
|
||||||
|
TString16 _anno; // int _anno;
|
||||||
|
TString16 _provv; // char _provv;
|
||||||
|
TString16 _ndoc; // int _ndoc;
|
||||||
|
bool _crea_doc; // deve creare il documento di destinazione ?
|
||||||
|
int _ordinamento; // indica il tipo di ordinamento
|
||||||
|
bool _raggruppa; // indica se si deve raggruppare o no
|
||||||
|
bool _per_articolo; // indica se raggruppare le righe per codice articolo o no
|
||||||
|
int _chiave; // chiave di doc usata per selezionare i doc. originali
|
||||||
|
TBit_array _processed; // array in cui è indicato se un documento di _chiavi è stato processato o no
|
||||||
|
TString _tipo_doc_org; // tipo documento originale
|
||||||
|
TString _tipo_doc_des; // tipo documento finale
|
||||||
|
TString80 _stati_validi_doc_i;// lista stati documenti originali prima dell'elaborazione
|
||||||
|
TString _stato_f_doc_i; // dopo l'elaborazione
|
||||||
|
TString _stato_f_doc_f; // stato documento finale al termine dell'operazione
|
||||||
|
// TString _codnum; // codice per la numerazione del documento di destinazione
|
||||||
|
bool _sosp_imposta; // T/F sospensione imposta
|
||||||
|
bool _cod_sconto; // T/F codice sconto
|
||||||
|
bool _stesso_anno; // T/F STESSOANNOFISCALE in [RAGGR.] del .ini del doc pilota
|
||||||
|
TDate _datadoc; // data dei documenti che si vanno a creare
|
||||||
|
|
||||||
|
bool errore_fatale(int); // ritorna true se l'errore passato come argomento è nella lista degli errori fatali
|
||||||
|
public:
|
||||||
|
TElaborazioni() : _provv(1) { _chiave = 2; }
|
||||||
|
~TElaborazioni () {}
|
||||||
|
};
|
||||||
|
|
||||||
|
// TCursor_sheet con la on_key() customizzata per l'inserimento del campo QTAEVASA nelle righe
|
||||||
|
class TInterattivo_sheet : public TCursor_sheet
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
virtual bool on_key(KEY);
|
||||||
|
public:
|
||||||
|
virtual void page_build(long first, byte rows); // modificata per fare apparire anche le qta' da evadere
|
||||||
|
TInterattivo_sheet(TCursor* cursor, const char* fields, const char* title, const char* head, byte buttons = 0)
|
||||||
|
: TCursor_sheet(cursor, fields, title, head, buttons)
|
||||||
|
{};
|
||||||
|
virtual ~TInterattivo_sheet() {};
|
||||||
|
};
|
||||||
|
|
||||||
|
class TBatch_crea_doc : public TElaborazioni
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
bool _interattivo; // TRUE se e' stata attivata l'elaborazione interattiva;
|
||||||
|
// bool _stesso_anno_fiscale; // TRUE se i documenti originali debbono avere lo stesso anno fiscale del documento da creare
|
||||||
|
TString _descr_tipodocorg; // descrizione del tipo documento originale (solo come titolo del TSheet_array)
|
||||||
|
virtual bool menu (MENU_TAG);
|
||||||
|
virtual bool create ();
|
||||||
|
virtual bool destroy();
|
||||||
|
|
||||||
|
int run_mask (TRectype&, TRectype&); // lancia la maschera e scandisce i records
|
||||||
|
int per_cliente(TRectype&, TRectype&, const char*); // crea fatture ordinate tramite la elab_princ
|
||||||
|
int elab_princ(TSorted_cursor&); // elabora tutti i documenti del cursore che hanno un record ELD
|
||||||
|
bool search (TRectype&, TRectype&, TSorted_cursor&); // cerca il prossimo record da includere nel doc. destinazione
|
||||||
|
bool getflag (TRectype&, int); // ritorna i valori di due flag
|
||||||
|
static bool filterfunct(const TRelation*); // funzione di filtro per i campi non alfanumerici
|
||||||
|
void raggruppa_righe (TRecord_array&); // raggruppa le righe per codice articolo
|
||||||
|
bool prox_riga (int&, TRecord_array&, TBit_array&, TRectype&); // cerca la prossima riga da raggruppare
|
||||||
|
long _first_codcf, _last_codcf; // valori del campo CODCF dei records first e last, per potervi accedere dalla filterfunct()
|
||||||
|
bool elab_righe(TString metodo,bool raggr_parz,TRectype &tempr,TRecord_array &doc_destinazione,TRectype &temprdoc);
|
||||||
|
// elabora le righe (di doc_originale), mettendole in doc_destinazione
|
||||||
|
// usando il metodo metodo, tramite il record temprdoc gia' inizializzato
|
||||||
|
bool next_pilota(TSorted_cursor &curs,TRectype &pilota);
|
||||||
|
// cerca il prossimo documeto pilota in cursor tenendo conto di processed
|
||||||
|
int esiste_ELD(TSorted_cursor &curs,int i,bool set_proc = DONT_SET_PROCESSED);
|
||||||
|
// ritorna ELAB_FOUND se esiste una ELD che passa dal tipo documento di pilota a _tipo_dest
|
||||||
|
// (o _tipo_doc_dest, se _tipo_dest non viene specificato) e riempie eventualmente dest con la prima ELD
|
||||||
|
int leggi_da_ELD(TRectype &dest,TString _tipo_pilota,TString _tipo_dest = "");
|
||||||
|
// legge dalla tabella ELD il record _tipo_pilota->_tipo_destinazione, lo mette in dest e ritorna l'errore
|
||||||
|
TString metodo(TRectype &rec);
|
||||||
|
// restituisce la stringa metodo di trasf. dal record ELD per rec->_tipo_destinazione
|
||||||
|
int statovalido(TRectype& rec);
|
||||||
|
// controlla che il documento rec sia in uno degli stati validi indicati nella sezione [RAGGRUPPA] del suo .ini
|
||||||
|
const char *td_ELD_to_filter(TString &_tipo_doc_des);
|
||||||
|
// trova il .ini di rec e lo restituisce
|
||||||
|
TString getini(TRectype& rec, int &err);
|
||||||
|
// prende RAGGRPARZ della sezione [RAGGRUPPA]
|
||||||
|
bool get_raggr_parz(TRectype& rec, int& err);
|
||||||
|
// ritorna TRUE se _stesso_anno_fiscale o STESSOANNOFISCALE del .ini di rec
|
||||||
|
bool stesso_anno_fiscale(TRectype& rec);
|
||||||
|
// setta le informazioni sugli stati del doc e le mette nelle relative variabili globali
|
||||||
|
int get_info(TRectype &doc);
|
||||||
|
// guarda se i documenti pil e pil2 sono compatibili per essere uniti nello stesso documento finale
|
||||||
|
bool doc_i_compatibili(TRectype &pil,TRectype &pil2);
|
||||||
|
|
||||||
|
public:
|
||||||
|
TBatch_crea_doc () {} // costruttore
|
||||||
|
~TBatch_crea_doc () {}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // _TELABORAZIONI_DECL //
|
15
ve/ve6retv.h
15
ve/ve6retv.h
@ -6,11 +6,18 @@
|
|||||||
#define NO_ORG_DOCS 100 // indica che non ci sono documenti originali con le caratteristiche richieste
|
#define NO_ORG_DOCS 100 // indica che non ci sono documenti originali con le caratteristiche richieste
|
||||||
#define ESC_PRESSED 101 // indica che è stato premuto il pulsante "Annulla" sulla maschera di selezione dei ranges
|
#define ESC_PRESSED 101 // indica che è stato premuto il pulsante "Annulla" sulla maschera di selezione dei ranges
|
||||||
#define RECORD_WRITE_ERROR 102 // errore nella scrittura di un record
|
#define RECORD_WRITE_ERROR 102 // errore nella scrittura di un record
|
||||||
#define CLIENTE 1 // codici ordinamento (codici ritornati dal radiobutton della maschera)
|
#define CLIFO 1 // codici ordinamento (codici ritornati dal radiobutton della maschera)
|
||||||
#define AGENTE 2
|
#define AGENTE 2
|
||||||
#define ZONA 3
|
#define ZONA 3
|
||||||
#define DATA 4
|
#define DATA 4
|
||||||
#define ELAB_NOT_FOUND 107 // indica che non è stata trovato un record per il codice di elaborazione specificato
|
#define ELAB_NOT_FOUND 107 // indica che non è stato trovato un record per il codice di elaborazione specificato
|
||||||
#define DOC_TYPE_NOT_FOUND 108 // indica che non è stato trovato un record per il tipo di documento specificato
|
#define ELAB_FOUND 108 // indica che è stato trovato un record per il codice di elaborazione specificato
|
||||||
#define READ_ERROR 109 // indica che c'è stato un errore in lettura
|
#define DOC_TYPE_NOT_FOUND 109 // indica che non è stato trovato un record per il tipo di documento specificato
|
||||||
|
#define READ_ERROR 110 // indica che c'è stato un errore in lettura
|
||||||
|
#define SOSPENSIONE_IMPOSTA 111 // valori per un parametro di getflag()
|
||||||
|
#define CODICE_SCONTO 112
|
||||||
|
#define ERR_STATO_NON_VALIDO 113 // errore: lo stato del documento non e' uno di quelli previsti nella sezione raggruppa
|
||||||
|
#define NO_ELABS 114 // non ci sono elaborazioni che producano il documento specificato
|
||||||
|
#define STATO_NON_VALIDO FALSE // lo stato del documento non e' uno di quelli previsti nella sezione raggruppa
|
||||||
|
#define STATO_VALIDO TRUE // lo stato del documento non e' uno di quelli previsti nella sezione raggruppa
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user