Ao dar um CdsProdutos.Open; jogar cadastros num txt. Como?

Delphi

13/11/2007

Olá!

Como que eu poderia fazer esta rotina? Abrir um projeto para terminal de consulta de um mercado, só que os dados todos vão para um TXT. Ao adicionar um Novo, vai para o txt. Só que esses produtos devem ser os mesmos do banco de dados! Portanto, o que eu precisaria fazer, era o seguinte: Toda vez que dou um Open no Client, o mesmo deverá jogar os registros para o TXT, seguindo o seguinte layout:

111111111|Baby Car Ride|0.52|
3333333|Dive Watch|6.50|
7898888888888|Baby Car Ride|29.99|
7892222222222|Dive Watch|125.00|
7895555555555|38pc Tool Set|99.50|
9313888006370|Disquete Nashuatec|7.50|
123|Teste Pin Pad|Priceless|
4009993902090|Diskete Basf|2,00|
7896886457372|Caderno 1/8 South|2,58|
7897072000211|Filtro De Linha|15,90|
7890552725963|capa cd|0,50|
7890552725964|capa cd|0,50|

como que eu poderia fazer?

Desde já, agradeço.
Muito obrigado!


Lucas_spohr

Lucas_spohr

Curtidas 0

Respostas

Vitor Alcantara

Vitor Alcantara

13/11/2007

Amigo usa faz um laço em sua tabela de um modo que pecorrar do primeiro a último registro e grave em um arquivo de texto utilizando WriteLn.

Aqui segue um pequeno exemplo.

var
  f:textfile;
begin
  AssignFile(f,´c:\ nome do seu arquivo de texto.txt´);//Indica o arquivo que irá ser gravado
  Rewrite(f);//Indica que o arquivo será criado ou reescrito (caso já exista)
  
  //Aqui você coloca o seu laço
  SeusDados.First;
  While not SeusDados.eof do
  Begin
    Write(f, SeusDados.FieldByName(´Codigo´).AsString + ´|´);//Escreve e continua na mesma linha
    Write(f, SeusDados.FieldByName(´Nome´).AsSTring + ´|´);//Escreve e continua na mesma linha
    WriteLn(f,SeusDados.FieldByName(´Preco´).asString +´|´);//Esecreve e salta para a próxima linha
    SeusDados.Next;   
  end;
  CloseFile(f);//Esvazia o buffer e joga no arquivo de texto
end;



GOSTEI 0
Lucas_spohr

Lucas_spohr

13/11/2007

e aí cara!

Desculpa a demora para responder, mas muito obrigado! Era exatamente isso que eu precisava! Fiz este teste, fazendo conexão normalmente com o banco, indo no datamodule, configurando manualmente as propriedades do sqlconnection, etc... Agora, vou ter que fazer de uma maneira diferente:

Fazer a conexão com o banco, via-código, utilizando arquivo INI onde, no cliente em que estará este sistema, eu abro o caminho.ini e altero a linha onde estará o IP + caminho do banco...

como que eu poderia fazer isto?

Desde já, agradeço...
Muito obrigado!!


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

13/11/2007

Olha a utilização de arquivos ini é muito fácil, utilizando-se da unit IniFiles.

Declare a unit IniFiles na uses do seu form.

o exemplo abaixo pega o valor e joga em uma váriavel qualquer.
exemplo do arquivo teste.ini

[SERVIDOR]
IP=192.168.0.1:c:\MeuBanco.GDB

Você poderia fazer assim pra ler tal arquivo.

Var
  ini:tInifile;//Declara aqui a váriavel onde será trabalhado o arquivo ini
  SERVIDOR:STring;
begin
  ini := tInifile.Create(´c:\teste.ini´);//Inicializa o objeto e indica qual arquivo será trabalhado com o mesmo.
  //Pega o valor de ip e grava na variavel servidor
  SERVIDOR := ini.ReadString(´SERVIDOR´,´IP´,´´);
  
  //Passa a variavel para os parametro DataBase do SqlConnection
  DataModule.SqlConnection.Close;
  DataModule.SqlConnection.Params.Values[´Database´] := SERVIDOR;
  DataModule.SqlConnection.Open;
end;


No comando ini.ReadString você tem que informar trez valores.
1º a sessão onde se encontra a propriedade no arquivo ini (SERVIDOR)
2º a propriedade no qual você quer obter o valor (IP)
3º um valor padrão para ser atribuido caso não exista tal propriedade no arquivo ini (´´)

PS. Para gravar em arquivos ini é parecido só que em vez de ReadString utiliza-se WriteString.


GOSTEI 0
Lucas_spohr

Lucas_spohr

13/11/2007

hmm... vou fazer os testes...

mas eu coloco no meu frmPrincipal ou no meu DataModule, este código?


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

13/11/2007

Eu recomendaria colocar no OnCreate do DataModule, mais tembém funcionária no formPrincipal também.


GOSTEI 0
Lucas_spohr

Lucas_spohr

13/11/2007

estou fazendo no oncreate do datamodule... Está assim o OnCreate:

var
f:textfile;
ini: TIniFile;
Servidor : String;
begin
ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+(´caminho2.ini´));
Servidor := ini.ReadString(´SERVIDOR´,´IP´,´´);
Dados.SdsProdutos.Close;
Dados.SdsProdutos.Params.Values[´Database´] := Servidor;
Dados.SdsProdutos.Open;

CdsProdutos.Open;
AssignFile(f,ExtractFilePath(ParamStr(0)) + ´pricetab.txt´);//Indica o arquivo que irá ser gravado
Rewrite(f);//Indica que o arquivo será criado ou reescrito (caso já exista)
//Aqui você coloca o seu laço
CdsProdutos.First;
While not CdsProdutos.eof do
Begin
Write(f, CdsProdutos.FieldByName(´Barra´).AsString + ´|´);//Escreve e continua na mesma linha
Write(f, CdsProdutos.FieldByName(´Descricao´).AsString + ´|´);//Escreve e continua na mesma linha
WriteLn(f,CdsProdutos.FieldByName(´Preco´).AsString +´|´);//Escreve e salta para a próxima linha
CdsProdutos.Next;
end;
CloseFile(f);//Esvazia o buffer e joga no arquivo de texto
end;



Na linha Dados.SdsProdutos.Params.Values[´Database´] := Servidor;

informa que Values não está declarado...


GOSTEI 0
Lucas_spohr

Lucas_spohr

13/11/2007

UP


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

13/11/2007

Qual seu banco e os componentes de conexão e Banco de dados?


GOSTEI 0
Lucas_spohr

Lucas_spohr

13/11/2007

opa, perdão... deu certo!

eu estive usando o SdsProdutos (SQLDataSet) ao invés de usar o Banco (SQLConnection), hehe

Muito obrigado!
Qualquer coisa, posto aí...


GOSTEI 0
Lucas_spohr

Lucas_spohr

13/11/2007

Atualizar banco + TXT, ao clicar no botão Atualizar:

Ae pessoal! Agora, preciso do seguinte:

Para funcionar o terminal de consultas, em uma certa máquina o programinha deverá ficar sempre aberto. Os preços dos produtos, são atualizados pelo ERP. Digamos que, para teste, eu queira atualizar um preço pelo IBExpert. Altero, ENTER, Commit. Produto alterado. Como o programinha do terminal ficará sempre aberto, automaticamente, o preço do produto no projeto do terminal, não se atualizará automaticamente, sem que alguém clique num botão, para Atualizar.

Qual a rotina que eu poderia colocar no botão, para atualizar?

Sendo que no OnCreate do meu DataModule, está os códigos postados acima:

CdsProdutos.Open;
AssignFile(f,ExtractFilePath(ParamStr(0)) + ´pricetab.txt´);//Indica o arquivo que irá ser gravado
Rewrite(f);//Indica que o arquivo será criado ou reescrito (caso já exista)
//Aqui você coloca o seu laço
CdsProdutos.First;
While not CdsProdutos.eof do
Begin
Write(f, CdsProdutos.FieldByName(´Barra´).AsString + ´|´);//Escreve e continua na mesma linha
Write(f, CdsProdutos.FieldByName(´Descricao´).AsString + ´|´);//Escreve e continua na mesma linha
WriteLn(f,CdsProdutos.FieldByName(´Preco´).AsString +´|´);//Escreve e salta para a próxima linha
CdsProdutos.Next;
end;
CloseFile(f);//Esvazia o buffer e joga no arquivo de texto

e no botão atualizar? Seria, no caso... Atualizar o banco, e reescrever no TXT, os produtos novamente...

Obrigado!


GOSTEI 0
Lucas_spohr

Lucas_spohr

13/11/2007

sobe


GOSTEI 0
Lucas_spohr

Lucas_spohr

13/11/2007

sobe!!


GOSTEI 0
Lvenanciol

Lvenanciol

13/11/2007

Senhores boa tarde,

Aproveitei a orientação do Vítor para apontar o banco informado no arquivo e ini e deu certo. O meu problema agora é que ao executar o banco localmente ele funciona 100¬, quando aponto o config para o meu servidor ele informa a seguinte mensagem:
´Database server error: unsupported on-disk structure for file c:\banco.gdb; found 11, support 10´. Já havia lido que poderia ser algo como versão diferente do banco, mas não é.
Alguma dica ?

Grato,
Leonardo
Vitória/ES


GOSTEI 0
POSTAR