Bem pior do que isso é aquando do registo no histórico de apenas os campos alterados! Na maioria das vezes, não dá para perceber a que registo da tabela/ficheiro pertence a alteração. Falta o elemento de identificação unívoca PKey ou outro. Tabém parece que no unit UCHist_Form este código ou semelhante ajudaria muito; deixo ao V/criterio a sua implementação “Oficial” ou não:
procedure TFrmHistorico.StringGrid1DrawCell(Sender: TObject; ACol,
ARow: Integer; Rect: TRect; State: TGridDrawState);
Var sa, sb:string;
begin
// 1.º evolui sobre a coluna depois sobre a linha
if ACol=1 then
sa:=Trim(StringGrid1.Cells[ACol,ARow])
else
if ACol>1 then
sa:=Trim(StringGrid1.Cells[ACol-1,ARow]);
if ACol=2 then
sb:=Trim(StringGrid1.Cells[ACol,ARow]) ;
if ACol =2 then
if ARow>1 then
if ( sb <> sa ) then
begin
StringGrid1.Canvas.Brush.Color := $00940A4B;
StringGrid1.Canvas.Font.Style := [fsBold];
StringGrid1.Canvas.Font.Color := clYellow; // clHighlightText;
StringGrid1.Canvas.FillRect(Rect);
StringGrid1.Canvas.TextOut(Rect.Left+2,Rect.Top+2,StringGrid1.Cells[ACol, ARow]);
end ;
end;
Abraço
Mário
Por favor, alguém pode dizer-me qual é a última versão do UC-sd? Obrigado
Peço desculpa pela insistência e obviamente que este não será o lugar
mais indicado para esta questão, digo eu! Porém à falta de melhor..
Verifico que o pessoal está usando versões avançadas do Delphi …
só que ainda vou no XE7 e dá para fazer tudo o que necessito, pelo menos até hoje.
A questão que a últma versão do UC Swdelphi não compila e na que tenho 2.2o Firedac tem problemas não vê u UC e vice versa se não estiver no mesmo form?
Como faço alguém me ajuda a compila-lo para XE7? Obrigado
Estou há 2/3 dias a tentar instalar a última versão do UserControl no Delphi XE7 e não instala, por mais voltas que lhe
dê, são só erros; seja a partir do Instalador seja manualmente!
Francamente não compreendo! Obrigado
Como você resolveu? E, qual o connector que está tentando usar?
Narba. Diga-me se as cenas que te facultei ajudaram ou não.Qq coisa estamos ai.
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
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
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.
O que pretende significar com “Control por Filial”?
Prezado Amigo,Aqui, onde diz: “Devido a implementação da classe TUCCurrentUser acima o método TUserControl.RegistraCurrentUser(Dados: TDataSet; Pass: String) ficou assim”:
Significa exctamente que já não precisamos mais usar o codigo que começo por implementar método no inicio(?) designadamente, quando fazia: if Assigned(FPerfilUsuario) then
FreeAndNil(FPerfilUsuario);
— if Assigned(FPerfilGrupo) then
FreeAndNil(FPerfilGrupo);
percebi bem? é isso mesmo? Obirgado
Bom, não expliquei que ainda estou a usar o Delphi XE7; tentei com a função FreeAndNil e não compilou, mas com LFieldList.Free correu bem.
Enquanto isso verifiquei talvez me falte incluir na
interface
uses
Classes,
System
, UCSettings;
porque causa do “System.SysUtils.FreeAndNil” ou talvez nem seja necessário já que fazem o mesmo.
De qualquer forma muito Obrigado. Agora é só trabalho de sapa e uns testes e voltarei aqui a dizer se funciona bem só assim.
Obrigado mesmo.
Não se repararam que o Vagner corrigiu o memoty leaks. Pedi k ele partilhasse o código, mas ele, ou não viu ainda ou só quer fazê-lo by the book(Como manda o livrinho)!?
Não sei é. Às tantas se houver mais gente a pedir o mesmo, pode ser que se apresse a partilhá-lo.
Enquanto isso, não poderia partilhar connosco como resolveu o problema para aqueles entre nós que têm o mesmo problema o corrijam sem estar à espera que seja corrigido e republicado no site, pois isso provavelmente irá demorar.
Já agora pergunto se você usa o UCHISTORIC, é que com esse então não se fala. São só problemas. Obrigado
Sim há uma forma. Eu fiz isso não lembro exactamento como ; mas a questão
é que o componente faz simplesmente commit [fecha a tabela] (e eu faço) CommitRetaining para manter os dados visiveis