Patch level :10.0 910

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
HardY - tamente!


git-svn-id: svn://10.65.10.50/branches/R_10_00@21530 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2011-01-27 15:16:23 +00:00
parent cb25cd552c
commit 0289403dce
7 changed files with 314 additions and 7 deletions

View File

@ -3,7 +3,7 @@
#include "ha0.h"
#define usage "Error - usage : %s -{1|2|3|4}"
#define usage "Error - usage : %s -{0|1|2|3|4}"
int main(int argc,char** argv)
@ -13,6 +13,9 @@ int main(int argc,char** argv)
switch (r)
{
case 0:
rt = ha0100(argc, argv) ; break; //gestore tabelle modulo HA
break;
case 1:
rt = ha0200(argc, argv) ; break; //configurazione modulo
break;

View File

@ -1,3 +1,4 @@
int ha0100(int argc, char* argv[]);
int ha0200(int argc, char* argv[]);
int ha0300(int argc, char* argv[]);
int ha0400(int argc, char* argv[]);

74
ha/ha0100.cpp Executable file
View File

@ -0,0 +1,74 @@
// gestione tabelle di modulo hardy
#include <automask.h>
#include <modtbapp.h>
#include <tabutil.h>
#include "hatbcau.h"
///////////////////////////////////////////////////////////
// Maschera generica di gestione tabelle hardy
///////////////////////////////////////////////////////////
class THA_table_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field &o, TField_event e, long jolly);
public:
THA_table_mask(const char* name) : TAutomask(name) {}
};
bool THA_table_mask::on_field_event(TOperable_field &o, TField_event e, long jolly)
{
return true;
}
///////////////////////////////////////////////////////////
// Applicazione generica di gestione tabelle hardy
///////////////////////////////////////////////////////////
// applicazione per la gestione delle tabelle di lavanderia
class THA_table_app : public TTable_module_application
{
protected: // TRelation_application
virtual TMask* user_create_mask();
virtual int write(const TMask& m);
virtual int rewrite(const TMask& m);
public:
};
// Ridefinire questo metodo per le eventuali maschere speciali
// che abbiano controlli speciali da effettuare nella on_field_event
TMask* THA_table_app::user_create_mask()
{
const TString4 name = get_relation()->file(0).name();
if (name == "???")
return new THA_table_mask("???");
// Le maschere normali sono gia' gestite dalla TTable_module_application
return TTable_module_application::user_create_mask();
}
// Ridefinizione del metodo write
int THA_table_app::write(const TMask& m)
{
const TString4 name = get_relation()->file(0).name();
return TTable_module_application::write(m);
}
// Ridefinizione del metodo rewrite
int THA_table_app::rewrite(const TMask& m)
{
const TString4 name = get_relation()->file(0).name();
return TTable_module_application::rewrite(m);
}
int ha0100(int argc, char* argv[])
{
THA_table_app a;
a.run(argc, argv, TR("Tabella Caffe' Hardy"));
return 0;
}

View File

@ -216,6 +216,14 @@ THardy_upload_recordset::THardy_upload_recordset(const TFilename& filename)
add_trc_field("VC", CLI_COFI, T_X, 128, 16); //x
//Tipo record RC
//--------------
add_trc_field("RC", "TipoRecord", T_X, 1, 2); //x
add_trc_field("RC", "CodiceTerminale", T_N, 3, 3); //x
add_trc_field("RC", "CodiceArticolo", T_X, 6, 5); //x
add_trc_field("RC", "Quantita", T_Nv2N, 11, 7); //x
add_trc_field("RC", "DataCarico", T_X, 18, 6); //x
TText_recordset::load_file(filename);
}
@ -256,6 +264,8 @@ protected:
//metodi di basso livello
const TString& check_agente(TString& codice_terminale, TLog_report& log);
const TString& check_articolo(TString& codart, TLog_report& log);
void check_magazzino(const TString& codmag_age, TLog_report& log);
void check_causale(TString& codcaus, TLog_report& log);
//metodi di alto livello
void elabora_SU(THardy_upload_recordset& recset, TLog_report& log);
@ -263,6 +273,7 @@ protected:
void elabora_VC(THardy_upload_recordset& recset, TLog_report& log);
void elabora_TF(THardy_upload_recordset& recset, TLog_report& log);
void elabora_SI(THardy_upload_recordset& recset, TLog_report& log);
void elabora_RC(THardy_upload_recordset& recset, TLog_report& log);
void elabora(const TMask& mask);
@ -308,6 +319,19 @@ const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log)
return rec_anamag.get(ANAMAG_DESCR);
}
void TUpload2Campo::check_magazzino(const TString& codmag_age, TLog_report& log)
{
const TString& codmag_campo = cache().get("MAG", codmag_age, "CODTAB");
if (codmag_campo != codmag_age)
{
_can_write = false;
TString msg;
msg << "Codice magazzino " << codmag_age << " sconosciuto su Campo";
log.log(2, msg);
}
}
void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log)
{
const TString& cod_term = recset.get("CodiceTerminale").as_string();
@ -340,6 +364,7 @@ void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log
TString4 codice_terminale = recset.get("CodiceTerminale").as_string();
const TString& codice_agente = check_agente(codice_terminale, log);
const TString8 cod_magazzino = cache().get(LF_AGENTI, codice_agente, AGE_CODMAG);
check_magazzino(cod_magazzino, log);
const long curr_movmag = recset.get("NumeroDoc").as_int();
const TString& str_data_mov = recset.get("DataMov").as_string();
@ -360,7 +385,18 @@ void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log
movmag.put(MOVMAG_EXNUMDOC, curr_movmag);
movmag.put(MOVMAG_EXDATADOC, data_mov);
movmag.put(MOVMAG_DESCR, descr);
//movmag.put(MOVMAG_CODCAUS, codcaus);
//la causale va trascodificata con l'apposita tabella &CAU
const TString& caus_term = recset.get("CausaleMov").as_string();
const TString& codcaus = cache().get("&CAU", caus_term, "S7");
if (codcaus.empty())
{
_can_write = false;
TString msg;
msg << "Causale movimento " << caus_term << " non codificata";
log.log(2, msg);
}
movmag.put(MOVMAG_CODCAUS, codcaus);
bool go_on = true;
// righe movimento di magazzino
@ -395,7 +431,7 @@ void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log
recset.move_prev(); //allora torna indietro di un record per riposizionarsi sull'ultimo non letto
go_on = false;
}
}
} //while(go_on)...
//incredibilmente arriva in fondo
@ -435,6 +471,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
TString4 codice_terminale = recset.get("CodiceTerminale").as_string();
const TString& codice_agente = check_agente(codice_terminale, log);
const TString8 codmag = cache().get(LF_AGENTI, codice_agente, AGE_CODMAG);
check_magazzino(codmag, log);
//2) Testata documento
//genera una simpatico documento di cui raccatta la chiave
@ -544,7 +581,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
rigadoc.put(RDOC_CHECKED, "X");
rigadoc.put(RDOC_DESCR, descr);
//3b) umart
//3b) umart e qta
const TString& umqta = recset.get(RDOC_UMQTA).as_string();
TLocalisamfile file_umart(LF_UMART);
file_umart.setkey(2);
@ -560,7 +597,6 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
}
rigadoc.put(RDOC_UMQTA, umqta);
real qta = recset.get("Qta[int]").as_real();
qta += recset.get("Qta[dec]").as_real() / CENTO;
rigadoc.put(RDOC_QTA, qta);
@ -581,7 +617,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
rigadoc.put(RDOC_SCONTO, str_sconto);
//prezzi
real prezzo_lordo = recset.get(RDOC_PREZZO).as_real();
prezzo_lordo /= 1000;
rigadoc.put(RDOC_PREZZO, prezzo_lordo);
@ -639,9 +675,119 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
log.log(0, "");
}
void TUpload2Campo::elabora_RC(THardy_upload_recordset& recset, TLog_report& log)
{
//1) codice terminale (lungo 3) e codice agente (lungo 5)
TString4 codice_terminale = recset.get("CodiceTerminale").as_string();
const TString& codice_agente = check_agente(codice_terminale, log);
const TRectype& rec_agente = cache().get(LF_AGENTI, codice_agente);
const TString8 codmag = rec_agente.get(AGE_CODMAG);
const long codcf = rec_agente.get_long(AGE_CODFORN); //cliente (legato all'agente)
//2) Testata documento
const TString& str_datadoc = recset.get("DataCarico").as_string();
const TDate datadoc = upload_format_date6(str_datadoc);
const int anno = datadoc.year();
//2a) numerazione e tipo documento
TConfig hardy(CONFIG_DITTA, "ha");
const TString4 codnum = hardy.get("CarDocNum");
const TString4 tipodoc = hardy.get("CarDoctip");
const TString4 stato = hardy.get("CarDocSta");
//2b) documento vero e proprio (stessi campi del caso tipo record = TF)
TDocumento doc;
doc.put(DOC_CODNUM, codnum);
doc.put(DOC_ANNO, anno);
doc.put(DOC_PROVV, "D");
doc.put(DOC_TIPODOC, tipodoc);
doc.put(DOC_STATO, stato);
doc.put(DOC_DATADOC, datadoc);
doc.put(DOC_TIPOCF, "C");
doc.put(DOC_CODCF, codcf);
TTipo_documento td(tipodoc);
const TString& caus_movmag = td.caus_mov();
doc.put(DOC_CAUSMAG, caus_movmag);
TCli_for clifor('C', codcf);
clifor.cli2doc(doc);
doc.destroy_rows();
// righe documento di carico
bool go_on = true;
//scansione delle righe documento su record RC
while (go_on)
{
//3) crea le righe (legge tutti i record di tipo RC successivi)
TRiga_documento& rigadoc = doc.new_row("01");
//serie delle put sulla riga documento; ricordiamo che la chiave della riga viene riempita dalla new_row
//3a) articolo
TString8 codart = recset.get("CodiceArticolo").as_string();
const TString& descr = check_articolo(codart, log);
rigadoc.put(RDOC_CODART, codart);
rigadoc.put(RDOC_CODARTMAG, codart);
rigadoc.put(RDOC_CHECKED, "X");
rigadoc.put(RDOC_DESCR, descr);
TToken_string key_umart;
key_umart.add(codart);
key_umart.add(1);
const TString& um = cache().get(LF_UMART, key_umart, UMART_UM);
rigadoc.put(RDOC_UMQTA, um);
const real qta = recset.get("Quantita").as_real() / CENTO;
rigadoc.put(RDOC_QTA, qta);
rigadoc.put(RDOC_CODMAG, codmag);
//quando non trova un RC significa che le righe sono finite!
go_on = recset.move_next();
if (go_on && (recset.get("TipoRecord").as_string() != "RC"))
{
recset.move_prev(); //allora torna indietro di un record per riposizionarsi sull'ultimo non letto
go_on = false;
}
}
//incredibilmente arriva in fondo
TString msg;
msg << anno << "-" << codnum << " Terminale: " << codice_terminale << " Cliente: " << codcf;
//se può scrivere...
if (_can_write)
{
int err = doc.write();
if (err == NOERR)
{
msg.insert("Registrato documento di carico: ", 0);
log.log(0, msg);
}
else
{
msg.insert("Impossibile registrare documento di carico: ", 0);
log.log(2, msg);
}
}
else //..sennò avverte e basta
{
msg.insert("Controllato documento di carico: ", 0);
log.log(0, msg);
}
log.log(0, "");
}
void TUpload2Campo::elabora(const TMask& mask)
{
TToken_string tipi_record("SU|TF|RF|SI|BR|VC");
TToken_string tipi_record("SU|TF|RF|SI|BR|VC|RC");
//creazione del filename del file da importare
TFilename src_file = mask.get(F_PATH);
@ -701,6 +847,9 @@ void TUpload2Campo::elabora(const TMask& mask)
case 5: //tipo record: VC (Variazioni Cliente)
//elabora_VC(recset, log); //non serve! gli agenti non possono immettere clienti da terminale!
break;
case 6: //tipo record: RC (Richiesta Carico)
elabora_RC(recset, log);
break;
default: //se il tipo record non esiste nella lista dei tipi record si incazza e lo scrive!
{
TString msg;

View File

@ -34,6 +34,7 @@ Module = 46
Flags = "F"
Item_01 = "Esportazione archivi formato txt", "ha1 -1", "F"
Item_02 = "Importazione dati da file", "ha1 -2", "F"
Item_03 = "Tabella codifica causali", "ha0 -0 &CAU", ""
[HAMENU_005]
Caption = "Servizi"

5
ha/hatbcau.h Executable file
View File

@ -0,0 +1,5 @@
//campi tabella &CAU del modulo HA
#define F_CODICE_TERMINALE 201
#define F_DESCR_TERMINALE 202
#define F_CODICE_CAMPO 203
#define F_DESCR_CAMPO 204

74
ha/hatbcau.uml Executable file
View File

@ -0,0 +1,74 @@
#include "hatbcau.h"
PAGE "Causali Terminalini - Campo" -1 -1 78 10
GROUPBOX DLG_NULL 76 4
BEGIN
PROMPT 1 1 "@bTerminalini"
END
NUMBER F_CODICE_TERMINALE 2
BEGIN
PROMPT 2 2 "Codice "
FLAGS "U"
USE &CAU
INPUT CODTAB F_CODICE_TERMINALE
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODICE_TERMINALE CODTAB
OUTPUT F_DESCR_TERMINALE S0
CHECKTYPE REQUIRED
FIELD CODTAB
KEY 1
END
STRING F_DESCR_TERMINALE 50
BEGIN
PROMPT 2 3 "Descrizione "
USE &CAU KEY 2
INPUT S0 F_DESCR_TERMINALE
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_CODICE_TERMINALE
FIELD S0
KEY 2
CHECKTYPE NORMAL
END
GROUPBOX DLG_NULL 76 4
BEGIN
PROMPT 1 5 "@bCampo"
END
STRING F_CODICE_CAMPO 4
BEGIN
PROMPT 2 6 "Codice "
FLAGS "U"
USE %CAU
INPUT CODTAB F_CODICE_CAMPO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODICE_CAMPO CODTAB
OUTPUT F_DESCR_CAMPO S0
CHECKTYPE REQUIRED
FIELD S7
END
STRING F_DESCR_CAMPO 50
BEGIN
PROMPT 2 7 "Descrizione "
USE %CAU KEY 2
INPUT S0 F_DESCR_CAMPO
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_CODICE_CAMPO
CHECKTYPE NORMAL
END
ENDPAGE
TOOLBAR "" 0 0 0 2
#include "relapbar.h"
ENDPAGE
ENDMASK