Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Prism Inhalt eines Dataset zur Laufzeit ändern (https://www.delphipraxis.net/88238-inhalt-eines-dataset-zur-laufzeit-aendern.html)

Raffigator 12. Mär 2007 13:15

Datenbank: Oracle • Version: 10g • Zugriff über: Bdp

Inhalt eines Dataset zur Laufzeit ändern
 
Moin Leute,

folgendes Problem:

Ich möchte in meinem Programm den Inhalt einer ComboBox abhängig machen vom Inhalt einer TextBox. Also beim Verlassen der TextBox wird der Inhalt der TextBox genommen und damit nach Einträgen in der Datenbank gesucht.

Konkret: Zu einer Bankleitzahl gibt es die jeweilige Bank in verschiedenen Orten. Die möglichen Orte möchte ich dann über eine ComboBox auswählen können. Das klappt soweit auch schon für die erste BLZ die ich in die Textbox tippe. Wenn ich dann aber eine andere eingebe, bleibt die ComboBox hinterher leer.

Hier mein
Delphi-Quellcode:

procedure LSFormFINANZAMT.TBBLZ_Leave(sender: System.Object; e: System.EventArgs);
var
  BLZ : string;
begin

  BLZ := (Sender as Textbox).Text;

  BdpDataAdapBANKNAME.Active := FALSE;
  if BLZ <> '' then begin
    with BdpDataAdapBANKNAME.SelectCommand do begin
      if Connection.State = System.Data.ConnectionState.Closed then
        Connection.Open;
      CommandText := 'SELECT ORT FROM LUG.S_BLZ WHERE BLZ = ' + BLZ + ' ORDER BY ORT';
      ExecuteNonQuery;
      Connection.Close;
    end;
  end;
  BdpDataAdapBANKNAME.Active := TRUE;


end;
Welchen Fehler mache ich?

Gruß,
Raphael

bttb930 12. Mär 2007 13:17

Re: Inhalt eines Dataset zur Laufzeit ändern
 
evtl. ist das connection.close schuld.

Raffigator 12. Mär 2007 13:26

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Nein, das ist es leider nicht...

uwewo 12. Mär 2007 14:04

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Klammere mal das
Delphi-Quellcode:
Connection.Close;
aus, mir scheint es auch so als wäre das der Fehler.

Keine Verbindung, keine Daten.

Raffigator 12. Mär 2007 14:07

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Ich habe das ja inzwischen ausgeklammert, aber das scheint es nicht so sein.
Und wenn ich es drinne lasse, klappt das ja auch mit der ersten BLZ, aber wenn ich die dann ändere, also eine zweite eingebe, dann gehts eben nicht mehr...

uwewo 12. Mär 2007 14:22

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Ändere mal diese Zeile
Delphi-Quellcode:
CommandText := 'SELECT ORT FROM LUG.S_BLZ WHERE BLZ = ' + QuotedStr(BLZ) + ' ORDER BY ORT';

JohannesK 12. Mär 2007 14:24

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Warum arbeitest Du nicht mit einer Master-Detailbeziehung und lässt beide Tabellen offen statt bei jeder Anpassung der BLZ die Tabelle zu öffnen und zu schliessen?

SQL-Code:
SELECT BLZ FROM BLZ_Tab ORDER BY BLZ
SELECT ORT FROM ORT_Tab
Über die Master-Detailbeziehung werden dann alle die Orte angezeigt deren BLZ dem Wert der BLZ-Tabelle entspricht.

uwewo 12. Mär 2007 14:27

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Oder Du könntest auch nur einen Filter für die Tabelle setzen.

Raffigator 12. Mär 2007 14:37

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Zitat:

Zitat von uwewo
Ändere mal diese Zeile
Delphi-Quellcode:
CommandText := 'SELECT ORT FROM LUG.S_BLZ WHERE BLZ = ' + QuotedStr(BLZ) + ' ORDER BY ORT';


Das liefert die selben Ergebnisse...



Zitat:

Zitat von JohannesK
Warum arbeitest Du nicht mit einer Master-Detailbeziehung und lässt beide Tabellen offen statt bei jeder Anpassung der BLZ die Tabelle zu öffnen und zu schliessen?

SQL-Code:
SELECT BLZ FROM BLZ_Tab ORDER BY BLZ
SELECT ORT FROM ORT_Tab
Über die Master-Detailbeziehung werden dann alle die Orte angezeigt deren BLZ dem Wert der BLZ-Tabelle entspricht.

Hier sind aber Ort und BLZ in einer Tabelle abgelegt (leider nicht normalisiert)...oder verstehe ich da jetzt was falsch?
Die BLZ Tabelle bleibt ja unverändert. Der Nutzer tippt ja eine BLZ in die TextBox ein und erst dann durchsuche ich die BLZ-Tabelle, in welchen Orten diese Bank vorhanden ist.

JohannesK 12. Mär 2007 14:44

Re: Inhalt eines Dataset zur Laufzeit ändern
 
In diesem Fall etwas konkreter:

Dass beide Informationen in einer Tabelle stehen spielt m.E. keine Rolle, Du öffnest ja zwei verschiedene Abfragen und damit zwei verschiedene Datasets, etwa so:

SQL-Code:
SELECT DISTINCT BLZ FROM Tabelle ORDER BY BLZ
SELECT DISTINCT ORT FROM Tabelle
Dass die Daten physisch in der gleichen Tabelle stehen spielt keine Rolle.

Bei der Auswahl der BLZ kannst Du auch eine DBCombobox einsetzen, damit kann der Benutzer auswählen statt eingeben.

shmia 12. Mär 2007 14:47

Re: Inhalt eines Dataset zur Laufzeit ändern
 
1.) Connection.Close muss raus. Die Connection muss bis zum Programmende offen bleiben.
2.) ExecuteNonQuery ist natürlich falsch. Alle SQl-Abfragen mit SELECT geben eine Datenmenge zurück. Also nur Open verwenden.

Raffigator 12. Mär 2007 14:51

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Zitat:

Zitat von JohannesK
In diesem Fall etwas konkreter:

Dass beide Informationen in einer Tabelle stehen spielt m.E. keine Rolle, Du öffnest ja zwei verschiedene Abfragen und damit zwei verschiedene Datasets, etwa so:

SQL-Code:
SELECT DISTINCT BLZ FROM Tabelle ORDER BY BLZ
SELECT DISTINCT ORT FROM Tabelle
Bei der Auswahl der BLZ kannst Du auch eine DBCombobox einsetzen, damit kann der Benutzer auswählen statt eingeben.

Ich werde das mal versuchen. Ich muss dann also 2 verschiedene Datensets benutzen, oder?

JohannesK 12. Mär 2007 14:58

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Ja, der Dataset mit den BLZ (bzw. die davon gespeiste Datasource) fungiert als Master für den Dataset mit den Orten.
Die Felder musst Du entsprechend in der verwendeten Komponente einstellen.

Raffigator 12. Mär 2007 15:31

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Hmm, leider finde ich keine Einstellungsmöglichkeiten in meinen ComboBoxen oder Datasets, um etwas als Master zu deklarieren...gibts irgendwo ein gutes Tutorial dafür?

JohannesK 12. Mär 2007 15:42

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Wo die Daten in den von Dir verwendeten Kompos zu finden sind weiss ich nicht,
bei ADO, BDE oder Mydac findet sich im entsprechenden TDataset oder TQuery in der IDE die Felder Mastersource und Masterfield resp. Detailfield
Schau dort mal nach.

rwachtel 12. Mär 2007 15:51

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Ihr habt aber schon alle mitbekommen, dass es hier um .NET geht, oder? :mrgreen:

JohannesK 12. Mär 2007 15:58

Re: Inhalt eines Dataset zur Laufzeit ändern
 
:oops: schäm

Raffigator 12. Mär 2007 16:01

Re: Inhalt eines Dataset zur Laufzeit ändern
 
Bei den Borland Data Providers habe ich da nichts vergleichbares entdecken können...
Werde da vielleicht mal einen neuen Thread zu dem Thema starten.

Ah, aber es muss doch unter .NET auch die Möglichkeit existieren eine Master Detail - Beziehung mit ComboBoxen herzustellen, oder?

MfG
Raphael


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