Patch level : 12.0 no-patch

Files correlati     : fp
Commento            :
- Rifatta interfaccia filtri
- Aggiunte nuove funzioni per il filtraggio
- Modificato warning in caricamento
- Sistemati bug dove non caricava la query
- Aggiunto salvataggio/caricamento campi
- Aggiunta funzione get_coddest(...)
- Sistemato log
- Sistemata scrittura descrizione, adesso viene messa direttamente nel paf3000f
- Aggiornamento sql per campi data
This commit is contained in:
Mattia Tollari 2018-10-04 18:10:17 +02:00
parent 37301cc4c5
commit 7f3054a080
8 changed files with 332 additions and 171 deletions

View File

@ -109,7 +109,7 @@ bool TParametri_mask::on_key(KEY key)
m.field(101).check_type(CHECK_REQUIRED);
while(m.run() == K_ENTER)
{
if (m.get(101) == "sirioFATT99") // Hardcode password are the best!
if (m.get(101) == "sirioFATT99") // Hardcoded password are the best!
{
for (int i = F_SETPATCH; i <= F_REBORNDB; i++)
enable(i);

View File

@ -17,7 +17,7 @@ ENDPAGE
PAGE "Configurazione FP" 0 2 0 0
GROUPBOX DLG_NULL 78 8
GROUPBOX DLG_NULL 78 6
BEGIN
PROMPT 1 1 "@BDatabase"
END
@ -79,13 +79,13 @@ BEGIN
MODULE RS
END
STRING F_FLDDEST 300 50
STRING F_FLDDEST 250 50
BEGIN
PROMPT 2 13 "Destinazione Server "
FLAGS ""
END
STRING F_FLDUSRDEST 300 50
STRING F_FLDUSRDEST 250 50
BEGIN
PROMPT 2 14 "Destinazione User "
DSELECT

View File

@ -11,6 +11,7 @@
#include "fp0.h"
#include "fp0300a.h"
#include <memory>
/////////////////////////////////////////////////////////////////////////////////////
@ -30,19 +31,25 @@ protected:
void set_filter_changed();
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void next_page(int p);
bool checkNotEmpty();
bool check_not_empty();
bool check_full_fields() const;
bool check_tipo_doc(const TTipo_documento& td);
void fill();
void init();
bool is_fattura(const TRectype& doc) const;
void load_all_fields();
bool _filter_changed;
unique_ptr<TToken_string> _tipi_doc_scelti;
public:
TPA_mask() : TAutomask("fp0300a"), _filter_changed(true)
{
disable(DLG_OK);
load_all_fields();
}
void save_all_fields() const;
};
bool TPA_mask::is_fattura(const TRectype& doc) const
@ -55,6 +62,40 @@ bool TPA_mask::is_fattura(const TRectype& doc) const
return cn.tipo() == 2 && !cn.get_bool("B10"); // Controlla se fattura provvisioria esclusa da P.A.
}
void TPA_mask::save_all_fields() const
{
ini_set_string(CONFIG_DITTA, "fp", "dataini", get(F_DATAINI));
ini_set_string(CONFIG_DITTA, "fp", "dataend", get(F_DATAEND));
ini_set_string(CONFIG_DITTA, "fp", "codnum", get(F_CODNUM));
TToken_string tipidocs = get_tmp_string();
FOR_EACH_SHEET_ROW(sfield(F_DOCUMENTI_TIPO), n, r)
{
tipidocs.add(r->get(0));
}
ini_set_string(CONFIG_DITTA, "fp", "tipodocs", tipidocs);
}
void TPA_mask::load_all_fields()
{
set(F_DATAINI, ini_get_string(CONFIG_DITTA, "fp", "dataini"));
set(F_DATAEND, ini_get_string(CONFIG_DITTA, "fp", "dataend"));
set(F_CODNUM, ini_get_string(CONFIG_DITTA, "fp", "codnum"));
TToken_string tipidocs(ini_get_string(CONFIG_DITTA, "fp", "tipodocs"));
auto& sheet = sfield(F_DOCUMENTI_TIPO);
sheet.hide();
FOR_EACH_STR_TOKEN(tipidocs, tok)
{
TToken_string& row = sheet.row(-1);
row.add(tok);
row.add(TTipo_documento(tok).tipo_doc_sdi());
}
sheet.force_update();
sheet.show();
}
TString& add_filter(const TString& field, const TString& from, const TString& to)
{
TString& query = get_tmp_string();
@ -78,7 +119,10 @@ TString& add_filter(const TString& field, const TString& from, const TString& to
void TPA_mask::fill()
{
save_all_fields();
// Pulisco i tipi documento
_tipi_doc_scelti.reset();
TSheet_field& docs = sfield(F_DOCS);
TString_array& sht = docs.rows_array();
docs.hide();
@ -87,7 +131,7 @@ void TPA_mask::fill()
const TDate dal = get(F_DATAINI);
TString filter_selected = get(F_FATTSEL);
enable(DLG_OK, filter_selected != "N");
enable(DLG_OK, filter_selected != "X");
// Record di controllo per eventuali elaborazioni precedenti
TString hfatt(LEN_HFATT), bfatt(LEN_BFATT);
@ -95,27 +139,26 @@ void TPA_mask::fill()
TString query;
query << "USE 33 " <<
"SELECT (BETWEEN(33.DATADOC,#DADATADOC,#ADATADOC))&&(33.TIPOCF=='C')";
query << "USE 33 KEY 3" <<
"\nSELECT (33.TIPOCF=='C')&&" <<
"(33.CODNUM==#CODNUM)";
query << add_filter("33.TIPODOC", get(F_DATIPODOC), get(F_ATIPODOC));
query << "\nJOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
"JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
"JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC";
query << "\nJOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
"JOIN 17 TO 33 INTO TIPOCF==TIPOCF CODCF==CODCF \n" <<
"JOIN %TIP TO 33 ALIAS 400 INTO CODTAB==TIPODOC\n" <<
"FROM DATADOC=#DADATADOC\n" <<
"TO DATADOC=#ADATADOC";
TISAM_recordset rec(query);
if (get(F_DATIPODOC).full())
rec.set_var("#DATIPODOC", get(F_DATIPODOC));
if (get(F_ATIPODOC).full())
rec.set_var("#ATIPODOC", get(F_ATIPODOC));
rec.set_var("#CODNUM", get(F_CODNUM));
rec.set_var("#DADATADOC", get_date(F_DATAINI));
rec.set_var("#ADATADOC", get_date(F_DATAEND));
TProgress_monitor pi(rec.items(), NULL);
TProgress_monitor pi(rec.items(), nullptr);
bool first, show, ask = !((show = (first = true)));
int fat_no_cod = 0;
// Disabilito la colonna del codice ufficio
docs.enable_column(docs.cid2index(S_UFFICIO), false);
@ -128,13 +171,13 @@ void TPA_mask::fill()
const TTipo_documento& td = cached_tipodoc(doc.get(DOC_TIPODOC));
// Controllo che il tipo documento sia OK
if (td.tipo_doc_sdi().empty() || td.reg_fisc().empty())
if(!check_tipo_doc(td))
continue;
bool sent = false;
if (chiave_paf(doc, hfatt, bfatt))
{
if (paf0100f.search(NULL, hfatt, bfatt))
if (paf0100f.search(nullptr, hfatt, bfatt))
{
if (paf0100f.sq_get("P1_GESTIONE") != filter_selected)
continue;
@ -169,29 +212,13 @@ void TPA_mask::fill()
// Segno la riga errata
if (first)
{
// Abilito la colonna del codice ufficio per segnalare l'errore
docs.enable_column(docs.cid2index(S_UFFICIO));
first = false;
// Abilito la colonna del codice ufficio per segnalare l'errore
docs.enable_column(docs.cid2index(S_UFFICIO));
}
docs.set_back_and_fore_color(COLOR_RED, COLOR_WHITE, rec.current_row(), docs.cid2index(S_UFFICIO));
if (show)
{
TString msg; msg << "Trovata fattura " << rec.get(DOC_CODNUM).as_string() << "/" << rec.get(DOC_TIPODOC).as_string() << "/" << rec.get(DOC_NDOC).as_int() << " senza nessun codice destinatario/pec, Continuare?";
const bool force_stop = !yesno_box(msg);
if (!first && !ask && !force_stop)
{
show = yesno_box("Continuare a mostrare questo messaggio?");
ask = true;
}
if (force_stop)
{
row.cut(0);
docs.force_update();
docs.show();
return;
}
first = false;
}
fat_no_cod++;
}
}
if(rif.full())
@ -220,6 +247,9 @@ void TPA_mask::fill()
docs.force_update();
docs.show();
if (fat_no_cod > 0)
warning_box("Sono state trovate una o più fatture senza codice destinatario nè pec");
}
void TPA_mask::set_filter_changed()
@ -283,7 +313,7 @@ bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
break;
default: break;
}
if (e == fe_modify && jolly == 0)
if((e == fe_modify || e >= se_enter) && jolly == 0)
{
if (o.dlg() >= START_MASK && o.dlg() <= END_MASK)
{
@ -295,20 +325,22 @@ bool TPA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
void TPA_mask::next_page(int p)
{
TAutomask::next_page(p);
if (_filter_changed)
bool ok = true;
if (_filter_changed && p != 1000)
{
TSheet_field& sf = sfield(F_DOCS);
if (curr_win() == sf.parent())
if ((ok = _filter_changed = check_full_fields()))
{
TSheet_field& sf = sfield(F_DOCS);
fill();
sf.force_update();
_filter_changed = false;
}
}
if(ok)
TAutomask::next_page(p);
}
bool TPA_mask::checkNotEmpty()
bool TPA_mask::check_not_empty()
{
TSheet_field& sheet = sfield(F_DOCS);
TString msg;
@ -325,6 +357,33 @@ bool TPA_mask::checkNotEmpty()
return sheet.full();
}
bool TPA_mask::check_full_fields() const
{
// Controllo ogni campo che sia valorizzato
FOR_EACH_MASK_FIELD(*this, i, f)
{
if (!f->on_key(K_ENTER))
return false;
}
return true;
}
bool TPA_mask::check_tipo_doc(const TTipo_documento& td)
{
// Mi precarico la tabella dei documenti scelti
if(_tipi_doc_scelti == nullptr)
{
_tipi_doc_scelti.reset(new TToken_string());
FOR_EACH_SHEET_ROW(sfield(F_DOCUMENTI_TIPO), n, r)
{
_tipi_doc_scelti->add(r->get(0));
}
}
// Controllo innanzitutto che sia tra quelli scelti
return _tipi_doc_scelti->find(td.codice()) >= 0 && td.tipo_doc_sdi().full() && td.reg_fisc().full();
}
/////////////////////////////////////////////////////////////////////////////////////
// TDoc2Paf
@ -373,6 +432,7 @@ void TDoc2Paf::main_loop()
{
if (elab.commit() > 0)
{
mask.save_all_fields();
message_box(FR("Sono stati elaborati %d documenti"), ndocs);
}
else

View File

@ -1,12 +1,15 @@
#define START_MASK 301
#define F_DATAINI 301
#define F_DATAEND 302
#define F_FATTSEL 303
#define F_DACODNUM 304
#define F_DATIPODOC 305
#define F_ACODNUM 306
#define F_ATIPODOC 307
#define END_MASK 399
#define F_DATAINI 401
#define F_DATAEND 402
#define F_FATTSEL 403
#define F_CODNUM 404
#define END_MASK 499
#define F_DOCUMENTI_TIPO 301
#define S_TIPODOCSEL 101
#define S_TIPODOCSDI 102
#define F_DOCS 201

View File

@ -5,103 +5,50 @@ TOOLBAR "topbar" 0 0 0 2
#include <allbar.h>
ENDPAGE
PAGE "Fatture Pubblica Amministrazione" 0 2 0 0
PAGE "Fatturazione Elettronica" 0 2 0 0
DATE F_DATAINI
BEGIN
PROMPT 1 0 "Data iniziale"
PROMPT 1 1 "Data iniziale"
CHECKTYPE REQUIRED
END
DATE F_DATAEND
BEGIN
PROMPT 30 0 "Data finale"
PROMPT 40 1 "Data finale "
VALIDATE DATE_CMP_FUNC >= F_DATAINI
WARNING "La data finale non può essere minore della data iniziale"
CHECKTYPE REQUIRED
END
RADIOBUTTON F_FATTSEL 100
RADIOBUTTON F_FATTSEL 3 35
BEGIN
PROMPT 1 1 "Fatture da visualizzare"
PROMPT 1 2 "Fatture da visualizzare"
ITEM "|Da inviare"
ITEM "D|Diagnosticate"
ITEM "P|Pronte"
ITEM "X|XML Generato"
ITEM "E|In errore"
ITEM "N|Accettate"
FLAGS "Z"
END
STRING F_DACODNUM 4
STRING F_CODNUM 4
BEGIN
PROMPT 1 4 "Da Numerazione"
FIELD CODNUM
PROMPT 40 2 "Numerazione "
HELP "Codice numerazione"
USE %NUM
INPUT CODTAB F_DACODNUM
INPUT CODTAB F_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_DACODNUM CODTAB
CHECKTYPE FORCED
OUTPUT F_CODNUM CODTAB
CHECKTYPE REQUIRED
FLAG "UPA"
WARNING "Numerazione assente"
KEY 1 2
END
STRING F_DATIPODOC 4
SPREADSHEET F_DOCUMENTI_TIPO 25 5
BEGIN
PROMPT 30 4 "Da tipo doc "
FIELD TIPODOC
HELP "Codice tipo documento"
USE %TIP
SELECT S3[37,40]!=""
INPUT CODTAB F_DATIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
DISPLAY "Tipo SDI@10" S12
OUTPUT F_DATIPODOC CODTAB
CHECKTYPE FORCED
FLAG "UP"
END
STRING F_ACODNUM 4
BEGIN
PROMPT 1 5 "A Numerazione "
FIELD CODNUM
HELP "Codice numerazione"
USE %NUM
INPUT CODTAB F_ACODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_ACODNUM CODTAB
CHECKTYPE FORCED
FLAG "UPA"
WARNING "Numerazione assente"
KEY 1 2
END
STRING F_ATIPODOC 4
BEGIN
PROMPT 30 5 "A tipo doc "
FIELD TIPODOC
HELP "Codice tipo documento"
USE %TIP
SELECT S3[37,40]!=""
INPUT CODTAB F_ATIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
DISPLAY "Tipo SDI@10" S12
OUTPUT F_ATIPODOC CODTAB
CHECKTYPE FORCED
FLAG "UP"
END
STRING DLG_PROFILE 256
BEGIN
PROMPT 1 -1 "Profilo "
PSELECT
FLAGS "H"
PROMPT 40 3 ""
ITEM "Tipo Doc"
ITEM "Tipo SDI"
END
ENDPAGE
@ -129,9 +76,55 @@ BEGIN
END
ENDPAGE
ENDMASK
PAGE "Riga tipo doc" -1 -1 25 3
STRING S_TIPODOCSEL 4
BEGIN
PROMPT 1 1 "Tipo doc "
HELP "Codice tipo documento"
USE %TIP
SELECT S3[37,40]!=""
INPUT CODTAB S_TIPODOCSEL
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
DISPLAY "Tipo SDI@10" S12
OUTPUT S_TIPODOCSEL CODTAB
OUTPUT S_TIPODOCSDI S12
CHECKTYPE FORCED
FLAG "UPA"
END
STRING S_TIPODOCSDI 4
BEGIN
PROMPT 1 2 "Tipo Doc SDI"
FLAG "D"
END
ENDPAGE
TOOLBAR "Tipo Documento" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 1 1 ""
END
ENDPAGE
ENDMASK
PAGE "Documento" -1 -1 78 9
BOOLEAN S_SELECTED
@ -245,7 +238,5 @@ BEGIN
PROMPT 1 1 ""
END
ENDPAGE
ENDMASK
ENDMASK

View File

@ -86,7 +86,7 @@ bool check_tables()
if (r[0] == '-' && r[1] == '-')
continue;
s += r;
// Cerco un ;
// Cerco un ;
const int limiter = s.find(';') + 1;
if(limiter > 0)
{
@ -150,6 +150,31 @@ bool chiave_paf(const TRectype& doc, TString& hfatt, TString& bfatt)
return hfatt.full();
}
bool get_coddest(const char tipocf, const long codcf, TString& coddest, TString& pec)
{
TCli_for clifo(tipocf, codcf);
coddest = clifo.vendite().get("PADESTIN");
pec = clifo.get("PEC");
bool enapec = false;
if (coddest.empty())
{
// Controllo se ha la pec
if (pec.full())
{
coddest = "0000000";
enapec = true;
}
// Controllo se è straniero
else if (TAnagrafica(LF_CLIFO, tipocf, codcf).estero())
{
coddest = "XXXXXXX";
}
else
return false;
}
return true;
}
/***************************************************************************
* TPaf_record
***************************************************************************/
@ -291,7 +316,7 @@ TString& TPaf_record::remove_string()
query << fld << '=' << var2str(fld, var);
}
}
CHECKS(nkf >= 2, "Can't remove partial key on table ", (const char*)_table);
CHECKS(nkf >= 2, "Can't remove partial key on table ", static_cast<const char*>(_table));
query << ';';
return query;
}
@ -619,29 +644,32 @@ const TRectype& TDoc_fp::cco(const TRectype& doc) const
{
char tcon = doc.get_char(DOC_MODPAG);
if (tcon < 'C') tcon = 'C';
conkey.format("%c%6ld%s", tcon, doc.get_long(DOC_CODCF), (const char*)con);
conkey.format("%c%6ld%s", tcon, doc.get_long(DOC_CODCF), static_cast<const char*>(con));
}
return cache().get("&CON", conkey);
}
void TDoc_fp::log(int severity, const char* msg)
{
if (severity < 0)
if (_log == nullptr)
{
_log = new TLog_report;
}
if (severity < 0)
{
_logpaf = msg;
}
else
{
if (_logpaf.full())
{
_logpaf = msg;
}
else if (_log == NULL)
{
_log = new TLog_report;
if (_logpaf.full())
{
TString txt;
txt << _logpaf << ": " << msg;
_log->log(severity, txt);
}
else
_log->log(severity, msg);
TString txt;
txt << _logpaf << ": " << msg;
_log->log(severity, txt);
}
else
_log->log(severity, msg);
}
}
bool TDoc_fp::show_log()
@ -730,7 +758,6 @@ bool TDoc_fp::add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf)
return ok;
}
bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
{
TString8 hfatt; // Codice univoco di 6 caratteri dell'ufficio P.A. o di 7 caratteri per un privato
@ -740,23 +767,11 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
TString8 coddest = doc.clifor().vendite().get("PADESTIN");
TString pec = doc.clifor().get("PEC");
bool enapec = false;
if (coddest.empty())
{
// Controllo se ha la pec
if (pec.full())
{
coddest = "0000000";
enapec = true;
}
// Controllo se è straniero
else if (clifo.estero())
{
coddest = "XXXXXXX";
}
else
return false;
}
if (!get_coddest(doc.clifor().tipo(), doc.clifor().codice(), coddest, pec))
return false;
const bool enapec = coddest == "0000000" && pec.full();
const bool privato = coddest.len() != 6;
bool ok = true;
@ -1115,7 +1130,13 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
paf1800f.set("PI_KEYHEADERFATT", hfatt);
paf1800f.set("PI_KEYBODYFATT", bfatt);
paf1800f.set("PI_NUMEROLINEA", ++riga);
paf1800f.set("PI_DESCRIZIONE", descrizione(*rdoc));
TPaf_record paf3000f("PAF3000F");
paf3000f.set("PT_KEYHEADERFATT", hfatt);
paf3000f.set("PT_KEYBODYFATT", bfatt);
paf3000f.set("PT_RIFNUMLINEA", riga);
paf3000f.set("PT_COMMENTO", descrizione(*rdoc));
// paf1800f.set("PI_ALIQUOTAIVA", "22.00"); // Altrimenti scarta le righe di descrizione
// <CodiceArticolo>
@ -1142,7 +1163,6 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
}
// </CodiceArticolo>
set_IVA(codivadefault, paf1800f);
if (rdoc->is_merce())
@ -1185,7 +1205,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
const real perc = str;
if (!perc.is_zero())
{
paf2000f.set("PJ_KEYNLINEA", (long)r);
paf2000f.set("PJ_KEYNLINEA", static_cast<long>(r));
paf2000f.set("PJ_KEYNLINAR", ++nlin_sconto);
if (perc > ZERO)
{
@ -1261,7 +1281,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
if (qta.is_zero())
{
TString msg;
msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, (const char*)rdoc->field_qta());
msg.format("La riga spese a quantità %d ha quantità nulla (campo %s)", riga, static_cast<const char*>(rdoc->field_qta()));
log(1, msg);
qta = UNO;
}
@ -1304,7 +1324,7 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
}
paf1800f.set("PI_GESTIONE", "D");
ok &= insert(paf1800f);
ok &= insert(paf1800f) && insert(paf3000f);
}
// </DatiBeniServizi>

View File

@ -19,7 +19,7 @@ bool check_tables();
// Genera la chiave per i paf
bool chiave_paf(const TDocumento& doc, TString& hfatt, TString& bfatt);
bool chiave_paf(const TRectype& doc, TString& hfatt, TString& bfatt);
bool get_coddest(const char tipocf, const long codcf, TString& coddest, TString& pec);
// Contenitore di campi di un record di database MSSQLServer
class TPaf_record : public TObject
@ -109,7 +109,8 @@ static bool get_bnp_iban(const TString& abi, const TString&
static void set_IVA(const TRiga_documento& rdoc, TPaf_record& paf);
bool add_row_art(const TString codice_tipo, const TString& codice_valore, TPaf_record& paf);
bool add_row_alleg(TFilename& file, long& nprogr, TPaf_record& paf);
void set_descrizione(const TRiga_documento* doc);
public:
bool doc_to_paf(TDocumentoEsteso& doc);
bool doc_to_paf(const TRectype& rec);

86
src/fp/sql/fp0104.sql Normal file
View File

@ -0,0 +1,86 @@
-- Aggiornamento campi date Campo, sta roba va fatta perchè abbiamo già dei clienti in produzione!
-- FPERR00K
ALTER TABLE FPERR00K DROP CONSTRAINT FPERR00Q;
ALTER TABLE FPERR00K ALTER COLUMN PXUHRI DATETIME;
ALTER TABLE FPERR00K ADD CONSTRAINT FPERR00K_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PXUHRI;
UPDATE FPERR00K SET PXUHRI = '19700101 00:00:00' WHERE PXUHRI IS NULL;
ALTER TABLE FPERR00K ALTER COLUMN PXUHRI DATETIME NOT NULL;
ALTER TABLE FPERR00K ADD CONSTRAINT FPERR00Q PRIMARY KEY(PXPRGI, PXHFAT, PXBFAT, PXUHRI, PXNFIL, PXNLIN, PXNERR);
-- FPPRO00F
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAPROT DATETIME;
ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PZ_DATAPROT;
UPDATE FPPRO00F SET PZ_DATAPROT = '19700101 00:00:00' WHERE PZ_DATAPROT IS NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAPROT DATETIME NOT NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAACCET DATETIME;
ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV2 DEFAULT '19700101 00:00:00' FOR PZ_DATAACCET;
UPDATE FPPRO00F SET PZ_DATAACCET = '19700101 00:00:00' WHERE PZ_DATAACCET IS NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAACCET DATETIME NOT NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATACONT DATETIME;
ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV3 DEFAULT '19700101 00:00:00' FOR PZ_DATACONT;
UPDATE FPPRO00F SET PZ_DATACONT = '19700101 00:00:00' WHERE PZ_DATACONT IS NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATACONT DATETIME NOT NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAARCH DATETIME;
ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV4 DEFAULT '19700101 00:00:00' FOR PZ_DATAARCH;
UPDATE FPPRO00F SET PZ_DATAARCH = '19700101 00:00:00' WHERE PZ_DATAARCH IS NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAARCH DATETIME NOT NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAORARIC DATETIME;
ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV5 DEFAULT '19700101 00:00:00' FOR PZ_DATAORARIC;
UPDATE FPPRO00F SET PZ_DATAORARIC = '19700101 00:00:00' WHERE PZ_DATAORARIC IS NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATAORARIC DATETIME NOT NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATASTATO DATETIME;
ALTER TABLE FPPRO00F ADD CONSTRAINT FPPRO00F_TLLNNAPRV6 DEFAULT '19700101 00:00:00' FOR PZ_DATASTATO;
UPDATE FPPRO00F SET PZ_DATASTATO = '19700101 00:00:00' WHERE PZ_DATASTATO IS NULL;
ALTER TABLE FPPRO00F ALTER COLUMN PZ_DATASTATO DATETIME NOT NULL;
-- PAA0100F
ALTER TABLE PAA0100F DROP CONSTRAINT PAA0100Q;
DROP INDEX PAA0101I ON PAA0100F;
ALTER TABLE PAA0100F ALTER COLUMN P1_DATAORARIC DATETIME;
ALTER TABLE PAA0100F ADD CONSTRAINT PAA0100F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR P1_DATAORARIC;
UPDATE PAA0100F SET P1_DATAORARIC = '19700101 00:00:00' WHERE P1_DATAORARIC IS NULL;
ALTER TABLE PAA0100F ALTER COLUMN P1_DATAORARIC DATETIME NOT NULL;
ALTER TABLE PAA0100F ALTER COLUMN P1_DATASTATO DATETIME;
ALTER TABLE PAA0100F ADD CONSTRAINT PAA0100F_TLLNNAPRV2 DEFAULT '19700101 00:00:00' FOR P1_DATASTATO;
UPDATE PAA0100F SET P1_DATASTATO = '19700101 00:00:00' WHERE P1_DATASTATO IS NULL;
ALTER TABLE PAA0100F ALTER COLUMN P1_DATASTATO DATETIME NOT NULL;
ALTER TABLE PAA0100F ADD CONSTRAINT PAA0100Q PRIMARY KEY(P1_KEYPRGINVIO, P1_KEYHEADERFATT, P1_KEYBODYFATT, P1_DATAORARIC);
CREATE INDEX PAA0101I ON PAA0100F (P1_KEYPRGINVIO ASC, P1_KEYHEADERFATT ASC, P1_KEYBODYFATT ASC, P1_DATAORARIC ASC);
-- PAA2800F
ALTER TABLE PAA2800F ALTER COLUMN PR_DATAORARIT DATETIME;
ALTER TABLE PAA2800F ADD CONSTRAINT PAA2800F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PR_DATAORARIT;
UPDATE PAA2800F SET PR_DATAORARIT = '19700101 00:00:00' WHERE PR_DATAORARIT IS NULL;
ALTER TABLE PAA2800F ALTER COLUMN PR_DATAORARIT DATETIME NOT NULL;
ALTER TABLE PAA2800F ALTER COLUMN PR_DATAORACON DATETIME;
ALTER TABLE PAA2800F ADD CONSTRAINT PAA2800F_TLLNNAPRV2 DEFAULT '19700101 00:00:00' FOR PR_DATAORACON;
UPDATE PAA2800F SET PR_DATAORACON = '19700101 00:00:00' WHERE PR_DATAORACON IS NULL;
ALTER TABLE PAA2800F ALTER COLUMN PR_DATAORACON DATETIME NOT NULL;
-- PAF2800F
ALTER TABLE PAF2800F ALTER COLUMN PR_DATAORARIT DATETIME;
ALTER TABLE PAF2800F ADD CONSTRAINT PAF2800F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PR_DATAORARIT;
UPDATE PAF2800F SET PR_DATAORARIT = '19700101 00:00:00' WHERE PR_DATAORARIT IS NULL;
ALTER TABLE PAF2800F ALTER COLUMN PR_DATAORARIT DATETIME NOT NULL;
ALTER TABLE PAF2800F ALTER COLUMN PR_DATAORACON DATETIME;
ALTER TABLE PAF2800F ADD CONSTRAINT PAF2800F_TLLNNAPRV2 DEFAULT '19700101 00:00:00' FOR PR_DATAORACON;
UPDATE PAF2800F SET PR_DATAORACON = '19700101 00:00:00' WHERE PR_DATAORACON IS NULL;
ALTER TABLE PAF2800F ALTER COLUMN PR_DATAORACON DATETIME NOT NULL;
-- PAFW300F
ALTER TABLE PAFW300F ALTER COLUMN PW_UPAG DATETIME;
ALTER TABLE PAFW300F ADD CONSTRAINT PAFW300F_TLLNNAPRV1 DEFAULT '19700101 00:00:00' FOR PW_UPAG;
UPDATE PAFW300F SET PW_UPAG = '19700101 00:00:00' WHERE PW_UPAG IS NULL;
ALTER TABLE PAFW300F ALTER COLUMN PW_UPAG DATETIME NOT NULL;
-- TLLNNAPRV -> Tolla non approva