smack_dead Posted February 25, 2014 at 12:32 PM Report #546567 Posted February 25, 2014 at 12:32 PM (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 February 25, 2014 at 12:47 PM by nunopicado Adicionadas tags GeShi
Kline777 Posted February 25, 2014 at 12:34 PM Report #546568 Posted February 25, 2014 at 12:34 PM aparentemente muitos 😛 Essa variavel i é integer ou é o teu dataset?? nao pode ser os 2 1 Report
nunopicado Posted February 25, 2014 at 12:59 PM Report #546569 Posted February 25, 2014 at 12:59 PM (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 February 25, 2014 at 01:00 PM by nunopicado 1 Report "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.
smack_dead Posted February 25, 2014 at 02:16 PM Author Report #546577 Posted February 25, 2014 at 02:16 PM (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 February 25, 2014 at 02:19 PM by nunopicado Adicionadas tags GeShi
nunopicado Posted February 25, 2014 at 02:23 PM Report #546580 Posted February 25, 2014 at 02:23 PM 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. 1 Report "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.
smack_dead Posted February 25, 2014 at 02:37 PM Author Report #546583 Posted February 25, 2014 at 02:37 PM (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 February 25, 2014 at 02:38 PM by smack_dead
nunopicado Posted February 25, 2014 at 02:43 PM Report #546585 Posted February 25, 2014 at 02:43 PM (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 February 25, 2014 at 02:50 PM 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.
smack_dead Posted February 25, 2014 at 02:45 PM Author Report #546587 Posted February 25, 2014 at 02:45 PM 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?
nunopicado Posted February 25, 2014 at 02:49 PM Report #546590 Posted February 25, 2014 at 02:49 PM (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 February 25, 2014 at 03:10 PM by nunopicado 1 Report "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.
smack_dead Posted February 25, 2014 at 03:01 PM Author Report #546594 Posted February 25, 2014 at 03:01 PM tdatasetprovider ou o tclientdataset?
nunopicado Posted February 25, 2014 at 03:10 PM Report #546595 Posted February 25, 2014 at 03:10 PM 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. 1 Report "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.
smack_dead Posted February 25, 2014 at 03:13 PM Author Report #546596 Posted February 25, 2014 at 03:13 PM o exercícios é fazer com que os produtos da base de dados passem para uma loja on-line
nunopicado Posted February 25, 2014 at 03:20 PM Report #546597 Posted February 25, 2014 at 03:20 PM 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.
smack_dead Posted February 25, 2014 at 03:29 PM Author Report #546599 Posted February 25, 2014 at 03:29 PM (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 February 25, 2014 at 03:48 PM by smack_dead
nunopicado Posted February 25, 2014 at 03:53 PM Report #546603 Posted February 25, 2014 at 03:53 PM 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. 1 Report "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.
smack_dead Posted February 25, 2014 at 04:07 PM Author Report #546610 Posted February 25, 2014 at 04:07 PM (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 February 25, 2014 at 04:18 PM by smack_dead
nunopicado Posted February 25, 2014 at 04:16 PM Report #546611 Posted February 25, 2014 at 04:16 PM 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. 1 Report "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.
smack_dead Posted February 25, 2014 at 04:34 PM Author Report #546612 Posted February 25, 2014 at 04:34 PM (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 February 25, 2014 at 09:24 PM by thoga31 Corrigido GeShi
nunopicado Posted February 25, 2014 at 04:38 PM Report #546613 Posted February 25, 2014 at 04:38 PM 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. 1 Report "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.
smack_dead Posted February 25, 2014 at 04:47 PM Author Report #546614 Posted February 25, 2014 at 04:47 PM (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 February 25, 2014 at 04:50 PM by nunopicado Ajuste formatação
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now