Ir para conteúdo
Fórum Script Brasil
  • 0

(Resolvido) Criar Indices Primarios E Secundarios Via Codigo


Eder

Pergunta

Olá..

Eu tou com um probleminha..

Nosso colega Michels me ajudou a montar este codigo pra converte um txt >> paradox

porem eu queria agora alem de converter como abaixo ....também criar os indices primarios os *.PX e os secundarios..mas não to conseguindo.

no caso o indice primário seria o campo CODIGO

e o secundario seria o campo CODPROD

//TXT>>DB

procedure TForm1.Button2Click(Sender: TObject);

var

Txt : TextFile;

Entrada : String;

begin

Assignfile(Txt,'Clientes.Txt');

Reset(Txt);

While not Eoln(Txt) do

begin

Readln(Txt,Entrada);

Table1.Insert;

Table1.FieldByName('Codigo').Value := Trim(Copy(Entrada,01,05));

Table1.FieldByName('CodProd').Value := Trim(Copy(Entrada,06,05));

Table1.FieldByName('Nome').Value := Trim(Copy(Entrada,11,20));

Table1.FieldByName('Cidade').Value := Trim(Copy(Entrada,31,10));

Table1.FieldByName('UF').Value := Trim(Copy(Entrada,41,02));

Table1.Post;

end;

CloseFile(Txt);

Button3.Enabled := True;

end;

Grato

:D

Link para o comentário
Compartilhar em outros sites

8 respostass a esta questão

Posts Recomendados

  • 0
Elder, dê uma olhada neste código (link) com atenção para a parte posterior ao texto { adiciona a chave primária e três secundárias}

Amigão....eu deu uma analizada no link...que tem este codigo abaixo:

try

Table1.Close; {o mesmo que Active:=False }

Table1.DatabaseName := 'C:\TEMP'; { um alias BDE ou diretório}

Table1.TableName := 'func.DB'; { extensão .DB é opcional}

Table1.TableType := ttParadox; { deve ser especificado quando se cria uma tabela}

{ definindo alguns campos}

with Table1.FieldDefs do

begin

Update; {não é necessário, mas...}

Clear; { limpa a tabela antiga}

{ a chave primária deve ser criada com o

atributo "required" como true: }

Add('Codigo', ftInteger, 0, true);

Add('Nome', ftString, 16, false);

Add('Endereco', ftString, 16, false);

Add('Salario', ftFloat, 0, false);

Update;

end; { "with Table1.FieldDefs" }

{ adiciona a chave primária e três secundárias}

with Table1.IndexDefs do

begin

Update; {não é necessário, mas...}

Clear; {limpa os antigos}

{ A chave priária Paradox não tem nome.}

{ Nunca de o mesmo nome do campo ao índice

se fizer isso não poderá usar ixCaseInsensitive }

Add('', 'codigo', [ixPrimary]);

{ A opção ixCaseInsensitive não é valida para chaves primárias}

{ Nunca crie mais indices do que você precisar. Você poderá fazer isso depois}

Add('NomeIDX', 'Nome', [ixCaseInsensitive]);

Add('EnderecoIDX', 'Endereco', [ixCaseInsensitive]);

{ combinando um índice com dois campos: }

Add('testeIDX', 'Nome;Endereco', [ixCaseInsensitive]);

Update;

end; { with "Table1.IndexDefs" }

Table1.CreateTable;

Table1.Open;

Except

MessageDlg('Error na Criação da Tabela ou Índice', mtError, [mbOK],0);

end; { try...except }

mas não consegui montar o código... :huh:

ali no codigo menciona:

{ adiciona a chave primária e três secundárias}

with Table1.IndexDefs do

begin

Update; {não é necessário, mas...}

Clear; {limpa os antigos}

{ A chave priária Paradox não tem nome.}

{ Nunca de o mesmo nome do campo ao índice

se fizer isso não poderá usar ixCaseInsensitive }

Add('', 'codigo', [ixPrimary]);

{ A opção ixCaseInsensitive não é valida para chaves primárias}

{ Nunca crie mais indices do que você precisar. Você poderá fazer isso depois}

Add('NomeIDX', 'Nome', [ixCaseInsensitive]);

Add('EnderecoIDX', 'Endereco', [ixCaseInsensitive]);

{ combinando um índice com dois campos: }

Add('testeIDX', 'Nome;Endereco', [ixCaseInsensitive]);

Update;

end; { with "Table1.IndexDefs" }

o problema é que não to conseguindo colocar este codigo acima dentro do codigo que eu passei!!!

Poderias me ajudar?? :(

p.s. só lembrando que é Micheus e não Michels.

R. Beleza...carinha.....

haaaaaa..e o meu não é ELDER ...é EDER.....hehehe

t+ ;)

Link para o comentário
Compartilhar em outros sites

  • 0

EDER

Na verdade como parece-me que sua tabela já está criada (você não a cria a cada importação), acredito que você deva criar os índices via Database Desktop mesmo.

O exemplo do link faz referência a criação dos indices logo após a criação da tabela, se for criar dinamicamente, primeiro deverá eliminar os que já existem (table1.deleteindex(nome_indice) - mas é só para as secundárias).

Veja se para o seu caso o Database Desktop não é a solução.

haaaaaa..e o meu não é ELDER ...é EDER.....hehehe

É, empatamos. :D
Link para o comentário
Compartilhar em outros sites

  • 0
Na verdade como parece-me que sua tabela já está criada (você não a cria a cada importação), acredito que você deva criar os índices via Database Desktop mesmo.

O exemplo do link faz referência a criação dos indices logo após a criação da tabela, se for criar dinamicamente, primeiro deverá eliminar os que já existem (table1.deleteindex(nome_indice) - mas é só para as secundárias).

Veja se para o seu caso o Database Desktop não é a solução.

Não...colega.....eu vou criar tudo a cada importação...pois na importação vou sobrepor ao antigo.

Esta tabela vai servir somente para consultas....então a empresa vai me mandar o txt e eu vou importar do zero...vai ser um processo feito diariamente..então preciso de algo..pratico entende?

Então eu teria que adaptar aquele codigo que você me ajudou a montar... mas este que você me passou criando os primarios e secundarios.

:(

Link para o comentário
Compartilhar em outros sites

  • 0

Neste caso, considerando dois processos seria:

1) Criação da tabela -> seria todo o código do link que lhe passei, alterando apenas os nomes, tipos e tamanhos dos compos da tabela e eliminando os comandos Update os quais geram exception. Melhorando ele um pouco:

procedure TForm1.CriaTabelaImportacao(TableNome :string);
begin
  try
    Table1.Close; {o mesmo que Active:=False }
    Table1.DatabaseName := TableNome; { um alias BDE ou diretório}
    Table1.TableName := 'client.DB'; { extensão .DB é opcional}
    Table1.TableType := ttParadox; { deve ser especificado quando se cria uma tabela}
    { definindo alguns campos}
    with Table1.FieldDefs do
    begin
      Clear; { limpa a tabela antiga}
      { a chave primária deve ser criada com o
      atributo "required" como true: }
      Add('Codigo', ftString, 5, true);  // o TRUE significa que é requerido - não pode ser nulo
      Add('CodProd', ftString, 5, true);
      Add('Nome', ftString, 20, false);
      Add('Cidade', ftString, 10, false);
      Add('UF', ftString, 2, false);
    end; { "with Table1.FieldDefs" }
    { adiciona a chave primária e três secundárias}
    with Table1.IndexDefs do
    begin
      Clear; {limpa os antigos}
      { A chave priária Paradox não tem nome.}
      { Nunca de o mesmo nome do campo ao índice
      se fizer isso não poderá usar ixCaseInsensitive }
      Add('', 'codigo', [ixPrimary]);
      { A opção ixCaseInsensitive não é valida para chaves primárias}
      { Nunca crie mais indices do que você precisar. Você poderá fazer isso depois}
      Add('NomeIDX', 'Nome', [ixCaseInsensitive]);
      Add('CidadeIDX', 'Cidade', [ixCaseInsensitive]);
      { combinando um índice com dois campos: }
      Add('TesteIDX', 'Cidade;Nome', [ixCaseInsensitive]);
    end; { with "Table1.IndexDefs" }
    Table1.CreateTable;
    Table1.Open;
  Except
    MessageDlg('Error na Criação da Tabela ou Índice', mtError, [mbOK],0);
  end; { try...except }
end;
2) Importação dos dados -> é a sua rotina, adaptada para recriar a tabela (chamada para o procedimento acima):
procedure TForm1.Button2Click(Sender: TObject);
var
  Txt : TextFile;
  Entrada : String;
begin
  Assignfile(Txt,'Clientes.Txt');
  Reset(Txt);
  CriaTabelaImportacao('c:\temp\cliente.db');  // ajustar o nome
  While not Eoln(Txt) do
  begin
    Readln(Txt,Entrada);
    Table1.Insert;
    Table1.FieldByName('Codigo').Value := Trim(Copy(Entrada,01,05));
    Table1.FieldByName('CodProd').Value := Trim(Copy(Entrada,06,05));
    Table1.FieldByName('Nome').Value := Trim(Copy(Entrada,11,20));
    Table1.FieldByName('Cidade').Value := Trim(Copy(Entrada,31,10));
    Table1.FieldByName('UF').Value := Trim(Copy(Entrada,41,02));
    Table1.Post;
  end;
  CloseFile(Txt);
  Button3.Enabled := True;
end;

E agora deve funcionar. Dê uma verificada, falou?!

Link para o comentário
Compartilhar em outros sites

  • 0

carinha perdão pela demora em responder ...esta semana tava muito tumultuada...finald e mês sabe como é!!

Carinha eu testei e funcionou legal...jóia..

só mais uma pequena dúvida amigão:

como eu crio um campo AUTOINCREMENTO.???

e você me deu uma dica de criar campos alphanumericos....

o alphanumerico você define assim: ftString

o campo D-Date é assim: ftDate

O T-Time assim: fttime

I-Integer: ftinteger

e o campo N-NUMERICO??

Amigão...muito grato pela ajuda mais uma vez.....abraço...t+

;)

Link para o comentário
Compartilhar em outros sites

  • 0
como eu crio um campo AUTOINCREMENTO.???
ftAutoInc
e o campo N-NUMERICO??
ftFloat

para retirar as outras dúvidas (a resposta é encontrada no mesmo lugar), sugiro que você posicione o cursor do mouse sobre o texto FieldDefs (na linha do código: with Table1.FieldDefs do) e tecle F1 (ajuda), no texto que aparece deve ter algo como property FieldDefs: TFieldDefs;, clicando no link TFieldDefs, você procura pelo link referente aos metodos (methods); na lista que aparece é só procurar pelo método Add e lá estarão todos os tipos de campos que você pode utilizar.

É o que eu sempre faço quando necessito de mais detalhes (não dá para lembrar de tudo né) :D

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...