| Autor |
Beitrag |
Chaosworld
      
Beiträge: 49
|
Verfasst: Mi 16.04.03 03:47
Gibt es irgendeine Möglichkeit, wie ich eine SQL-Abfrage machen kann, und dann direkt in ein Feld ein Wert reinschreiben?
Ich wüsste leider keinen Weg wie ich direkt über die update-funktion arbeiten könnte. Mal abgesehen davon, davon ein einiges Query-Objekt zu erstellen, und dann für jeden einzelnen Durchlauf extra eine update-operation durchzuführen. Dies wäre natürlich sehr umständlich.
Aber ich beschreibe einfach mal was ich genau mache:
Ich habe 2 Datenmengen:
1. eine Probendatei, die so aussieht:
Probennr Kundennr Datum.... Rabatt
103120001 1 1.1.2003...(noch leer)
103120002 17 1.1.2003...(noch leer)
103120003 15 1.1.2003...(noch leer)
Es wird für jede einzelne Probe ein Datensatz erzeugt. Jede Probennr ist einzigartig.
2. eine Parameterdatei
Probennr Parameternr ..
103120001 13 ...
103120001 14 ...
103120001 35 ..
103120002 7 ...
Zu jeder Probe gibt es 1 bis beiliebig viele Einträge.
3. eine Tabelle "Rabatte" beliebiger Grösse (zur zeit über dynamische Array realiesiert)
Parameteranzahl/Probenanzahl 1 5 11
1 0 2 8
3 2 5 12
8 4 8 20
Diese Tabelle ist so zu lesen:
in der 0. zeile steht die Anzahl an gleichzeitig an einem Tag eingelieferten Proben. In der 0. Spalte steht die Anzahl der Paramter die zu der jeweiligen Probe gehört. Der Schnittpunkt ergibt den Rabatt-wert.
also wollte ich folgendes machen:
1. alle datensätze raussuchen, die an einem tag von einem Kunden geliefert werden, schreibe mir neg hin, wie viele Proben gleichzeitig vom Kunden geliefert wurden.
2. Dann bestimmt ich für jede Probe wie viele Parameter die jeweilige Probe hat, somit habe ich dann ja beide Werte, und trage dann ein, wie viel Rabatt es auf die einzelne Probe gibt.
Vor allem das 1. schreiben ist ds Problem. Die Probennr sind leider nicht in Folge, wodurch jede einzelne Probennr. rausgesucht werden müsste um die dann zu aktualisieren.
Also kennt jemand eine Möglichkeit, wie ich auch über Select-Abfragen schreiben kann. Oder gibt es einen ganz anderen Weg den ich einfach nicht sehe?
Im vorraus danke für jede Hilfe.
MFG
Chaosworld
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 16.04.03 07:22
Hi
Also so ganz hab ich's noch net verstanden.
| Zitat: |
also wollte ich folgendes machen:
1. alle datensätze raussuchen, die an einem tag von einem Kunden geliefert werden, schreibe mir neg hin, wie viele Proben gleichzeitig vom Kunden geliefert wurden.
|
Das ist klar. Kein Problem.
| Zitat: |
2. Dann bestimmt ich für jede Probe wie viele Parameter die jeweilige Probe hat, somit habe ich dann ja beide Werte...
|
Ebenfalls klar.
| Zitat: |
...und trage dann ein, wie viel Rabatt es auf die einzelne Probe gibt.
Vor allem das 1. schreiben ist ds Problem. Die Probennr sind leider nicht in Folge, wodurch jede einzelne Probennr. rausgesucht werden müsste um die dann zu aktualisieren
|
Hier wirds unverständlich. Wenn ich das richtig verstehe, willst du doch den Rabatt in der Probentabellen aktualisieren. Dabei ist aber das Auswahlkriterium doch die Kombination Kundennr/Datum. Die Probennummer spielt hier doch gar keine Rolle. Oder muss in den einzelnen Parametersätzen auch was geändert werden?
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
Chaosworld 
      
Beiträge: 49
|
Verfasst: Mi 16.04.03 13:36
Nein stimmt schon, du hast recht. Ich meinte damit nur, dass mit delphi das schreiben nicht erlaubt.
ich poste einfach mal den Quellcode hier rein:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| 'SELECT Proben.Probennr, Proben.Rabat , count(Para.Probennr) as Anzahl' 'FROM "'+extractFilePath(ParamStr(0))+'DB\'+edit1.Text[5]+edit1.Text[6]+'\Proben.DB" Proben,' '"'+extractFilePath(ParamStr(0))+'DB\'+edit1.Text[5]+edit1.Text[6]+'\Parameterdaten.DB" Para' 'WHERE Proben.Probennr BETWEEN 1'+datumvon[9]+datumvon[10]+datumvon[4]+datumvon[5]+'0001 and 1'+datumbis[9]+datumbis[10]+datumbis[4]+datumbis[5]+'9999'; 'and Proben.Datum BETWEEN "'+Datumvon+'" and "'+Datumbis+'"' 'and Para.Probennr = Proben.Probennr' 'and Proben.Rabat < 0'); // nur die Proben deren Wert <0 ist sind in der Bearbeitungsphase 'GROUP BY Proben.Probennr, Proben.Rabat'); |
jetzt habe ich einen Datensatz (=eine Probe) und weiss nun, dass es auf diese Probe sagen wie 5% Rabat gibt. Ok. Nun will ich die ja auch in die DB eintragen.
das habe ich so versucht:
DatenmodulDruck.DatenDrucken.Query1.FieldByName('Rabat').asinteger:=Rabat;
DatenmodulDruck.DatenDrucken.Query1.append;
und genau das macht er nicht. Daher ist zur zeit der einzige weg den ich halt sehe, ich nehme mit die Probennr, such mir darüber quasie den einen Datensatz noch einmal raus, und schreibe darin, Nur das wäre ja schon sehr umständlich (/Rechenintensive). Daher suche ich halt nach einem Weg der schneller zur Lösung kommt.
Ich hoffe ich konnte so halbwegs ausdrücken was ich machen wollten.
Danke auf jedenfall für deine Hilfe
Chaosworld
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Mi 16.04.03 14:05
Ok, jetzt hab ich dein Problem verstanden. Aber die Lösung die du dir vorstellst, gibt's leider nicht. Eine Abfrage mit Agregatwerten und Gruppierung kannst du nicht aktualisieren.
Das Einzige was du optimieren kannst sind hier dann noch die Zugriffe auf den einzelnen Satz zum aktualisieren. Und das geht bei Paradox mit FindKey noch am schnellsten.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
Chaosworld 
      
Beiträge: 49
|
Verfasst: Mi 16.04.03 18:25
ist es denn möglich die abfrage 2 mal zu erstellen, das 2. mal einfach ohne den Wert der aus der anderen Tabelle kommt?
also so:
Quelltext 1: 2: 3: 4: 5:
| 'SELECT Proben.Probennr, Proben.Rabat 'FROM "'+extractFilePath(ParamStr(0))+'DB\'+edit1.Text[5]+edit1.Text[6]+'\Proben.DB" Proben' 'WHERE Proben.Probennr BETWEEN 1'+datumvon[9]+datumvon[10]+datumvon[4]+datumvon[5]+'0001 and 1'+datumbis[9]+datumbis[10]+datumbis[4]+datumbis[5]+'9999'; 'and Proben.Datum BETWEEN "'+Datumvon+'" and "'+Datumbis+'"' 'and Proben.Rabat < 0'); // nur die Proben deren Wert <0 ist sind in der Bearbeitungsphase |
bei beiden noch eine Order by Probennr einhängen. Und dann einfach einen paralellen durchlauf machen?
Oder kann es da zu problemen kommen?
weil in die 2. Abfrage, mit nur einer Anfrage und ohne Group kann ich dann ja reinschreiben
Aber einen völlig anderen Lösungsweg gibt es nicht, oder?
Ich meine ich hätte kein Problem damit, die Rabat-tabelle als db zu schreiben, einzig wüsste im Augenblick ich nicht, wie ich das genau aufbauen könnte. Aber eine reine SQL-Lösung wäre mir lieber, als die DB mit sql abzufragen, aber die eigendlich Verarbeitung auf prozedualer Eben durchzuführen. Wäre halt doch eine ganze ecke schneller.
MFG
Chaosworld
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Do 17.04.03 07:07
Hi
in dem Moment wo du ein ORDER BY reinschreibst, kannst du die Abfrage schon wieder nicht aktualisieren. Das ist das Problem bei Paradox.
Ich kenn weder die Aufgabenstellung noch das Umfeld, aber vielleicht wäre es sinnvoll die Rabattberechnung nicht gesammelt zu machen, sondern bereits in dem Moment wo eine neue Probe bzw. Parameter in die Tabelle aufgenomen wird?
| Zitat: |
Aber eine reine SQL-Lösung wäre mir lieber, als die DB mit sql abzufragen, aber die eigendlich Verarbeitung auf prozedualer Eben durchzuführen. Wäre halt doch eine ganze ecke schneller.
|
Mit der Äusserung wäre ich an deiner Stelle sehr vorsichtig. Das funktioniert ziemlich zügig solange die Tabelle lokal auf deinem Rechner liegt. Aber stell das ganze mal auf ein Netzwerkverzeichnis und lass da mehr als 200 Datensätze drin sein, dann schläft dir das Gesicht ein.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
Chaosworld 
      
Beiträge: 49
|
Verfasst: Do 17.04.03 11:34
| LCS hat folgendes geschrieben: |
Mit der Äusserung wäre ich an deiner Stelle sehr vorsichtig. Das funktioniert ziemlich zügig solange die Tabelle lokal auf deinem Rechner liegt. Aber stell das ganze mal auf ein Netzwerkverzeichnis und lass da mehr als 200 Datensätze drin sein, dann schläft dir das Gesicht ein.
|
wie meinst du dass?
gerade in einem Netzwerk würde dass doch zu einem kollaps führen, oder? wenn ich da Procedual arbeite, oder? Also noch wird das lokal arbeiten. Allerdings wird es wohl in einigen Monaten auf einen SQL-Server ausgelagert um dann von überall aus dem Netzwerk zuzugreifen.
Ok, wenn es mit dem Order-befehl nicht geht, und ich lasse einfach den Order-Befehl weg. Kann ich mich dann parallell durchhangeln? Oder ist die Reihenfolge da völlig anders?
MFG
Chaosworld
|
|
LCS
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: Do 17.04.03 12:16
Hi
SQL Abfragen auf eine Paradox-Tabelle im Netz sind der absolute Wahnsinn, weil die von der BDE lokal ausgeführt werden. Das heisst die BDE zieht erst mal die alle Daten aus den betreffenden Tabelle übers Netz, dann wird lokal die Abfrage ausgeführt, das Ergebniss präsentiert und der Rest der Daten verworfen. Was da für ne Netzwerklast entsteht, kannst du dir ja vorstellen.
Wenn du vorhast die Anwendung später auf einen SQL Server umzustellen, dann würde ich das lieber jetzt gleich machen und den Server halt lokal laufen lassen. Bei nem SQL Server würde das ORDER BY nämlich gar nicht stören. Und ne ganze Menge andere Einschränkungen gibts auch nicht. Dafür musst du die ganze Sache teilweise total anders angehen. Der Umstellungsaufwand ist nicht zu unterschätzen.
Gruss Lothar
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|
|