MySQL Einträge ändern

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

MySQL Einträge ändern

Beitrag von pjensen »

Hallo,

der folgende Code läuft und ich kann die Daten sehen.

Der Code

Das Projekt

Aber:
Wenn ich einen Eintrag ändere, dann ändern sich sämtliche Einträge der entsprechenden Spalte auch auf diesen Wert.

Beispiel:

Vorher

In Zeile 1 Spalte 1 auf "kkk" geändert (Company von Zeile 1)

Nachher

Wieso ändern sich sämtliche Einträge der Spalten und nicht nur der, den ich verändert habe?

MfG, P. Jensen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Was passiert ist klar: Es wird intern ein Updatestatement abgesetzt OHNE 'where' Klausel, daher sind alle Spalten betroffen.

Nachdem ich ein MySQL habe, kann ich nur zu folgenden raten:

Erstelle die Tabelle mit einem echten (künstlichen) Primary Key. Nachdem bei dir all Felder den gleichen Inhalt haben könnt dort das DBMS ist Probleme kommen.

Falls Du nicht weisst, was du als Primary nehmen sollst, speichere einfach eine GUID ab. Die ist unique, und kann auch mit Lazarus einfach auf allen Plattformen erzeugt werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Also das mit der GUID ist jawohl mit Kanonen auf Spatzen geschossen, du brauchst schon ewig um eine zu generieren. Mittlerweile bietet jedes grössere DBS AutoInc Felder an die sind für sowas wesentlich besser geeignet.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Beitrag von pjensen »

@ af0815

Hallo, vielen Dank für die Antwort.
Das klingt zwar mich mich sehr plausibel, aber ich verstehe es nicht,

Ich habe erstmal die Tabelle gelöscht und eine neu erzeugt (phpmyadmin).
Hierbei ein Index mit autoincrement dabei. Ist das so richtig?

Clients jetzt mit Index

Bei dem Verändern dieser Tabelle passiert allerdings das gleiche.

Wie und wo muß ich jetzt das "Where..." einbauen, damit das update klappt. ??
Und was muß da stehen ??

Übrigens, manchmal gibt es beim Verändern eine Fehlermeldung. Ich kann das nicht genau rekonstruieren, aber ich glaube, wenn man die letzte Spalte ändert kommt dieser Fehler oft. Ich nehem an, dass das auch mit dem o.g. Fehler zu tun hat?

Hier der Fehler


MfG, Peter

P.S. jedenfalls habe ich mir gerade eine Anfängerlektüre für mysql bestellt....

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

@pjensen
Die Tabelle schaut ok aus. Vor allen ist jetzt eine Spalte dabei anhand das DBMS eindeutig festsellen kann, welche Reihe wirklich gemeint ist.

Dein Problem hängt sehr wahrscheinlich mit der Errormessage zusammen. Sie sagt aus, das er mit einem Teil des an das DBMS übertragenen Befehls was nicht anfangen hat können - wenn es die 'where' Einschränkung betrifft, so hast du das beobachtete Verhalten.

Die Frage ist jetzt eher, warum die Verbindung nicht richtig funktioniert (Fehlermeldung). Denn Du verwendest einen 5.0.45 Mysql und eine MySQL50 Connection, das sollte zusammenpassen. Lt. Fehlermeldung hat er aber genau da die Probleme. Ich glaube darauf sollte man momentan den Fokus legen, dann wird das Beispiel auch laufen.

Übrigends kann ich das obige Projekt nicht öffnen. Kannst Du es herunterladen und ausprobieren zu öffnen ?!

@Christian
Ich kann rasch eine GUID generieren

Code: Alles auswählen

unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls, Buttons;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
 lGUID : TGUID;
 
 
implementation
 
uses GUIDutils;
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 CreateGUID(lGUID);
 Label1.Caption := GUIDtoStr(lGUID);
end;
 
 
initialization
  {$I unit1.lrs}
 
end.


Code: Alles auswählen

unit GUIDutils;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 
function GUIDtoStr(aGUID : TGUID):string;
 
 
implementation
 
function GUIDtoStr(aGUID : TGUID):string;
begin
  result := IntToHex(aGUID.D1,8) + '-' +
            IntToHex(aGUID.D2,4) + '-' +
            IntToHex(aGUID.D3,4) + '-' +
            IntToHex(aGUID.D4[0],2) +
            IntToHex(aGUID.D4[1],2) +'-' +
            IntToHex(aGUID.D4[2],2) +
            IntToHex(aGUID.D4[3],2) +
            IntToHex(aGUID.D4[4],2) +
            IntToHex(aGUID.D4[5],2) +
            IntToHex(aGUID.D4[6],2) +
            IntToHex(aGUID.D4[7],2);
end;
 
end.


.Weiters haben nicht alle Systeme autoinc und oft sind autoinc-Felder nicht die beste Wahl. Die Diskussion darüber ist sicherlich NICHT in diesem Thread zielführend.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Beitrag von pjensen »

@af0815

Das Projekt ist ein ZIP. Wenn ich drauf klicke, öffnet sich automatisch der Entpacker. Wenn ich mit gedrückter Shift-Taste draufklicke, geht es zum Download des ZIPs. (SUSE 10.2 / KDE / Konqueror)

Wenn das mit gedrückter Shift-Taste bei Dir nicht funktioniert, dann schicke bitte eine mail an p.jensen@gmx.de, dann schicke ich Dir das Projekt per mail.


Ich glaube, daß der Fehler irgendwo aufgrund eine fehlenden SQL-Befehls herrührt. Ich habe aber kein SQL-Befehl im Quellcode (siehe in meine Anfangsfrage - Der Code)

MfG, Peter

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Was mir aber bei der Durchsicht abgeht ist folgendes:
Damit Du einfügen, löschen und ändern kannst, musst Du die Eigenschaften DeleteSQL, InsertSQL und UpdateSQL richtig befüllen. Dort ist aber bei Dir nichts eingetragen, da hilft auch das Umstellen der Eigenschaft UpdateMode alleine nichts.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Beitrag von pjensen »

Ach so.

Bitte sag mir als Anfänger, was da stehen muß bei UpdateSQL.

MfG, Peter

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Beitrag von pjensen »

@af0815

Ist mit der GUID das hier gemeint?

Wenn ja dann brauche ich das jetzt nicht, weil in der Datei eine autoincrement-Index steht, richtig?

P. Jensen

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Beitrag von pjensen »

@af0815

Im Code ist SQLQuery1.UpdateSQL nicht definiert.

Jetzt habe ich mal das logfile von mysql bemüht.

Bitte klicke mal hier drauf. Die ersten Einträge sind nur zur Belustigung. Wenn Du ganz nach unten scrollst, wird es interessant.

Ich habe den ersten Eintrag der Ersten Zeile von "aaa" auf "111" geändert.
Jetzt werden alle Einträge der Spalte Company, die als Inhalt "aaa" haben, auf "111" geändert.
(Set Company ='111' ... Where Company='aaa')

Soweit richtig verstanden??

Jetzt muß ich also dafür sorgen, dass jeder Eintrag des Grids ,oder zumindest jeder, der verändert wurde, nur einzelnd verändert wird. Dafür der Index.Ich muß also Die Zuordnung von Zeile + Spalte über das Index mit nem MySQL-Befehl selber erstellen, weil das Grid dies nicht selber macht?

Also sinngemäß: SET Company= (Das was da im Grid steht) where Index = 1 für die erste Spalte und so weiter... Für alle Spalten und alle Zeilen ??

Gibts da einen MySQL-Befehl für? Wie lautet der?

Sollte das Grid sowas nicht automatisch machen?
Es ist doch logisch, daß ich in der Datenbank nur das an entsprechender Stelle geändert haben will, was ich im Grid an entsprechender Stelle verändert habe.

Fragen über Fragen

:wink:

MfG, Peter

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Jetzt muß ich also dafür sorgen, dass jeder Eintrag des Grids ,oder zumindest jeder, der verändert wurde, nur einzelnd verändert wird. Dafür der Index.Ich muß also Die Zuordnung von Zeile + Spalte über das Index mit nem MySQL-Befehl selber erstellen, weil das Grid dies nicht selber macht?

Also sinngemäß: SET Company= (Das was da im Grid steht) where Index = 1 für die erste Spalte und so weiter... Für alle Spalten und alle Zeilen ??

Genau, du hast es treffend beschrieben.
Gibts da einen MySQL-Befehl für? Wie lautet der?


Es gibt keinen Befehl dafür, das ist auch unnötig, da genau dieses die sogenannte 'where' Klausel macht. 'Where' ist eine Einschränkung und kann bei Befehlen wie 'Select, Update, Delete' verwendet werden.

Dir Frage bei Dir ist jetzt, WARUM kommt zum Server nicht das richtige Statement. Jetzt vermute ich mal, das die Komponenete probiert hat, mit den unvollständigen Konfiguration irgendetwas zu machen und das ist das Problem.

Mal sehen, ob ich da weiterhelfen kann. Ich habe derzeit keinen Mysql und muß erst ein System einrichten, um die noch (sicherlich) kommenden Fragen beantworten zu können. Ausserdem will ich mal sehen, ob ich mit den Datenbankverbindungen im Lazarus umgehen kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Beitrag von pjensen »

Ja, Deine Hilfe wäre mir sehr willkommen, da ich hier ansonsten nicht weiter komme...

Bei http://www.lazarus.freepascal.org finde ich auch nichts, was mir weiter hilft. Ich finde auch nirgends ein Beispiel, daß eine Grid richtig updaten kann, so daß ich darauf aufbauen kann. Mein code baut auf einem Beispiel auf das MySQL5Test heißt. Dies macht aber genau den gleichen Fehler.

In der unit sqldb steht u.a die unten stehende Procedure. Ohne das jetzt genau zu verstehen, sieht es für mich so aus, als wenn die genau das macht, was ich eigentlich brauche. Trotzdem funktioniert es nicht...

snip>-----------------------------------------------
Procedure TSQLQuery.ApplyRecUpdate(UpdateKind : TUpdateKind);

var
s : string;

procedure UpdateWherePart(var sql_where : string;x : integer);

begin
if (pfInKey in Fields[x].ProviderFlags) or
((FUpdateMode = upWhereAll) and (pfInWhere in Fields[x].ProviderFlags)) or
((FUpdateMode = UpWhereChanged) and (pfInWhere in Fields[x].ProviderFlags) and (fields[x].value <> fields[x].oldvalue)) then
sql_where := sql_where + '(' + fields[x].FieldName + '= :OLD_' + fields[x].FieldName + ') and ';
end;
snap>-----------------------------------------------



MfG, Peter

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Okay, ich glaube,das wir da auf einen grünen Zweig kommen werden. Bin gerade dabei MySQL & Apache & PHP auf einem SuSe 10.2-System zu installieren. Wird also ein wenig dauern. (Edit: Langsam wirds)

Was willst du eigentlich genau machen ?! Einarbeiten in DB ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

pjensen
Beiträge: 77
Registriert: Fr 27. Jul 2007, 08:43
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Nahe Flensburg

Beitrag von pjensen »

1) Ich habe mal im Studium recht intensiv mit Pascal gearbeitet (TP 4..TP6, soweit ich mich erinnere :) ) . Grundsätzlich reizt es mich, mit Pascal + mysql mal was zu machen.

2) Wenn man das dann auch noch gebrauchen könnte, um so besser. Bin seit Suse 6.4 weg von Windows, soweit es geht, es fehlen eben immer noch diverse Anwendungen unter Linux....

Eine für mich sehr interessante Anwendung:
Ich arbeite jetzt als Freiberufler (Elektro-Ing) und muß laufend Briefe (z.B. Angebote, Infos etc.) an Kunden schreiben. 90% der Briefe sind Standart-Texte, 8 verschiedene Versionen.Das mache ich derzeit mit OpenOffice.

Eine Tabelle mit
Name, Adresse, Wohnort, Bemerkung, etc. Dann trage ich während des Telefonats ein paar Daten ein. Anschließend nehme ich einen vorgefertigten Brief, ändere nur Name, Adresse etc. Jetzt muß ich immer ein neues Verzeichnis erstellen, den Brief darin abspeichern & drucken. Ich finde das sehr nervig und unbefriedigend.... und fehlerträchtig obendrein (z.B. mal wieder nen alten überschrieben und abgespeichert....)

Ich hatte mich mal mit verschieden CRM, versucht, waren für mich aber viel zu überfrachtet (und langsam, weil im Browser).

=> Ich brauche eine einfache Adress-Datenbank, in der ich die Einträge schnell verändern kann, wahlweise in einer Liste oder in einer Maske.
Dann einfach mit einem Mausklick einen Brief ausdrucken, z.B. während des Telefonats. Diese Tabelle sollte auch nach verschiedenen Dingen gefiltert werden können.

Da Du ja wie ich SUSE10.2 hast: Schau Dir mal das Adressbuch von KDE an. Genau so in der Art brauche ich das. Hier fehlen vereinfacht gesagt nur noch 10 Buttons: Brief1..Brief10 drucken. Oder ein Button: KundeXY-Termin an... um...

MfG, Peter

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6209
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Beitrag von af0815 »

Na dann werden wir sehen was wir zusammenbringen. MySQL läuft mittlerweile, Deine Daten habe ich auch eingespielt, am Abend mach ich dann mal den Lazarus mit der DB bekannt. Dann kann ich dir wahrscheinlich mehr sagen.

Für das Design wär es gut, bereits jetzt den eventuell gewünschten Umgfang wirklich festzulegen. Ein Herumgebastel führt bei einer DB immer Richtung Chaos. Wenn man beim Design ein gesundes maß an 'Was wäre wenn' schon vorsehen kann, ist das Design später auch stabiler.

Es soll also Adress-Datenbank, Termine und an OOP übergeben können ?!
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten