Modifiche per far andare definitavamente il programma di visualizzazione

saldi. Aggiunto l'ordinamento per data d'inizio esercizio.


git-svn-id: svn://10.65.10.50/trunk@3127 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1996-07-01 17:22:56 +00:00
parent a1e1ab0994
commit b3cbac9621
2 changed files with 116 additions and 99 deletions

View File

@ -111,8 +111,9 @@ class TSaldibrowse_application : public TBrowse_application
TMask* _msk; TMask* _msk;
TCursor * _cur; TCursor * _cur;
TRelation * _rel,* _rel1; TRelation * _rel,* _rel1;
TTable * _esc;
TRiga_array _riga; TRiga_array _riga;
int _anno, _g, _c; int _anno, _annop, _g, _c;
long _s; long _s;
bool _saldo_conto, _saldo_gruppo, _saldo_sottoc, _scarongly; bool _saldo_conto, _saldo_gruppo, _saldo_sottoc, _scarongly;
@ -126,6 +127,9 @@ protected:
virtual void init_query_mode(TMask&); virtual void init_query_mode(TMask&);
virtual void init_modify_mode(TMask&); virtual void init_modify_mode(TMask&);
static int compare_rows(const TObject **o1, const TObject** o2);
static bool anno_handler (TMask_field& f, KEY k);
static bool flsca_handler (TMask_field& f, KEY k);
static bool sottoc_handler (TMask_field& f, KEY k); static bool sottoc_handler (TMask_field& f, KEY k);
static bool sheet_action(TSheet_field& s, int r, KEY k); static bool sheet_action(TSheet_field& s, int r, KEY k);
public: public:
@ -148,58 +152,26 @@ bool TSaldibrowse_application::sheet_action(TSheet_field& s, int r, KEY k)
void TSaldibrowse_application::init_query_mode(TMask& m) void TSaldibrowse_application::init_query_mode(TMask& m)
{ {
_anno = 0;
_scarongly = FALSE;
m.disable(DLG_FINDREC); m.disable(DLG_FINDREC);
TString t(m.get(F_TIPOCF)); m.enable(F_DESCR_CONTO);
if (t == "C") m.enable(F_ANNO);
{ m.enable(F_SCARICATO);
m.show(F_DESCR_CLIENTE);
m.enable(F_DESCR_CLIENTE);
m.hide(F_DESCR_FORN);
m.hide(F_DESCR_CONTO);
}
else
if (t == "F")
{
m.hide(F_DESCR_CLIENTE);
m.show(F_DESCR_FORN);
m.enable(F_DESCR_FORN);
m.hide(F_DESCR_CONTO);
}
else
{
m.hide(F_DESCR_CLIENTE);
m.hide(F_DESCR_FORN);
m.show(F_DESCR_CONTO);
m.enable(F_DESCR_CONTO);
}
} }
void TSaldibrowse_application::init_modify_mode(TMask& m) void TSaldibrowse_application::init_modify_mode(TMask& m)
{ {
TString t(m.get(F_TIPOCF));
m.disable(DLG_FINDREC); m.disable(DLG_FINDREC);
if (t == "C") m.disable(F_ANNO);
{ m.disable(F_SCARICATO);
m.show(F_DESCR_CLIENTE); TString tipo(m.get(F_TIPOCF));
if (tipo=="C")
m.disable(F_DESCR_CLIENTE); m.disable(F_DESCR_CLIENTE);
m.hide(F_DESCR_FORN); else if (tipo=="F")
m.hide(F_DESCR_CONTO);
}
else
if (t == "F")
{
m.hide(F_DESCR_CLIENTE);
m.show(F_DESCR_FORN);
m.disable(F_DESCR_FORN); m.disable(F_DESCR_FORN);
m.hide(F_DESCR_CONTO); else m.disable(F_DESCR_CONTO);
}
else
{
m.hide(F_DESCR_CLIENTE);
m.hide(F_DESCR_FORN);
m.show(F_DESCR_CONTO);
m.disable(F_DESCR_CONTO);
}
} }
bool TSaldibrowse_application::fai_filtro() bool TSaldibrowse_application::fai_filtro()
@ -211,7 +183,10 @@ bool TSaldibrowse_application::fai_filtro()
_saldo_gruppo = _saldo_conto = _saldo_sottoc = FALSE; _saldo_gruppo = _saldo_conto = _saldo_sottoc = FALSE;
TMask& m = curr_mask(); TMask& m = curr_mask();
tipo = m.get(F_TIPOCF)[0]; tipo = m.get(F_TIPOCF)[0];
_anno = m.get_int(F_ANNO); if (_anno != 0)
_annop = EsePre(_anno);
else
_annop = 0;
_g = m.get_int(F_GRUPPO); _g = m.get_int(F_GRUPPO);
_c = m.get_int(F_CONTO); _c = m.get_int(F_CONTO);
@ -232,14 +207,6 @@ bool TSaldibrowse_application::fai_filtro()
from.zero(); from.zero();
to.zero(); to.zero();
if (_anno != 0)
annop = EsePre(_anno);
if (annop != 0)
from.put(SLD_ANNOES,annop);
else if (_anno != 0)
from.put(SLD_ANNOES,_anno);
else from.put(SLD_ANNOES,0);
from.put(SLD_GRUPPO,_g); from.put(SLD_GRUPPO,_g);
if (_c != 0) if (_c != 0)
@ -247,28 +214,43 @@ bool TSaldibrowse_application::fai_filtro()
if (_s != 0l) if (_s != 0l)
from.put(SLD_SOTTOCONTO, _s); from.put(SLD_SOTTOCONTO, _s);
if (_anno != 0)
to.put(SLD_ANNOES,_anno);
else to.put(SLD_ANNOES, 9999);
to.put(SLD_GRUPPO,_g); to.put(SLD_GRUPPO,_g);
if (_c != 0) if (_c != 0)
to.put(SLD_CONTO,_c); to.put(SLD_CONTO,_c);
if (_s != 0l) if (_s != 0l)
to.put(SLD_SOTTOCONTO,_s); to.put(SLD_SOTTOCONTO,_s);
_scarongly = m.get_bool(F_SCARICATO); _cur->setkey(2);
if ( _saldo_gruppo || _saldo_conto )
_cur->setkey(1);
if (_saldo_sottoc)
_cur->setkey(2);
_cur->setregion(from,to); _cur->setregion(from,to);
return TRUE; return TRUE;
} }
bool TSaldibrowse_application::anno_handler(TMask_field& f, KEY key)
{
if (key == K_TAB && f.focusdirty())
{
TString cod(f.get());
app()._anno = atoi(cod);
app()._esc->zero();
app()._esc->put("CODTAB",cod);
if (cod.not_empty() && app()._esc->read() != NOERR)
{
f.error_box("Esercizio %s non presente.",(const char*) cod);
return FALSE;
}
}
return TRUE;
}
bool TSaldibrowse_application::flsca_handler(TMask_field& f, KEY key)
{
if (key == K_SPACE)
app()._scarongly = f.get() == "" ? FALSE : TRUE;
return TRUE;
}
bool TSaldibrowse_application::sottoc_handler(TMask_field& f, KEY key) bool TSaldibrowse_application::sottoc_handler(TMask_field& f, KEY key)
{ {
bool ok = TRUE; bool ok = TRUE;
@ -306,6 +288,7 @@ bool TSaldibrowse_application::sottoc_handler(TMask_field& f, KEY key)
clifo.setkey(1); clifo.setkey(1);
clifo.put(CLI_TIPOCF,tipo); clifo.put(CLI_TIPOCF,tipo);
clifo.put(CLI_CODCF, sottoconto) ; clifo.put(CLI_CODCF, sottoconto) ;
app()._s = sottoconto;
ok = stop = clifo.read() == NOERR; ok = stop = clifo.read() == NOERR;
if (ok && (gruppo == 0 || conto == 0)) if (ok && (gruppo == 0 || conto == 0))
{ {
@ -337,11 +320,14 @@ bool TSaldibrowse_application::sottoc_handler(TMask_field& f, KEY key)
bool TSaldibrowse_application::user_create() bool TSaldibrowse_application::user_create()
{ {
_rel = new TRelation(LF_SALDI); _rel = new TRelation(LF_PCON);
_rel1 = new TRelation(LF_SALDI); _rel1 = new TRelation(LF_SALDI);
_cur = new TCursor(_rel1, "", 2); _cur = new TCursor(_rel1, "", 2);
_esc = new TTable("ESC");
_rel->add(LF_CLIFO,"TIPOCF=TMCF");
_msk = new TMask("cg5200a"); _msk = new TMask("cg5200a");
_msk->set_handler(F_ANNO, anno_handler);
_msk->set_handler(F_SCARICATO, flsca_handler);
_msk->set_handler(F_SOTTOCONTO, sottoc_handler); _msk->set_handler(F_SOTTOCONTO, sottoc_handler);
_msk->set_handler(F_SOTTOC_CLIENTE, sottoc_handler); _msk->set_handler(F_SOTTOC_CLIENTE, sottoc_handler);
_msk->set_handler(F_SOTTOC_FORN, sottoc_handler); _msk->set_handler(F_SOTTOC_FORN, sottoc_handler);
@ -359,6 +345,7 @@ bool TSaldibrowse_application::user_destroy()
delete _rel; delete _rel;
delete _rel1; delete _rel1;
delete _cur; delete _cur;
delete _esc;
return TRUE; return TRUE;
} }
@ -366,6 +353,13 @@ bool TSaldibrowse_application::user_destroy()
int TSaldibrowse_application::read(TMask& m) int TSaldibrowse_application::read(TMask& m)
{ {
m.autoload(*_rel); m.autoload(*_rel);
m.set(F_ANNO,_anno);
m.set(F_SCARICATO,_scarongly ? "X" : " ");
TString tipo(m.get(F_TIPOCF));
if (tipo == "C")
m.set(F_SOTTOC_CLIENTE,_s);
else if (tipo == "F")
m.set(F_SOTTOC_FORN,_s);
fai_filtro(); fai_filtro();
compilasheet(); compilasheet();
@ -425,6 +419,29 @@ void TSaldibrowse_application::add_r(int numrig,int a,real& slf,char sff,real& s
riga.add(asc.string(),18); riga.add(asc.string(),18);
} }
int TSaldibrowse_application::compare_rows(const TObject** o1, const TObject** o2)
{
TToken_string* r1 = ( TToken_string*)*o1;
TToken_string* r2 = ( TToken_string*)*o2;
int rt = 0;
TDate d1,d2;
TString c1,c2;
c1.format("%04d", r1->get_int(0));
c2.format("%04d", r2->get_int(0));
app()._esc->zero();
app()._esc->put("CODTAB",c1);
if (app()._esc->read() == NOERR) d1 = app()._esc->get_date("D0");
else d1 = botime;
app()._esc->put("CODTAB",c2);
if (app()._esc->read() == NOERR) d2 = app()._esc->get_date("D0");
else d2 = botime;
if (d1 < d2) rt = -1;
else if (d1 > d2) rt = +1;
return rt;
}
void TSaldibrowse_application::compilasheet() void TSaldibrowse_application::compilasheet()
{ {
char flagsal = ' '; char flagsal = ' ';
@ -451,7 +468,6 @@ void TSaldibrowse_application::compilasheet()
// nuova struttura archivio saldi // nuova struttura archivio saldi
ss().reset();
_riga.destroy(); _riga.destroy();
TRecnotype items = _cur->items(); TRecnotype items = _cur->items();
@ -469,6 +485,8 @@ void TSaldibrowse_application::compilasheet()
conto = _cur->curr().get_int(SLD_CONTO); conto = _cur->curr().get_int(SLD_CONTO);
sottoconto = _cur->curr().get_long(SLD_SOTTOCONTO); sottoconto = _cur->curr().get_long(SLD_SOTTOCONTO);
if (_anno != 0 && _anno != anno && _annop != anno) continue;
if (gruppo != _g) continue; if (gruppo != _g) continue;
if (_saldo_conto && conto != _c) continue; if (_saldo_conto && conto != _c) continue;
@ -546,6 +564,10 @@ void TSaldibrowse_application::compilasheet()
} }
_riga.destroy(); _riga.destroy();
} }
// Ora ordina le righe dello sheet per ordine della data inizio esercizio
TString_array& righe_sheet = ss().rows_array();
righe_sheet.TArray::sort(compare_rows);
} }
int cg5200(int argc, char* argv[]) int cg5200(int argc, char* argv[])

View File

@ -13,23 +13,18 @@ BEGIN
PROMPT 4 1 "Cod. esercizio " PROMPT 4 1 "Cod. esercizio "
HELP "Codice esercizio a cui si riferiscono i saldi" HELP "Codice esercizio a cui si riferiscono i saldi"
WARNING "Codice esercizio inesistente" WARNING "Codice esercizio inesistente"
FIELD LF_SALDI->ANNOES
KEY 1
USE ESC USE ESC
INPUT CODTAB[1,4] F_ANNO INPUT CODTAB[1,4] F_ANNO
DISPLAY "Codice" CODTAB[1,4] DISPLAY "Codice" CODTAB[1,4]
DISPLAY "Data inizio esercizio" D0 DISPLAY "Data inizio esercizio" D0
DISPLAY "Data fine esercizio" D1 DISPLAY "Data fine esercizio" D1
OUTPUT F_ANNO CODTAB[1,4] OUTPUT F_ANNO CODTAB[1,4]
CHECKTYPE FORCED
FLAGS "Z" FLAGS "Z"
END END
BOOLEAN F_SCARICATO BOOLEAN F_SCARICATO
BEGIN BEGIN
PROMPT 40 1 "Solo saldi dei movimenti scaricati" PROMPT 40 1 "Solo saldi dei movimenti scaricati"
KEY 1
FIELD LF_SALDI->FLSCA
END END
GROUPBOX DLG_NULL 73 4 GROUPBOX DLG_NULL 73 4
@ -41,10 +36,10 @@ LIST F_TIPOCF 9
BEGIN BEGIN
PROMPT 4 3 "Tipo " PROMPT 4 3 "Tipo "
HELP "Tipo del conto da visualizzare" HELP "Tipo del conto da visualizzare"
FLAGS "U" ITEM " |Conto" MESSAGE HIDE,2@|HIDE,3@|SHOW,1@|ENABLE,F_DESCR_CONTO
ITEM " |Conto" MESSAGE HIDE,2@|HIDE,3@|SHOW,1@ ITEM "C|Cliente" MESSAGE HIDE,1@|HIDE,3@|SHOW,2@|ENABLE,F_DESCR_CLIENTE
ITEM "C|Cliente" MESSAGE HIDE,1@|HIDE,3@|SHOW,2@ ITEM "F|Fornitore" MESSAGE HIDE,1@|HIDE,2@|SHOW,3@|ENABLE,F_DESCR_FORN
ITEM "F|Fornitore" MESSAGE HIDE,1@|HIDE,2@|SHOW,3@ FIELD TMCF
KEY 1 KEY 1
END END
@ -53,17 +48,17 @@ BEGIN
PROMPT 26 3 "Gruppo " PROMPT 26 3 "Gruppo "
HELP "Codice del conto da visualizzare" HELP "Codice del conto da visualizzare"
WARNING "Gruppo inesistente" WARNING "Gruppo inesistente"
USE LF_PCON KEY 1 SELECT CONTO="" FLAGS "R"
FIELD LF_SALDI->GRUPPO
KEY 1 KEY 1
FIELD GRUPPO
USE LF_PCON KEY 1 SELECT CONTO=""
INPUT GRUPPO F_GRUPPO INPUT GRUPPO F_GRUPPO
DISPLAY "Gruppo" GRUPPO DISPLAY "Gruppo" GRUPPO
DISPLAY "Descrizione@50" DESCR DISPLAY "Descrizione@50" DESCR
OUTPUT F_GRUPPO GRUPPO OUTPUT F_GRUPPO GRUPPO
OUTPUT F_DESCR_CONTO DESCR OUTPUT F_DESCR_CONTO DESCR
CHECKTYPE NORMAL CHECKTYPE REQUIRED
VALIDATE CHECK_FIELD F_GRUPPO VALIDATE CHECK_FIELD F_GRUPPO
FLAGS "R"
END END
NUMBER F_CONTO 3 NUMBER F_CONTO 3
@ -72,7 +67,8 @@ BEGIN
HELP "Codice del conto da visualizzare" HELP "Codice del conto da visualizzare"
WARNING "Conto inesistente" WARNING "Conto inesistente"
USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO="") USE LF_PCON SELECT (CONTO!="") && (SOTTOCONTO="")
FIELD LF_SALDI->CONTO FIELD CONTO
FLAGS "R"
KEY 1 KEY 1
INPUT GRUPPO F_GRUPPO INPUT GRUPPO F_GRUPPO
INPUT CONTO F_CONTO INPUT CONTO F_CONTO
@ -84,7 +80,6 @@ BEGIN
OUTPUT F_GRUPPO GRUPPO OUTPUT F_GRUPPO GRUPPO
OUTPUT F_CONTO CONTO OUTPUT F_CONTO CONTO
OUTPUT F_DESCR_CONTO DESCR OUTPUT F_DESCR_CONTO DESCR
FLAGS "R"
CHECKTYPE NORMAL CHECKTYPE NORMAL
VALIDATE CHECK_FIELD F_CONTO VALIDATE CHECK_FIELD F_CONTO
WARNING "Conto inesistente o mancante" WARNING "Conto inesistente o mancante"
@ -94,9 +89,9 @@ NUMBER F_SOTTOCONTO 6
BEGIN BEGIN
PROMPT 54 3 "Sottoconto " PROMPT 54 3 "Sottoconto "
HELP "Codice del conto da visualizzare" HELP "Codice del conto da visualizzare"
WARNING "Sottoconto inesistente"
USE LF_PCON SELECT SOTTOCONTO!="" USE LF_PCON SELECT SOTTOCONTO!=""
FIELD LF_SALDI->SOTTOCONTO FIELD SOTTOCONTO
FLAGS "R"
KEY 1 KEY 1
INPUT GRUPPO F_GRUPPO INPUT GRUPPO F_GRUPPO
INPUT CONTO F_CONTO INPUT CONTO F_CONTO
@ -109,19 +104,19 @@ BEGIN
OUTPUT F_CONTO CONTO OUTPUT F_CONTO CONTO
OUTPUT F_SOTTOCONTO SOTTOCONTO OUTPUT F_SOTTOCONTO SOTTOCONTO
OUTPUT F_DESCR_CONTO DESCR OUTPUT F_DESCR_CONTO DESCR
FLAGS "R"
CHECKTYPE NORMAL CHECKTYPE NORMAL
VALIDATE CHECK_FIELD F_SOTTOCONTO VALIDATE CHECK_FIELD F_SOTTOCONTO
GROUP 1
WARNING "Conto inesistente" WARNING "Conto inesistente"
GROUP 1
END END
NUMBER F_SOTTOC_CLIENTE 6 NUMBER F_SOTTOC_CLIENTE 6
BEGIN BEGIN
PROMPT 54 3 "Cliente " PROMPT 54 3 "Cliente "
HELP "Codice del conto da visualizzare" HELP "Codice del conto da visualizzare"
WARNING "Cliente inesistente" FLAGS "R"
FIELD LF_SALDI->SOTTOCONTO KEY 1
FIELD LF_CLIFO->CODCF
USE LF_CLIFO USE LF_CLIFO
INPUT TIPOCF "C" INPUT TIPOCF "C"
INPUT CODCF F_SOTTOC_CLIENTE INPUT CODCF F_SOTTOC_CLIENTE
@ -131,10 +126,8 @@ BEGIN
DISPLAY "Conto" CONTO DISPLAY "Conto" CONTO
OUTPUT F_SOTTOC_CLIENTE CODCF OUTPUT F_SOTTOC_CLIENTE CODCF
OUTPUT F_DESCR_CLIENTE RAGSOC OUTPUT F_DESCR_CLIENTE RAGSOC
FLAGS "R"
VALIDATE CHECK_FIELD F_SOTTOC_CLIENTE
CHECKTYPE NORMAL CHECKTYPE NORMAL
KEY 1 VALIDATE CHECK_FIELD F_SOTTOC_CLIENTE
WARNING "Cliente inesistente" WARNING "Cliente inesistente"
GROUP 2 GROUP 2
END END
@ -143,8 +136,8 @@ NUMBER F_SOTTOC_FORN 6
BEGIN BEGIN
PROMPT 54 3 "Fornitore " PROMPT 54 3 "Fornitore "
HELP "Codice del conto da visualizzare" HELP "Codice del conto da visualizzare"
WARNING "Fornitore inesistente" FLAGS "R"
FIELD LF_SALDI->SOTTOCONTO KEY 1
USE LF_CLIFO USE LF_CLIFO
INPUT TIPOCF "F" INPUT TIPOCF "F"
INPUT CODCF F_SOTTOC_FORN INPUT CODCF F_SOTTOC_FORN
@ -154,10 +147,8 @@ BEGIN
DISPLAY "Conto" CONTO DISPLAY "Conto" CONTO
OUTPUT F_SOTTOC_FORN CODCF OUTPUT F_SOTTOC_FORN CODCF
OUTPUT F_DESCR_FORN RAGSOC OUTPUT F_DESCR_FORN RAGSOC
VALIDATE CHECK_FIELD F_SOTTOC_FORN
FLAGS "R"
CHECKTYPE NORMAL CHECKTYPE NORMAL
KEY 1 VALIDATE CHECK_FIELD F_SOTTOC_FORN
WARNING "Fornitore inesistente" WARNING "Fornitore inesistente"
GROUP 3 GROUP 3
END END
@ -166,13 +157,17 @@ STRING F_DESCR_CONTO 50
BEGIN BEGIN
PROMPT 4 4 "Descrizione " PROMPT 4 4 "Descrizione "
HELP "Descrizione del conto da visualizzare" HELP "Descrizione del conto da visualizzare"
FIELD DESCR
USE LF_PCON KEY 2 USE LF_PCON KEY 2
INPUT DESCR F_DESCR_CONTO INPUT DESCR F_DESCR_CONTO
DISPLAY "Descrizione@50" DESCR DISPLAY "Descrizione@50" DESCR
DISPLAY "Gruppo" GRUPPO DISPLAY "Gruppo" GRUPPO
DISPLAY "Conto" CONTO DISPLAY "Conto" CONTO
DISPLAY "Sottoconto" SOTTOCONTO DISPLAY "Sottoconto" SOTTOCONTO
COPY OUTPUT F_SOTTOCONTO OUTPUT F_GRUPPO GRUPPO
OUTPUT F_CONTO CONTO
OUTPUT F_SOTTOCONTO SOTTOCONTO
OUTPUT F_DESCR_CONTO DESCR
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
KEY 2 KEY 2
GROUP 1 GROUP 1
@ -182,6 +177,7 @@ STRING F_DESCR_CLIENTE 50
BEGIN BEGIN
PROMPT 4 4 "Cliente " PROMPT 4 4 "Cliente "
HELP "Ragione sociale del cliente da visualizzare" HELP "Ragione sociale del cliente da visualizzare"
KEY 4
USE LF_CLIFO KEY 2 USE LF_CLIFO KEY 2
INPUT TIPOCF "C" INPUT TIPOCF "C"
INPUT RAGSOC F_DESCR_CLIENTE INPUT RAGSOC F_DESCR_CLIENTE
@ -190,7 +186,6 @@ BEGIN
DISPLAY "Conto" CONTO DISPLAY "Conto" CONTO
DISPLAY "Codice" CODCF DISPLAY "Codice" CODCF
COPY OUTPUT F_SOTTOC_CLIENTE COPY OUTPUT F_SOTTOC_CLIENTE
KEY 3
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
GROUP 2 GROUP 2
END END
@ -199,6 +194,7 @@ STRING F_DESCR_FORN 50
BEGIN BEGIN
PROMPT 4 4 "Fornitore " PROMPT 4 4 "Fornitore "
HELP "Ragione sociale del fornitore da visualizzare" HELP "Ragione sociale del fornitore da visualizzare"
KEY 4
USE LF_CLIFO KEY 2 USE LF_CLIFO KEY 2
INPUT TIPOCF "F" INPUT TIPOCF "F"
INPUT RAGSOC F_DESCR_FORN INPUT RAGSOC F_DESCR_FORN
@ -207,7 +203,6 @@ BEGIN
DISPLAY "Conto" CONTO DISPLAY "Conto" CONTO
DISPLAY "Codice" CODCF DISPLAY "Codice" CODCF
COPY OUTPUT F_SOTTOC_FORN COPY OUTPUT F_SOTTOC_FORN
KEY 4
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
GROUP 3 GROUP 3
END END