Patch level :

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :



Creazione ordini fornitore SRM


git-svn-id: svn://10.65.10.50/branches/R_10_00@21333 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
alex 2010-12-19 09:00:58 +00:00
parent c1f8c4c830
commit 738e5d96f9

View File

@ -118,11 +118,16 @@ public:
void TOrdf_cache::discarding(const THash_object* obj) void TOrdf_cache::discarding(const THash_object* obj)
{ {
TDocumento& doc = (TDocumento&)obj->obj(); TDocumento& doc = (TDocumento&)obj->obj();
TRiga_documento& rdoc = doc[1]; if (doc.physical_rows() > 1)
doc.put(DOC_CODCMS, rdoc.get(RDOC_CODCMS)); {
doc.put(DOC_FASCMS, rdoc.get(RDOC_FASCMS)); TRiga_documento& rdoc = doc[2];
doc.put(DOC_CODCOSTO, rdoc.get(RDOC_CODCOSTO)); doc.put(DOC_CODCMS, rdoc.get(RDOC_CODCMS));
int err = doc.rewrite(); doc.put(DOC_FASCMS, rdoc.get(RDOC_FASCMS));
doc.put(DOC_CODCOSTO, rdoc.get(RDOC_CODCOSTO));
int err = doc.rewrite();
}
else
doc.remove();
} }
//KEY2OBJ:sceglie il documento giusto da disco in modo da poterlo continuare, o lo crea se non c'è //KEY2OBJ:sceglie il documento giusto da disco in modo da poterlo continuare, o lo crea se non c'è
@ -211,16 +216,14 @@ protected:
virtual void main_loop(); virtual void main_loop();
const real cerca_prezzo(const char* codart, const long codcf); const real cerca_prezzo(const char* codart, const long codcf);
const bool cerca_orf(TDoc_key& dadoc, const long daidriga, const long codfor, TDoc_key& ordf);
const bool cerca_orf(TDoc_key& dadoc, const long daidriga, const long for1, const long for2, TDoc_key& ordf1, TDoc_key& ordf2);
void aggiorna_righe(TDocumento& ordf, const TDocumento& ordc, TRiga_documento& rordc, TRiga_documento& rordf, int idrigac); void aggiorna_righe(TDocumento& ordf, const TDocumento& ordc, TRiga_documento& rordc, TRiga_documento& rordf, int idrigac);
void ordini_fornitore(const TDocumento& ordc, const int nriga, TDocumento& ordf); void ordini_fornitore(const TDocumento& ordc, const int nriga, TDocumento& ordf);
void aggiorna_ordf(const TDocumento& ordc, const int nriga, const TDoc_key& adoc, TOrdf_cache& ca); void aggiorna_ordf(const TDocumento& ordc, const int nriga, const TDoc_key& adoc, TOrdf_cache& ca);
void crea_ordf(const TDocumento& ordc, const long nriga, const long codfor, TOrdf_cache& ca); TDoc_key * crea_ordf(const TDocumento& ordc, const long nriga, const long codfor, TOrdf_cache& ca);
void elimina_ordf(const TDoc_key& adoc, TOrdf_cache& ca); void elimina_ordf(const TDoc_key& adoc, TOrdf_cache& ca);
void elimina_righe(const TDocumento& ordc, TOrdf_cache& ca); void elimina_righe(const TDocumento& ordc, const TAssoc_array & ords, TOrdf_cache& ca);
void elabora_ordini_cliente(); void elabora_ordini_cliente();
@ -278,10 +281,43 @@ const real TCrea_ordini_srm_app::cerca_prezzo(const char* codart, const long cod
} }
//CERCA_ORF: cerco se esistono degli ordini fornitori che arrivano dall'ordine cliente in esame //CERCA_ORF: cerco se esistono degli ordini fornitori che arrivano dall'ordine cliente in esame
const bool TCrea_ordini_srm_app::cerca_orf(TDoc_key& dadoc, const long daidriga, const long for1, const long for2, TDoc_key& ordf1, TDoc_key& ordf2) /*const void TCrea_ordini_srm_app::cerca_orf(TDoc_key& dadoc, const long daidriga, const long codfor, TDoc_key& ordf)
{ {
bool trovato = false; TLocalisamfile rdoc(LF_RIGHEDOC);
rdoc.setkey(4);
rdoc.put(RDOC_DAPROVV, dadoc.provv());
rdoc.put(RDOC_DAANNO, dadoc.anno());
rdoc.put(RDOC_DACODNUM, dadoc.codnum());
rdoc.put(RDOC_DANDOC, dadoc.ndoc());
rdoc.put(RDOC_DAIDRIGA, daidriga);
const int err = rdoc.read();
ordf = TDoc_key(0, "", 0, ' ');
if (err == NOERR)
{
const char provv = rdoc.get_char(RDOC_PROVV);
const int anno = rdoc.get_int(RDOC_ANNO);
const TString8 codnum = rdoc.get(RDOC_CODNUM);
const long ndoc = rdoc.get_long(RDOC_NDOC);
TToken_string key;
key.add(provv);
key.add(anno);
key.add(codnum);
key.add(ndoc);
const long codcf = atol(cache().get(LF_DOC, key, DOC_CODCF));
if (codcf == codfor)
ordf = TDoc_key(anno, codnum, ndoc, provv);
}
} */
//CERCA_ORF: cerco se esistono degli ordini fornitori che arrivano dall'ordine cliente in esame
const bool TCrea_ordini_srm_app::cerca_orf(TDoc_key& dadoc, const long daidriga, const long codfor, TDoc_key& ordf)
{
TString query; TString query;
query << "USE RDOC KEY 4\n" query << "USE RDOC KEY 4\n"
<< "FROM DAPROVV=\"" << dadoc.provv() << "\" DAANNO=" << dadoc.anno() << " DACODNUM=\"" << dadoc.codnum() << "\" DANDOC=" << dadoc.ndoc() << " DAIDRIGA=" << daidriga << "\n" << "FROM DAPROVV=\"" << dadoc.provv() << "\" DAANNO=" << dadoc.anno() << " DACODNUM=\"" << dadoc.codnum() << "\" DANDOC=" << dadoc.ndoc() << " DAIDRIGA=" << daidriga << "\n"
@ -300,16 +336,14 @@ const bool TCrea_ordini_srm_app::cerca_orf(TDoc_key& dadoc, const long daidriga,
const long codcf = atol(cache().get(LF_DOC, key, DOC_CODCF)); const long codcf = atol(cache().get(LF_DOC, key, DOC_CODCF));
if(for1 > 0 && codcf == for1 && ordf1.empty()) if(codcf == codfor)
ordf1 = key; {
ordf = key;
if(for2 > 0 && codcf == for2 && ordf2.empty()) return true;
ordf2 = key; }
trovato = true;
} }
return trovato; return false;
} }
//AGGIORNA_RIGHE: riempie le righe dell'ordine fornitore con i dati corretti //AGGIORNA_RIGHE: riempie le righe dell'ordine fornitore con i dati corretti
@ -362,15 +396,23 @@ void TCrea_ordini_srm_app::aggiorna_ordf(const TDocumento& ordc, const int nriga
} }
//CREA_ORDF: creo un nuovo ordine cliente //CREA_ORDF: creo un nuovo ordine cliente
void TCrea_ordini_srm_app::crea_ordf(const TDocumento& ordc, const long nriga, const long codfor, TOrdf_cache& ca) TDoc_key * TCrea_ordini_srm_app::crea_ordf(const TDocumento& ordc, const long nriga, const long codfor, TOrdf_cache& ca)
{ {
TDocumento& ordf = ca.doc(codfor); TDocumento& ordf = ca.doc(codfor);
TRiga_documento & row = ordf.new_row("05"); TRiga_documento & row = ordf.new_row("05");
TString rif; TString rif;
ordc.tipo().riferimento(ordc, rif); ordc.riferimento(rif);
if (rif.empty())
rif = ordc.tipo().descrizione();
if (rif.full())
rif << ' ';
rif << "n. " << ordc.numero();
rif << " del " << ordc.get(DOC_DATADOC);
row.put(RDOC_DESCR, rif); row.put(RDOC_DESCR, rif);
ordini_fornitore(ordc, nriga, ordf); ordini_fornitore(ordc, nriga, ordf);
return new TDoc_key(ordf.get_int(DOC_ANNO), ordf.get(DOC_CODNUM), ordf.get_long(DOC_NDOC), ordf.get_char(DOC_PROVV));
} }
//ELIMINA_ORDF: aggiorno l'ordine fornitore che esiste già in base alle modifiche fatte sull'ordine cliente attuale //ELIMINA_ORDF: aggiorno l'ordine fornitore che esiste già in base alle modifiche fatte sull'ordine cliente attuale
@ -378,11 +420,11 @@ void TCrea_ordini_srm_app::elimina_ordf(const TDoc_key& adoc, TOrdf_cache& ca)
{ {
TDocumento& ordf = ca.doc(adoc); TDocumento& ordf = ca.doc(adoc);
ordf.remove(); ordf.destroy_rows();
} }
//ELIMINA_RIGHE: elimino le righe dagli ordini fornitore che non compaiono più nell'ordine cliente in esame //ELIMINA_RIGHE: elimino le righe dagli ordini fornitore che non compaiono più nell'ordine cliente in esame
void TCrea_ordini_srm_app::elimina_righe(const TDocumento& ordc, TOrdf_cache& ca) void TCrea_ordini_srm_app::elimina_righe(const TDocumento& ordc, const TAssoc_array & ords, TOrdf_cache& ca)
{ {
const char provv = ordc.get_char(DOC_PROVV); const char provv = ordc.get_char(DOC_PROVV);
const int anno = ordc.get_int(DOC_ANNO); const int anno = ordc.get_int(DOC_ANNO);
@ -402,20 +444,22 @@ void TCrea_ordini_srm_app::elimina_righe(const TDocumento& ordc, TOrdf_cache& ca
{ {
const int daidriga = rdoc.get(RDOC_DAIDRIGA).as_int(); const int daidriga = rdoc.get(RDOC_DAIDRIGA).as_int();
const int nriga = rdoc.get(RDOC_NRIGA).as_int(); const int nriga = rdoc.get(RDOC_NRIGA).as_int();
TDoc_key kordf(rdoc.get(RDOC_ANNO).as_int(), rdoc.get(RDOC_CODNUM).as_string(), rdoc.get(RDOC_NDOC).as_int(), rdoc.get(RDOC_PROVV).as_string()[0]);
bool trovato = false; bool trovato = false;
for(int i = 1; i <= ordc.rows(); i++) if (ords.is_key(kordf))
{ {
TRiga_documento rdoc = ordc[i]; for(int i = 1; i <= ordc.rows(); i++)
{
TRiga_documento rdoc = ordc[i];
if(daidriga == rdoc.get_long(RDOC_IDRIGA)) if(daidriga == rdoc.get_long(RDOC_IDRIGA))
trovato = true; trovato = true;
} }
}
if(!trovato) if (!trovato)
{ {
TDoc_key kordf(rdoc.get(RDOC_ANNO).as_int(), rdoc.get(RDOC_CODNUM).as_string(), rdoc.get(RDOC_NDOC).as_int(), rdoc.get(RDOC_PROVV).as_string()[0]);
TDocumento& ordf = ca.doc(kordf); TDocumento& ordf = ca.doc(kordf);
ordf.destroy_row(nriga, true); ordf.destroy_row(nriga, true);
} }
@ -431,10 +475,11 @@ void TCrea_ordini_srm_app::elabora_ordini_cliente()
const int anno = ini.get_int(DOC_ANNO, para); const int anno = ini.get_int(DOC_ANNO, para);
const TString& codnum = ini.get(DOC_CODNUM, para); const TString& codnum = ini.get(DOC_CODNUM, para);
const long ndoc = ini.get_long(DOC_NDOC, para); const long ndoc = ini.get_long(DOC_NDOC, para);
const bool delete_docs = ini.get(DOC_NOTE, para) == "DELETING";
TDoc_key dadoc(anno, codnum, ndoc, provv); TDoc_key dadoc(anno, codnum, ndoc, provv);
TDoc_key ordf1; TDoc_key ordf;
TDoc_key ordf2; TAssoc_array ords;
TDocumento ordc(provv, anno, codnum, ndoc); TDocumento ordc(provv, anno, codnum, ndoc);
@ -450,39 +495,44 @@ void TCrea_ordini_srm_app::elabora_ordini_cliente()
const long codfor2 = rordc.get_long(RDOC_CODAGG2); //da prendere dalla riga const long codfor2 = rordc.get_long(RDOC_CODAGG2); //da prendere dalla riga
const int idrigac = rordc.get_int(RDOC_IDRIGA); const int idrigac = rordc.get_int(RDOC_IDRIGA);
if (ordc.stato() == ' ') if (codfor1 > 0)
{ {
if(cerca_orf(dadoc, idrigac, codfor1, codfor2, ordf1, ordf2)) if(cerca_orf(dadoc, idrigac, codfor1, ordf))
{ {
if(codfor1 > 0) if (delete_docs)
elimina_ordf(ordf1, ca); elimina_ordf(ordf, ca);
else
if(codfor2 > 0) aggiorna_ordf(ordc, i, ordf, ca);
elimina_ordf(ordf2, ca); ords.add(ordf, ordf);
}
}
else
{
if(cerca_orf(dadoc, idrigac, codfor1, codfor2, ordf1, ordf2))
{
if(codfor1 > 0)
aggiorna_ordf(ordc, i, ordf1, ca);
if(codfor2 > 0)
aggiorna_ordf(ordc, i, ordf2, ca);
} }
else else
{ {
if(codfor1 > 0) TDoc_key * ordf = crea_ordf(ordc, i, codfor1, ca);
crea_ordf(ordc, i, codfor1, ca);
ords.add(*ordf, ordf);
}
}
if (codfor2 > 0)
{
if(codfor2 > 0) if(cerca_orf(dadoc, idrigac, codfor2, ordf))
crea_ordf(ordc, i, codfor2, ca); {
if (delete_docs)
elimina_ordf(ordf, ca);
else
aggiorna_ordf(ordc, i, ordf, ca);
ords.add(ordf, ordf);
}
else
{
TDoc_key * ordf = crea_ordf(ordc, i, codfor2, ca);
ords.add(*ordf, ordf);
} }
} }
} }
elimina_righe(ordc, ca); elimina_righe(ordc, ords, ca);
ca.destroy(); ca.destroy();
} }
@ -515,6 +565,9 @@ bool TCrea_ordini_srm_app::load_ini(bool check)
void TCrea_ordini_srm_app::main_loop() //definizione della member function main_loop, della classe TCrea_ordini_srm_app void TCrea_ordini_srm_app::main_loop() //definizione della member function main_loop, della classe TCrea_ordini_srm_app
{ {
#ifdef DBG
message_box("start program");
#endif
TString sw(argv(2)); sw.upper(); TString sw(argv(2)); sw.upper();
const bool chk_doc = sw == "-V"; const bool chk_doc = sw == "-V";