Ir ao conteúdo
  • Cadastre-se
Alexandre Rezende

Percorrer banco de dados com lazarus

Recommended Posts

Olá,

Estou fazendo uma aplicação e to com uma dúvida, tenho um banco de dados (MySQL) e nele uma planilha dentro do banco e queria, através do Lazarus (Delphi), percorrer essa planilha campo por campo e contabilizar quantas vezes seu conteúdo aparece, exemplo:

 

           A     B     C     D

100     1     1     2      3

101     1     2     2      3

 

Quero percorrer a linha 100 e contar quantas vezes cada número aparece. Aqui o 1 aparece 2 vezes, o 2 aparece 1 vez e o 3 aparece 1 vez tb.

depois quero que aconteça o mesmo na linha 101, e no fim terei o resultado:

 

1: aparece 3 vezes

2: aparece 3 vezes

3: aparece 2 vezes

 

É como percorrer uma matriz no pascal, isso eu sei, só não sei fazer isso no banco de dados (MySQL).

Se alguém puder me ajudar a pegar essas informações e colocar numa matriz (array, dentro do Lazarus), aí fica fácil a parte da contagem através dos loops.

 

Uma forma resumida de encarar o problema é: como transformo uma planilha de um banco de dados em uma matriz no pascal?

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você está utilizando qual componente para fazer a ligação?

 

Mas, não seria o simples?

listar o fields, ir na linha e pegar os valores?

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Fazzioni,

Estou utilizando o Zeos.

O que seria o simples? Eu não sei muito de linguagem de banco de dados, só o básico (criar, apagar, modificar). Entendo mais de pascal, por isso queria pegar as informações contidas nos campos do banco e colocar numa matriz em pascal, assim fica mais fácil manipular e quantificar as coisas.

Por exemplo, tenho um banco de dados com 100 linhas e cada linha tem 4 colunas ( A, B, C e D) e existem valores nesses campos.

Eu quero que o sistema vá até a linha que eu determinar, por exemplo a linha 10, e pegue cada valor de cada campo de cada coluna e monte uma matriz no pascal (Lazarus ou Delphi) com esses valores. Claro que tudo isso automatizado, com um click só, como se fosse um loop.

Também gostaria de determinar a linha onde ele vai parar, por exemplo a linha 15.

Assim o sistema percorre 5 linhas do banco de dados, apenas copiando as informações do banco e colando em uma matriz 5x4 no pascal.

Então resumindo fica assim, eu determino as linhas inicial e final e o sistema percorre essas linhas em cada campo, montando uma matriz em pascal idêntica ao banco.

Obrigado!

                                     

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, eu nunca trabalhei com lazarus nem com Zeos,

 

Você ja fez a conexão? está listando os registros em um dbgrid?

 

Coloque um botão e teste estes códigos:


var
  i : integer;
  TBL : TDataSet;
begin

 

//Variavel para receber a tabela, apenas para facilitar

TBL := TABELA;

 

// procura a o registro

if TBL.Locate( /'FIELDNAME/', /VALORDOREGISTRO  ,[]) then

ShowMessage('Reg encontrado');

 

// Percorre os fields e traz os valores

for i := 0 to TBL.Fields.Count -1 do
ShowMessage(TBL.Fields[i].FieldName+#13+TBL.Fields[i].AsString);
 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está conectado sim

Os registros aparecem no dbgrid sim

Tentei o código que você fez e deu muitos erros, nem vou listá-los. =(

Tem outras idéias?

Assunto difícil de pesquisar esse...

Tenho uma tabela num banco de dados. Como passo (copio) ela para uma matriz no pascal?

Fica a dúvida.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente agora:

 

Adicione a unit: DB


 var
  i : integer;
  TBL : TDataSet;
begin

//Variavel para receber a tabela, apenas para facilitar
TBL := DBGrid1.DataSource.DataSet;

// procura a o registro
// verificando se existe um field chamado "CODIGO"
if tbl.Fields.FindField('codigo') = nil then
  ShowMessage('Campo "Codigo" não existe')
else // Field existe
if TBL.Locate( 'codigo', 10  ,[]) then //Vai para o registro com codigo = a 10
  showMessage('Reg 10 encontrado')
else
  ShowMessage('Reg 10 não encontrado');


//Percorre os fields e traz os valores
for i := 0 to TBL.Fields.Count -1 do
ShowMessage('Field '+IntToStr(i)+': '+TBL.Fields[i].FieldName+#13+' Valor: ' +TBL.Fields[i].AsString);
 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fazzioni

Teve 7 erros...

Esses 2 em relação ao TDataSet.

Error: Identifier not found "TDataSet"

Error: Error in type definition

No caso do Zeos é "ZDataset", eu mudei e deu os mesmos erros.

 

os outros erros é em relação as propriedades da variável TBL.

Error: Illegal qualifier 

ele se refere as palavras Fields e Locate (TBL.Fields e TBL.Locate) toda vez que elas aparecem.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

huum, Zeos não trabalha com DB, puxa

 

Qual a classe do componente que você esta fazendo a ligação?

ZQuery? ZTable?

 

Qual a versão do Zeos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fazzioni

A versão é ZeosDBO 7.1.4 stable

A classe do componente é TZQuery

 

Na unit, onde declara os Types ele lista até as colunas da planilha assim

type

  { TTabGlobal }

  TTabGlobal = class(TDataModule)               // coloquei a conexão, query e datasounce num data module.
    dtsResultadoslf: TDataSource;
    conexao: TZConnection;
    qryResultadoslf: TZQuery;
    qryResultadoslfConcurso: TLongintField;  // a partir daqui são as colunas que vai até 25.
    qryResultadoslfdz1: TLongintField;
    qryResultadoslfdz2: TLongintField;
    qryResultadoslfdz3: TLongintField;     

 

A ideia é fazer o sistema percorrer essas 25 colunas e copiar seu conteúdo num Array.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Fazzioni

Não deu não..

Não consigo nem pegar uma informação do banco e colocar numa variável? digamos sem percorrer, mas diretamente, assim:

a1:= "informação da linha 1 coluna a";

b1:= "informação da linha 1 coluna b";

c1:= "informação da linha 1 coluna c";

...

 

tem como?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem, indo direto no field, mas qual o erro?

 

No delphi nativo ficaria assim:

 


 qryResultadoslfConcurso.value 

ou

 qryResultadoslfConcurso.asstring

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu certo! Alterei algumas coisas e consegui. Ficou assim:

procedure TForm1.btnTransfClick(Sender: TObject);
Const
  //Tab character
  Delim = CHR(5);
var
 j,x,c : integer;
  TBL : TDataSet;
  S: String;


begin
 TBL := DBGrid1.DataSource.DataSet; //Variavel para receber a tabela, apenas para facilitar.
 c:= StrToInt(edConcurso.text);            //Variavel q incrementa em cada loop passando para próxima linha.


for x:= 1 to 10 do  //Percorre 10 linhas.
begin

// verificando se existe um field chamado "concurso"
if TBL.Locate('concurso', edConcurso.Text  ,[]) then   //Vai para o registro com codigo = a "edConcurso"
  showMessage('Concurso '+edConcurso.text+' encontrado')
else
  ShowMessage('Concurso '+edConcurso.text+' não encontrado');


//Percorre os fields e traz os valores
  for j := 0 to TBL.Fields.Count -1 do
   S:= S + TBL.Fields [j].AsString + Delim;


   Memo1.Lines.Add(S);  
   c:=c+1;
   edConcurso.Text:= IntToStr(c);
   S:='';
end;
end;
end.

 

Agora que consigo listar essas informações, é só colocar elas num Array, como eu queria!

Obrigado Fazzioni.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×