Files correlati : or1.exe or1100a.msk or1100b.frm or1200a.frm or1200a.msk Ricompilazione Demo : [ ] Commento : GF20030 La stampa ordini per cliente-fornitore/agente/articolo restituisce il messaggio d'errore:"FATAL ERROR can't find item with id 10 RUN TIME ERROR." GF20031 La stampa ordini col dettaglio articoli per data di consegna oltre a mostrare gli ordini col dettaglio del o degli articoli con data consegna indicata in fase di interrogazione mostra anche la testata (e non il dettaglio degli articoli giustamente) anche di quegli ordini con data di consegna non rientrante nel range inserito in fase di interrogazione. Esempio inserire due ordini uno con data consegna documento e righe documento 20/05/03 e l'altro con data di consegna documento 20/05/03 e un articolo con data di consegna 30/06/06, fare l'interrogazione con dettaglio righe e data di consegna dal 30/06/03 al 30/06/03. GF20032 La stampa disponibilità articoli non evidenzia nulla. git-svn-id: svn://10.65.10.50/trunk@11224 c028cbd2-c16b-5b4b-a496-9718f37d4682
412 lines
15 KiB
C++
Executable File
412 lines
15 KiB
C++
Executable File
#include "orlib.h"
|
||
#include "or1100a.h"
|
||
|
||
// Prima colonna quantita' nel form per stampa disponibilita'
|
||
#define COL1 4
|
||
|
||
TOrdine_form::TOrdine_form(const char* name) : TForm(name)
|
||
{
|
||
_art_giac = new TArticolo_giacenza;
|
||
_esercizi = new TEsercizi_contabili;
|
||
_fcg = new TTable("FCG");
|
||
_codgiac = new TCodgiac_livelli;
|
||
}
|
||
|
||
TOrdine_form::~TOrdine_form()
|
||
{
|
||
delete _codgiac;
|
||
delete _fcg;
|
||
delete _esercizi;
|
||
delete _art_giac;
|
||
}
|
||
|
||
const int TOrdine_form::find_period(const TDate& dc)
|
||
{
|
||
CHECK(_date_array, "Invalid date array in TOrdine_form");
|
||
for (int i = _date_array->last(); i >= 0; i--) // ciuccialo alla rovescia... ehehe ;)
|
||
{
|
||
TDate& dt = (TDate&)*_date_array->objptr(i);
|
||
if (dc > dt)
|
||
break;
|
||
}
|
||
return i+1;
|
||
}
|
||
|
||
bool TOrdine_form::genera_intestazione_supplementare(pagetype p, short y)
|
||
{
|
||
CHECK(_date_array, "L'array delle date non e' impostato.");
|
||
TPrint_section* body = exist('B', p);
|
||
if (body == NULL || !body->columnwise())
|
||
return FALSE;
|
||
|
||
TPrint_section* header = exist('H', p);
|
||
if (header == NULL)
|
||
return FALSE;
|
||
|
||
const int items = _date_array->items();//body->fields();
|
||
TForm_string* s;
|
||
TString des;
|
||
for (int j=0;j<items;j++)
|
||
{
|
||
TForm_item& fi = body->find_field(COL1+j*2);
|
||
des = "Situaz. al ";
|
||
des << ((TDate*)_date_array->objptr(j))->string();
|
||
des.center_just(fi.width()*2);
|
||
s = new TForm_string(header);
|
||
s->id() = -1;
|
||
s->set_x(fi.x());
|
||
s->y() = y;
|
||
s->set_prompt(des);
|
||
s->temp() = TRUE;
|
||
header->add_field(s);
|
||
}
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
bool TOrdine_form::validate(TForm_item &cf, TToken_string &s)
|
||
{
|
||
if (strcmp(s.get(0), "_ORDINE") == 0)
|
||
{
|
||
// TLocalisamfile& doc = cf.form().cursor()->file(LF_DOC);
|
||
TDocumento& doc = (TDocumento&)cf.form().cursor()->curr(LF_DOC);
|
||
//TLocalisamfile& rdoc = cf.form().cursor()->file(LF_RIGHEDOC);
|
||
TRiga_documento& rdoc = (TRiga_documento&)cf.form().cursor()->curr(LF_RIGHEDOC);
|
||
// Add custom messages here
|
||
// All the following messages takes 1 parameter: the field number to set
|
||
TString action(s.get(1));
|
||
|
||
if (action == "DESCRIZIONE")
|
||
{
|
||
// Scrive: Cod articolo/cod livello1/cod livello2/.../denominazione ultimo livello codifica /cod mag /cod dep
|
||
// Nel caso di stampa disponibilita' articoli stampa un pezzo della descrizione
|
||
// vera e proprio dell'articolo.
|
||
TString codart,livello, coddep, codmag;
|
||
codart = rdoc.get(RDOC_CODART);
|
||
if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR)
|
||
{
|
||
if (_normale)
|
||
codart << " " << _art_giac->get(ANAMAG_DESCR);
|
||
else
|
||
codart = _art_giac->get(ANAMAG_DESCR);
|
||
|
||
if (codart.len() > 40)
|
||
codart.cut(40);
|
||
}
|
||
if (_level > 0)
|
||
livello = rdoc.get(RDOC_LIVELLO);
|
||
if (livello.not_empty())
|
||
{
|
||
for (int lev=1; lev <= _level; lev++)
|
||
{
|
||
if (!_codgiac->enabled(lev))
|
||
continue;
|
||
const int starts = _codgiac->code_start(lev) -1;
|
||
const int length = _codgiac->code_length(lev);
|
||
codart << "/";
|
||
codart << livello.mid(starts,length);
|
||
}
|
||
codart << " " << _codgiac->name(_level);
|
||
codart << " " << _codgiac->group_descr(livello,_level);
|
||
}
|
||
|
||
codmag = rdoc.get(RDOC_CODMAG).left(3);
|
||
coddep = rdoc.get(RDOC_CODMAG).right(2);
|
||
if (_detail_mag && codmag.not_empty())
|
||
codart << " Mag. " << codmag;
|
||
if (_detail_dep && coddep.not_empty())
|
||
codart << " Dep. " << coddep;
|
||
|
||
cf.set(codart);
|
||
}
|
||
else
|
||
if (action == "SELECTUM")
|
||
{
|
||
const TString8 um(rdoc.get(RDOC_UMQTA));
|
||
const TString8 cur_um(cf.find_field("407").get());
|
||
|
||
if (cur_um.empty()) // Se l'unita' di misura non e' ancora stata settata prende quella principale
|
||
cf.set(um);
|
||
else
|
||
if (cur_um != um) // Se c'e' ma e' diversa dalla prec. allora setta l'unita' di misura su quella principale
|
||
if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR)
|
||
{
|
||
TForm_item& qo = cf.find_field("408");
|
||
TForm_item& qe = cf.find_field("409");
|
||
TForm_item& qr = cf.find_field("411");
|
||
real qtaor(qo.get());
|
||
real qtaev(qe.get());
|
||
real qtare(qr.get());
|
||
|
||
// Converte i totali q.ta evasa e ordinata nella unita' di misura principale
|
||
// const int index_um = _art_giac->find_um(cur_um);
|
||
// const real fc = _art_giac->um().row(index_um > 0 ? index_um : 1).get("FC");
|
||
// qtaor *= fc;
|
||
// qtaev *= fc;
|
||
// qtare *= fc;
|
||
qtaor = _art_giac->convert_to_um(qtaor, "", cur_um, TRUE);
|
||
qtaev = _art_giac->convert_to_um(qtaev, "", cur_um, TRUE);
|
||
qtare = _art_giac->convert_to_um(qtare, "", cur_um, TRUE);
|
||
|
||
qo.set(qtaor.string());
|
||
qe.set(qtaev.string());
|
||
qr.set(qtare.string());
|
||
|
||
cf.set(_art_giac->um().row(1).get("UM")); // UM principale
|
||
}
|
||
// TBI:
|
||
// Riga merce non a magazzino o non e' possibile reperire l'UM principale per art.
|
||
// non posso interrompere la sezione di stampa da qui, e neppure cambiare il raggruppamento...
|
||
// This seems to be a great dilemma... For now leave it as is: Somme dure e crude di quantita'
|
||
}
|
||
else
|
||
if (action == "CONVUM") // Converte cazzilli quantitativi nella unita' di misura corrente
|
||
{
|
||
TString um(rdoc.get(RDOC_UMQTA));
|
||
TString cur_um(cf.find_field("407").get());
|
||
|
||
if (cur_um != um)
|
||
if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR)
|
||
{
|
||
const real fc = _art_giac->um().row(_art_giac->find_um(cur_um)).get("FC");
|
||
real qt(cf.get());
|
||
qt *= fc;
|
||
cf.set(qt.string());
|
||
}
|
||
}
|
||
else
|
||
if (action == "VALTABLE") // Comandi per stampa riepilogo per valuta
|
||
{
|
||
TString subcommand(s.get(2));
|
||
if (subcommand == "RESET")
|
||
{
|
||
_totvaluta.destroy();
|
||
cf.find_field("TOTVAL1").disable();
|
||
cf.find_field("TOTVAL2").disable();
|
||
cf.find_field("TOTVAL3").disable();
|
||
cf.find_field("TOTVAL4").disable();
|
||
}
|
||
else
|
||
{
|
||
const int valute = _totvaluta.items();
|
||
TString codval(doc.get(DOC_CODVAL));
|
||
const bool is_key = _totvaluta.is_key(codval);
|
||
const bool is_new = !is_key && valute < 4;
|
||
|
||
if (is_new) // Aggiunge l'elemento se non c'e'
|
||
_totvaluta.add(codval,(_TTotale_valuta*)new _TTotale_valuta,is_key);
|
||
// Controlla/stampa al massimo 4 valute
|
||
if (is_key || is_new)
|
||
{
|
||
_TTotale_valuta& tv = (_TTotale_valuta&)_totvaluta[codval];
|
||
const bool is_valord = subcommand == "VALORD";
|
||
real& r = is_valord ? tv.totord() : tv.totres();
|
||
TString s_id;
|
||
int i_id;
|
||
|
||
// Abilita la sezione corrispondente e setta i valori all'interno
|
||
if (!is_key)
|
||
{
|
||
TString16 sec_name = "TOTVAL";
|
||
sec_name << valute+1;
|
||
tv.secnum() = valute+1;
|
||
cf.find_field(sec_name).enable();
|
||
// Setta anche il codice valuta
|
||
i_id = BODY_CODVAL + valute*10;
|
||
s_id.format("%d",i_id);
|
||
cf.find_field(s_id).set(codval);
|
||
if (valute == 0)
|
||
{
|
||
i_id--;
|
||
s_id.format("%d",i_id);
|
||
cf.find_field(s_id).set("@bTotali");
|
||
}
|
||
}
|
||
const int sn = tv.secnum();
|
||
i_id = is_valord ? BODY_TOTVALORD : BODY_TOTVALRES;
|
||
|
||
i_id += (sn-1)*10;
|
||
s_id.format("%d",i_id);
|
||
r += ((real) cf.get()); // Somma il valore corrente
|
||
cf.find_field(s_id).set(r.string());
|
||
}
|
||
}
|
||
}
|
||
else
|
||
if (action == "CALCDISP") // messaggi per calcolo disponibilita'
|
||
{
|
||
TString command(s.get(2));
|
||
if (command == "RESET") // resetta la tabella
|
||
{
|
||
_totdisp.destroy();
|
||
const real rz = ZERO;
|
||
const int items = _date_array->items();
|
||
for (int i = 0; i<items; i++)
|
||
_totdisp.add(rz);
|
||
// Legge anche una volta per tutte il TArticolo_giacenza (uargh uargh)
|
||
if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR)
|
||
{
|
||
_codmag = rdoc.get(RDOC_CODMAG);
|
||
_livello = rdoc.get(RDOC_LIVELLO);
|
||
}
|
||
else
|
||
cf.set("Errore in lettura articolo");
|
||
}
|
||
else
|
||
if (command == "CALC") // Effettua il calcolo per questa riga articolo,
|
||
//cumulando nell'array le quantita', espresse sempre in UM principale
|
||
{
|
||
const bool is_ordine_cliente = doc.get(DOC_TIPOCF)[0] == 'C';
|
||
const TString16 causmag(doc.get(DOC_CAUSMAG));
|
||
const TString16 um(rdoc.get(RDOC_UMQTA));
|
||
const TDate datacons(doc.get_date(RDOC_DATACONS));
|
||
int segno = is_ordine_cliente ? -1 : +1; // default
|
||
if (causmag.not_empty()) // se la causale esiste consulta il segno
|
||
{
|
||
TCausale_magazzino cm(causmag);
|
||
segno *= cm.sgn(is_ordine_cliente ? s_ordc : s_ordf);
|
||
}
|
||
// Reperisce fattore di conversione per UM principale,
|
||
// la quantita residua
|
||
real qtares = rdoc.qtaresidua(); // ZIO PERA! ag v<>l la riga dal document
|
||
qtares = _art_giac->convert_to_um(qtares, "", um, TRUE);
|
||
qtares *= segno; // mette a posto il segno...
|
||
// Trova il periodo giusto
|
||
const int index = find_period(datacons);
|
||
if (index >= _totdisp.items())
|
||
_totdisp.add(ZERO, index); // Added by Guy! Should never happen :-)
|
||
real& rv = (real&) _totdisp[index];
|
||
rv += qtares;
|
||
}
|
||
else
|
||
if (command == "PRNUM") // Stampa l'unita' di misura principale
|
||
{
|
||
const TRecord_array& um = _art_giac->um();
|
||
if (um.rows() > 0) // Controlla che ci sia almeno una unita' di misura
|
||
cf.set(um.row(1).get("UM")); // UM principale
|
||
else
|
||
cf.set("");
|
||
}
|
||
else
|
||
{
|
||
const int period = s.get_int(3);
|
||
//const int items = _date_array->items();
|
||
TString16 annoes;
|
||
real giacenza, scorta_min;
|
||
annoes << _esercizi->date2esc(doc.get_date(DOC_DATADOC));
|
||
//TString16 codmag(rdoc.get(RDOC_CODMAG));
|
||
//TString16 livello(rdoc.get(RDOC_LIVELLO));
|
||
const int codmag_len = (_detail_dep || _detail_mag) ? _codmag.len() : 0;
|
||
const int livello_len = _level > 0 ? _livello.len() : 0;
|
||
//if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR)
|
||
{
|
||
// Serve l'anno esercizio del magazzino...
|
||
|
||
// Ciclo sulle giacenze di magazzino
|
||
TRecord_array& mmgg = _art_giac->mag(annoes);
|
||
const int rows = mmgg.rows();
|
||
// Cumula raggruppando le giacenze per lo stesso mag/dep/liv.giac
|
||
// Scurre alla ruvescia
|
||
for (int i=mmgg.last_row();i>0;i--)
|
||
{
|
||
const TRectype& rec = mmgg.row(i); // gosh!?
|
||
|
||
//checkka se trattasi di medesimo liv giac/mag/dep in caso sia stato spec. il dettaglio
|
||
// altrimenti cumula el todo
|
||
if (codmag_len == 0 || (rec.get(MAG_CODMAG).compare(_codmag, codmag_len) == 0))
|
||
if (livello_len == 0 || (rec.get(MAG_LIVELLO).compare(_livello, livello_len) == 0))
|
||
{
|
||
giacenza += _art_giac->giacenza_corretta(rec, _giac_eff, _val_comp);
|
||
scorta_min = rec.get_real(MAG_SCORTAMIN);
|
||
}
|
||
}
|
||
}
|
||
for (int i = 0; i< period/*items*/; i++)
|
||
giacenza += (real&)_totdisp[i];
|
||
if (command == "PRNGIAC") // Stampa la giacenza prevista
|
||
{
|
||
cf.set(giacenza.string());
|
||
}
|
||
else
|
||
if (command == "PRNSOTT") // Stampa il sottoscorta
|
||
{
|
||
if (giacenza < scorta_min)
|
||
{
|
||
giacenza = scorta_min - giacenza;
|
||
cf.set(giacenza.string());
|
||
}
|
||
else
|
||
cf.set("");
|
||
}
|
||
// Ignore any other command
|
||
}
|
||
}
|
||
else
|
||
if (action == "PREZZONS")
|
||
{
|
||
real pns = rdoc.prezzo(TRUE,FALSE); // Prezzo netto scontato
|
||
cf.set(pns.string());
|
||
}
|
||
else
|
||
if (action == "RAGSOC")
|
||
{
|
||
// Compone la ragione sociale (considera gli occasionali)
|
||
// Il formato <20> il seguente: CODICE (OCFPI) RAGIONE_SOCIALE
|
||
TString ws;
|
||
const bool print_cod = s.get_int(2) != 0;
|
||
TDocumento& documento = (TDocumento&)cf.form().cursor()->curr(LF_DOC);
|
||
TCli_for& cli_for = documento.clifor();
|
||
TOccasionale& cli_occ = documento.occas();
|
||
const bool occasionale = cli_for.occasionale();
|
||
if (print_cod)
|
||
ws << cli_for.get("CODCF") << " ";
|
||
if (occasionale)
|
||
{
|
||
ws << "(" << cli_occ.get("CFPI") << ") " ;
|
||
ws << cli_occ.get("RAGSOC");
|
||
}
|
||
else
|
||
ws << cli_for.get("RAGSOC");
|
||
cf.set(ws);
|
||
}
|
||
else
|
||
if (action == "QTA")
|
||
{
|
||
cf.set(rdoc.quantita().string());
|
||
} else
|
||
if (action == "QTAEVASA")
|
||
{
|
||
cf.set(rdoc.qtaevasa().string());
|
||
} else
|
||
if (action == "RESIDUO")
|
||
{
|
||
cf.set(rdoc.qtaresidua().string());
|
||
} else
|
||
if (action == "VALORE")
|
||
{
|
||
cf.set(rdoc.valore(TRUE, AUTO_DECIMALS).string());
|
||
} else
|
||
if (action == "VALRES")
|
||
{
|
||
cf.set(rdoc.valore(FALSE, AUTO_DECIMALS).string());
|
||
} else
|
||
if (action == "GIACENZA")
|
||
{
|
||
real g = ZERO;
|
||
const TString& codart = rdoc.get(RDOC_CODARTMAG);
|
||
if (codart.not_empty() && _art_giac->read(codart) == NOERR)
|
||
{
|
||
const TDate oggi(TODAY);
|
||
TString16 annoes; annoes.format("%04d", _esercizi->date2esc(oggi));
|
||
const TString16 codmag(rdoc.get("CODMAG")); // Riferito al magazzino indicato sulla riga...
|
||
const TString16 livello(_level > 0 ? rdoc.get(RDOC_LIVELLO) : "");
|
||
g = _art_giac->disponibilita(annoes, codmag, livello, TRUE); // Giacenza attuale
|
||
}
|
||
cf.set(g.string());
|
||
}
|
||
//Ignore any other command
|
||
return TRUE;
|
||
}
|
||
return TForm::validate(cf, s);
|
||
}
|