Autor Beitrag
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 21.05.03 11:50 
Hi,

ich muß mehrere Tabellen gleichzeitig aktualisieren. Hinzu kommt noch weiteres Ungemach. :shock: Die borlandchen DB-Kompos sind mir zu starr. Ich will deshalb eventuell die nicht DB-Komponenten benutzen und die Arbeit von der DB machen lassen. Dazu bräuchte ich wahrscheinlich eine stored Procedure und hab keinen Plan wo ich da anfangen soll. Oder kann ich vielleicht doch diese SP benutzen in nem DBGrid :?:

_________________
Gruß
Hansa
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mi 21.05.03 14:59 
Hi Hansa,

Du weißt ich helfe gerne, nur weiß ich gerade absolut nicht was du willst :D

Lass mal ein paar Infos mehr rüberwachsen.....

Grüße
Lemmy
hansa Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Mi 21.05.03 16:19 
Hi Lemmy,

wenigstens einer, der das sieht. 8) Also, konkretes Bsp.: habe mir einen Lieferschein vorgeknöpft. Da soll nach Eingabe der Art.Nr. die Bez usw. angezeigt werden. Und dann die Menge. Ja dann gehts los: Lagerbestand aktualisieren, Rechnung erstellen und und und... In einem DBgrid kann ich nur ein Dataset bearbeiten. Und dafür käme eventuell eine SP in Frage.

_________________
Gruß
Hansa
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Mi 21.05.03 19:12 
Hi Hansa,

muddu warten bis morgen...

Grüße
Lemmy
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Do 22.05.03 07:34 
Guten Morgen,

als erstes mal ein Beispiel, das einen Datensatz löscht und alle Tabellen in der ein Fremdschlüssel eingetragen ist löscht:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
CREATE PROCEDURE DELETEPERSONAL 
(ID INTEGER)
AS
DECLARE VARIABLE BenutzerID INTEGER;
BEGIN
  SELECT ID FROM Benutzer WHERE Personal_ID=:ID INTO BenutzerID;
  UPDATE Auftrag SET Projektleiter_ID=NULL WHERE Projektleiter_ID=:ID;
  UPDATE Nebenkosten SET Personal_ID=NULL WHERE Personal_ID=:ID;
  DELETE FROM Tagebuch WHERE Personal_ID=:ID;
  DELETE FROM Stundensatz WHERE Personal_ID=:ID;
  DELETE FROM Eintrag WHERE Personal_ID=:ID;
  DELETE FROM Kranktage WHERE Personal_ID=:ID;
  IF (BenutzerID IS NOT NULL) THEN
    EXECUTE PROCEDURE DELETEBENUTZER(BenutzerID);
  DELETE FROM Personal WHERE ID=:ID;
END ^


Klar kann man dazu auch kaskadierende Fremdschlüssel verwenden, ich persönlich bin aber davon abgekommen PK's bzw. FK's anzulegen, weil das mit Indizes wesentlich besser und einfacher geht.


ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
CREATE PROCEDURE SETHOAITEXT 
(
  AUFTRAGID INTEGER,
  VORLAGEID INTEGER,
  PHASE SMALLINT,
  TOPIC SMALLINT,
  PROZENT SMALLINT,
  UPDATEVORLAGE CHAR(1) )
AS
DECLARE VARIABLE HOAIText INTEGER;
BEGIN
  IF (UpdateVorlage='N') THEN
  BEGIN
    SELECT HOAIText_ID FROM HOAIVorlageListe WHERE HOAIVorlage_ID=:VorlageID AND Phase=:Phase AND Topic=:Topic INTO HOAIText;
    INSERT INTO HOAIAuftText (ID, HOAIAuftrag_ID, HOAIText_ID, Prozent, Phase, Topic)
    VALUES (GEN_ID(GEN_HOAIAuftText,1), :AuftragID, :HOAIText, :Prozent, :Phase, :Topic);
  END
  IF (UpdateVorlage='J') THEN
  BEGIN
    UPDATE HOAIAuftText SET Prozent=:Prozent WHERE HOAIAuftrag_ID=:AuftragID AND Phase=:Phase AND Topic=:Topic;
  END
  IF (UpdateVorlage='C') THEN
  BEGIN
    SELECT HOAIText_ID FROM HOAIVorlageListe WHERE HOAIVorlage_ID=:VorlageID AND Phase=:Phase AND Topic=:Topic INTO HOAIText;
    UPDATE HOAIAuftText SET Prozent=:Prozent, HOAIText_ID=:HOAIText WHERE HOAIAuftrag_ID=:AuftragID AND Phase=:Phase AND Topic=:Topic;
  END
END ^


Im zweiten Beispiel wird eine Tabelle je nach Eingabeparameter (UpdateVorlage) bearbeitet, bei dem Wert 'N' wird ein Insert durchgeführt, der die Tabelle mit Werten füllt, bei 'J' wird ein kleines Update durchgeführt und bei 'C' ein größeres mit mehr Werten.

Bei großen SP ist es sinnvoll die einzelnen SQL-Statements erst zu entwickeln und zu testen bevor man sie in der SP zusamenbaut. Zu Deinem Beispiel:

Nach der Eingabe der Daten für einen Artikel werden diese an die SP übergeben (Artikel_ID, BestellMenge) Diese wertet erst mal aus ob noch eine ausreichende Menge des Artikels da ist

Select Menge from Lagerbestand where Artikel_ID=:ArtikelID

Wenn ja, dann wird der Lagerbestand aktualisiert, der Artikel in den Lieferschein eingetragen und gut:

INSERT Into Lieferschein Values (LieferscheinID, ArtikelID, Menge, Einzelpreis);
Update Lagerbestand set Menge=Menge-BestellMenge;

Also sieht die fertige SP ungefähr so aus:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
CREATE PROCEDURE CreateLieferscheinPosition
(LieferscheinID INTEGER, ArtikelID INTEGER, Menge NUMERIC(9,2))
RETURNS (OK SmallInt)
AS
DECLARE VARIABLE LagerMenge:NUMERIC(9,2);
BEGIN
  FOR 
    SELECT Menge FROM Lagerbestand WHERE Artikel_ID=:ArtikelID INTO :LagerMenge;
  DO
  BEGIN
    IF (Lagermenge<:Menge) then
    BEGIN
      :OK=0
      SUSPEND;
    END
    IF (Lagermenge>=:Menge) then
    BEGIN
       INSERT Into Lieferschein Values (LieferscheinID, ArtikelID, Menge,                         Einzelpreis);
        Update Lagerbestand set Menge=Menge-BestellMenge;       
        :OK=1;
        SUSPEND;
    END 
  END 
END^


So ähnlich sollte es funktionieren (nicht getestet)....

Grüße
Lemmy