(rec->get(_importoIVA));
+
+ const real imponibile = rec->get_real(_imponibile);
+ const real imposta = rec->get_real(_importoIVA);
+
if(nat != real_nat)
{
msgerr.cut(0) << "Natura del movimento errata, valore dichiarato: " << nat << " valore corretto: " << real_nat;
@@ -674,9 +680,8 @@ void TTrFa_mask::load_sheet()
TSheet_field& sheet = sfield(F_RIGHE);
- sheet.hide(); // Nascondo lo sheet per guadagnare un 20% di velocitā di caricamento, le ottimizzazioni da PRO!
- if(!sheet.empty())
- sheet.destroy();
+ // Nascondo lo sheet per guadagnare un 20% di velocitā di caricamento, le ottimizzazioni da PRO!
+ sheet.destroy();
TAssoc_array recimposte;
const int items = c.update_filters(tipo, codice, dal, al, get_int(F_FATTSEL));
TString tipocf, codcf, ocfpi, nat;
@@ -722,8 +727,14 @@ void TTrFa_mask::load_sheet()
row.add(get_rfso(cli.get("CODRFSO")), _ragsocrfso); // Ragione Sociale RF/SO
row.add(movimento.get("NUMDOC"), _numdoc); // Numero documento
row.add(movimento.get_date("DATADOC"), _datadoc); // Data documento
- nat.cut(0) << movimento.get("NATURA");
- row.add(nat.full() ? nat : natura(iva), _natura); // NATURA!
+ nat = movimento.get("NATURA");
+ if (nat.blank())
+ {
+ TCodiceIVA civa(iva);
+
+ nat = civa.natura();
+ }
+ row.add(nat, _natura); // NATURA!
row.add(iva, _aliquota); // Codice aliquota!
row.add(find_detraib(movimento.get("TIPODET")), _detraibile); // Detraibilitā
row.add(movimento.get_real("IMPONIBILE"), _imponibile); // Imponibile
diff --git a/src/tf/tf0400.cpp b/src/tf/tf0400.cpp
index dbe5dd080..09d8d5538 100644
--- a/src/tf/tf0400.cpp
+++ b/src/tf/tf0400.cpp
@@ -284,7 +284,10 @@ void TSpe_check_msk::fill_no_filter()
row.add(rset.get("25.IMPONIBILE").as_string(), s.cid2index(A_IMPONIBILE));
row.add(rset.get("25.IMPOSTA").as_string(), s.cid2index(A_IMPOSTA));
// NATURA
- row.add(natura(rset.get("25.CODIVA").as_string()), s.cid2index(A_NATURA));
+
+ TCodiceIVA iva(rset.get("25.CODIVA").as_string());
+
+ row.add(iva.natura(), s.cid2index(A_NATURA));
// DETR
row.add(find_detraib(rset.get("25.TIPODET").as_string()), s.cid2index(A_DETRAIB));
@@ -376,8 +379,14 @@ void TSpe_check_msk::fill_diff()
row.add(rset.get("IMPONIBILE").as_string(), s.cid2index(A_IMPONIBILE));
row.add(rset.get("IMPOSTA").as_string(), s.cid2index(A_IMPOSTA));
// NATURA
- nat.cut(0) << rset.get("NATURA").as_string();
- row.add(nat.full() ? nat : natura(rset.get("CODIVA").as_string()), s.cid2index(A_NATURA));
+ nat = rset.get("NATURA").as_string();
+ if (nat.blank())
+ {
+ TCodiceIVA civa(rset.get("CODIVA").as_string());
+
+ nat = civa.natura();
+ }
+ row.add(nat, s.cid2index(A_NATURA));
// DETR
row.add(find_detraib(rset.get("TIPODET").as_string()), s.cid2index(A_DETRAIB));
@@ -460,7 +469,10 @@ void TSpe_check_msk::find_homeland(TToken_string& row, TString numreg, TString c
row.add(imponibile, s.cid2index(A_IMPONIBILE));
row.add(imposta, s.cid2index(A_IMPOSTA));
// NATURA
- row.add(natura(rec_rmov.get("CODIVA")), s.cid2index(A_NATURA));
+
+ TCodiceIVA iva(rec_rmov.get("CODIVA"));
+
+ row.add(iva.natura(), s.cid2index(A_NATURA));
// DETR
row.add(find_detraib(rec_rmov.get("TIPODET")), s.cid2index(A_DETRAIB));
@@ -549,8 +561,15 @@ void TSpe_check_msk::fill_cust()
row.add(rset.get("IMPONIBILE").as_string(), s.cid2index(A_IMPONIBILE));
row.add(rset.get("IMPOSTA").as_string(), s.cid2index(A_IMPOSTA));
// NATURA
- nat.cut(0) << rset.get("NATURA").as_string();
- row.add(nat.full() ? nat : natura(rset.get("CODIVA").as_string()), s.cid2index(A_NATURA));
+ nat = rset.get("NATURA").as_string();
+ if (nat.blank())
+ {
+ TCodiceIVA civa(rset.get("CODIVA").as_string());
+
+ nat = civa.natura();
+ }
+
+ row.add(nat, s.cid2index(A_NATURA));
// DETR
row.add(find_detraib(rset.get("TIPODET").as_string()), s.cid2index(A_DETRAIB));
diff --git a/src/ve/f34.dir b/src/ve/f34.dir
index 9b28ef699..da6160d80 100755
--- a/src/ve/f34.dir
+++ b/src/ve/f34.dir
@@ -1,3 +1,3 @@
34
0
-$rdoc|||618|0|Righe documenti|||
+$rdoc|||619|0|Righe documenti|||
diff --git a/src/ve/f34.trr b/src/ve/f34.trr
index bec2858be..a29f7d83e 100755
--- a/src/ve/f34.trr
+++ b/src/ve/f34.trr
@@ -1,5 +1,5 @@
34
-70
+71
CODNUM|1|4|0|Codice Numeriazione
ANNO|2|4|0|Anno
PROVV|1|1|0|Tipo numerazione rovvisoria efinitiva
@@ -65,6 +65,7 @@ CODAGG1|1|20|0|Codice aggiuntivo 1
CODAGG2|1|20|0|Codice aggiuntivo 2
PRIORITY|3|7|0|Prioritā MSP
TIPODET|1|1|0|Tipo detraibilitā
+REVCHARGE|8|1|0|Flag reverse charge
RG1|11|10|0|Campo memo per formule e campi virtuali
DATAINIATT|5|8|0|Data inizio attivitā
DATAFINATT|5|8|0|Data fine attivitā
diff --git a/src/ve/ve0300b.dat b/src/ve/ve0300b.dat
index b3235e80a..13051d4fa 100755
--- a/src/ve/ve0300b.dat
+++ b/src/ve/ve0300b.dat
@@ -84,4 +84,5 @@ CCON(8)|2|4|CONAI\nSottoc.9|4
PCON(9)|3|1305|CONAI\nPeso un.9|13
CCON(10)|2|4|CONAI\nSottoc.10|4
PCON(10)|3|1305|CONAI\nPeso un.10|13
+REVCHARGE|4||Reverse charge|14
diff --git a/src/ve/velib.h b/src/ve/velib.h
index 948ef1135..0223039aa 100755
--- a/src/ve/velib.h
+++ b/src/ve/velib.h
@@ -829,6 +829,9 @@ class TDocumento : public TMultiple_rectype // velib03
TAssoc_array _conaiqta; // Per ogni sottocategoria CONAI mi calcola la qta
TArray _qta_evasa_auto;
+ TBit_array _row_auto_cod_changed;
+ bool _auto_cod_modify_pend;
+ TAssoc_array _qta_evasa_auto_changed;
protected:
virtual TRectype * new_body_record(int logicnum = 0)
@@ -902,7 +905,7 @@ public:
const TRiga_documento* get_row_id(long id) const;
int id2rownum(long id) const;
- TRiga_documento& insert_row(int row, const char *tipo = NULL);
+ TRiga_documento& insert_row(int nrow, const char *tipo = NULL);
TRiga_documento& new_row(const char *tipo = NULL);
virtual int read(TBaseisamfile& f, word op = _isequal, word lockop = _nolock);
virtual int readat(TBaseisamfile& file, TRecnotype nrec, word lockop = _nolock);
@@ -1015,8 +1018,8 @@ public:
void auto_evasione(const int nrow = -1);
void qta_evasa_auto_pack(const int nrow) { _qta_evasa_auto.destroy(nrow, true); }
- int find_nrow(const char * tiporiga, const char * codice, int from = 1) const;
- TRiga_documento & find_row(const char * tiporiga, const char * codice);
+ int find_nrow(const char * tiporiga, const char * codice, bool reverse = false, int from = -1) const;
+ TRiga_documento & find_row(const char * tiporiga, const char * codice, bool reverse = false);
TDocumento ();
TDocumento (const TDocumento& d);
@@ -1158,7 +1161,7 @@ protected:
void configura_sheet(TSheet_field& sheet);
static TMask* ss_getmask(int numriga, TMask& fullmask);
- int insert_anal_fields(TMask& m, int page, int lf, int& y, short& dlg, short& dlgd, bool required);
+ int insert_anal_fields(TMask& m, int page, int lf, int& y, short& dlg, short& dlgd, bool required, const short contsep_id = -1);
void insert_anal_page();
void set_or_def(short id, const TString& val);
diff --git a/src/ve/velib02.cpp b/src/ve/velib02.cpp
index 90a83e49f..b9bc5950d 100755
--- a/src/ve/velib02.cpp
+++ b/src/ve/velib02.cpp
@@ -375,7 +375,7 @@ void TRiga_documento::update_orders(real qta, TToken_string & tipi, TToken_strin
{
const bool storno = qta < ZERO;
const TString4 tiporiga = tipo().codice();
- const TString40 codart = codice();
+ const TString40 codart = get(RDOC_CODART);
real qta_da_evadere = storno ? -qta : qta;
if (codart.full())
@@ -409,7 +409,7 @@ void TRiga_documento::update_orders(real qta, TToken_string & tipi, TToken_strin
{
bool to_delete = true;
- for (int nrow = docs[i].find_nrow(tiporiga, codart); to_delete && nrow > 0; nrow = docs[i].find_nrow(tiporiga, codart, nrow + 1))
+ for (int nrow = docs[i].find_nrow(tiporiga, codart, storno); to_delete && nrow > 0; nrow = docs[i].find_nrow(tiporiga, codart, storno, nrow))
to_delete &= docs[i][nrow].is_evasa();
if (to_delete)
docs.destroy(i, false);
@@ -432,11 +432,11 @@ void TRiga_documento::update_orders(real qta, TToken_string & tipi, TToken_strin
{
TDocumento & d = docs[i];
- for (int nrow = d.find_nrow(tiporiga, codart); (qta_da_evadere > ZERO) && nrow > 0; nrow = d.find_nrow(tiporiga, codart, nrow + 1))
+ for (int nrow = d.find_nrow(tiporiga, codart, storno); (qta_da_evadere > ZERO) && nrow > 0; nrow = d.find_nrow(tiporiga, codart, storno, nrow))
{
TRiga_documento & rdoc = d[nrow];
- if (!rdoc.is_evasa())
+ if (!rdoc.is_evasa() || storno)
{
TToken_string rdoc_key = rdoc.get_rdoc_key();
real qta_evasa = qta_da_evadere;
@@ -861,6 +861,7 @@ real TRiga_documento::importo(bool scontato, bool lordo, int ndec) const
real TRiga_documento::iva(int ndec) const
{
real zanicchi;
+
if (!is_sconto())
{
if (is_omaggio())
diff --git a/src/ve/velib03.cpp b/src/ve/velib03.cpp
index 2b551d370..2615c0eb7 100755
--- a/src/ve/velib03.cpp
+++ b/src/ve/velib03.cpp
@@ -257,6 +257,7 @@ HIDDEN TAssoc_array _docs_to_agg;
void TDocumento::init()
{
+ _auto_cod_modify_pend = false;
add_file(LF_RIGHEDOC, RDOC_NRIGA);
set_memo_fld("G1");
@@ -809,14 +810,14 @@ void TDocumento::copy_contents(const TDocumento& src, bool copy_header)
}
}
-TRiga_documento& TDocumento::insert_row(int row, const char *tipo)
+TRiga_documento& TDocumento::insert_row(int nrow, const char *tipo)
{
- TRiga_documento& r = (TRiga_documento&)TMultiple_rectype::insert_row(row);
+ TRiga_documento& r = (TRiga_documento&)TMultiple_rectype::insert_row(nrow);
if (tipo && *tipo)
r.set_tipo(tipo);
if (this->tipo().auto_evasione()) // this per spiegare che non č il parametro tipo
- _qta_evasa_auto.insert(ZERO, row); // inserisce la riga nuova nell'array
+ update_row_auto_qta(nrow, (real &) ZERO, true, true);
return r;
}
@@ -878,12 +879,36 @@ void TDocumento::on_read(int err, word lockop)
_old_agente = get(DOC_CODAG);
_old_agente1 = get(DOC_CODAGVIS);
}
- _qta_evasa_auto.destroy();
- if (get(DOC_TIPODOC).full() && tipo().auto_evasione())
+
+ if (get(DOC_TIPODOC).full() && tipo().auto_evasione() && !_auto_cod_modify_pend)
{
+ _qta_evasa_auto.destroy();
+ _row_auto_cod_changed.reset();
+ _qta_evasa_auto_changed.destroy();
FOR_EACH_SELF_PHYSICAL_RDOC(i, rdoc)
update_row_auto_qta(i, rdoc->quantita(), false);
}
+ if (get(DOC_TIPODOC).full() && tipo().causale().full())
+ {
+ const TCausale & caus = cached_causale(tipo().causale());
+
+ if (caus.reverse_charge_pubb())
+ {
+ bool no_reverse = true;
+
+ FOR_EACH_SELF_PHYSICAL_RDOC(i, rdoc)
+ if (no_reverse && !rdoc->tipo().is_descrizione() &&
+ rdoc->get(RDOC_CODIVA).full())
+ no_reverse &= !rdoc->get_bool(RDOC_REVCHARGE);
+ if (no_reverse)
+ {
+ FOR_EACH_SELF_PHYSICAL_RDOC(i1, rdoc)
+ if (!rdoc->tipo().is_descrizione() &&
+ rdoc->get(RDOC_CODIVA).full())
+ rdoc->put(RDOC_REVCHARGE, true);
+ }
+ }
+ }
}
int TDocumento::read(TBaseisamfile& f, word op, word lockop)
@@ -1532,7 +1557,30 @@ int TDocumento::write_rewrite(TBaseisamfile & f, bool re) const
const TString80 codcms(get(DOC_CODCMS));
const TString80 fascms(get(DOC_FASCMS));
const TString80 codcos(get(DOC_CODCOSTO));
-
+
+ /* if (get(DOC_TIPODOC).full() && tipo().causale().full())
+ {
+ const TCausale & caus = cached_causale(tipo().causale());
+
+ if (caus.reverse_charge_pubb())
+ {
+ bool no_reverse = true;
+
+ FOR_EACH_SELF_PHYSICAL_RDOC(i, rdoc)
+ if (no_reverse && !rdoc->tipo().is_descrizione() &&
+ rdoc->get(RDOC_CODIVA).full())
+ no_reverse &= !rdoc->get_bool(RDOC_REVCHARGE);
+ if (no_reverse)
+ {
+ FOR_EACH_SELF_PHYSICAL_RDOC(i1, rdoc)
+ if (!rdoc->tipo().is_descrizione() &&
+ rdoc->get(RDOC_CODIVA).full())
+ rdoc->put(RDOC_REVCHARGE, true);
+ }
+ }
+ }
+ */
+
for (int i = physical_rows(); i > 0; i--)
{
TRiga_documento& r = myself.row(i);
@@ -1693,7 +1741,6 @@ int TDocumento::remove(TBaseisamfile& f) const
if (_has_provv && tipo().provvigioni())
myself.update_provvigioni(true);
myself.plafond().remove(myself);
- // if (tipo().auto_evasione())
myself.auto_evasione();
}
return TMultiple_rectype::remove(f);
@@ -2850,6 +2897,9 @@ TDocumento& TDocumento::copy(const TDocumento & d)
}
_occas = d.occas();
_qta_evasa_auto = d._qta_evasa_auto;
+ _auto_cod_modify_pend = d._auto_cod_modify_pend;
+ _row_auto_cod_changed = d._row_auto_cod_changed;
+ _qta_evasa_auto_changed = d._qta_evasa_auto_changed;
return *this;
}
@@ -3569,6 +3619,7 @@ void TDocumento::update_row_auto_qta(int nrow, real & qta, bool plus, bool inser
if (insert)
{
_qta_evasa_auto.insert(ZERO, nrow);
+ _row_auto_cod_changed.insert(nrow);
qta_evasa = (real *)_qta_evasa_auto.objptr(nrow);
}
else
@@ -3577,6 +3628,8 @@ void TDocumento::update_row_auto_qta(int nrow, real & qta, bool plus, bool inser
if (qta_evasa == nullptr)
_qta_evasa_auto.add(qta_evasa = new real, nrow);
+ if (_row_auto_cod_changed[nrow])
+ *qta_evasa = ZERO;
*qta_evasa += (plus ? qta : -qta);
}
if (qta_evasa != nullptr && *qta_evasa == ZERO)
@@ -3603,32 +3656,165 @@ void TDocumento::auto_evasione(const int nrow)
rdoc->update_orders((real &)_qta_evasa_auto[i], tipi, stati, stato_aperto, stato_evaso);
_qta_evasa_auto.destroy(i);
}
+ _row_auto_cod_changed.reset();
+ if (_auto_cod_modify_pend)
+ {
+ _auto_cod_modify_pend = false;
+ FOR_EACH_ASSOC_OBJECT(_qta_evasa_auto_changed, o, k, obj)
+ {
+ real & qta = (real &)*obj;
+
+ if (qta != ZERO)
+ {
+ const bool storno = qta < ZERO;
+ const TString key(k);
+ const TString4 tiporiga = key.left(2);
+ real qta_da_evadere = storno ? -qta : qta;
+ const TString40 codart(key.mid(2));
+
+ if (codart.full())
+ {
+ const int year = get_date(DOC_DATADOC).year();
+ const TDate dadata(1, 1, year - 5);
+ const TDate adata(31, 12, year);
+ TLista_documenti docs;
+ TString_array evaded;
+ TArray evaded_qta;
+ TString_array to_delete;
+
+ int ndocs = docs.read('D', get_char(DOC_TIPOCF), get_long(DOC_CODCF),
+ year, tipi, stati, dadata, adata);
+
+ for (int i = 0; i < ndocs; i++)
+ if (docs[i].find_nrow(tiporiga, codart) < 0)
+ docs.destroy(i, false);
+ else
+ if (!storno)
+ {
+ bool to_delete = true;
+
+ for (int nrow = docs[i].find_nrow(tiporiga, codart, storno); to_delete && nrow > 0; nrow = docs[i].find_nrow(tiporiga, codart, storno, nrow))
+ to_delete &= docs[i][nrow].is_evasa();
+ if (to_delete)
+ docs.destroy(i, false);
+ }
+ docs.pack();
+ ndocs = docs.items();
+ for (int i = storno ? ndocs - 1 : 0; (qta_da_evadere > ZERO) && (storno ? i >= 0 : i < ndocs); storno ? i-- : i++)
+ {
+ TDocumento & d = docs[i];
+
+ for (int nrow = d.find_nrow(tiporiga, codart, storno); (qta_da_evadere > ZERO) && nrow > 0; nrow = d.find_nrow(tiporiga, codart, storno, nrow))
+ {
+ TRiga_documento & rdoc = d[nrow];
+
+ if (!rdoc.is_evasa())
+ {
+ TToken_string rdoc_key = rdoc.get_rdoc_key();
+ real qta_evasa = qta_da_evadere;
+ bool riga_evasa = false;
+
+ if (storno)
+ {
+ const real & evaso = rdoc.qtaevasa();
+
+ if (qta_evasa > evaso)
+ {
+ qta_evasa = evaso;
+ to_delete.add(rdoc_key);
+ }
+ rdoc.sub(RDOC_QTAEVASA, qta_evasa);
+ }
+ else
+ {
+ const real & residuo = rdoc.qtaresidua();
+
+ if (residuo <= qta_da_evadere)
+ {
+ if (i < ndocs - 1)
+ qta_evasa = residuo;
+ riga_evasa = true;
+ }
+ rdoc.add(RDOC_QTAEVASA, qta_evasa);
+ }
+ rdoc.put(RDOC_RIGAEVASA, riga_evasa);
+ qta_da_evadere -= qta_evasa;
+ }
+ }
+ }
+ for (int i = 0; i < ndocs; i++)
+ if (docs[i].is_evaso())
+ docs[i].stato(stato_evaso);
+ else
+ if (docs[i].stato() == stato_evaso)
+ docs[i].stato(stato_aperto);
+ docs.rewrite();
+ }
+ }
+ }
+ _qta_evasa_auto_changed.destroy();
+ }
}
else
{
TRiga_documento & rdoc = row(nrow);
+ const TString & codart = rdoc.get(RDOC_CODART);
- if (rdoc.is_evadibile() && _qta_evasa_auto.objptr(nrow) != nullptr)
+ if (codart.full())
{
- rdoc.update_orders((real &)_qta_evasa_auto[nrow], tipi, stati, stato_aperto, stato_evaso);
- _qta_evasa_auto.destroy(nrow);
- message_box(TR("Sono stati evasi ordini legati a questo documento.\nE' necessario registrarlo"));
+ real * qta = (real *)_qta_evasa_auto_changed.objptr(codart);
+ real qta_da_stornare = (real &)_qta_evasa_auto[nrow];
+
+ if (qta == nullptr)
+ {
+ TString key = rdoc.tipo().codice();
+
+ key.rpad(2);
+ key << codart;
+ _qta_evasa_auto_changed.add(key, qta = new real);
+ }
+ *qta += qta_da_stornare;
+ _row_auto_cod_changed.set(nrow, true);
+ _auto_cod_modify_pend = true;
}
+
+ rdoc.zero(RDOC_DACODNUM);
+ rdoc.zero(RDOC_DAANNO);
+ rdoc.zero(RDOC_DAPROVV);
+ rdoc.zero(RDOC_DANDOC);
+ rdoc.zero(RDOC_DAIDRIGA);
+ rdoc.zero(RDOC_ORIGINAL_ROWS);
+ rdoc.zero(RDOC_ORIGINAL_QTAROWS);
}
}
}
-int TDocumento::find_nrow(const char * tiporiga, const char * codice, int from) const
+int TDocumento::find_nrow(const char * tiporiga, const char * codice, bool reverse, int from) const
{
- FOR_EACH_SELF_RDOC(i, rdoc)
- if ((i >= from) && (rdoc->tipo().codice() == tiporiga) && (rdoc->codice() == codice))
- return i;
+ if (reverse)
+ {
+ if (from < 0)
+ from = physical_rows();
+ from--;
+ FOR_EACH_SELF_RDOC_BACK(i, rdoc)
+ if ((i <= from) && (rdoc->tipo().codice() == tiporiga) && (rdoc->codice() == codice))
+ return i;
+ }
+ else
+ {
+ if (from < 0)
+ from = 0;
+ from++;
+ FOR_EACH_SELF_RDOC(i, rdoc)
+ if ((i >= from) && (rdoc->tipo().codice() == tiporiga) && (rdoc->codice() == codice))
+ return i;
+ }
return -1;
}
-TRiga_documento & TDocumento::find_row(const char * tiporiga, const char * codice)
+TRiga_documento & TDocumento::find_row(const char * tiporiga, const char * codice, bool reverse)
{
- const int i = find_nrow(tiporiga, codice);
+ const int i = find_nrow(tiporiga, codice, reverse);
if (i > 0)
return row(i);
diff --git a/src/ve/velib03a.cpp b/src/ve/velib03a.cpp
index 4f77aa7b9..fa04c8ba6 100755
--- a/src/ve/velib03a.cpp
+++ b/src/ve/velib03a.cpp
@@ -616,11 +616,11 @@ int TExpr_documento::parse_user_func(const char * name, int nparms) const
if (strcmp(name, "NRATE") == 0)
return nparms == 0 ? _nrate : -1;
if (strcmp(name, "QTACONAI") == 0)
- return nparms >= 1 && nparms < 4 ? _qtaconai : -1;
+ return nparms >= 0 && nparms < 4 ? _qtaconai : -1;
if (strcmp(name, "PESOCONAI") == 0)
- return nparms >= 1 && nparms < 4 ? _pesoconai : -1;
+ return nparms >= 0 && nparms < 4 ? _pesoconai : -1;
if (strcmp(name, "VALCONAI") == 0)
- return nparms >= 1 && nparms < 4 ? _valconai : -1;
+ return nparms >= 0 && nparms < 4 ? _valconai : -1;
return -1;
}
@@ -1074,7 +1074,7 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
{
const int ndec = (nparms > 2) ? (int)stack.pop_real().integer() : 5;
const int tipo_calcolo = (nparms > 1) ? (int)stack.pop_real().integer() : 0;
- const TString cat = stack.pop_string();
+ const TString cat = (nparms > 0) ? stack.pop_string() : EMPTY_STRING;
stack.push(ZERO);
@@ -1106,7 +1106,6 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
if (tipo_calcolo == 0)
val *= ((CENTO - perc_esenz) / CENTO);
else
-
val *= (perc_esenz / CENTO);
}
val.round(ndec);
@@ -1119,7 +1118,7 @@ void TExpr_documento::evaluate_user_func(int index, int nparms, TEval_stack & st
{
const int ndec = (nparms > 2) ? (int)stack.pop_real().integer() : 5;
const int tipo_calcolo = (nparms > 1) ? (int)stack.pop_real().integer() : 0;
- const TString cat = stack.pop_string();
+ const TString cat = (nparms > 0) ? stack.pop_string() : EMPTY_STRING;
TString_array sottocat_found;
stack.push(ZERO);
diff --git a/src/ve/velib04.cpp b/src/ve/velib04.cpp
index 7c4b7f6b2..41b4bf8b9 100755
--- a/src/ve/velib04.cpp
+++ b/src/ve/velib04.cpp
@@ -59,7 +59,7 @@ int TLista_documenti::read(char provv, char tipocf, long clifo, int anno,
CHECKD(tipocf == ' ' || clifo > 0L, "Codice cliente non valido", clifo);
CHECKD(anno > 2000, "Anno non valido: ", anno);
CHECK(!tipidoc.empty_items(), "Lista dei tipi documento vuota");
- CHECK(statidoc.items() == tipidoc.items(), "La lista degli stati documento non corrisponde alla lista dei tipi documento");
+ CHECK(!statidoc.empty_items(), "Lista degli stati documento vuota");
const int key = (tipocf == ' ' && clifo == 0L) ? 1:2;
TRelation doc(LF_DOC);
@@ -149,11 +149,11 @@ int TLista_documenti::read(char provv, char tipocf, long clifo, int anno,
{
const TString & tipo = tipidoc.get(i);
- if (tipo.blank() || tipo == "*" || tipodoc == tipo)
+ if (tipo.blank() || tipodoc == tipo)
{
const TString & stato = statidoc.get(i);
- if (stato.blank() || tipo == "*" || statodoc == stato)
+ if (stato.blank() || statodoc == stato)
{
match = true;
break;
diff --git a/src/ve/velib04b.cpp b/src/ve/velib04b.cpp
index 96a5139d6..d7cef426a 100755
--- a/src/ve/velib04b.cpp
+++ b/src/ve/velib04b.cpp
@@ -714,10 +714,11 @@ error_type TIVA_array::add(const TRiga_documento& r, const TBill& conto, const i
// speciale per lo storno, proveniente da configurazione
const TString4 tipodet = r.get(RDOC_TIPODET);
+ const bool revcharge = r.get_bool(RDOC_REVCHARGE);
+ TString80 key;
- TString80 key;
- key.format("%d|%-4s|%c|%3d|%3d|%6ld|%s",
- ord,(const char*)cod,c.tipo(),c.gruppo(),c.conto(),c.sottoconto(), (const char*)tipodet);
+ key.format("%d|%-4s|%c|%3d|%3d|%6ld|%s|%s",
+ ord,(const char*)cod,c.tipo(),c.gruppo(),c.conto(),c.sottoconto(), (const char*)tipodet, revcharge ? "X" : "");
// Nel caso di documenti a zero tiene distinte IVA positiva e negativa
if (r.doc().totale_doc().is_zero())
@@ -745,6 +746,7 @@ error_type TIVA_array::add(const TRiga_documento& r, const TBill& conto, const i
iva->add(RMI_IMPONIBILE, impon);
iva->put(RMI_TIPODET, tipodet);
+ iva->put(RMI_REVCHARGE, revcharge);
iva->add(RMI_IMPOSTA, imposta);
if (ord != 5)
{
@@ -1204,7 +1206,7 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc)
}
// Codice registro IVA
- const TRegistro& registro = _caus->reg();
+ TRegistro& registro = (TRegistro &) _caus->reg();
const bool iva_mov = registro.ok();
long ult_prot = registro.protocol();
@@ -1219,12 +1221,8 @@ error_type TContabilizzazione::compile_head_mov(TDocumento& doc)
{
if (_nump_iva) // Reperisce l'ultimo numero di protocollo dal registro IVA
{
- const bool upd_prot = ini_get_bool(CONFIG_DITTA, "ve", "UpdateProtocol", true);
- TRegistro reg(registro);
-
- if (upd_prot)
- ult_prot = reg.protocol();
- ult_prot++;
+ registro.reread();
+ ult_prot = registro.protocol() + 1;
if (ult_prot <= 0)
{
_error = ultprot_error;
@@ -2823,13 +2821,16 @@ error_type TContabilizzazione::write_scadenze(TDocumento& doc, bool recontabiliz
TPagamento& pag = doc.pagamento();
const TCurrency_documento totspese(doc.spese(), doc);
TCurrency_documento totimposte(doc.imposta(true), doc);
-
+ bool acquisto_revcharge = _caus->iva() == iva_acquisti && _caus->reverse_charge_pubb() ;
real imposte;
+
for (int j = _movimento->iva_items()-1; j >= 0; j--)
- imposte += _movimento->iva(j).get_real(RMI_IMPOSTA) * (swapped ? -UNO : UNO);
+ if (!acquisto_revcharge || !_movimento->iva(j).get_bool(RDOC_REVCHARGE))
+ imposte += _movimento->iva(j).get_real(RMI_IMPOSTA) * (swapped ? -UNO : UNO);
if (_caus->iva() == iva_acquisti) // Ricalcola precisamente il totale imposte
- {
+ {
real ti = imposte;
+
if (in_valuta)
cambio.eur2val(ti);
totimposte.set_num(ti);
@@ -3226,16 +3227,12 @@ error_type TContabilizzazione::write_all(TDocumento& doc, TMovimentoPN_VE & movi
}
if (_nump_iva) // Reperisce l'ultimo numero di protocollo dal registro IVA
{
- const bool upd_prot = ini_get_bool(CONFIG_DITTA, "ve", "UpdateProtocol", true);
- // TRegistro& registro = _caus->reg();
- TRegistro registro(_caus->reg());
- TRegistro reg(registro);
+// non serve const bool upd_prot = ini_get_bool(CONFIG_DITTA, "ve", "UpdateProtocol", true);
+ TRegistro & reg = (TRegistro &) _caus->reg();
const int ult_prot = head.get_int(MOV_PROTIVA);
- if (upd_prot)
- reg.update(ult_prot, doc.data());
- else
- registro.update(ult_prot, doc.data());
+ reg.reread();
+ reg.update(ult_prot, doc.data());
}
// Aggiorno subito i saldi
if (_caus->soloiva())
@@ -4427,14 +4424,30 @@ error_type TContabilizzazione::write_regolarizzazione(const TDocumento& doc, TMo
head.put(MOV_NUMREG,nr);
TSaldo_agg saldo;
+
if (!do_insert)
{
mov.read(_isequal, _lock);
aggiorna_saldi(saldo, mov, false);
protiva = head.get_long(MOV_PROTIVA);
}
- if (protiva <= 0)
- protiva = caus.reg().protocol()+1;
+ else
+ {
+ if (_nump_iva) // Reperisce l'ultimo numero di protocollo dal registro IVA
+ {
+ TRegistro ® = (TRegistro & )caus.reg();
+
+ reg.reread();
+ protiva = reg.protocol() + 1;
+ if (protiva <= 0)
+ {
+ _error = ultprot_error;
+ return _error;
+ }
+ }
+ else
+ protiva = doc.numero();
+ }
head.put(MOV_DATAREG, datareg);
head.put(MOV_DATACOMP, _movimento->curr().get(MOV_DATACOMP));
@@ -4478,17 +4491,21 @@ error_type TContabilizzazione::write_regolarizzazione(const TDocumento& doc, TMo
for (int ri = 0; ri < _movimento->iva_items(); ri++)
{
const TRectype& rmoviva = _movimento->iva(ri);
- const real imponibile = rmoviva.get(RMI_IMPONIBILE);
- const real imposta = rmoviva.get(RMI_IMPOSTA);
-
- TRectype& rmi = mov.iva(ri);
- rmi.put(RMI_IMPONIBILE, imponibile);
- rmi.put(RMI_IMPOSTA, imposta);
- rmi.put(RMI_CODIVA, rmoviva.get(RMI_CODIVA));
- TBill zio; caus.bill(2, zio);
- zio.put(rmi);
+ const bool revcharge = rmoviva.get(RMI_REVCHARGE);
- totdoc += imponibile + imposta; // Incrementa totdoc
+ if (revcharge)
+ {
+ const real imponibile = rmoviva.get(RMI_IMPONIBILE);
+ const real imposta = rmoviva.get(RMI_IMPOSTA);
+
+ TRectype& rmi = mov.iva(ri);
+ rmi.put(RMI_IMPONIBILE, imponibile);
+ rmi.put(RMI_IMPOSTA, imposta);
+ rmi.put(RMI_CODIVA, rmoviva.get(RMI_CODIVA));
+ TBill zio; caus.bill(2, zio);
+ zio.put(rmi);
+ totdoc += imponibile + imposta; // Incrementa totdoc
+ }
}
head.put(MOV_TOTDOC, totdoc); // Non usare DOC_TOTDOC! Unico modo per gestire correttamente fatture e note di credito
diff --git a/src/ve/velib05.cpp b/src/ve/velib05.cpp
index 0929c3a50..c54e7ef84 100755
--- a/src/ve/velib05.cpp
+++ b/src/ve/velib05.cpp
@@ -282,7 +282,7 @@ int TDocumentoEsteso::readat(TBaseisamfile& file, TRecnotype nrec, word lockop)
TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec)
: TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1),
- _conai(NULL), _tic(NULL), _split(NULL)
+ _conai(nullptr), _tic(nullptr), _split(nullptr)
{
// Inizializza i parametri di default
@@ -353,17 +353,36 @@ const TString & TDocumentoEsteso::tipo_doc_sdi() const
return tipo().tipo_doc_sdi();
}
+TDocumentoEsteso::TDocumentoEsteso(const TDocumento & d)
+ : TDocumento(d), _sum_filter(-1), _sum_selected(false),
+ _scadenze_current(-1), _conai(nullptr), _tic(nullptr), _split(nullptr)
+{
+}
+
+TDocumentoEsteso::TDocumentoEsteso(char provv, int anno, const char* codnum, long numdoc)
+ : TDocumento(provv, anno, codnum, numdoc), _sum_filter(-1), _sum_selected(false),
+ _scadenze_current(-1), _conai(nullptr), _tic(nullptr), _split(nullptr)
+{
+}
+
+TDocumentoEsteso::TDocumentoEsteso(const TDoc_key & key)
+ : TDocumento(key), _sum_filter(-1), _sum_selected(false),
+ _scadenze_current(-1), _conai(nullptr), _tic(nullptr), _split(nullptr)
+{
+}
+
TDocumentoEsteso::TDocumentoEsteso(const TRectype& rec, dec_parm & parm)
- : TDocumento(rec), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1),
- _conai(NULL), _tic(NULL), _split(NULL)
+ : TDocumento(rec), _sum_filter(-1), _sum_selected(false), _scadenze_current(-1),
+ _conai(nullptr), _tic(nullptr), _split(nullptr)
{
_parm = parm;
}
TDocumentoEsteso::TDocumentoEsteso()
- : TDocumento(), _sum_filter(-1), _sum_selected(FALSE), _scadenze_current(-1),
- _conai(NULL), _tic(NULL), _split(NULL)
-{ }
+ : TDocumento(), _sum_filter(-1), _sum_selected(false), _scadenze_current(-1),
+ _conai(nullptr), _tic(nullptr), _split(nullptr)
+{
+}
TDocumentoEsteso::~TDocumentoEsteso()
{
diff --git a/src/ve/velib05.h b/src/ve/velib05.h
index d761d905e..4193356a7 100755
--- a/src/ve/velib05.h
+++ b/src/ve/velib05.h
@@ -91,9 +91,9 @@ public:
// Funzioni per settare i parametri
void set_decimals(const dec_parm & parm) { _parm = parm ; }
// void set_condv(TCli_for * cli); // Cambia le condizioni di vendita
- TDocumentoEsteso(const TDocumento & d) : TDocumento(d) {};
- TDocumentoEsteso(char provv, int anno, const char* codnum, long numdoc) : TDocumento(provv, anno, codnum, numdoc) {};
- TDocumentoEsteso(const TDoc_key& key) : TDocumento(key) {};
+ TDocumentoEsteso(const TDocumento & d);
+ TDocumentoEsteso(char provv, int anno, const char* codnum, long numdoc);
+ TDocumentoEsteso(const TDoc_key& key);
TDocumentoEsteso (const TRectype & rec, dec_parm & parm) ;
TDocumentoEsteso (const TRectype & rec) ;
TDocumentoEsteso () ;
diff --git a/src/ve/velib06.cpp b/src/ve/velib06.cpp
index ab5931823..91f47961d 100755
--- a/src/ve/velib06.cpp
+++ b/src/ve/velib06.cpp
@@ -25,6 +25,7 @@
#include "../cg/cfban.h"
#include "../ca/cfcms.h"
+#include "../ca/commesse.h"
#include "condv.h"
#include "rcondv.h"
#include "sconti.h"
@@ -484,7 +485,8 @@ TDocumento_mask::~TDocumento_mask()
}
int TDocumento_mask::insert_anal_fields(TMask& m, int page, int lf, int& y,
- short& dlg, short& dlgd, bool required)
+ short& dlg, short& dlgd, bool required,
+ const short contsep_id)
{
const int h = ca_create_fields(m, page, lf, 2, y, dlg, dlgd);
@@ -512,14 +514,47 @@ int TDocumento_mask::insert_anal_fields(TMask& m, int page, int lf, int& y,
case LF_FASI : fieldname = DOC_FASCMS; break;
default : fieldname = DOC_CODCOSTO; break;
}
+
TFieldref* f = (TFieldref*)fld.field();
- f->set_name(fieldname);
-
- fld.check_type(required ? CHECK_REQUIRED : CHECK_NORMAL);
- TEdit_field& dfld = m.efield(dlgd+i);
+ f->set_name(fieldname);
+ fld.check_type(required ? CHECK_REQUIRED : CHECK_NORMAL);
+ if (logic == LF_COMMESSE)
+ {
+ bool contsep_fld_exist = contsep_id >= 0;
+
+ if (contsep_fld_exist)
+ contsep_fld_exist = main_mask ? m.id2pos(contsep_id) >= 0 : sfield(F_SHEET).mask().id2pos(contsep_id) >= 0;
+ if (contsep_fld_exist && main_app().has_module(NPAUT, CHK_DONGLE))
+ {
+ TBrowse * b = fld.browse();
+
+ if (b != nullptr)
+ {
+ TCursor * c = b->cursor();
+
+ if (c != nullptr)
+ {
+ TString filter = c->filter();
+ const bool add = filter.full();
+
+ if (add)
+ {
+ filter.insert("(");
+ filter << ")&&(";
+ }
+ filter << "(" << COMMESSE_CONTSEP << "==\"\")||(" << COMMESSE_CONTSEP << "==#" << (main_mask ? contsep_id : -contsep_id) << ")";
+ if (add)
+ filter << ")";
+ c->setfilter(filter);
+ }
+ }
+ }
+ }
+
+ TEdit_field& dfld = m.efield(dlgd+i);
+
dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output!
-
if (main_mask)
{
TSheet_field& sf = sfield(F_SHEET);
@@ -594,7 +629,7 @@ void TDocumento_mask::insert_anal_page()
else
{
const bool cms_req = false; // ca_in_testa && ini.get_bool("CmsRequired"); // Ora gestisco il REQUIRED da codcms_handler
- insert_anal_fields(*this, newpage, LF_COMMESSE, y, dlg, dlgd, cms_req);
+ insert_anal_fields(*this, newpage, LF_COMMESSE, y, dlg, dlgd, cms_req, F_CONTSEP);
}
set_field_handler(_cms_end, codcms_handler);
}
@@ -623,7 +658,7 @@ void TDocumento_mask::insert_anal_page()
if (use_fsc && fasinfo.parent() == LF_COMMESSE)
insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, true);
else
- insert_anal_fields(*this, newpage, LF_COMMESSE, y, dlg, dlgd, true);
+ insert_anal_fields(*this, newpage, LF_COMMESSE, y, dlg, dlgd, true, F_CONTSEP);
if (use_fsc && fasinfo.parent() <= 0)
insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, false);
add_button(dlg+1, newpage, TR("Generazione righe consegnate"), 2, y++, 32);
@@ -1715,7 +1750,7 @@ TVariable_mask* TDocumento_mask::riga_mask(int numriga)
insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false);
else
{
- insert_anal_fields(*m, page, LF_COMMESSE, y, dlg, dlgd, false);
+ insert_anal_fields(*m, page, LF_COMMESSE, y, dlg, dlgd, false, F_CONTSEP);
}
m->set_handler(_cms_end_sh, cms_mag_handler);
}
diff --git a/src/ve/velib06a.cpp b/src/ve/velib06a.cpp
index 0d348e2a8..80c7db390 100755
--- a/src/ve/velib06a.cpp
+++ b/src/ve/velib06a.cpp
@@ -596,6 +596,7 @@ HIDDEN real curr_fc = UNO;
bool iva_handler( TMask_field& f, KEY key )
{
TDocumento_mask & mask = (TDocumento_mask &) f.mask().get_sheet()->mask();
+ TMask & row_mask = f.mask();
if (key == 0 || (key == K_ENTER && f.empty()))
{
@@ -615,7 +616,6 @@ bool iva_handler( TMask_field& f, KEY key )
if (key == K_ENTER && /*f.focusdirty() &&*/ f.empty())
{
- TMask & row_mask = f.mask();
const int r = row_mask.get_sheet()->selected() + 1;
const TRiga_documento& riga = mask.doc()[r];
@@ -640,8 +640,20 @@ bool iva_handler( TMask_field& f, KEY key )
if (required)
return f.error_box(TR("Il codice IVA č obbligatorio."));
}
-
}
+ if (f.running_check(key))
+ {
+ TCodiceIVA i(f.get());
+
+ row_mask.set(FR_REVCHARGE, i.reverse_charge_attivo() ? "X" : "");
+ }
+ if (f.initial_check(key))
+ {
+ const int r = row_mask.get_sheet()->selected() + 1;
+ const TCausale & caus = cached_causale(mask.doc()[r].doc().tipo().causale());
+
+ f.mask().enable(FR_REVCHARGE, caus.reverse_charge_pubb());
+ }
if (key == K_ENTER)
{
TVariable_sheet_field * sf = (TVariable_sheet_field *)f.mask().get_sheet();
diff --git a/src/ve/verig.h b/src/ve/verig.h
index c13ab00e3..624d08f78 100755
--- a/src/ve/verig.h
+++ b/src/ve/verig.h
@@ -131,8 +131,10 @@
#define FR_PCON10 186
#define FR_CMAX (FR_PCON10-FR_CCON01+1)/2
+#define FR_REVCHARGE 187
+
// Ultimo campo fittizio
-#define FR_END 187
+#define FR_END 188
#define MAX_COLUMNS FR_END-FR_LORDO
#define FR_DESMAG 270
diff --git a/src/ve/verig.uml b/src/ve/verig.uml
index f0766221e..c828eef92 100755
--- a/src/ve/verig.uml
+++ b/src/ve/verig.uml
@@ -1339,8 +1339,8 @@ ENDIF
INPUT S0 FR_DESIVA
DISPLAY "Descrizione@50" S0
DISPLAY "Codice@20" CODTAB
- OUTPUT FR_CODIVA CODTAB
- OUTPUT FR_DESIVA S0
+ OUTPUT FR_CODIVA CODTAB
+ OUTPUT FR_DESIVA S0
IFDEF(FL_DESIVA)
FLAGS FL_DESIVA
ENDIF
@@ -1350,9 +1350,28 @@ ENDIF
END
ENDIF
+IFDEF(X_CODIVA)
+ DEFINE Y_REVCHARGE Y_CODIVA+1
+ DEFINE X_TIPODET X_CODIVA+20
+ENDIF
+
+BOOLEAN FR_REVCHARGE
+BEGIN
+IFDEF(X_CODIVA)
+ PROMPT X_CODIVA Y_REVCHARGE "Reverse charge"
+ ELSE
+ PROMPT 2 16 "Reverse charge"
+ENDIF
+ FIELD REVCHARGE
+END
+
STRING FR_TIPODET 1
BEGIN
- PROMPT 2 16 "Indetraib. "
+IFDEF(X_CODIVA)
+ PROMPT X_TIPODET Y_REVCHARGE "Indetraib. "
+ELSE
+ PROMPT 20 16 "Indetraib. "
+ENDIF
USE %DET
INPUT CODTAB FR_TIPODET
DISPLAY "Codice" CODTAB
@@ -1360,9 +1379,9 @@ BEGIN
DISPLAY "Descrizione@50" S0
OUTPUT FR_TIPODET CODTAB
CHECKTYPE NORMAL
+ FIELD TIPODET
FLAGS "U"
END
-
ENDIF
IFDEF(FLD_ADDIVA)
diff --git a/src/xvaga/xvt.h b/src/xvaga/xvt.h
index 938a894c9..df04a8436 100755
--- a/src/xvaga/xvt.h
+++ b/src/xvaga/xvt.h
@@ -520,6 +520,7 @@ XVTDLL BOOLEAN xvt_sql_driver(XVT_SQLDB handle, char* str, int max_size);
XVTDLL ULONG xvt_sql_execute(XVT_SQLDB handle, const char* sql, ODBC_CALLBACK cb, void* jolly);
XVTDLL SLIST xvt_sql_list_fields(XVT_SQLDB handle, const char* table);
XVTDLL SLIST xvt_sql_list_tables(XVT_SQLDB handle);
+XVTDLL const char * xvt_sql_field_type(XVT_SQLDB handle, const char* table, const char* field);
XVTDLL XVT_SQLDB xvt_sql_open(const char* dsn, const char* usr, const char* pwd, const char* dir);
XVTDLL BOOLEAN xvt_sql_rollback(XVT_SQLDB handle);
XVTDLL BOOLEAN xvt_sql_table_exists(XVT_SQLDB handle, const char* name);
diff --git a/src/xvaga/xvt_sql.cpp b/src/xvaga/xvt_sql.cpp
index 82fcb2beb..3477e8053 100644
--- a/src/xvaga/xvt_sql.cpp
+++ b/src/xvaga/xvt_sql.cpp
@@ -12,6 +12,7 @@ public:
virtual ULONG Execute(const char* sql, ODBC_CALLBACK cb, void* jolly) = 0;
virtual SLIST ListFields(const char* table) const = 0;
virtual SLIST ListTables() const = 0;
+ virtual wxString FindField(const char* strTable, const char* strField) const = 0;
virtual bool TableExists(const char* name) const;
virtual bool Begin() const { return false; }
@@ -46,6 +47,8 @@ protected:
virtual ULONG Execute(const char* sql, ODBC_CALLBACK cb, void* jolly);
virtual SLIST ListFields(const char* table) const;
virtual SLIST ListTables() const;
+ virtual wxString FindField(const char* strTable, const char* strField) const;
+
virtual bool TableExists(const char* name) const;
public:
@@ -245,6 +248,32 @@ SLIST XVT_SQLDB_SQLite3::ListFields(const char* strTable) const
return list;
}
+wxString XVT_SQLDB_SQLite3::FindField(const char* strTable, const char* strField) const
+{
+ wxString strType;
+
+ if (TableExists(strTable))
+ {
+ wxString strQuery; strQuery << "PRAGMA table_info(" << (const char*)strTable << ");";
+ try
+ {
+ wxSQLite3ResultSet rs = m_pDB->ExecuteQuery(strQuery);
+ while (rs.NextRow())
+ {
+ const wxString strFieldFound = rs.GetAsString(1);
+
+ if (strFieldFound == strField)
+ strType = rs.GetAsString(2);
+ }
+ }
+ catch (wxSQLite3Exception& e)
+ {
+ xvt_dm_post_error(e.GetMessage() + "\n" + strQuery);
+ }
+ }
+ return strType;
+}
+
bool XVT_SQLDB_SQLite3::TableExists(const char* name) const
{
return m_pDB != NULL && name && *name && m_pDB->TableExists(name);
@@ -349,6 +378,19 @@ SLIST xvt_sql_list_tables(XVT_SQLDB handle)
return list;
}
+XVTDLL const char * xvt_sql_field_type(XVT_SQLDB handle, const char* table, const char* field)
+{
+ XVT_SQLDataBase* db = (XVT_SQLDataBase*)handle;
+ static wxString strType;
+
+ strType = "";
+ if (db != NULL && db->IsOk())
+ strType = db->FindField(table, field);
+
+ return strType;
+}
+
+
BOOLEAN xvt_sql_table_exists(XVT_SQLDB handle, const char* name)
{
BOOLEAN yes = FALSE;