Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Stringgrid oder dbgrid (https://www.delphipraxis.net/184349-stringgrid-oder-dbgrid.html)

Luckner 19. Mär 2015 17:02

AW: Stringgrid oder dbgrid
 
Hallo Perlsau, Sir Rufo,

ich lege neuen Auftrag an und habe erstmal keine neue ID. Die erzeuge ich erst beim Speichern. Sir Rufo, die neue ID=0 ist klar, aber was passiert wenn 2 oder mehr Anwender gleichzeitig neue Aufträge anlegen?
Luckner

mkinzler 19. Mär 2015 17:04

AW: Stringgrid oder dbgrid
 
Beim Speichern wird dann ein eindeutiger Schlüssel generiert

Perlsau 19. Mär 2015 17:13

AW: Stringgrid oder dbgrid
 
Zitat:

Zitat von Luckner (Beitrag 1294112)
... aber was passiert wenn 2 oder mehr Anwender gleichzeitig neue Aufträge anlegen?

So gleichzeitig, also auf die Millisekunde genau wird das aller Wahrscheinlichkeit nicht passieren. Wichtig ist, daß vor dem Speichern der Positionen in der DB bereits der entsprechende Auftrag mit seiner eindeutigen Id in der DB existiert, damit die Foreign-Keys der Positionen-Tabelle nicht ins Nirwana zeigen und somit die Daten-Integrität gewahrt bleibt.

Sir Rufo 19. Mär 2015 19:42

AW: Stringgrid oder dbgrid
 
Zitat:

Zitat von Perlsau (Beitrag 1294110)
Zitat:

Zitat von Sir Rufo (Beitrag 1294104)
... beim Speichern schreibt man erst den Kopf, bekommt die ID und speichert alle Positionen mit der eben erhaltenen AuftragsID.

Wozu aber dann aber erst die temporären Tabellen in ClientDatasets? Damit man alles mit einer Transaktion übertragen kann?

Damit die AuftragsID erst dann erzeugt wird, wenn der komplette Auftrag gespeichert wird - also so wie gefordert.

Zitat:

Zitat von Perlsau (Beitrag 1294115)
Zitat:

Zitat von Luckner (Beitrag 1294112)
... aber was passiert wenn 2 oder mehr Anwender gleichzeitig neue Aufträge anlegen?

So gleichzeitig, also auf die Millisekunde genau wird das aller Wahrscheinlichkeit nicht passieren. Wichtig ist, daß vor dem Speichern der Positionen in der DB bereits der entsprechende Auftrag mit seiner eindeutigen Id in der DB existiert, damit die Foreign-Keys der Positionen-Tabelle nicht ins Nirwana zeigen und somit die Daten-Integrität gewahrt bleibt.

Immer wenn du denkst, das ist unwahrscheinlich, hast du nach spätestens einem Tag die Erkenntnis, dass es doch wahrscheinlich ist.

Und weil dem so ist, haben die Datenbank-System-Hersteller darauf geachtet, dass eine ID gesichert nur einmal vergeben wird. Darum braucht man sich eben keine Sorgen machen, da kann man auch eine Million Datensätze im exakt gleichen Zeitpunkt in der gleichen Tabelle der gleichen Datenbank erzeugen - aber nicht wundern, dass es etwas dauert, denn der Server verarbeitet diese gleichzeitigen Anfragen nacheinander ;)

Perlsau 19. Mär 2015 21:02

AW: Stringgrid oder dbgrid
 
Zitat:

Zitat von Sir Rufo (Beitrag 1294137)
Zitat:

Zitat von Perlsau (Beitrag 1294110)
Wozu aber dann aber erst die temporären Tabellen in ClientDatasets? Damit man alles mit einer Transaktion übertragen kann?

Damit die AuftragsID erst dann erzeugt wird, wenn der komplette Auftrag gespeichert wird - also so wie gefordert.

Inwieweit ist das wichtig und wer fordert das? Meintest du etwa das:

Luckner: "Der Vorteil von einem Stringgrid ist, dass ich die Zellen füttern kann und erst beim Speichern des Auftrages die Positionen in die Datenbanktabelle schreibe."

Wenn ja, worin besteht dieser Vorteil? Ob du jetzt als erstes die Auftragsdaten eingibst (Kunde, Datum, Verkäufer etc.) und den Auftrag anlegst, bevor du die Positionen abspeicherst, oder ob du das alles erst virtuell machst, um es dann als Ganzes zu speichern, bleibt sich doch gleich. Wenn du natürlich Hunderte oder mehr Fakturisten hast, die den ganzen Tag nichts anderes machen als Aufträge einzugeben, und das auch noch auf einem entfernten Server, wäre es natürlich, um Übertragungs-Ressourcen zu schonen, schon von Vorteil, nicht mehrere Transaktionen pro Auftrag ausführen zu müssen oder sogar mehrere Aufträge in einer Transaktion unterzubringen.

Zitat:

Zitat von Sir Rufo (Beitrag 1294137)
Zitat:

Zitat von Perlsau (Beitrag 1294115)
So gleichzeitig, also auf die Millisekunde genau wird das aller Wahrscheinlichkeit nicht passieren. Wichtig ist, daß vor dem Speichern der Positionen in der DB bereits der entsprechende Auftrag mit seiner eindeutigen Id in der DB existiert, damit die Foreign-Keys der Positionen-Tabelle nicht ins Nirwana zeigen und somit die Daten-Integrität gewahrt bleibt.

Immer wenn du denkst, das ist unwahrscheinlich, hast du nach spätestens einem Tag die Erkenntnis, dass es doch wahrscheinlich ist.

Also das kann ich mir nun beim besten Willen nicht vorstellen, daß ständig Leute zur selben Millisekunde ein und denselben Generator dazu auffordern, eine neue Id zu erzeugen.

Zitat:

Zitat von Sir Rufo (Beitrag 1294137)
Und weil dem so ist, haben die Datenbank-System-Hersteller darauf geachtet, dass eine ID gesichert nur einmal vergeben wird. Darum braucht man sich eben keine Sorgen machen, da kann man auch eine Million Datensätze im exakt gleichen Zeitpunkt in der gleichen Tabelle der gleichen Datenbank erzeugen - aber nicht wundern, dass es etwas dauert, denn der Server verarbeitet diese gleichzeitigen Anfragen nacheinander ;)

Genau: Sogar wenn es tatsächlich einmal vorkommen sollte, daß zwei Fakturisten absolut gleichzeitig die Entertaste drücken, um einen neuen Auftrag anzulegen, und die beiden Transaktionen dann auch noch gleichzeitig auf die Millisekunde genau beim Server eintreffen, wird sich der Server für einen von beiden entscheiden, um ihn als erstes zu bearbeiten bzw. einzutragen. Ansonsten wäre das DBMS Mist.

Sir Rufo 19. Mär 2015 21:44

AW: Stringgrid oder dbgrid
 
Was würde mir ein Auftrag auf dem Server bringen, wo nur der Kopf besteht aber noch keine Positionen?
Oder willst du die Transaktion so lange offen halten, bis alle Positionen drin sind?

Und dann wird der Auftrag abgebrochen und der Datensatz muss gelöscht werden (oder storniert, was aber irgendwie nicht der Wahrheit ganz entspricht, denn der Auftrag ist nie zustande gekommen).

Oder die Anwendung stürtzt ab, Strom fällt aus, etc.

Dann doch lieber alles in einem Rutsch (eine Transaktion) wenn fertig in die Datenbank schreiben. Dann braucht man auch nicht aufräumen, weil man es niemals durcheinander gebracht hat.

Das ist auch der Weg um den Auftrag wieder zu bearbeiten. Alles einlesen, bearbeiten und dann alle Änderungen in einem Rutsch wieder zurück in die Datenbank. Und so ein ClientDataSet bringt dafür schon alles von Haus aus mit.

Perlsau 19. Mär 2015 22:26

AW: Stringgrid oder dbgrid
 
Danke :thumb:

Das hab ich jetzt verstanden :stupid:

Luckner 21. Mär 2015 18:43

AW: Stringgrid oder dbgrid
 
Hallo Sir Rufo,
das ist genau die Erklärung, die ich versucht habe hier zu bringen. Irgenwie tendiere ich deshalb zum Stringgrid. Aber die Handhabe mit so einem Grid ist mir noch völlig schleierhaft. Habe schon einige Sachen probiert, manche Sachen funktionieren auch. Aber so richtig kann ich mit dem Stringgrid nichts anfangen. Zellen füllen schon. Beim Blob wird schon schwieriger. Jetzt habe ich ein TMS.Grid endeckt. Mal schauen.

Luckner.

Sir Rufo 21. Mär 2015 18:58

AW: Stringgrid oder dbgrid
 
Du kannst jedes beliebige Grid nehmen, aber warum nicht beim DBGrid bleiben? Da wird dir vieles schon abgenommen, was du anders erst wieder umständlich implementieren musst.

Es wäre auch sehr hilfreich, wenn man die Delphi-Version wüsste - ganz findige User tragen die Version einfach in ihr Profil ein, schon hat man das immer vor Augen.

Perlsau 21. Mär 2015 19:00

AW: Stringgrid oder dbgrid
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Luckner (Beitrag 1294358)
Beim Blob wird schon schwieriger.

Wenn ich in einem DBGrid z.B. eine Grafik darstellen will, muß ich die selber in die gewünschte Zelle zeichnen. Das gilt dann natürlich auch für's StringGrid. Mein Code für's DBGrid sieht folgendermaßen aus:
Delphi-Quellcode:
Procedure TFormDeckblatt.DBGrid_DeckblattDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
Var
  Bild : TImage;
begin
  If DatMod.Qset_Deckblatt.RecordCount > 0 Then
  Begin
    If Column.FieldName = 'BLATT' Then
    Begin
      Bild := TImage.Create(Self);
      Try
        Bild.Visible     := False;
        Bild.Width       := 300;
        Bild.Height      := 300;
        Bild.Center      := True;
        Bild.Proportional := True;
        Bild.Stretch     := True;
        If DatMod.BlobToImage(DatMod.Qset_Deckblatt.FieldByName('BLATT'),Bild) Then
        Begin
          DBGrid_Deckblatt.Canvas.FillRect(Rect);
          DBGrid_Deckblatt.Canvas.StretchDraw(Rect,Bild.Picture.Bitmap);
        End;
      Finally
        Bild.Free;
      End;
    End;
  End;
end;

Function TDatMod.BlobToImage(Feld: TField; Bild: TImage): Boolean;
Var
  S    : TStream;
  JBild : TJpegImage;
begin
  Result := False;
  IF Feld.IsNull THEN Exit;

  JBild := TJPegImage.Create;
  S    := Feld.DataSet.CreateBlobStream(Feld, bmRead);
  Try
    JBild.LoadFromStream(S);
    Bild.Picture.Bitmap.Assign(JBild);
    Result := True;
  Finally
    S.Free;
    JBild.Free;
   End;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:20 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz