Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Mehrere Datensätze über mehrere Tabellen (https://www.delphipraxis.net/213685-mehrere-datensaetze-ueber-mehrere-tabellen.html)

NoName1 8. Sep 2023 13:56

Datenbank: egal • Version: egal • Zugriff über: egal

Mehrere Datensätze über mehrere Tabellen
 
Guten Tag Delphianer,
ich habe bisher aus mehreren Tabellen immer nur für einen Adresse die Datensätze benötigt.
Dazu folgender Code:
Delphi-Quellcode:
select a.name1 || ', ' || a.name2 As Suchender,
a.adressid,
l.Datum, l.Adressid, l.BRSTATUS, l.lastatus,
CAST(b.Itembegin as Date), b.arbeitstext

from adressen a
left join lateilnehmer l
on (a.Adressid = l.adressid)

left join logentage b
on (l.datum = Cast(b.itembegin as Date))
 
where a.Adressid in (:pListe) //Vorher stand hier: where a.Adressid = :pAdressID
and a.brstatus = 101 
and a.adraktiv = 'J'
and b.artderarbeit <> 'BR'
order by a.Name1, l.datum desc
Das Problem ist, dass a.adressid vom Typ Integer ist und deshalb die Fehlermeldung
conversion error from string "(1035,907,1033)"'
ausgegeben wird.

Welche Möglichkeiten gibt es trotzdem zum Ziele zu kommen?

Vielen Dank für alle Hilfen im Voraus.

joachimd 8. Sep 2023 14:04

AW: Mehrere Datensätze über mehrere Tabellen
 
in der Regel können Listen nicht als Parameter eingegeben werden. Du müsstest also ein Konstrukt bauen, welches entweder mehrere Parameter verwendet oder über eine temporäre Hilfstabelle gehen.

himitsu 8. Sep 2023 14:12

AW: Mehrere Datensätze über mehrere Tabellen
 
es kommt drauf an
* kann das DBMS Array-Typen (meistens ja)
* kann die verwendete Datenbank-Komponente auch mit Array-Typen umgehen?
* und hat der benutzte TParam-Typ eine Übergabefunktion für z.B. TStrings oder Arrays?

* sowie TFiled/TParam.Value bzw. der Type Variant können mit z.B. nicht mit TStringList/Tsrrings, außer man benutzt eine DelphiKlasse, welche z.B. IDispatch implementiert.

Nja, ich hab ich meistens einfach ein Makro benutzt.
Delphi-Quellcode:
where a.Adressid in (&pListe)

Bei Integern sehr einfach, ansonsten muß man noch mit dem Escaping aufpassen.

Oder als kommaseparierter AsString und dann im SQL z.B. eine StringToArray- oder StringToRecord-Funktion verwenden


PS: [CODE=SQL] ... [CODE]

Sinspin 8. Sep 2023 15:44

AW: Mehrere Datensätze über mehrere Tabellen
 
Zitat:

Zitat von NoName1 (Beitrag 1526654)
Das Problem ist, dass a.adressid vom Typ Integer ist und deshalb die Fehlermeldung
conversion error from string "(1035,907,1033)"'
ausgegeben wird.

Da ist dein String doch schon fertig. Ist zwar nicht optimal, aber bau an der Stelle das Script doch selber zusammen.
Delphi-Quellcode:
....SQL.Text := 'select a.name1 || '', '' || a.name2 As Suchender,
a.adressid,
l.Datum, l.Adressid, l.BRSTATUS, l.lastatus,
CAST(b.Itembegin as Date), b.arbeitstext

from adressen a
left join lateilnehmer l
on (a.Adressid = l.adressid)

left join logentage b
on (l.datum = Cast(b.itembegin as Date))
 
where a.Adressid in '+MyIdListString+ // <--
'and a.brstatus = 101
and a.adraktiv = ''J''
and b.artderarbeit <> ''BR''
order by a.Name1, l.datum desc'

NoName1 8. Sep 2023 16:54

AW: Mehrere Datensätze über mehrere Tabellen
 
Zitat:

Zitat von Sinspin (Beitrag 1526659)
Zitat:

Zitat von NoName1 (Beitrag 1526654)
Das Problem ist, dass a.adressid vom Typ Integer ist und deshalb die Fehlermeldung
conversion error from string "(1035,907,1033)"'
ausgegeben wird.

Da ist dein String doch schon fertig. Ist zwar nicht optimal, aber bau an der Stelle das Script doch selber zusammen.
Delphi-Quellcode:
...
where a.Adressid in '+MyIdListString+ // <--
'and a.brstatus = 101
and a.adraktiv = ''J''
and b.artderarbeit <> ''BR''
order by a.Name1, l.datum desc'

Momentan habe ich keine Vorstellung wie man das Script erzeugen soll?
Delphi-Quellcode:
Etwa so mit einer TStringlist und einer While-Schleife:
while i = 0 to Tstringlist.Count - 1 do
begin
 Where a.Adressid in (TStringList[i] + ',) ??????
end;
Das Problem bleibt doch, dass a.AdressID ein Integer-Wert ist.

Ach so: Die Datenbank ist Interbase

himitsu 8. Sep 2023 16:57

AW: Mehrere Datensätze über mehrere Tabellen
 
Delphi-Referenz durchsuchenTStrings.CommaText

NoName1 8. Sep 2023 17:19

AW: Mehrere Datensätze über mehrere Tabellen
 
Vielendank vorersteinmal.
Ich habe diese Seite https://stackoverflow.com/questions/...with-in-clause
und werde mich einmal damit auseinandersetzen.

Ein schönes Wochende allen.

Sinspin 8. Sep 2023 18:24

AW: Mehrere Datensätze über mehrere Tabellen
 
Delphi-Quellcode:
s := '';
for i = 0 to Stringlist.Count - 1 do
begin
  if s <> '' then
    s := s + ',';
  s := s + StringList[i];
  s := '('+s+')';
end;
query.SQL.Text := 'SELECT irgendwas FROM irgendwo WHERE a.Adressid in '+s;
Wenn du eine andere Tabelle hast von der die Werte kommen brauchst du natürlich keine StringList dazwischen:
Delphi-Quellcode:
s := '';
query.First;
while not query.Eof do
begin
  if s <> '' then
    s := s + ',';
  s := s + query.FieldByName('einFeldName').AsString; // auch integer können einfach als string gelesen werden.
  s := '('+s+')';
  query.Next;
end;
query.SQL.Text := 'SELECT irgendwas FROM irgendwo WHERE a.Adressid in '+s;

himitsu 8. Sep 2023 20:07

AW: Mehrere Datensätze über mehrere Tabellen
 
Zitat:

Zitat von himitsu (Beitrag 1526662)

oder Delphi-Referenz durchsuchenTStrings.Delimiter:=',' und Delphi-Referenz durchsuchenTStrings.DelimitedText
oder string.Join (Delphi-Referenz durchsuchenTStringHelper.Join)
oder


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz