Jump to content

Gravar um array bidimensional numa DB Access


passarito
 Share

Recommended Posts

Boas,

se eu quizer guardar um array (bi-dimensional de tamanho fixo) numa bd, por exempo, em access como é que eu faria? Como é que tenho que configurar o campo?

É que em Pascal dá para criar um campo array num Record, basicamente é isto que quero

Antes de dizerem que isto é um assunto de BD, eu já lá coloquei a questão mas a resposta não foi satisfatória, então resolvi recorrer aos "amigos"! 😁

Link to comment
Share on other sites

Dá-me um exemplo de dados... Só para ver ao certo do que estamos a falar!

"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.

Link to comment
Share on other sites

Podes fazer, por exemplo, uma chave primária dupla...

Tipo isto:

Campos:

X, Y (Integer, Primary Key)

Valor (Float)

Na tabela fica:

-----------------------
|  X  |  Y  |  Valor  |
-----------------------
|  1  |  1  |    2.6  |   (Equivale a Medicoes[1,1]:=2.6)
|  1  |  2  |   11.2  |   (Equivale a Medicoes[1,2]:=11.2)
|  1  |  3  |  126.8  |   (Equivale a Medicoes[1,3]:=126.8)
|  3  |  8  |  452.1  |   (Equivale a Medicoes[3,8]:=452.1)
-----------------------

E a pesquisa seria:

Select Valor From Medicoes WHERE X=1 AND Y=3;    /* O resultado seria 126.8 */

Serve?

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.

Link to comment
Share on other sites

Também me passou isso pela cabeça, mas achei que iria ficar muito confuso..

Terei que esclarecer, redefinir ou outra coisa qualquer as abordagem ao problema. O que é certo é que terei de ter aquela tabela ou como sugeriste a simulação da mesma.

É que esta tabela está associada a um equipamento.

Corrige-me se eu estiver errado:

- Sempre que criar um equipamento terei que criar 50 registos na tabela medicoes (vamos chamar-lhe assim)

- Logicamente essa tabela além de ter o X, Y e o Valor também terá de ter o campo equipamento - isto faz que para 100 equipamentos terei 5000 registos, além de mais, não sei se querem guardar as medições anteriores do mesmo equipamento. 😞

- Além disto tudo, ainda terei uma outra questão, quando estiver a trabalhar com estes dados posso usar o array, mas quando for gravar isto terá de gravar registo a registo.

Link to comment
Share on other sites

Mas isso vai-te acontecer sempre...

Um array é um conjunto de variáveis como sabes. Tens portanto aí 5x10 variáveis, ou seja, 50.

Mesmo usando um array, continuas a ter 50 variáveis, é tudo uma questão de ver como fazes a gravação.

Podes é claro usar outros métodos...

Por exemplo, a tabela pode ter chave simples, e depois metes os valores do array em campos:

ID | Valor1 | Valor2 | Valor3 | Valor4 | Valor5 | Valor6 | Valor7 | Valor8 | Valor9 | Valor10

Com isto, já só tinhas 5 registos por cada um. Mas não me parece tão prático.

Eventualmente, podias deixar lá os registos, que não estorvam, porque apesar de serem muitos, estão bem identificados com as chaves e acederás sempre só aos 50 de cada vez, tal como o array, mas fazias um componente que te simulasse o array (escusa este de existir), que grave e leia os dados directamente do SQL.

Assim, a nível de utilização seria quase transparente, e o componente internamente fazia o trabalho pesado.

"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.

Link to comment
Share on other sites

Tenho de cozinhar bem a ideia...

Como isto não é para já não necessito de por o lume no máximo. Vou cozinhando a ideia em lume brando à espera que surja uma ideia brilhante (duvido) que me satisfaça (duvido ainda mais). Às vezes sem quê nem pra quê a lampada acende-se!

Até pode ser a forma como estou a abordar o problema... Epá, já nem sei nada!

Para teres uma ideia, eu ainda nem sei se vou desenvolver isto em Delphi ou em ASP? Ou ambos. De um lado faz umas coisas do outro outras!

Já a BD 5% de hipoteses de ser em Firebird e 95% em Access por causa da interligação das já existentes e do meu conhecimento.

Link to comment
Share on other sites

Pus-me aqui a pensar, e por curiosidade fiz o seguinte:

type
  TDBArray = Record
  strict private
    FQuery: TZQuery;
    function Getter(x,y:Byte) :Real;
    procedure Setter(x,y:Byte; Valor:Real);
    function Find(x,y:Byte):Boolean;
  public
    property Query: TZQuery read FQuery write FQuery;
    property Conteudo[x,y:Byte]:Real read Getter write Setter; Default;
  End;

function TDBArray.Find(x,y: Byte):Boolean;
begin
    FQuery.SQL.Text:='SELECT * FROM Medicoes WHERE X='+IntToStr(x)+' AND Y='+IntToStr(y);
    FQuery.Open;
    Result:=FQuery.RecordCount>0;
end;

function TDBArray.Getter(x,y:Byte) :Real;
begin
    if Assigned(FQuery) and Find(x,y)
       then Result:=FQuery.FieldByName('Valor').AsFloat
       else Result:=0;  // Valor default caso não exista o registo na DB
end;

procedure TDBArray.Setter(x,y:Byte; Valor:Real);
begin
    if not Assigned(FQuery)
       then Exit;

    if Find(x,y)
       then FQuery.Edit
       else FQuery.Insert;
    FQuery.FieldValues['X']:=x;
    FQuery.FieldValues['Y']:=y;
    FQuery.FieldValues['Valor']:=Valor;
    FQuery.Post;
end;

Para inicializar, tinhas de lhe indicar o componente da query:

var
  A:TDBArray;
begin
  A.Query := qMedicoes;

Depois disso, usavas tal qual um array:

A[1,5] := 5.8;
A[3,2] := 121.2;

Com isto, ele ia ler e escrever directamente à tabela da DB, mas a utilização era tipo array.

Nota: Para o exemplo, estou a usar a TZQuery como dataset (ZeosLib). Podes usar outro se for o caso, fazendo as devidas alterações.

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.

Link to comment
Share on other sites

Além de não perceber totalmente o teu código, porque o teu andar é o meu correr... COM A LINGUA DE FORA, consigo perceber o geral.

No entanto, o meu foco ainda está na BD. Deste-me algumas indicações muito uteis, queria melhorá-las.

Além do mais o ASP está muito apetitoso pois permite o uso do programa em qualquer pc da firma sem qualquer problema visto que existe uma intranet.

Vamos lá ver como é que isto evolui... não te preocupes, pode ser que te chateie mais tarde. 😛

Edited by passarito
Link to comment
Share on other sites

Dividi o tópico, parece-me que fica melhor assim...

Então, para explicar aquele código, para o caso de ajudar mais alguém...

Comecei por criar um Record com métodos, para representar o array.

Os Records, hoje em dia, são muito mais do que um agrupamento de variáveis sob o mesmo identificador principal, como era no nosso tempo.

O Record com métodos é no fundo uma classe, mas que se auto-instância quando se declara uma variável desse tipo. Por outras palavras, não é preciso correr o Create da classe, pois ela é criada automaticamente ao declarar.

Neste, criei duas propriedades públicas, que são as que são visíveis à variável deste tipo:

- Query, uma TZQuery neste caso, que será usada internamente para ir buscar e gravar os dados na DB.

Basta atribuir-lhe um componente dessa classe, e não é preciso fazer mais nada com ela.

- Conteudo, uma propriedade complexa, que recebe dois parametros do tipo Byte (a identificação da posição do "array") e um valor Real, correspondente ao conteúdo da posição indicada

Esta propriedade está marcada como default, pelo que não é preciso referir o seu nome: Se referir-mos apenas a variável, ele assume que é esta a propriedade a usar

Para por tudo isto a mexer, uso internamente (não visível ao utilizador) 4 coisas:

FQuery, um campo TZQuery que guarda efectivamente o componente query a usar no processamento

Find, uma função que pesquisa a posição do "array", devolvendo True se encontrar, ou False se não encontrar

Getter, uma função que retorna o valor existente para uma determinada posição, ou 0 se não existir

Setter, um procedimento que grava um valor na posição determinada.

Explicada a estrutura, o conteúdo não tem muito que saber:

- O Find corre uma query que pesquisa na DB as coordenadas respectivas. Retorna True ou False consoante exista a posição ou não.

- O Getter, após encontrar (ou não) a posição, lê o seu valor e devolve-o. Simples também.

- O Setter, procura também a posição. Se encontrar, edita-a com os novos dados. Se não encontrar, cria uma nova linha na DB, com o valor indicado.

Esqueci alguma coisa?

"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.

Link to comment
Share on other sites

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
 Share

×
×
  • 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.