Mudar cliente e diretorio de dados...

Delphi

29/06/2006

Ola,

Tenho uma folha de pagamento em paradox e os cliente possuem diretorios diferentes neste estilo ( c:\sistemas\sfpa\arq001 para cliente cliente 001 e c:\sistemas\sfpa\arq002 para cliente 002...e assim por diante para os outros clientes),pois bem...meu problema e o seguinte quando abro uma sessão para o cliente 001 e seto as tabelas para este cliente com o seguinte codigo :

onde vCodigo := 001;

Session.DeleteAlias(´ARQ001´);
Session.SaveConfigFile;
Session.DeleteAlias(´ARQ´+StrZero(vCodigo,3));
Session.SaveConfigFile;

e ao abrir o cliente 002 :

onde vCodigo := 002;

Session.DeleteAlias(´ARQ001´);
Session.SaveConfigFile;
Session.DeleteAlias(´ARQ´+StrZero(vCodigo,3));
Session.SaveConfigFile;

os dados que aparecem nas tabelas é do cliente anterior...ou seja ele não muda nas sessões das tabelas abertas anteriormente para o cliente 001

alguem já passou por este aberto...

valeu,

fabio cavalcanti


Cavalcanti.fabio

Cavalcanti.fabio

Curtidas 0

Respostas

Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

:(


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

:(


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

:wink:

Aí galera...alguem + poderia dar uma dica...acresentando que quando mudo o cliente (arq001) ele abrea os dados...so que quando tento abrir o dados do diretorio (arq001\0106) onde o 0106 corresponde ao backup do cliente 001 que agora estão no subdiretorio de arq001 chamado 0106 que corresponde ao mes de janeiro/ano 06

Grato a todos....vamos dar uma força!

fabio cavalcanti


GOSTEI 0
Host

Host

29/06/2006

O velho não lembro muito bem, mas o session ta ligado ao database, correto? Tu fecha o database , muda o Session e depois abre o database denovo?


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

Olá colega...olha...na primeira session eu abro o arq001 com os dados do cliente atualmente...tipo assim :

MDPrincipal.tblFuncionarios.Close;
MDPrincipal.tblFuncionarios.DatabaseName := ´ARQ´+StrZero(StrToInt(Dbcodigoemp),3);
MDPrincipal.tblFuncionarios.open;

onde dbcodigoemp := 001

e quero mudar para o diretorio de backup do mes de 0106 (ou seja o diretorio passa a ser agora arq001 mas setado para o diretorio 0106 do cliente arq001...isso faço na sessio a seguir :

vCodigo := 001;
vperiodo := ´0106´;

Session.DeleteAlias(´ARQ001´);
Session.SaveConfigFile;
Session.DeleteAlias(´ARQ´+StrZero(vCodigo,3)+´/´+vperiodo);
Session.SaveConfigFile;

ou seja agora na seleção do cliente eu tambem informo o diretorio de backup ( 0106 ) e desejo que as minhas tabelas tragam o movimento do diretorio (0106)...espero ter sido claro...alguma duvida...favor me reportar...só mais uma coisa...quando fecho o sistema e abro com o cliente indicando o diretorio de backup...o sistema me retorna o que desejo...mas esta ficando chato para o cliente toda vez que precisar consulta ou alterar ele tem que fechar e entrar no sistema novamente...

valeu,

fabio cavalcanti


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

:cry:


GOSTEI 0
Host

Host

29/06/2006

Olha so tu abre o database definindo o alias pelo database... depois tu modifica o a Session ... mas a session ta conectado ao database? Se não esta, tu deveria abrir e fechar o database para dar refresh .. o q tu ta querendo fazer é algo do tipo:

Alterando Idapi32.Cfg Via Programa
Check(DbiAddAlias(Nil, PChar(´ AliasName ´), Nil, PChar(´ AliasPath´), True));
Substitua AliasName pelo nome do alias que você quer criar e em AliasPath pelo path dos arquivos de dados que você quer no seu alias.

Inclua na cláusula ´USES´ as units BD e BDE.

Complemento enviado por um colaborador:

procedure TForm1.AlterarClick(Sender: TObject);
var
AParams: TStringList;
caminho:string;
begin
caminho:=´path=´ + edit1.text;

if not Session.IsAlias(´Teste´) then
begin
Check(dbiInit(nil));
Check(dbiAddAlias(Nil, PChar(´teste´), szParadox, PChar(caminho), True));
Check(DbiExit);
end;

AParams := TStringList.Create;
try
Session.GetAliasParams(´Teste´,AParams);
begin
AParams.Clear;
AParams.Add(caminho);
Session.ModifyAlias(´Teste´,AParams);
Session.SaveConfigFile;
end;
finally
AParams.Free;
end;
end;


Correto?


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

Olá companheiro...da forma que vc me passou esta sendo criado o alias no BDE...eis a forma que estou abrindo a minha tabela apos criar o alias :

MDPrincipal.tblMovimentosTmp.Close;
MDPrincipal.tblMovimentosTmp.DatabaseName := ´SFPA´+StrZero(StrToInt(MDPrincipal.tblEmpresTmp.FieldByName(´CODIGO_EM´).AsString),3);
MDPrincipal.tblMovimentosTmp.TableName := ´Movime.db´;
MDPrincipal.tblMovimentosTmp.open;
MDPrincipal.tblMovimentosTmp.Refresh;

será a maneira correta de atribuir o novo alias criado ou estou fazendo alguma coisa errada...pois existe um alias que o caminho e arq029/0606 e o movimento que ele esta buscando ou melhor trazendo e do movimento atual...ou seja...ele esta esquecendo o caminho do alias na PATH que e ARQ029/0606 e me traz o movimento do ARQ029 atual...coisa de louco...e como se ele estivesse maluco ou não aceitando o alias criado para este cliente...os cliente que ainda estão com o movimento atual do mes 0606 ele pega so que o cliente ARQ029 tem um diretorio de backup chamado 0606 que esta toda a movimentação de Junho/06 (0606)...vc entendeu.

grato,

fabio cavalcanti

Obs : acho que não estou sabendo setar a minha tabela para este novo alias...


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

:)


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

:?


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

olá...ainda preciso de ajuda galera...
:lol:

grato,

fabio cavalcanti


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

caramba...ja estou ficando maluco...quando abro o cliente no periodo que desejo : 06/06 ele me traz movimento...so que quanto o periodo do cliente esta 07/06 e sem fechar o programa abro o periodo 06/06...ele continua me trazendo as informações atuais de 07/06...

vamos galera...

abraço,

fabio


GOSTEI 0
Host

Host

29/06/2006

Parece problema de refresh......


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

olá host...como vc pode observar estou fazendo o refresh na tabela...como vc faria neste caso...

grato,

fabio cavalcanti


GOSTEI 0
Host

Host

29/06/2006

Olha qdo usava BDE as vezes a unica foma de dar refresh era fechando e abrindo o database? O Session ta ligado ao BDE?


GOSTEI 0
Micheus

Micheus

29/06/2006

[b:6b84c35535]cavalcanti.fabio[/b:6b84c35535], vou dar uma sugestão que talvez implique em algumas alterações em relação ao que modo como vc está fazendo atualmente o acesso as tabelas.
Acredito que simplifica bastante as coisas. Avalie e teste.
Como vc utiliza tabelas paradox, vou considerar que utilize a paleta BDE:
1) Vc teria que adicionar um TDatabase ao form principal, por exemplo. Ele precisará estar em um lugar que exista durante todo o tempo em que o seu programa estiver aberto;
2) Dando um duplo click no componente, defina:
a) [i:6b84c35535]Name[/i:6b84c35535] com DBClientes - vc poderá utilizar outro se quizer;
b) Em [i:6b84c35535]Driver Name[/i:6b84c35535] selecione STANDARD;
c) Clique no botão [i:6b84c35535]Defaults[/i:6b84c35535];
d) Desmarque a opção [i:6b84c35535]Login Prompt[/i:6b84c35535];
3) Agora, nas tabelas associadas ao clientes (aquelas em que altualmente altera a propriedade database name para apontar para o alias que vc cria em tempo de execução), vc seleciona, em design-time, na propriedade DatabaseName o nome do database recém criado - DBClientes (ele estará lá em meio aos aliases que existem no BDE)
4) Crie então um procedimento para o qual vc passa o diretório do cliente, e este será ´inicializado´ no database (DBClientes). Neste procedimento vc fecha o database, atribui o novo diretório e reabre o database apontando para o novo local.
5) Neste ponto basta abrir as tabelas a serem utilizadas, que automaticamente estarão apontando para o local desejado.

Como vc pode ter notado, não há necessidade de incluir, deletar, fazer qualquer operação com Aliases. Isto funciona como um Alias dinâmico. E acredito que fica bastante simples e ´transparente´.
Para vc ter uma idéia segue um pedaço do código ex que fiz. Através de 2 botões ele abre duas tabelas cliente.db diferentes em diretórios diferentes, seguindo a metodologia que coloquei acima:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;

type
  TForm1 = class(TForm)
    DBCliente: TDatabase;
    TabCliente: TTable;
    DSCliente: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    procedure OpenDataBaseCliente(ClientDir :String);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


procedure TForm1.OpenDataBaseCliente(ClientDir :String);
begin
  DBCliente.Close; // Fechará todas as tabelas abertas associada a este DB
  DBCliente.Params.Values[´PATH´] := ClientDir; // Altera o path para a base do cliente desejado
  DBCliente.Open;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  OpenDataBaseCliente(ExtractFilePath(Application.ExeName) +´BASE\CLI001´);
// Abre tabelas
  TabCliente.Open;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  OpenDataBaseCliente(ExtractFilePath(Application.ExeName) +´BASE\CLI002´);
// Abre tabelas
  TabCliente.Open;
end;

end.


Postei o exemplo neste [url=http://www.4shared.com/dir/573206/649e0251/Progamacao.html]link (DBEAlias.zip)[/url]

Espero ter ajudado.

[]s


GOSTEI 0
Cavalcanti.fabio

Cavalcanti.fabio

29/06/2006

olá...galera...ainda preciso de vcs...

grato,

fabio cavalcanti


GOSTEI 0
POSTAR