AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Alphanumerische Werte eingrenzen (ähnlich Between)
Thema durchsuchen
Ansicht
Themen-Optionen

Alphanumerische Werte eingrenzen (ähnlich Between)

Ein Thema von blawen · begonnen am 13. Sep 2015 · letzter Beitrag vom 14. Sep 2015
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von blawen
blawen

Registriert seit: 1. Dez 2003
Ort: Luterbach (CH)
677 Beiträge
 
Delphi 12 Athens
 
#1

Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 21:55
Datenbank: MySQL • Version: 5.6 • Zugriff über: MyDac
Ich habe zwei Tabellen, in der einen sind Reparaturdaten erfasst und in der anderen die jeweiligen Stammdaten der Produkte.

Nun möchte ich abfragen, ob Geräte eines bestimmten Seriennummern-Bereichs bereits einmal erfasst worden sind.
Der Aufbau der Seriennummer ist pro Produkt zwar identisch, kann aber rein numerisch oder aber alphanumerisch ausfallen (z.B. 123 und B12).

Bei rein numerischen Seriennummer könnte ich zwar mit "Between" den Bereich einengen, dies funktioniert aber bei alphanumerischen Werten nicht.

Also habe ich versucht, mit den üblichen Operatoren zu arbeiten. Allerdings gelingt es mir nicht, die Abfrage so zu gestalten, dass in beiden Fälle korrekte Werte zurück geliefert werden.
Mit Hochkommata's ("") werden keine rein numerischen Werte "gefunden" und ohne kann ich nicht nach alphanumerischen Werten abfragen

Kann mir jemand einen Tipp geben, was ich falsch mache und wie ich die Abfrage gestalten müsste, damit sie korrekte Werte liefert?

Code:
Select * from REPARATUR INNER JOIN MATERIAL)   ON
REPARATUR.MATERIAL_ID  = MATERIAL.MATERIAL_ID AND
MATERIAL.MATERIALNR    = "10012345"           AND
(REPARATUR.SERIENNUMMER >= 1                  AND
 REPARATUR.SERIENNUMMER <= 100)
Roland
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#2

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 22:05
Anstatt 'BETWEEN' kannst Du auch 'LIKE' verwenden, sofern das Seriennummernformat das zulässt.

Du solltest angeben, wie die Seriennummern aufgebaut sind.
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#3

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 22:13
Hier wäre es aus meiner Sicht erst einmal wichtig zu erfahren, wie denn deine Serien-Nummern-Bereiche organisiert sind. Hat z.B. das erste Zeichen eine bestimmte Bedeutung? Oder anders gefragt: Weisen die Serien-Nummern eine einheitliche Gliederung auf? Z.B.: Bedeutet das erste Zeichen B, daß das Ding aus der Abteilung B stammt?

Worauf ich hinaus will: Wenn eine einheitliche Gleiderung der Serien-Nummern existiert, könnte man diese Gliederung irgendwie berechnen?

Mit Hochkommata's ("") werden keine rein numerischen Werte "gefunden" und ohne kann ich nicht nach alphanumerischen Werten abfragen
Das habe ich nicht so ganz verstanden: Erstens sind Hochkommatas nicht ", sondern '.
Zweitens liegen die Seriennummern doch stets als String bzw. VarChar vor, müssen also beim Suchen immer in Hochkommatas eingeschlossen sein. Ob der String nun numerisch interpretierbar wäre oder nicht, kümmert die Datenbank eigentlich erstmal nicht.
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 1. Dez 2003
Ort: Luterbach (CH)
677 Beiträge
 
Delphi 12 Athens
 
#4

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 22:16
Anstatt 'BETWEEN' kannst Du auch 'LIKE' verwenden, sofern das Seriennummernformat das zulässt.

Du solltest angeben, wie die Seriennummern aufgebaut sind.
Grundsätzlich geht es um zwei Arten:

- Rein numerisch und fortlaufend (100,101,102,...)
- Beginnend mit einem Buchstaben und danach wiederum mit einem fortlaufenden Zahlenwert (B100, B101, B202,...)
(Der Buchstaben dient als Versionsindex)

Konkret möchte ich z.B. sämtliche Geräte mit der Seriennummer 100 - 200, bzw. B100 - B200 aufgelistet haben.

Funktioniert 'Like' nicht nur bei übereinstimmenden Suchbegriffen?


/Edit
Ob der String nun numerisch interpretierbar wäre oder nicht, kümmert die Datenbank eigentlich erstmal nicht.
Angenommen, es existiert ein Gerät mit der Seriennummer '150' in der Datenbank.
Mit der Abfrage
Code:
Select * from REPARATUR INNER JOIN (MATERIAL)  ON
 REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID AND
 MATERIAL.MATERIALNR   = "10012345"          AND
 (REPARATUR.SERIENNUMMER >= '1'               AND
  REPARATUR.SERIENNUMMER <= '200')
wird der Datensatz nicht gefunden (leere Datenmenge), ohne Hochkommata hingegen schon.

/Edit2:
Schreibfehler korrigiert (Wert von 100 auf 200 korrigiert)
Roland

Geändert von blawen (13. Sep 2015 um 23:53 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 22:41
Also '100-200' ginge so (ist aber keine schöne Lösung)
Code:
where Seriennummer like '1??' or Seriennummer='200'
Ich verstehe aber nicht, wieso das nicht mit 'BETWEEN' funktioniert sollte, fällt mir gerade ein. Das ist ja eine totale Ordnung, da die Vergleichsoperastionen vollständig definiert sind. Also, in MSSQL geht das jedenfalls.
Code:
where Seriennummer between '100' and '200'
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 1. Dez 2003
Ort: Luterbach (CH)
677 Beiträge
 
Delphi 12 Athens
 
#6

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 23:05
Also '100-200' ginge so (ist aber keine schöne Lösung)
Bei so engen Bereichen würde es gehen, aber bei grösseren Bereichen unpraktikabel.
Zitat:
Ich verstehe aber nicht, wieso das nicht mit 'BETWEEN' funktioniert sollte, fällt mir gerade ein. Das ist ja eine totale Ordnung, da die Vergleichsoperastionen vollständig definiert sind. Also, in MSSQL geht das jedenfalls.
Bei MySQL funktioniert es (anscheinend) nur mit reinen Zahlenwerten.
Zumindest
Code:
where Seriennummer between 100 and 200
liefert mir eine Datenmenge zurück,
Code:
where Seriennummer between '100' and '200'
hingegen nicht.
Roland

Geändert von blawen (13. Sep 2015 um 23:09 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 23:42
es existiert ein Gerät mit der Seriennummer '150' in der Datenbank.
Mit der Abfrage
Code:
Select * from REPARATUR INNER JOIN (MATERIAL)  ON
 REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID AND
 MATERIAL.MATERIALNR   = "10012345"          AND
 (REPARATUR.SERIENNUMMER >= '1'               AND
  REPARATUR.SERIENNUMMER <= '100')
wird der Datensatz nicht gefunden (leere Datenmenge), ohne Hochkommata hingegen schon.
Wieso sollte bei <= '100', 150 angezeigt werden?
Weiter unten in den Posts steht da nun 200 und 150 wird trotzdem nicht angezeigt?
Du hast das sicher irgendwo einen Bock drin.

Lass die Daten sortiert ausgeben, frage auf =150 ab. Irgendwas stimmt da nicht.
Wie ist der Typ dieser Spalte definiert?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 1. Dez 2003
Ort: Luterbach (CH)
677 Beiträge
 
Delphi 12 Athens
 
#8

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 00:06
Wieso sollte bei <= '100', 150 angezeigt werden?
Sorry, war ein dummer Tippfehler im Posting (200 wäre der korrekte Wert, habe ich im Posting korrigiert).

Aktuell habe ich es so gelöst, dass zuerst ein 'between' versucht wird. Führt dies zu keinem Ergebnis, mache ich eine neue Abfrage mit logischen Operatoren.
So komme ich zwar zu meinen Daten, aber dies müsste doch sicher einfacher gehen.

Delphi-Quellcode:
// Da Between nur numerische Werte enthalten darf und die logischen Operatoren
// bei rein numerischen Werten wiederum keine Datenmenge zurückliefern, wird
// aktuell dieser Workarround benutzt.
// Da Alphanumerische Werte bei einer between Abfrage zu einer Exception führen,
// wird dies in ein "try-except" verpackt
try
  quSuchen.SQL.Text := 'Select * from REPARATUR INNER JOIN ' +
                       '(MATERIAL) ON ' +
                       'REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID AND ' +
                       'MATERIAL.MATERIALNR = :MaterialNr AND ' +
                       '(REPARATUR.SERIENNUMMER between :SerNr_Start AND :SerNr_Ende)';

  quSuchen.ParamByName('MATERIALNR').AsString := edMaterialNr.Text;
  quSuchen.ParamByName('SerNr_Start').AsInteger := StrToInt(edSerienNr_Start.Text);
  quSuchen.ParamByName('SerNr_Ende').AsInteger := StrToInt(edSerienNr_Ende.Text);
  quSuchen.Active := True;
except
end;

if quSuchen.RecordCount = 0
then begin
  try
    quSuchen.SQL.Text := 'Select * from REPARATUR INNER JOIN ' +
                         '(MATERIAL) ON ' +
                         'REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID AND ' +
                         'MATERIAL.MATERIALNR = :MaterialNr AND ' +
                         '(REPARATUR.SERIENNUMMER >= :SerNr_Start AND ' +
                         ' REPARATUR.SERIENNUMMER <= :SerNr_Ende) AND ' +
                         'REPARATUR.DATUM BETWEEN :Datum_Start AND :Datum_Ende';

    quSuchen.ParamByName('MATERIALNR').AsString := edMaterialNr.Text;
    quSuchen.ParamByName('SerNr_Start').AsString := edSerienNr_Start.Text + '%';
    quSuchen.ParamByName('SerNr_Ende').AsString := edSerienNr_Ende.Text + '%';
    quSuchen.ParamByName('DATUM_START').AsDate := edDatum_Start.Date;
    quSuchen.ParamByName('DATUM_ENDE').AsDate := edDatum_Ende.Date;
    quSuchen.Active := True;
  except
  end;
end;
Roland

Geändert von blawen (14. Sep 2015 um 00:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#9

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 01:44
Wie sieht es denn mit strcmp aus? Damit sollte sich so etwas doch zusammenbasteln lassen.
Andererseits könntest du überlegen, ob du die Zugehörigkeit zu einem Seriennummernbereich nicht schon in der Datenbank modellieren willst.
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#10

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 07:26
Bei so engen Bereichen würde es gehen, aber bei grösseren Bereichen unpraktikabel.
Na nö... Eher bei 'krummen' Bereichen wie '142-379'

Deine Lösung mit '>= and <=' ist doch super, nur haben die '%' Zeichen dort nichts verloren. Das sind Wildcards für die LIKE Suche.

Das ich darauf nicht früher gekommen bin... (also mit '>= AND <=')...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 02:11 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