Dynamiczne tworzenie SQLQuery

0

Witam

Próbuje dynamicznie utworzyc obiekt TSQLQuery, który by obsługiwał różne zapytania do bazy. Robie dynamicznie, bo jakby miał ręcznie kłaść na formatke te komponenty, to ich byłoby kilka, bo do kazdego zapytania, musiałby być oddzielny komponent, a tak bede mial jeden.

Probowalem czegos takiego:

var
  sql:tsqlquery;
  pole:tstringfield;

...

        sql:=tsqlquery.Create(self);
        sql.SQLConnection:=ddm.konekszyn;
        sql.SQL.Text:='SELECT COUNT(idrap) FROM raporty WHERE idkier="'+lvkierowcy.Selected.Caption+'";';
        pole:=tstringfield.Create(self);
        pole.SetFieldType(ftString);
        pole.Name:='sqlcountidrap';
        pole.FieldName:='COUNT(idrap)';
        pole.FieldKind:=fkData;
        pole.DisplayLabel:='COUNT(idrap)';

        sql.Fields.Add(pole);
        sql.Fields.Fields[0].SetFieldType(ftString);

        try
        sql.Open;
        except
          showmessage('dupa z open');
        end;
        showmessage(sql.FieldByName('COUNT(idrap)').AsString);
        sql.Free;
        pole.Free;

....

ale ciagle dostaje:
First chance exception at $75409617. Exception class EDatabaseError with message 'Type mismatch for field 'COUNT(idrap)', expecting: String actual: FMTBcdField'. Process htstrm2.exe (3964)

z tego błędu wynika jakby typ pola był zle zdefiniowany, no ale jak widac w kodzie, probowałem dwojako go zmienić i nic. Jakies rady?

0

Może daj jakiś alias na tego COUNT-a i powołuj się na alias w FieldName.

0

przecież count zwraca LICZBĘ a nie CIĄG ZNAKÓW!!!

0
Misiekd napisał(a)

przecież count zwraca LICZBĘ a nie CIĄG ZNAKÓW!!!

jedyna zmiana jaka nastopila po zmianie tstringfield na tintegerfield to tresc bledu:

First chance exception at $75409617. Exception class EDatabaseError with message 'Type mismatch for field 'ilerap', expecting: Integer actual: FMTBcdField'. Process htstrm2.exe (3164)

czyli dalej to samo...

a i alias tez nic nie daje.

0

myślę, że powinieneś zająć się czymś innym a nie programowaniem.
Czy ja napisałem INTEGER?? Przecież w pierwszym komunikacie masz jak krowa na granicy napisany typ pola - TBCDField

0
Misiekd napisał(a)

myślę, że powinieneś zająć się czymś innym a nie programowaniem.

jakby wszyscy mieli taka motywacje to na swiecie ani jedno programisty by nie bylo.

Misiekd napisał(a)

Przecież w pierwszym komunikacie masz jak krowa na granicy napisany typ pola - TBCDField

no ale count zwraca integera nie? To skad sie ten jaki fmtbcd bierze?

Ale dobra, zmienilem na to bcd, ale jak sie pozniej owoluje do tej danej

costam:=sql.FieldByName('COUNT(idrap)').AsString;

to wyskakuje ze COUNT(idrap) "has no dataset". i teraz to juz nie wiem gdzie tego dataseta trza dostawic.. Na pewno nie chodzi o to ze ten SELECT nic nie zwraca, bo zwraca liczbe 4.

0

Temat rozwiazany, pomogli mi ludzie z bardziej zyczliwego forum. Jakby ktos potrzebowal to nie trzeba pola tworzyc i tyle.

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