Hi Leute!
Ich habe folgendes Problem:
In Access habe ich eine Tabelle Kunden und eine Rechnung angelegt. Die Tabelle Kunden hat eine 1:n Beziehung mit der Tabelle Rechnung. Der Primärschlüssel bei ist die KundenNr.
Jetzt folgendes Problem: Hat jemand eine Idee wie ich
1.) aus der Tabelle Rechnung als erstens eine gewisse zeitspanne herausfilter
zB. alle Rechnungen vom 1.1 bis 1.2
2.) dann möchte ich aus den selektierten Daten die KundenNr mit der aus der Tabelle Kunden vergleichen und zB in eine ListBox einlesen.
D.H alle Kunden die in einer gewissen Zeitspanne eine Rechnung bekommen haben die Stammdaten herauslesen.
mfg
Meti
Hallo!
folgendes SQL-Statement müsste genau das machen was du willst:
select * from kunde
where kundennr in
(select kundennr from rechnung
where rechnung.datum between datum1 and datum2
)
mfg
Das gebe ich so in C# ein? oder meinst du vielleicht in access.
also ich hab das zumindest mit diesem Befehl in c# probiert aber das funkt nicht ganz.
mfg
meti
Ja das sollte schon in den Code rein!
Wie hast du denn das ausprobiert im Code? Mit OleDbCommand?
mfg
ja mit oleDb command
private void button1_Click(object sender, System.EventArgs e)
{
string strVon;
string strBis;
strVon=dtpVon.Value.ToString();
strBis=dtpBis.Value.ToString();
strSql=Select * From Kunden Where KundenNr in
{
Select KundenNr from Rechnung where Rechnung.Datum between '"+strVon+"' And '"+strBis+"'
}
dr=db.GetKunden(strSql);
listFuellen();
}
Das gesamte SQL-Statement muss unter Anführungszeichen gesetzt werden.
Was ist das Object db? und was macht die Methode GetKunden()?
Kommen irgendwelche Fehlermeldungen? Wenn ja, welche? (möglichst genau beschreiben)
Du solltest mit Schichten arbeiten (also UI, BusinessLayer und DataLayer). So wie du es jetzt hast (also zugriffe auf die Datenbank in den Eventhandlern vom GUI usw.) wird es sehr schnell unübersichtlich und fehleranfällig.
mfg
sorry ich weiß nerve schon unheimlich🙂
aber diese sql abfragen......
ich hab das jetzt mit Anführungszeichen eingegeben. das programm startet jetzt zumindest aber bei der abfrage kommt dann eine abfrage
"Guid falsch formatiert in Abfrageausdruck"
strSql="Select * From Kunden Where KundenNr in { Select KundenNr from Rechnung where Rechnung.Datum between '"+strVon+"' And '"+strBis+"' }";
PS:
Was meinst du mit Schichten u. BusinessLayern?
Ich habe das hier so gemacht dass cih eine Klasse DB gemacht habe wo ich die Datenbankverbindung, einlesen und so weiter mache.
im Formular übergebe ich dann nur den sql string.
dr=db.GetKunden(strSql);
danke für deine hilfe nochmals
meti
Zu den Schichten ist es wahrscheinlich am besten, wenn du mal hier im Forum suchst oder mal googlest.
Ich bin mir nicht sicher ob das den Fehler verursacht, aber das Sub-Select gehöt in runde Klammer und nicht in geschweifte!
mfg
Deine SQL Abfrage ist noch nicht optimal. Ein Join wäre angebrachter und schneller als eine geschachtelte Anfrage mit dem 'IN' Operator.
Select * From kunden INNER JOIN bestellungen ON kunde.kundennr = rechnung.kundennr
WHERE Rechnung.Datum BETWEEN datum1 AND datum2
Zu den Schichten: den SQL text würde ich, wie DeveloperX schon sagte, komplett aus der GUI entfernen. In einer weiteren Klasse wäre der besser aufgehoben.
In dieser Klasse hast du nur Methoden die SQL Anfragen stellen und die Ergebnisse zurückliefern. Die Datenbankverbindung bekommen diese Methoden von deiner DB Klasse.
Deine GUI benutzt dann nicht mehr die DB Klasse.
Am besten arbeitest du zusätzlich nur mit Interfaces (IDbConnection, IDataReader etc), dann sind am wenigsten änderungen nötig, falls du z.B. den ODBC Treiber oder das DBMS wechselst.
also ich hab das mal so probiert, aber es funkt nicht
Fehler: Datentypen in Kriterienausdruck unverträglich!
^
strVon=dtpVon.Value.ToString(); //da nehme ich das startdatum von einem dateTime Picker
//in der DB ist in der Tabelle Rechnung ein Feld Datum als DateTime
strBis=dtpBis.Value.ToString();
strSql ="Select * From Kunden INNER JOIN Rechnung ON Kunden.KundenNr = Rechnung.KundenNr WHERE Rechnung.Datum BETWEEN '"+strVon+"' AND '"+strBis+"'";
dr=db.GetKunden(strSql);
listFuellen();
}
mfg
meti
Welches DBMS benutzt du?
Vielleicht muss das Datum ein bestimmtes Format haben.
DateTime.ToString() gibt standardmäßig die Zeit mit aus (dd.MM.yyyy HH.mm.ss).
Du kannst es ja mal mit DateTime.ToString("dd.MM.yyyy") versuchen.
Hi,
Ich weiß nicht aber dass bringt mich zum verzweifeln.
Nachdem ich den sql das eine feld mit CDATE konventiert habe kommt keine Fehlermeldung mehr.
doch das was ich
haben wollte funkt nicht ganz.
ich möchte dass dann zB der jeweilige Zuname in einer listbox eingetragen wird so schaut der code aus:
strVon=dtpVon.Value.ToString(); /DateTimePicker
strBis=dtpBis.Value.ToString();
strSql="Select * From Kunden INNER JOIN Rechnung ON Kunden.KundenNr = Rechnung.KundenNr Where CDate(Rechnung.Datum) Between '"+strSql+"' And '"+strBis+"'";
dr=db.GetKunden(strSql);
listFuellen()
...
..
private void listFuellen()
{
while(dr.Read())
{ string strX=dr["Zuname"].ToString();
listBox1.Items.Add(strX);
}
}
PROBLEM:
In der ListBox wird nicht reingeschrieben!!!
obwohl die ausgewählte ZeitSpanne mehrere Datensätze enthalten sollte?
weiß nicht weiter bitte helfen!
vielleicht bekommt der datareader gar keine zeilen also ergebnis. gib doch mal 'strX' in der Console aus oder setzt den Debugger mal drauf an.
mfg
das ist es ja...
er bekommt keine ansonsten würde er es reinschreiben....
frag mich nur wieso....?
wenn ich das eingebe:
MessageBox.Show(dr.FieldCount.ToString());
kommt als ergebnis 18 heraus ...das ist genau die Anzahl der Kunden.
dann habe ich probiert strX oder irgendwas in dieser MessageBox herauszubekommen aber er kommt garnicht soweit auch wenn ich nur ein a ausgegeben haben will.
while(dr.Read())
{
string strX=dr["Zuname"].ToString();
MessageBox.Show(strX);
listBox1.Items.Add(strX);
}
was kann da nur sein......?
mfg meti
Vielleicht ist der der Wert den du mit dr["Zuname"] bekommst null.
Probiers doch mal mit dr.GetString(dr.GetOrdinal("Zuname"));
hmm...
jetzt hab ich es mal mit einem dataset ausprobiert....
und es funktioniert halbwegs...
Problem: alle Datensätztze haben ein Datum zw. Jänner Februar...
angenommen ich geb jetzt ein alle Daten zw. 1.2 und 5.2 sollen angezeig werden=> dann macht er das auch
doch wenn ich zB. alle zw. 3.1 und 5.2 eingeben dann gibt er kein einzigen aus....??
normal müsste er die von der ersten abfrage und weitere zusätzliche anzeigen
das Datum von Jänner kann doch nicht größer sein als das vom Februar?
stimmt etwas am string nicht oder wo kann das problem liegen?
ciao
meti
kann mir da jemand bitte helfen....?
brauche das dringend für ein projekt für die uni....
danke
hmm....
vielleicht stimmt die sql anweisung nicht