Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Mehrere Namen über einen Parameter an SQL Abfrage übergeben (https://www.delphipraxis.net/193367-mehrere-namen-ueber-einen-parameter-sql-abfrage-uebergeben.html)

zobien123 21. Jul 2017 15:06


Mehrere Namen über einen Parameter an SQL Abfrage übergeben
 
Hi :),

ich steh grad irgendwie auf dem Schlauch.:pale:

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? :oops:

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;

dataspider 21. Jul 2017 15:24

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
 
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

zobien123 21. Jul 2017 15:31

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
 
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? :oops:

jobo 21. Jul 2017 15:56

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
 
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.

p80286 21. Jul 2017 17:01

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
 
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

Zitat:

Zitat von jobo (Beitrag 1377193)
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. :stupid:

Aber sonst, gute Lösung.

IBExpert 22. Jul 2017 23:47

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

Zitat von zobien123 (Beitrag 1377192)
Hat vllt jemand einen ganz anderen Ansatz? :oops:

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 ....

himitsu 23. Jul 2017 00:12

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
 
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
SQL-Code:
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.

SQL-Code:
user_name in ('name1', 'name2')
nutze ich auch manchmal, allerdings da dann über ein Makro
SQL-Code:
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.

zobien123 25. Jul 2017 08:26

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
 
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?:pale:


[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]

zobien123 25. Jul 2017 09:25

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
 
Nach einer Stunde googeln und probieren habe ich es herausgefunden. :-D

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)

mkinzler 25. Jul 2017 11:02

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

Zitat:
(personalnummern gibt es nicht?)
Gerade mal geschaut, ja gibt es.
Dann würde ich bevorzugt nach denen Filtern da eindeutiger

haentschman 25. Jul 2017 11:22

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

FIND_IN_SET
...du weißt schon das es die Funktion nur bei MySQL gibt. Wenn du auf ein anderes System umbaust bist du wieder am ändern. :? Imho besser:
Delphi-Quellcode:
user_name in ('name1', 'name2', 'name3')
oder
Delphi-Quellcode:
user_ID in (12, 15, 99)

DeddyH 25. Jul 2017 12:07

AW: Mehrere Namen über einen Parameter an SQL Abfrage übergeben
 
Damit wären wir wieder bei der ersten Antwort angelangt :lol:

zobien123 25. Jul 2017 12:13

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

...du weißt schon das es die Funktion nur bei MySQL gibt. Wenn du auf ein anderes System umbaust bist du wieder am ändern.
Jup, weiß ich :-D soll ja auch nur unter MySQL laufen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:55 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