Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

SQL Definition funktioniert nicht

Begonnen von Klaus S. aus B, März 19, 2015, 10:43:55

⏪ vorheriges - nächstes ⏩

Klaus S. aus B

Hallo zusammen,

habe mal wieder eine SQL Krise.  :'(

Ich habe in einem Formular zwei abhängige Kombifelder. Im ersten wählt man den Maschinentyp, und bekommt im zweiten dann die dazu passenden Baugrößen.
Dadurch wird ein eindeutiger DS für die MAschine (Typ und Baugröße) aus einer Liste (tbl_maschtyp) ausgewählt.

Funktionieren tut das Ganze mit folgendem SQL string
Me!cbo_gros.RowSource = "SELECT tbl_maschtyp.ID_Mtyp, tbl_maschtyp.Typ, tbl_maschtyp.Baugr From tbl_maschtyp WHERE (((tbl_maschtyp.typ) LIKE '*" & Typ & "')) ORDER BY tbl_maschtyp.Baugr_num"


Jetzt habe ich festgestellt, dass ich eine falsche Liste an Baugrößen zur Auswahl bekomme durch das * im SQL string. (klar, ist nicht mehr eindeutig).
Jetzt habe ich einfach mal das * weggelassen, bekomme jetzt aber ein Parameterabfragefenster, bei dem der Wert "Typ" im Kopf steht. Gebe ich hier den Wert ein, funktioniert es.

Mein geänderter Code lautet:
Me!cbo_gros.RowSource = "SELECT tbl_maschtyp.ID_Mtyp, tbl_maschtyp.Typ, tbl_maschtyp.Baugr From tbl_maschtyp WHERE (((tbl_maschtyp.typ) like  " & Typ & ")) ORDER BY tbl_maschtyp.Baugr_num"


Was mache ich falsch?
Wie bekomme ich die Abrage eindeutig, natürlich ohne ein Parameterfenster?

LG
Klaus

el_gomero

Hallo Klaus,

also dein Statement sieht bisher so aus:

SELECT tbl_maschtyp.ID_Mtyp,
tbl_maschtyp.Typ,
tbl_maschtyp.Baugr
From tbl_maschtyp
WHERE (((tbl_maschtyp.typ) like  " & Typ & "))
ORDER BY tbl_maschtyp.Baugr_num"

Jetzt frage ich mich, was Typ ist? Eine Variable, ein Feld? Ausserdem wird bei abhängigen Kombis sinnvollerweise mit der ID des FK eingegrenzt.

Wenn dir das nicht hilft, musst du mehr Infos rausrücken.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

Klaus S. aus B

Hallo Jürgen,

hast natürlich recht, war vielleicht etwas dünn.

Typ ist eine variable vom Typ "string"; mit der ID arbeiten funktioniert ja nicht. Ich habe in der Tabelle tbl_maschtyp für jede Kombination Maschinentyp und Baugröße einen DS. D.h. wenn ich den DS finden will der dieser Kombination entspricht, muss das zweite Kombifeld mir alle DS anzeigen, die dem Maschinentyp entsprechen, die haben dann natürlich verschieden IDs.

Hier ist der ganze Code:
Private Sub cbo_typ_AfterUpdate()
Dim Typ As String

Typ = Me!cbo_typ
Debug.Print Typ

Me!cbo_gros.RowSource = "SELECT tbl_maschtyp.ID_Mtyp, tbl_maschtyp.Typ, tbl_maschtyp.Baugr From tbl_maschtyp WHERE (((tbl_maschtyp.typ) LIKE '*" & Typ & "')) ORDER BY tbl_maschtyp.Baugr_num"
'Me!cbo_gros.RowSource = "SELECT tbl_maschtyp.ID_Mtyp, tbl_maschtyp.Typ, tbl_maschtyp.Baugr From tbl_maschtyp WHERE (((tbl_maschtyp.typ) like  " & Typ & ")) ORDER BY tbl_maschtyp.Baugr_num"


End Sub


Gruß
Klaus

el_gomero

Zitat
Ich habe in der Tabelle tbl_maschtyp für jede Kombination Maschinentyp und Baugröße einen DS. D.h. wenn ich den DS finden will der dieser Kombination entspricht, muss das zweite Kombifeld mir alle DS anzeigen, die dem Maschinentyp entsprechen, die haben dann natürlich verschieden IDs.

Wenn ich das so höre, denke ich dass das Datenmodell verbesserungswürdig scheint. Beispiel: Maschinen mit den Werten Benzin, Diesel. Baugrößen: 1600ccm, 2000ccm, 2500ccm. Richtig wären hier 3 Tabellen. 1. Maschinen, 2. Baugrössen, 3. Maschinenvarianten. Die 3. nimmt dann alle Kombinationen aus Maschinen und Baugrössen auf. Gespeichert wird darin aber nur die ID der Referenztabelle. Und mit so einem Konstrukt fallen Selektionen dann ganz leicht.

Das strings mit ' zu maskieren sind, hast du ja schon herausgefunden. Läuft das jetzt?
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

MaggieMay

Hallo,

der Einsatz von Like macht nur Sinn im Zusammenhang mit Suchmustern, diese aber brauchst du nicht, wenn das Kombifeld einen konkreten Wert liefert.
Welchen Datentyp hat denn das Feld "tbl_maschtyp.typ"?

So klappt's mit einer Zahl:
Private Sub cbo_typ_AfterUpdate()
    Me!cbo_gros.RowSource = "SELECT tbl_maschtyp.ID_Mtyp, tbl_maschtyp.Typ, tbl_maschtyp.Baugr From tbl_maschtyp WHERE tbl_maschtyp.typ = " & NZ(Me!cbo_typ, 0) & " ORDER BY tbl_maschtyp.Baugr_num"
End Sub

Bei Texten muss der Wert in Hochkommata gesetzt werden.
Freundliche Grüße
MaggieMay

Klaus S. aus B

Hallo Jürgen, hallo MaggieMay,

nein, ich wusste nicht, dass strings mit ' auskommentiert werden müssen.  :-[
Aber ich versuche es mir zu merken!

Jetzt funktioniert das Ganze.

Zum Datenmodell: Dass diese Lösung nicht gut normalisiert ist, sit mir klar, aber für den Zweck war mir das zu aufwendig. Die zusäztzlichen 2 Tabellen wolte ich mir sparen.

Gruß
Klaus

el_gomero

Zitat
... nein, ich wusste nicht, dass strings mit ' auskommentiert ...

nicht auskommentiert, sondern maskiert - am Ende muss auch ein Hochkomma stehen. Gleiches kann man wohl mit Verdopplung der normalen Gänsefüsse erreichen, mir ist das aber zu unübersichtlich.
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen

MaggieMay

Zitatdass strings mit ' auskommentiert werden müssen
Auskommentieren kann man mit dem Hochkomma Kommentare im VBA-Code. Texte setzt man grundsätzlich in Gänsefüßchen, im SQL-Code sind netterweise auch die Hochkommata zugelassen.

Wie sonst sollte denn wohl folgende Zuweisung funktionieren:
x = "Hallo Welt!"Wo der Textstring beginnt und endet kann man nur an den Gänsefüßchen erkennen.
Enthält der Text selbst Gänsefüßchen, so sind diese zu verdoppeln.
Freundliche Grüße
MaggieMay