Patch level :2.1 712

Files correlati     :ve2.exe ve2200c.msk
Ricompilazione Demo : [ ]
Commento            :
http://www.aga.it/mantis/bug_view_advanced_page.php?bug_id=0000077#bugnotes


git-svn-id: svn://10.65.10.50/trunk@11880 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2004-03-17 14:07:27 +00:00
parent 698b5586d7
commit e3f6916b0d
2 changed files with 115 additions and 62 deletions

View File

@ -10,6 +10,9 @@
#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 "
@ -26,7 +29,8 @@ static void key_disable(TMask & m, short id, int key = 1)
m.disable(id);
}
class TCondizioni_vendita: public TRelation_application {
class TCondizioni_vendita: public TRelation_application
{
TMask *_msk; // maschera principale
TRelation *_rel; // relazione principale
@ -85,7 +89,8 @@ TMask_copy::TMask_copy(const TMask& m, const bool enable_catven) : TAutomask("ve
TCondizioni_vendita &app() { // funzione che ritorna il riferimento alla classe principale dell'applicazione
TCondizioni_vendita &app()
{ // funzione che ritorna il riferimento alla classe principale dell'applicazione
return (TCondizioni_vendita &)main_app();
}
@ -241,13 +246,15 @@ bool TCondizioni_vendita::user_create()
return gotcha;
}
bool TCondizioni_vendita::user_destroy() {
bool TCondizioni_vendita::user_destroy()
{
delete _rel;
delete _msk;
return TRUE;
}
bool TCondizioni_vendita::handle_mask(TMask &m, KEY k) {
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
@ -282,8 +289,10 @@ bool TCondizioni_vendita::handle_mask(TMask &m, KEY k) {
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
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
@ -298,139 +307,183 @@ bool TCondizioni_vendita::handle_datacam(TMask_field &fld, KEY k) {
return TRUE;
}
bool TCondizioni_vendita::handle_valfin(TMask_field &fld, KEY k) {
if (k==K_TAB) {
if (fld.get().not_empty()) {
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()) {
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) {
error_box("La data di inizio validità deve essere minore della data di fine");
return FALSE;
}
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) {
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()) {
if (codsucc.not_empty())
{
TMask &m= fld.mask(); // prende la maschera principale
TString cod; // istanzia la stringa per il codice corrente
switch (_condven[0]) {
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) {
error_box("Il codice successivo deve essere diverso dal codice corrente");
return FALSE;
}
if (codsucc == cod)
return error_box("Il codice successivo deve essere diverso dal codice corrente");
}
}
return TRUE;
}
int TCondizioni_vendita::read(TMask &m) {
int TCondizioni_vendita::read(TMask &m)
{
m.enable(BTN_RIGHE);
return (TRelation_application::read(m));
}
int TCondizioni_vendita::write(const TMask &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
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) {
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
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() {
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("TIPO", _condven); // setta il tipo di archivio
delrec.put("COD", condv.get("COD")); // setta il codice della testata
if ((_condven=="L") && _codlis_catven) delrec.put("CATVEN", condv.get("CATVEN")); // setta la categoria di vendita se è abilitata e siamo nei listini
if (_condven=="C") {
delrec.put("TIPOCF", condv.get("TIPOCF")); // setta i dati del cliente/fornitore se siamo nei contratti
delrec.put("CODCF", condv.get("CODCF"));
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
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
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
}
bool TCondizioni_vendita::handle_copy(TMask_field &b, KEY k)
{
if (k==K_SPACE)
{
TMask& msk = b.mask();
TMask& msk = b.mask(); //maschera principale
TMask_copy m(msk, app().codlis_catven()); // 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(LF_RCONDV); // creo il record che usa nel filtro; case in base al tipo documentovendita
TRectype& rec = rel.curr(); // creo il record che usa nel filtro; case in base al tipo documentovendita
rec.put("TIPO",m.get(F_TIPO));
TString16 newcode; //var stringa in cui mettere il nuovo codice del listino/contratto/offerta
switch(m.get(F_TIPO)[0])
const char tipo = m.get(F_TIPO)[0];
switch(tipo)
{
case 'L':
rec.put("CATVEN",m.get(F_L_CATVEN));
rec.put("COD",m.get(F_L_COD));
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("TIPOCF",m.get(F_C_TIPOCF));
rec.put("CODCF",m.get(F_C_CODCF));
rec.put("COD",m.get(F_C_COD));
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("COD",m.get(F_O_COD));
rec.put(RCONDV_COD,m.get(F_O_COD));
newcode = msk.get(F_O_COD);
break;
default:
break;
}
TCursor curs(&rel,"",1,&rec,&rec); //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
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();
TCursor curs(&rel_umart);
const long items = curs.items(); // metto in items il numero di elementi del cursore
curs.freeze();
TProgind bar(items,"Scansione articoli", FALSE, TRUE); //barra di avanzamento
for (curs=0; curs.pos() < items; ++curs)
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));
rec.put(RCONDV_UM, rec_umart.get(UMART_UM));
rec.put(RCONDV_PREZZO, rec_umart.get(UMART_PREZZO));
int err = rel.write();
if (err == _isreinsert && m.get(F_OVERWRITE))
rel.rewrite();
}
}
else
{
bar.addstatus(1);
curs.curr().put("COD", newcode);
int err = rel.write();
if (err == _isreinsert && m.get(F_OVERWRITE))
rel.rewrite();
}
TCursor curs(&rel,"",1,&rec,&rec); //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)
{
bar.addstatus(1);
rec.put(RCONDV_COD, newcode);
int err = rel.write();
if (err == _isreinsert && m.get(F_OVERWRITE))
rel.rewrite();
}
}
}
}
return TRUE;

View File

@ -68,7 +68,7 @@ BEGIN
OUTPUT F_L_CATVEN CATVEN
OUTPUT F_L_COD COD
OUTPUT F_DESCR DESCR
CHECKTYPE REQUIRED
CHECKTYPE NORMAL //puo' essere vuoto quando si copia dalla anagrafica
END