AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Mehrere Datensätze über mehrere Tabellen
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrere Datensätze über mehrere Tabellen

Ein Thema von NoName1 · begonnen am 8. Sep 2023 · letzter Beitrag vom 8. Sep 2023
Antwort Antwort
NoName1

Registriert seit: 8. Mär 2018
194 Beiträge
 
Delphi 11 Alexandria
 
#1

Mehrere Datensätze über mehrere Tabellen

  Alt 8. Sep 2023, 13:56
Datenbank: egal • Version: egal • Zugriff über: egal
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.
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
672 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Mehrere Datensätze über mehrere Tabellen

  Alt 8. Sep 2023, 14:04
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.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#3

AW: Mehrere Datensätze über mehrere Tabellen

  Alt 8. Sep 2023, 14:12
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.
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]
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Sep 2023 um 14:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
618 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Mehrere Datensätze über mehrere Tabellen

  Alt 8. Sep 2023, 15:44
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
'
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
NoName1

Registriert seit: 8. Mär 2018
194 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Mehrere Datensätze über mehrere Tabellen

  Alt 8. Sep 2023, 16:54
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#6

AW: Mehrere Datensätze über mehrere Tabellen

  Alt 8. Sep 2023, 16:57
Delphi-Referenz durchsuchenTStrings.CommaText
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
NoName1

Registriert seit: 8. Mär 2018
194 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Mehrere Datensätze über mehrere Tabellen

  Alt 8. Sep 2023, 17:19
Vielendank vorersteinmal.
Ich habe diese Seite https://stackoverflow.com/questions/...with-in-clause
und werde mich einmal damit auseinandersetzen.

Ein schönes Wochende allen.
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
618 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Mehrere Datensätze über mehrere Tabellen

  Alt 8. Sep 2023, 18:24
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;
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#9

AW: Mehrere Datensätze über mehrere Tabellen

  Alt 8. Sep 2023, 20:07
oder Delphi-Referenz durchsuchenTStrings.Delimiter:=',' und Delphi-Referenz durchsuchenTStrings.DelimitedText
oder string.Join (Delphi-Referenz durchsuchenTStringHelper.Join)
oder
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:44 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