Autor Beitrag
D. Annies
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: So 29.01.12 09:47 
Hi, Delpher,

ich habe den folgenden Code, der "halbrichtig" funktioniert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
  Tg := strtoint(copy(maskedit1.editText,1,2));                                   // + '%%'; ?
  Mo := strtoint(copy(maskedit1.editText,4,2));
  if (tg >= 10and (mo >= 10then TAG_MON := inttostr(Tg) +'.' + inttostr(Mo) +'.' + '%'
  else
  if (tg >= 10and (mo <  10then  TAG_MON := inttostr(Tg) +'.' + '0' + inttostr(Mo) + '.' + '%'
  else
  if (tg <  10and (mo >= 10then  TAG_MON := '0' + inttostr(Tg) +'.' + inttostr(Mo) + '.' + '%'
  else
  if (tg <  10and (mo <  10then  TAG_MON := '0' + inttostr(Tg) +'.' + '0' + inttostr(Mo) + '.' + '%';

  tbname := TbSchueler.TableName;
  qx := TQuery.Create(Application);
  qx.datasource := TbSchueler.DataSource;
  Qx.DatabaseName := listbox11.items[listbox11.itemindex];
  qx.SQL.Text := format('select * from "%s" ' , [tbname]);

  if TbSchueler.Fieldbyname('gebdat').DataType = ftString then
  begin
    showmessage('GebDat ist als TString gespeichert  ' + Tag_Mon);
    qx.Close;
      qx.SQL.Text := format('select Name, Vorname, Klasse, Gebdat, Telefon from "%s" ' +
                            'where gebdat like "%s" ' +
                            'order by Name, Vorname, Klasse', [TbName, Tag_Mon]);
    qx.Open;
  end;


"Halbrichtig" deshalb, weil (an einem bestimmten Tad) drei Personen angezeigt werden müssen, aber nur einer angezwigt wird.

Was ist denn mein Fehler?

Gruß, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.01.12 10:55 
// EDIT: Ok, hatte das MaskEdit nicht korrekt im Kopf...

Dann zu der SQL-Formel:
Wird die korrekt zusammengesetzt? Funktioniert die dann in der Form, wenn du sie unabhängig von deinem Programm ausführst? Das ist ja schließlich der erste Schritt bevor man es in ein Programm einbaut.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: So 29.01.12 20:35 
Ja, funktioniert, sonst würde IMO ja nicht der eine (richtige) Datensatz ausgegeben werden.
Aber warum nicht alle drei?
Weiß noch jemand Rat?

_________________
ut vires desint, tamen est laudanda voluntas
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.01.12 20:46 
Lösche am besten einmal alle anderen Datensätze. Wenn es dann reproduzierbar ist, kannst du die Datenbank (ggf. anonymisiert, wenn es echte Daten sind) ja einfach hier anhängen. Denn ohne wird kaum jemand etwas dazu sagen können.

Und da du deinen SQL-Befehl ja offenbar (das schließe ich mal aus deiner Antwort) nicht außerhalb des Programms einfach nur auf der Datenbank ausprobiert hast, weißt du ja nicht einmal woran es denn nun liegt...
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mo 30.01.12 04:52 
Vielleicht gibst Du Ja den SQLText mal als Text aus, um zu sehen, was da letztendlich steht:


ausblenden Delphi-Quelltext
1:
2:
  SQLText := qx.SQL.Text;
  showmessage(SQLText);


Dann siehst Du, was wirklich in der SQL-Abfrage steht. Und wie steht es mit der Datenbank? Sind da alle Daten im Feld "GebDat" auch sauber als Datumsstring gespeichert? Da kann es leicht passieren, dass ein Datum in einem Stringfeld falsch gespeichert wird. Besser ist eine Speicherung von Datumsangaben in einem Datetime-Feld.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mo 30.01.12 05:59 
Danke, Gunther,
ja, es ist alles so, wie es sein soll. Es muss wohl an dem Like-Befehl liegen.
Ich probier da mal, etwas zu verändern.
Gruß, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Xion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
EE-Maler
Beiträge: 1952
Erhaltene Danke: 128

Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
BeitragVerfasst: Mo 30.01.12 08:16 
bzgl LIKE probiers mal mit

ausblenden Delphi-Quelltext
1:
' where gebdat like''%%s%'' '					


Es sollte dann im SQL so aussehen: LIKE '%24.12.%'

Vor allem das % (beliebiges Jahr) am Ende ist wichtig, da LIKE sonst keinen Vorteil gegenüber = bringt.

_________________
a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Mo 30.01.12 20:57 
Hi, Xion, habe ich so gemacht -
leider keine Änderung.
:(

_________________
ut vires desint, tamen est laudanda voluntas
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Mo 30.01.12 22:08 
Frage: Sind die Daten aller Datensätze im Feld "GebDat" wirklich Datumsangaben? Oder hat sich da ein Fehler eingeschlichen?

Wie ich schon schrieb: Am Besten ist, solche Felder auch mit dem Feldtyp zu belegen, der den Daten entspricht: Datumsfelder : DateTime, Zahlen: Ganzzahl : Integer oder Longint oder Byte, Realzahlen : float, Boolsche Felder : boolean ....

Dann sind Fehleingaben sofort ersichtlich bzw. werden gar nicht erst akzeptiert.

Versuche doch mal folgende SQL-Syntax:

ausblenden Delphi-Quelltext
1:
2:
3:
  SELECT *
  FROM xxx
  WHERE (((Day([GebDat]))=Tag) AND ((Month([GebDat]))=Monat))


xxx : Deine Tabellenbezeichnung
Tag : Tag des Datums (1..31)
Monat: Monat des Datums (1..12)
GebDat : Feldbezeichnung Des Geburtstagsfeldes.

Der Vorteil liegt auf der Hand: 1. brauchst Du den Format-Konstrukt nicht mehr, weil Du über Tag und Monat direkt auf die SQL-Daten zugreifst. Das Erstellen der SQL-Syntax erfolgt dann wie folgt:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
  
  Tg := strtoint(copy(maskedit1.editText,1,2));                                   // + '%%'; ?
  Mo := strtoint(copy(maskedit1.editText,4,2));

  tbname := TbSchueler.TableName;
  qx := TQuery.Create(Application);
  qx.datasource := TbSchueler.DataSource;
  Qx.DatabaseName := listbox11.items[listbox11.itemindex];
  qx.Close;
  qx.SQL.Text := Format('select * from %s where (Day([gebdat])=%d) and (Month([gebdat])=%d) order by Name, Vorname, Klasse', [TbName, Tg, Mo]);
  qx.Open;


Die Typ-Abfrage des Feldes "GebDat" entfällt. Ich hoffe dass es so funktioniert. Ich habe es an einer Testdatenbank ausprobiert. Und hier sowohl an einen Datetime, als auch an einem String-Feld GebDat. Die Doppelten Anführungszeichen bei %s und %d benötigst Du nicht.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 31.01.12 07:28 
Hallo, Gunther,

Leider Fehlermeldung: Typ für Feld <...Dateiname...> ist unbekannt.

Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 31.01.12 09:07 
Versuche dann statt des * bei select Deine Felder wieder einzutragen

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
Select Name, Vorname, Klasse, Gebdat, Telefon From ...

statt: 

Select * From ...


Das mag an dem Formatbefehl liegen

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 31.01.12 09:55 
Leider nööö, mit der gleichen Fehlermeldung
arrgh, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 31.01.12 10:29 
Was steht dann letztendlich in dem SQL.Text? Und was für eine Art Datenbank ist die zugrundeliegende Datenbank? Ich habe es mit einer ACCESS-Datenbank probiert. Da gab es keine Probleme.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 31.01.12 10:37 
Es wird sich vermutlich weiter um die BDE handeln.

Mit einer geposteten Testdatenbank wäre das ganze ziemlich sicher schon lange erledigt. Und bevor der SQL Befehl nicht unabhängig von dem Projekt auf der Datenbank getestet ist, bringt es auch nichts immer neue Quelltexte auszuprobieren...
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 31.01.12 18:00 
Nun, da werde ich wohl mit den Schwächen der BDE leben müssen, die Daten kann ich leider nicht posten,
da es sich um echte Daten handelt.
LG, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 31.01.12 18:02 
Die Daten interessieren nicht die Bohne. Es geht nur um die Struktur der Datenbank/Tabelle. Wie ist die aufgebaut? Als Access-Datenbank, MySQL, dBase, Paradox oder was? Welche Felder hast Du und wie definiert. Wie greifst Du auf die Datenbank zu?

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 31.01.12 18:38 
Danke, Gunther, ich habe jetzt aus Frust die Prozedur gelöscht!

Es ist im übrigen so, dass ich die richtigen Daten bekomme, wenn ich nur eine Personen-Tabelle abfrage
und danach die zweite Personentabelle. Nur, wenn (als) ich beide in einer Proc hintereinander abfragte,
passierte dieses "halbrichtige" Ergebnis - und, halt dich fest, auch nicht immer.

Also, noch einmal danke für deine Ideen und Hilfe, aber ich bin mit dieser (eigentlich guten) Idee
durch :))

LG, Detlef

_________________
ut vires desint, tamen est laudanda voluntas
Tranx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 648
Erhaltene Danke: 85

WIN 2000, WIN XP
D5 Prof
BeitragVerfasst: Di 31.01.12 19:23 
Warum aber hast Du denn zwei Tabellen mit der gleichen Struktur? Ich würde die Daten in einer Tabelle verwalten. Und wenn es z.B. Schul/Büro/private Daten sind - na und? Dann legst Du ein Feld an (Datentyp: Text mit Länge 1) und schreibst da hinein "p" für privat, "b" für Büro, "s" für Schule .... Dann kannst Du die Abfrage in einer Tabelle machen und hast nicht diese Probleme.

_________________
Toleranz ist eine Grundvoraussetzung für das Leben.
D. Annies Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1843

windows 7
D6 Enterprise, D7 Pers und TD 2006
BeitragVerfasst: Di 31.01.12 19:42 
Es ist schon so, dass die beiden Tabellen einen verschiedenen Aufbau haben, und auch verschiedene
Treiber usw.

Lassen wir sie ruhen.

Einen schönen Abend noch,
sagt dir Detlef aus HL

_________________
ut vires desint, tamen est laudanda voluntas