AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Locate oder SELECT / Wie Problem lösen?

Locate oder SELECT / Wie Problem lösen?

Ein Thema von gullatrulla · begonnen am 7. Okt 2007 · letzter Beitrag vom 8. Okt 2007
Antwort Antwort
gullatrulla

Registriert seit: 11. Mai 2004
Ort: Malans (Schweiz)
41 Beiträge
 
Delphi 10.4 Sydney
 
#1

Locate oder SELECT / Wie Problem lösen?

  Alt 7. Okt 2007, 22:19
Datenbank: Firebird • Version: 2.01 • Zugriff über: FibPlus
Hallo zusammen

Es würde mich wirklich interessieren, wie ein Firebird-Crack
folgendes Problem lösen würde:

Es besteht eine TStringlist mit 1000 Einträgen (auch doppelte),
welche in eine Tabelle eingefügt werden sollen.
Aber nur dann wenn diese Einträge in der Tabelle nicht schon bestehen.

Man könnte nun die ganze Tabelle in den Zugriff nehmen und
mittels LOCATE den Wert suchen. Wenn Locate = false liefert
dann würde der Eintrag mittels Append in die Tabelle eingefügt.

Irgendwie habe ich aber das Gefühl, dass dies unter einem Netzwerk
nicht die richtige Lösung ist. (langsam)

Andererseits glaube ich, dass 1000x SELECT auch nicht unbedingt
korrekt ist.

Wie löst Ihr einen solchen Fall.

Herzlichen Dank und Gruss zum voraus
Roland
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.802 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Locate oder SELECT / Wie Problem lösen?

  Alt 7. Okt 2007, 22:24
Am besten mit dem MERGE-Befehl (ab FB2.1)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Locate oder SELECT / Wie Problem lösen?

  Alt 8. Okt 2007, 08:57
Zitat von gullatrulla:
Es besteht eine TStringlist mit 1000 Einträgen (auch doppelte),
welche in eine Tabelle eingefügt werden sollen.
Aber nur dann wenn diese Einträge in der Tabelle nicht schon bestehen.
Ich kenn jetzt die FibPlus nicht so gut.
Aber ich würde den "Holzhammer" nehmen. Immer ein INSERT machen.
Wenn der Datensatz schon besteht, dann wirft FibPlus hoffentlich eine Exception.
Diese kann man abfangen und dann weitermachen.
Vorrausgesetzt wird natürlich, dass die DB entsprechend konfiguriert ist.
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
Benutzerbild von TRomano
TRomano

Registriert seit: 24. Nov 2004
Ort: Bochum
187 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Locate oder SELECT / Wie Problem lösen?

  Alt 8. Okt 2007, 09:53
Als erstes würde ich entweder verhindern, wenn möglich, dass doppelte Einträge in die Liste kommen (siehe TStringList.Duplicates) oder diese vor dem Insert entfernen.
Um ein Abfragen durch SELECT zu verhindern (Netzwerkverkehr minimieren), kann man in der Firebird-DB einen Unique-Index auf die Insert-Tabelle und das Feld setzen. z.B. mit:
"CREATE UNIQUE ASC INDEX IndexName ON IndexTabelle COMPUTED BY (upper(FeldName))" bei einem VARCHAR-Field
Dieser verhindert dann bei einem Insert doppelte Werte in der Firebird-Tabelle. (Exception durch DB)

Bei einem Multi-User-Betrieb würde ich kein lokales LOCATE benutzen, da Du ja nur eine zum Zeitpunkt des Öffnens eine aktuelle View auf diese Tabelle hast und in der Zwischenzeit eventuell schon Einträge auf dem DB-Server geändert wurden (insert/update/delete)
Thomas Forget
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: Locate oder SELECT / Wie Problem lösen?

  Alt 8. Okt 2007, 11:26
Hallo,

es ist nicht nötig Exceptions oder Constraints für die Behandlung der Duplikate einzusetzen. Ich würde die 1.000 Tupel in eine (vorzugsweise temporäre) Tabelle laden und eine Mengen-Operation durchführen:

insert into tgt select distinct * from src where item not in (select item from tgt) So wird genau die Differenzmenge mit der Zielmenge vereinigt. Das sollte auch mit älteren SQL-Implementierungen funktionieren.

Grüße vom marabu
  Mit Zitat antworten Zitat
gullatrulla

Registriert seit: 11. Mai 2004
Ort: Malans (Schweiz)
41 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Locate oder SELECT / Wie Problem lösen?

  Alt 8. Okt 2007, 13:08
Hallo,

Erstmal herzlichen Dank an alle. Ich denke, dass ich nun
Denkansätze habe wie ich das Problem lösen kann.

Nur noch eine kleine Frage zu LOCATE...

Bis anhin habe ich bei kleineren Tabellen LOCATE eingesetzt.
Zuerst habe ich die Tabelle mittels SELECT eingeschränkt,
um danach mit LOCATE zu suchen.

Sehe ich das richtig, dass LOCATE trotz vorherigem SELECT-
Befehl die komplette Tabelle holt?.
Das heisst, dass der SELECT-Befehl gar nichts bringt?

Herzlichen Dank und Gruss zum voraus
Roland
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Locate oder SELECT / Wie Problem lösen?

  Alt 8. Okt 2007, 13:21
Warum immer so kompliziert ? Lasse das doch die Datenbank machen :

SQL-Code:
CREATE PROCEDURE SP (
    NR INTEGER, FELDX)
AS
DECLARE VARIABLE AENDERN INTEGER;
BEGIN
  AENDERN = -1;
  SELECT NR FROM TABLEX WHERE (NR = :NR) INTO :AENDERN; /* falls nichts da, bleibt AENDERN = -1 */
  IF (AENDERN < 0) THEN BEGIN /* noch nicht vorhanden */

    INSERT INTO TABLEX (NR,FELDX)
           VALUES (:NR,:FELDX);
  END
  ELSE BEGIN
/*    UPDATE, nichts tun oder sonstwas */
  END
  SUSPEND;
END^

SET TERM ; ^
Lege im Programm eine FIBStoredProcedure an, übergebe die Parameter, ausführen mit SP.ExecProc und fertig.

P.S.: wo kommen auf einmal so viele FIBPlus-User her ?

P.S.: das wäre die "Holz-Methode", aber ohne Hammer.

P.S.3 : SP war nicht richtig, Hektik.
Gruß
Hansa
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf