Jak skopiować dane z tabeli do tablicy

0

Utworzyłem w Paradoxie tabelę, w której między innymi mam kolumnę z danymi liczbowymi (Wzrost). Chciałbym na tych danych dokonać obliczeń statystycznych np: Mean(Wzrost) - funkcja obliczająca średnią arytmetyczną. Do obliczeń wymaga podania danych w postaci tablicy. Próbowałem w ten sposób

Wzrost: array of Double; 
SetLength(Wzrost, Form1.TTable1.RecordCount);

ale wydaje mi się że brakuje samego "wrzucania" poszczególnych wartości z tabeli do tablicy;
Czego brakuje w tym kodzie? A może zrobić to w inny sposób?

0

poszukaj czy moze w paradoxie jest podobnie jak w np StringGridzie i sproboj :

 for i:=0 to Stringrid1.colcount-1  do for j:=0 to stringrid1.rowcount-1 do tablica[i]:=strtofloat(StringGrid1.Cells[i,j]);

Nie znam paradoxa ale moze sie przyda.

0

eeeee

SELECT AVG(wzrost) FROM nazwa_tabeli

:>

0

Fajnie, tylko że SQL nie nie obliczy mi wariancji ani odchylenia standardowego. A Delphi ma takie funkcje.
średnia:

function Mean(const Data: array of Double): Extended;

wariancja:

function PopnVariance(const Data: array of Double): Extended;

odchylenie standardowe:

function PopnStdDev(const Data: array of Double): Extended;

Potrzebuję tylko przerzucić poszczególne wartości z tabeli do tablicy.
Gdybym miał obliczyć tylko średnią, to SQL idealnie się nadaje. TQuery załatwia sprawę. Ja mam trzy kolumny z wartościami (Wzrost, Waga, BMI) i chciałbym za pomocą TRadioGroup wybierać co ma być obliczone i wyświetlone w trzech TEdit'ach (edSrednia, edWariancja, edOdchyl).

0
var
  ar: array of array of Integer;
  i, j : Integer;
begin
  i := 0;
  with Table do
  begin
    SetLength(ar, RecordCount, Fields.Count);
    while not EoF do
    begin
      for j := 0 to Fields.Count - 1 do
        ar[i, j] := Fields[j].AsInteger;
      Next;
      Inc(i);    
    end;
  end;
end;

zadziała jeśli wszystkie pola masz typu integer. Jeśli chcesz przepisać tylko wybrane to najprościej będzie wziąć Query i w liście pól najpier wypisać te numeryczne a potem np. imie czy nazwisko i Fields.Count zastąpić po prostu liczbą pól numerycznych

0

Ten kod dotyczy tablicy wielowymiatowej, a mnie potrzebne są trzy tablice jedmowymiarowe.
Moja tabela ma tylko trzy kolumny numeryczne i na nich chciałbym dokonać obliczeń. Reszta kolumn mnie nie interesuje.
Próbowałem tak (na razie tylko z jedną tablicą):

Var
Wzrost: array of Double;
i,j: Integer;
begin
SetLength(Wzrost,fmForm1.tbTabela.RecordCount);
i := 0;
    with fmDane.tbCechyWzrost do
    begin
        for i := 0 to fmForm1.tbTabela.RecordCount - 1 do
        Wzrost[j] := fmForm1.tbTabelaWzrost.AsInteger;
      Next;
      Inc(i);
    end;
    EdSrednia.Text := FloatToStr(Mean(Wzrost));
    EdWariancja.Text := FloatToStr(PopnVariance(Wzrost));
    EdOdchyl.Text := FloatToStr(PopnStdDev(Wzrost));
  end;

Poprawcie mi błędy bo niestety nie chodzi jak trzeba.

0

zastanowiłeś się choć przez 10sekund nad kodem, który ci podałem czy wziąłeś linijkę z mojego i linijkę z kądś tam i tak na przemian?
Jeśli liczyć begin i end to masz całe 7 linijek do analizy. Czy naprawdę tak ciężko do helpa, googla lub na 4p poszukać co dana linijka robi?

0

ok przekombinowales ten kod:

var wzrost: array of Double;
     i: Integer;
begin
 SetLength(Wzrost,fmForm1.tbTabela.RecordCount);
 with fmDane.tbCechyWzrost do
  begin
   for i := 0 to fmForm1.tbTabela.RecordCount - 1 do Wzrost[i] := Form1.tbTabelaWzrost.AsInteger;
   Next; // nie znam sie na paradoxie wiec nie wiem czy potrzebny jest next
  end;
  EdSrednia.Text := FloatToStr(Mean(Wzrost));
  EdWariancja.Text := FloatToStr(PopnVariance(Wzrost));
  EdOdchyl.Text := FloatToStr(PopnStdDev(Wzrost));
end;

Powninno gadac [diabel]

0

Misiekd: ponieważ tabela ma tylko trzy kolumny z danymi liczbowymi (a dużo więcej string i Boolean) nie ma sensu wczytywać jej całej do tablicy wielowymiarowej. Zaciekawił mnie natomiast pomysł z Query, które by selektem wyciągało jedną kolumnę i wrzucało do tablicy. Mam nadzieje że dobrze cię zrozumiałem. Niestety nie wiem jak to zrobić, tzn jak już mi wykona zapytanie, jak przesłać wynik do tablicy? I może coś bliżej na temat wspomnianej przez ciebie listy pól.

Próbowałem również tak (na podstawie: Rozdział 16):

var
Wzrost: array of Double;
i: Integer;
begin
    fmDane.tbCechy.Active := true;

    SetLength(Wzrost,fmForm1.tbTabela.RecordCount);

  while not fmForm1.tbTabela.Eof do
  begin
    Wzrost[i] := fmForm1.tbTabela.FieldValues['Wzrost'];
    fmForm1.tbTabela.Next;
  end;

    ESrednia.Text := FloatToStr(Mean(Wzrost));
    EWariancja.Text := FloatToStr(PopnVariance(Wzrost));
    EOdchyl.Text := FloatToStr(PopnStdDev(Wzrost));
end;

ale wylicza jakieś głupoty. Z kolei przy tym poprzednim kodzie (z poprzedniego postu) wrzucało mi tylko wartość pierwszego pola tablicy i tylko do pierwszego Edita (ESrednia).
Pomóżcie bo mi mało czasu zostało a tylko ten jeden problem mi został do rozwiązania, żeby skończyć projekt.

0

ech załamka

  1. opcja z Query (pole_num_1, pole_num_2, pole_num_3 to NAZWY pól, które Cię interesują)
var
  ar: array of array of Integer;
  i, j : Integer;
begin
  i := 0;
  with Query do
  begin
    SQL.Text := 'SELECT pole_num_1, pole_num_2, pole_num_3 FROM tabela';
    Open;
    First;
    SetLength(ar, RecordCount, Fields.Count);
    while not EoF do
    begin
      for j := 0 to Fields.Count - 1 do
        ar[i, j] := Fields[j].AsInteger;
      Next;
      Inc(i);    
    end;
  end;
end;
  1. opcja z Table (pole_num_1, pole_num_2, pole_num_3 to NUMERY pól, które Cię interesują)
const
  Pola: array[1..3] of Byte = (pole_num_1, pole_num_2, pole_num_3);
var
  ar: array of array[1..3] of Integer;
  i, j : Integer;
begin
  i := 0;
  with Table do
  begin
    Open;
    First;
    SetLength(ar, RecordCount);
    while not EoF do
    begin
      for j := 1 to 3 do
        ar[i, j] := Fields[Pola[j]].AsInteger;
      Next;
      Inc(i);    
    end;
  end;
end;
  1. opcja z Table (klikasz dwa razy na Table, potem prawy i AddFields i zaznaczasz tylko te, które Cię interesują)
var
  ar: array of array of Integer;
  i, j : Integer;
begin
  i := 0;
  with Table do
  begin
    Open;
    First;
    SetLength(ar, RecordCount, Fields.Count);
    while not EoF do
    begin
      for j := 0 to Fields.Count - 1 do
        ar[i, j] := Fields[j].AsInteger;
      Next;
      Inc(i);    
    end;
  end;
end;

takie to trudne?????

a jak Ci bzdury wychodzą to sprawdz co masz w tabelach, co przekazujesz do funkcji i co te funkcje robią. Nikt nie zrobi tego za Ciebie

0

MisiekD, widzę że Delphi masz obcykane. W związku z tym mam jeszcze jeden problemik z którym moja nędzna wiedza programistyczna sobie nie radzi. Użyłem twojej trzeciej opcji, tej z listą pól i wyszła mi (mam nadzieję) tablica dwuwymiarowa z trzeba kolumnami i tyloma wierszami ile było rekordów w tabeli.
Mam ar[i,j]. W jaki sposób odwołać się do całej kolumny tej tablicy aby np. funkcja PopnStdDev obliczyła mi odchylenie standardowe tylko z tych wartości które się w niej znajdują. Zaznaczam że funkcja ta jako parametru używa tablicy otwartej (chyba raczej jednowymiarowej):

function PopnStdDev(const Data: array of Double): Extended;

Czy coś takiego może być:

EOdchyl.Text := FloatToStr(PopnStdDev(ar[i,0])); {użycie wszystkich wartości z kolumny o indeksie 0}

A może w ogóle można zrobić to w inny sposób.
Liczę na pomoc bo im więcej czytam i przeglądam sieć tym większy mam zamęt. [???]

0

zamień SetLength(ar, RecordCount, Fields.Count); na SetLength(ar, Fields.Count, RecordCount);
następnie
ar[i, j] na ar[j, i]
i powinno zadziałać
arr[0]

1 użytkowników online, w tym zalogowanych: 0, gości: 1