Home › Fóruns › Dúvidas e Problemas relacionados ao UserControl ShowDelphi Edition › UserControl com controle por FILIAL
Alguém já usou o UserControl com controle por FILIAL ?
Ou saberia me dar uma ideia de como fazer isso ?
O que pretende significar com “Control por Filial”?
Tenho um sistema aonde uso o User Control para cadastrar os usuários, mas preciso adaptar para ser por Filial, por que agora serão duas filiais.
Eu pensei em colocar o campo FILIAL em todas tabelas do sistema para diferenciar os cadastros das duas filiais, mas pode ter um usuário que vai ter acesso somente a uma FILIAL por exemplo, então precisaria diferenciar isso na cadastro de usuário do User Control.
Então queria saber se alguém já passou por algo parecido e qual foi a solução encontrada.
Eu já fiz uma coisa semelhante. Os meus utilizadores só vêm informação por “Centro de Custos”. Mas depois dentro do programa V. tem igualmente que criar uma tabela de relação dos cliente com os centros de custos.
Vou deixar-lhe a ideia:
Tenho 3 centos de custo “A” “B” e “C” mas poderia ser um cento. E, na tabela user do userscontrolo dois campos CCInicial e CCFinal. Então crio um Range indexado a áreas geográficas. Por exemplo “A” vai do 1000 -a- 2000 “B”=2001 -a- 3000 e “C”=3001 a 4000 por exemplo. Todas as tabelas do sistema tem de gravar o Campo CCustos ou outro por exemplo o CEP e alimentar uma tabela intermédia que faça a ligação coerente entre regiões:1 Região Norte, 2 Região Nordeste, 3 Região Centro-Oeste 4 Região Sudeste 5 Região Sul, estas e os Estados as Cidades dos estados os locais das cidades e assim por diante dependendo do nível de detalhe que precisa.
Eu vivo em Portugal, pais administrativamente dividido Distritos/Ilhas, com Concelhos, cidades, Vilas e freguesias. Com codigos postai distintos ai V. chamam de CEP (Código de Endereçamento Postal) e sempre que aparece um novo que ainda não existe ainda na tal tabela intermédia registo. Depois sempre que alguém quer ver/mexer e não está no range do user não deixo; mas depois à users que têm missões de contrlo e têm de ver tudo ou dois ou tres, então digo CcInicial=1000 e o CCFinal=2000 ou
ao 3300 ou 4000 se é de um só o CCinicial=3000 e o CCfinal=3000(é o mesmo) e fica ali contido. Mas haverá outra forma de fazer. Esta foi a mais simples e mais rápida que encontrei.
Correcção:
quando digo acima” Todas as tabelas do sistema tem de gravar o Campo CCustos…” quero dizer todas as tabelas master, por exemplo Clientes, Fornecedores, Moradas é aqui que tenho o CEP. Depois ligo cliente ou fornecedor com moradas, saco o CEP e com ele vou à tabela de relação intermédia ver se corresponde ao range do meu user.
Qualquer duvida disponha
Exemplo de Pesquisa:
procedure TFEdtCadastro.btnProcurarClick(Sender: TObject );
var IPessoa_ID, iCCMenor, iCCMaior: integer;
SlqFiltra:Boolean ;
begin
// Faço um Range para fazer fetch de apenas
// um registo para a Horta e para AH;
// para cá trago todos mas posso trazer tb apenas 1.
(* ***
São carregada duas variaveis Ci e CF logo a seguir a validar
*** o user e estão visiveis todo o programa
*** *)
// MainForm.cCustosI ; MainForm.cCustosF ;
iCCMenor := StrToIntDef(IbRtvCfg(36),0) ;
iCCMaior := StrToIntDef(IbRtvCfg(37),0) ;
SlqFiltra:=(MainForm.cCustosF>=iCCMenor) OR (MainForm.cCustosF<=iCCMaior);
if (MainForm.cCustosF=9999999) then // Administrador vê tudo
SlqFiltra:=False;
//’ Select * From Pessoas ‘;
If SlqFiltra Then
FSelect:=’ Select * From Pessoas P ‘+
‘ LEFT OUTER JOIN DISTRITO_CCUSTO CC ON CC.SOCIOS_ID=P.PESSOA_ID ‘
Else
FSelect:=’ Select * From Pessoas P ‘;
If Localizar(IPessoa_ID) then
begin
//Sec. Geral Não Há Filtro==Rede Local
If SlqFiltra Then
FWhere := ‘ P.PESSOA_ID = ‘ + IntToStr(IPessoa_ID) + ‘ ‘ +
‘ AND CC.C_CUSTOS BETWEEN ‘+IntToStr(MainForm.cCustosI)+’ AND ‘+
IntToStr(MainForm.cCustosF)
Else
FWhere := ‘ P.PESSOA_ID = ‘ + IntToStr(IPessoa_ID) ;
AbrirDataSet;
end;
end;
====================
eX:TABELA DISTRITO RELACIONA-SE COM TODOS OS cc
====================
DD DESIG C_CUSTOS
1 Aveiro 9 999
2 Beja 9 999
3 Braga 9 999
4 Bragança 9 999
5 Castelo Branco 9 999
6 Coimbra 9 999
7 Évora 9 999
8 Faro 9 999
9 Guarda 9 999
10 Leiria 9 999
11 Lisboa 9 999
12 Portalegre 9 999
13 Porto 9 999
14 Santarém 9 999
15 Setúbal 9 999
16 Viana do Castelo 9 999
17 Vila Real 9 999
18 Viseu 9 999
31 Ilha da Madeira 3 100
32 Ilha de Porto Santo 3 100
41 Ilha de Santa Maria 4 100
42 Ilha de Sao Miguel 4 100
43 Ilha Terceira 4 300
44 Ilha da Graciosa 4 300
45 Ilha de Sao Jorge 4 300
46 Ilha do Pico 4 600
47 Ilha do Faial 4 600
48 Ilha das Flores 4 600
49 Ilha do Corvo 4 600
99 Angola 9 999
98 Moçambique 9 999
97 Brasil 9 999
96 Estados Unidos America 9 999
95 Canadá 9 999
94 Bermudas 9 999
93 Alemanha 9 999
92 França 9 999
91 Espanha 9 999
90 Macau 9 999
89 Cabo Verde 9 999
88 Ucrânia 9 999
====================
c/ESTA VISTA ESTABELEÇO AS RELAÇOES TODAS EXISTENTE
====================
CREATE VIEW DISTRITO_CCUSTO(
CLIENTE_ID,
NOCLI_ID_ID,
CC,
DD,
DESIG,
C_CUSTOS)
AS
SELECT C.CLIENTE_ID, C.NOCLI_ID, M.CC , D.DD, D.DESIG, D.C_CUSTOS FROM CLIENTES S
INNER JOIN MORADAS M ON M.MORADA_ID=C.CLIENTE_ID
INNER JOIN DISTRITO D ON D.DD=M.DD
INNER JOIN CONCELHO C ON C.DD=D.DD AND (C.DD=M.DD AND C.CC=M.CC)
WHERE M.TPMORA=1;
Eu comecei por falr no CEP mas o CEP é apenas para alimentar os Distritos e por ai adiante porque a tabela de Codigos postais ofial é publica e tem essa informação (distritos e Conclehos) associada ao códigos postais. Então seleccionamos o Codigo Postal e ele traz a restante infomração DD=Distrito e CC=Concelho.
Não sei em que mais te possa ajudar está praticamente tudo dito.
Abraço. Vou dormir
E, POR AQUI É TUDO VALIDADO O LIMITE É O CÉU
Narba. Diga-me se as cenas que te facultei ajudaram ou não.Qq coisa estamos ai.