eeea9031a3
Files correlati : ve2.exe Ricompilazione Demo : [ ] Commento : 0001869: Errore in Copia Listini Se creo un nuovo listino e copio gli articoli da un listino esistente, sulle righe risulta impostata in automatico una "C" in TIPOCF che non era presente nel listino origine. Ciò determina l'impossibilità di eliminare le righe create in quanto non più visibili se non dalla manutenzione archivi. git-svn-id: svn://10.65.10.50/branches/R_10_00@22196 c028cbd2-c16b-5b4b-a496-9718f37d4682
652 lines
24 KiB
C++
Executable File
652 lines
24 KiB
C++
Executable File
#include <automask.h>
|
|
#include <config.h>
|
|
#include <expr.h>
|
|
#include <execp.h>
|
|
#include <mailbox.h>
|
|
#include <progind.h>
|
|
#include <relapp.h>
|
|
#include <recarray.h>
|
|
#include <recset.h>
|
|
#include <tabutil.h>
|
|
#include <utility.h>
|
|
|
|
#include "ve2200.h"
|
|
#include "ve2300x.h" // include anche il file dei campi della maschera delle righe
|
|
#include "veconf.h"
|
|
#include "condv.h"
|
|
#include "rcondv.h"
|
|
#include "../mg/umart.h"
|
|
|
|
// nome dell'applicazione di gestione delle righe
|
|
#define RCONDVEN_APP "ve2 -2 "
|
|
|
|
static void key_hide(TMask & m, short id, int key = 1)
|
|
{
|
|
((TEditable_field &)m.field(id)).reset_key(key);
|
|
m.hide(id);
|
|
}
|
|
|
|
static void key_disable(TMask & m, short id, int key = 1)
|
|
{
|
|
((TEditable_field &)m.field(id)).reset_key(key);
|
|
m.disable(id);
|
|
}
|
|
|
|
class TCondizioni_vendita: public TRelation_application
|
|
{
|
|
TMask *_msk; // maschera principale
|
|
TRelation *_rel; // relazione principale
|
|
|
|
TString16 _condven; // stringa che indica il tipo di archivio
|
|
TBit_array _tohide; // vettore degli identificatori di campi che devono essere nascosti
|
|
bool _codlis_catven; // booleano di abilitazione della categoria di vendita nella chiave dei listini
|
|
bool _codcon_codcf; // booleano di abilitazioni dei campi TIPOCF e CODCF
|
|
bool _gest_val, _gest_um, _gest_sca, _gest_so; // booleani per l'abilitazione di valute, unità di misura, scaglioni e sconti/omaggi
|
|
|
|
virtual bool has_filtered_cursor() const { return _condven.full(); }
|
|
virtual bool user_create();
|
|
virtual bool user_destroy();
|
|
virtual TMask *get_mask(int) { return _msk; }
|
|
virtual bool changing_mask(int) { return FALSE; }
|
|
virtual TRelation *get_relation() const { return _rel; }
|
|
|
|
static bool handle_mask(TMask &, KEY); // handler custom della maschera (per il tasto di aggancio alle righe)
|
|
static bool handle_datacam(TMask_field &, KEY); // handler del campo DATACAM (data cambio)
|
|
static bool handle_valfin(TMask_field &, KEY); // handler del campo VALFIN (data fine validità)
|
|
static bool handle_codsucc(TMask_field &, KEY); // handler del campo CODSUCC (codice successivo)
|
|
static bool handle_copy(TMask_field &, KEY); // handler del bottone copia
|
|
|
|
virtual void init_query_mode(TMask& m);
|
|
virtual void init_insert_mode(TMask& m);
|
|
virtual void init_modify_mode(TMask& m);
|
|
virtual int read(TMask &); // metodo usato per leggere il record dal file
|
|
virtual int write(const TMask &); // metodo usato per scrivere il record sul file
|
|
virtual int rewrite(const TMask &); // metodo usato per aggiornare il record sul file
|
|
virtual bool remove(); // metodo usato per cancellare il record sul file
|
|
virtual void mask2ini(const TMask& m, TConfig& ini);
|
|
|
|
public:
|
|
bool codlis_catven() const { return _codlis_catven; }
|
|
bool codcon_codcf() const { return _codcon_codcf;}
|
|
|
|
// @cmember Disabilita la verifica del modulo : essendo una anagrafica, va sempre abilitata
|
|
virtual bool check_autorization() const {return FALSE;}
|
|
TCondizioni_vendita() {}
|
|
virtual ~TCondizioni_vendita() {}
|
|
};
|
|
|
|
class TMask_copy: public TAutomask
|
|
{
|
|
public:
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
TMask_copy(const TMask& m, const bool enable_catven, const bool enable_tipocf);
|
|
};
|
|
|
|
bool TMask_copy::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
{
|
|
return TRUE;
|
|
}
|
|
|
|
TMask_copy::TMask_copy(const TMask& m, const bool enable_catven, const bool enable_tipocf) : TAutomask("ve2200c")
|
|
{
|
|
enable(F_L_CATVEN, enable_catven);
|
|
enable(F_C_TIPOCF, enable_tipocf);
|
|
if (!enable_tipocf)
|
|
{
|
|
TList_field& l = lfield(F_C_TIPOCF);
|
|
l.replace_items(" | "," | ");
|
|
}
|
|
enable(F_C_CODCF, enable_tipocf);
|
|
set(F_TIPO,m.get(F_TIPO));
|
|
}
|
|
|
|
|
|
|
|
|
|
static TCondizioni_vendita &app()
|
|
{ // funzione che ritorna il riferimento alla classe principale dell'applicazione
|
|
return (TCondizioni_vendita &)main_app();
|
|
}
|
|
|
|
|
|
void TCondizioni_vendita::init_query_mode(TMask& m)
|
|
{
|
|
m.disable(BTN_RIGHE);
|
|
m.disable(BTN_COPIA);
|
|
}
|
|
|
|
void TCondizioni_vendita::init_insert_mode(TMask& m)
|
|
{
|
|
init_query_mode(m);
|
|
}
|
|
|
|
void TCondizioni_vendita::init_modify_mode(TMask& m)
|
|
{
|
|
m.enable(BTN_RIGHE);
|
|
m.enable(BTN_COPIA);
|
|
}
|
|
|
|
bool TCondizioni_vendita::user_create()
|
|
{
|
|
bool gotcha= FALSE; // booleano di avvenuta inizializzazione
|
|
_condven= "*"; // inizializzazione dell'indicatore del tipo di archivio
|
|
|
|
if (argc() > 2)
|
|
{
|
|
TFilename trans = argv(2);
|
|
if (trans.len() == 1)
|
|
_condven = trans;
|
|
else
|
|
{
|
|
trans.ltrim(2);
|
|
if (trans.exist())
|
|
{
|
|
TConfig ini(trans, "52");
|
|
_condven = ini.get("TIPO");
|
|
}
|
|
}
|
|
}
|
|
|
|
if (_condven == "*")
|
|
{
|
|
TMask choose("ve2200"); // istanzia la maschera di scelta del tipo di archivio
|
|
if (choose.run() == K_ENTER)
|
|
_condven= choose.get(F_TIPOCV); // prende il tipo di archivio dalla maschera
|
|
}
|
|
_condven.upper(); // rende la stringa upper-case
|
|
_msk= new TMask("VE2200X");
|
|
TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente
|
|
switch (_condven[0]) {
|
|
case 'L': { // listini
|
|
if (prassid.get_bool("GES", NULL, A_LISTINI)) // controlla che l'archivio listini sia abilitato
|
|
{
|
|
// eliminazione campi di altri archivi
|
|
_msk->set_caption("Archivio listini");
|
|
key_hide(*_msk, F_C_COD);
|
|
key_hide(*_msk, F_O_COD);
|
|
key_hide(*_msk, F_C_TIPOCF);
|
|
key_hide(*_msk, F_C_CODCF);
|
|
key_hide(*_msk, F_C_OBBLIG);
|
|
key_hide(*_msk, F_C_DESCF);
|
|
set_search_field(F_L_COD); // impostazione del campo di ricerca
|
|
_msk->set_handler(F_L_CODSUCC, handle_codsucc); // setta l'handler per il campo di codice successivo
|
|
_codlis_catven= prassid.get_bool("GESLISCV"); // setta il booleano di abilitazione delle categoria di vendita
|
|
if (!_codlis_catven) key_disable(*_msk, F_L_CATVEN); // disabilita condizionalmente le categorie di vendita
|
|
_gest_um= prassid.get_bool("GESUM", NULL, A_LISTINI); // setta il booleano di abilitazione delle unità di misura
|
|
_gest_sca= prassid.get_bool("GESSCA", NULL, A_LISTINI); // setta il booleano di abilitazione degli scaglioni
|
|
_gest_so= prassid.get_bool("GESSO", NULL, A_LISTINI); // setta il booleano di abilitazione degli sconti/omaggi
|
|
gotcha= TRUE;
|
|
}
|
|
else
|
|
error_box("L'archivio Listini non è abilititato");
|
|
break;
|
|
}
|
|
case 'C': // contratti
|
|
if (prassid.get_bool("GES", NULL, A_CONTRATTI)) // controlla che l'archivio contratti sia abilitato
|
|
{
|
|
// settaggio dei campi da eliminare
|
|
_msk->set_caption("Archivio contratti");
|
|
key_hide(*_msk, F_L_COD);
|
|
key_hide(*_msk, F_O_COD);
|
|
key_hide(*_msk, F_L_CATVEN);
|
|
key_hide(*_msk, F_L_DESVEN);
|
|
key_hide(*_msk, F_L_CODSUCC);
|
|
key_hide(*_msk, F_L_DESSUCC);
|
|
_codcon_codcf= prassid.get_bool("GESCONCC"); // setta il booleano di abilitazione di TIPOCF e CODCF
|
|
if (!_codcon_codcf) { // disabilita i campi di gestione clienti/fornitori in base al flag. di config.
|
|
key_disable(*_msk, F_C_TIPOCF);
|
|
TList_field& l = (TList_field&)_msk->field(F_C_TIPOCF);
|
|
l.replace_items(" | "," | ");
|
|
key_disable(*_msk, F_C_CODCF);
|
|
}
|
|
set_search_field(F_C_COD); // impostazione del campo di ricerca
|
|
_gest_um= prassid.get_bool("GESUM", NULL, A_CONTRATTI); // setta il booleano di abilitazione delle unità di misura
|
|
_gest_sca= prassid.get_bool("GESSCA", NULL, A_CONTRATTI); // setta il booleano di abilitazione degli scaglioni
|
|
_gest_so= prassid.get_bool("GESSO", NULL, A_CONTRATTI); // setta il booleano di abilitazione degli sconti/omaggi
|
|
gotcha= TRUE;
|
|
}
|
|
else
|
|
error_box("L'archivio Contratti non è abilititato");
|
|
break;
|
|
case 'O': // offerte
|
|
if (prassid.get_bool("GES", NULL, A_OFFERTE)) // controlla che l'archivio offerte sia abilitato
|
|
{
|
|
// settaggio dei campi da eliminare
|
|
_msk->set_caption("Archivio offerte");
|
|
key_hide(*_msk, F_L_COD);
|
|
key_hide(*_msk, F_C_COD);
|
|
key_hide(*_msk, F_L_CATVEN);
|
|
key_hide(*_msk, F_C_TIPOCF);
|
|
key_hide(*_msk, F_C_CODCF);
|
|
key_hide(*_msk, F_C_DESCF);
|
|
key_hide(*_msk, F_L_DESVEN);
|
|
key_hide(*_msk, F_C_OBBLIG);
|
|
key_hide(*_msk, F_L_CODSUCC);
|
|
key_hide(*_msk, F_L_DESSUCC);
|
|
set_search_field(F_O_COD); // impostazione del campo di ricerca
|
|
_gest_um= prassid.get_bool("GESUM", NULL, A_OFFERTE); // setta il booleano di abilitazione delle unità di misura
|
|
_gest_sca= prassid.get_bool("GESSCA", NULL, A_OFFERTE); // setta il booleano di abilitazione degli scaglioni
|
|
_gest_so= prassid.get_bool("GESSO", NULL, A_OFFERTE); // setta il booleano di abilitazione degli sconti/omaggi
|
|
gotcha= TRUE;
|
|
}
|
|
else
|
|
error_box("L'archivio Offerte non è abilititato");
|
|
break;
|
|
default: // messaggio di errore se si indica un archivio non valido
|
|
error_box("Indicare l'archivio sulla linea di comando (L, C o O) oppure selezionarla dalla maschera di partenza");
|
|
break;
|
|
}
|
|
if (gotcha) { // se è stato selezionato correttamente un archivio completa l'inizializzazione
|
|
_rel= new TRelation(LF_CONDV); // apre la relazione (un unico file)
|
|
_msk->set(F_TIPO, _condven); // settaggio del campo di tipo archivio
|
|
_msk->set_handler(handle_mask); // imposta l'handler generale della maschera
|
|
_msk->set_handler(F_DATACAM, handle_datacam); // imposta l'handler per il campo della data del cambio
|
|
_msk->set_handler(F_VALFIN, handle_valfin); // imposta l'handler per il campo di fine validità
|
|
_msk->set_handler(BTN_COPIA, handle_copy); // imposta l'handler per il bottone Copia
|
|
if (!_gest_um) _msk->disable(F_GESTUM); // disabilita condizionalmente il booleano di gestione delle unità di misura
|
|
if (!_gest_sca)
|
|
{
|
|
_msk->disable(F_GESTSCAGL); // disabilita condizionalmente il booleano di gestione degli scaglioni
|
|
_msk->disable(F_DECIMALI); // disabilita il numero di decimali significativi in qta limite scaglione
|
|
}
|
|
if (!_gest_so) _msk->disable(F_GESTSCO); // disabilita condizionalmente il booleano di gestione degli sconti/omaggi
|
|
_gest_val= prassid.get_bool("GESVAL"); // legge il booleano di abilitazione delle gastione delle valute
|
|
if (!_gest_val) { // se la gestione delle valute è disabilitata i campi di gestione vengono disabilitati
|
|
_msk->disable(F_CODVAL);
|
|
_msk->disable(F_CAMBIO);
|
|
_msk->disable(F_DATACAM);
|
|
}
|
|
}
|
|
return gotcha;
|
|
}
|
|
|
|
bool TCondizioni_vendita::user_destroy()
|
|
{
|
|
delete _rel;
|
|
delete _msk;
|
|
return TRUE;
|
|
}
|
|
|
|
bool TCondizioni_vendita::handle_mask(TMask &m, KEY k)
|
|
{
|
|
if (k==K_F5) { // se viene premuto F5 o selezionato il tasto "Righe" viene lanciata l'applicazione di editing
|
|
TString &_condven= app()._condven; // prende l'indicatore del tipo di archivio
|
|
bool &_codlis_catven= app()._codlis_catven; // prende il booleano di attivazione del campo CATVEN
|
|
TString appname(RCONDVEN_APP); // istanzia e inizializza la stringa con il nome dell'applicazione da lanciare
|
|
TString body; // istanzia la stringa contenente il corpo del messaggio (lista di inizializzazione dei campi della maschera)
|
|
switch (_condven[0]) {
|
|
case 'L': // listini
|
|
body << F_R_L_RICERCA << "|"; // appende l'id del campo di ricerca
|
|
body << F_R_TIPO << "=" << _condven << "|"; // appende il filtro sul tipo
|
|
body << F_R_L_CATVEN << "=" << ((_codlis_catven)?(m.get(F_L_CATVEN)):("")) << "|"; // appende il filtro sulla categoria di vendita
|
|
body << F_R_L_COD << "=" << m.get(F_L_COD); // appende il filtro sul campo codice
|
|
break;
|
|
case 'C': // contratti
|
|
body << F_R_C_RICERCA << "|"; // appende l'id del campo di ricerca
|
|
body << F_R_TIPO << "=" << _condven << "|"; // appende il filtro sul tipo
|
|
body << F_R_C_TIPOCF << "=" << m.get(F_C_TIPOCF) << "|"; // appende il filtro sul campo tipo cliente/fornitore
|
|
body << F_R_C_CODCF << "=" << m.get(F_C_CODCF) << "|"; // appende il filtro sul campo codice cliente/fornitore
|
|
body << F_R_C_COD << "=" << m.get(F_C_COD); // appende il filtro sul campo codice
|
|
break;
|
|
case 'O': // offerte
|
|
body << F_R_O_RICERCA << "|"; // appende l'id del campo di ricerca
|
|
body << F_R_TIPO << "=" << _condven << "|"; // appende il filtro sul tipo
|
|
body << F_R_O_COD << "=" << m.get(F_O_COD); // appende il filtro sul campo codice
|
|
break;
|
|
}
|
|
appname << _condven; // aggiunge al lancio dell'applicazione la selezione del tipo di archivio
|
|
TMessage msg(cmd2name(appname), MSG_FS, (const char *)body); // istanzia il messaggio per l'applicazione
|
|
msg.send(); // invia il messaggio all'applicazione
|
|
TExternal_app ve2_2(appname); // istanzia l'applicazione esterna...
|
|
ve2_2.run(); // ...la lancia e rimane in attesa del suo termine
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TCondizioni_vendita::handle_datacam(TMask_field &fld, KEY k)
|
|
{
|
|
if (k==K_TAB)
|
|
{ // ad ogni perdita di fuoco viene tentato un accoppiamento tra valuta e data per ottenere il cambio preciso
|
|
TString datacam(fld.get()); // legge la data di cambio nel campo corrente
|
|
if (datacam.not_empty()) {
|
|
TMask &m= fld.mask(); // prende la maschera principale
|
|
TString codval(m.get(F_CODVAL)); // prende il codice della valuta
|
|
if (codval.not_empty()) {
|
|
TTable cam("CAM"); // apre la tabella cambi
|
|
cam.put("CODTAB", codval << datacam); // riempie la chiave
|
|
if (cam.read() == NOERR) m.set(F_CAMBIO, cam.get("R10")); // se la lettura riesce il valore del cambio viene posto nel campo CAMBIO della maschera
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TCondizioni_vendita::handle_valfin(TMask_field &fld, KEY k)
|
|
{
|
|
if (k==K_TAB)
|
|
{
|
|
if (fld.get().not_empty())
|
|
{
|
|
TMask &m= fld.mask(); // prende la maschera principale
|
|
if (m.get(F_VALIN).not_empty())
|
|
{
|
|
TDate valfin(fld.get()); // prende la data di fine validità
|
|
TDate valin(m.get(F_VALIN)); // prende la data di inizio validità
|
|
if (valfin<valin)
|
|
return error_box("La data di inizio validità deve essere minore della data di fine");
|
|
}
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TCondizioni_vendita::handle_codsucc(TMask_field &fld, KEY k)
|
|
{
|
|
if (k==K_TAB)
|
|
{
|
|
TString &_condven= app()._condven; // prende il tipo di archivio dall'applicazione principale
|
|
TString codsucc(fld.get()); // prende il codice successivo dal campo corrente
|
|
if (codsucc.not_empty())
|
|
{
|
|
TMask &m= fld.mask(); // prende la maschera principale
|
|
TString cod; // istanzia la stringa per il codice corrente
|
|
switch (_condven[0])
|
|
{
|
|
case 'L': cod= m.get(F_L_COD); break; // prende il codice listino corrente dal campo della maschera
|
|
case 'C': cod= m.get(F_C_COD); break; // prende il codice contratto dal campo della maschera
|
|
}
|
|
if (codsucc == cod)
|
|
return error_box("Il codice successivo deve essere diverso dal codice corrente");
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
int TCondizioni_vendita::read(TMask &m)
|
|
{
|
|
m.enable(BTN_RIGHE);
|
|
return (TRelation_application::read(m));
|
|
}
|
|
|
|
int TCondizioni_vendita::write(const TMask &m)
|
|
{
|
|
m.autosave(*_rel); // scrive il contenuto della maschera nel record della relazione
|
|
TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione
|
|
if (_condven != "C")
|
|
f.zero("TIPOCF"); // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file
|
|
_rel->write(); // invoca la scrittura della relazione
|
|
return (_rel->status()); // ritorna lo stato della relazione
|
|
}
|
|
|
|
int TCondizioni_vendita::rewrite(const TMask &m)
|
|
{
|
|
m.autosave(*_rel); // scrive il contenuto della maschera nel record della relazione
|
|
TLocalisamfile &f= _rel->lfile(); // prende il file principale della relazione
|
|
if (_condven != "C")
|
|
f.zero("TIPOCF"); // se non si sta lavorando sui contratti il campo TIPOCF deve essere svuotato sul file
|
|
_rel->rewrite(); // invoca la riscrittura della relazione
|
|
return (_rel->status()); // ritorna lo stato della relazione
|
|
}
|
|
|
|
bool TCondizioni_vendita::remove()
|
|
{
|
|
TLocalisamfile &condv= _rel->lfile(); // prende il file della testata dalla relazione principale
|
|
TLocalisamfile rcondv(LF_RCONDV); // apre il file delle righe per ottenenre il record corrente
|
|
TRectype delrec(rcondv.curr()); // istanzia il record basato sul file delle righe, da usare come campione
|
|
delrec.zero(); // svuota il record campione
|
|
delrec.put(RCONDV_TIPO, _condven); // setta il tipo di archivio
|
|
delrec.put(RCONDV_COD, condv.get("COD")); // setta il codice della testata
|
|
if ((_condven=="L") && _codlis_catven)
|
|
delrec.put(RCONDV_CATVEN, condv.get(CONDV_CATVEN)); // setta la categoria di vendita se è abilitata e siamo nei listini
|
|
if (_condven=="C")
|
|
{
|
|
delrec.put(RCONDV_TIPOCF, condv.get(CONDV_TIPOCF)); // setta i dati del cliente/fornitore se siamo nei contratti
|
|
delrec.put(RCONDV_CODCF, condv.get(CONDV_CODCF));
|
|
}
|
|
TRelation delrel(LF_RCONDV); // istanzia una relazione sulle righe
|
|
TCursor delcur(&delrel, "", 1, &delrec, &delrec); // istanzia il cursore di cancellazione sulla relazione delle righe
|
|
long n= delcur.items(); // legge il numero di elementi del cursore
|
|
delcur.freeze(); // congela il cursore al suo stato attuale
|
|
bool proceed= FALSE; // istanzia il booleano di conferma alla cancellazione
|
|
if (n==1)
|
|
proceed = yesno_box("Esiste una riga collegata a questa testata: verrà anch'essa cancellata. Procedo?"); // viene richiesta conferma alla cancellazione della riga...
|
|
if (n>1)
|
|
proceed = yesno_box("Esistono %ld righe collegate a questa testata: verranno anch'esse cancellate. Procedo?", n); // ...o delle righe
|
|
if (proceed)
|
|
{ // se si conferma le righe vengono cancellate
|
|
TLocalisamfile &delfile= delcur.file(); // prende riferimento al file delle righe dal cursore
|
|
for (delcur=0; delcur.pos()<n; ++delcur)
|
|
delfile.remove(); // ciclo sugli elementi del cursore, cancella i record del file delle righe
|
|
}
|
|
return (TRelation_application::remove()); // viene invocata la funzione standard di cancellazione del record corrente
|
|
}
|
|
|
|
|
|
void TCondizioni_vendita::mask2ini(const TMask& m, TConfig& ini)
|
|
{
|
|
TRelation_application::mask2ini(m, ini);
|
|
|
|
TString query;
|
|
query << "USE RCONDV";
|
|
query << "\nFROM TIPO=#TIPO CATVEN=#CATVEN TIPOCF=#TCF CODCF=#CODCF COD=#COD";
|
|
query << "\nTO TIPO=#TIPO CATVEN=#CATVEN TIPOCF=#TCF CODCF=#CODCF COD=#COD";
|
|
TISAM_recordset rcondv(query);
|
|
|
|
const TString& tipo = m.get(CONDV_TIPO);
|
|
rcondv.set_var("#TIPO", tipo);
|
|
if (tipo == "L")
|
|
rcondv.set_var("#CATVEN", m.get(CONDV_CATVEN));
|
|
else
|
|
rcondv.set_var("#CATVEN", "");
|
|
if (tipo == "C")
|
|
{
|
|
rcondv.set_var("#TCF", m.get(CONDV_TIPOCF));
|
|
rcondv.set_var("#CODCF", m.get(CONDV_CODCF));
|
|
}
|
|
else
|
|
{
|
|
rcondv.set_var("#TCF", "");
|
|
rcondv.set_var("#CODCF", "");
|
|
}
|
|
rcondv.set_var("#COD", m.get(CONDV_COD));
|
|
|
|
const long items = rcondv.items();
|
|
TString16 paragraph;
|
|
int j = 0;
|
|
|
|
for (bool ok = rcondv.move_first(); ok; ok = rcondv.move_next())
|
|
{
|
|
paragraph.format("%d,%d", LF_RCONDV, ++j);
|
|
ini.set_paragraph(paragraph);
|
|
|
|
const TRectype& rec = rcondv.cursor()->curr();
|
|
const int nfields = rec.items();
|
|
for (int i = 0; i < nfields; i++)
|
|
{
|
|
const char* field_name = rec.fieldname(i);
|
|
ini.set(field_name, rec.get(field_name));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
bool TCondizioni_vendita::handle_copy(TMask_field &b, KEY k)
|
|
{
|
|
if (k==K_SPACE)
|
|
{
|
|
TMask& msk = b.mask(); //maschera principale
|
|
TMask_copy m(msk, app().codlis_catven(), app().codcon_codcf()); // gli passo la maschera del bottone copia (cioé la maschera principale ve2200x)
|
|
if (m.run()==K_ENTER)
|
|
{
|
|
TRelation rel(LF_RCONDV); // creo un relazione sul file delle righe delle condizioni di vendita
|
|
TRectype& rec = rel.curr(); // creo il record che usa nel filtro; case in base al tipo documentovendita
|
|
rec.put("TIPO",m.get(F_TIPO));
|
|
rel.add(LF_ANAMAG, "CODART==CODRIGA");
|
|
TString16 newcode; //var stringa in cui mettere il nuovo codice del listino/contratto/offerta
|
|
const bool overwrite = m.get_bool(F_OVERWRITE); //deve sovrascrivere le righe doc gia' esistenti?
|
|
const TString & source = m.get(F_PERC);
|
|
const bool multiply = source.full();
|
|
TExpression e(source);
|
|
TArray v;
|
|
const char tipo = m.get(F_TIPO)[0];
|
|
|
|
for (int i = 0; i < e.numvar(); i ++)
|
|
{
|
|
const TString name(e.varname(i));
|
|
v.add(new TFieldref(name, 0));
|
|
}
|
|
switch(tipo)
|
|
{
|
|
case 'L':
|
|
rec.put(RCONDV_CATVEN,m.get(F_L_CATVEN));
|
|
rec.put(RCONDV_COD,m.get(F_L_COD));
|
|
newcode = msk.get(F_L_COD);
|
|
break;
|
|
case 'C':
|
|
rec.put(RCONDV_TIPOCF,m.get(F_C_TIPOCF));
|
|
rec.put(RCONDV_CODCF,m.get(F_C_CODCF));
|
|
rec.put(RCONDV_COD,m.get(F_C_COD));
|
|
newcode = msk.get(F_C_COD);
|
|
break;
|
|
case 'O':
|
|
rec.put(RCONDV_COD,m.get(F_O_COD));
|
|
newcode = msk.get(F_O_COD);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if(tipo == 'L' && m.get(F_L_COD).blank()) //genera listino da umart
|
|
{
|
|
TRelation rel_umart(LF_UMART); //relazione su umart da cui prendo codici e prezzi
|
|
TRectype& rec_umart = rel_umart.curr();
|
|
TString filtro;
|
|
const bool gestum = msk.get_bool(F_GESTUM);
|
|
const bool gestscagl = msk.get_bool(F_GESTSCAGL);
|
|
|
|
rel_umart.add(LF_ANAMAG, "CODART==CODART");
|
|
if (!gestum)
|
|
filtro = "NRIGA==1";
|
|
|
|
TRectype from(LF_UMART);
|
|
TRectype to(LF_UMART);
|
|
const TString & codf = m.get(F_FROMCOD);
|
|
|
|
if (codf.full())
|
|
from.put(UMART_CODART, codf);
|
|
|
|
const TString & codt = m.get(F_TOCOD);
|
|
|
|
if (codt.full())
|
|
to.put(UMART_CODART, codt);
|
|
|
|
TCursor curs(&rel_umart, filtro, 1, from.empty() ? NULL : &from, to.empty() ? NULL : &to);
|
|
const long items = curs.items(); // metto in items il numero di elementi del cursore
|
|
TProgind bar(items,"Scansione articoli", FALSE, TRUE); //barra di avanzamento
|
|
|
|
curs.freeze();
|
|
for (curs = 0; curs.pos() < items; ++curs)
|
|
{
|
|
bar.addstatus(1);
|
|
//riempie le righe del nuovo listino generato da umart
|
|
rec.put(RCONDV_TIPO, 'L');
|
|
rec.put(RCONDV_CATVEN, msk.get(F_L_CATVEN));
|
|
rec.put(RCONDV_COD, newcode);
|
|
rec.put(RCONDV_TIPORIGA, 'A');
|
|
rec.put(RCONDV_CODRIGA, rec_umart.get(UMART_CODART));
|
|
if (gestum)
|
|
rec.put(RCONDV_UM, rec_umart.get(UMART_UM));
|
|
else
|
|
rec.zero(RCONDV_UM);
|
|
if (gestscagl)
|
|
rec.put(RCONDV_NSCAGL, 1);
|
|
else
|
|
rec.zero(RCONDV_NSCAGL);
|
|
|
|
real prezzo = rec_umart.get_real(UMART_PREZZO);
|
|
|
|
if (multiply)
|
|
{
|
|
FOR_EACH_ARRAY_ITEM(v, j, obj)
|
|
{
|
|
const TFieldref * f = (const TFieldref *) obj;
|
|
|
|
e.setvar(j, f->read(rel_umart));
|
|
}
|
|
prezzo *= (CENTO + e.as_real()) / CENTO;
|
|
}
|
|
|
|
rec.put(RCONDV_PREZZO, prezzo);
|
|
int err = rel.write();
|
|
if (err == _isreinsert && overwrite)
|
|
rel.rewrite();
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
TRectype from(rec);
|
|
TRectype to(rec);
|
|
|
|
const TString & codf = m.get(F_FROMCOD);
|
|
|
|
if (codf.full())
|
|
{
|
|
from.put(RCONDV_TIPORIGA, "A");
|
|
from.put(RCONDV_CODRIGA, codf);
|
|
}
|
|
|
|
const TString & codt = m.get(F_TOCOD);
|
|
|
|
if (codt.full())
|
|
{
|
|
to.put(RCONDV_TIPORIGA, "A");
|
|
to.put(RCONDV_CODRIGA, codt);
|
|
}
|
|
|
|
TCursor curs(&rel,"",1, &from, &to); //creo anche il cursore della relazione, con chiave 1(codice) e record iniz. e fin. uguali nel filtro
|
|
const long items = curs.items(); // metto in items il numero di elementi del cursore
|
|
curs.freeze();
|
|
TProgind bar(items,"Scansione righe di origine", FALSE, TRUE); //barra di avanzamento
|
|
|
|
for (curs=0; curs.pos() < items; ++curs)
|
|
{
|
|
real prezzo = rec.get_real(RCONDV_PREZZO);
|
|
|
|
if (multiply)
|
|
{
|
|
FOR_EACH_ARRAY_ITEM(v, j, obj)
|
|
{
|
|
const TFieldref * f = (const TFieldref *) obj;
|
|
|
|
e.setvar(j, f->read(rel));
|
|
}
|
|
prezzo *= (CENTO + e.as_real()) / CENTO;
|
|
}
|
|
|
|
bar.addstatus(1);
|
|
if (tipo == 'C')
|
|
{
|
|
rec.put(RCONDV_TIPOCF,msk.get(F_C_TIPOCF));
|
|
rec.put(RCONDV_CODCF,msk.get(F_C_CODCF));
|
|
}
|
|
rec.put(RCONDV_COD, newcode);
|
|
rec.put(RCONDV_PREZZO, prezzo);
|
|
int err = rel.write();
|
|
if (err == _isreinsert && overwrite)
|
|
rel.rewrite();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
int ve2200(int argc, char* argv[])
|
|
{
|
|
TCondizioni_vendita a;
|
|
a.run(argc, argv, "Condizioni di vendita");
|
|
return 0;
|
|
}
|