AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Kundenliste

Ein Thema von EdAdvokat · begonnen am 14. Apr 2017 · letzter Beitrag vom 22. Apr 2017
Antwort Antwort
Seite 7 von 10   « Erste     567 89     Letzte »    
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#61

AW: Kundenliste

  Alt 19. Apr 2017, 22:15
Das ParseSQL ist immer noch doppelt
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#62

AW: Kundenliste

  Alt 20. Apr 2017, 05:11
Habe die Variante von K-H (p80286) ohne die Zeilen zqryMain.params.parseSQL(zqryMain.sql.text, True); eingefügt und geprüft.
Hinzufügen- DS erhält ID -1 und wird gespeichert danach ID der DB, also nicht mehr -1 , also ok.
Bearbeiten- DS wird verändert und nach Speichern und laden ist der veränderte DS in der veränderten Form vorhanden, also auch ok.
löschen- DS wird gelöscht und erscheint nicht mehr in der ListView. SaveToDB aufgerufen. Nach loadFromDB ist er jedoch wieder da????? warum????
Das hängt doch wohl mit dem Löschvorgang zusammen. Alles klappt nur das löschen nicht.
Ich will mir das nochmal im Debugger ansehen und werde daher einen Haltepunkt auf if lvCustomer.selected<>nil in deer procedure ... btnDelete setzen und sehen was passiert.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#63

AW: Kundenliste

  Alt 20. Apr 2017, 06:26
Beim Einfügen machst Du ein INSERT, beim Ändern ein UPDATE. Wie kommst Du jetzt darauf, dass ein Datensatz ohne DELETE aus der DB verschwinden sollte?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.733 Beiträge
 
Delphi 6 Enterprise
 
#64

AW: Kundenliste

  Alt 20. Apr 2017, 07:58
Blätter mal ein zwei Seiten zurück. Da haben Hobbycoder (meine ich) und ich dich schon mehrfach darauf hingewiesen, dass genau das passieren wird mit dem Löschen und auch warum. Darüberhinaus haben wir auch Lösungsansätze genannt. Fasse aber nochmal zusammen:

Hintergrund. Du löschst das aus der CustomerList. Dann rufst du SaveToDB auf, dabei werden alle Einträge der CustomerList entweder neu "Inserted" (wenn ID=-1) oder "Upgedated". Aber was passiert mit Einträgen die nicht mehr in der CustomerList sind, da gelöscht? Natürlich nix.

Mögliche Lösungsmöglichkeiten (s.o.):
a) Beim Delete der CutomerList den Datensatz gleich in der DB mit löschen

b) Bei SaveToDB erstmal einen Teil einbauen, der alle Datensätze in der Db löscht, bevor SaveToDB dann wie gehabt ausgeführt wird.

c) Eine zweite Liste ala DeletedCustomers führen (innerhalb der CustmerList Klasse?) und beim Deleten eines Customers diesen (oder seine ID) da eintragen, bevor er aus der eigentlichen CustomerList gelöscht wird. Bei SaveToDB zunächst wie gehabt vorgehen, dann für alle Elemente in DeletedCustomers ein Delete-Statement an die DB schicken.

d) Dem CustomerObjekt eine neue Eigenschaft "Status" oder so mitgeben, die (nur als Beispiel) beim Laden erst mal auf 0 gesetzt wird. Wird der Cutomer bearbeitet (oder neu angelegt) auf 1 setzen, wird er gelöscht auf -1 setzen. Dann in SaveToDG erst gucken ist Status 0 - nichts machen. Ist Status -1 - Delete Statement absetzen, ist Status 1 - schauen ist ID-1 - Insert Statement, sonst Update Statement.
Das heißt natürlich auch, dass ein Custumer in der CustomerList nicht mehr gelöscht wird, sondern nur sein Status auf -1 gesetzt wird.


a) b) und c) sind am einfachsten umzusetzen, b) ist aber mMn am Besten, weil beim speichern nicht immer alle Datensätze in die DB geschrieben werden, nur die, wo sich was ändert. Das macht SavToDB viel schneller. (Warnung: Dabei sind als Folge aber die CustomerList und die ListView ggf. nicht mehr synchron!!!).
Ralph

Geändert von Jumpy (20. Apr 2017 um 08:04 Uhr)
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
930 Beiträge
 
#65

AW: Kundenliste

  Alt 20. Apr 2017, 09:23
Also mal so generell:
Ein Programm folgt immer der Logik des erstellten Sourcecode, und das peinlich genau. Es berücksichtigt nur die Funktionen, die du ihm mitgibst.
Das heißt im Umkehrschluss, dass es deine Aufgabe als Entwickler ist, alle benötigten Funktionen bereitzustellen und alle Eventualitäten zu berücksichtigen.
Also musst du als allerersten einmal dir alle Funktionen, die dein Programm erfüllen soll, definieren (auf Papier, oder im Kopf). Dann jede Funktion in kleineren Einzelschritte zerlegt, deren Aufgabe möglich klein und unabhängig vom Gesamtergebnis sind.
Das so wie bei einem Architkten. Als erstes legt er erst eine Gundsätzlichen Grundriss fest, auf Basis der Anforderungen an das Gebäuse. Erst danach werden die Detail der einzelnen Räume festgelegt. Anschließend werden für die Gewerke die Anforderungen z.B. die Art und Maße der Fenster festgelegt, die an den Glaser übergeben wird, damit er die Fenster fertigen kann, ohne aber das Gebäude zu kennen.

Wird jetzt aber vom Architekten etwas vergessen, z.b keine Türen, dann hat das Haus hinterher halt keine Türen. Das ist aber dem Glaser, Elektriker und Maler total egal.

Soll unterm Strich heißen, mach dir einen Plan. Denk über alles in Ruhe nach, und gehe jeden Schritt einzeln durch, und prüfe, ob er unabhängig vom Rest das macht, was er soll, und ob du dabei nicht irgendwas vergessen hast.
Nimm dir die Zeit zu verstehen wie alles funktioniert und auch warum jetzt das eine oder andere nicht funktioniert. Wenn du die Funktionsweise von etwas nicht verstehst oder du unsicher bist, dann mach die dir erst mal klar. Es gibt Unmengen Tutorials im Internet zu SQL, Objektlisten und Datenverwaltung.
Und die Hinweise, die du hier erhältst, solltest du auch nicht blind reinkopieren, sondern deren Sinn verstehen und dann selbst umsetzten.
Auch der Umgang mit dem Debugger sollte dir geläufig sein, den er ist das beste Hilsmittel bei deiner Suche nach deinen Fehlern.
Das kann die keiner abnehmen.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#66

AW: Kundenliste

  Alt 20. Apr 2017, 10:56
Das ParseSQL ist immer noch doppelt
Eigentlich nicht, da in beiden fällen die Anzahl der Parameter unterschiedlich ist.
Nur warum bin ich bisher ohne ausgekommen?

@Jumpy
@Hobbycoder


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#67

AW: Kundenliste

  Alt 20. Apr 2017, 10:58
Eigentlich doch, sowohl im if wie auch im else steht
Zitat:
zqryMain.params.parseSQL(zqryMain.sql.text, True);
Hätte ja genügt, das nach der Fallunterscheidung aufzurufen, so man es denn braucht.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#68

AW: Kundenliste

  Alt 20. Apr 2017, 11:04
da steh ich jetzt auf der Leitung.
Je nachdem wird ID übergeben oder nicht, sprich wenn man schon parsed (warum auch immer), sollte man das vor der Wertzuweisung machen? und da unterschiedliche Anzahl von Parametern ebenfalls getrennt!?
Was spricht gegen rausschmeißen? Wofür ist das gut?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#69

AW: Kundenliste

  Alt 20. Apr 2017, 11:16
Zitat:
Wofür ist das gut?
...für nix.
http://www.delphipraxis.net/1368015-post36.html
...das hatte ich schon im Post #34 "korrigiert" auf ParamByName.(XXX).As...
Hinweis: Damals war noch der Fehler drin mit dem > -1 vertauscht und dem nicht Löschen aus der DB.

Geändert von haentschman (20. Apr 2017 um 11:19 Uhr)
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
414 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#70

AW: Kundenliste

  Alt 20. Apr 2017, 12:33
Vielen Dank für Eure Geduld und Hilfe. Mir ist nicht entgangen, dass ich versucht habe in einer Liga mitzuspielen, die nicht meine ist. Meine Defizite sind mir bewußt und ich habe bereits darauf hingewiesen, dass ich erst einmal untertauchen werde, um mein Wissen zu vervollkommnen. Hoffentlich finde ich entsprechende Tutorials in deutsch, die mich voranbringen.
Mit entsprechenden Büchern werde ich wohl wenig Glück haben, denn all die, die da in Frage kommen gehen auf derartige Fragen nicht ein.
Eigentlich habe ich in den vorangegangenen Äußerungen meine Vorstellungen zum aktuellen Projekt umrissen und die geplante Funktionalität für das von mir erdachte Übungsprojekt dargelegt. Ziel war und ist es, am praktischen Beispiel zu lernen.
Leider finde ich im Internet wenig Source-Code zu diesen Fragen, anhand derer ich bestimmte Abläufe ablesen könnte. Die sture Theorie ist das eine, doch wenn es praktisch wird, sieht die Welt ganz anders aus.
Ich habe nicht abschätzen können, wie kompliziert diese, meine Vorstellung von einem einfachen Übungsprogramm ist, dass Daten aus einer DB liest, in ein Listview schreibt, die Möglichkeit hat neue Datensätze zu erstellen, zu verändern und zu löschen(!!!).
Ich habe mir die vorangegangen Beiträge von euch mehrfach durchgelesen und jeweils erst einmal das für mich wichtigste zur Vervollkommnung der Funktionalität ausgewählt, ohne die Hinweise einfach abzubuchen. Sicher sind nach Stunden und Tagen intensiver Beschäftigung mit dieser Sache auch Fehler gemacht worden.
Nach dem hin und her des Probierens wußte ich oft nicht mehr weiter, weil alles in die Leere lief.
So werde ich also auch dieses "kleine Programmchen" unvollendet lassen müssen, denn die wirklich gut gemeinten Hinweise reichen mir noch nicht aus. So habe ich versucht den Punkt a) von Jumpy (a) Beim Delete der CutomerList den Datensatz gleich in der DB mit löschen) umzusetzen mit

Delphi-Quellcode:
procedure TFRMMainCustomer.btnDeleteClick(Sender: TObject);//löschen (update)
begin
   if lvCustomer.Selected<>nil then
  begin
    CustomerList.Delete(lvCustomer.Selected.Index); //akt. Datensatz löschen
    CustomerList.SavetoDB(conMain);
    FuelleListView;
  end;
end;
Das bringt leider die gleiche Situation. Muss es wohl auch, denn ich packe den Löschvorgang nur gleich nach dem Löschen in der CustomerList. Sicher habe ich da auch wieder was nicht richtig verstanden.
Den Punkt b (b) Bei SaveToDB erstmal einen Teil einbauen, der alle Datensätze in der Db löscht, bevor SaveToDB dann wie gehabt ausgeführt wird.) verstehe ich nicht. Wie und warum sollte ich alle Datensätze löschen
bevor SaveToDB ausgeführt wird? Etwa in SaveToDB mit SQL-Statement ...SQL.text:='Delete * FROM .... Diese Lösung wird von Jumpy favorisiert. Da stehe ich wie die berühmte Kuh vor dem neuen Tor.
Mit c) und d) geht es mir genauso. Bis vor kurzem war mir eine Objectlist völlig unbekannt, dann habe ich dazu einiges gelesen und hier versucht es umzusetzen. Dann kam die Problematik "generische Liste" dazu, ein Thema
zu dem man fast überhaupt nichts findet. Nun sollte ich eine zweite Liste ala DeletedCustomers führen...und beim Deleten eines Customers diesen oder die ID dort eintragen. Das ist sicher alles richtig, doch gibt es bei Euch eine Vorstellung
darüber, wie jemand das verstehen soll, der eigentlich überhaupt keine Vorstellung von einer generischen Liste hat und vermutlich auch kaum bekommen wird. (Ich habe im Internet gesucht und gesucht nach einer vernünftigen Erklärung dazu, doch ohne Erfolg.
So kommt eins zum anderen. Ich habe bereits dargelegt, dass ich überhaupt nicht aus der Informatikerecke komme und das hier lediglich als Hobby betreibe, ohne jeglichen kommerziellen Gedanken.
Auch die Lösung c) wäre eine einfache. Für mich unlösbar, weil ich überhaupt nicht überschauen kann, was ich ansatzweise machen könnte, trotz Grundwissen in OOP.
Vormals wurde auch vermutlich von Hobbycoder erwähnt, dass ich eine Methode Delete überschreiben sollte... Auch dieser gut gemeinte Rat ist nicht untergegangen, doch auch hier weiss ich nicht, wie das gemeint ist.
Nun bin ich doch wieder bei diesem unvollendeten Projekt, weil ich bedauere es einfach in die Ecke zu werfen, weil dieses blöde löschen nicht klappt.
Ich wollte all dies mal loswerden und mich nochmals herzlich bei euch für eure Geduld und Nachsicht bedanken. Ich habe trotzdem vieles gelernt und werde mir alle vorangegangen Beiträge nochmals einziehen.
Für meine Defizite im Wissen um diese Fragen bin ich selbst verantwortlich und will keineswegs irgendjemanden etwas vorwerfen. Ihr habt viel Geduld mit meiner Aufdringlichkeit gezeigt.
Ich wäre jedoch dafür dankbar, wenn mir jemand einen oder mehrere gute Tips und Links zu deutschen Tutorials oder Literatur geben könnte. Danke!
Norbert
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 7 von 10   « Erste     567 89     Letzte »    


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 18:07 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