AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Wöchentlich etliche Datensätze updaten
Thema durchsuchen
Ansicht
Themen-Optionen

Wöchentlich etliche Datensätze updaten

Ein Thema von Dumpfbacke · begonnen am 29. Dez 2008 · letzter Beitrag vom 3. Jan 2009
 
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.912 Beiträge
 
Delphi 12 Athens
 
#9

Re: Wöchentlich etliche Datensätze updaten

  Alt 2. Jan 2009, 17:47
Ist das tatsächlich die SP, mit der Du inserten/updaten wolltest?

Ich hab mal ein wenig formatiert und ein paar Anmerkungen dazugeschrieben.

SQL-Code:
CREATE PROCEDURE DatenUpdate (
  Feld1 varchar(20) character set iso8859_1,
  Feld2 varchar(4) character set iso8859_1,
  Feld3 varchar(35) character set iso8859_1,
  Feld4 varchar(20) character set iso8859_1,
  Feld5 varchar(10) character set iso8859_1,
  Feld6 varchar(50) character set iso8859_1,
  Feld7 varchar(30) character set iso8859_1)
as
  declare variable maxZaehler integer;
  declare variable zaehler integer;
  declare variable dsgefunden integer;
begin
   for Select Max(Tabelle1Zaehler)
         From Tabelle1
         into :maxZaehler
   do DSGefunden = 0;
   /* for select ist hier unsinnig, es wird immer wenn die Tabelle mindestens
      einen Datensatz enthät der höchste Wert von Tabelle1Zaehler zurückgegeben
      und DSGefunden auf 0 gesetzt. Andernfalls sind beide Werte undefiniert. */


   Zaehler = 0;

   for Select Tabelle1Zaehler
         From Tabelle1
         Where (Feld1 = :Feld1) and (Feld2 = :Feld2) and (Feld5 = :Feld5)
         into :Zaehler
   do
   begin
     DSGefunden = 1; /* hier wird für jeden gefundenen Datensatz DSGefunden auf 1 gesetzt*/
   end

   if (DSGefunden = 1) then
   begin
     update Tabelle1
       set Tabelle1ZAEHLER = :Zaehler, Feld1 = :Feld1, Feld2 = :Feld2, Feld3 = :Feld3, Feld4 = :Feld4,
           Feld5 = :Feld5, Feld6 = :Feld6, Feld7 = :Feld7, AKTUELLESDATUM = current_date
       where Tabelle1ZAEHLER = :Zaehler;
     /* hier wird nun der letzte gefundene Datensatz aktualisiert */
/*     Suspend  --> raus damit, hat in einer SP ohne Rückgebewert nichts verloren */
   end
   else
   begin /* Wenn DSGefunden != 1 und not null */
     maxZaehler = maxZaehler +1;

     insert into Tabelle1 (Tabelle1ZAEHLER, Feld1, Feld2, Feld3, Feld4, Feld5, Feld6, Feld7, AKTUELLESDATUM)
                   values (:maxZaehler, :Feld1, :Feld2, :Feld3, :Feld4, :Feld5, :Feld6, :Feld7, current_date); /* neuen Datensatz einfügen */
/*     Suspend  --> raus damit, hat in einer SP ohne Rückgebewert nichts verloren */
   end
end
Hier eine SP, die alle Datensätze, bei denen die Felder 1,2 und 5 übereinstimmen updated und einen neuen Datensatz einfügt, wenn keine Übereinstimmung gefunden wurde.
SQL-Code:
CREATE PROCEDURE DatenUpdate (
  Feld1 varchar(20) character set iso8859_1,
  Feld2 varchar(4) character set iso8859_1,
  Feld3 varchar(35) character set iso8859_1,
  Feld4 varchar(20) character set iso8859_1,
  Feld5 varchar(10) character set iso8859_1,
  Feld6 varchar(50) character set iso8859_1,
  Feld7 varchar(30) character set iso8859_1)
as
  declare variable anz integer;
  declare variable zaehler integer;
begin
  anz = 0;
  select count (*)
    from Tabelle1
    where (Feld1 = :Feld1) and (Feld2 = :Feld2) and (Feld5 = :Feld5)
    into :anz;
  if (:anz > 0) then
  begin
    update Tabelle1
      set Feld3 = :Feld3, Feld4 = :Feld4, Feld6 = :Feld6, Feld7 = :Feld7, AKTUELLESDATUM = current_date
      where (Feld1 = :Feld1) and (Feld2 = :Feld2) and (Feld5 = :Feld5);
  end
  else
  begin
    Select Max(Tabelle1Zaehler)
      From Tabelle1
      into :Zaehler;
    if (:zaehler is null) then zaehler = 1; else zaehler = :zaehler + 1;
    insert into Tabelle1 (Tabelle1ZAEHLER, Feld1, Feld2, Feld3, Feld4, Feld5,
                          Feld6, Feld7, AKTUELLESDATUM)
                  values (:maxZaehler, :Feld1, :Feld2, :Feld3, :Feld4, :Feld5,
                          :Feld6, :Feld7, current_date);

  end
end
SP ist ungetestet, nur ins Unreine geschrieben.
Anmerkung zur Performance:
  • es sollte ein absteigender eindeutiger Index auf Tabelle1Zaehler liegen, eleganter wäre es sicherlich, sich den neuen Zaehler über einen Generator zu ermitteln
  • es sollte einen kombinierten Index aus Feld 1, 2 und 5 geben.

Hoffe, das hilft Dir weiter.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
 


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 17:13 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