Patch level :10.0

Files correlati     :ca0.exe,ca0900a.msk,ca3.exe,camenu.men
Ricompilazione Demo : [ ]
Commento            :
programma anti-angcas funzionante per il bilancio di commessa; da installare e provare a dinamica


git-svn-id: svn://10.65.10.50/branches/R_10_00@21381 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2010-12-29 14:38:38 +00:00
parent 0ac2834697
commit deca4a96c3
9 changed files with 332 additions and 122 deletions

View File

@ -5,7 +5,6 @@
#include "calib01.h" #include "calib01.h"
#include "calibmsk.h" #include "calibmsk.h"
#include "catbauc.h"
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
//MASCHERA GENERICA DI TABELLA NON GERARCHICA //MASCHERA GENERICA DI TABELLA NON GERARCHICA
@ -176,7 +175,7 @@ void TTab_app_ca::common_mode(TMask& m, const bool mode_insert)
//Solo per tabella %AUC //Solo per tabella %AUC
//in ricerca semplice la ricerca viene fatta sulla tabella %AUC (quindi usa il campo F_AUC_CODICE) //in ricerca semplice la ricerca viene fatta sulla tabella %AUC (quindi usa il campo F_AUC_CODICE)
//in inserimento la ricerca va fatta sul file USER (quindi usa il campo F_AUC_CODICE1) //in inserimento la ricerca va fatta sul file USER (quindi usa il campo F_AUC_CODICE1)
if (get_tabname() == "%AUC") /*if (get_tabname() == "%AUC")
{ {
if (mode_insert) if (mode_insert)
{ {
@ -188,7 +187,7 @@ void TTab_app_ca::common_mode(TMask& m, const bool mode_insert)
m.hide(F_AUC_CODICE1); m.hide(F_AUC_CODICE1);
m.show(F_AUC_CODICE); m.show(F_AUC_CODICE);
} }
} }*/
} }
void TTab_app_ca::init_query_mode(TMask& m) void TTab_app_ca::init_query_mode(TMask& m)

View File

@ -2,6 +2,7 @@
#include <automask.h> #include <automask.h>
#include <config.h> #include <config.h>
#include <defmask.h> #include <defmask.h>
#include <dongle.h>
#include <prefix.h> #include <prefix.h>
#include <utility.h> #include <utility.h>
@ -45,9 +46,9 @@ void TGestione_permessi_CA_mask::ini2mask(const TString& username)
TConfig config(fileconf, username); TConfig config(fileconf, username);
//filtri principali //filtri principali
set(F_CODCMS, config.get("Codcms")); set(F_CODCMS, config.get("Cms"));
set(F_CDC, config.get("CdC")); set(F_CDC, config.get("Cdc"));
set(F_FASE, config.get("Fase")); set(F_FASE, config.get("Fas"));
//filtri secondari per programma //filtri secondari per programma
TSheet_field& sf_righe = sfield(F_RIGHE); TSheet_field& sf_righe = sfield(F_RIGHE);
for (int i = 0; config.exist("Prog", NULL, i); i++) for (int i = 0; config.exist("Prog", NULL, i); i++)
@ -67,9 +68,9 @@ void TGestione_permessi_CA_mask::mask2ini()
TConfig config(fileconf, username); TConfig config(fileconf, username);
//filtri principali //filtri principali
config.set("Codcms", get(F_CODCMS)); config.set("Cms", get(F_CODCMS));
config.set("CdC", get(F_CDC)); config.set("Cdc", get(F_CDC));
config.set("Fase", get(F_FASE)); config.set("Fas", get(F_FASE));
//filtri secondari per programma //filtri secondari per programma
TSheet_field& sf_righe = sfield(F_RIGHE); TSheet_field& sf_righe = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(sf_righe, r, riga) FOR_EACH_SHEET_ROW(sf_righe, r, riga)
@ -140,7 +141,16 @@ void TGestione_permessi_CA::main_loop()
bool TGestione_permessi_CA::create() bool TGestione_permessi_CA::create()
{ {
return TSkeleton_application::create(); const TString& utente = user();
if (utente.compare(::dongle().administrator()) != 0)
{
TString msg;
msg << "Utente " << utente << " non autorizzato all'uso di questo programma!";
return error_box(msg);
}
return TSkeleton_application::create();
} }
int ca0900 (int argc, char* argv[]) int ca0900 (int argc, char* argv[])

View File

@ -58,6 +58,7 @@ BEGIN
ITEM "Commesse@50" ITEM "Commesse@50"
ITEM "Cdc@50" ITEM "Cdc@50"
ITEM "Fasi@50" ITEM "Fasi@50"
FLAGS "|"
END END
ENDPAGE ENDPAGE
@ -76,32 +77,47 @@ END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 0 3 "Esempi" PROMPT 0 3 "La variabile va indicata come $(CMS), $(CDC), $(FAS). Il valore va tra apici."
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 0 4 "CODCMS=codicecommessa, CODCMS=cod*, CODCMS?=cod" PROMPT 0 4 "Esempi"
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 0 5 "CODCOSTO=codicecdc, CODCOSTO=cod*, CODCOSTO?=cod" PROMPT 0 5 " ($(CMS)='codicecommessa')||($(CMS)?='cod*')"
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 0 6 "CODFASE=codicefase, CODFASE=cod*, CODFASE?=cod" PROMPT 0 6 " $(CDC)?='cod*'"
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 0 7 "Nota: il filtro sulle fasi è applicabile solo se le fasi NON sono collegate a" PROMPT 0 7 " ($(FAS)='codicefase1')&&($(FAS)='codicefase2')"
END END
TEXT -1 TEXT -1
BEGIN BEGIN
PROMPT 0 8 "commesse e CdC in configurazione contabilità analitica" PROMPT 0 8 "I valori sulla maschera principale si applicano a tutti i programmi che gestiscono Cms/CdC/Fasi"
END
TEXT -1
BEGIN
PROMPT 0 9 "I valori sullo sheet si applicano al solo programma indicato nel primo campo della riga: es. ca3 -7"
END
TEXT -1
BEGIN
PROMPT 0 10 "Nota: il filtro sulle fasi è applicabile solo se le fasi NON sono collegate a"
END
TEXT -1
BEGIN
PROMPT 0 11 "commesse e CdC in configurazione contabilità analitica!!!"
END END
ENDPAGE ENDPAGE

View File

@ -172,6 +172,12 @@ TPrint_bilancio_cms_mask::TPrint_bilancio_cms_mask()
} //for(int i=0.. } //for(int i=0..
} //if(levels>=2.. } //if(levels>=2..
} //if(use_pdcc.. } //if(use_pdcc..
//filtro sui permessi utente (centro di costo e fase)
if (ca_create_user_select_clause(LF_CDC).full())
efield(F_CDC).browse()->cursor()->set_filterfunction(ca_filter_function);
if (ca_create_user_select_clause(LF_FASI).full())
efield(F_FASE).browse()->cursor()->set_filterfunction(ca_filter_function);
//***ACHTUNG!!!*** //***ACHTUNG!!!***
//Questa chiamata serve per generare i campi fase/commessa esattamente come strutturati nella configurazione.. //Questa chiamata serve per generare i campi fase/commessa esattamente come strutturati nella configurazione..
@ -307,7 +313,15 @@ void TPrint_bilancio_cms::print_or_preview(const bool stampa)
//stampa tutte le fasi distinte in modo riassuntivo (crpa dedicate) //stampa tutte le fasi distinte in modo riassuntivo (crpa dedicate)
TString_array lista_fasi; TString_array lista_fasi;
//crea un TString_array con tutte le fasi distinte non ripetute //crea un TString_array con tutte le fasi distinte non ripetute
TISAM_recordset file_fasi("USE FASI"); TString query;
query = "USE FASI";
const TString& select = ca_create_user_select_clause(LF_FASI);
if (select.full())
query << "\nSELECT " << select;
TISAM_recordset file_fasi(query);
for (TRecnotype j = 0; file_fasi.move_to(j); j++) for (TRecnotype j = 0; file_fasi.move_to(j); j++)
{ {
const TString16 curr_fase = file_fasi.get(FASI_CODFASE).as_string(); const TString16 curr_fase = file_fasi.get(FASI_CODFASE).as_string();
@ -340,7 +354,15 @@ void TPrint_bilancio_cms::print_or_preview(const bool stampa)
//stampa tutte le fasi distinte in modo riassuntivo (crpa dedicate) //stampa tutte le fasi distinte in modo riassuntivo (crpa dedicate)
TString_array lista_cdc; TString_array lista_cdc;
//crea un TString_array con tutte le fasi distinte non ripetute //crea un TString_array con tutte le fasi distinte non ripetute
TISAM_recordset file_cdc("USE CDC"); TString query;
query = "USE CDC";
//filtra per utente se l'utente ha limitazioni sui CDC
const TString& select = ca_create_user_select_clause(LF_CDC);
if (select.full())
query << "\nSELECT " << select;
TISAM_recordset file_cdc(query);
for (TRecnotype j = 0; file_cdc.move_to(j); j++) for (TRecnotype j = 0; file_cdc.move_to(j); j++)
{ {
const TString& curr_cdc = file_cdc.get(CDC_CODCOSTO).as_string(); const TString& curr_cdc = file_cdc.get(CDC_CODCOSTO).as_string();

View File

@ -547,41 +547,66 @@ const TDate TPrint_saldana_recordset::calcola_min_datacomp(const TDate& datainie
} }
//crea la query base per la scansione dei SALDANA; si usa nelle parse_saldana e parse_saldana_futuri const TString& TPrint_saldana_recordset::crea_select(const int logicnum)
TString TPrint_saldana_recordset::crea_query_saldana()
{ {
TString query; TString select = ca_create_user_select_clause(logicnum);
query = "USE SALDANA"; //void ca_append_and(TString& query, const TString& clause)
switch (_tipostampa) switch (_tipostampa)
{ {
case 0: break;
case 1: case 1:
case 4: case 4:
if (_fase.full()) if (_fase.full())
query << " SELECT FASE=\"" << _fase << "\""; {
TString clause;
clause << ca_dollar2fieldname(logicnum, "$(FAS)") << "=\"" << _fase << "\"";
ca_append_and(select, clause);
}
break; break;
case 2: case 2:
case 8: case 8:
if (_cdc.full()) if (_cdc.full())
query << " SELECT COSTO=\"" << _cdc << "\""; {
TString clause;
clause << ca_dollar2fieldname(logicnum, "$(CDC)") << "=\"" << _cdc << "\"";
ca_append_and(select, clause);
}
break; break;
case 3: case 3:
if (_fase.full() || _cdc.full()) if (_fase.full() || _cdc.full())
{ {
TString clause;
if (_fase.full() && _cdc.full()) if (_fase.full() && _cdc.full())
query << " SELECT (FASE=\"" << _fase << "\")&&(COSTO=\"" << _cdc << "\")"; clause << "(" << ca_dollar2fieldname(logicnum, "$(FAS)") << "=\"" << _fase
<< "\")&&(" << ca_dollar2fieldname(logicnum, "$(CDC)") << "=\"" << _cdc << "\")";
else else
{ {
if (_fase.full()) if (_fase.full())
query << " SELECT FASE=\"" << _fase << "\""; clause << ca_dollar2fieldname(logicnum, "$(FAS)") << "=\"" << _fase << "\"";
else else
query << " SELECT COSTO=\"" << _cdc << "\""; clause << ca_dollar2fieldname(logicnum, "$(CDC)") << "=\"" << _cdc << "\"";
} }
ca_append_and(select, clause);
} }
break; break;
} }
return query; return get_tmp_string() = select;
}
//crea la query base per la scansione dei SALDANA; si usa nelle parse_saldana e parse_saldana_futuri
const TString& TPrint_saldana_recordset::crea_query_saldana()
{
const TString& select = crea_select(LF_SALDANA);
TString query;
query = "USE SALDANA";
if (select.full())
query << " SELECT " << select;
return get_tmp_string() = query;
} }
@ -615,7 +640,7 @@ void TPrint_saldana_recordset::parse_saldana(TAssoc_array* cms, const TDate& dat
if (_tipo == 9) if (_tipo == 9)
{ {
//non vanno considerati saldi di esercizi futuri a quello scelto!!! //non vanno considerati saldi di esercizi futuri a quello scelto!!!
query << "USE SALDANA"; query = "USE SALDANA";
} }
TISAM_recordset saldana_set(query); TISAM_recordset saldana_set(query);
@ -974,37 +999,11 @@ void TPrint_saldana_recordset::parse_rmovana(TAssoc_array* cms, const TDate& dat
TString query; TString query;
query << "USE RMOVANA KEY 3\n"; query << "USE RMOVANA KEY 3\n";
switch (_tipostampa) const TString& select = crea_select(LF_RMOVANA);
{ if (select.full())
case 1: query << " SELECT " << select;
case 4:
if (_fase.full())
query << "SELECT CODFASE=\"" << _fase << "\"\n";
break;
case 2:
case 8:
if (_cdc.full())
query << "SELECT CODCCOSTO=\"" << _cdc << "\"\n";
break;
case 3:
if (_fase.full() || _cdc.full())
{
if (_fase.full() && _cdc.full())
query << "SELECT (CODFASE=\"" << _fase << "\")&&(CODCCOSTO=\"" << _cdc << "\")\n";
else
{
if (_fase.full())
query << "SELECT CODFASE=\"" << _fase << "\"\n";
else
query << "SELECT CODCCOSTO=\"" << _cdc << "\"\n";
}
}
break;
default:
break;
}
query << "JOIN MOVANA INTO NUMREG==NUMREG" query << "\nJOIN MOVANA INTO NUMREG==NUMREG"
<< "\nFROM DATACOMP=#MINDATACOMP" << "\nFROM DATACOMP=#MINDATACOMP"
<< "\nTO DATACOMP=#DATACALCOLO"; << "\nTO DATACOMP=#DATACALCOLO";
TISAM_recordset recset(query); TISAM_recordset recset(query);
@ -1066,36 +1065,12 @@ void TPrint_saldana_recordset::parse_rdoc_ordini(TAssoc_array* cms, const TDate&
query << "USE RDOC KEY 1\n"; query << "USE RDOC KEY 1\n";
query << "SELECT (BETWEEN(DOC.DATADOC,#DATAINIES,#DATACALCOLO))&&(RIGAEVASA!=\"X\")"; query << "SELECT (BETWEEN(DOC.DATADOC,#DATAINIES,#DATACALCOLO))&&(RIGAEVASA!=\"X\")";
//filtro su cdc/cms/fasi (fatto come per saldi e rmovana; purtroppo non si può metodizzare perchè in tutti i files.. //filtro su cdc/cms/fasi (fatto come per saldi e rmovana; in tutti i files..
//..i nomi dei campi sono diversi! //..i nomi dei campi sono diversi! -> tentiamo con il metodo automaggico
switch (_tipostampa) const TString& select = crea_select(LF_RIGHEDOC);
if (select.full())
{ {
case 1: query << "&&(" << select << ")";
case 4:
if (_fase.full())
query << "&&(FASCMS=\"" << _fase << "\")";
break;
case 2:
case 8:
if (_cdc.full())
query << "&&(CODCOSTO=\"" << _cdc << "\")";
break;
case 3:
if (_fase.full() || _cdc.full())
{
if (_fase.full() && _cdc.full())
query << "&&(FASCMS=\"" << _fase << "\")&&(CODCOSTO=\"" << _cdc << "\")";
else
{
if (_fase.full())
query << "&&(FASCMS=\"" << _fase << "\")";
else
query << "&&(CODCOSTO=\"" << _cdc << "\")";
}
}
break;
default:
break;
} }
query << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC" query << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC"
@ -1339,6 +1314,10 @@ void TPrint_saldana_recordset::parse_rdoc_fatture(TAssoc_array* cms, const TDate
continue; continue;
if (_fase.not_empty() && rmovana.get(RMOVANA_CODFASE) != _fase) if (_fase.not_empty() && rmovana.get(RMOVANA_CODFASE) != _fase)
continue; continue;
//ulteriore controllo in base ai permessi utente! se il record non rispetta i permessi viene saltato!
if (!ca_filter_record(rmovana))
continue;
//metodo per il calcolo importo riga riproporzionato //metodo per il calcolo importo riga riproporzionato
//metodo per generare i saldi alla data della riga analitica in base alla vita della riga //metodo per generare i saldi alla data della riga analitica in base alla vita della riga
@ -1398,8 +1377,8 @@ void TPrint_saldana_recordset::create_lines_to_print()
// si fa solo se l'utente Adolfo lo ha deciso sulla maschera // si fa solo se l'utente Adolfo lo ha deciso sulla maschera
if (_include_documenti) if (_include_documenti)
{ {
parse_rdoc_ordini(cms, datainiesc, datafinesc); parse_rdoc_ordini(cms, datainiesc, datafinesc);
parse_rdoc_fatture(cms, datainiesc, datafinesc); parse_rdoc_fatture(cms, datainiesc, datafinesc);
} }
} //if(_tipo==8)... } //if(_tipo==8)...

View File

@ -108,7 +108,8 @@ protected:
void parse_saldana_futuri(); void parse_saldana_futuri();
void parse_rdoc_ordini(TAssoc_array* cms, const TDate& datainiesc, const TDate& datafinesc); void parse_rdoc_ordini(TAssoc_array* cms, const TDate& datainiesc, const TDate& datafinesc);
void parse_rdoc_fatture(TAssoc_array* cms, const TDate& datainiesc, const TDate& datafinesc); void parse_rdoc_fatture(TAssoc_array* cms, const TDate& datainiesc, const TDate& datafinesc);
TString crea_query_saldana(); const TString& crea_select(const int logicnum);
const TString& crea_query_saldana();
//per il solo ca3800 //per il solo ca3800
void aggiorna_importo(TAssoc_array& riga_array, const TString& livello, const int indbil, void aggiorna_importo(TAssoc_array& riga_array, const TString& livello, const int indbil,

View File

@ -1,3 +1,5 @@
#include <applicat.h>
#include <config.h>
#include <dongle.h> #include <dongle.h>
#include <modaut.h> #include <modaut.h>
#include <tree.h> #include <tree.h>
@ -6,12 +8,15 @@
#include <mov.h> #include <mov.h>
#include <pconti.h> #include <pconti.h>
#include <doc.h>
#include <rdoc.h>
#include "calib01.h" #include "calib01.h"
#include "calib02.h" #include "calib02.h"
#include "calibmsk.h" #include "calibmsk.h"
#include "../cg/cg2103.h" #include "../cg/cg2103.h"
#include "cdc.h"
#include "commesse.h" #include "commesse.h"
#include "fasi.h" #include "fasi.h"
#include "movana.h" #include "movana.h"
@ -20,6 +25,7 @@
#include "rrip.h" #include "rrip.h"
#include "saldana.h" #include "saldana.h"
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// TConfig_anal // TConfig_anal
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
@ -357,38 +363,207 @@ bool ca_test_multilevel_field(TEdit_field& fld, int level)
// Utilities // Utilities
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
static const TString & ca_create_user_select_clause(int logic) const char* ca_dollar2fieldname(int logic, const char* dollar)
{ {
TString & select = get_tmp_string(128); CHECKS(dollar && *dollar == '$', "False dollar", dollar);
const char* fieldname = NULL; //cerca il nome del campo della variabile dollarata nel file logic in questione
if (xvt_str_compare_ignoring_case(dollar, "$(CDC)") == 0)
switch (logic) {
{ switch (logic)
case LF_COMMESSE: {
fieldname = "S0"; case LF_DOC: return DOC_CODCOSTO;
break; case LF_RIGHEDOC: return RDOC_CODCOSTO;
case LF_CDC: case LF_RMOVANA: return RMOVANA_CODCCOSTO;
fieldname = "S1"; case LF_SALDANA: return SALDANA_COSTO;
break; default : return CDC_CODCOSTO;
case LF_FASI: }
fieldname = "S2"; }
break; if (xvt_str_compare_ignoring_case(dollar, "$(CMS)") == 0)
default: {
break; switch (logic)
} {
if (fieldname != NULL) case LF_DOC: return DOC_CODCMS;
{ case LF_RIGHEDOC: return RDOC_CODCMS;
const TString utente(user()); case LF_FASI: return FASI_CODCMSFAS;
const TString gruppo(cache().get(LF_USER, utente,"GROUPNAME")); case LF_RMOVANA: return RMOVANA_CODCMS;
case LF_SALDANA: return SALDANA_COMMESSA;
if (gruppo.full()) default : return COMMESSE_CODCOSTO;
select = cache().get("%AUC", gruppo, fieldname); }
if (utente.full()) }
select = cache().get("%AUC", utente, fieldname); if (xvt_str_compare_ignoring_case(dollar, "$(FAS)") == 0)
} {
return select; switch (logic)
{
case LF_DOC: return DOC_FASCMS;
case LF_RIGHEDOC: return RDOC_FASCMS;
case LF_RMOVANA: return RMOVANA_CODFASE;
case LF_SALDANA: return SALDANA_FASE;
default : return FASI_CODFASE;
}
}
return NULL;
} }
void ca_append_and(TString& query, const TString& clause)
{
if (clause.full())
{
if (query.full())
{
query.insert("(");
query << ")&&(" << clause << ")";
}
else
query = clause;
}
}
static const TString& ca_get_user_permissions(const TString& utente, const int logic)
{
TString select;
const TString gruppo(cache().get(LF_USER, utente, "GROUPNAME"));
if (gruppo.full())
select = ca_get_user_permissions(gruppo, logic);
TFilename fileconf = firm2dir(-1); // Directory dati
fileconf.add("config"); // + Directory config
fileconf.add("ca0900conf.ini");
TConfig ini_permessi(fileconf);
if (ini_permessi.set_paragraph(utente))
{
const char* fieldname = NULL;
switch (logic)
{
case LF_COMMESSE: fieldname = "Cms"; break;
case LF_CDC: fieldname = "Cdc"; break;
case LF_FASI: fieldname = "Fas"; break;
default: break;
}
if (fieldname != NULL)
{
const TString& expr = ini_permessi.get(fieldname);
ca_append_and(select, expr);
//che programma sono che chiamo questa funzione?
const TFilename prog_name = main_app().argv(0);
TString8 key = prog_name.name_only();
key << " " << main_app().argv(1);
TToken_string row(80, SAFE_PIPE_CHR);
for (int r = 0;; r++)
{
row = ini_permessi.get("Prog", NULL, r);
if (row.blank())
break;
if (key == row.get(0))
{
int column = 0;
switch (logic)
{
case LF_COMMESSE: column = 1; break;
case LF_CDC: column = 2; break;
case LF_FASI: column = 3; break;
default: break;
}
const TString& prog_expr = row.get(column);
ca_append_and(select, prog_expr);
} //if (key == row.get(0))...
} //for (int r = 0;; r++)...
} //if (fieldname...
} //if (ini_permessi.set...
return select.full() ? (get_tmp_string() = select) : EMPTY_STRING;
}
static const TString& ca_get_user_permissions_or_empty(const TString& utente, const int logic)
{
const TString& perm = ca_get_user_permissions(utente, logic);
if (perm.full())
{
TString& subclause = get_tmp_string();
subclause << "(" << perm << ")||($(";
switch (logic)
{
case LF_CDC: subclause << "CDC"; break;
case LF_COMMESSE: subclause << "CMS"; break;
case LF_FASI: subclause << "FAS"; break;
default: break;
}
subclause << ")==\"\")";
return subclause;
}
return EMPTY_STRING;
}
const TString& ca_create_user_select_clause(int logic)
{
static TArray clauses;
TString* clause = (TString*)clauses.objptr(logic);
if (clause == NULL)
{
clause = new TString;
switch (logic)
{
case LF_CDC:
case LF_COMMESSE:
case LF_FASI:
*clause = ca_get_user_permissions(user(), logic);
break;
case LF_DOC:
case LF_RIGHEDOC:
case LF_RMOVANA:
case LF_SALDANA:
ca_append_and(*clause, ca_get_user_permissions_or_empty(user(), LF_CDC));
ca_append_and(*clause, ca_get_user_permissions_or_empty(user(), LF_COMMESSE));
ca_append_and(*clause, ca_get_user_permissions_or_empty(user(), LF_FASI));
break;
default:
break;
}
for (int dollar = clause->find("$("); dollar >= 0; dollar = clause->find("$(", dollar))
{
const int closed = clause->find(')', dollar + 4);
const TString& before = clause->left(dollar);
const TString& field = clause->sub(dollar, closed + 1);
const TString& after = clause->mid(closed + 1);
clause->cut(0) << before << ca_dollar2fieldname(logic, field) << after;
}
clauses.add(clause, logic);
}
return *clause;
}
bool ca_filter_record(const TRectype& rec)
{
bool good = true;
const TString& filter = ca_create_user_select_clause(rec.num());
if (filter.full())
{
TExpression expr(filter, _strexpr);
for (int v = expr.numvar() - 1; v >= 0; v--)
{
const char* field = expr.varname(v);
expr.setvar(v, rec.get(field));
}
good = expr.as_bool();
}
return good;
}
bool ca_filter_function(const TRelation* rel)
{
return rel != NULL && ca_filter_record(rel->curr());
}
static void ca_append_select_clause(ostream& out, int level, int logic, bool upper_limit) static void ca_append_select_clause(ostream& out, int level, int logic, bool upper_limit)
{ {
TString str; TString str;

View File

@ -68,6 +68,14 @@ public:
const TMultilevel_code_info& ca_multilevel_code_info(int logicnum); const TMultilevel_code_info& ca_multilevel_code_info(int logicnum);
const TMultilevel_code_info* ca_multilevel_code_info_by_index(int level); const TMultilevel_code_info* ca_multilevel_code_info_by_index(int level);
bool ca_test_multilevel_field(TEdit_field& fld, int level); bool ca_test_multilevel_field(TEdit_field& fld, int level);
//metodi di filtraggio avanzato anche in base ai permessi utente
const char* ca_dollar2fieldname(int logic, const char* dollar);
void ca_append_and(TString& query, const TString& clause);
const TString& ca_create_user_select_clause(int logic);
bool ca_filter_record(const TRectype& rec);
bool ca_filter_function(const TRelation* rel);
int ca_create_fields(TMask& msk, int page, int logicnum, int x, int y, short key_id, short des_id, int ca_create_fields(TMask& msk, int page, int logicnum, int x, int y, short key_id, short des_id,
unsigned int mode = 0x0, const char* fieldname = NULL, int from = 0); unsigned int mode = 0x0, const char* fieldname = NULL, int from = 0);
int ca_create_fields_compact(TMask& msk, int page, int logicnum, int x, int y, int ca_create_fields_compact(TMask& msk, int page, int logicnum, int x, int y,

View File

@ -36,7 +36,7 @@ Item_01 = "Piano dei conti", "ca0 -3", "SF"
Item_02 = "Centri di costo", "ca0 -4", "SF" Item_02 = "Centri di costo", "ca0 -4", "SF"
Item_03 = "Commesse", "ca0 -5", "SF" Item_03 = "Commesse", "ca0 -5", "SF"
Item_04 = "Fasi", "ca0 -6", "SF" Item_04 = "Fasi", "ca0 -6", "SF"
Item_05 = "Selezione archivi per Utente", "ca0 -0 %AUC", "" Item_05 = "Selezione archivi per Utente", "ca0 -8", "P"
Item_06 = "Responsabili commessa", "ca0 -0 RSP", "F" Item_06 = "Responsabili commessa", "ca0 -0 RSP", "F"
Item_07 = "Tipi Lavoro", "ca0 -0 TPL", "F" Item_07 = "Tipi Lavoro", "ca0 -0 TPL", "F"