Patch level : 10.0 patch 710

Files correlati     : lv0300a.msk lvlib lv3
Ricompilazione Demo : [ ]
Commento            :
Aggiunto il programma di generazione inventario da terminale


git-svn-id: svn://10.65.10.50/trunk@20360 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca83 2010-04-20 13:01:14 +00:00
parent 0a7f913e2d
commit 8700b4dbd4
9 changed files with 1169 additions and 78 deletions

View File

@ -32,62 +32,67 @@
#define F_TIPODOC_ORC 218
#define F_DESTIPODOC_ORC 219
#define F_BUONIRIT 220
#define F_BUONIANT 221
#define F_BUONIPREL 222
#define F_DOCCONG 223
#define F_DOCDOT 224
#define F_CODNUM_INV 220
#define F_DESNUM_INV 221
#define F_TIPODOC_INV 222
#define F_DESTIPODOC_INV 223
#define F_CAUSLAV 225
#define F_CAUSLAVDESC 226
#define F_CAULVRITDT 227
#define F_CAULVRITDTDE 228
#define F_CAUCARMAG 229
#define F_CAUCARMAGDE 230
#define F_CAUSCARMAG 231
#define F_CAUSCARMAGDE 232
#define F_BUONIRIT 224
#define F_BUONIANT 225
#define F_BUONIPREL 226
#define F_DOCCONG 227
#define F_DOCDOT 228
#define F_CODMAG 233
#define F_DESMAG 234
#define F_CODMAGN 235
#define F_DESMAGN 236
#define F_CODMAGC 237
#define F_DESMAGC 238
#define F_CODMAGP 239
#define F_DESMAGP 240
#define F_CODMAGCL 241
#define F_DESMAGCL 242
#define F_CAUSLAV 229
#define F_CAUSLAVDESC 230
#define F_CAULVRITDT 231
#define F_CAULVRITDTDE 232
#define F_CAUCARMAG 233
#define F_CAUCARMAGDE 234
#define F_CAUSCARMAG 235
#define F_CAUSCARMAGDE 236
#define F_UNICONT 243
#define F_QTAMODI 244
#define F_AUTGIRI 245
#define F_ORDGIRI 246
#define F_DATAFISSA 247
#define F_AGGCONG 248
#define F_PERARR 249
#define F_RIFOR 250
#define F_ARTCANFIS 251
#define F_GESTSACA 252
#define F_ALMANAC 253
#define F_USEINDSP 254
#define F_DATABCON 255
#define F_CONDOM 256
#define F_CODARTFIX 257
#define F_DESARTFIX 258
#define F_CODARTCAFIX 259
#define F_DESARTCAFIX 260
#define F_TIPOPR 261
#define F_UMPESO 262
#define F_CODMAG 237
#define F_DESMAG 238
#define F_CODMAGN 239
#define F_DESMAGN 240
#define F_CODMAGC 241
#define F_DESMAGC 242
#define F_CODMAGP 243
#define F_DESMAGP 244
#define F_CODMAGCL 245
#define F_DESMAGCL 246
#define F_PATH_CON 263
#define F_SHEET_NAME 264
#define F_PATH_MAN 265
#define F_PATH_LAVA 266
#define F_PATH_PUL 267
#define F_FILE_PUL 268
#define F_UNICONT 247
#define F_QTAMODI 248
#define F_AUTGIRI 249
#define F_ORDGIRI 250
#define F_DATAFISSA 251
#define F_AGGCONG 252
#define F_PERARR 253
#define F_RIFOR 254
#define F_ARTCANFIS 255
#define F_GESTSACA 256
#define F_ALMANAC 257
#define F_USEINDSP 258
#define F_DATABCON 259
#define F_CONDOM 260
#define F_CODARTFIX 261
#define F_DESARTFIX 262
#define F_CODARTCAFIX 263
#define F_DESARTCAFIX 264
#define F_TIPOPR 265
#define F_UMPESO 266
#define F_CODARTCOFIX 269
#define F_DESARTCOFIX 270
#define F_PATH_CON 267
#define F_SHEET_NAME 268
#define F_PATH_MAN 269
#define F_PATH_LAVA 270
#define F_PATH_PUL 271
#define F_FILE_PUL 272
#define F_CODARTCOFIX 273
#define F_DESARTCOFIX 274
#define F_BACKUP 300

View File

@ -121,12 +121,12 @@ END
TEXT -1
BEGIN
PROMPT 1 4 "@bFatture"
PROMPT 1 3 "@bFatture"
END
STRING F_CODNUM_FAT 4
BEGIN
PROMPT 2 5 "Numerazione "
PROMPT 2 4 "Numerazione "
FIELD NUM_FAT
HELP "Codice numerazione"
USE %NUM
@ -142,7 +142,7 @@ END
STRING F_DESNUM_FAT 50
BEGIN
PROMPT 24 5 ""
PROMPT 24 4 ""
HELP "Descrizione Numerazione"
USE %NUM KEY 2
INPUT S0 F_DESNUM_FAT
@ -153,7 +153,7 @@ END
STRING F_TIPODOC_FAT 4
BEGIN
PROMPT 2 6 "Tipo "
PROMPT 2 5 "Tipo "
FIELD TIPODOC_FAT
HELP "Codice tipo documento"
USE %TIP
@ -168,7 +168,7 @@ END
STRING F_DESTIPODOC_FAT 50
BEGIN
PROMPT 24 6 ""
PROMPT 24 5 ""
HELP "Descrizione tipo documento"
USE %TIP KEY 2
INPUT S0 F_DESTIPODOC_FAT
@ -179,13 +179,13 @@ END
BOOLEAN F_RIFTEST
BEGIN
PROMPT 2 7 "Scrivi riferimenti in testata documento"
PROMPT 2 6 "Scrivi riferimenti in testata documento"
FIELD RifTest
END
STRING F_FELAB_DIF 8
BEGIN
PROMPT 2 8 "Tipo fatt. definitiva"
PROMPT 2 7 "Tipo fatt. definitiva"
FLAG "U"
USE %ELD SELECT I0==2
INPUT CODTAB F_FELAB_DIF
@ -199,7 +199,7 @@ END
STRING F_FELAB_PRO 8
BEGIN
PROMPT 45 8 "Tipo fatt. di prova "
PROMPT 45 7 "Tipo fatt. di prova "
FLAG "U"
USE %ELD SELECT I0==2
INPUT CODTAB F_FELAB_PRO
@ -213,12 +213,12 @@ END
TEXT -1
BEGIN
PROMPT 1 10 "@bOrdini fornitori"
PROMPT 1 8 "@bOrdini fornitori"
END
STRING F_CODNUM_ORF 4
BEGIN
PROMPT 2 11 "Numerazione "
PROMPT 2 9 "Numerazione "
FIELD NUM_ORF
HELP "Codice numerazione"
USE %NUM
@ -234,7 +234,7 @@ END
STRING F_DESNUM_ORF 50
BEGIN
PROMPT 24 11 ""
PROMPT 24 9 ""
HELP "Descrizione Numerazione"
USE %NUM KEY 2
INPUT S0 F_DESNUM_ORF
@ -245,7 +245,7 @@ END
STRING F_TIPODOC_ORF 4
BEGIN
PROMPT 2 12 "Tipo "
PROMPT 2 10 "Tipo "
FIELD TIPODOC_ORF
HELP "Codice tipo documento"
USE %TIP
@ -260,7 +260,7 @@ END
STRING F_DESTIPODOC_ORF 50
BEGIN
PROMPT 24 12 ""
PROMPT 24 10 ""
HELP "Descrizione tipo documento"
USE %TIP KEY 2
INPUT S0 F_DESTIPODOC_ORF
@ -271,12 +271,12 @@ END
TEXT -1
BEGIN
PROMPT 1 14 "@bOrdini clienti"
PROMPT 1 11 "@bOrdini clienti"
END
STRING F_CODNUM_ORC 4
BEGIN
PROMPT 2 15 "Numerazione "
PROMPT 2 12 "Numerazione "
FIELD NUM_ORC
HELP "Codice numerazione"
USE %NUM
@ -292,7 +292,7 @@ END
STRING F_DESNUM_ORC 50
BEGIN
PROMPT 24 15 ""
PROMPT 24 12 ""
HELP "Descrizione Numerazione"
USE %NUM KEY 2
INPUT S0 F_DESNUM_ORC
@ -303,7 +303,7 @@ END
STRING F_TIPODOC_ORC 4
BEGIN
PROMPT 2 16 "Tipo "
PROMPT 2 13 "Tipo "
FIELD TIPODOC_ORC
HELP "Codice tipo documento"
USE %TIP
@ -318,7 +318,7 @@ END
STRING F_DESTIPODOC_ORC 50
BEGIN
PROMPT 24 16 ""
PROMPT 24 13 ""
HELP "Descrizione tipo documento"
USE %TIP KEY 2
INPUT S0 F_DESTIPODOC_ORC
@ -329,12 +329,71 @@ END
TEXT -1
BEGIN
PROMPT 1 18 "@bCausali di default"
PROMPT 1 14 "@bInventari pacchi"
END
STRING F_CODNUM_INV 4
BEGIN
PROMPT 2 15 "Numerazione "
FIELD NUM_INV
HELP "Codice numerazione"
USE %NUM
INPUT CODTAB F_CODNUM_INV
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODNUM_INV CODTAB
OUTPUT F_DESNUM_INV S0
CHECKTYPE REQUIRED
FLAGS "UPA"
WARNING "Numerazione assente"
END
STRING F_DESNUM_INV 50
BEGIN
PROMPT 24 15 ""
HELP "Descrizione Numerazione"
USE %NUM KEY 2
INPUT S0 F_DESNUM_INV
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_CODNUM_INV
END
STRING F_TIPODOC_INV 4
BEGIN
PROMPT 2 16 "Tipo "
FIELD TIPODOC_INV
HELP "Codice tipo documento"
USE %TIP
INPUT CODTAB F_TIPODOC_INV
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_TIPODOC_INV CODTAB
OUTPUT F_DESTIPODOC_INV S0
CHECKTYPE REQUIRED
FLAGS "UP"
END
STRING F_DESTIPODOC_INV 50
BEGIN
PROMPT 24 16 ""
HELP "Descrizione tipo documento"
USE %TIP KEY 2
INPUT S0 F_DESTIPODOC_INV
DISPLAY "Descrizione@50" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_TIPODOC_ORC
END
TEXT -1
BEGIN
PROMPT 1 17 "@bCausali di default"
END
STRING F_CAUSLAV 3
BEGIN
PROMPT 2 19 "Cau. Rit/Con "
PROMPT 2 18 "Cau. Rit/Con "
USE &CAU
INPUT CODTAB F_CAUSLAV
DISPLAY "Codice" CODTAB
@ -347,7 +406,7 @@ END
STRING F_CAUSLAVDESC 48
BEGIN
PROMPT 26 19 ""
PROMPT 26 18 ""
USE &CAU KEY 2
INPUT S0 F_CAUSLAVDESC
DISPLAY "Descrizione@50" S0
@ -358,7 +417,7 @@ END
STRING F_CAULVRITDT 3
BEGIN
PROMPT 2 20 "Cau. Rit. dt. tmp"
PROMPT 2 19 "Cau. Rit. dt. tmp"
USE &CAU
INPUT CODTAB F_CAULVRITDT
DISPLAY "Codice" CODTAB
@ -371,7 +430,7 @@ END
STRING F_CAULVRITDTDE 48
BEGIN
PROMPT 26 20 ""
PROMPT 26 19 ""
USE &CAU KEY 2
INPUT S0 F_CAUSLAVDESC
DISPLAY "Descrizione@50" S0
@ -382,7 +441,7 @@ END
STRING F_CAUCARMAG 5
BEGIN
PROMPT 2 21 "Cau. Car. Mag. "
PROMPT 2 20 "Cau. Car. Mag. "
USE %CAU KEY 1
INPUT CODTAB F_CAUCARMAG
DISPLAY "Codice" CODTAB
@ -395,7 +454,7 @@ END
STRING F_CAUCARMAGDE 50 46
BEGIN
PROMPT 28 21 ""
PROMPT 28 20 ""
USE %CAU KEY 2
INPUT S0 F_CAUCARMAGDE
DISPLAY "Descrizione@50" S0
@ -406,7 +465,7 @@ END
STRING F_CAUSCARMAG 5
BEGIN
PROMPT 2 22 "Cau. Scar. Mag. "
PROMPT 2 21 "Cau. Scar. Mag. "
USE %CAU KEY 1
INPUT CODTAB F_CAUSCARMAG
DISPLAY "Codice" CODTAB
@ -419,7 +478,7 @@ END
STRING F_CAUSCARMAGDE 50 46
BEGIN
PROMPT 28 22 ""
PROMPT 28 21 ""
USE %CAU KEY 2
INPUT S0 F_CAUSCARMAGDE
DISPLAY "Descrizione@50" S0

View File

@ -13,6 +13,7 @@ int main(int argc, char** argv)
case 3: lv3400(argc, argv); break; // gestione manuale buoni di prelievo lv3400
case 4: lv3500(argc, argv); break; // sitauzione a mag. di un art. lv3500
case 5: lv3600(argc, argv); break; // invio dati a contapezzi Montanari lv3600
case 6: lv3700(argc, argv); break; // inventario da terminale lv3700
default: lv3100(argc, argv); break; // gestione manuale bolle lv3100
}
return 0;

View File

@ -7,5 +7,6 @@ int lv3300(int argc, char* argv[]);
int lv3400(int argc, char* argv[]);
int lv3500(int argc, char* argv[]);
int lv3600(int argc, char* argv[]);
int lv3700(int argc, char* argv[]);
#endif // __LV3_H

837
lv/lv3700.cpp Executable file
View File

@ -0,0 +1,837 @@
#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include "lvlib.h"
#include "lv3700a.h"
///////////////////////////////////
//// TDOC_INVENTARIO_ROW ////
///////////////////////////////////
//Classe TDoc_inventario_row
class TDoc_inventario_row: public TObject
{
TRiga_documento& _rinv;
public:
const TString& codart() const;
const TString& desart() const;
const real qta() const;
const TString& um() const;
const int num_pacchi() const;
const TToken_string& cod_pacchi() const;
const TString& magazzino() const;
const TString& magazzinoc() const;
void set_codart(const char* codart);
void set_desart(const TString& desart);
void set_qta(const real qta);
void set_um(const char* um);
void set_num_pacchi(const int numpacchi);
void set_cod_pacchi(const char* codpacchi);
void set_magazzino(const char* mag);
void set_magazzinoc(const char* magc);
TDoc_inventario_row(TRiga_documento& rinv):_rinv(rinv){}
};
//CODART: metodo che restituisce il codice articolo della riga documento
const TString& TDoc_inventario_row::codart() const
{
return _rinv.get(RDOC_CODART);
}
//DESART: metodo che restiruisce la descrizione dell'articolo
const TString& TDoc_inventario_row::desart() const
{
TString& str = get_tmp_string();
str = _rinv.get(RDOC_DESCR);
if (_rinv.get_bool(RDOC_DESCLUNGA))
str << _rinv.get(RDOC_DESCEST);
return str;
}
//QTA: metodo che restiruisce la quantità salvata sulla riga
const real TDoc_inventario_row::qta() const
{
return _rinv.get_real(RDOC_QTA);
}
//UM: metodo che restiruisce l'unità di misura utilizzata sulla riga documento
const TString& TDoc_inventario_row::um() const
{
return _rinv.get(RDOC_UMQTA);
}
//NUM_PACCHI: metodo che resituisce il numero dei pacchi presenti per quell'articolo
const int TDoc_inventario_row::num_pacchi() const
{
return _rinv.get_int(RDOC_NCOLLI);
}
//COD_PACCHI: metodo che restiuisce l'elenco dei pacchi salvati su quella riga
const TToken_string& TDoc_inventario_row::cod_pacchi() const
{
TToken_string& tmp = get_tmp_string();
tmp = _rinv.get("CODPACCHI");
return tmp;
}
//MAGAZZINO: metodo che restituisce il codice del magazzino/deposito
const TString& TDoc_inventario_row::magazzino() const
{
return _rinv.get(RDOC_CODMAG);
}
//MAGAZZINOC: metodo che restituisce il codice del magazzino/deposito collegato
const TString& TDoc_inventario_row::magazzinoc() const
{
return _rinv.get(RDOC_CODMAGC);
}
//SET_CODART: metodo che setta il codice articolo
void TDoc_inventario_row::set_codart(const char* codart)
{
_rinv.put(RDOC_CODART, codart);
_rinv.put(RDOC_CODARTMAG, codart);
}
//SET_DESART: metodo che setta la descrizione
void TDoc_inventario_row::set_desart(const TString& desart)
{
if (desart.len() > 50)
{
_rinv.put(RDOC_DESCR, desart.left(50));
_rinv.put(RDOC_DESCLUNGA, true);
_rinv.put(RDOC_DESCEST, desart.mid(50));
}
else
_rinv.put(RDOC_DESCR, desart);
}
//SET_QTA_RITIRATA: metodo che setta la quantità ritirata sulla riga
void TDoc_inventario_row::set_qta(const real qta)
{
_rinv.put(RDOC_QTA, qta);
}
//SET_UM: metodo che setta l'unità di misura
void TDoc_inventario_row::set_um(const char* um)
{
_rinv.put(RDOC_UMQTA, um);
}
//SET_NUM_PACCHI: metodo che setta il numero dei pacchi
void TDoc_inventario_row::set_num_pacchi(const int numpacchi)
{
_rinv.put(RDOC_NCOLLI, numpacchi);
}
//SET_COD_PACCHI: metodo che setta l'elenco dei pacchi salvati su quella riga
void TDoc_inventario_row::set_cod_pacchi(const char* codpacchi)
{
_rinv.put("CODPACCHI", codpacchi);
}
//SET_MAGAZZINO: metodo che setta il codice del magazzino/deposito
void TDoc_inventario_row::set_magazzino(const char* mag)
{
_rinv.put(RDOC_CODMAG, mag);
}
//SET_MAGAZZINOC: metodo che setta il codice del magazzino/deposito collegato
void TDoc_inventario_row::set_magazzinoc(const char* magc)
{
_rinv.put(RDOC_CODMAGC, magc);
}
///////////////////////////////
//// TDOC_INVENTARIO ////
///////////////////////////////
//Classe TDoc_inventario
class TDoc_inventario: public TDocumento
{
public:
const TToken_string& chiave() const;
const TDate datadoc() const;
TDoc_inventario_row find_or_create_row(const char* codart);
TDoc_inventario& operator= (const TDoc_inventario dinv){dinv;}
TDoc_inventario(TDoc_key& key): TDocumento(key.provv(), key.anno(), key.codnum(), key.ndoc()){};
TDoc_inventario(TDoc_inventario& dinv): TDocumento(dinv){};
};
//CHIAVE: metodo che restituisce la chiave del documento
const TToken_string& TDoc_inventario::chiave() const
{
TToken_string& k = get_tmp_string();
k.add(get(DOC_PROVV));
k.add(get(DOC_ANNO));
k.add(get(DOC_CODNUM));
k.add(get(DOC_NDOC));
return k;
}
//DATADOC: metodo che restiruisce la data documento
const TDate TDoc_inventario::datadoc() const
{
return get_date(DOC_DATADOC);
}
//FIND_OR_CREATE_ROW: metodo che cerca una riga con un certo codart e se non esiste la crea
TDoc_inventario_row TDoc_inventario::find_or_create_row(const char* codart)
{
//scorro tutte le righe documento; se ne trovo una con quel codart
//allora la restituisco
for(int i = 1; i <= rows(); i++)
{
TRiga_documento& row = (*(TDocumento*)this)[i];
const TString& cod = row.get(RDOC_CODART);
if(cod == codart)
{
TDoc_inventario_row rinv(row);
return rinv;
}
}
//se sono arrivato qui non ho trovato neanche una riga con quel codart;
//in queto caso ne aggiungo una
TRiga_documento& row = (*(TDocumento*)this).new_row("21");
TDoc_inventario_row rinv(row);
return rinv;
}
///////////////////////////////
//// TPACCHI_CONTATI ////
///////////////////////////////
//Classe TPacchi_contati
class TPacchi_contati: public TObject
{
real _qta;
TString4 _um;
int _npacchi;
TToken_string _codpacchi;
public:
const real qta() const;
const TString& um() const;
const int npacchi() const;
const TToken_string& codpacchi() const;
void set_qta(const real& qta);
void set_um(const char* um);
void set_npacchi(const int npacchi = 1);
void set_codpacchi(const TToken_string& codpacchi);
void add_qta(const real& qta);
void add_pacchi(const int pacchi = 1);
void add_codpacco(const TString& codpacco);
void sub_codpacco(const TString& codpacco);
TPacchi_contati(const real& qta = ZERO, const char* um = "", const int npacchi = 0, const char* codpacco = "");
};
//QTA: metodo che restituisce la quantita
const real TPacchi_contati::qta() const
{
return _qta;
}
//UM: metodo che restituisce l'unità di misura
const TString& TPacchi_contati::um() const
{
return _um;
}
//NPACCHI: metodo che restituisce il numero dei pacchi pistolati
const int TPacchi_contati::npacchi() const
{
return _npacchi;
}
//CODPACCHI: metodo che restituisce i codici dei pacchi pistolati
const TToken_string& TPacchi_contati::codpacchi() const
{
return _codpacchi;
}
//SET_QTA: metodo che setta la quantità
void TPacchi_contati::set_qta(const real& qta)
{
_qta = qta;
}
//SET_UM: metodo che setta l'unità di misura
void TPacchi_contati::set_um(const char* um)
{
_um = um;
}
//SET_NPACCHI: metodo che setta il numero di pacchi
void TPacchi_contati::set_npacchi(const int npacchi)
{
_npacchi = npacchi;
}
//SET_CODPACCHI: metodo che setta i codici dei pacchi
void TPacchi_contati::set_codpacchi(const TToken_string& codpacchi)
{
TToken_string tmp(codpacchi, '-');
_codpacchi = tmp;
}
//ADD_QTA_CON: metodo che aggiunge un quantitativo di roba alla quantità consegnata
void TPacchi_contati::add_qta(const real& qta)
{
_qta += qta;
}
//ADD_PACCHI: metodo che aggiunge un certo numero di pacchi a quelli consegnati (default = 1)
void TPacchi_contati::add_pacchi(const int pacchi)
{
_npacchi += pacchi;
}
//ADD_CODPACCO: metodo che aggiunge un codice di un pacco alla TToken_string che li contiene
void TPacchi_contati::add_codpacco(const TString& codpacco)
{
_codpacchi.add(codpacco);
}
//SUB_CODPACCO: metodo che toglie un codice di un pacco alla TToken_string che li contiene
void TPacchi_contati::sub_codpacco(const TString& codpacco)
{
int pos = _codpacchi.get_pos(codpacco);
_codpacchi.destroy(pos);
}
//metodo costruttore
TPacchi_contati::TPacchi_contati(const real& qta, const char* um, const int npacchi, const char* codpacco)
{
set_qta(qta);
set_um(um);
set_npacchi(npacchi);
TToken_string tmp(codpacco, '-');
set_codpacchi(tmp);
}
////////////////////////////////
//// TRIGHE_INV_ARRAY ////
////////////////////////////////
//Classe TRighe_inv_array
class TRighe_inv_array: public TAssoc_array
{
public:
TPacchi_contati* quantita(TString& codart, bool create);
};
//QUANTITA: metodo che cerca nel TAssoc_array le quantità della riga interessata in base ai parametri passati
//e lo crea in automatico se il parametro create vale "true"
TPacchi_contati* TRighe_inv_array::quantita(TString& codart, bool create)
{
TPacchi_contati* pc = (TPacchi_contati*)objptr(codart);
if(pc == NULL && create)
{
pc = new TPacchi_contati();
add(codart, pc);
}
return pc;
}
///////////////////////////////////
//// TINVENTARIO_TER_MSK ////
///////////////////////////////////
//Classe TInventario_ter_msk
class TInventario_ter_msk: public TAutomask
{
TRighe_inv_array _ria;
bool _nuovo;
int _autoselect;
protected:
bool precarica_righe();
void registra();
void aggiorna_campi(const char* codart, const TPacchi_contati& pc, const real& qtapacco);
void inventario_da_terminale();
virtual void on_idle();
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TInventario_ter_msk();
};
//PRECARICA_RIGHE: metodo che carica in un TAssoc_array le righe fisiche del documento
bool TInventario_ter_msk::precarica_righe()
{
//instanzio il documento inventario
TDoc_key kinv(get_int(F_ANNO), ini_get_string(CONFIG_DITTA, "lv", "NUM_INV", NULL), get_long(F_NINV));
TDoc_inventario inv(kinv);
if (inv.empty())
{
warning_box(TR("L'inventario cercato è inesistente"));
return false;
}
//controllo lo stato del documento
const TString4 stato = cache().get("%TIP", ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_INV", NULL), "S2").mid(2,1);
if (inv.get(DOC_STATO) == stato)
{
TString str;
str << "L'inventario " << get_long(F_NINV) << " è già stato stampato e non può essere aggiornato";
warning_box(str);
reset(F_CHIAVE);
return false;
}
TDate oggi(TODAY);
//metto ogni riga del documento nel TAssoc_array che contiene gli oggetti TPacchi_contati
//e che ha per chiave il codice articolo
FOR_EACH_PHYSICAL_RDOC(inv, i, row)
{
TDoc_inventario_row rinv(*row);
TString80 codart = rinv.codart();
if (codart.blank())
continue;
TPacchi_contati* pc = _ria.quantita(codart, true);
pc->set_qta(rinv.qta());
pc->set_um(rinv.um());
pc->set_npacchi(rinv.num_pacchi());
pc->set_codpacchi(rinv.cod_pacchi());
}
return true;
}
//REGISTRA: metodo che salva il buono di prelievo così com'è
void TInventario_ter_msk::registra()
{
//se sto salvando un documento nuovo, allora lo genero,
//altrimenti aggiorno quello esiete già
TDoc_key kinv(get_date(F_DATAINV).year(), get(F_CODNUM), get_long(F_NINV));
if (_nuovo)
kinv.set_ndoc(0);
//instanzio il documento e salvo i dati di interesse sulle testate
//se necessario
TDoc_inventario inv(kinv);
if(_nuovo)
{
inv.put(DOC_TIPODOC, get(F_TPDOC));
inv.put(DOC_DATADOC, get_date(F_DATAINV));
//aggiorno il numero documento con quello sicuramente corretto
TToken_string tmp = inv.chiave();
TDoc_key chiave(tmp);
set(F_NINV, chiave.ndoc());
_nuovo = false;
}
//per ogni oggetto dell'array cerco o creo una riga merce del documento
FOR_EACH_ASSOC_OBJECT(_ria, obj, key, itm)
{
const TPacchi_contati& pc = *(TPacchi_contati*)itm;
const TString80 codart(key);
const TString& desart = cache().get(LF_ANAMAG, codart, "DESCR");
TString8 magazzino;
magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGP");
TDoc_inventario_row& rinv = inv.find_or_create_row(codart);
rinv.set_codart(codart);
rinv.set_desart(desart);
rinv.set_qta(pc.qta());
rinv.set_um(pc.um());
rinv.set_num_pacchi(pc.npacchi());
rinv.set_cod_pacchi(pc.codpacchi());
rinv.set_magazzino(magazzino); //DA CONTROLLARE
rinv.set_magazzinoc(magazzino); //DA CONTROLLARE
}
}
//AGGIORNA_CAMPI: metodo che aggiorna i campi della maschera
void TInventario_ter_msk::aggiorna_campi(const char* codart, const TPacchi_contati& pc, const real& qtapacco)
{
set(F_CODART, codart);
set(F_PACCHI, pc.npacchi());
set(F_QTACON, pc.qta());
set(F_QTAPACCO, qtapacco);
}
//INVENTARIO_DA_TERMINALE: metodo che somma alla riga corretta un pacco (quello pistolato) e lo assegna a un cliente,
//sottraendolo dal magazzino del pulito
void TInventario_ter_msk::inventario_da_terminale()
{
//leggo il codice del pacco pistolato
const TString80 codpacco = get(F_BARCODE);
if (codpacco.full())
{
//se posso instanzio la riga pacco
TRiga_pacco rp(codpacco);
if (rp.empty())
{
warning_box(TR("Il pacco non esiste a magazzino"));
warning_box(TR("Non è stato possibile sommare il pacco a nessuna riga del buono"));
}
else
{
//leggo i dati di interesse dal pacco
TString80 codart = rp.articolo();
const real qtapacco = rp.quantita();
//se è la prima volta, creo il nuovo TPacchi_contati,
//altrimenti aggiorno quello che già esiste
if(!_ria.is_key(codart))
{
TPacchi_contati& pc = *(_ria.quantita(codart, true));
pc.set_qta(qtapacco);
//recupero l'unità di misura principale di quest'articolo
TToken_string key;
key.add(codart);
key.add(1);
const TString4 um = cache().get(LF_UMART, key, UMART_UM);
pc.set_um(um);
pc.set_npacchi();
key.cut(0);
key.add(codpacco);
pc.set_codpacchi(key);
aggiorna_campi(codart, pc, qtapacco);
}
else
{
TPacchi_contati& pc = *(TPacchi_contati*)_ria.objptr(codart);
TToken_string codpacchi(pc.codpacchi());
int pos = codpacchi.get_pos(codpacco);
if(pos >= 0)
{
if(yesno_box(TR("Il pacco risulta già nell'inventario; si desidera annullarlo?")))
{
pc.add_qta(-qtapacco);
pc.add_pacchi(-1);
pc.sub_codpacco(codpacco);
}
else
return;
}
pc.add_qta(qtapacco);
pc.add_pacchi();
pc.add_codpacco(codpacco);
aggiorna_campi(codart, pc, qtapacco);
}
}
}
}
//ON_FIELD_EVENT: metodo che gestisce gli eventi sui campi della maschera
bool TInventario_ter_msk::on_field_event(TOperable_field& f, TField_event e, long jolly)
{
//a seconda del bottone premuto esegui un metodo diverso
switch (f.dlg())
{
case DLG_NEWREC:
//se viene premuto nuovo, cerco il prossimo numero di inventario
//e mostro/nascondo i campi corretti
if (e == fe_button)
{
_nuovo = true;
int ninv = 0;
TString query;
query << "USE DOC\n"
<< "FROM PROVV=\"D\" ANNO=" << get_int(F_ANNO) << " CODNUM=\"" << get(F_CODNUM) << "\"\n"
<< "TO PROVV=\"D\" ANNO=" << get_int(F_ANNO) << " CODNUM=\"" << get(F_CODNUM) << "\"";
TISAM_recordset inventari(query);
if (inventari.move_last())
ninv = inventari.get(DOC_NDOC).as_int();
ninv++;
set(F_NINV, ninv); disable(F_NINV);
show(F_BARCODE);
show(F_CODART);
show(F_PACCHI);
show(F_QTAPACCO);
show(F_QTACON);
hide(F_CHIAVE);
hide(F_ANNO);
hide(F_DATAINV);
enable(DLG_SAVEREC);
enable(DLG_DELREC);
enable(DLG_CANCEL);
field(F_BARCODE).set_focus();
_autoselect = 1;
return false;
}
break;
case DLG_SAVEREC:
//se viene premuto salva, registro l'inventario
if (e == fe_button)
{
registra();
return false;
}
break;
case DLG_DELREC:
//se viene premutop cancella, elimino l'inventario corrente, poi mostro/nascondo i campi corretti
if (e == fe_button && yesno_box(TR("Si vuole veramente cancellare l'inventario corrente?")))
{
//se non è nuovo, lo rimuovo anche dagli archivi
if (!_nuovo)
{
TLocalisamfile doc(LF_DOC);
TDoc_key kinv(get_int(F_ANNO), get(F_CODNUM), get_long(F_NINV));
TDoc_inventario inv(kinv);
inv.destroy_rows();
inv.remove(doc);
}
_ria.destroy();
reset(F_BARCODE); hide(F_BARCODE);
reset(F_CODART); hide(F_CODART);
reset(F_PACCHI); hide(F_PACCHI);
reset(F_QTAPACCO); hide(F_QTAPACCO);
reset(F_QTACON); hide(F_QTACON);
enable(F_NINV); reset(F_NINV);
show(F_CHIAVE); reset(F_CHIAVE);
show(F_ANNO);
show(F_DATAINV); reset(F_DATAINV);
disable(DLG_SAVEREC);
disable(DLG_DELREC);
disable(DLG_CANCEL);
}
break;
case DLG_CANCEL:
//se viene premuto annulla, lascio perdere quello che stavo facendo
//e torno alla situazione iniziale
if (e == fe_button)
{
reset(F_BARCODE); hide(F_BARCODE);
reset(F_CODART); hide(F_CODART);
reset(F_PACCHI); hide(F_PACCHI);
reset(F_QTAPACCO); hide(F_QTAPACCO);
reset(F_QTACON); hide(F_QTACON);
enable(F_NINV); reset(F_NINV);
show(F_CHIAVE); reset(F_CHIAVE);
show(F_ANNO);
show(F_DATAINV); reset(F_DATAINV);
disable(DLG_SAVEREC);
disable(DLG_DELREC);
disable(DLG_CANCEL);
_ria.destroy();
return false;
}
break;
case F_CHIAVE:
{
//se viene riempito il campo chiave, cerca di caricare un documento
if (e == fe_modify)
{
TString kinv = f.get();
if (kinv.full())
{
set(F_ANNO, atol(kinv.left(4)));
set(F_NINV, atol(kinv.mid(4)));
field(F_NINV).check();
if(!precarica_righe())
return false;
hide(F_ANNO);
hide(F_DATAINV);
show(F_BARCODE);
show(F_CODART);
show(F_PACCHI);
show(F_QTAPACCO);
show(F_QTACON);
enable(DLG_SAVEREC);
enable(DLG_DELREC);
enable(DLG_CANCEL);
disable(F_NINV);
_autoselect = 1;
field(F_BARCODE).set_focus();
f.hide();
}
}
}
break;
case F_NINV:
{
//se viene riempito il campo NINV, cerca di caricare un documento
if (e == fe_modify && f.get_long() != 0 && get(F_CHIAVE).empty())
{
field(F_NINV).check();
_nuovo = false;
if(!precarica_righe())
return false;
hide(F_ANNO);
hide(F_DATAINV);
show(F_BARCODE);
show(F_CODART);
show(F_PACCHI);
show(F_QTAPACCO);
show(F_QTACON);
enable(DLG_SAVEREC);
enable(DLG_DELREC);
enable(DLG_CANCEL);
f.disable();
_autoselect = 1;
field(F_BARCODE).set_focus();
}
}
break;
case F_BARCODE:
{
//se viene riempito il campo barcode, lanco la procedura dell'inventario
if (e == fe_modify && f.get().full())
{
_autoselect = 1;
inventario_da_terminale();
}
}
break;
default:break;
}
return true;
}
void TInventario_ter_msk:: on_idle()
{
TMask::on_idle();
if (_autoselect >= 0 && get(F_BARCODE).full())
{
reset(F_BARCODE);
field(F_BARCODE).set_focus();
_autoselect = -1;
}
}
TInventario_ter_msk::TInventario_ter_msk():TAutomask("lv3700a")
{
//precarico i campi fissi
set(F_CODNUM, ini_get_string(CONFIG_DITTA, "lv", "NUM_INV", NULL));
set(F_TPDOC, ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_INV", NULL));
const TRectype& tpdoc = cache().get("%NUM", ini_get_string(CONFIG_DITTA, "lv", "NUM_INV", NULL));
set(F_DESCR, tpdoc.get("S0"));
TDate data(TODAY);
TEsercizi_contabili es;
int annoes = es.date2esc(data);
set(F_ANNO, annoes);
hide(F_CODCF);
hide(F_RAGSOC);
hide(F_BARCODE);
hide(F_CODART);
hide(F_PACCHI);
hide(F_QTAPACCO);
hide(F_QTACON);
disable(DLG_SAVEREC);
disable(DLG_DELREC);
disable(DLG_CANCEL);
}
///////////////////////////////////
//// TINVENTARIO_TER_APP ////
///////////////////////////////////
//classe TInventario_ter_app
class TInventario_ter_app : public TSkeleton_application
{
TInventario_ter_msk* _msk;
protected:
virtual bool create();
virtual bool destroy();
public:
bool transfer();
virtual void main_loop();
};
//CREATE: metodo costruttore
bool TInventario_ter_app::create()
{
_msk = new TInventario_ter_msk();
open_files(LF_DOC, LF_RIGHEDOC);
return TSkeleton_application::create();
}
//DESTROY: metodo distruttore
bool TInventario_ter_app::destroy()
{
delete _msk;
return TApplication::destroy();
}
//TRANSFER: metodo che scorre i campi nome e, se sono pieni, richiama il metodo
//ELABORA_FILE(), che effettivamente fa l'elaborazione
bool TInventario_ter_app::transfer()
{
return true;
}
void TInventario_ter_app::main_loop()
{
while (_msk->run() == K_ENTER)
transfer();
}
int lv3700(int argc, char *argv[])
{
TInventario_ter_app a;
a.run (argc, argv, "Evasione Buoni di Prelievo");
return TRUE;
}

16
lv/lv3700a.h Executable file
View File

@ -0,0 +1,16 @@
//Campi Maschera lv3700a
#define F_CODNUM 401
#define F_TPDOC 402
#define F_DESCR 403
#define F_CHIAVE 404
#define F_NINV 405
#define F_ANNO 406
#define F_DATAINV 407
#define F_CODCF 408
#define F_RAGSOC 409
#define F_BARCODE 410
#define F_CODART 411
#define F_PACCHI 412
#define F_QTAPACCO 413
#define F_QTACON 414
#define F_BLANK 415

143
lv/lv3700a.uml Executable file
View File

@ -0,0 +1,143 @@
#include "lv3700a.h"
TOOLBAR "Topbar" 0 0 0 2
BUTTON DLG_NEWREC 2 2
BEGIN
PROMPT 1 1 "Nuovo"
PICTURE TOOL_NEWREC
END
BUTTON DLG_SAVEREC 2 2
BEGIN
PROMPT 1 1 "Salva"
PICTURE TOOL_SAVEREC
END
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT 1 1 "Canc"
PICTURE TOOL_DELREC
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 1 1 "Ann"
PICTURE TOOL_CANCEL
END
BUTTON DLG_QUIT 2 2
BEGIN
PROMPT 3 1 "Fine"
MESSAGE EXIT,K_QUIT
PICTURE TOOL_QUIT
END
ENDPAGE
PAGE "Inventario" 0 2 0 0
STRING F_CODNUM 4
BEGIN
PROMPT 0 0 ""
FLAGS "D"
END
STRING F_TPDOC 4
BEGIN
PROMPT 5 0 ""
FLAGS "D"
END
STRING F_DESCR 50 15
BEGIN
PROMPT 10 0 ""
FLAGS "D"
END
STRING F_CHIAVE 50 10
BEGIN
PROMPT 1 1 "Barcode Invent"
END
NUMBER F_NINV 6
BEGIN
PROMPT 1 2 "Numero Doc. "
USE LF_DOC
JOIN LF_CLIFO TO LF_DOC INTO TIPOCF==TIPOCF CODCF==CODCF
INPUT PROVV "D"
INPUT ANNO F_ANNO SELECT
INPUT CODNUM F_CODNUM SELECT
INPUT NDOC F_NINV
DISPLAY "Ndoc@4" NDOC
DISPLAY "Data\ndocumento@10" DATADOC
DISPLAY "Cod\nCli@4" CODCF
DISPLAY "Ragione Sociale@10" LF_CLIFO->RAGSOC
OUTPUT F_NINV NDOC
OUTPUT F_DATAINV DATADOC
OUTPUT F_CODCF CODCF
OUTPUT F_RAGSOC LF_CLIFO->RAGSOC
CHECKTYPE REQUIRED
FLAGS "G"
END
DATE F_DATAINV
BEGIN
PROMPT 1 3 "Data Inv. "
FLAGS "DA"
END
NUMBER F_ANNO 4
BEGIN
PROMPT 1 4 "Anno Esercizio "
END
NUMBER F_CODCF 6
BEGIN
PROMPT 1 0 "Cliente "
FLAGS "D"
END
STRING F_RAGSOC 20
BEGIN
PROMPT 1 1 ""
FLAGS "D"
END
STRING F_BARCODE 50 12
BEGIN
PROMPT 1 4 "Barcode "
END
STRING F_CODART 6
BEGIN
PROMPT 1 5 "Cod. Articolo "
FLAGS "D"
END
NUMBER F_PACCHI 6
BEGIN
PROMPT 1 6 "Pacchi "
FLAGS "D"
END
NUMBER F_QTAPACCO 6
BEGIN
PROMPT 1 7 "Quantità pacco"
FLAGS "D"
END
NUMBER F_QTACON 6
BEGIN
PROMPT 1 8 "Quantità Cont."
FLAGS "D"
END
STRING F_BLANK 1
BEGIN
PROMPT 100 100 ""
END
ENDPAGE
ENDMASK

View File

@ -925,6 +925,30 @@ const long TDoc_key::ndoc()
return get_int(3);
}
//SET_PROVV: metodo che setta il campo provv
void TDoc_key::set_provv(const char provv)
{
add(provv, 0);
}
//SET_ANNO: metodo che setta il campo anno
void TDoc_key::set_anno(const int anno)
{
add(anno, 1);
}
//SET_CODNUM: metodo che setta il campo codnum
void TDoc_key::set_codnum(const char* codnum)
{
add(codnum, 2);
}
//SET_NDOC: metodo che setta il campo ndoc
void TDoc_key::set_ndoc(const long ndoc)
{
add(ndoc, 3);
}
//metodi costruttori
TDoc_key::TDoc_key(const int anno, const TString& codnum, const long ndoc, const char provv)
{

View File

@ -204,6 +204,11 @@ public:
const char* codnum();
const long ndoc();
void set_provv(const char = 'D');
void set_anno(const int anno);
void set_codnum(const char* codnum);
void set_ndoc(const long ndoc);
TDoc_key& operator= (const char* key){set(key);}
TDoc_key(const int anno, const TString& codnum, const long ndoc, const char provv = 'D');