Results 1 to 3 of 3

Thread: SQL Query met datum 'van-tot' lukt niet

  1. #1

    SQL Query met datum 'van-tot' lukt niet

    Goedendag,

    Hieronder een stukje code waarmee ik data uitlees uit een MicroSoft Access 2000 database. De data bestaat uit een datum en een meetwaarde. Deze data wordt uitgezet in een grafiek met de datum op de X-as en de data zelf op de y-as. Zoals ik het nu heb gemaakt werkt het goed. Alle data uit het bestand wordt in de grafiek weergegeven.

    Maar nu wil ik een deel van de data uit het bestand uitlezen en dat lukt me maar niet. Stel, het hele bestand bevat data van Januari tot en met December. Nu wil ik als voorbeeld alleen de data uitlezen van April tot en met September. Hiervoor heb ik het commando BETWEEN gebruikt in de query, maar wat ik ook probeer er wordt niets in de grafiek weergegeven.

    Ik heb het gevoel dat ik de SQL string niet goed heb opgezet, maar na enige avonden experimenteren en na veel zoeken op het internet krijg ik maar niet werkend.

    Kan iemand mij een duwtje in de goede richting geven ?

    P.S.:

    1. De SQLStr in regel1 in de code hieronder werkt en geeft de volledige data weer. De vraag is hoe ik de string kan modificeren zodat data van b.v. April tot en met September kan worden weergegeven.
    2. De code hieronder is een deel uit de procedure en is dus niet volledig.

    Delphi Code:
    1. SQLStr := 'SELECT * FROM TrendValues WHERE ParameterID =' + ParamID + ' AND Index1=' + Detector + ' AND Index2=' + Range + ' ORDER BY TrendedDateTime, Index2';
    2.  
    3.   Query := TADOQuery.Create(nil);  
    4.   try
    5.   Query.Connection := MainForm.ADOConnectionTrendDB;
    6.   Query.SQL.Add(SQLStr);  
    7.  
    8.   Query.Open;
    9.   I := 0;
    10.     while not Query.eof do
    11.       begin
    12.  
    13.       MainForm.DebugLogMemo.Lines.Add(DateTimeToStr(Query.FieldByName('TrendedDateTime').AsDateTime) + '   ' + Query.FieldByname('TrendValue').AsString);
    14.  
    15.         S := DateToStr(Query.FieldByName('TrendedDateTime').AsDateTime);
    16.           if Detector = Detector1 then
    17.             begin
    18.               MainForm.Series3.XLabel[I] := S;
    19.               MainForm.Series5.XLabel[I] := S;
    20.             end;
    21.  
    22.           if Detector = Detector2 then
    23.             begin
    24.              MainForm.Series4.XLabel[I] := S;
    25.              MainForm.Series6.XLabel[I] := S;
    26.             end;
    27.  
    28.         if ParamID = ZMAP then
    29.         begin
    30.            if Range = '1' then  // NR
    31.            begin
    32.              if Detector = Detector1 then
    33.               begin
    34.                 MainForm.Series3.AddY(Query.FieldByname('TrendValue').AsFloat);
    35.                 Det1NR := Query.FieldByname('TrendValue').AsFloat;
    36.                 if Det1NR < Det1NR_Max then Det1NR_Max := Det1NR;
    37.                 pDiversen.Det1NR_Max                   := Det1NR_Max;
    38.                 pDiversen.ZMapDet1NR[I]                := Det1NR;
    39.                 N1 := I;
    40.                // showmessage('N1 :' + inttostr(N1) + '    ' + 'N2: ' +inttostr(N2));
    41.               end;
    42.  
    43.              if Detector = Detector2 then
    44.               begin
    45.                MainForm.Series4.AddY(Query.FieldByname('TrendValue').AsFloat);
    46.                Det2NR := Query.FieldByname('TrendValue').AsFloat;
    47.                if Det2NR < Det2NR_Max then Det2NR_Max := Det2NR;
    48.                pDiversen.Det2NR_Max                   := Det2NR_Max;
    49.                pDiversen.ZMapDet2NR[I]                := Det2NR;
    50.                N2 := I;
    51.                //showmessage('N1 :' + inttostr(N1) + '    ' + 'N2: ' +inttostr(N2));
    52.               end;
    53.            end;
    54.  
    55.            if Range = '0' then  // ER
    56.            begin
    57.               if Detector = Detector1 then
    58.               begin
    59.                 MainForm.Series5.AddY(Query.FieldByname('TrendValue').AsFloat);
    60.                 Det1ER := Query.FieldByname('TrendValue').AsFloat;
    61.                 if Det1ER < Det1ER_Max then Det1ER_Max := Det1ER;
    62.                 pDiversen.Det1ER_Max                   := Det1ER_Max;
    63.                 pDiversen.ZMapDet1ER[I]                := Det1ER;
    64.               end;
    65.  
    66.               if Detector = Detector2 then
    67.               begin
    68.                 MainForm.Series6.AddY(Query.FieldByname('TrendValue').AsFloat);
    69.                 Det2ER := Query.FieldByname('TrendValue').AsFloat;
    70.                 if Det2ER < Det2ER_Max then Det2ER_Max := Det2ER;
    71.                 pDiversen.Det2ER_Max                   := Det2ER_Max;
    72.                 pDiversen.ZMapDet2ER[I]                := Det2ER;
    73.               end;
    74.             end;
    75.         end;
    76.  
    77.         INC(I);
    78.         Query.Next;
    79.       end;  // While
    80.  
    81.       except
    82.       on E : Exception do
    83.         begin
    84.           if Range = '1' then Range := 'Normal range';
    85.           if Range = '0' then Range := 'Extended range';
    86.           Uitzondering := 'Detector' + Detector + ' ' + Range +   ' Z-Map  ' + E.Message;
    87.           MainForm.mDebugLog.Lines.add(Uitzondering);
    88.         end;
    89.       end; // Except
    90.   Query.close;

  2. #2
    Een paar tips:

    1) Als ik het goed zie gebruik je geen parameters in je query. Dit is wel aan te raden. Zie hier een uitleg.

    2) Test je query eerst zonder Delphi, werkt het dan wel?

    3) Je kunt series voor je chart ook toevoegen door een dataset toe te voegen. (ten minste bij de standaard chart meegeleverd door Delphi Steema TeeChart) Kun je waarschijnlijk die hele while loop weglaten

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Het is handig om aan te geven hoe de tabel is opgebouwd.
    Delphi Code:
    1. Query := TADOQuery.Create(nil);  
    2.   try
    3.     Query.Connection := MainForm.ADOConnectionTrendDB;
    4.     with  Query.SQL do
    5.     begin
    6.        Range :=
    7.        Add('SELECT * FROM TrendValues WHERE ParameterID = :param1');
    8.        Add('AND Index1= :param2 AND Index2 between (:dtm1 AND :dtm2)');
    9.        Add('ORDER BY TrendedDateTime, Index2');
    10.     end;  
    11.     Query.parambyname('param1').AsInteger := ParamID;
    12.     Query.parambyname('param2').AsString   :=  Detector;
    13.     Query.parambyname('dtm1').AsString := '#2017-04-01#';
    14.     Query.parambyname('dtm2').AsString := '#2017-10-31#';
    15.     Query.active := true;
    16.   ......
    17.   doe je ding
    18.   .....
    19.   finally
    20.     Query.free;
    21.   end;
    Verder ben ik het met Luigi eens om de query te testen in een MicroSoft Access 2000 database browser.
    Omdat het een access database is, weet ik niet hoe deze reageert met datums.

    Tip: https://www.thoughtco.com/formatting...ss-sql-1057843
    Delphi is great. Lazarus is more powerfull

Thread Information

Users Browsing this Thread

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

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
  •