Sistemati errori sulla generazione delle righe omaggio ( focus e prezzo)

Sistemato output su sconti
Sistemata stampa documenti


git-svn-id: svn://10.65.10.50/trunk@5140 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 1997-08-29 16:42:42 +00:00
parent f2c81b4290
commit 43c00e8eef
6 changed files with 166 additions and 302 deletions

View File

@ -533,7 +533,7 @@ void TCond_vendita::update_omaggi(bool full)
{
static TString16 tipo_riga("_");
TSheet_field & sh = (TSheet_field &) testa().field(F_SHEET);
const int current_doc_row = sh.selected() + 1;
int current_doc_row = sh.selected() + 1;
TDocumento & doc = testa().doc();
bool update = FALSE;
@ -546,6 +546,7 @@ void TCond_vendita::update_omaggi(bool full)
if (r.is_omaggio() && r.is_generata())
{
sh.update_row(current_doc_row - 1);
doc.destroy_row(current_doc_row + 1, TRUE);
sh.destroy(current_doc_row, FALSE);
update = TRUE;
@ -553,6 +554,7 @@ void TCond_vendita::update_omaggi(bool full)
}
real qta = _riga->get(FR_QTA);
bool creata = FALSE;
if (full || qta != ZERO)
{
@ -566,10 +568,14 @@ void TCond_vendita::update_omaggi(bool full)
qta /= _rcondv.get_real("QBASE");
qta.floor();
qta *= _rcondv.get_real("QOM");
if (codart_omaggio.not_empty() && tipo_riga.not_empty() && qta != ZERO)
creata = codart_omaggio.not_empty() && tipo_riga.not_empty() && qta != ZERO;
if (creata)
{
TRiga_documento & curr_row = doc[current_doc_row];
TRiga_documento & curr_row = doc[current_doc_row];
TToken_string & rw = sh.row(current_doc_row - 1);
sh.update_row(current_doc_row - 1);
curr_row.autosave(sh);
TRiga_documento & r = doc.insert_row(current_doc_row + 1, tipo_riga);
@ -580,7 +586,8 @@ void TCond_vendita::update_omaggi(bool full)
r.put("CODART", codart_omaggio);
r.put("UMQTA", _rcondv.get("UMOM"));
r.put("QTA", qta);
// r.put("PREZZO", _rcondv.get("PROMAGGIO"));
real prezzo(_rcondv.get("PROMAGGIO"));
const TString16 codval(_condv.get("CODVAL"));
const TString16 codiva_cli(clifo().vendite().get(CFV_ASSFIS));
if (codiva_cli.not_empty())
r.put("CODIVA", codiva_cli);
@ -592,14 +599,18 @@ void TCond_vendita::update_omaggi(bool full)
sh.check_row(current_doc_row);
r.autosave(sh);
const real prezzo_omaggio = normalize_valuta(_rcondv.get_real("PROMAGGIO"), _condv.get("CODVAL"));
r.put("PREZZO", prezzo_omaggio);
prezzo = normalize_valuta(prezzo, codval);
r.put("PREZZO", prezzo);
r.autoload(sh);
update = TRUE;
curr_row.autoload(sh);
// curr_row.autoload(sh);
}
}
if (update)
{
sh.force_update();
sh.select(creata ? current_doc_row : current_doc_row - 1);
}
}
TCond_vendita::TCond_vendita(TCli_for * clifo, TConfig * ditta, TDocumento_mask * testa, TMask * riga,

View File

@ -452,110 +452,13 @@ void TDocumento_form::extended_parse_general(TScanner &scanner)
}
}
bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
bool TDocumento_form::validate(TForm_item &cf, TToken_string &s)
{
const TString code(s.get(0)); // prende il primo parametro, il codice del messaggio
TString valore;
if (code== "_ISAMREAD") {
// lettura generica di un file del database
// sintassi: _ISAMREAD,<file>,<espressione input>[!<espressione input>!...],{<campo file>|<espressione output>[!<espressione output>!...]}
// dove: <file> è il numero logico del file o il nome della tabella
// <espressione input> è un'espressione del tipo <campo file>=<espressione campi form>
// <espressione campi form> è un'espressione di costanti numeriche, stringhe e valori di campi della form (indicati con il loro numero preceduto da #)
// <espressione output> è un'espressione del tipo <campo form o gruppo>=<campo file> (se è un gruppo deve essere seguito da @) oppure solo <campo file> (il campo della form è quello corrente)
int i, j, poseq, posrv, itms;
pagetype pt;
char sec;
TLocalisamfile *file;
TString f_code(s.get()); // prende il codice del file da leggere
if (atoi(f_code) != 0) file= new TLocalisamfile(atoi(f_code)); // se il codice è numerico allora è un file
else file= new TTable(f_code); // altrimenti è una tabella
file->zero(); // vuota il record corrente del file
TToken_string in(s.get(), '!');
for (i=0; i<in.items(); i++) { // scansione sugli elementi dell'input
TString curr(in.get(i));
poseq= curr.find("=="); // divide la stringa corrente in lvalue e rvalue
if (poseq== -1) {
poseq= curr.find('=');
if (poseq != -1) posrv= poseq+1;
} else posrv= poseq+2;
TString fld(curr.left(poseq)); // preleva il nome del campo del file alla sinistra dell'uguale
TString expr(curr.mid(posrv)); // preleva l'espressione di assegnamento alla destra dell'uguale
TExpression rval(expr, _strexpr);
for (j=0; j<rval.numvar(); j++) { // scansione delle variabili dell'espressione di rvalue
TString var= rval.varname(j);
if (var[0]=='#') var.ltrim(1); // rimuove dalla stringa il primo carattere
TForm_item &fi= cf.find_field(var);
rval.setvar(j, fi.get()); // il valore corrente del campo viene settato nell'espressione
}
file->put(fld, (const char *)rval); // scrive il risultato dell'espressione nel campo del file
}
if (file->read()== NOERR) { // tenta una lettura del file
TToken_string out(s.get(), '!');
for (i=0; i<out.items(); i++) { // scansione sugli elementi dell'output
TString curr(out.get(i));
poseq= curr.find("=="); // divide la stringa corrente in lvalue e rvalue
if (poseq== -1) {
poseq= curr.find('=');
if (poseq != -1) posrv= poseq+1;
} else posrv= poseq+2;
if (poseq== -1) {
const TString &dat= file->get(curr); // preleva il nome del campo del file e lo legge dal record
cf.put_paragraph(dat);
} else {
TString fld(curr.left(poseq)); // preleva il nome del campo del form alla sinistra dell'uguale
const TString &dat= file->get(curr.mid(posrv)); // preleva il nome del campo del file alla destra dell'uguale e lo legge dal record
if (fld[0]=='#') fld.ltrim(1);
if (fld.right(1)== "@") { // se c'è la a-commerciale è un gruppo
if (fld.find("->") != -1) { // se nel gruppo c'è la freccia si riferisce ad un'altra sezione
sec= fld[0];
if (fld[1] != '-') pt= char2page(fld[1]);
else pt= even_page;
itms= section(sec, pt).fields();
} else { // altrimenti si riferisce alla sezione corrente
sec= cf.section().section_type();
pt= cf.section().page_type();
itms= cf.section().fields();
}
for (j=0; j<itms; j++) { // per ogni campo della sezione specificata (o sottointesa)...
TForm_item &fi= section(sec, pt).field(j);
fi.put_paragraph(dat);
}
} else {
TForm_item &fi= cf.find_field(fld);
fi.put_paragraph(dat);
}
}
}
}
delete file;
return (TRUE);
} // fine _ISAMREAD
if (code== "_TABLEREAD") {
// lettura generica di un campo di una tabella
// sintassi: _TABLEREAD,<tabella>,<chiave>,<campo file>
// dove: <tabella> nome tabella da leggere
// <chiave> costante stringa o riferimento a campo della form (preceduto da '#') da usare come chiave di ricerca
// <campo file> identificativo del campo da leggere dalla tabella
TTable tab(s.get()); // prende il nome della tabella
tab.zero(); // vuota il record corrente della tabella
TString in(s.get()); // prende il valore o il campo da usare come codice di ricerca
if (in[0]== '#') {
in.ltrim(1);
TForm_item &fi= cf.find_field(in);
in= fi.get();
}
tab.put("CODTAB", in); // setta la chiave nella tabella
if (tab.read()== NOERR) {
const TString &fld= s.get(); // prende il nome del campo da leggere...
valore = tab.get(fld);
cf.put_paragraph(valore);
}
return (TRUE);
} // fine _TABLEREAD
if (code== "_DITTA") {
if (code== "_DITTA")
{
// lettura dei dati della ditta
// sintassi: _DITTA,{<campo relazione>|<macro>}
// dove: <campo relazione> è un riferimento alla relazione di gestione dei dati della ditta (es. 113@->DENCOM è la denominazione del comune di residenza della ditta)
@ -578,68 +481,106 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
// + %COMUNI (113@) Comune di residenza
// + %COMUNI (213@) Comune di residenza fiscale
TString in(s.get());
if (in[0]=='!') {
if (in[0]!='!')
{
cf.set(_firmrel.curr().get(in));
return TRUE;
}
else
{
in.ltrim(1);
bool _fisc= _firmrel.lfile(6).get("INDRF").not_empty();
if (in=="RAGSOC")
valore = _firmrel.lfile().get("RAGSOC");
if (in=="IND") {
if (in=="RAGSOC")
{
cf.set(_firmrel.lfile().get("RAGSOC"));
return TRUE;
}
if (in=="IND")
{
if (_fisc)
valore = _firmrel.lfile(6).get("INDRF");
cf.set(_firmrel.lfile(6).get("INDRF"));
else
valore = _firmrel.lfile(6).get("INDRES");
cf.set(_firmrel.lfile(6).get("INDRES"));
return TRUE;
}
if (in=="NUM") {
if (in=="NUM")
{
if (_fisc)
valore = _firmrel.lfile(6).get("CIVRF");
cf.set(_firmrel.lfile(6).get("CIVRF"));
else
valore = _firmrel.lfile(6).get("CIVRES");
cf.set(_firmrel.lfile(6).get("CIVRES"));
return TRUE;
}
if (in=="CAP") {
if (in=="CAP")
{
if (_fisc)
valore = _firmrel.lfile(6).get("CAPRF");
cf.set(_firmrel.lfile(6).get("CAPRF"));
else
valore = _firmrel.lfile(6).get("CAPRES");
cf.set(_firmrel.lfile(6).get("CAPRES"));
return TRUE;
}
if (in=="COM") {
if (in=="COM")
{
if (_fisc)
valore = _firmrel.lfile(-213).get("DENCOM");
cf.set(_firmrel.lfile(-213).get("DENCOM"));
else
valore = _firmrel.lfile(-113).get("DENCOM");
cf.set(_firmrel.lfile(-113).get("DENCOM"));
return TRUE;
}
if (in=="PROV") {
if (in=="PROV")
{
if (_fisc)
valore = _firmrel.lfile(-213).get("PROVCOM");
cf.set(_firmrel.lfile(-213).get("PROVCOM"));
else
valore = _firmrel.lfile(-113).get("PROVCOM");
cf.set(_firmrel.lfile(-113).get("PROVCOM"));
return TRUE;
}
if (in=="IVA")
valore = _firmrel.lfile(6).get("PAIV");
{
cf.set(_firmrel.lfile(6).get("PAIV"));
return TRUE;
}
if (in=="CF")
_firmrel.lfile(6).get("COFI");
if (in=="TEL") {
{
cf.set(_firmrel.lfile(6).get("COFI"));
return TRUE;
}
if (in=="TEL")
{
valore = _firmrel.lfile().get("PTEL");
valore << "/" << _firmrel.lfile().get("TEL");
cf.set(valore);
return TRUE;
}
if (in=="FAX") {
if (in=="FAX")
{
valore = _firmrel.lfile().get("PFAX");
valore << "/" << _firmrel.lfile().get("FAX");
cf.set(valore);
return TRUE;
}
if (in=="REGSOC") {
if (in=="REGSOC")
{
valore = _firmrel[LF_UNLOC].get("REGTRIB");
valore << " Vol. " << _firmrel[LF_UNLOC].get("VOLTRIB");
valore << " Fasc. " << _firmrel[LF_UNLOC].get("FASCTRIB");
const TString & vol = _firmrel[LF_UNLOC].get("VOLTRIB");
if (vol.not_empty())
valore << " Vol. " << vol;
const TString & fasc = _firmrel[LF_UNLOC].get("FASCTRIB");
if (fasc.not_empty())
valore << " Fasc. " << fasc;
cf.set(valore);
return TRUE;
}
if (in=="CCIAA") {
valore = _firmrel[LF_UNLOC].get("NUMCCIAA");
valore << " del " << _firmrel[LF_UNLOC].get("DATAICCIAA");
if (in=="CCIAA")
{
valore = _firmrel[LF_UNLOC].get("NUMCCIAA");
const TString & data = _firmrel[LF_UNLOC].get("DATAICCIAA");
if (data.not_empty())
valore << " del " << data;
return TRUE;
}
} else {
TFieldref fref(in, 0);
valore = fref.read(_firmrel);
}
cf.put_paragraph(valore);
return (TRUE);
} // fine _DITTA
if (code== "_CLIENTE")
@ -663,61 +604,64 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
TCli_for & cli_for = _doc->clifor();
TString in(s.get()); // prende la macro o il fieldref
if (in[0] != '!')
valore = cli_for.get(in);
else
{
in.ltrim(1);
if (in=="INDNUM")
{
valore = cli_for.get(CLI_INDCF);
valore << " " << cli_for.get(CLI_CIVCF);
}
else
if (in.find("COM") == 0)
{
in.ltrim(3);
TLocalisamfile com(LF_COMUNI);
const bool nascita = in[0] == 'N';
if (nascita)
{
in.ltrim(3);
com.put("STATO", cli_for.get(CLI_STATOCF));
com.put("COM", cli_for.get(CLI_COMCF));
}
else
{
in.ltrim(2);
com.put("STATO", cli_for.get(CLI_STATONASC));
com.put("COM", cli_for.get(CLI_COMNASC));
}
if (com.read() == NOERR)
valore = com.get(in);
}
else
if (in.find("TEL") == 0)
{
if (in.len() == 3)
in << "1";
const TString num(cli_for.get(in));
in.insert("P");
valore = cli_for.get(in);
valore << "/" << num;
}
else
if (in=="FAX")
{
valore = cli_for.get("PFAX");
valore << "/" << cli_for.get("FAX");
}
else
if (in=="RAGSOC")
{
valore = cli_for.get(in);
valore.strip_d_spaces();
}
cf.set(cli_for.get(in));
return TRUE;
}
in.ltrim(1);
if (in=="INDNUM")
{
valore = cli_for.get(CLI_INDCF);
valore << " " << cli_for.get(CLI_CIVCF);
cf.set(valore);
return TRUE;
}
if (in.find("COM") == 0)
{
const bool nascita = in[3] == 'N';
const int p = in.find("->");
if (p > 0)
in.ltrim(p + 2);
TLocalisamfile com(LF_COMUNI);
if (nascita)
{
com.put("STATO", cli_for.get(CLI_STATONASC));
com.put("COM", cli_for.get(CLI_COMNASC));
}
else
{
com.put("STATO", cli_for.get(CLI_STATOCF));
com.put("COM", cli_for.get(CLI_COMCF));
}
if (com.read() == NOERR)
cf.set(com.get(in));
return TRUE;
}
if (in.find("TEL") == 0)
{
if (in.len() == 3)
in << "1";
const TString num(cli_for.get(in));
in.insert("P");
valore = cli_for.get(in);
valore << "/" << num;
cf.set(valore);
return TRUE;
}
if (in=="FAX")
{
valore = cli_for.get("PFAX");
valore << "/" << cli_for.get("FAX");
cf.set(valore);
return TRUE;
}
if (in=="RAGSOC")
{
valore = cli_for.get(in);
valore.strip_d_spaces();
cf.set(valore);
return TRUE;
}
cf.put_paragraph(valore);
return (TRUE);
} // fine _CLIENTE
if (code == "_DESCRIGA")
@ -732,78 +676,16 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
descrizione << s;
}
cf.put_paragraph(descrizione);
cf.set(descrizione);
TParagraph_string p(descrizione, cf.width());
const int h = cf.height();
for (int i=0; p.get() != NULL && i < h; i++);
// cf.put_paragraph(descrizione);
// Setta l'altezza effettiva del body, per evitare sprechi di righe
cf.section().set_height(cf.effective_height());
cf.section().set_height(i);
return TRUE;
}
if (code== "_ALIGN")
{
// allineamento della posizione di un campo rispetto ad un altro
// sintassi: _ALIGN,<campo form>[,<allineamento>][,<allineamento>...]
// dove: <campo form> è il campo della form (preceduto da '#') da cui prendere l'allineamento
// <allineamento> è uno dei seguenti valori:
// TOP allinea sulla riga d'inizio
// MIDDLE allinea al centro (effettivo)
// BOTTOM allinea sulla riga di fine (effettiva, non preimpostata)
// LEFT allinea sulla colonna d'inizio
// RIGHT allinea sulla colonna di fine
TString in(s.get());
if (in[0]== '#') in.ltrim(1);
TForm_item &fi= cf.find_field(in);
const int width = cf.width();
valore = cf.get();
TString clear(width);
TString picture(cf.picture());
clear.spaces();
int i= 2;
short save_x = cf.x();
short save_y = cf.y();
short save_height = cf.height();
cf.height() = 2; // Solo temporaneamente per far si' che stampi alla giusta posizione
cf.set(clear);
cf.put_paragraph(clear);
while (i<s.items()) { // Calcola la nuova posizione
TString align(s.get());
if (align[0]=='!') align.ltrim(1);
if (align== "TOP") cf.y()= fi.y();
if (align== "MIDDLE") cf.y()= fi.y()+ fi.effective_height()/2;
if (align== "BOTTOM") cf.y()= fi.y()+ fi.effective_height()-1;
if (align== "LEFT") cf.set_x(fi.x());
if (align== "RIGHT") cf.set_x(fi.x()+ fi.width());
i++;
}
real x(valore);
if (x.is_real(valore)) // se e' un numero controlla che non sia uguale 0
{
if (x != 0.0)
valore = x.string(picture);
else
valore = "";
}
// altrimenti stampa la stringa cosi' com'e'
cf.set(valore);
cf.put_paragraph(valore);
cf.y() = save_y;
cf.set_x(save_x);
cf.height() = save_height;
return (TRUE);
} // fine _ALIGN
// Messaggio per stampare il numero di pagina corrente
if (code== "_PAGENO")
{
TString16 pg; pg << int(printer().getcurrentpage() );
cf.put_paragraph(pg);
}
// Messaggio per stampare la data di oggi
if (code== "_DATA")
{
TString16 pg(TDate(TODAY).string());
cf.put_paragraph(pg);
}
if (code== "_RIEPILOGOIVA")
{
// tabella riepilogo aliquote iva e relative imposte
@ -826,7 +708,6 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
// 0 indica di non leggere il successivo codice IVA nella tabella riepilogativa
// 1 indica di leggere il successivo codice IVA nella tabella riepilogativa
if (s.items() == 4)
{
byte selector = byte(atoi(s.get())); // il primo parametro e' il selettore del tipo di codice
@ -841,21 +722,12 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
const bool next = what == "1"; // deve cambiare elemento ?
if (next) _doc->summary_set_next();
real x(value);
if (x.is_real(value))
{
TString picture(cf.picture());
if (x != ZERO)
value = x.string(picture); // Riformatta il valore
else
value = "";
}
cf.put_paragraph(value);
cf.set(value);
}
}
else
error_box("Numero di parametri non corretto in _RIEPILOGOIVA");
return (TRUE);
return TRUE;
} // fine _RIEPILOGOIVA
if (code == "_TOTIMPONIBILI")
@ -867,12 +739,7 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
byte sel = atoi(s.get());
real x = sel == 0 ? _doc->imponibile(TRUE): _doc->tot_imponibili(sel);
TString picture(cf.picture());
if (x != 0.0)
valore = x.string(picture); // Riformatta il valore
else
valore = "";
cf.put_paragraph(valore);
cf.set(x.string());
return (TRUE);
} // fine _TOTIMPONIBILI
@ -889,21 +756,12 @@ bool TDocumento_form::validate(TForm_item &cf, TToken_string &s) {
TString what(s.get());
TString value(_doc->scadenze_get(what));
real x(value);
if (x.is_real(value))
{
TString picture(cf.picture());
if (x != 0.0)
value = x.string(picture); // Riformatta il valore
else
value = "";
}
what = s.get();
const bool next = what == "1";
if (next) _doc->scadenze_set_next();
cf.put_paragraph(value);
cf.set(value);
}
return TRUE;
}
return TForm::validate(cf, s); // se il codice del messaggio non è identificato viene passato alla funzione standard

View File

@ -189,11 +189,11 @@ bool TTabelle_sconti::handle_check(TMask_field &f, KEY k)
{
if (f.to_check(k))
{
TEditable_field & check_field = (TEditable_field &) f.mask().field(f.dlg() + 100);
TEditable_field & check_field = f.mask().efield(f.dlg() + 100);
check_field.set(f.get());
if (!check_field.check())
return check_field.error_box(check_field.get_warning());
return f.error_box(check_field.get_warning());
}
return TRUE;
}

View File

@ -41,7 +41,6 @@ BEGIN
DISPLAY "Cod.pag." CODART[5,8]
DISPLAY "Sconto@25" SCONTO
OUTPUT F_I_RICERCA CODCAT
OUTPUT F_I_DESVEN -201->S0
OUTPUT F_I_RICERCA_SC CODART[1,2]
OUTPUT F_I_RICERCA_ZO CODART[3,4]
OUTPUT F_I_RICERCA_CO CODART[5,8]

View File

@ -78,7 +78,6 @@ BEGIN
OUTPUT F_R_TIPO_RIGA TIPORIGA
OUTPUT F_R_CODART_A CODART
OUTPUT F_R_UM UM
OUTPUT F_R_DESART LF_ANAMAG->DESCR
OUTPUT F_R_SCA NSCAGL
CHECKYTPE REQUIRED
GROUP 1
@ -125,7 +124,6 @@ BEGIN
OUTPUT F_R_TIPO_RIGA TIPORIGA
OUTPUT F_R_RFA_A CODART
OUTPUT F_R_UM UM
OUTPUT F_R_DESART RFA->S0
OUTPUT F_R_SCA NSCAGL
CHECKYTPE REQUIRED
GROUP 2
@ -170,7 +168,6 @@ BEGIN
OUTPUT F_R_TIPO_RIGA TIPORIGA
OUTPUT F_R_GRM_A CODART
OUTPUT F_R_UM UM
OUTPUT F_R_DESART GMC->S0
OUTPUT F_R_SCA NSCAGL
CHECKYTPE REQUIRED
GROUP 3
@ -215,7 +212,6 @@ BEGIN
OUTPUT F_R_TIPO_RIGA TIPORIGA
OUTPUT F_R_SGM_A CODART
OUTPUT F_R_UM UM
OUTPUT F_R_DESART GMC->S0
OUTPUT F_R_SCA NSCAGL
CHECKYTPE REQUIRED
GROUP 3

View File

@ -273,10 +273,10 @@ void TDocumento_mask::sconto_testa2mask( TCli_for & c, TConfig & ditta )
break;
case 'A': // Gestione archivio sconti
{
TString16 cod;
TString16 cod;
const TRectype & ven_rec = c.vendite();
TLocalisamfile sconti(LF_SCONTI );
sconti.setkey(1);
sconti.zero();
sconti.put("TIPO", "I");