AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TADOQuery und LIKE

Ein Thema von DangerDistel · begonnen am 17. Mai 2013 · letzter Beitrag vom 18. Mai 2013
Antwort Antwort
Seite 1 von 2  1 2      
DangerDistel

Registriert seit: 3. Aug 2012
16 Beiträge
 
Delphi 2010 Professional
 
#1

TADOQuery und LIKE

  Alt 17. Mai 2013, 20:41
hallo,
bin neu in dem Forum.

Ich hoffe man wird nicht zusammengestaucht, falls diese Frage doch schon mal vorkam...

Also um was es sich handelt ist, ich möchte in meiner Verwaltung nach Namen suchen.
Die Daten sind vorhanden, nun möchte ich über den SQL operator LIKE ähnliche Einträge finden.

Ich benutze eine MS Access DB -> SYNTAX: SELECT * FROM STAEDTE WHERE STADT_NAME LIKE "Regens*"

Die Syntax erzeuge ich aus meinem Programm.

Access zeigt mir die gewünschten Ergebnisse, aber meine ADOQuerry bringt nach dem Übergeben des SQL-Strings einen RecordCount von 0

kann mir jemand bitte helfen?
Alex
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: TADOQuery und LIKE

  Alt 17. Mai 2013, 20:48
Hallo,

stell' uns bitte mal den Quelltext zur Verfügung, mit dem Du die Query bestückst. Es könnte sein, dass das SQL dort nicht in der von Dir erwarteten Form ankommt. Ohne Quelltext ist das aber schwer zu beurteilen.
  Mit Zitat antworten Zitat
DangerDistel

Registriert seit: 3. Aug 2012
16 Beiträge
 
Delphi 2010 Professional
 
#3

AW: TADOQuery und LIKE

  Alt 17. Mai 2013, 20:53
oh verdammt, ich hab auf Report geklickt ^^ ich denk das kam jetzt falsch an oder?
Alex
  Mit Zitat antworten Zitat
DangerDistel

Registriert seit: 3. Aug 2012
16 Beiträge
 
Delphi 2010 Professional
 
#4

AW: TADOQuery und LIKE

  Alt 17. Mai 2013, 20:57
Delphi-Quellcode:
procedure TDataMod.SQL_LIKE_TBLSearch(AConnection:TADOConnection; ATblName:WideString;
                                 arr_TBLCols:array of string;
                                 arr_TBLValues:array of string;
                                 APK:string;
                                 var AResultList:TStringList);
var AQuery:TADOQuery;
    ASQLTemp:string;
    ix:integer;
    ASQL_Default:string;
begin
{SELECT STAEDTE.ID_STADT, STAEDTE.STADT_NAME
FROM STAEDTE
WHERE (([STAEDTE]![STADT_NAME] Like "*Mark"));}

  if AConnection <> nil then
  begin
    if Trim(ATblName) <> EmptyWideStr then
    begin
      if Length(arr_TBLCols) > 0 then
      begin
        if Length(arr_TBLValues) > 0 then
        begin
          if Length(arr_TBLCols) = Length(arr_TBLValues) then
          begin
            if TblExists(AConnection,ATblName) then
            begin
              AQuery:=TADOQuery.Create(Self);
              try
                ASQLTemp:='SELECT * FROM' + fConstants.BLANK1 +
                             ATblName +
                             fConstants.BLANK1 +
                             'WHERE' +
                             fConstants.BLANK1;
                ASQL_Default:=ASQLTemp;
                for ix:=Low(arr_TBLCols) to High(arr_TBLCols) do
                begin
                  if (Trim(arr_TBLCols[ix]) <> EmptyStr) and
                     (Trim(arr_TBLValues[ix]) <> EmptyStr) then
                  begin
                    if Length(arr_TBLCols) = 1 then
                    begin
                      ASQLTemp:=ASQLTemp + '[' + ATblName +']![' + arr_TBLCols[ix] + ']' + fConstants.BLANK1 +
                                'LIKE' + fConstants.BLANK1 + fConstants.AnfZeichen + arr_TBLValues[ix] + '*' + fConstants.AnfZeichen;
                    end else
                    begin
                      if ix < High(arr_TBLCols) then
                      begin
                        ASQLTemp:=ASQLTemp + '[' + ATblName +']![' + arr_TBLCols[ix] + ']' + fConstants.BLANK1 +
                                  'LIKE' + fConstants.BLANK1 + fConstants.AnfZeichen + arr_TBLValues[ix] + fConstants.AnfZeichen + fConstants.BLANK1 + 'AND' + fConstants.BLANK1;
                      end else
                      begin
                        if ix = High(arr_TBLCols) then
                        ASQLTemp:=ASQLTemp + '[' + ATblName +']![' + arr_TBLCols[ix] + ']' + fConstants.BLANK1 +
                                  'LIKE' + fConstants.BLANK1 + fConstants.AnfZeichen + arr_TBLValues[ix] + fConstants.AnfZeichen;
                      end;
                    end;
                  end;
                end;
                if ASQLTemp <> ASQL_Default then
                begin
                  AQuery.Connection:=AConnection;
                  AQuery.SQL.Add(ASQLTemp);
                  AQuery.Open;
                  AQuery.First;
                  while not(AQuery.Eof) do
                  begin
                    AResultList.Add(AQuery.FieldByName(fConstants.TBL_TOWN_ID).AsString);
                    AQuery.Next;
                  end;
                  AQuery.Close;
                end;
              finally
                AQuery.Free;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
end;
so also die [-Klammern habe hinzugefügt, da Acces mir diese anbietet, die ADOQuery bingt auch keinen Fehler, der RecordCount is immernoch 0 :/
Alex

Geändert von MrSpock (17. Mai 2013 um 21:32 Uhr) Grund: Delphi Tags eingefügt.
  Mit Zitat antworten Zitat
DangerDistel

Registriert seit: 3. Aug 2012
16 Beiträge
 
Delphi 2010 Professional
 
#5

AW: TADOQuery und LIKE

  Alt 17. Mai 2013, 21:00
sorry für die nicht vorhandene Formatierung , wie kann ich das einstellen? ^^

ich hoffe ihr könnt zumindest etwas entnehmen ^^

danke im voraus
Alex
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TADOQuery und LIKE

  Alt 17. Mai 2013, 21:06
Die Daten sind vorhanden, nun möchte ich über den SQL operator LIKE ähnliche Einträge finden.

Ich benutze eine MS Access DB -> SYNTAX: SELECT * FROM STAEDTE WHERE STADT_NAME LIKE "Regens*"

Die Syntax erzeuge ich aus meinem Programm.

Access zeigt mir die gewünschten Ergebnisse, aber meine ADOQuerry bringt nach dem Übergeben des SQL-Strings einen RecordCount von 0
Ist ganz klar: Access hat hier eine bescheuerte Logik implementiert.
Über Access werden die bekannten Wildcards verwendet wie man sie von Suche nach Dateien oder bei einer Websuche kennt: * und ?
Jedoch ist im SQL-Standard definiert das die Wildcards % und _ sind. Greift man nun über ADO auf Access zu, so verhält sich Access hier standardkonformer als wenn man es direkt verwendet.

Lösung: Verwende % und _ als Wildcard. Willst du dem Anwender nicht verwirre, sorge dafür das die eingegeben Wildcards * und ? automatisch nach % und _ gewandelt werden.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#7

AW: TADOQuery und LIKE

  Alt 17. Mai 2013, 21:09
Like mit * kennt Access nur in der eigenen Oberfläche, die im übrigen einiges anders macht als man es beim Zugriff z.B. über ADO machen muss. Wenn Du von außen zugreifst kannst/musst Du die übliche SQL - Syntax mit LIKE verwenden mit % als Asterix
Code:
WHERE XYZ LIKE 'Text%'

oder je nach Anforderung

WHERE XYZ LIKE '%Text%'
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: TADOQuery und LIKE

  Alt 17. Mai 2013, 21:09
1. Problem:
SQL-Strings werden in einfach Hochkommas gesetzt (gleich wie die Strings in Delphi)
Doppelte Anführungszeichen verwendet man dann, wenn man Feld- oder Tabellennamen escapen muss:
SQL-Code:
-- ohne doppelte Anführungszeichen würde der Parser ein Minuszeichen erkennen
SELECT "Renten-Betrag" FROM "Brutto-Gehalt"
2. Problem (und Ursache für fehlende Datensätze):
die Wildcards für like sind
'%' ==> findet 0 oder mehr beliebige Zeichen (entspricht dem * unter DOS/Windows/Linux)
'_' ==> findet 1 beliebiges Zeichen

Delphi-Quellcode:
suchmuster := 'Regens%';
ASQLTemp := 'SELECT * FROM STAEDTE WHERE STADT_NAME LIKE ' + QuotedStr(suchmuster);
fork me on Github
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: TADOQuery und LIKE

  Alt 17. Mai 2013, 21:17
Hallo,

okay, haben schon eineinhalb dutzend Leute geantwortet.

in der "normalen" SQL-Syntax ist der Platzhalter für beliebig viele Zeichen das % und nicht der *.

Wenn es dann noch nicht klappt, gib dir vor dem AQuery.Open; mal AQuery.SQL.Text (von mir aus auch mit ShowMessage kannst Du dann per Strg+C kopieren und hier einfügen) aus und prüfe, ob dadrin das ist, was Du erwartest. Dieser String muss in Access eine Ergebnismenge liefern, sonst ist er inhaltlich falsch, nicht zwingend auch syntaktisch.
  Mit Zitat antworten Zitat
DangerDistel

Registriert seit: 3. Aug 2012
16 Beiträge
 
Delphi 2010 Professional
 
#10

AW: TADOQuery und LIKE

  Alt 17. Mai 2013, 21:24
habt vielen Dank ich werde dahingehend die Abfrage ändern, falls es noch Probleme geben sollte, melde ich mich noch einmal,
noch eine andere Frage. Gibt es hier im Forum die Delphi - Formatierung? also mit Tab oder Leerzeichen?
Weil wenn alles untereinander steht sieht das dumm aus. ^^
Alex
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz