campo-sirio/ve/vesirio1.cpp
alex 9e26e4d527 Patch level : 4.0 911
Files correlati     :
Ricompilazione Demo : [ ]
Commento           :

Riportata la versione 3.2 1010


git-svn-id: svn://10.65.10.50/trunk@16373 c028cbd2-c16b-5b4b-a496-9718f37d4682
2008-03-26 11:24:36 +00:00

770 lines
28 KiB
C++
Executable File
Raw Blame History

#include <applicat.h>
#include <automask.h>
#include <config.h>
#include <isam.h>
#include <progind.h>
#include <recarray.h>
#include <relation.h>
#include "vesirio.h"
#include "vesirioa.h"
#include "doc.h"
#include "rdoc.h"
#include "mov.h"
#include "rmov.h"
#include "partite.h"
#include "rmoviva.h"
#include "velib.h"
//=====MASCHERA============================================================//
class TToas400_mask : public TAutomask
{
protected:
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TToas400_mask();
virtual ~TToas400_mask() {};
};
TToas400_mask::TToas400_mask() :TAutomask ("vesirioa") {}
bool TToas400_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_BOLLE :
case F_FATTURE :
case F_MOVCONT :
if (e == fe_close)
{
if (!get_bool(F_BOLLE) && !get_bool(F_FATTURE) && !get_bool(F_MOVCONT)) //deve essere selezionata almeno 1 situaz.
return error_box("Selezionare almeno uno dei tipi documento da esportare");
}
break;
case F_DATA_TRASF :
if (e == fe_close)
{
if ((get_date(F_DATA_TRASF) < get_date(F_DATA_ULT_TRASF_B))&&(get_bool(F_BOLLE)))
return error_box("La data di trasferimento bolle non e' congruente");
if ((get_date(F_DATA_TRASF) < get_date(F_DATA_ULT_TRASF_F))&&(get_bool(F_FATTURE)))
return error_box("La data di trasferimento fatture non e' congruente");
if ((get_date(F_DATA_TRASF) < get_date(F_DATA_ULT_TRASF_M))&&(get_bool(F_MOVCONT)))
return error_box("La data di trasferimento movimenti contabili non e' congruente");
}
break;
default: break;
}
return TRUE;
}
//=====APPLICAZIONE====================================================//
class TToas400 : public TSkeleton_application
{
TToas400_mask* _mask;
TDate _dataultb, _dataultf, _dataultm, _datacurr;
TString _trrpath;
protected:
void copia_rigadoc(TRectype& recdest, const TRectype& recsource, const TRectype& rectestata) const;
bool genera_righedoc(const TString& path, char tipo);
void copia_documento(TRectype& recdest, const TRectype& recsource, const TRectype& recriga) const;
bool genera_documenti(const TString& path, char tipo);
void copia_rigamov(TRectype& recdest, const TRectype& recsource) const;
bool genera_righemov(const TString& path);
void copia_rigaiva(TRectype& recdest, const TRectype& recsource) const;
bool genera_righeiva(const TString& path);
void copia_movimento(TRectype& recdest, const TRectype& recsource, const TRectype& recriga, const TRectype& recpartita) const;
bool genera_movimenti(const TString& path);
bool genera_bolle(const TString& path);
bool genera_fatture(const TString& path);
bool genera_movcont(const TString& path);
void azzera_campi(TRectype& rectozero) const;
int separa_sconti(const TString& sconto, TToken_string& sconti4) const;
void ini2mask();
public:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
};
bool TToas400::create()
{
open_files(LF_DOC, 0);
_mask = new TToas400_mask;
return TSkeleton_application::create();
}
bool TToas400::destroy()
{
delete _mask;
return TSkeleton_application::destroy();
}
void TToas400::ini2mask()
{
//carica i parametri di trasferimento dal ditta.ini
TConfig fileini(CONFIG_DITTA, "Sirio");
_trrpath = fileini.get("PATH");
_dataultb = fileini.get("DATAULTB");
_dataultf = fileini.get("DATAULTF");
_dataultm = fileini.get("DATAULTM");
_mask->set(F_PATH, _trrpath);
TToken_string ultimo;
_mask->set(F_DATA_ULT_TRASF_B, _dataultb);
ultimo = fileini.get("bolle", NULL, -1, "2004|B01");
_mask->set(F_NUM_B, ultimo.get(1));
_mask->set(F_DATA_ULT_TRASF_F, _dataultf);
ultimo = fileini.get("fatt", NULL, -1, "2004|FAA");
_mask->set(F_NUM_F, ultimo.get(1));
_mask->set(F_DATA_ULT_TRASF_M, _dataultm);
}
//_________________________________________________________________________________________________________________________
//DOCUMENTI DI VENDITA
//metodo per la copia delle righe documenti (bolle/fatture) sul file .dbf di destinazione
void TToas400::copia_rigadoc(TRectype& recdest, const TRectype& recsource, const TRectype& rectestata) const
{
azzera_campi(recdest); //mette 0 in tutti i campi numerici (compresi quelli che non saranno riempiti)
TString4 coddep = recsource.get(RDOC_CODMAG).left(3);
recdest.put("I6CDEP", coddep); //cod.deposito
recdest.put("I6CCLI",rectestata.get(DOC_CODCF)); //cod.cliente (da testata)
recdest.put("I6TDO1",rectestata.get(DOC_TIPODOC)); //tipodoc (da testata)
recdest.put("I6CNMV",rectestata.get(DOC_CODNUM)); //cod.num.doc (da testata)
recdest.put("I6NDOC",recsource.get(RDOC_NDOC)); //num.doc (=testata)
recdest.put("I6NRIG",recsource.get(RDOC_NRIGA)); //num.riga
recdest.put("I6TRIG", "1"); //tiporiga 1 (sono solo riga merce)
recdest.put("I6CART",recsource.get(RDOC_CODARTMAG)); //cod.art
recdest.put("I6CLIN",recsource.get(RDOC_LINEA)); //cod.linea (x MRP?)
recdest.put("I6DCO1",recsource.get(RDOC_DESCR).left(35)); //descriz.1
recdest.put("I6DCO2",recsource.get(RDOC_DESCR).mid(35)); //descriz.2
recdest.put("I6CUMI",recsource.get(RDOC_UMQTA)); //unit<69> di misura
recdest.put("I6CIVA",recsource.get(RDOC_CODIVA)); //cod.iva
real qta = recsource.get(RDOC_QTA);
if (qta.is_zero())
qta = 9999999999999.0;
recdest.put("I6QARM",qta); //quantit<69> (9999999999999 se 0; mah?)
real prezzoven = recsource.get(RDOC_PREZZO);
if (prezzoven.is_zero())
prezzoven = 9999999999999.0;
recdest.put("I6LUNI",prezzoven); //prezzo vendita unitario lordo(9999999999999 se 0; mah?)
const TString& sconto = recsource.get(RDOC_SCONTO);
if (sconto.not_empty()) //%sconto (achtung! x as400 <20> % x eurocampo una espressione)
{
TToken_string sconti4;
int s = separa_sconti(sconto, sconti4); //metodo che separa l'espressione di sconto
char campo[7] = "I6PSR1";
for (int i = 0; i < s; i++)
{
campo[5] = '1'+i;
recdest.put(campo, sconti4.get(i)); //mette nei campi i valori degli sconti
}
}
recdest.put("I6PPR1",recsource.get(RDOC_PERCPROV)); //%provvigione 1
TString area;
area << " " << "000000000000000000";
const TRectype& tiporiga = cache().get("%TRI", recsource.get(RDOC_TIPORIGA));
TString8 codriga;
switch (tiporiga.get_char("S7"))
{
case 'C': codriga = "SM"; break;
case 'O': codriga = "OG"; break;
default: codriga = " "; break;
}
area << codriga;
recdest.put("I6AREA", area); //campo personalizzabile: ci va una strana stringa...mah?
}
//metodo che "fraziona" la formula di sconto riga nei suoi componenti; se ci sono 4 o + numeri -> mette nel quarto numero
//lo sconto complessivo di quelli dal quarto in avanti
int TToas400::separa_sconti(const TString& sconto, TToken_string& sconti4) const
{
sconti4.cut(0);
// Elimina gli spazi molesti sulla stringa dello sconto (ovviamente copiata, X' l'originale non si tocca)
TString sconto_orig = sconto;
sconto_orig.strip_spaces( );
//aggiunge un segno iniziale + qualora non esistesse alcun segno
if (sconto_orig[0] != '+' && sconto_orig[0] != '-')
sconto_orig.insert("+");
//assegna agli elementi della token_string i valori numerici ed i segni
int numsconti = 0;
int i;
for (i=0; sconto_orig[i]; i++)
{
//se il carattere <20> un segno -> devo cambiare elemento della token string (mettendo '|' ma non nel caso del primo segno)
if (sconto_orig[i] == '+' || sconto_orig[i] == '-')
{
if (numsconti++ > 0) //incrementa numsconti di 1
sconti4 << '|';
if (numsconti > 3)
break;
}
//se numero -> scrive il carattere sulla token_string..
sconti4 << sconto_orig[i];
}
//adesso piazza nel quarto elemento i valori degli elementi dal quarto in avanti
const TString oltre = sconto_orig.mid(i);
if (oltre.not_empty())
{
TString pipo;
real psconto;
scontoexpr2perc(oltre, 0, pipo, psconto);
psconto = 100 - 100*psconto; //lo mette in percentuale
psconto.round(2); //arrotonda al secondo decimale
sconti4.add(psconto.string(),3); //aggiunge psconto alla posizione 4
}
return sconti4.items();
}
// tipo -> B=bolle, F=fatture
bool TToas400::genera_righedoc(const TString& path, char t)
{
//Crea il file vuoto delle righe documenti
const char* tipor = t == 'B' ? "rbolle" : "rfatture";
TFilename trrrig = path; trrrig.add(tipor); trrrig.ext("trr");
TFilename siriorig = path; siriorig.add(tipor); siriorig.ext("dbf");
TExternisamfile righe(siriorig, trrrig);
righe.zap();
//lettura da prassid.ini dell'ultima bolla/fattura trasferita
//ATTENZIONE!La numerazione documenti <20> unica per bolle e fatture rispettivamente! Ovvero non <20> possibile trasferire 2 tipi
//di fatture con codice diverso (o 2 tipi di bolle con codice diverso)
TConfig fileini(CONFIG_DITTA, "Sirio");
TToken_string ultimo = fileini.get(tipor+1, NULL, -1, t == 'B' ? "2004|B01" : "2004|FAA");
//scandisce il file doc.dbf alla ricerca dei documenti non ancora esportati...
TRelation rel(LF_RIGHEDOC);
TString expr;
expr << "CODNUM==CODNUM|ANNO==ANNO|NDOC==NDOC|PROVV==PROVV" ;
rel.add(LF_DOC, expr); //aggiunge alla relazione (in origine sulle righe) il file delle testate x' necessita di alcuni campi di questo file
//..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
TRectype& recsource = rel.curr();
recsource.put(RDOC_PROVV, "D");
recsource.put(RDOC_ANNO, ultimo.get(0));
recsource.put(RDOC_CODNUM, ultimo.get(1));
recsource.put(RDOC_NDOC, ultimo.get_long(2)+1);
//..quindi si crea il filtro ed il cursore per scandire il file delle righe documento..
TString filtro;
filtro << "(CODNUM==\"" << ultimo.get(1) << "\")";
_datacurr = _mask->get_date(F_DATA_TRASF);
filtro << "&&(ANSI(33->DATADOC)<=" << _datacurr.date2ansi() << ")";
TCursor cur(&rel, "", 1, &recsource);
cur.setfilter(filtro, true);
const long items = cur.items();
cur.freeze();
TString caption; caption << "Elaborazione " << tipor << "...";
TProgind pi(items, caption, TRUE, TRUE);
//..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo
TRectype& recdest = righe.curr();
const TRectype& testata = rel.curr(LF_DOC);
int nriga = 1;
long ultimodoc = 0;
for (cur = 0L; cur.pos() < items; ++cur)
{
pi.addstatus(1);
if (pi.iscancelled())
break;
long currdoc = recsource.get_long(RDOC_NDOC);
if (currdoc != ultimodoc)
{
ultimodoc = currdoc;
nriga = 1;
}
const TString& codartmag = recsource.get(RDOC_CODARTMAG);
if (codartmag.not_empty()) //vogliamo solo righe merce!
{
recsource.put(RDOC_NRIGA, nriga++); //incrementa il numero riga se rigamerce
copia_rigadoc(recdest, recsource, testata);
const int err = righe.write();
if (err != NOERR)
return error_box("Errore %d di registrazione %s", err, tipor);
}
}
return !pi.iscancelled();
}
void TToas400::copia_documento(TRectype& recdest, const TRectype& recsource, const TRectype& recriga) const
{
azzera_campi (recdest); //mette 0 in tutti i campi numerici (compresi quelli che non saranno riempiti)
TString4 coddep = recriga.get(RDOC_CODMAG).left(3);
recdest.put("I5CDEP", coddep); //cod. deposito (viene preso = a quello della prima riga! mah!?)
recdest.put("I5CCLI", recsource.get(DOC_CODCF)); //cod.cliente
recdest.put("I5TDO1", recsource.get(DOC_TIPODOC)); //tipo doc. appl.esterno
recdest.put("I5CNMV", recsource.get(DOC_CODNUM)); //cod.num.appl.esterno
recdest.put("I5UDOC", recsource.get_date(DOC_DATADOC).string(ANSI)); //data doc.appl.esterno
recdest.put("I5NDOC", recsource.get(DOC_NDOC)); //num.doc.appl.esterno
recdest.put("I5CPAG", recsource.get(DOC_CODPAG)); //cod.condizione pagamento
TString16 codabicab = recsource.get(DOC_CODABIA);
codabicab << recsource.get(DOC_CODCABA);
recdest.put("I5CABI", codabicab); //codice banca abi cab
recdest.put("I5CLIG", recsource.get(DOC_CODLIN)); //cod.lingua
recdest.put("I5CPOR", recsource.get(DOC_CODPORTO)); //cod.porto
recdest.put("I5CMEZ", recsource.get(DOC_CODSPMEZZO)); //cod.mezzo
recdest.put("I5CVE1", recsource.get(DOC_CODVETT1)); //cod.vett.1
recdest.put("I5CVE2", recsource.get(DOC_CODVETT2)); //cod.vett.2
recdest.put("I5CVE3", recsource.get(DOC_CODVETT3)); //cod.vett.3
recdest.put("I5CZON", recsource.get(DOC_ZONA)); //cod.zona
const TRectype& tpdoc = cache().get("%TIP", recsource.get(DOC_TIPODOC));
recdest.put("I5CCVE", tpdoc.get("S6")); //cod.causale di vendita
recdest.put("I5CCMO", tpdoc.get("S9")); //cod.caus.magazzino su tabella tipodocumenti batbtip
recdest.put("I5CVAL", recsource.get(DOC_CODVAL)); //cod.valuta
const bool is_controeuro = recsource.get_bool(DOC_CONTROEURO); //valore cambio
real cambio = recsource.get_real(DOC_CAMBIO);
if (!is_controeuro && cambio > ZERO)
cambio = 1936.27/cambio;
recdest.put("I5ICAM", cambio);
recdest.put("I5CAG1", recsource.get(DOC_CODAG)); //cod.agente
recdest.put("I5CASP", recsource.get(DOC_ASPBENI1)); //cod. aspetto beni
recdest.put("I5PSCA", recsource.get(DOC_SCONTOPERC)); //sconto testata documento
recdest.put("I5NCLP", recsource.get(DOC_NCOLLI)); //num.colli
real pnetto = recsource.get_real(DOC_PNETTO);
recdest.put("I5QPNE", pnetto); //peso netto merce
real plordo = pnetto;
const TString4 umpnetto = recsource.get(DOC_UMPNETTO); //peso lordo (se non ha un'unica unit<69> di misura tra pnetto e tara
const TString4 umtara = recsource.get(DOC_UMTARA); //fa plordo = pnetto
if (umpnetto == umtara)
plordo += recsource.get_real(DOC_TARA);
recdest.put("I5QPLO", plordo);
}
// tipo -> B=bolle, F=fatture
bool TToas400::genera_documenti(const TString& path, char t)
{
const char* tipo = t == 'B' ? "bolle" : "fatture";
//crea il file delle testate delle bolle utilizzando bolle.trr come tracciato record
TFilename siriodoc = path; siriodoc.add(tipo); siriodoc.ext("dbf");
TFilename trrdoc = path; trrdoc.add(tipo); trrdoc.ext("trr");
TExternisamfile documenti(siriodoc, trrdoc);
documenti.zap();
//lettura da prassid.ini dell'ultima bolla/fattura trasferita (se non la trova, di default mette B01|2002|D|0)
TConfig fileini(CONFIG_DITTA, "Sirio");
TToken_string ultimo = fileini.get(tipo, NULL, -1, t == 'B' ? "2004|B01" : "2004|FAA");
//scandisce il file doc.dbf alla ricerca dei documenti non ancora esportati...
TRelation rel(LF_DOC);
TString expr;
expr << "PROVV==PROVV|ANNO==ANNO|CODNUM==CODNUM|NDOC==NDOC";
rel.add(LF_RIGHEDOC, expr); //aggiunge alla relazione (in origine sulle testate) il file delle righe x' necessita di alcuni campi di questo file
//..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
TRectype& recsource = rel.curr();
recsource.put(DOC_PROVV, "D");
recsource.put(DOC_ANNO, ultimo.get(0));
recsource.put(DOC_CODNUM, ultimo.get(1));
recsource.put(DOC_NDOC, ultimo.get_long(2)+1);
//..quindi si crea il filtro ed il cursore per scandire il file delle testate documento..
TString filtro;
filtro << "CODNUM==\"" << ultimo.get(1) << "\"";
_datacurr = _mask->get_date(F_DATA_TRASF);
filtro << "&&(ANSI(DATADOC)<=" << _datacurr.date2ansi() << ")";
TCursor cur(&rel, filtro, 1, &recsource);
const long items = cur.items();
cur.freeze();
TString caption; caption << "Elaborazione " << tipo << "...";
TProgind pi(items, caption, TRUE, TRUE);
//..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo
TRectype& recdest = documenti.curr();
const TRectype& righe = rel.curr(LF_RIGHEDOC);
for (cur = 0; cur.pos() < items; ++cur)
{
pi.addstatus(1);
if (pi.iscancelled())
break;
copia_documento(recdest, recsource, righe); //copia i files delle testate
const int err = documenti.write();
if (err != NOERR)
return error_box("Errore %d di registrazione %s", err, tipo);
// Calcola identificatore ultimo record trasferito
ultimo = recsource.get(DOC_ANNO);
ultimo.add(recsource.get(DOC_CODNUM));
ultimo.add(recsource.get(DOC_NDOC));
}
const bool ok = !pi.iscancelled();
if (ok)
{
fileini.set(tipo, ultimo);
TString16 tipodata; tipodata << "DATAULT" << t;
fileini.set(tipodata, _datacurr);
}
return ok;
}
//___________________________________________________________________________________________________________________________
//MOVIMENTI CONTABILI
bool TToas400::genera_righemov(const TString& path)
{
//crea il file vuoto delle righe movimenti utilizzando rmovc.trr come tracciato record
TFilename siriomov = path; siriomov.add("rmovc"); siriomov.ext("dbf");
TFilename trrmov = path; trrmov.add("rmovc"); trrmov.ext("trr");
TExternisamfile righe(siriomov, trrmov);
righe.zap();
//lettura da prassid.ini dell'ultimo movimento trasferito
TConfig fileini(CONFIG_DITTA, "Sirio");
TToken_string ultimo = fileini.get("Movimenti");
//scandisce il file rmov.dbf alla ricerca delle righe movimento non ancora esportate...
TRelation rel(LF_RMOV);
//..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
TRectype& recsource = rel.curr();
recsource.put(RMV_NUMREG, ultimo.get_long(0));
recsource.put(RMV_NUMRIG, ultimo.get(1));
//..quindi si crea il filtro ed il cursore per scandire il file delle righe documento..
TString filtro;
filtro << "NUMREG==\"" << ultimo.get(0) << "\"";
TCursor cur(&rel, "", 1, &recsource);
const long items = cur.items();
cur.freeze();
TString caption; caption << "Elaborazione righe movimenti...";
TProgind pi(items, caption, TRUE, TRUE);
//..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo
TRectype& recdest = righe.curr();
const TRectype& testata = rel.curr(LF_MOV);
int nriga = 1;
long ultimomov = 0;
for (cur = 0L; cur.pos() < items; ++cur)
{
pi.addstatus(1);
if (pi.iscancelled())
break;
long currmov = recsource.get_long(RMV_NUMREG);
if (currmov != ultimomov)
{
ultimomov = currmov;
nriga = 1;
}
// const TString& tipocausale = recsource.get(RMOV_);
// if (tipocausale == ) //vogliamo solo righe pagamento!
{
recsource.put(RMV_NUMRIG, nriga++); //incrementa il numero riga se rigapagamento
copia_rigamov(recdest, recsource);
const int err = righe.write();
if (err != NOERR)
return error_box("Errore %d di registrazione righe movimenti", err);
}
}
const bool ok = !pi.iscancelled();
return ok;
}
void TToas400::copia_rigamov(TRectype& recdest, const TRectype& recsource) const
{
recdest.zero();
}
/* Molto probabilmente inutile
void TToas400::copia_rigaiva(TRectype& recdest, const TRectype& recsource) const
{
recdest.zero();
}
bool TToas400::genera_righeiva(const TString& path)
{
//crea il file delle testate delle bolle utilizzando bolle.trr come tracciato record
TFilename siriomov = path; siriomov.add("rmoviva"); siriomov.ext("dbf");
TFilename trrmov = path; trrmov.add("rmoviva"); trrmov.ext("trr");
TExternisamfile movimenti(siriomov, trrmov);
movimenti.zap();
//lettura da prassid.ini dell'ultima bolla trasferita (se non la trova, di default mette B01|2002|D|0)
TConfig fileini(CONFIG_DITTA, "Sirio");
TToken_string ultimo = fileini.get("Movimenti");
//scandisce il file doc.dbf alla ricerca dei documenti non ancora esportati...
TRelation rel(LF_RMOVIVA);
//..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
TRectype& recsource = rel.curr();
recsource.put(MOV_NUMREG, ultimo.get(0));
TCursor cur(&rel, "", 1, &recsource);
const long items = cur.items();
cur.freeze();
TString caption; caption << "Elaborazione righe IVA...";
TProgind pi(items, caption, TRUE, TRUE);
//..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo
TRectype& recdest = movimenti.curr();
for (cur = 0; cur.pos() < items; ++cur)
{
pi.addstatus(1);
if (pi.iscancelled())
break;
copia_rigaiva(recdest, recsource);
const int err = movimenti.write();
if (err != NOERR)
return error_box("Errore %d di registrazione righe iva", err);
}
const bool ok = !pi.iscancelled();
return ok;
}
*/
bool TToas400::genera_movimenti(const TString& path)
{
//crea il file delle testate dei movimenti contabili di pagamento utilizzando movc.trr come tracciato record
TFilename siriomov = path; siriomov.add("movc"); siriomov.ext("dbf");
TFilename trrmov = path; trrmov.add("movc"); trrmov.ext("trr");
TExternisamfile movimenti(siriomov, trrmov);
movimenti.zap();
//lettura da prassid.ini dell'ultimo movimento trasferito (se non lo trova, di default mette 1|MOV
TConfig fileini(CONFIG_DITTA, "Sirio");
TToken_string ultimo = fileini.get("Movimenti", NULL, -1, "0");
//scandisce il file mov.dbf alla ricerca dei movimenti non ancora esportati...
TRelation rel(LF_MOV);
//aggiunge alla relazione il file delle righemov e quello delle partite (gli servono per alcuni campi)
rel.add(LF_RMOV, "NUMREG==NUMREG");
rel.add(LF_PARTITE, "NUMREG==NUMREG", 2);
//..intanto si memorizza il record di partenza, che <20> quello successivo all'ultimo trasferito..
TRectype& recsource = rel.curr();
recsource.put(MOV_NUMREG, ultimo.get_long(0));
//..quindi si crea il filtro ed il cursore per scandire il file delle testate movimenti..
TString filtro;
filtro << "NUMREG==\"" << ultimo.get(0) << "\"";
TCursor cur(&rel, filtro, 1, &recsource);
const long items = cur.items();
cur.freeze();
TString caption; caption << "Elaborazione movimenti...";
TProgind pi(items, caption, TRUE, TRUE);
//..prepara i record di origine e destinazione e procede al trasferimanto dati campo per campo
TRectype& recdest = movimenti.curr();
const TRectype& righe = rel.curr(LF_RMOV);
const TRectype& partite = rel.curr(LF_PARTITE);
for (cur = 0; cur.pos() < items; ++cur)
{
pi.addstatus(1);
if (pi.iscancelled())
break;
copia_movimento(recdest, recsource, righe, partite);
const int err = movimenti.write();
if (err != NOERR)
return error_box("Errore %d di registrazione movimenti", err);
// Calcola identificatore ultimo record trasferito
ultimo = recsource.get(MOV_NUMREG);
}
const bool ok = !pi.iscancelled();
if (ok)
{
fileini.set("Movimenti", ultimo);
fileini.set("DATAULTM", _datacurr);
}
return ok;
}
void TToas400::copia_movimento(TRectype& recdest, const TRectype& recsource, const TRectype& recriga, const TRectype& recpartita) const
{
azzera_campi (recdest); //mette 0 in tutti i campi numerici (compresi quelli che non saranno riempiti)
recdest.put("CMTMCO", "Z"); //misterioso campo in cui va scritta Z; <20> il campo Zorro?
recdest.put("CMUREG", recsource.get_date(MOV_DATAREG).string(ANSI)); //data registraz. contabile (data competenza) (in formato string)
recdest.put("CMNPRO", recsource.get(MOV_NUMREG)); //numero registraz. contabile (numero operazione)
recdest.put("CMUDOC", recsource.get_date(MOV_DATADOC).string(ANSI)); //data documento
recdest.put("CMNDCM", recsource.get(MOV_NUMDOC)); //numero documento
recdest.put("CMFADA", recsource.get(RMV_SEZIONE)); //flag mov dare avere (preso dalla prima rigamov)
recdest.put("CMITOD", recsource.get(MOV_TOTDOC)); //importo in valuta di bilancio (totale documento)
TString16 codcli;
codcli << "C " << recsource.get(MOV_CODCF);
recdest.put("CMCPIA", codcli); //codice cliente
TDate data = recsource.get_date(MOV_DATADOC);
TString8 dataok = data.string(ANSI);
dataok.cut(6);
recdest.put("CMUAMR", dataok); //data documento in formato YYYYMM per pareggio con fattura
recdest.put("CMNRIP", recsource.get(MOV_NUMDOC)); //num.doc. fattura per pareggio con fattura (=CMNDCM)
recdest.put("CMTCAU", "P"); //tipo causale movimento:solo Pagamenti (filtro in genera movimenti)
// recdest.put("CMTEFF", recsource.get(MOV_)); //tipo del pagamento
// recdest.put("CMUSCA", recsource.get(MOV_)); //data scadenza
recdest.put("CMCVAL", recsource.get(MOV_CODVAL)); //codice valuta estera
recdest.put("CMICAM", recsource.get(MOV_CAMBIO)); //cambio
recdest.put("CMITOV", recsource.get(MOV_TOTDOCVAL)); //totale doc in valuta
recdest.put("CMDMO1", recsource.get(MOV_DESCR).left(25)); //prima descrizione
recdest.put("CMDMO2", recsource.get(MOV_DESCR).mid(25)); //seconda descrizione
recdest.put("CMUREB", recsource.get_date(MOV_DATACOMP).string(ANSI)); //data di registrazione
}
//___________________________________________________________________________________________________________________________
//GENERALE
void TToas400::azzera_campi(TRectype& rectozero) const
{
rectozero.zero(); //svuota i campi
int numfields = rectozero.items();
for (int i = 0 ; i < numfields; i++)
{
const char* fieldname = rectozero.fieldname(i);
switch (rectozero.type(fieldname))
{
case _intfld:
case _longfld:
case _realfld:
case _datefld:
case _intzerofld:
case _longzerofld:
rectozero.put(fieldname, "0");
break;
default: break;
}
}
}
bool TToas400::genera_bolle(const TString& path)
{
bool ok = genera_righedoc(path, 'B');
if (ok)
ok = genera_documenti(path, 'B');
return ok;
}
bool TToas400::genera_fatture(const TString& path)
{
bool ok = genera_righedoc(path, 'F');
if (ok)
ok = genera_documenti(path, 'F');
return ok;
}
bool TToas400::genera_movcont(const TString& path)
{
bool ok = genera_righemov(path);
/* Molto probabilmente inutile
if (ok)
ok = genera_righeiva(path);
*/
if (ok)
ok = genera_movimenti(path);
return ok;
}
void TToas400::main_loop()
{
// Prececchiamo tutto
_mask->set(F_BOLLE,"X");
_mask->set(F_FATTURE,"X");
// _mask->set(F_MOVCONT,"X"); da accendere quando ci sara' il tracciato dei movimenti
while (true)
{
ini2mask(); //inizializza la maschera con i parametri di configurazione
if (_mask->run() != K_ENTER)
break;
const TString& path = _mask->get(F_PATH);
bool ok = true;
if (ok && _mask->get_bool(F_BOLLE))
ok = genera_bolle(path);
if (ok && _mask->get_bool(F_FATTURE))
ok = genera_fatture(path);
if (ok && _mask->get_bool(F_MOVCONT))
ok = genera_movcont(path);
if (ok) //se almeno uno dei trasferimenti e' andato a buon fine, registra il PATH sul ditta.ini
{
_trrpath = _mask->get(F_PATH);
TConfig fileini(CONFIG_DITTA, "Sirio");
fileini.set("PATH", _trrpath);
}
}
}
//===================================================================//
int vesirio1(int argc, char* argv[])
{
TToas400 a;
a.run(argc,argv,TR("Esportazione documenti ad AS400"));
return 0;
}