AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Mehrere Namen über einen Parameter an SQL Abfrage übergeben

Mehrere Namen über einen Parameter an SQL Abfrage übergeben

Ein Thema von zobien123 · begonnen am 21. Jul 2017 · letzter Beitrag vom 25. Jul 2017
Antwort Antwort
Seite 1 von 2  1 2   
zobien123

Registriert seit: 3. Mär 2017
Ort: Öhringen
94 Beiträge
 
Delphi 10.3 Rio
 
#1

Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 21. Jul 2017, 16:06
Hi ,

ich steh grad irgendwie auf dem Schlauch.

Ich habe eine CheckListBox wo Mitarbeiternamen drin stehen. Wenn ich dort welche Auswähle soll deren Namen in eine SQL Abfrage übergeben werden. Ich habe eine Schleife gebaut, mit der dann geschaut wird, welche selected sind und deren Namen wird dann dem Parameter zugewiesen der dann in der SQL später gesetzt wird. Nun hab ich das Problem, dass immer der letzte Mitarbeiter wo selected ist nur übergeben wird (ist mir auch klar warum, bei jedem Schleifendurchlauf wird der vorherige überschrieben). Aber wie mach ich es denn, dass ich mehrere Mitarbeiternamen übergeben kann an den SQL Parameter?

Code:
 
  for i := 0 to CheckListBox1.Items.Count-1 do begin
    if CheckListBox1.Selected[i] then ADOQuery.Parameters.ParamByName('USR_NAME').Value := LOWERCASE(CheckListBox1.Items[i]);
  end;
Jörn
Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!

Geändert von zobien123 (21. Jul 2017 um 16:12 Uhr)
  Mit Zitat antworten Zitat
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.249 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 21. Jul 2017, 16:24
Das geht so nicht.
Das Statement müsste dann ja in etwa

"select * from Tabelle where user_name in ('name1', 'name2')"

lauten.
Den IN - String musst du in deiner Schleife zusammensetzen.

Die Abfrage musst du dynamisch zusammenbauen oder Makros verwenden (wenn die Komponente das kann).

Frank
Frank Reim
  Mit Zitat antworten Zitat
zobien123

Registriert seit: 3. Mär 2017
Ort: Öhringen
94 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 21. Jul 2017, 16:31
Hmm naja, dann kann ich gleich für jeden Mitarbeiter ein einzelnen Parameter anlegen und wenn halt nur 4/5 ausgewählt sind, dann bleibt der 5. halt leer...

Hat vllt jemand einen ganz anderen Ansatz?
Jörn
Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.963 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 21. Jul 2017, 16:56
Ich glaube, das ist so in der Form mit Parametern nicht machbar.
Ein Parameter nimmt nur einen Wert auf.
Die einfachste Lösung via "in clause" ist tatsächlich, die Werteliste zusammenzubasteln und fest im Statement zu übergeben.

Es gäbe noch abgefahrene Sachen mit (temporären, session spezifischen) Tabellen, die die Selektion aufnehmen und die Abfrage dann nicht per "in clause", sondern per join auf die Selektionstabelle machen.
Das birgt aber einige Risiken, weil Mehrfachzugriff sicher gelöst sein muss.
Ist aufwendig und macht vielleicht Sinn, wenn man große Mengen selektiert.
Dafür sollte es dann aber auch recht flott sein.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.658 Beiträge
 
Delphi 7 Personal
 
#5

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 21. Jul 2017, 18:01
Eine andere Möglichkeit wäre es immer nur einen Namen (personalnummern gibt es nicht?) zu übergeben, und dementsprechend auch nur einen Datensatz als Ergebnis zu bekommen. Wenn man mehr als 5,10,20 Namen abfragt, ist das allerdings durchaus eine Bremse.
Was spricht dagegen den "in clause" dynamisch zu erstellen?

Gruß
K-H

Es gäbe noch abgefahrene Sachen mit (temporären, session spezifischen) Tabellen, die die Selektion aufnehmen .....
Abgefahren ? Hatten wir im Einsatz, wurde jeden Morgen um 3 Uhr erstellt und war ...schnell. Einziges Manko, das war Stand von gestern, und es mußten immer die Daten enthalten sein, die in zwei Minuten eingegeben werden.

Aber sonst, gute Lösung.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (21. Jul 2017 um 18:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
524 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 23. Jul 2017, 00:47
Hat vllt jemand einen ganz anderen Ansatz?
folgendes geht zumindest bei Firebird gut

Inhalt parameter abc ",12,34,56,89,"

"select * from tabelle where :abc containing ','||tabelle.id||','"

die Konstruktion kann beliebig lang sein, wird aber garantiert nicht indiziert laufen, daher auf größeren Tabellen eine begrenzt sinnvolle Idee, aber wenn die daten aus einer Checklistbox kommen, werden da sicher nicht 10 mio Einträge drin sein.

Wenn das ggf eh über den Umweg einer SP läuft, würde ich in FB die daten vorher in eine global temporary table eintragen und die dann an die restlichen Tabellen dran joinen, konnte deinem posting aber nicht die gewünschte PLattform entnehmen, bei ADO vermute ich meistens was von MS ....
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
IBExpert and Firebird Power Workshops jederzeit auch als Firmenschulung
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.603 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 23. Jul 2017, 01:12
Datenbanken kennen Array-Parameter, aber fast alle Zugriffskomponenten nicht ... seltene Ausnahmen bestätigen die Regel.


Man kann den "Parameter" auch via Funktionen ala string_to_array wieder in arrays/records zerlegen und dann z.B. mit IN , nachdem man ihn vorher im Client zu einen String zusammengesetzt hat.
Die Variante den einen Array-Parameter über mehrere einzelne Parameter übergeben zu wollen ist aber die umständlichste Variante.

user_name in ('name1', 'name2') nutze ich auch manchmal, allerdings da dann über ein Makro user_name in (&NameList) und die "Strings" mit der Escape-Funktion der DB-Zugriffskomponente ordentlich maskiert und erst dann zur komma-separierten Liste zusammengefügt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (23. Jul 2017 um 01:19 Uhr)
  Mit Zitat antworten Zitat
zobien123

Registriert seit: 3. Mär 2017
Ort: Öhringen
94 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 25. Jul 2017, 09:26
Hi

sorry für die späte Antwort.

Also habe jetzt mal die Ausgewählten Mitarbeiter in seinen String gepackt und dem Parameter USR_NAME für die SQL zugewiesen. Dieser sieht jetzt ungefähr so aus:
Code:
 maier,mueller,schmidt,
So aber wie geht es jetzt in der SQL weiter. Ich muss die Namen ja vom ',' trennen. Habe mir jetzt mal string_to_array & SUBSTRING_INDEX angeschaut aber komme nicht so voran, dass es klappt. Hat jemand ein bsp oder so?


[EDIT]Das müsste ja dann ca. so aussehen:
Code:
 WHERE user_name IN TRENNE_STR_VON_KOMMA(:USR_NAME)


Zitat:
(personalnummern gibt es nicht?)
Gerade mal geschaut, ja gibt es.
[/EDIT]
Jörn
Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!

Geändert von zobien123 (25. Jul 2017 um 09:49 Uhr)
  Mit Zitat antworten Zitat
zobien123

Registriert seit: 3. Mär 2017
Ort: Öhringen
94 Beiträge
 
Delphi 10.3 Rio
 
#9

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 25. Jul 2017, 10:25
Nach einer Stunde googeln und probieren habe ich es herausgefunden.

FIND_IN_SET(table, commaSeparatedData) bringt das gewünschte Ergebnis.

In meinem Fall sieht das Ergebnis nun so aus:
Code:
... WHERE FIND_IN_SET(usr.usr_name, :USR_NAME)
Jörn
Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.798 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben

  Alt 25. Jul 2017, 12:02
Zitat:
Zitat:
(personalnummern gibt es nicht?)
Gerade mal geschaut, ja gibt es.
Dann würde ich bevorzugt nach denen Filtern da eindeutiger
Markus Kinzler
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 +2. Es ist jetzt 09:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf