campo-sirio/ve/ve0100.cpp
guy 6055e4ab1a Patch level : 2.0 476
Files correlati     : ve0.exe
Ricompilazione Demo : [ ]
Commento            :

AO20030
Se premo sulle frecce di riferimento record sul pulsante "Ricerca" apre
sempre l'ultima registrazione presente ma dell'ultimo tipo documento inserito.
Ad esempio se scelgo come tipo documento F01 e premo sulla freccia di
puntamento all'ultimo record mi apre l'ultimo documento inserito per il
tipo documento ORC.

CM791064
Durante la fase di importazione fatture in CAMPO da altre procedure tramite
il protocolo INI, fare in modo che se nelle righe del documento da importare
viene riscontrato un articolo non esistente in anagrafica articoli,
la procedura non si blocchi con la segnalazione di "Errore fatale" che
obbliga a resettare il Pc , ma dare una segnalazione tipo "Manca codice
articolo in anagrafica" e dare la possibilità all'utente di inserirlo
direttamente dalla fase di importazione nella relativa pagina del documento
ricevuto in quel momento.


git-svn-id: svn://10.65.10.50/trunk@11171 c028cbd2-c16b-5b4b-a496-9718f37d4682
2003-05-22 15:20:01 +00:00

537 lines
14 KiB
C++
Executable File

#include <execp.h>
#include <defmask.h>
#include <tabutil.h>
#include <utility.h>
#include <urldefid.h>
#include "ve0100.h"
#include "veini.h"
#include "veuml.h"
#include "veuml1.h"
#include "verig.h"
#include "sconti.h"
#include "..\mg\mglib.h"
void TMotore_application::init_query_mode( TMask& m )
{
disable_menu_item(M_FILE_PRINT);
TEdit_field& cn = _msk->efield(F_CODNUM);
if (cn.empty())
{
cn.set(_codnum);
if (_msk->field(F_TIPODOC).empty())
{
cn.set_focusdirty(TRUE);
cn.on_key(K_TAB);
cn.set_dirty(FALSE);
_msk->set(F_TIPODOC, _tipodoc, TRUE);
}
}
}
void TMotore_application::init_insert_mode( TMask& m )
{
const TString16 codnum(m.get(F_CODNUM));
const int anno = m.get_int(F_ANNO);
const char provv = m.get(F_PROVV)[0];
const long numdoc = m.get_long(F_NDOC);
TDocumento_mask& dm = (TDocumento_mask&)m;
TDocumento& curdo = dm.doc();
curdo.read(provv, anno, codnum, numdoc);
curdo.set_tipo(m.get(F_TIPODOC));
const char stato = curdo.tipo().stato_finale_inserimento();
curdo.stato(stato);
_codnum = codnum;
_tipodoc = m.get(F_TIPODOC);
m.field(F_CODNUM).set_focusdirty(TRUE);
m.field(F_CODNUM).on_key(K_TAB);
m.field(F_TIPODOC).set_focusdirty(TRUE);
m.field(F_TIPODOC).on_key(K_TAB);
// Giro per supplire alla mancanza di una TMask::set(short id, char c);
char str_stato[2] = { stato, '\0' };
m.set(F_STATO, str_stato);
TLocalisamfile doc(LF_DOC);
TDate data_doc(TODAY);
doc.curr() = curdo.head();
doc.read(_isgteq);
if (doc.eof() || doc.prev() == NOERR)
{
if (doc.curr().same_key(curdo.head(), 1, 1))
data_doc = doc.get_date(DOC_DATADOC);
}
m.set(F_DATADOC, data_doc);
int pos = m.id2pos( F_DATACAMBIO1);
if (pos >= 0 && m.fld(pos).active())
{
m.fld(pos).set(data_doc);
m.fld(pos).dirty();
}
m.disable(DLG_PRINT);
pos = m.id2pos(F_CAUSMAG);
if (pos >= 0)
{
m.fld(pos).set(curdo.tipo().caus_mov());
m.fld(pos).dirty();
}
TTipo_documento& tp = (TTipo_documento&) curdo.tipo();
tp.set_defaults(m);
m.disable(DLG_ELABORA);
}
void TMotore_application::init_modify_mode( TMask& m )
{
static TString80 __last_key;
enable_menu_item(M_FILE_PRINT);
m.enable(DLG_PRINT);
m.enable(DLG_ELABORA);
m.disable(F_STATO);
TString80 key;
key << m.get(F_CODNUM);
key << m.get_int(F_ANNO);
key << m.get(F_PROVV)[0];
key << m.get_long(F_NDOC);
// Non dare messaggi inutili durante la cancellazione automatica
if (autodeleting() != 0x3)
{
const bool transaction = is_transaction();
const bool no_mod = !doc().modificabile() && !transaction;
const bool no_del = !doc().cancellabile();
if (no_del || no_mod)
{
if (key != __last_key)
{
TString msg;
msg.format("Documento non %s%s%s.", (no_mod ? "modificabile":""),
(no_mod && no_del ? " ne' ":""), (no_del ? "cancellabile":""));
if (transaction)
{
TTimed_box box("Attenzione", msg, 5, DLG_OK, 32, 5);
box.add_button(DLG_OK, 0, "", -11, -1, 10, 2);
box.run();
}
else
warning_box(msg);
}
}
if (no_mod)
m.disable(DLG_SAVEREC);
if (no_del)
m.disable(DLG_DELREC);
}
__last_key = key;
}
int TMotore_application::user_function(int index)
{
switch(index)
{
case 1:
break;
default:
yesnofatal_box("Chiamata ad una procedura utente non definita: %d", index);
return NOERR;
break;
}
return NOERR;
}
bool TMotore_application::changing_mask( int mode )
{
static int lastmode = NO_MODE;
const bool change = ( mode != lastmode );
lastmode = mode;
return change;
}
TMask* TMotore_application::get_mask( int mode )
{
switch ( mode )
{
case MODE_INS:
case MODE_MOD:
{
const TString16 tipodoc(_msk->get(F_TIPODOC));
_docmsk = (TDocumento_mask*)_doc_masks.objptr(tipodoc);
if (_docmsk == NULL)
{
_docmsk = new TDocumento_mask(tipodoc);
_doc_masks.add(tipodoc, _docmsk);
}
}
return _docmsk;
break;
default:
return _msk;
break;
}
}
const char* TMotore_application::get_next_key( )
{
TMask& m = curr_mask( );
TCodice_numerazione cod_num(m.get(F_CODNUM));
// Se per questa numerazione h abilitata le numerazione automatica
if( cod_num.auto_num())
{
TLocalisamfile doc(LF_DOC);
doc.zero();
doc.put("CODNUM", cod_num.codice());
doc.put("ANNO", m.get(F_ANNO));
doc.put("PROVV", m.get(F_PROVV));
TRectype cmp_rec(doc.curr()); // record campione
doc.put( "NDOC", 9999999L );
if (doc.read(_isgreat) == NOERR)
doc.prev();
else
doc.last();
const long num = ((doc.curr() == cmp_rec) ? doc.get_long( "NDOC" ) : 0) + 1;
return (format( "%d|%ld", F_NDOC, num));
}
return "";
}
int TMotore_application::read( TMask& m )
{
// m.autoload(*_rel);
TRelation_application::read(m);
doc() = (TDocumento &)_rel->curr();
_codnum = m.get(F_CODNUM);
_tipodoc = m.get(F_TIPODOC);
((TDocumento_mask &)m).doc2mask();
COLOR high_back_color = _sel_color->get_back_color(_link_pos);
COLOR high_color = _sel_color->get_fore_color(_link_pos);
((TDocumento_mask &)m).highlight(high_back_color, high_color);
return NOERR;
}
bool TMotore_application::menu(MENU_TAG mt)
{
bool ok = TRUE;
if (mt == MENU_ITEM(1))
{
_sel_color->run();
COLOR high_back_color = _sel_color->get_back_color(_link_pos);
COLOR high_color = _sel_color->get_fore_color(_link_pos);
if (!query_mask().is_running())
{
TDocumento_mask * m = (TDocumento_mask * ) &edit_mask();
if (m != NULL)
m->highlight(high_back_color, high_color);
}
}
else
ok = TRelation_application::menu(mt);
return ok;
}
int TMotore_application::write( const TMask& m ) // C 90
{
TDocumento& d = (TDocumento&) _rel->curr();
d = ((TDocumento_mask&)m).doc();
return TRelation_application::write(m);
}
int TMotore_application::rewrite( const TMask& m ) // C 90
{
TDocumento& d = (TDocumento &) _rel->curr();
if (d.bloccato())
return 0;
d = ((TDocumento_mask&)m).doc();
return TRelation_application::rewrite(m);
}
void TMotore_application::on_firm_change()
{
if (_config_ditta != NULL)
delete _config_ditta;
_config_ditta = new TConfig(CONFIG_DITTA);
// condv().set_config(_config_ditta);
_doc_masks.destroy();
TApplication::on_firm_change();
}
bool TMotore_application::user_create( )
{
open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_DESLIN, LF_CODCORR,
LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON, LF_MOV, LF_STOMAG,
LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
_config_ditta = new TConfig(CONFIG_DITTA);
// Metto in relazione testata e righe
_rel = new TRelation( LF_DOC );
_rel->lfile().set_curr(new TDocumento);
_msk = new TMask("ve0100a");
_sel_color = new TSelect_color_mask("ve0100a", "0");
set_search_field(F_NDOC);
_link_pos =_sel_color->add_color_def("LINKED", "Righe collegate a documento", COLOR_YELLOW, COLOR_BLACK);
_msk->set_handler( F_CODNUM, TDocumento_mask::num_handler );
_msk->set_handler( F_TIPODOC, TDocumento_mask::tip_handler );
_msk->set_handler( F_NUMDOCRIF, TDocumento_mask::numdocrif_search_handler );
TConfig utente( CONFIG_USER );
_codnum = utente.get("CODNUM");
_tipodoc = utente.get("TIPODOC");
return TRUE;
}
bool TMotore_application::user_destroy( )
{
// Registro l'ultimo tipo documento e l'ultima numerazione
TConfig utente( CONFIG_USER );
utente.set( "CODNUM", _codnum, "ve" );
utente.set( "TIPODOC", _tipodoc, "ve" );
if (_config_ditta != NULL)
delete _config_ditta;
// Distruggo la maschera di modifica
if ( _msk != NULL )
delete _msk;
if ( _sel_color != NULL )
delete _sel_color;
// Distruggo la relazione
delete _rel;
// delete _condv;
return TRUE;
}
int TMotore_application::stato_corrente( )
{
return edit_mask().get_int(F_STATO);
}
void TMotore_application::sheet2ini(TSheet_field &sheet,TConfig& ini)
{
// scrive le righe degli sheet associati
TString16 defpar;
TString str(80);
TDocumento_mask &m = (TDocumento_mask &)sheet.mask();
for (int r = 1; r <= sheet.items(); r++)
{
defpar.format("%d,%d",LF_RIGHEDOC,r);
const TMask * sm = m.riga_mask(r-1);
for (int sf = 0; sf < sm->fields(); sf++)
{
TMask_field& campo = sm->fld(sf);
if (campo.shown() && campo.field())
{
str = sheet.row(r-1).get(sheet.cid2index(campo.dlg()));
if (str.empty()) str = " ";
const word field_class = campo.class_id();
if (field_class == CLASS_MEMO_FIELD ||
field_class == CLASS_ZOOM_FIELD)
{
int p;
while ((p = str.find('\n', 0)) >= 0)
{
str.overwrite("\\", p);
str.insert("n", p+1);
}
}
campo.field()->write(ini, defpar, str);
}
}
}
for ( ; ; r++)
{
defpar.format("%d,%d",LF_RIGHEDOC,r);
if (ini.set_paragraph(defpar))
ini.remove_all();
else
break;
}
}
void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query)
{
TRelation_application::ini2mask(ini, msk, query); // Default processing
if (query)
{
// Dobbiamo riempire il tipo documento per determinare il profilo corretto!
TMask_field& campo = msk.field(F_TIPODOC);
TString16 str = campo.field()->read(ini, format("%d", LF_DOC));
if (str.empty())
{
TToken_string key;
key.add(msk.get(F_PROVV));
key.add(msk.get(F_ANNO));
key.add(msk.get(F_CODNUM));
key.add(msk.get(F_NDOC));
str = cache().get(LF_DOC, key, DOC_TIPODOC);
}
campo.set(str);
}
else
{
TSheet_field& f = msk.sfield(F_SHEET);
TTipo_riga_documento tr;
// Scorre tutti i paragrafi delle righe documento
const TMaskmode oldmode= (TMaskmode)msk.mode();
msk.set_mode(MODE_MOD);
for (int i = 1; ini.set_paragraph(format("%d,%d", LF_RIGHEDOC, i)); i++)
{
if (i == 1) // Se trovo almeno una riga allora cancello tutto, poi aggiungo le righe
{
f.destroy();
doc().destroy_rows();
}
// Considera solo i tipi riga validi
const TString16 tipo = ini.get(RDOC_TIPORIGA);
if (tr.read(tipo) == NOERR)
{
// Crea una nuova riga documento
TRiga_documento& rec = doc().new_row(tipo);
// Riempie i campi della nuova riga
TAssoc_array& var = ini.list_variables();
FOR_EACH_ASSOC_STRING(var, obj, key, val)
{
if (*val == '"' || *val == '\'')
{
const int len = strlen(val);
*(char*)(val+len-1) = '\0';
val++;
}
if (stricmp(key, RDOC_DESCR) == 0) // Trattamento speciale per la descrizione
{
const TString s(esc(val));
int split_pos = s.find('\n');
const int descr_len = rec.length("DESCR");
if (split_pos < 0 && s.len() > descr_len)
split_pos = descr_len;
if (split_pos > descr_len)
split_pos = descr_len;
if (split_pos > 0)
{
rec.put( "DESCR", s.left(split_pos));
rec.put("DESCLUNGA", "X");
rec.put("DESCEST", s.mid(split_pos));
}
else
{
rec.put("DESCR", s);
rec.put("DESCLUNGA", "");
rec.zero("DESCEST");
}
}
else
if (stricmp(key, RDOC_NRIGA) != 0) // Ignora il numero riga ..
if (stricmp(key, RDOC_TIPORIGA) != 0) // ... ed il tipo riga
rec.put(key, val);
}
// solo la insert chiama la post_insert necessaria alla disabilitazione verifichiamo
// l'autoload ??
f.insert(-1, FALSE);
// Aggiunge la riga allo sheet
const bool checked = rec.get_bool(RDOC_CHECKED);
if (checked)
{
const TString& codart = rec.get(RDOC_CODARTMAG);
if (!codart.blank())
{
const TRectype& art = cache().get(LF_ANAMAG, codart);
if (art.empty())
{
error_box(FR("Articolo non valido sulla riga %d: %s"), i, (const char*)codart);
rec.zero(RDOC_CODARTMAG);
}
}
}
rec.autoload(f);
f.check_row(f.items()-1, 0x2);
if (!checked) //se non e' checked, il record viene autosalvato (in modo che sia salvato completamente)
rec.autosave(f);
}
}
msk.set_mode(oldmode);
}
}
void TMotore_application::print()
{
if (save(TRUE)) // Registra il record corrente
{
TDocumento_mask& m = edit_mask();
const TTipo_documento& tipo = m.doc().tipo();
const bool da_stampare = m.doc().stampabile();
TString commandline("ve1 -0 ");
commandline << m.get(F_CODNUM) << ' ' << m.get(F_ANNO) << ' ';
commandline << m.get(F_PROVV) << ' ' << m.get(F_NDOC) << ' ' << m.get(F_NDOC);
commandline << ' ' << (da_stampare ? 'D' : 'P');
const int ncopie = tipo.ncopie();
if (ncopie > 0)
commandline << ' ' << ncopie;
TExternal_app interattivo( commandline );
if (interattivo.run() == NOERR)
{
if (da_stampare)
{
const char s[2] = { tipo.stato_finale_stampa(), '\0'};
m.set(F_STATO, s, TRUE);
}
}
}
}
int ve0100( int argc, char* argv[])
{
TMotore_application a;
a.run( argc, argv, TR("Gestione documenti"));
return 0;
}