problema 3 camadas com clientdataset e poo

Delphi

31/10/2006

Pessoas é o seguinte, eu postei uma mensagem aqui hoje cedo, após muita pesquisa eu desobri mais ou menos o que acontece, eu estou fazendo meu TCC em 3 camadas e orientado a objetos, o ´botão´ da minha aplicação chama um método da minha aplicação servidora, esta instancia, passa alguns parâmetros para o objeto( no caso, é um objeto da classe usuário , que eu uso para fazer verificações de permissão) e este método da classe, trabalha manipulando um TSQLQuery. Eu tenho um Client Dataset ligado nessa query na aplicação cliente, o problema é o seguinte, o clientdataset tem por padrão abrir e fechar a query, pois ele utiliza os dados somente quando ele precisa, mas a minha aplicação servidora, precisa desse query sempre ligado, pois qualquer método que é chamado, pega o coduser da query para gravar no registro da tabela correspondente, apenas a fins de auditoria. Como posso usar o query dataset ligado nessa query e mante-la sempre aberta, sem que o clientdataset a fecha sozinha ?


Brunocantelli

Brunocantelli

Curtidas 0

Respostas

Marco Salles

Marco Salles

31/10/2006

na verdade quem fecha a query é o DataSetprovider

Porem não conheço nenhuma propriedade que impeçaque isto ocorra

Mas se voce colocar depois do Dm.CdsUsuario.Open;
o comando Dm.SuaQuery.Active:=True; ela não ficara aberta ????


procedure TFrmLogin.ActLoginExecute(Sender: TObject); begin validado:=false; If Dm.conMercado.AppServer.ValidaUsuario( EdtUsuario.text,EdtSenha.text)=´VALIDO´ then begin validado:=true; close; Dm.CdsUsuario.Open; //Dm.CdsUsuario.Refresh; end else begin Application.MessageBox(´Senha ou usuário Incorreto, Tente novamente´, ´Dados Incorretos´, mb_IconExclamation + MB_OK); EdtSenha.SetFocus; end; end;



GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

na verdade não, olha só que estranho, como eu uso essa qryusuarios para fazer a validação do login com clientdataset e também utilizo para métodos da minha aplicação servidora( daí a necessidade de ela estar sempre aberta), eu criei outro método na aplicação servidora para fazer a mesma coisa com um outro SqlQuery, chamado SqlLogin, só olha que estranho, a ClientDataSet parou de ficar linkada no qryusuarios, e mesmo sendo ligada agora em sqllogin, e mesmo assim, ele continua dando esses paus de não encontrar campo coduser por exemplo, nunca vi nada igual


GOSTEI 0
Marco Salles

Marco Salles

31/10/2006

eu não entendi ???

Voce disse na sua replica :

na verdade não,


Na verdade não o que ???

esta sua afirmação é sobre :

na verdade quem fecha a query é o DataSetprovider [b:fe54e7c309]ou sobre[/b:fe54e7c309] Mas se voce colocar depois do Dm.CdsUsuario.Open; o comando Dm.SuaQuery.Active:=True; ela não ficara aberta ????



GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

na verdade não :
´Mas se voce colocar depois do Dm.CdsUsuario.Open;
o comando Dm.SuaQuery.Active:=True; ela não ficara aberta ???? ´

achei muito estranho, estou utilizando um outro objeto TQuery que não tem DatasetProvider ligado, usando o mesmo método que o que tem usa, mas ele também esta fechando sozinho, e o gozado, é que estou utilizando a palavra var na frente dos parâmetros para ele não tirar cópia e fazer no objeto mesmo :

procedure TUsuario.RetornaUsuarioSenha(var SqlAux: TSqlQuery;
Conexao: TSqlConnection);
begin
With SqlAux do
begin
Close;
SqlConnection:=conexao;
Sql.Clear;
Sql.Add(´SELECT * FROM USUARIO´);
Sql.Add(´WHERE LOGIN=:USUARIO´);
Params.ParamByName(´USUARIO´).AsString:=nome;
Open;
end;
end;

sinceramente, não entendo o que possa estar acontecendo !


GOSTEI 0
Marco Salles

Marco Salles

31/10/2006

´Mas se voce colocar depois do Dm.CdsUsuario.Open; o comando Dm.SuaQuery.Active:=True; ela não ficara aberta ???? ´


[b:86e935c052]Era para ficar aberto... Desde que a conexão esteja aberta[/b:86e935c052]

Voce tem certeza , que a sua conexão esta aberta ????

Existe a propriedade KeepConeection que se pode controlar o fechamento ou não da conexão com o banco...


GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

tenho certeza que ela esta aberta, afinal, é para isso que serve o var na frente de SqlAux, onde SqlAux é a query que eu estou passando como parâmetro, isso quer dizer , ele vai lá, pega essa query, limpa a propriedade Sql dela, adiciona umas linhas do sql e dá o método open, que é equivalente a active:=true. E pelo fato de ter o var na frente, ele não tira cópia da query e trabalha na cópia, e sim, ele trabalhar diretamente com a query.só que o mais estranho é que eu coloquei um método na que verifica se a query esta aberta e me dar um showmessage e ele me da o showmessage do else, dizendo que ela esta fechada. Já estou há 3 dias com este problema, e ja patinei 24 horas ao total e não consegui resolver, antes eu estava usando apenas uma query, que serviria para validar o usuário e ficar com essa linha enquando o sistema tivésse aberto para o usuário, mas como eu tinha um dataset provider ligado nele para usar um client dataset, e descobri que o datasetprovider abre e fecha sozinho a query, conforme necessidade, ai eu coloquei no dm mais uma query e criei um novo método , que é esse abaixo, só para ele trabalhar com essa nova query que não tem o datasetprovider associada a ela e não correr este risco de ficar fechando sozinho, o mais estranho é o seguinte, no evento beforeopen dessa query nova eu coloquei um showmessage ´ABRINDO SQL TESTE´ e no evento beforeclose eu coloquei um showmessage ´FECHANDO SQL TESTE´ e quando ele abre a query ele me dá o showmessage, quando ele esta fechando não recebo mensagem algum ! muito estranho essa parada ! se alguém ja passou por algo par
procedure TUsuario.RetornaUsuarioSenha(var SqlAux: TSqlQuery;
Conexao: TSqlConnection);
begin
With SqlAux do
begin
Close;
SqlConnection:=conexao;
Sql.Clear;
Sql.Add(´SELECT * FROM USUARIO´);
Sql.Add(´WHERE LOGIN=:USUARIO´);
Params.ParamByName(´USUARIO´).AsString:=nome;
Open;
end;
end;


GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

ecido, por favor, me ajude
GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

alias, deveria estar aberta, mas não esta !


GOSTEI 0
Marco Salles

Marco Salles

31/10/2006

alias, deveria estar aberta, mas não esta !


Voce esta se referindo a conexão ????


GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

não, estou me referindo a Query, deveria estar aberta, mas não está, estarei vendo se consigo colocar as fotos do meu problema em algum lugar, para vcs tentarem me ajudar.


GOSTEI 0
Marco Salles

Marco Salles

31/10/2006

não, estou me referindo a Query, deveria estar aberta, mas não está, estarei vendo se consigo colocar as fotos do meu problema em algum lugar, para vcs tentarem me ajudar.


mas me refiro também a conexão ela esta aberta ??? :?: :?:


GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

sim, a conexão fica sempre aberta, eu deixo ela com true em tempo de projeto, me da seu email que vou tentar anexar os snapshots que tirei explicando o problema, não sei anexar foto por aqui, acho que só da se ela ja estiver na web, certo ?


GOSTEI 0
Marco Salles

Marco Salles

31/10/2006

salhamoda@uol.com.br


GOSTEI 0
Marco Salles

Marco Salles

31/10/2006

sim, a conexão fica sempre aberta, eu deixo ela com true em tempo de projeto,

Mas isto não garante que ela permaneça aberta... Com oeu disse antes .. Existe a propriedade KeepConnection que pode fechar esta conexão , sem que voce perceba


GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

to te enviando o email com os snapshots


GOSTEI 0
Marco Salles

Marco Salles

31/10/2006

Olhei as imagens ainda que rapidamente mas ja tinha uma loção da situação . Tal com foi por voce postado aqui em seu tópicos anteriores.

Concordo quase tudo que foi colocado , ate mesmo com o fato de que a
SQLText , não deveria estar desativada , a não ser que a conexão esteja desativada....

Quando eu disse que concordo com quase tudo , se refere na sua colocação do Var....

E pelo fato de ter o var na frente, ele não tira cópia da query e trabalha na cópia,


[b:3df0ddc48f]Acho que não é isso não.. Ela trabalha no mesmo espaço da memoria que o objeto [/b:3df0ddc48f].... e não tira copia.. Veja abaixo e teste no seu delphi

[b:3df0ddc48f]Quando voce chama uma procedure e passa um Objeto , automaticamente se passa por referencia [/b:3df0ddc48f], independemente de se ter ou não precidido com a palavra var..[b:3df0ddc48f]Pois na verdade o nome do objeto é uma referencia ao Objeto..[/b:3df0ddc48f]

Assim as duas chamadas são equivalentes:


procedure MudarCaptionSemVar(botao:Tbutton); begin botao.Caption:=´ola´;//tudo que fizer aui afeta o objeto chamado end; [b:3df0ddc48f];//tudo que fizer aui afeta o objeto chamado //independente se for Com Var Ou sem Var[/b:3df0ddc48f]


procedure MudarCaptionComVar(var botao:Tbutton); begin botao.Caption:=´foi´; end;


procedure TForm1.Button2Click(Sender: TObject); begin MudarCaptionSemVar(button1); end;


procedure TForm1.Button3Click(Sender: TObject); begin MudarCaptionComVar(button1); end;



GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

conseguiu chegar a alguma conclusão ? hehehe, a parada é inexplicável


GOSTEI 0
Marco Salles

Marco Salles

31/10/2006

NÃ&o...nÃ&o consegui a chegar em nehuma conclusÃ&o

Acho que outros amigos devia participar desta discusÃ&o

Vejo que voce nÃ&o usou o clientDataser para gerar nenhuma instruÃ?Ã&o sql;; Logo nÃ&o ha razÃ&o para fechar a Query.....

Mas percebi também que tem uma tela indicando que ela esta ativada , mas no momento siguinte informa que esta desativada e acusa um erro
Alegando nÃ&o existir o ´CODUSER´....
Voce diz que existe este campo , so que este campo pode nÃ&o ter sido definido como Tfields na Query

SugestÃ&o:
Troque a instruÃ?Ã&o

ObjetoCargos.SetUseInc(SqlText.Fields.fieldByName(´Estados´).AsString);


por:

[b:380a55719c]ObjetoCargos.SetUseInc(SqlText.fieldByName(´Estados´).AsString);[/b:380a55719c]

Talves pode se este o erro que esta fechando esta Query


GOSTEI 0
Marco Salles

Marco Salles

31/10/2006

NÃ&o...nÃ&o consegui a chegar em nehuma conclusÃ&o

Acho que outros amigos devia participar desta discusÃ&o

Vejo que voce nÃ&o usou o clientDataser para gerar nenhuma instruÃ?Ã&o sql;; Logo nÃ&o ha razÃ&o para fechar a Query.....

Mas percebi também que tem uma tela indicando que ela esta ativada , mas no momento siguinte informa que esta desativada e acusa um erro
Alegando nÃ&o existir o ´CODUSER´....
Voce diz que existe este campo , so que este campo pode nÃ&o ter sido definido como Tfields na Query

SugestÃ&o:
Troque a instruÃ?Ã&o

ObjetoCargos.SetUseInc(SqlText.Fields.fieldByName(´CODEUSER´).AsString);


por:

[b:4a82ba2589]ObjetoCargos.SetUseInc(SqlText.fieldByName(´CODUSER´).AsString);[/b:4a82ba2589]

Talves pode se este o erro que esta fechando esta Query


GOSTEI 0
Brunocantelli

Brunocantelli

31/10/2006

é, muito estranho mesmo o que acontece, não posso definir ele na tFields por que é orientação a objetos, ele tem que trabalhar em tempo real com esses dados, para fins de reuso e etc, mas eu consegui arrumar um ´aparato técnico´ que fica melhor, defini uma variável que receberá o codigo do usuário na hora que ele chamar aquele método, e armazenará e o utilizará durante todo o sistema. Mas de qualquer forma obrigado pela atenção


GOSTEI 0
POSTAR