Jump to content

Recommended Posts

Posted (edited)

olá amigos, então a minha questão e a seguinte...

Em delphi estou a tentar importar dados da minha base de dados para uma estrutura, onde esta o meu erro...???

lista_produtos : Tproducts;
// i: integer;
begin
 i.First;

while not i.EOF(TDataModule1) do

   //for i := 0 to Lista_produtos - 1 do

 lista_prudutos[i].prodCode := TDataModule1.fieldbyname('codproduto').AsString;
 //lista_produtos[i].prodCode := strtodata(produtos.fiel'dByName('codproduto').ASString),date;
 lista_produtos[i].prodDescription := ds.fieldByName('designacao').ASString;
 lista_produtos[i].prodPrice := //('##0.00', 12549687697);
 lista_produtos[i].
 i.Next;
 // i=i+1;
  end;
 result := lista_produtos;
end;
Edited by nunopicado
Adicionadas tags GeShi
Posted (edited)

Por onde começar?...

- Se i é integer, conforme está declarada, é de um tipo simples, apenas numeros inteiros.

Logo, i.First não funciona, i.EOF muito menos, i.Next outro tanto.

- TDatamodule1 é uma instância de TDatamodule, ao que o nome indica. Não tem campos.

Logo, TDatamodule1.FieldByName... não existe.

Por sinal também não é um ficheiro ou dataset, logo não entra no EOF nem por decreto.

- O While... Do só vai executar uma linha.

É ela:

lista_prudutos[i].prodCode := TDataModule1.fieldbyname('codproduto').AsString;

A falta de BEGIN a seguir ao DO, encarrega-se disso.

A propósito, a tua variável é lista_produtos, e não lista_prudutos, o compilador não vai conhecer isso...

- E à falta de BEGIN em cima, o END em baixo vai dar erro...

- as duas últimas linhas de atribuição a lista_produtos não existe...

lista_produtos[i].prodPrice := //('##0.00', 12549687697);
lista_produtos[i].

é equivalente a:

lista_produtos[i].prodPrice := lista_produtos[i].

Ou seja, não existe.

Edited by nunopicado
  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

huuum pois :s eu tenho duvidas em como fazer isso, visto que atraves de um form global vou buscar a database---TDataModule1, queria passar os campos para a estrutura , ou melhor os varios campos....

Tproduct = record
   prodCode  : String[10];
   prodDescription : String[60];
   prodPrice : String[10];
   prodGroup : Tgroup;
 end;
 Tproducts = array of Tproduct;
Edited by nunopicado
Adicionadas tags GeShi
Posted

Quando meteres código no forum, mete as tags CODE com a respectiva linguagem, para que se perceba bem.

Há aí um mal entendido qualquer...

TDataModule1 não é uma base de dados. Poderá ser lá que tens a base de dados, mas em si, é só uma zona onde podes meter componentes.

Para passar de uma base de dados para uma estrutura record, precisas saber:

1º Se é mesmo isso que queres... É algo que não faz grande sentido, pois o Dataset da base de dados já lá tem tudo e de forma bem melhor do que um record+array

2º Saber qual o teu Dataset.

3º Definir o tamanho do array (que no teu exemplo, é dinâmico) de acordo com o total de registos do Dataset

4º Percorrer todo o Dataset, guardando os dados de cada registo no equivalente do Record.

Por Dataset, entenda-se, uma SQL Query, SQL Table ou outro componente equivalente.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

para usar o data set a configuracao n sei fazer visto que da-me sempre o erro que parece que tem a ver com o midas.dll... o que quero implementar e um web server que guarde no array os valores da base de dados :S e a minha dificuldade entre outras é como no wile not vou percorrer a base de dados...

* estou a ir buscar a bd com um ado conection e uma ado query

Edited by smack_dead
Posted (edited)

Não sabes, a gente ensina-te...

Isso não é problema.

Do Midas.dll, basta meteres essa dll na pasta do programa, ou meteres na secção uses a unit midaslib

Se tens erro no Midas.dll, isso significa que estás a usar um TClientDataset, certo?

Edited by nunopicado

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

sim, tclientdataset... ja experimentei usar o midaslib no uses e continuou igual.....mas torna-se mais facil do que usar o wile para percorrer a bd e passar os valores da estrutura para o array?

O While serve para quando não sabes ao certo o tamanho. Não é o que se passa aqui.

O Dataset tem uma propriedade (RecordCount) que te diz exactamente quantos registos lá estão.

Logo, o FOR é o ciclo certo a usar.

Saca este ficheiro: https://dl.dropboxusercontent.com/u/5146367/midas.dll

Grava-o na pasta do teu executável.

Edited by nunopicado
  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

tdatasetprovider ou o tclientdataset?

O TClientDataset.

Por exemplo (imaginando que o teu ClientDataset se chama ds):

var
  i:integer; 
begin
  SetLength(Lista_Produtos,ds.RecordCount); // Define o tamanho do array com o mesmo número de registos que o dataset

  for i:=0 to ds.RecordCount-1 do // Percorre o dataset
     with Lista_Produtos[i] do
        begin
           ds.RecNo        := i;  // Define a posição do dataset

           prodCode        := ds.fieldbyname('codproduto').AsString;
           prodDescription := ds.fieldByName('designacao').ASString;
           prodPrice       := ds.fieldByName('price').AsFloat;
        end;
end;

Isto percorre todo o dataset e vai gravando os dados no array.

Mais uma vez, não vejo nenhuma razão para fazer isto no mundo real. Só ser for por ser um exercício.

A qualquer momento podemos aceder aos registos directamente no dataset, sem ter de estar a ocupar recursos com o array a duplicar informação.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

o exercícios é fazer com que os produtos da base de dados passem para uma loja on-line

Escapa-me então o motivo do Record...

Mas independentemente da sua utilidade, é possível fazer, como pus em cima.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

eu usei o record para declarar o tipo de estrutura... porque supostamente nesta parte vou buscar os campos produtos mas eu tenho de ser capaz de ir buscar outros campos (tabelas) a bd

Quanto ao TClientDataset.

tenho de ter um soap conection??

o provirerName da-me sempre erro..

tenho de ter o tdata set provider???

ou apenas basta o ado conection e o ado query?

o meu adoquery tem esta sql.....

Select codproduto,designacao,precocusto,codgrupo from produtos;
Edited by smack_dead
Posted

O ClientDataSet já é uma tabela... Não precisas de query alguma pois ele próprio é um dataset.

Dependendo da estrutura que estás a fazer, nem de provider precisa. Basta-lhe o próprio TClientDataSet para teres uma tabela completa.

Soap Connection não tem nada a ver com bases de dados... Onde é que andas a ver isso?

Para criar uma tabela com um TClientDataSet, basta-te mete-lo na form, e abri-lo.

Se for uma tabela nova, tens de criar o dataset antes de abrir, e depois meter dados.

Se for uma tabela existente, tens de a carregar, e depois abrir.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

ehhh boa 😄 ...fiz 'assing local datas' meti o meu ado query e ele detetou ...mas no meu codigo ainda aparece que o ds nao esta declarado.....

tenho o meu ds(data set)noutro form ... e ja fiz use form...

solução.....Uform.TDM.ds ....para ir buscar a outro formulario :DDD obrigado amigo :DDDDD

se nao for abusar nao me quer dar umas dicas para fazer uma funcao de login....

Ao efetuar login deverá ser verificado se a palavra chave fornecida confere com a palavra chave do utilizador fornecido

Caso o utilizador não exista, ou a senha fornecida não coincida com a senha na BD então a variável logged = FALSE.

APassword devera ser encriptada!!!mas Como :s ???

Edited by smack_dead
Posted

ehhh boa 😄 ...fiz 'assing local datas' meti o meu ado query e ele detetou ...

Cada vez entendo menos... Então afinal os teus dados estão onde? No Clientdataset ou no ado query?

mas no meu codigo ainda aparece que o ds nao esta declarado.....

tenho o meu ds(data set)noutro form ... e ja fiz use form...

Por acaso não está no DataModule?

Se sim, tens de usar:

coisa := datamodule1.ds.fieldbyname('blablabla').asstring

Tens de lhe dizer em que form está o ds como pus em cima. Se não estiver no datamodule1, troca pelo nome da form onde estiver.

Isto não dispensa que metas a unit dessa form na secção uses.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Isto porque eu tenho...um Uform com um ado conectio um ado query e um tclient data set(nao sei ir buscar a bd sem o adoquery) no meu codigo webserverIMPL usei


var
 lista_produtos : Tproducts;
 i: integer;
begin
  SetLength(lista_produtos,Uform.TDM.ds.RecordCount); // Define o tamanho do array com o mesmo número de registos que o dataset------>>>>da erro

  for i:=0 to Uform.TDM.ds.RecordCount-1 do // Percorre o dataset
     with lista_produtos[i] do
        begin
           Uform.TDM.ds.RecNo       := i;  // Define a posição do dataset

           prodCode        := Uform.TDM.ds.fieldbyname('codproduto').AsString;
           prodDescription := Uform.TDM.ds.fieldByName('designacao').ASString;
           prodPrice       := Uform.TDM.ds.fieldByName('precocusto').AsFloat;
           prodGroup       := Uform.TDM.ds.fieldByName('codgrupo').AsString;-----> tem de passar os campos todos da struct group
        end;
end;


////////////////////


Tgroup = record
   groupCode : String[4];
   groupDescription : String[60];
   groupFamilys : Tfamilies;
 end;
 Tgroups = array of Tgroup;

 Tproduct = record
   prodCode  : String[10];
   prodDescription : String[60];
   prodPrice : String[10];
   prodGroup : Tgroup;
 end;
 Tproducts = array of Tproduct;

///////////////////////

Edited by thoga31
Corrigido GeShi
Posted

Então explica lá:

Se tens a ADO Query, e os dados estão lá, para que serve o TClientDataSet?

Se estás a passar da ADO Query para o TClientDataSet, e do TClientDataSet para o Record, ficas no fim com a tabela em triplicado na memória...

Não faz o menor sentido.

Os comandos que te mostrei para o clientdataset funcionam igualmente na ADO query. São componentes equivalentes a nível de interface.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

certo , tens toda a razao, e ja consegui por a dar so falta uma coizinha.....

prodPrice       := Uform.TDM.ds.fieldByName('precocusto').AsFloat;------isto e decimal como declaro????????
prodGroup       := Uform.TDM.ds.fieldByName('codgrupo').AsString;-----> tem de passar os campos todos da struct group


 Tgroup = record
   groupCode : String[4];
   groupDescription : String[60];
   groupFamilys : Tfamilies;
 end;
 Tgroups = array of Tgroup;

 Tproduct = record
   prodCode  : String[10];
   prodDescription : String[60];
   prodPrice : String[10];
   prodGroup : Tgroup;
 end;
 Tproducts = array of Tproduct;

Edited by nunopicado
Ajuste formatação

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.