![]() |
Re: SQL-String zu lang ?
Was wollen uns diese Wore sagen ???
Erinnert mich irgendwie an Drachensprache. |
Re: SQL-String zu lang ?
Oh, da kann man ja gratulieren.
Herzlichen Glückwunsch zum runden Geburtstag :cheer: Viele Grüsse Thorsten |
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:
|
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:
Also es gibt eine Artikeltabelle (bei dir "Kataloge") in der sind nur die wichtigsten Felder.
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 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. |
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:
Freundliche Grüße
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; |
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 ![]() @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 ? |
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. |
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 |
Re: SQL-String zu lang ?
Er soll das schon so machen (siehe Delphi-Hilfe) :
Delphi-Quellcode:
Der Rückgabewert ist hier wohl uninteressant. Also ist in diesem Fall Append = Add.
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; Zitat:
|
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. |
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