Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-String zu lang ? (https://www.delphipraxis.net/109123-sql-string-zu-lang.html)

Smiley 24. Feb 2008 23:52

Re: SQL-String zu lang ?
 
Was wollen uns diese Wore sagen ???
Erinnert mich irgendwie an Drachensprache.

omata 24. Feb 2008 23:54

Re: SQL-String zu lang ?
 
Oh, da kann man ja gratulieren.
Herzlichen Glückwunsch zum runden Geburtstag :cheer:

Viele Grüsse
Thorsten

Hansa 25. Feb 2008 00:03

Re: SQL-String zu lang ?
 
So ein Zufall. Glückwunsch, 50 Jahre überstanden. :mrgreen: Du bist somit viel älter als Access oder BDE. Rest steht im Beitrag. :lol:

sx2008 25. Feb 2008 06:27

Re: SQL-String zu lang ?
 
Eine Monster SQL-Anweisung. Da muss eigentlich eine Stimme sagen "da stimmt was am Design nicht".
Ich würde ein Grossteil der Felder in einer weiteren Tabelle abspeichern.

ich muss jetzt etwas verallgemeinern...

Code:
Artikeltabelle
==============
IdArtikel | Bezeichnung | Preis | Hersteller | ...

Attribute
=========
IdAtribut | Name
        1 | Bildbeschreibung
        2 | Farbe
        3 | Baujahr von

ArtikelAttribute
================
IdArtikel | IdAttribut | Wert
-----------------------------
4711      | 2          | rot-grün
4711      | 1          | E-Lok 2000 auf Abstellgleis
4711      | 3          | 1956
Also es gibt eine Artikeltabelle (bei dir "Kataloge") in der sind nur die wichtigsten Felder.
JEDER Artikel hat eine Bezeichnung und einen Preis.
Aber nur ganz wenige Artikel haben einen Stromabnehmer !!!
Deshalb werden diese Info's in der Untertabelle "ArtikelAttribute" gespeichert.

marabu 25. Feb 2008 10:40

Re: SQL-String zu lang ?
 
Hallo Smiley,

auch von mir alles Gute zu deinem Geburtstag.

Und noch ein paar Anmerkungen zu diesem Thread: Für das Duplizieren eines einzigen Datensatzes ist SQL nicht erste Wahl, insbesondere wenn du den für den neuen Datensatz automatisch vergebenen Schlüssel benötigst. Was deine Datenmodellierung angeht, so hoffe ich einfach mal, dass dir jemand zum Geburtstag ein gutes Buch zu diesem Thema geschenkt hat.

Delphi-Quellcode:
function DuplicateRecord(
    ds: TCustomADODataSet;
    pkName: string;
    pkValue: Variant;          // null means current record
    fieldNames: TStrings = nil // nil means no field restrictions
): Variant;
var
  dsClone: TADODataSet;
  f: TFields;
  i: Integer;
begin
  if not ds.IsEmpty
  and ((pkValue = null) or ds.Locate(pkName, pkValue, [])) then
  begin
    dsClone := TADODataSet.Create(ds.Owner);
    dsClone.Clone(ds);
    f := ds.Fields;
    ds.DisableControls;
    try
      ds.Insert;
      for i := 0 to Pred(ds.FieldCount) do
        if not SameText(f[i].FieldName, pkName)
        and (not Assigned(fieldNames) or (fieldNames.IndexOf(f[i].FieldName) >= 0)) then
          f[i].Value := dsClone.FieldByName(f[i].FieldName).Value;
      ds.Post;
      Result := ds.FieldByName(pkName).Value;
    finally
      ds.EnableControls;
      dsClone.Free;
    end;
  end else Result := null;
end;
Freundliche Grüße

Smiley 25. Feb 2008 13:26

Re: SQL-String zu lang ?
 
Vielen Dank für die Geburtstagsgrüße.

Dass diese Methode noch nicht optimal ist dachte ich mir schon, aber das war bisher das beste Ergebnis aus meiner Anfrage im letzten Thread
siehe Hier im Forum suchenADO Daten in gleicher Tabelle kopieren.

@SX2008
Du meinst, dass ich die Daten als Detailtabelle ablegen soll, das macht aber keinen Sinn, da Ein Datensatz alle diese Felder enthält und nicht nur einige.
Bei größeren Projekten ist es doch normal, dass ein Datensatz auch mal viele Felder enthalten kann.
Die Methode mit dem Insert Into war die beste (einzige) die mir bisher angeboten wurde.

@marabu
Dass Du wieder mal die perfekte Lösung aus dem Ärmel schüttelst war ja klar. (Immer diese Profis)
Danach hatte ich ja in dem anderen Thread gefragt, eine Lösung bei der ich die Felder in einer Schleife abfrage und kopiere.
Kann es sein, dass der Clone-Befehl eine spezielle Funktion von Access oder ADO ist?
Danke für diesen Tip, Deine Ratschläge sind immer wieder grandios.

@Hansa
Meine Anwendung ist eine Einzelplatzlösung, ich glaube nicht, dass dort eine StoredProcedure benötigt wird, besonders wenn es nur ein einmaliger Forgang ist, die daten einzulesen.

Es geht mir hierbei nicht um die Lösung speziell dieses Problemes sondern prinzipiell darum wie man es am besten machen kann und welche verschiedenen Möglichkeiten es dafür gibt.
Ich will das dann ja auf andere Projekte auch wieder anwenden können.
Im Moment arbeite ich erst mal an kleinen Projekten mit einem bis drei Benutzern.
Wenn ich die Grundlagen besser drauf habe, dann kann ich mich auch tiefer in die SQL-Client-Server Technik und Optimierung einarbeiten.

Mein Hauptproblem wodurch dies hier alles erst entstanden ist, ist aber viel schlimmer.
Das alles ist eine ungünstige Lösung für folgendes Problem:
Ein Formular mit 60 Datenbank-Feldern, davon 38 DBComboboxen. (schlimm genug)
Alle Daten sollen in einer Access Datenbank verwaltet werden, also auch die Daten der DBComboBoxen.
Daher hab ich für jede DBComboBox eine Tabelle angelegt.
Dies ist keine sehr tolle Lösung, ging aber schnell und es wird alles automatisch verwaltet.
Man könnte jetzt alle Comboboxinhalte in eine Tabelle legen mit dem comboboxnamen dabei, dann muss ich aber jede Combobox einzeln füllen,
das finde ich nicht lustig, es sei denn ich kann es mit einer ebenso genialen Technik machen wie marabu sie hier mit dem Datenkopieren gemacht hat.
Also alle Comboboxen suche, alle inhalte pro combobox aus tabelle lesen und damit die Combobox füllen.
Das ganze im Formcreate vom Hauptformular.
Ist diese Lösung vernüftig, oder gibt es noch was besseres ?

Hansa 25. Feb 2008 13:32

Re: SQL-String zu lang ?
 
Ähmm, was haben Parameter mit SPs zu tun ? Nicht Ursache und Wirkung verwechseln ! Du schließt anscheinend daraus, dass es bei SPs Parameter gibt, darauf dass Parameter nur bei SPs vorkommen ? :gruebel: Die gibts auch bei einem normalen Select Statement. In Delphi also auch innerhalb des SelectSQL des Datasets, wie in deinem Source.

Edit : sehe gerade, dass Add schon verwendet wird. Omata hat das wieder zusammengebaut. Dann mache doch die Add-Zeilen etwas kürzer, wenn nicht sogar pro Feld ein Add.

omata 25. Feb 2008 14:03

Re: SQL-String zu lang ?
 
Nur nebenbei: ich hasse Add im Zusammenhang mit einer SQL-Anweisung.
Und wie immer der Hinweis: Nimm Append anstelle von Add!
Add = Funktion
Append = Prozedur

Gruss
Thorsten

Hansa 25. Feb 2008 16:16

Re: SQL-String zu lang ?
 
Er soll das schon so machen (siehe Delphi-Hilfe) :

Delphi-Quellcode:
var

  StringList: TStrings;
begin
  StringList := TStringList.Create;
  try
    with StringList do begin
      Add('This example uses A string List.');
      Add('It is the easiest way to add strings');
      Add('to a combobox''s list of strings.');
      Add('Always remember TStrings.Create method');
      Add('is abstract; So use TStringList.Create');
      Add('method instead.');
    end;
    with ComboBox1 do begin
      Width := 210;
      Items.Assign(StringList);
      ItemIndex := 0;
    end;
  finally
    StringList.free;
  end;
end;
Der Rückgabewert ist hier wohl uninteressant. Also ist in diesem Fall Append = Add.

Zitat:

Rufen Sie Add auf, wenn am Ende der Liste ein String hinzugefügt werden soll. Add gibt den Index des neuen Strings zurück.

omata 25. Feb 2008 16:54

Re: SQL-String zu lang ?
 
Das ist mir schon klar, das hier meine eigentliche Intention nicht verstanden wird. Also macht weiter mit euren Frikel-Lösungen

Gruss
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 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