Results 1 to 6 of 6

Thread: SQL -> calculated fields

  1. #1

    SQL -> calculated fields

    Mijn probleem is het volgende:

    ik heb een sql, bvb:
    Code:
    select A, B, C from tabelnaam where A=xxx and b =xxx
    Dit zou ergens in een dataset of tquery moeten komen, en op de resultaten van die sql query moeten calculated fields toegepast worden, waarin ik bvb een substring of andere conversie doe per veld (moet allemaal dynamisch gaan gebeuren). Daarna lees ik de inhoud als geconcateneerde strings per row uit die dataset. Dat laatste is momenteel iets minder belangrijk. Het is de bedoeling dat dit zonder forms gebeurd, en rechtstreeks via de code.

    Heeft er iemand voorbeeldcode over het laden van sql en toepassen van calculated fields? Ik ben geen mega delphi kenner, maar kan er wel mee overweg . Ik heb al gegoogled maar ik kom steeds op dezelfde dingen met forms terecht. Al de collega's hier zijn weg of doen of hun neus bloed als het over calculated fields gaat. Grr...

    nota: Ik doe geen sql substr of dergelijke aangezien we met verschillende databanken werken en alle sql statements moeten op alle db's kunnen draaien

    Alvast bedankt

  2. #2
    Senior Member Schaduw's Avatar
    Join Date
    Sep 2007
    Location
    Maastricht
    Posts
    363
    Dat is niet zo 1 2 3 uit te leggen, maar ik doe een gooi :

    1. Drop een DB connectie component op je form.
    2. Vul de juiste parameters in en kijk of de connectie werkt.
    3. Drop een query component op je form en koppel de connection.
    4. Vul bij de SQL property van je query de betreffende SQL string in.
    5. Dubbel klik op je query component en klik met rechts in het
    window dat tevoorschijn komt.
    6. Kies eerst "add all fields" en dan nogmaals "New Field" (de new field editor verschijnt).
    7. Kies een naam, type en selecteer "calculated".
    8. Ga voor de betreffende query component naar de events en dubbelklik in de "OnCalcFields", om de event in code te genereren.
    9. In de OnCalcFields methode kun je dan volgende constructies gebruiken :

    Code:
     FieldByName('JouwNaam').AsFloat := FieldByName('C').AsFloat * FieldByName('B').AsFloat
    Bij binnenhalen van ieder record wordt dan de berekening voor het door jouw zelf toegevoegde (calculated) field gemaakt.
    DeLpHi-PoWeR

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Welkom op NLDelphi.

    Calculated fields zijn velden, die niet in je tabel voorkomen. Je zal ze dus in ieder geval moeten aanmaken om ze te kunnen gebruiken. Je kan het via een losse unit uitvoeren. Dan moet je je datacomponenten zelf aanmaken en dan inlezen en kan je het beste in een eigen class doen. Dan ben je onafhankelijk van een formulier
    Delphi is great. Lazarus is more powerfull

  4. #4
    Bedankt voor de welkom

    ja dat calculated fields velden, dat weet ik wel. Maar ik zoek vooral een aantal code voorbeelden aangezien ik op dat gebied nog niet met delphi gewerkt heb.
    Last edited by Marcel; 25-Aug-09 at 23:51.

  5. #5
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    in ieder geval kan je kijken bij Delphitricks. Je kan ook dit gebruiken.
    delphi Code:
    1. unit Unit7;
    2.  
    3. interface
    4.  
    5. uses windows, classes, ADODB;
    6.  
    7. type TMyTable = class
    8.   FTable : TADOQuery;
    9.   FConnection : TAdoConnection;
    10.   FQuery : string;
    11.   FOnCalcFields : TDataSetNotifyEvent;
    12.   private
    13.     procedure SetQuery(const Value: string);
    14.   protected
    15.   public
    16.     constructor Create; virtual;
    17.     destructor  Destroy; override;
    18.     procedure CalulatedField(value: string; Ftype : TDataType);
    19.     procedure open;
    20.     procedure close;
    21.     property Query : string read Fquery write SetQuery;
    22.     property OnMyCalcField : TDataSetNotifyEvent read FOncalcFields write FOnCalcFields;
    23. end;
    24.  
    25. implementation
    26.  
    27. { TMyTable }
    28.  
    29.  
    30. constructor TMyTable.Create;
    31. begin
    32.   inherited;
    33.   FConnection := TAdoConnection.create(nil);
    34.   //vul hier je connectionstring naar de database in
    35.   FConnection.ConnectionString := 'bla bla';
    36.   FTable := TAdoQuery.create(nil);
    37.   FTable.Connection := FConnection;
    38.   FTable.OnCalcFields := OnMyCalcField;
    39. end;
    40.  
    41. destructor TMyTable.Destroy;
    42. begin
    43.   if FTable.Active then FTable.ActiveClassGroup := false;
    44.   Ftable.Free;
    45.   FConnection.Close;
    46.   FConnection.Free;
    47.   inherited;
    48. end;
    49.  
    50. procedure TMyTable.open;
    51. begin
    52.   FTable.Active := true;
    53. end;
    54.  
    55. procedure TMyTable.SetQuery(const Value: string);
    56. begin
    57.   Fquery := Value;
    58.   FTable.SQL.Text := FQuery;
    59. end;
    60.  
    61. procedure TMyTable.FOnCalcFields(DataSet: TDataSet);
    62. begin
    63.   if Assigned(FNewRecord) then
    64.    FNewRecord(Dataset);
    65. end;
    66.  
    67. procedure TMyTable.CalulatedField(value: string; Ftype: TDataType);
    68. var
    69.   Field: TField;
    70.   i: Integer;
    71. begin
    72.   if Ftype = ftInteger then Field:=TIntegerField.Create(FTable) else
    73.   if Ftype = ftFloat then Field:=TFloatField.Create(FTable) else
    74.   Field:=TStringField.Create(FTable);
    75.   with Field do
    76.   begin
    77.     FieldName:= value;
    78.     Calculated:=True;
    79.     DataSet:=FTable;
    80.   end;
    81. end;
    82.  
    83. procedure TMyTable.close;
    84. begin
    85.   FTable.Active := false;
    86. end;
    87.  
    88. end.
    Is maar een voorbeeld hoe je het in code kan doen.
    Je kan ook de code los in het component neerzetten, maar dan kom al snel in d global section te zitten van je project.
    Delphi is great. Lazarus is more powerfull

  6. #6
    bedankt, ik ga dit voorbeeldje al eens bestuderen

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •