Patch level : 10.0 patch 260
Files correlati : lv2 Ricompilazione Demo : [ ] Commento : Acquisizione da contapezzi - pronto per i test git-svn-id: svn://10.65.10.50/trunk@18525 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
0d264463b2
commit
81008377a7
313
lv/lv2600.cpp
313
lv/lv2600.cpp
@ -6,10 +6,11 @@
|
|||||||
|
|
||||||
#include "lv2600a.h"
|
#include "lv2600a.h"
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
/////////////////////////////////
|
||||||
// TAcquisizione_msk
|
//// TACQUISIZIONE_MSK ////
|
||||||
///////////////////////////////////////////////////////////
|
/////////////////////////////////
|
||||||
|
|
||||||
|
//classe TAcquisizione_msk
|
||||||
class TAcquisizione_msk: public TAutomask
|
class TAcquisizione_msk: public TAutomask
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
@ -18,33 +19,23 @@ public:
|
|||||||
TAcquisizione_msk();
|
TAcquisizione_msk();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//ON_FIELD_EVENT: metodo che gestisce gli eventi sui campi della maschera
|
||||||
bool TAcquisizione_msk::on_field_event(TOperable_field& f,TField_event e,long jolly)
|
bool TAcquisizione_msk::on_field_event(TOperable_field& f,TField_event e,long jolly)
|
||||||
{
|
{
|
||||||
switch (f.dlg())
|
switch (f.dlg())
|
||||||
{
|
{
|
||||||
//giochetto per avere la lista dei files validi nella directory di trasferimento!
|
case F_PATH:
|
||||||
case F_NAME:
|
//se il campo è vuoto, provo a scriverlo dalla configurazione
|
||||||
if (e == fe_button)
|
if (f.empty())
|
||||||
{
|
{
|
||||||
TArray_sheet as(-1, -1, 72, 20, TR("Selezione file"),
|
TConfig* configlv = new TConfig(CONFIG_DITTA,"lv");
|
||||||
HR("File@32"));
|
TString path = configlv->get("PathContapezzi");
|
||||||
TFilename path = get(F_PATH);
|
if (path.full())
|
||||||
path.add("*.dat"); //files delle testate
|
f.set(path);
|
||||||
list_files(path, as.rows_array());
|
}
|
||||||
TFilename name;
|
break;
|
||||||
FOR_EACH_ARRAY_ROW(as.rows_array(), i, row)
|
default:
|
||||||
{
|
break;
|
||||||
name = *row;
|
|
||||||
*row = name.name();
|
|
||||||
}
|
|
||||||
if (as.run() == K_ENTER)
|
|
||||||
{
|
|
||||||
f.set(as.row(as.selected()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -53,14 +44,14 @@ TAcquisizione_msk::TAcquisizione_msk():TAutomask("lv2600a")
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////
|
||||||
// TAcquisizione_cache
|
//// TACQUISIZIONE_CACHE ////
|
||||||
///////////////////////////////////////////////////////////
|
///////////////////////////////////
|
||||||
|
|
||||||
|
//classe TAcquisizione_cache
|
||||||
class TAcquisizione_cache : TCache
|
class TAcquisizione_cache : TCache
|
||||||
{
|
{
|
||||||
TString4 _codnum,_tipodoc,_stato;
|
TString4 _codnum, _tipodoc, _stato;
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void discarding(const THash_object* obj);
|
virtual void discarding(const THash_object* obj);
|
||||||
@ -71,50 +62,51 @@ public:
|
|||||||
TAcquisizione_cache();
|
TAcquisizione_cache();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//DISCARDING: metodo che salva un documento sul disco prima di eliminarlo dalla cache
|
||||||
void TAcquisizione_cache::discarding(const THash_object* obj)
|
void TAcquisizione_cache::discarding(const THash_object* obj)
|
||||||
{
|
{
|
||||||
TDocumento& doc = (TDocumento&)obj->obj();
|
TDocumento& doc = (TDocumento&)obj->obj();
|
||||||
doc.rewrite();
|
doc.rewrite();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//KEY2OBJ: metodo che sceglie il documento giusto da disco in modo da poterlo continuare, o lo crea se non c'è
|
||||||
TObject* TAcquisizione_cache::key2obj(const char* key)
|
TObject* TAcquisizione_cache::key2obj(const char* key)
|
||||||
{
|
{
|
||||||
TToken_string chiave(key);
|
TToken_string chiave(key);
|
||||||
const TDate datadoc=chiave.get();
|
const TDate datadoc = chiave.get();
|
||||||
const long codcf=chiave.get_long();
|
const long codcf = chiave.get_long();
|
||||||
|
|
||||||
TString query;
|
TString query;
|
||||||
query<< "USE DOC KEY 2 SELECT STATO=#STATO\n";
|
query<< "USE DOC KEY 2 SELECT STATO=#STATO\n";
|
||||||
for (int i=0;i<2; i++)
|
for (int i = 0; i < 2; i++)
|
||||||
{
|
{
|
||||||
query << (i?"TO":"FROM") << " "
|
query << (i ? "TO" : "FROM") << " "
|
||||||
<< "TIPOCF=C CODCF=#CODCF ANNO=#ANNO DATADOC=#DATADOC CODNUM=#CODNUM\n";
|
<< "TIPOCF=C CODCF=#CODCF ANNO=#ANNO DATADOC=#DATADOC CODNUM=#CODNUM\n";
|
||||||
}
|
}
|
||||||
TISAM_recordset rset(query);
|
TISAM_recordset rset(query);
|
||||||
rset.set_var("#STATO",TVariant(_stato));
|
rset.set_var("#STATO", TVariant(_stato));
|
||||||
rset.set_var("#CODCF",codcf);
|
rset.set_var("#CODCF", codcf);
|
||||||
rset.set_var("#ANNO",long(datadoc.year()));
|
rset.set_var("#ANNO", long(datadoc.year()));
|
||||||
rset.set_var("#DATADOC",datadoc);
|
rset.set_var("#DATADOC", datadoc);
|
||||||
rset.set_var("#CODNUM",TVariant(_codnum));
|
rset.set_var("#CODNUM", TVariant(_codnum));
|
||||||
|
|
||||||
TDocumento* doc=NULL;
|
TDocumento* doc = NULL;
|
||||||
|
|
||||||
if (rset.move_first())
|
if (rset.move_first())
|
||||||
{
|
doc = new TDocumento(rset.cursor()->curr());
|
||||||
doc=new TDocumento(rset.cursor()->curr());
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
doc=new TDocumento('D',datadoc.year(),_codnum,0);
|
doc = new TDocumento('D',datadoc.year(),_codnum,0);
|
||||||
doc->put(DOC_TIPODOC,_tipodoc);
|
doc->put(DOC_TIPODOC, _tipodoc);
|
||||||
doc->put(DOC_STATO,_stato);
|
doc->put(DOC_STATO, _stato);
|
||||||
doc->put(DOC_DATADOC,datadoc);
|
doc->put(DOC_DATADOC, datadoc);
|
||||||
doc->put(DOC_TIPOCF,"C");
|
doc->put(DOC_TIPOCF, "C");
|
||||||
doc->put(DOC_CODCF,codcf);
|
doc->put(DOC_CODCF, codcf);
|
||||||
}
|
}
|
||||||
return doc;
|
return doc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//DOC: metodo che restituisce un puntatore ad un documento identificato dalla coppia data - cliente
|
||||||
TDocumento& TAcquisizione_cache::doc(const TDate& gg, const long cc)
|
TDocumento& TAcquisizione_cache::doc(const TDate& gg, const long cc)
|
||||||
{
|
{
|
||||||
TString16 key;
|
TString16 key;
|
||||||
@ -122,66 +114,187 @@ TDocumento& TAcquisizione_cache::doc(const TDate& gg, const long cc)
|
|||||||
return *(TDocumento*)objptr(key);
|
return *(TDocumento*)objptr(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//metodo costruttore di una cache di 17 elementi
|
||||||
TAcquisizione_cache::TAcquisizione_cache() : TCache(17)
|
TAcquisizione_cache::TAcquisizione_cache() : TCache(17)
|
||||||
{
|
{
|
||||||
TConfig cfg(CONFIG_DITTA,"lv");
|
TConfig cfg(CONFIG_DITTA, "lv");
|
||||||
_codnum=cfg.get("NUM_RIT",NULL,0);
|
_codnum = cfg.get("NUM_RIT", NULL, 0);
|
||||||
_tipodoc=cfg.get("TIPOOC_RIT",NULL,0);
|
_tipodoc = cfg.get("TIPOOC_RIT", NULL, 0);
|
||||||
_stato=cfg.get("STATO_RIT",NULL,0);
|
_stato = cfg.get("STATO_RIT", NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
// TAcquisizione_lavanderie_app
|
//// TACQUISIZIONE_LAVANDERIE_APP ////
|
||||||
///////////////////////////////////////////////////////////
|
////////////////////////////////////////////
|
||||||
|
|
||||||
|
//classe TAcquisizione_lavanderie_app
|
||||||
class TAcquisizione_lavanderie_app : public TSkeleton_application
|
class TAcquisizione_lavanderie_app : public TSkeleton_application
|
||||||
{
|
{
|
||||||
|
TAcquisizione_msk* _msk;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void main_loop();
|
virtual bool create();
|
||||||
|
virtual bool destroy();
|
||||||
|
|
||||||
|
void elabora_file(const TString& file, bool new_file);
|
||||||
|
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool transfer();
|
||||||
|
virtual void main_loop();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//CREATE: metodo costruttore
|
||||||
|
bool TAcquisizione_lavanderie_app::create()
|
||||||
|
{
|
||||||
|
_msk = new TAcquisizione_msk();
|
||||||
|
TSheet_field& sheet = _msk->sfield(F_SHEET_NAME);
|
||||||
|
sheet.set_auto_append();
|
||||||
|
|
||||||
|
return TSkeleton_application::create();
|
||||||
|
}
|
||||||
|
|
||||||
|
//DESTROY: metodo distruttore
|
||||||
|
bool TAcquisizione_lavanderie_app::destroy()
|
||||||
|
{
|
||||||
|
delete _msk;
|
||||||
|
return TApplication::destroy();
|
||||||
|
}
|
||||||
|
|
||||||
|
//ELABORA_FILE: metodo che effettivamente fa l'elaborazione del file, creando i documenti
|
||||||
|
void TAcquisizione_lavanderie_app::elabora_file(const TString& file, bool new_file)
|
||||||
|
{
|
||||||
|
TAcquisizione_cache ca;
|
||||||
|
|
||||||
|
//scandisco il file
|
||||||
|
TScanner s(file);
|
||||||
|
while (s.ok())
|
||||||
|
{
|
||||||
|
TString80 riga = s.line();
|
||||||
|
if (riga.blank())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
TDate datadoc;
|
||||||
|
long codcf;
|
||||||
|
TString80 codart;
|
||||||
|
long qta;
|
||||||
|
long rotti;
|
||||||
|
long ndoc;
|
||||||
|
TString16 tipo_conteggio;
|
||||||
|
TString80 operatore;
|
||||||
|
|
||||||
|
//controllo quale tracciato record devo seguire
|
||||||
|
if (riga.len() == 34) // -> MONTANARI
|
||||||
|
{
|
||||||
|
//leggo i campi dalla riga del file
|
||||||
|
datadoc.set_day(atoi(riga.mid(0,2)));
|
||||||
|
datadoc.set_month(atoi(riga.mid(2,2)));
|
||||||
|
datadoc.set_year(atoi(riga.mid(4,4)));
|
||||||
|
|
||||||
|
codcf = atol(riga.mid(8,6));
|
||||||
|
codart = riga.mid(14,8);
|
||||||
|
qta = atol(riga.mid(22,6));
|
||||||
|
rotti = atol(riga.mid(28,6));
|
||||||
|
}
|
||||||
|
else if (riga.len() == 121) // ->SKEMA
|
||||||
|
{
|
||||||
|
//leggo i campi dalla riga del file
|
||||||
|
TDate datadoc;
|
||||||
|
datadoc.set_year(atoi(riga.mid(0,4)));
|
||||||
|
datadoc.set_month(atoi(riga.mid(4,2)));
|
||||||
|
datadoc.set_day(atoi(riga.mid(6,2)));
|
||||||
|
|
||||||
|
codart = riga.mid(8,20);
|
||||||
|
codcf = atol(riga.mid(28,20));
|
||||||
|
qta = atoi(riga.mid(48,11));
|
||||||
|
ndoc = atoi(riga.mid(59,11));
|
||||||
|
|
||||||
|
switch (atoi(riga.mid(70,11)))
|
||||||
|
{
|
||||||
|
case 1: tipo_conteggio = "Automatico"; break;
|
||||||
|
case 2: tipo_conteggio = "Manuale"; break;
|
||||||
|
case 3: tipo_conteggio = "Scarto"; break;
|
||||||
|
default: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
operatore = riga.mid(81,40);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
|
TDocumento& doc = ca.doc(datadoc,codcf);
|
||||||
|
//cerco se esiste già una riga sul documento selezionato per quell'articolo;
|
||||||
|
//se la trovo sommo la quantità appena letta a quella già esistente,
|
||||||
|
//altrimenti creo una nuova riga documento
|
||||||
|
if (doc.rows() > 0 && new_file)
|
||||||
|
{
|
||||||
|
if (!yesno_box(TR("ATTENZIONE: il documento che si sta importando esiste già!\nSi desidera continuare?")))
|
||||||
|
return;
|
||||||
|
else if (yesno_box(TR("ATTENZIONE: Si desidera sovrascrivere il documento esistente(rispondendo NO le quantità verranno sommate a quelle esistenti)?")))
|
||||||
|
doc.destroy_rows();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i <= doc.rows(); i++)
|
||||||
|
{
|
||||||
|
TRiga_documento& rdoc = doc[i];
|
||||||
|
if (rdoc.get(RDOC_CODART) == codart)
|
||||||
|
{
|
||||||
|
long qtardoc = rdoc.get_long(RDOC_QTA);
|
||||||
|
qtardoc += qta;
|
||||||
|
rdoc.put(RDOC_QTA,qtardoc);
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (found == false)
|
||||||
|
{
|
||||||
|
TRiga_documento& rdoc = doc.new_row("01");
|
||||||
|
rdoc.put(RDOC_CODART,codart);
|
||||||
|
rdoc.put(RDOC_QTA,qta);
|
||||||
|
}
|
||||||
|
new_file = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//TRANSFER: metodo che scorre i campi nome e, se sono pieni, richiama il metodo
|
||||||
|
//ELABORA_FILE(), che effettivamente fa l'elaborazione
|
||||||
|
bool TAcquisizione_lavanderie_app::transfer()
|
||||||
|
{
|
||||||
|
//prendo il path dalla maschera
|
||||||
|
const TString& path = _msk->get(F_PATH);
|
||||||
|
TSheet_field& sheet = _msk->sfield(F_SHEET_NAME);
|
||||||
|
TFilename file;
|
||||||
|
|
||||||
|
//per ogni riga dello sheet, leggo il suo contenuto, se contiene dei caratteri jolly
|
||||||
|
//preparo la lista dei file che soddisfano la maschera in quella directory e li elaboro
|
||||||
|
//tutti, altrimenti elaboro esattamente il file che è scritto sullo sheet
|
||||||
|
FOR_EACH_SHEET_ROW(sheet, r1, row1)
|
||||||
|
{
|
||||||
|
if(row1->full())
|
||||||
|
{
|
||||||
|
file = path;
|
||||||
|
file.add(*row1);
|
||||||
|
|
||||||
|
if (file.find('*') >= 0 || file.find('?') >= 0)
|
||||||
|
{
|
||||||
|
TString_array lista_file;
|
||||||
|
list_files(file, lista_file);
|
||||||
|
|
||||||
|
FOR_EACH_ARRAY_ROW(lista_file, r2, row2)
|
||||||
|
elabora_file(*row2, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
elabora_file(file, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void TAcquisizione_lavanderie_app::main_loop()
|
void TAcquisizione_lavanderie_app::main_loop()
|
||||||
{
|
{
|
||||||
TAcquisizione_msk msk;
|
while (_msk->run() == K_ENTER)
|
||||||
while (msk.run()!=K_QUIT)
|
transfer();
|
||||||
{
|
|
||||||
TFilename name;
|
|
||||||
name=msk.get(F_PATH);
|
|
||||||
name.add(msk.get(F_NAME));
|
|
||||||
TAcquisizione_cache ca;
|
|
||||||
TCSV_recordset csvbolle(name);
|
|
||||||
for(bool ok=csvbolle.move_first(); ok; ok=csvbolle.move_next())
|
|
||||||
{
|
|
||||||
const long cli = csvbolle.get(0).as_int();
|
|
||||||
const TDate dtdoc = csvbolle.get(1).as_date();
|
|
||||||
const TString80 codart = csvbolle.get(2).as_string();
|
|
||||||
const long qta = csvbolle.get(3).as_int();
|
|
||||||
const TString4 um= csvbolle.get(4).as_string();
|
|
||||||
bool found=false;
|
|
||||||
|
|
||||||
TDocumento& doc = ca.doc(dtdoc,cli);
|
|
||||||
for (int i=1; doc.rows(); i++)
|
|
||||||
{
|
|
||||||
TRiga_documento& rdoc = doc[i];
|
|
||||||
if (rdoc.get(RDOC_CODART)==codart)
|
|
||||||
{
|
|
||||||
long qtardoc = rdoc.get_long(RDOC_QTA);
|
|
||||||
qtardoc+=qta;
|
|
||||||
rdoc.put(RDOC_QTA,qtardoc);
|
|
||||||
found=true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (found==false)
|
|
||||||
{
|
|
||||||
TRiga_documento& rdoc = doc.new_row("01");
|
|
||||||
rdoc.put(RDOC_CODART,codart);
|
|
||||||
rdoc.put(RDOC_QTA,qta);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int lv2600(int argc, char *argv[])
|
int lv2600(int argc, char *argv[])
|
||||||
|
@ -1,2 +1,7 @@
|
|||||||
#define F_PATH 101
|
//Acquisizione da contapezzi
|
||||||
#define F_NAME 102
|
//Campi Maschera lv2600a
|
||||||
|
#define F_PATH 201
|
||||||
|
#define F_SHEET_NAME 202
|
||||||
|
|
||||||
|
//campo dello sheet
|
||||||
|
#define F_S_NAME 101
|
@ -1,37 +1,72 @@
|
|||||||
#include "lv2600a.h"
|
#include "lv2600a.h"
|
||||||
|
|
||||||
PAGE "Aquisizione" -1 -1 40 5
|
TOOLBAR "Topbar" 0 0 0 2
|
||||||
|
|
||||||
GROUPBOX DLG_NULL 76 4
|
|
||||||
BEGIN
|
|
||||||
PROMPT 2 4 "@bSorgente"
|
|
||||||
END
|
|
||||||
|
|
||||||
STRING F_PATH 256 39
|
|
||||||
BEGIN
|
|
||||||
PROMPT 3 5 "Cartella "
|
|
||||||
DSELECT
|
|
||||||
CHECKTYPE REQUIRED
|
|
||||||
END
|
|
||||||
|
|
||||||
STRING F_NAME 18
|
|
||||||
BEGIN
|
|
||||||
PROMPT 3 6 "File "
|
|
||||||
CHECKTYPE REQUIRED
|
|
||||||
END
|
|
||||||
|
|
||||||
STRING DLG_PROFILE 50
|
|
||||||
BEGIN
|
|
||||||
PROMPT 1 -1 "Profilo "
|
|
||||||
SHEET PSELECT
|
|
||||||
FLAGS "H"
|
|
||||||
END
|
|
||||||
|
|
||||||
ENDPAGE
|
|
||||||
|
|
||||||
TOOLBAR "" 0 0 0 2
|
|
||||||
#include <elabar.h>
|
#include <elabar.h>
|
||||||
|
|
||||||
ENDPAGE
|
ENDPAGE
|
||||||
|
|
||||||
|
PAGE "Aquisizione da Contapezzi" -1 -1 80 10
|
||||||
|
|
||||||
|
STRING DLG_PROFILE 50
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 -1 "Profilo "
|
||||||
|
PSELECT
|
||||||
|
FLAGS "H"
|
||||||
|
END
|
||||||
|
|
||||||
|
GROUPBOX DLG_NULL 78 3
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 1 "@bSorgente"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_PATH 255 50
|
||||||
|
BEGIN
|
||||||
|
PROMPT 10 2 "Cartella "
|
||||||
|
DSELECT
|
||||||
|
CHECKTYPE REQUIRED
|
||||||
|
END
|
||||||
|
|
||||||
|
SPREADSHEET F_SHEET_NAME 78 10
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 5 "Nomi file"
|
||||||
|
ITEM "Nome file"
|
||||||
|
END
|
||||||
|
|
||||||
|
ENDPAGE
|
||||||
ENDMASK
|
ENDMASK
|
||||||
|
|
||||||
|
PAGE "Nomi file" -1 -1 80 3
|
||||||
|
|
||||||
|
GROUPBOX DLG_NULL 78 3
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 1 "@bNome file"
|
||||||
|
END
|
||||||
|
|
||||||
|
STRING F_S_NAME 68
|
||||||
|
BEGIN
|
||||||
|
PROMPT 3 2 "File "
|
||||||
|
END
|
||||||
|
ENDPAGE
|
||||||
|
|
||||||
|
TOOLBAR "" 0 0 0 2
|
||||||
|
|
||||||
|
BUTTON DLG_OK 2 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT 1 1 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_DELREC 2 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT 2 1 "Elimina"
|
||||||
|
MESSAGE EXIT,K_DEL
|
||||||
|
PICTURE BMP_DELREC
|
||||||
|
END
|
||||||
|
|
||||||
|
BUTTON DLG_CANCEL 2 2
|
||||||
|
BEGIN
|
||||||
|
PROMPT 4 1 ""
|
||||||
|
END
|
||||||
|
|
||||||
|
ENDPAGE
|
||||||
|
ENDMASK
|
Loading…
x
Reference in New Issue
Block a user