AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke SqlDataSource - Selects definieren
Thema durchsuchen
Ansicht
Themen-Optionen

SqlDataSource - Selects definieren

Ein Thema von stahli · begonnen am 1. Mai 2009 · letzter Beitrag vom 10. Mai 2009
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#1

SqlDataSource - Selects definieren

  Alt 1. Mai 2009, 16:11
Hallo,

ich habe eine kleine Tabelle

Zitat:
PLZ, Ort, Straße, HausNr
06100 Halle Markt 1
06130 Halle Halleschestr 31
06130 Saalkreis Saalkreisstr 25
04100 Leipzig Leipzigerstr 88
In der where-Klausel meiner SqlDataSource verwende ich den Inhalt einer Textbox.
Delphi-Quellcode:
            <SelectParameters>
                <asp:ControlParameter ControlID="TextBoxPlz" Name="PLZ" PropertyName="Text"
                    Type="String" />
            </SelectParameters>
Ein GridView zeigt das Ergebnis (PLZ + Ort) an. Bei "06130":
Zitat:
PLZ, Ort
06130 Halle
06130 Saalkreis
Nun wird hier eine PLZ für 2 Orte verwendet.

Der Nutzer soll nun einen Datensatz auswählen und dann soll eine Tabelle mit allen zugehörigen Straßennamen angezeigt werden.

Wie kann ich mich hier auf BEIDE Spalten des ersten GridViews beziehen?
Mir gelingt es nur, den Inhalt eines Feldes zu übergeben, z.B. die PLZ.
Delphi-Quellcode:
        <asp:SqlDataSource ID="SqlDataSourceStreet" runat="server"
            ConnectionString="<%$ ConnectionStrings:E:\Programme\WebSiteEt\EtConnectionString %>"
            ProviderName="<%$ ConnectionStrings:E:\Programme\WebSiteEt\EtConnectionString.ProviderName %>"
            
            SelectCommand="SELECT DISTINCT &quot;PLZ&quot;, &quot;CITY&quot;, &quot;STREET&quot; FROM &quot;OBJECTS&quot; WHERE (&quot;PLZ&quot; = ?)"
            onselecting="SqlDataSourceStreet_Selecting">
            <SelectParameters>
                <asp:ControlParameter ControlID="GridViewPlz" Name="PLZ"
                    PropertyName="SelectedValue" Type="String" />
            </SelectParameters>
        </asp:SqlDataSource>
Im SelectedValue kann ich ja nur einen Parameter übergeben...
Ich muss jedoch PLZ + Ort als Parameter übergeben, damit das eindeutig ist...

Muss ich dazu in den Pascal-Teil? Und wie übergebe ich dort beide Parameter an die zweite SqlDataSource?

Google hilft mir nicht - von Euch jemand?


Stahli
PS: Die Datenbank will ich gern in dieser Form bestehen lassen und nicht normalisieren.
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#2

Re: SqlDataSource - Selects definieren

  Alt 1. Mai 2009, 16:54
Hi stahli,

zuerst einmal warum "DISTINCT" der Befehl gibt nur Daten zurück die nicht doppelt sind.
Brauchst Du das?

Zum anderen gibt es ausser "WHERE" auch noch das "AND" z.B

SQL-Code:
SELECT * from Tabelle
WHERE PlZ = plz
AND = auch noch was anderes
Uwe
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: SqlDataSource - Selects definieren

  Alt 1. Mai 2009, 17:05
Hi Uwe,

mein Problem ist weniger die Select-Klausel, als vielmehr die "automatische Verwendung" der GridView-Felder-Inhalte der WebSite als Parameterübergabe.

Der Nutzer soll die
- PLZ
- dazu eine zugehörige Stadt
- dazu eine zugehörige Straße
- dazu eine zugehörige HausNr
auswählen.

In der Tabelle kann es für mehrere Städte die gleiche Straße und natürlich sehr häufig die gleiche HausNr geben.
Wurde eine PLZ + Stadt ausgewählt würde ohne DISTINCT in der nächsten Abfrage die PekingerStr so oft angezeigt, wie es HausNr gibt - das will ich an der Stelle natürlich nicht.


Inzwischen denke ich, dass ich die Parameter in der Changed-Behandlung des GridView im Pascal-Teil von Hand zuweisen muss und werde das in dieser Richtung einmal versuchen.

Wenn es um die Verwendung EINES Parameters geht, kann man im Prism sehr einfach ein Control zuweisen (z.B. ein Textfeld) und dessen Inhalt wird automatisch z.B. für eine Where-Klausel als Parameter verwendet (hierfür muss man keine Zeile Code schreiben!). Ich möchte aber 2 bzw. 3 Feldinhalte eines GridView für die nächste Abfrage übergeben!?


Stahli
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: SqlDataSource - Selects definieren

  Alt 2. Mai 2009, 11:40
Hallo,

ich habe es jetzt so gelöst, dass ich die Abfrageergebnisse sequenziell in Labels.Text ablege.
In meinem Fall ist es ohnehin sinnvoll, die "ausgewählten Daten" im Webform anzuzeigen.
Weiterhin habe ich die Teile der WebSite in Panels abgelegt, die ich einfach ein- und ausblende. Ist das zu umständlich oder ein korrekter Weg?

Es scheint mir zumindest inzwischen ein üblicher und korrekter Weg zu sein, Zwischeninformationen in sichtbaren oder versteckten Textobjekten zu speichern, damit die Daten bei der nächsten "Rundreise" (also dem nächsten Seitenaufruf) noch zur Verfügung stehen. (Daneben gäbe es noch die Möglichkeit, Daten in einer Session oder Applikation zu speichern.)

Also sollte meine Lösung soweit korrekt sein.

Nun möchte ich jedoch die Anzahl der Datensätze einer SqlDataSource abfragen. Ich finde jedoch nur die Möglichkeit, die Anzahl der Zeilen eines GridViews zu ermitteln. Allerdings setze ich eine ListBox ein, die offenbar nicht die Anzahl der Records der verbunden SqlDataSource zurück gibt:

Delphi-Quellcode:
namespace;

interface

uses
  System,
  System.Data,
  System.Configuration,
  System.Web,
  System.Web.Security,
  System.Web.UI,
  System.Web.UI.WebControls,
  System.Web.UI.WebControls.WebParts,
  System.Web.UI.HtmlControls;

type
  _Default = public partial class(System.Web.UI.Page)
  protected
    method SqlDataSourceCity_Selecting(sender: System.Object; e: System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs);
    method ListBoxUser_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
    method ListBoxHouse_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
    method ListBoxStreet_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
    method ListBoxCity_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
    method TextBoxPlz_TextChanged(sender: System.Object; e: System.EventArgs);
    method Page_Load(sender: Object; e: EventArgs);
    method DefineData;
  end;

implementation

method _Default.DefineData;
var
  NotFound: Boolean;
begin
  NotFound := False;
  PanelPlz.Visible := LabelPlz.Text <> '';
  PanelCity.Visible := LabelCity.Text <> '';
  PanelCitySelect.Visible := (LabelCity.Text = '') and (LabelPlz.Text <> '') and (not NotFound);
  PanelStreet.Visible := LabelStreet.Text <> '';
  PanelStreetSelect.Visible := (LabelStreet.Text = '') and (LabelCity.Text <> '') and (not NotFound);
  PanelHouse.Visible := LabelHouse.Text <> '';
  PanelHouseSelect.Visible := (LabelHouse.Text = '') and (LabelStreet.Text <> '') and (not NotFound);
  PanelUser.Visible := LabelUser.Text <> '';
  PanelUserSelect.Visible := (LabelUser.Text = '') and (LabelHouse.Text <> '') and (not NotFound);
end;

method _Default.Page_Load(sender: Object; e: EventArgs);
begin
  if LabelPlz.Text = 'then
    DefineData;
end;

method _Default.TextBoxPlz_TextChanged(sender: System.Object; e: System.EventArgs);
begin
  LabelPlz.Text := TextBoxPlz.Text;
  LabelCity.Text := '';
  LabelStreet.Text := '';
  LabelHouse.Text := '';
  LabelUser.Text := '';
  DefineData;
end;

method _Default.ListBoxCity_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
begin
  LabelCity.Text := ListBoxCity.SelectedValue;
  DefineData;
end;

method _Default.ListBoxStreet_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
begin
  LabelStreet.Text := ListBoxStreet.SelectedValue;
  DefineData;
end;

method _Default.ListBoxHouse_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
begin
  LabelHouse.Text := ListBoxHouse.SelectedValue;
  DefineData;
end;

method _Default.ListBoxUser_SelectedIndexChanged(sender: System.Object; e: System.EventArgs);
begin
  LabelUser.Text := ListBoxUser.SelectedValue;
  DefineData;
end;

method _Default.SqlDataSourceCity_Selecting(sender: System.Object; e: System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs);
begin
  PanelNotFound.Visible := ListBoxCity.Rows = 0; // ???????????????????????????????????
  PanelNotFound.Visible := SqlDataSourceCity.Records = 0; // ???????????????????????????????????
  DefineData;
end;

end.

Also in der letzten Ereignisbehandlung möchte ich die Anzahl der gefundenen Datensätze ermitteln und davon abhängig die Abschnitte der Seite (Panels) ein- und ausschalten.
Anbei auch ein kleines Bild der "WebSite".


Wo finde ich denn eine Übersicht über die alle Attribute der Net.-Controls?


stahli
Miniaturansicht angehängter Grafiken
sqldatasourcecount_276.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: SqlDataSource - Selects definieren

  Alt 10. Mai 2009, 21:18
...also so geht es:

Delphi-Quellcode:
  procedure MyProc;
  var
    dr: DataRowView;
    oDataView: DataView;
    _DataSourceSelectArguments: DataSourceSelectArguments;
  begin
    _DataSourceSelectArguments := new DataSourceSelectArguments;
    oDataView := DataView(SqlDataSource1.Select(_DataSourceSelectArguments.Empty));
    if oDataView <> nil then
    begin
      for I := 0 to oDataView.Count - 1 do
      begin
        dr := oDataView[I];
        xxx := dr.Item['XXX'].ToString;
        ...
      end;
    end;
  end;
Stahli
  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 13:00 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