Fórum como criar arquivo texto - com algumas dúvidas ainda #1035

03/12/2008

0

Testei o código.   procedure TFormSaidas.pedidotexto;
var
Arq: TextFile;
NomeArq: String;
CIR, CodCliente, Cliente, Apelido, CPFCGC, RG, TipoCliente, VlrLimComp, Endereco, Bairro, Branco: String;
CdeBarra, Quantidade, preco: String;
begin
 NomeArq := C:\PEDPDV\ + MascEdit1.TexT;
 AssignFile(Arq, NomeArq + .Txt);    //COLOCA VARIÁVEL IGUAL AOS NOMES VINDOS DA QUERY
 CIR:= C;
 TipoCliente:= A1;
 CodCliente:= DM.TbPedido.FieldByName(IdCliente).AsString;
 Cliente:= DM.TbPedido.FieldByName(Cliente).AsString;
 CPFCGC:= DM.TbPedido.FieldByName(cpfcnpj).AsString;
 Endereco:= MascEdit16.Text;
 Bairro:= MascEdit17.Text;  Quantidade := FloatToStr(DM.TbSaida.fieldByName(Quantidade).AsFloat);
 Preco := FloatToStr(DM.TbSaida.fieldByName(Preco).AsFloat);
   //COLOCA FUNCTION
 CodCliente:= preenchezero(CodCliente,10);
 Cliente:= preenchebranco(Cliente,40);
 Apelido:= preenchebranco(Apelido,25);
 CPFCGC := preenchebranco(CPFCGC,20);
 RG := preenchebranco(RG,20);
 VlrLimComp:= preenchebranco(VlrLimComp,15);
 Endereco := preenchebranco(Endereco,40);
 Bairro := preenchebranco(Bairro,20);
 Branco := preenchebranco(Branco,7);  CdeBarra := preenchebranco(CdeBarra,16);
 Quantidade := preenchezero(Quantidade,15);
 Preco := preenchezero(Preco,15);    //PREPARA ARQUIVO PARA ESCREVER
 rewrite(Arq); //abre ou cria arquivo para escrita
 writeLn (Arq,CIR + CodCliente + Cliente + Apelido + CPFCGC + RG + TipoCliente + VlrLimComp + Endereco +               Bairro + Branco);  writeLn (Arq,CdeBarra + Quantidade + Preco);  //só coloca o 1º item, ou seja, uma linha. E os outros?   CloseFile(Arq);                                       //Como faço para adicionar todos os itens da venda 1 abaixo do outro?
end;   Mas tenho ainda uma dúvida para fechar sobre esse assunto.
Arnoldo Lima

Arnoldo Lima

Responder

Posts

03/12/2008

Rogerio Quessada

Arnoldo,     Faça o seguinte:      Vc precisa criar um laço para navegar em todos os registros de sua tabela, ou query, sendo assim o código para isso é : DM.TbPedido.First; While not DM.TbPedido.EOF do  begin      //COLOCA VARIÁVEL IGUAL AOS NOMES VINDOS DA QUERY
 CIR:= C;
 TipoCliente:= A1;
 CodCliente:= DM.TbPedido.FieldByName(IdCliente).AsString;
 Cliente:= DM.TbPedido.FieldByName(Cliente).AsString;
 CPFCGC:= DM.TbPedido.FieldByName(cpfcnpj).AsString;
 Endereco:= MascEdit16.Text;
 Bairro:= MascEdit17.Text;  Quantidade := FloatToStr(DM.TbSaida.fieldByName(Quantidade).AsFloat);
 Preco := FloatToStr(DM.TbSaida.fieldByName(Preco).AsFloat);
   //COLOCA FUNCTION
 CodCliente:= preenchezero(CodCliente,10);
 Cliente:= preenchebranco(Cliente,40);
 Apelido:= preenchebranco(Apelido,25);
 CPFCGC := preenchebranco(CPFCGC,20);
 RG := preenchebranco(RG,20);
 VlrLimComp:= preenchebranco(VlrLimComp,15);
 Endereco := preenchebranco(Endereco,40);
 Bairro := preenchebranco(Bairro,20);
 Branco := preenchebranco(Branco,7);  CdeBarra := preenchebranco(CdeBarra,16);
 Quantidade := preenchezero(Quantidade,15);
 Preco := preenchezero(Preco,15);    //PREPARA ARQUIVO PARA ESCREVER
 rewrite(Arq); //abre ou cria arquivo para escrita
 writeLn (Arq,CIR + CodCliente + Cliente + Apelido + CPFCGC + RG + TipoCliente + VlrLimComp + Endereco +  Bairro + Branco);  writeLn (Arq,CdeBarra + Quantidade + Preco);    DM.TbPedido.Next;
end;   CloseFile(Arq);    Com isso vc percorre todos os registros de sua tabela gerando o arquivo texto que precisa. Aguardamos seu retorno, abs
Responder

Gostei + 0

03/12/2008

Arnoldo Lima

Só preciso adicionar várias vezes esta linha:   writeLn (Arq,CdeBarra + Quantidade + Preco);   A parte do: Cliente, Endereco ... é o mesmo para todos os itens.   Aguardo,   Arnoldo
Responder

Gostei + 0

03/12/2008

Arnoldo Lima

A tabela que contém Nome do cliente, endereço, bairro, fone etc é "TbPedido". Essa só é para colocar um cliente com seus "itens de venda". A tabela que contém esses "itens de venda" é TbSaida.    DM.TbSaida.First;
 While not DM.TbSaida.EOF do
 begin
  writeLn(Arq,CdeBarra + Quantidade + Preco);  
  DM.TbSaida.Next;
 end;
 CloseFile(Arq);   Está colocando agora a quantidade de itens correto, mas só que está repetindo o primeito item. Por exemplo.   Se vendo para: CONSUMIDOR:   arquivo texto: C0000400000CONSUMIDOR                                                      111.111.111/11                                                                                                       
                000000000000002000000000039,57
                000000000000002000000000039,57
                000000000000002000000000039,57       Se vendo 3 itens diferenes o arquivo texto repete o primeiro valor sem pular para o próximo valor.   O que está acontecendo e como faço para resolver isso?   Aguardo resposta, Arnoldo
Responder

Gostei + 0

03/12/2008

Rogerio Quessada

Arnoldo,   Então o laço While que mostrei no exemplo anterior deve ser feito com a query que retorna esses dados, CdeBarra + Quantidade + Preço, não localizei no seu código de onde vem isso, mas imagino que seja de uma query, assim faça o seguinte:      //COLOCA VARIÁVEL IGUAL AOS NOMES VINDOS DA QUERY
 CIR:= C;
 TipoCliente:= A1;
 CodCliente:= DM.TbPedido.FieldByName(IdCliente).AsString;
 Cliente:= DM.TbPedido.FieldByName(Cliente).AsString;
 CPFCGC:= DM.TbPedido.FieldByName(cpfcnpj).AsString;
 Endereco:= MascEdit16.Text;
 Bairro:= MascEdit17.Text;  Quantidade := FloatToStr(DM.TbSaida.fieldByName(Quantidade).AsFloat);
 Preco := FloatToStr(DM.TbSaida.fieldByName(Preco).AsFloat);
   //COLOCA FUNCTION
 CodCliente:= preenchezero(CodCliente,10);
 Cliente:= preenchebranco(Cliente,40);
 Apelido:= preenchebranco(Apelido,25);
 CPFCGC := preenchebranco(CPFCGC,20);
 RG := preenchebranco(RG,20);
 VlrLimComp:= preenchebranco(VlrLimComp,15);
 Endereco := preenchebranco(Endereco,40);
 Bairro := preenchebranco(Bairro,20);
 Branco := preenchebranco(Branco,7);    //PREPARA ARQUIVO PARA ESCREVER
 rewrite(Arq); //abre ou cria arquivo para escrita
 writeLn (Arq,CIR + CodCliente + Cliente + Apelido + CPFCGC + RG + TipoCliente + VlrLimComp + Endereco +  Bairro + Branco);   ACIMA VC ESTA PREENCHENDO O QUE VIER DA TABELA DE PEDIDO QUE DEVE APARECER APENAS UMA VEZ !   QryItem.First;   While not QryItem.EOF do  begin   CdeBarra := preenchebranco(CdeBarra,16);
  Quantidade := preenchezero(Quantidade,15);
  Preco := preenchezero(Preco,15);     writeLn (Arq,CdeBarra + Quantidade + Preco);      QryItem.Next; end;   ACIMA VC ESTA PREENCHENDO OS ITENS DENTRO DE UM LAÇO (WHILE) . VAI DO PRIMEIRO REGISTRO ATÉ O ULTIMO ESCREVENDO NO ARQUIVO SO A PARTE DO ITENS, O CABEÇARIO ESCREVEMOS APENAS UMA VEZ, COMO MOSTRADO ACIMA, POIS ESTA FORA DO LAÇO.   CloseFile(Arq);    Aguardo seu retorno,  abs  
Responder

Gostei + 0

03/12/2008

Arnoldo Lima

Agora ele está repetindo só o último.   QryItem.First;   While not QryItem.EOF do  begin   CdeBarra := preenchebranco(CdeBarra,16);
  Quantidade := preenchezero(Quantidade,15);
  Preco := preenchezero(Preco,15);     writeLn (Arq,CdeBarra + Quantidade + Preco);      QryItem.Next; end; Está preenchendo o arquivo texto só com o último item agora. Aguardo resposta
Responder

Gostei + 0

03/12/2008

Rogerio Quessada

Arnoldo,        No chamado anterior, vc nos pediu o contrário, que deveria aparecer apenas tudo, foi o que lhe respondi, nesse último vc pediu para aparecer apenas os dados do ultimo item, e foi o que fizemos. Acredito que vc precisar dar uma revisada na lógico dessa rotina, creio que vc não entendeu exatamente como deve ser encadeado os eventos, ou seja, o que deve gerar primeiro e onde gerar.      Com tudo que descrevemos para vc nesse chamado, vc consegue criar seu arquivo sem problemas, pois explicamos como criar e manipular aquivos, como percorrer registros de query ou table do início ao fim, como formatar os campos como vc precisa, enfim, tudo que é necessário para criar o arquivo que vc pediu ainda no início do chamado.       Para vc não ficar perdendo tempo com tentativas, analise com calma cada rotina, ou seja cada pedacinho de código e veja o q eles fazem , estude cada resposta que ti dei depois entenda a lógica da sua situação e implemente.   Com certeza você irá conseguir, o que ti passei tem tudo o que você precisa,   Bem de qualquer, estamos a disposição,   Se mesmo assim você continuar dúvidas por favor fique a vontade,   Só não podia deixar de ti expor isso, ok ? abs.    
Responder

Gostei + 0

04/12/2008

Arnoldo Lima

Olha, antes realmente eu não sabia nem por onde começar a criar um arquivo texto. Já fiz vários testes aqui com as informações que me mandou e deram certo. Talvez, em algum momento, não tenho lhe passado todas informações necessárias para uma boa comunicação e entendimento.   Fico grato e ao mesmo tempo satisfeito com a consultoria da devmedia. Já aprendi muito aqui.   Quanto ao "criar arquivo texto" tenho ainda a mesma dúvida.   Vou tentar lhe pasar o que quero fazer e os nomes dos componentes.     1- Tenho uma tabela de nome "TbPedido" que vai gravar os dados referentes ao pedido no momento da venda. Por exemplo:     Cliente: ANTONIO F. DE S. CASTRO     Endereco: RUA SEM N, TAL.     Bairro: Parque Ideal   2- A outra tabela de nome "TbSaida" é quem vai abosorver os itens da venda. Por exemplo:     Código       Descrição     Quantidade     100102  -   Celular           01     100023  -   Pen drive       02     100104  -   Mp4               05     3- O que eu gostaria de fazer.       Pegar os dados do cliente e dos itens e colocar em um só arquivo texto:      ANTONIO F. DE S. CASTRO       RUA SEM N, TAL          Parque Ideal    100102  -   Celular           01    100023  -   Pen drive       02      --> é assim que gostaria que saisse no arquivo texto, igual a venda.    100104  -   Mp4               05   4- O problema, o qual não resolvi ainda.     Quando não sai desta forma repetindo o primeiro item da venda:       ANTONIO F. DE S. CASTRO       RUA SEM N, TAL          Parque Ideal     100102  -   Celular           01     100102  -   Celular           01     100102  -   Celular           01       Sai desta outra forma repetindo o último item da venda:     ANTONIO F. DE S. CASTRO       RUA SEM N, TAL          Parque Ideal     100104  -   Mp4               05     100104  -   Mp4               05     100104  -   Mp4               05       Não consegui resolver isso.   Grato por sua compreensão, Aguardo respostas.   Arnoldo          
Responder

Gostei + 0

04/12/2008

Rogerio Quessada

Arnoldo,   Vamos lá;        Abaixo segue os passos detalhados de como gerar esse arquivo. // Colocar a tabela de Pedidos no primeiro registro: TbPedido.First; // Fazer um laço por todos os registros da tabela pedidos While not TbPedido.Eof do  Begin    Vc tem algum campo na tabela de Saida que esteja associado ao produto? Se não tiver tem q criar , pois é por esse campo que vamos fazer a query como mostrado abaixo    {faça uma query para retornar os registros apenas da venda para esse pedido, a query deve filtra a tabela de Saida como mostrado abaixo}     Query.Close;     Query.SQL := ‘Select * From Saída Where CampoComONumeroDoPedido  =:NumeroPedido’;     Query.Params.ParamByName(‘NumeroPedido’).asFloat := TbPedidoNumeroPedido.asfloat;    Query.Open; // Lembre-se aqui vc já esta dentro do laço na tabela de pedidos agora vamos fazer o laço para a tabela de Saída utilizando a query que retornou os registros. Portanto escreva o cabeçario do arquivo aqui, com os dados da tabela de pedido     Cliente: ANTONIO F. DE S. CASTRO     Endereco: RUA SEM N, TAL.     Bairro: Parque Ideal  // Monte o arquivo da forma que vc aprendeu nos últimos chamados aqui. Com o cabecario do pedido    Query.First; While not Query.EOF do  Begin     Aqui atribua valor para as variáveis que devem aparecer no arquivo que referenciam os items do pedido ou seja que estão na tabela de Saída    Query.NEXT: End; TbPedido.NEXT; End;   Entendendo a explicação acima:       A rotina criada vai abrir a tabela de pedidos, e posicionar no primeiro registro, depois disso vai entrar em um LOOP do primeiro ao ultimo registro da tabela de pedidos, sempre que passar por um registro ela monta o arquivo com os dados do pedido, (cabecario) depois disso ativa uma query para retornar todos os itens desse pedido, e posiciona no primeiro item desse pedido e entra em um LOOP (na query que tem os itens do pedido) e grava todas os itens no arquivo texto, depois disso vai voltar a gravar o cabeçario do próximo pedido e repetir a operação até o final da tabela de pedidos. Acredito que com essas explicações resolvemos esse chamado, Continuamos a disposição mas sempre que sair do escopo do primeiro chamado, somos obrigados a abrir um novo chamado.   abs
Responder

Gostei + 0

05/12/2008

Rogerio Quessada

Arnoldo, Como não tivemos seu retorno até o momento, Estamos considerando que nossa consultoria teve êxito nesta sua dúvida, Considerando assim o chamado encerrado, abs.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar