Patch level : 10.0
Files correlati : Ricompilazione Demo : [ ] Commento : Programma di generazione automatica delle bolle di consegna git-svn-id: svn://10.65.10.50/trunk@17403 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
fd0752be16
commit
4221dcaea1
522
lv/lv2400.cpp
Executable file
522
lv/lv2400.cpp
Executable file
@ -0,0 +1,522 @@
|
||||
#include <applicat.h>
|
||||
#include <automask.h>
|
||||
#include <confapp.h>
|
||||
#include <progind.h>
|
||||
#include <recarray.h>
|
||||
#include <recset.h>
|
||||
#include <relation.h>
|
||||
|
||||
#include "lvlib.h"
|
||||
#include "../ve/velib.h"
|
||||
|
||||
#include "lvcondv.h"
|
||||
#include "lvrcondv.h"
|
||||
#include "lvrconsplan.h"
|
||||
|
||||
#include "lv2.h"
|
||||
#include "lv2400a.h"
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TGestione_planning maschera
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TGenera_documenti_mask : public TAutomask
|
||||
{
|
||||
public:
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
TGenera_documenti_mask (const char* name) : TAutomask(name) {}
|
||||
};
|
||||
|
||||
//questa funzione gestisce i vari eenti che si verificano sui campi della maschera
|
||||
bool TGenera_documenti_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TGestione_planning applicazione
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TGenera_documenti_app : public TSkeleton_application
|
||||
{
|
||||
|
||||
TGenera_documenti_mask* _msk;
|
||||
TAssoc_array _quantita;
|
||||
TConfig* _configlv;
|
||||
|
||||
private:
|
||||
//Metodi per la generazione dei documenti
|
||||
bool crea_documento(const TISAM_recordset& plan);
|
||||
void crea_riga(const TString& codart, const char modpas, const int tplis, const bool tmp, TDocumento& doc);
|
||||
//Metodi per il recupero di codnum, tpdoc, stato
|
||||
bool numerazione_ddt(TString& codnum, TString& tpdoc, TString& stato) const;
|
||||
bool numerazione_drit(const int cod, TString& codnum, TString& tpdoc, TString& stato) const;
|
||||
bool numerazione_dant(const int cod, TString& codnum, TString& tpdoc, TString& stato) const;
|
||||
//Metodi per la scansione dei documenti
|
||||
void scansione_ritiri_anticipi(const long codcli, const long codind, const char ritoant);
|
||||
void scansione_consegne(const long codcli, const long codind);
|
||||
//Metodo per il calcolo delle quantità in bolla
|
||||
void calcolo_quantita(TDocumento& doc, const char ritoant);
|
||||
//Metodi aggiornare il conguaglio sui contratti
|
||||
void aggiorna_conguaglio(const long codcli, const long codcont, const TString& codart, const real arr) const;
|
||||
|
||||
protected:
|
||||
virtual bool create();
|
||||
virtual void on_config_change();
|
||||
virtual bool destroy();
|
||||
|
||||
public:
|
||||
bool transfer();
|
||||
virtual void main_loop();
|
||||
};
|
||||
|
||||
////////////////////////////////
|
||||
//// Metodi Protected ////
|
||||
////////////////////////////////
|
||||
|
||||
bool TGenera_documenti_app::create()
|
||||
{
|
||||
_msk = new TGenera_documenti_mask("lv2400a");
|
||||
_configlv = new TConfig(CONFIG_DITTA,"lv");
|
||||
return TSkeleton_application::create();
|
||||
}
|
||||
|
||||
void TGenera_documenti_app::on_config_change()
|
||||
{
|
||||
if (_configlv != NULL)
|
||||
delete _configlv;
|
||||
_configlv = new TConfig(CONFIG_DITTA,"lv");
|
||||
}
|
||||
|
||||
bool TGenera_documenti_app::destroy()
|
||||
{
|
||||
delete _configlv;
|
||||
delete _msk;
|
||||
return TApplication::destroy();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//// Metodi per la generazione dei documenti ////
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
//CREA_DOCUMENTO: questa funzione crea un nuovo documento di trasporto dai dati salvati
|
||||
bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan)
|
||||
{
|
||||
//recupero i dati di interesse dalla maschera
|
||||
const TDate datadoc = _msk->get_date(F_DTDOC);
|
||||
|
||||
//per ogni planning recupero i dati di interesse dal planning
|
||||
const long codcli = plan.get(LVRCONSPLAN_CODCF).as_int();
|
||||
const long codcont = plan.get(LVRCONSPLAN_CODCONT).as_int();
|
||||
const TDate dtcons = plan.get(LVRCONSPLAN_DTCONS).as_date();
|
||||
const char modpas = plan.get(LVRCONSPLAN_MODPASS).as_string()[0];
|
||||
|
||||
|
||||
const int anno = datadoc.year();
|
||||
|
||||
//preparo la chiave per la tabella contratti
|
||||
TToken_string keycont;
|
||||
keycont.add(codcli);
|
||||
keycont.add(codcont);
|
||||
//instanzio una cache sulla tabella dei contratti
|
||||
const TRectype& tcont = cache().get(LF_LVCONDV,keycont);
|
||||
//estraggo i dati di interesse dalla cache
|
||||
const long codind = tcont.get_long(LVCONDV_CODINDSP); //codice dell'indirizzo di spedizione
|
||||
const int tplis = tcont.get_int(LVCONDV_TIPOLIS); //tipo listino
|
||||
|
||||
//calcola tutte le quantità riportate sui documenti di ritiro, sui documenti di anticipo e sulle bolle di consegna
|
||||
//...eventualmente modificate a mano
|
||||
scansione_ritiri_anticipi(codcli,codind,'R');
|
||||
scansione_ritiri_anticipi(codcli,codind,'A');
|
||||
scansione_consegne(codcli,codind);
|
||||
|
||||
//variabili che conterranno i parametri dei documenti che devo generare...
|
||||
//...settati dalla funzione numerazione_ddt()
|
||||
TString4 codnum;
|
||||
TString4 tpdoc;
|
||||
TString4 stato;
|
||||
|
||||
//se non trovo quale documento generare, evito il resto dell'elaborazione
|
||||
if (!numerazione_ddt(codnum, tpdoc, stato))
|
||||
return NOERR;
|
||||
|
||||
//creo il documento corretto riempiendo i campi che già conosco
|
||||
TDocumento doc('D',anno,codnum,0);
|
||||
|
||||
doc.put(DOC_STATO, stato);
|
||||
doc.put(DOC_TIPODOC, tpdoc);
|
||||
doc.put(DOC_DATADOC, datadoc);
|
||||
doc.put(DOC_TIPOCF, 'C');
|
||||
doc.put(DOC_CODCF, codcli);
|
||||
doc.put(DOC_CODCONT, codcont);
|
||||
doc.put(DOC_CODINDSP, codind);
|
||||
|
||||
//preparo la chiave per la tabella righe contratti
|
||||
TToken_string keyrcont;
|
||||
keycont.add(codcli);
|
||||
keycont.add(codcont);
|
||||
|
||||
FOR_EACH_ASSOC_OBJECT(_quantita,h,codart,obj)
|
||||
{
|
||||
crea_riga(codart, modpas, tplis, false, doc);
|
||||
|
||||
/*const TDate dadata = rcont.get(LVRCONDV_INDTTMP).as_date();
|
||||
const TDate adata = rcont.get(LVRCONDV_FIDTTMP).as_date();
|
||||
if (dadata.ok() && dtcons >= dadata && dtcons <= adata)
|
||||
crea_riga(rcont, modpas, true, doc);*/
|
||||
}
|
||||
|
||||
return doc.write() == NOERR;
|
||||
}
|
||||
|
||||
//CREA_RIGA: questa funzione crea una riga merce per una bolla di consegna
|
||||
void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas, const int tplis, const bool tmp, TDocumento& doc)
|
||||
{
|
||||
//creo la nuova riga
|
||||
TRiga_documento& rdoc = doc.new_row("01");
|
||||
|
||||
const long codcli = doc.get_long(DOC_CODCF);
|
||||
const long codcont = doc.get_long(DOC_CODCONT);
|
||||
|
||||
//calcolo della quantità che va sulla bolla
|
||||
|
||||
//preparo la chiave per la tabella righe contratti
|
||||
TToken_string keyrcont;
|
||||
keyrcont.add(codcli);
|
||||
keyrcont.add(codcont);
|
||||
keyrcont.add(codart);
|
||||
//instanzio una cache sulla tabella delle righe contratti
|
||||
const TRectype& rcont = cache().get(LF_LVRCONDV,keyrcont);
|
||||
//recupero i dati di interesse dalla riga del contratto
|
||||
const bool arrot = rcont.get_bool(LVRCONDV_ARROT);
|
||||
const real conguaglio = rcont.get_real(LVRCONDV_QTACONG);
|
||||
const real& qta = *(real*)_quantita.objptr(codart);
|
||||
|
||||
//instanzio una cache sulla tabella del magazzino
|
||||
const TRectype& anamag = cache().get(LF_ANAMAG,codart);
|
||||
//recupero i dati di interesse dall'anagrafica di magazzino
|
||||
const real ppconf = anamag.get_real(ANAMAG_PPCONF);
|
||||
|
||||
const real quantita_noarr = qta - conguaglio;
|
||||
real quantita_arr = quantita_noarr > ZERO ? quantita_noarr : ZERO;
|
||||
//se devo arrotondare
|
||||
if (quantita_arr > ZERO && arrot)
|
||||
{
|
||||
//calcolo di quanti pezzi sforo
|
||||
long arr = quantita_arr.integer() % ppconf.integer();
|
||||
//se sforo (arr > 0) allora calcolo quanti pezzi in più gli devo dare e aggiorno la quantità
|
||||
if (arr > 0)
|
||||
{
|
||||
arr = ppconf.integer() - arr;
|
||||
quantita_arr += arr;
|
||||
}
|
||||
}
|
||||
|
||||
//scrivo le quantità
|
||||
rdoc.put(RDOC_QTA, quantita_arr);
|
||||
rdoc.put(RDOC_QTAGG1, quantita_noarr);
|
||||
rdoc.put(RDOC_QTAGG2, conguaglio);
|
||||
rdoc.put(RDOC_QTAGG3, quantita_arr);
|
||||
rdoc.put(RDOC_GENERATA, true);
|
||||
|
||||
//aggiorno il conguaglio sulla riga del contratto
|
||||
aggiorna_conguaglio(codcli, codcont, codart, quantita_arr - quantita_noarr);
|
||||
|
||||
//elaborazione sul prezzo da utilizzare
|
||||
real prezzo;
|
||||
//elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino
|
||||
if (tplis == 0)
|
||||
prezzo = rcont.get_real(LVRCONDV_PREZZO);
|
||||
else
|
||||
prezzo = anamag.get_real(ANAMAG_COSTSTD);
|
||||
|
||||
rdoc.put(RDOC_CODART,codart);
|
||||
rdoc.put(RDOC_CODARTMAG,codart);
|
||||
rdoc.put(RDOC_CHECKED,'X');
|
||||
if (!tmp)
|
||||
rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PREZZO));
|
||||
else //per adesso per questo ramo non ci passa mai, perchè non sappiamo come gestire le dotazioni temporanee
|
||||
rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PRZDTTMP));
|
||||
|
||||
rdoc.put(RDOC_SCONTO,rcont.get(LVRCONDV_SCONTPERC)); //sconto
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//// Metodi per il recupero di codnum, tpdoc, stato ////
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
//NUMERAZIONE_DDT: questa funzione cerca quali sono i codnum e i tpdoc che devo generare
|
||||
bool TGenera_documenti_app::numerazione_ddt(TString& codnum, TString& tpdoc, TString& stato) const
|
||||
{
|
||||
codnum = _configlv->get("NUM_GEN");
|
||||
tpdoc = _configlv->get("TIPODOC_GEN");
|
||||
//instanzio una cache sulla tabella delle righe contratti (creco lo stato iniziale)
|
||||
stato = cache().get("%TIP",tpdoc,"S2").left(1);
|
||||
|
||||
return codnum.full() && tpdoc.full();
|
||||
}
|
||||
|
||||
//NUMERAZIONE_DRIT: questa funzione cerca quali sono i codnum e i tpdoc dei documenti di ritiro
|
||||
bool TGenera_documenti_app::numerazione_drit(const int cod, TString& codnum, TString& tpdoc, TString& stato) const
|
||||
{
|
||||
codnum = _configlv->get("NUM_RIT",NULL,cod);
|
||||
tpdoc = _configlv->get("TIPODOC_RIT",NULL,cod);
|
||||
stato = _configlv->get("STATO_RIT",NULL,cod); //è lo stato finale
|
||||
|
||||
return codnum.full() && tpdoc.full();
|
||||
}
|
||||
|
||||
//NUMERAZIONE_DANT: questa funzione cerca quali sono i codnum e i tpdoc dei documenti di anticipo
|
||||
bool TGenera_documenti_app::numerazione_dant(const int cod, TString& codnum, TString& tpdoc, TString& stato) const
|
||||
{
|
||||
codnum = _configlv->get("NUM_ANT",NULL,cod);
|
||||
tpdoc = _configlv->get("TIPODOC_ANT",NULL,cod);
|
||||
stato = _configlv->get("STATO_ANT",NULL,cod); //è lo stato finale
|
||||
|
||||
return codnum.full() && tpdoc.full();
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//// Metodi per la scansione dei documenti ////
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
//SCANSIONE_RITIRI_ANTICIPI: questa funzione cerca tutte le bolle di ritiro relative a un certo cliente non ancora evase...
|
||||
//in un certo intervallo di date, e, dopo l'elaborazione, gli cambia stato
|
||||
void TGenera_documenti_app::scansione_ritiri_anticipi(const long codcli, const long codind, const char ritoant)
|
||||
{
|
||||
//recupero dalla maschera i campi di interesse
|
||||
const TDate dadatabolla = _msk->get_date(F_DADTBOLLE);
|
||||
const TDate adatabolla = _msk->get_date(F_ADTBOLLE);
|
||||
|
||||
const long daanno = dadatabolla.year();
|
||||
const long aanno = adatabolla.year();
|
||||
|
||||
//per ogni paragrafo scritto in ditta.ini...
|
||||
//recupero numerazione, tipo documento e stato tramite la funzione apposita
|
||||
for (int i = 0; ; i++)
|
||||
{
|
||||
TString4 codnum;
|
||||
TString4 tpdoc;
|
||||
TString4 stato;
|
||||
bool err;
|
||||
|
||||
//distinguo se sto scandendo i documenti di ritiro o i documenti di anticipo
|
||||
switch (ritoant)
|
||||
{
|
||||
case 'R':
|
||||
err = numerazione_drit(i, codnum, tpdoc, stato);
|
||||
break;
|
||||
case 'A':
|
||||
err = numerazione_dant(i, codnum, tpdoc, stato);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
//se non trovo la numerazione richiesta, interrompo il ciclo
|
||||
if (!err)
|
||||
break;
|
||||
|
||||
//instanzio un recordset che contiene tutti i documenti di interesse
|
||||
TISAM_recordset docritiri ("USE DOC KEY 2 SELECT (STATO!=#STATO)&&(TIPODOC=#TIPODOC)&&(CODINDSP=#CODINDSP)\nFROM TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#DAANNO DATADOC=#DADATABOLLA CODNUM=#CODNUM\nTO TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#AANNO DATADOC=#ADATABOLLA CODNUM=#CODNUM");
|
||||
docritiri.set_var("#STATO",TVariant(stato)); //lo stato va preso dallo sheet
|
||||
docritiri.set_var("#TIPODOC",TVariant(tpdoc));
|
||||
docritiri.set_var("#CODINDSP",codind);
|
||||
docritiri.set_var("#TIPOCF","C");
|
||||
docritiri.set_var("#CODCF",codcli);
|
||||
docritiri.set_var("#PROVV","D");
|
||||
docritiri.set_var("#DAANNO",daanno);
|
||||
docritiri.set_var("#DADATABOLLA",dadatabolla);
|
||||
docritiri.set_var("#CODNUM",TVariant(codnum));
|
||||
docritiri.set_var("#AANNO",aanno);
|
||||
docritiri.set_var("#ADATABOLLA",adatabolla);
|
||||
|
||||
//per ogni documento che trovo, aggiorno la quantità, e poi cambio stato al documento
|
||||
for (bool ok = docritiri.move_first(); ok; ok = docritiri.move_next())
|
||||
{
|
||||
TDocumento doc(docritiri.cursor()->curr()); //instanzio il documento
|
||||
calcolo_quantita(doc,ritoant);
|
||||
doc.put(DOC_STATO,stato); //stato di elaborato, preso dallo sheet
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//SCANSIONE_CONSEGNE: questa funzione cerca tutte le bolle di consegna relative a un certo cliente ancora...
|
||||
//nello stato iniziale in un certo intervallo di date
|
||||
void TGenera_documenti_app::scansione_consegne(const long codcli, const long codind)
|
||||
{
|
||||
//recupero dalla maschera i campi di interesse
|
||||
const TDate dadatabolla = _msk->get_date(F_DADTBOLLE);
|
||||
const TDate adatabolla = _msk->get_date(F_ADTBOLLE);
|
||||
|
||||
const long daanno = dadatabolla.year();
|
||||
const long aanno = adatabolla.year();
|
||||
|
||||
//recupero numerazione, tipo documento e stato tramite la funzione apposita
|
||||
TString4 codnum;
|
||||
TString4 tpdoc;
|
||||
TString4 stato;
|
||||
|
||||
//se non trovo la numerazione richiesta, interrompo la funzione
|
||||
if (!numerazione_ddt(codnum, tpdoc, stato))
|
||||
return;
|
||||
|
||||
//instanzio un recordset che contiene tutti i documenti di interesse
|
||||
TISAM_recordset docritiri ("USE DOC KEY 2 SELECT (STATO=#STATO)&&(TIPODOC=#TIPODOC)&&(CODINDSP=#CODINDSP)\nFROM TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#DAANNO DATADOC=#DADATABOLLA CODNUM=#CODNUM\nTO TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#AANNO DATADOC=#ADATABOLLA CODNUM=#CODNUM");
|
||||
docritiri.set_var("#STATO",TVariant(stato));
|
||||
docritiri.set_var("#TIPODOC",TVariant(tpdoc));
|
||||
docritiri.set_var("#CODINDSP",codind);
|
||||
docritiri.set_var("#TIPOCF","C");
|
||||
docritiri.set_var("#CODCF",codcli);
|
||||
docritiri.set_var("#PROVV","D");
|
||||
docritiri.set_var("#DAANNO",daanno);
|
||||
docritiri.set_var("#DADATABOLLA",dadatabolla);
|
||||
docritiri.set_var("#CODNUM",TVariant(codnum));
|
||||
docritiri.set_var("#AANNO",aanno);
|
||||
docritiri.set_var("#ADATABOLLA",adatabolla);
|
||||
|
||||
//per ogni documento che trovo, aggiorno la quantità
|
||||
for (bool ok = docritiri.move_first(); ok; ok = docritiri.move_next())
|
||||
{
|
||||
TDocumento doc(docritiri.cursor()->curr()); //instanzio il documento
|
||||
calcolo_quantita(doc,'B');
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//// Metodo per il calcolo delle quantità in bolla ////
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
//CALCOLO_QUANTITA: questa funzione scorre tutte le righe documento di una bolla di ritiro, riempiendo un...
|
||||
//TAssoc_array con le quantità ritirate per ogni articolo, sommando le diverse righe con lo stesso articolo...
|
||||
//Questa funzione viene richiamata per ogni documento valido individuato dalla SCANSIONE_RITIRI
|
||||
void TGenera_documenti_app::calcolo_quantita(TDocumento& doc, const char ritoant)
|
||||
{
|
||||
//scorro le righe documento
|
||||
for (long i = 1; i <= doc.rows(); i++)
|
||||
{
|
||||
//instanzio la riga corrente
|
||||
TRiga_documento& rdoc = doc[i];
|
||||
//estraggo i dati di interesse
|
||||
const TString80 codart = rdoc.get(RDOC_CODARTMAG);
|
||||
const real qtardoc = rdoc.get_real(RDOC_QTA);
|
||||
//se è una riga che riguarda un articolo e se la quantità su questa riga non è nulla, allora la elaboro
|
||||
if (codart.full() && !qtardoc.is_zero())
|
||||
{
|
||||
TArticolo* art = rdoc.articolo();
|
||||
//se l'articolo esiste
|
||||
if (art != NULL)
|
||||
{
|
||||
//leggo se esiste già nel TAssoc_array
|
||||
real *qta = (real*)_quantita.objptr(codart);
|
||||
//se non esiste
|
||||
if (qta == NULL)
|
||||
{
|
||||
//per ora memorizzo zero
|
||||
qta = new real;
|
||||
_quantita.add(codart,qta);
|
||||
}
|
||||
//aggiorno la quantità convertendola all'unità di misura di base, aggiungendola o sottraendola
|
||||
//...se si tratta di un ritiro o di un anticipo rispettivamente; nel caso della scansione delle
|
||||
//...bolle di consegna modificate a mano (caso 'B'), devo modificare la quantità da consegnare
|
||||
//...tenendo conto delle modifiche manuali
|
||||
switch (ritoant)
|
||||
{
|
||||
case 'R':
|
||||
*qta += art->convert_to_um(qtardoc, NULL, rdoc.get(RDOC_UMQTA));
|
||||
break;
|
||||
case 'A':
|
||||
*qta -= art->convert_to_um(qtardoc, NULL, rdoc.get(RDOC_UMQTA));
|
||||
break;
|
||||
case 'B':
|
||||
{
|
||||
const real qtagg3 = rdoc.get_real(RDOC_QTAGG3);
|
||||
real modifica = qtardoc - qtagg3;
|
||||
*qta -= art->convert_to_um(modifica, NULL, rdoc.get(RDOC_UMQTA));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
//// Metodi aggiornare il conguaglio sui contratti ////
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
||||
//AGGIORNA_CONGUAGLIO: questa funzione aggiorna il parametro conguaglio sulla riga del contratto
|
||||
void TGenera_documenti_app::aggiorna_conguaglio(const long codcli, const long codcont, const TString& codart, const real arr) const
|
||||
{
|
||||
TLocalisamfile rcondv(LF_LVRCONDV);
|
||||
rcondv.put(LVRCONDV_CODCF,codcli);
|
||||
rcondv.put(LVRCONDV_CODCONT,codcont);
|
||||
rcondv.put(LVRCONDV_CODART,codart);
|
||||
if (rcondv.read() == NOERR)
|
||||
{
|
||||
rcondv.put(LVRCONDV_QTACONG,arr);
|
||||
rcondv.rewrite();
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
//// Metodi Pubblic ////
|
||||
////////////////////////////////
|
||||
|
||||
bool TGenera_documenti_app::transfer()
|
||||
{
|
||||
//leggo i campi dalla maschera
|
||||
const TDate datacons = _msk->get_date(F_DTCONS);
|
||||
const long coditi = _msk->get_long(F_CODITI);
|
||||
long codcli = _msk->get_long(F_CODCF);
|
||||
|
||||
//preparo un recordset che contiene tutti planning per cui voglio creare i documenti relativi
|
||||
TString query = "USE LVRCONSPLAN KEY 2";
|
||||
|
||||
if (coditi || codcli)
|
||||
{
|
||||
query << " SELECT ";
|
||||
if (codcli > 0)
|
||||
query << "(CODCF=" << codcli << ')';
|
||||
if (coditi > 0)
|
||||
{
|
||||
if (codcli > 0)
|
||||
query << "&&";
|
||||
query << "(CODITI=" << coditi << ')';
|
||||
}
|
||||
}
|
||||
query << "\n";
|
||||
query << "FROM DTCONS=" << datacons << "\n";
|
||||
query << "TO DTCONS=" << datacons << "\n";
|
||||
|
||||
TISAM_recordset plan(query);
|
||||
|
||||
TProgind pi(plan.items(), TR("Generazione documenti in corso..."), true, true);
|
||||
|
||||
for (bool ok = plan.move_first(); ok; ok = plan.move_next())
|
||||
{
|
||||
if (!pi.addstatus(1))
|
||||
break;
|
||||
|
||||
crea_documento(plan);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
void TGenera_documenti_app::main_loop()
|
||||
{
|
||||
while (_msk->run() == K_ENTER)
|
||||
transfer();
|
||||
}
|
||||
|
||||
int lv2400(int argc, char* argv[])
|
||||
{
|
||||
TGenera_documenti_app app;
|
||||
app.run(argc, argv, TR("Generazione documenti"));
|
||||
return 0;
|
||||
}
|
10
lv/lv2400a.h
Executable file
10
lv/lv2400a.h
Executable file
@ -0,0 +1,10 @@
|
||||
// generazione automatica documenti
|
||||
// definizione campi per maschera lv2400a
|
||||
#define F_DTCONS 103
|
||||
#define F_DTDOC 104
|
||||
#define F_DADTBOLLE 105
|
||||
#define F_ADTBOLLE 106
|
||||
#define F_CODITI 107
|
||||
#define F_DESCRITI 108
|
||||
#define F_CODCF 109
|
||||
#define F_RAGSOCCLI 110
|
92
lv/lv2400a.uml
Executable file
92
lv/lv2400a.uml
Executable file
@ -0,0 +1,92 @@
|
||||
#include "lv2400a.h"
|
||||
|
||||
TOOLBAR "" 0 0 0 2
|
||||
#include <elabar.h>
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Generazione giri" -1 -1 76 20
|
||||
|
||||
GROUPBOX DLG_NULL 76 6
|
||||
BEGIN
|
||||
PROMPT 1 1 "@bDati per la generazione documenti relativi ai giri"
|
||||
END
|
||||
|
||||
DATE F_DTCONS
|
||||
BEGIN
|
||||
PROMPT 2 2 "Giro del "
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
DATE F_DTDOC
|
||||
BEGIN
|
||||
PROMPT 30 2 "Data documento "
|
||||
FLAGS "A"
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
DATE F_DADTBOLLE
|
||||
BEGIN
|
||||
PROMPT 2 3 "Considera i documenti di ritiro fino dal "
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
DATE F_ADTBOLLE
|
||||
BEGIN
|
||||
PROMPT 55 3 " al "
|
||||
VALIDATE DATE_CMP_FUNC >= F_DADTBOLLE
|
||||
WARNING "Attenzione: la data deve essere maggiore di quella di inizio del periodo"
|
||||
CHECKTYPE REQUIRED
|
||||
END
|
||||
|
||||
STRING F_CODITI 3
|
||||
BEGIN
|
||||
PROMPT 2 4 "Itinerario "
|
||||
FLAGS "UZ"
|
||||
USE &ITI
|
||||
INPUT CODTAB F_CODITI
|
||||
DISPLAY "Codice" CODTAB
|
||||
DISPLAY "Descrizione@50" S0
|
||||
OUTPUT F_CODITI CODTAB
|
||||
OUTPUT F_DESCRITI S0
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_DESCRITI 50
|
||||
BEGIN
|
||||
PROMPT 23 4 ""
|
||||
USE &ITI KEY 2
|
||||
INPUT S0 F_DESCRITI
|
||||
DISPLAY "Descrizione@50" S0
|
||||
DISPLAY "Codice" CODTAB
|
||||
COPY OUTPUT F_CODITI
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
NUMBER F_CODCF 6
|
||||
BEGIN
|
||||
PROMPT 2 5 "Cliente "
|
||||
FLAGS "U"
|
||||
USE LF_CLIFO
|
||||
INPUT TIPOCF "C"
|
||||
INPUT CODCF F_CODCF
|
||||
DISPLAY "Codice " CODCF
|
||||
DISPLAY "Ragione sociale@50" RAGSOC
|
||||
OUTPUT F_CODCF CODCF
|
||||
OUTPUT F_RAGSOCCLI RAGSOC
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
STRING F_RAGSOCCLI 50
|
||||
BEGIN
|
||||
PROMPT 23 5 ""
|
||||
USE LF_CLIFO KEY 2
|
||||
INPUT TIPOCF "C"
|
||||
INPUT RAGSOC F_RAGSOCCLI
|
||||
DISPLAY "Ragione sociale@50" RAGSOC
|
||||
DISPLAY "Codice" CODCF
|
||||
COPY OUTPUT F_CODCF
|
||||
CHECKTYPE NORMAL
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
ENDMASK
|
Loading…
x
Reference in New Issue
Block a user