For Schleife in einer Stored Procedure

Alles, was den Programmierer beschäftigt

Moderator: SYNERPY

Antworten
anajo
Beiträge: 108
Registriert: Di Mai 22, 2007 6:54 am

For Schleife in einer Stored Procedure

Beitrag von anajo »

Hallo,

irgendwie stehe ich gerade auf dem Schlauch ... :?

Kann mir bitte jemand helfen, wie man in IBExpert in einer Procedure eine for Schleife macht?!

Also so was in der Art:

Code: Alles auswählen

for i:=1 to 20 do
begin 
 ....

i:=i +1;
end
Danke und viele Grüße!
anajo
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Geht ungefährt so:

Code: Alles auswählen

FOR SELECT [felder] FROM [tabelle] INTO[variablen]
DO BEGIN
END
Das ganze geht natürlich wie jede normale SELECT Anweisung auch mit JOINS, WHERE und ORDER Klauseln ...

Gruß
MIchael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
anajo
Beiträge: 108
Registriert: Di Mai 22, 2007 6:54 am

Beitrag von anajo »

So recht komme ich damit nicht weiter.
Hier mal konkret das Problem:

Ich möchte aus einer Tabelle verschiedene Zeilen auslesen, nun sollen die Zeilen nacheinander durchlaufen werden und der Wert in eine andere Tabelle übergeben werden.

Code: Alles auswählen

SELECT WERT
FROM BGEM
WHERE Zeile = z
AND Spalte = 1
INTO :wert1;

INSERT INTO BGEMTL (ID,Wert) VALUES (:testtabelle_id, :wert1);

Hier an diesem Beispiel soll eben nach jeden Durchlauf z um 1 erhöht werden ...

Geht das mit FOR SELECT? Geht das überhaupt?
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Nein, das geht in einer Stored Procedure nicht, aber, davon ausgehend daß ALLE Datensätze übergeben werden sollen, sieht das so aus, in dem Fall sogar ohne FOR:

Code: Alles auswählen

INSERT INTO zieltabelle (
    feld1,
    feld2,
    feld3,
    ....
    feldn)
SELECT (
    feld1,
    feld2,
    feld3,
    ....
    feldn)
FROM quelltabelle;
In einer solchen Anweisung kann man der Zieltabelle auch in einem Rutsch Variablenwerte oder Konstanten zuordnen, indem man den Eintrag "feldn" in SELECT entsprechend ersetzt.

In einer Prozedur, die in einer Schleife arbeitet würde es so aussehen:

Code: Alles auswählen

FOR SELECT A.ID FROM quelltabelle INTO :quellid
DO BEGIN
INSERT INTO zieltabelle (
    feld1,
    feld2,
    feld3,
    ....
    feldn)
SELECT (
    feld1,
    feld2,
    feld3,
    ....
    feldn)
FROM quelltabelle WHERE quelltabelle.id = :quellid;
END
Ich hoffe, das war verständlicher ausgedrückt ...

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
anajo
Beiträge: 108
Registriert: Di Mai 22, 2007 6:54 am

Beitrag von anajo »

@miboe
Danke für Deine Hilfe, aber ich stehe immer noch auf dem Schlauch! :oops:

Also nochmal ganz von vorne.
Ich lese Daten über Excel ein, diese werden dann in der Import-Tabelle gespeichert (mit Angaben zu Zeile und Spalte in Excel).

Nun möchte ich aber nur Daten weiter verarbeiten, die in den Zeilen 10-15 stehen und darin nur die Spalten 1-5.
NPLADMIN
Beiträge: 163
Registriert: Di Okt 07, 2008 7:54 am
Wohnort: Oxbüll / Wees

Beitrag von NPLADMIN »

Hallo Anajo,

ich versuche mal mein Glück.

Also die Spalten entsprechen den Feldern die angesprochen werden.

Feld1 = Spalte1
...

Um die Zeile festzulegen ist es hilfreich wenn eine ID pro Zeile vergeben wurde.

Würde im Beispiel von Miboe etwa so aussehen:

FOR SELECT A.ID FROM quelltabelle INTO :quellid
DO BEGIN
INSERT INTO zieltabelle (
feld1,
feld2,
feld3,
....
feldn)
SELECT (
feld1,
feld2,
feld3,
....
feldn)
FROM quelltabelle WHERE quelltabelle.id = :quellid and
quelltabelle.id >= '10' and
quelltabelle.id <= '15';
END

Sollte eigentlich so funktionieren.
Bin aber auch noch am Üben mit SQL :roll:
Gruß
KTS

AvERP-Exe: 4.2.1.6
Datenbank: AvERP2009-A.01
_________________________
Suchen heißt finden und je mehr man sucht um so mehr findet man. ;-)
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

Achso, das mit der TIMPORT war ein SEHR wichtiger Hinweis. Um diese Tabelle auszulesen gibt es nämlich eine eigene Prozedur, die das Zeile/Spalte Geraffel schön handlich in einen fertigen Datensatz umwandelt.

Schau Dir mit dem IBexpert (gerade keinen zur Hand, bin unterwegs :)) mal für die Tabelle TIMPORT die abhängigen Objekte an, da gibt es nur 2-3 Prozeduren, und der Name ist selbsterklärend.

Diese Prozedure macht genau das was Du willst schon intern, also aus dem Zeile 1, Spalte 1 // Zeile 1, Spalte 2 .... einen Datensatz als Ergebnis zurückgeben mit dem Aufbau Spalte 1, Spalte 2, ...

Du kannst die Prozedur wie eine normale Tabelle ansprechen, also

Code: Alles auswählen

SELECT daten1, daten2, ... FROM P_name INTO variable1, variable2, ...
Du könntest also auch in meinem INSERT INTO ... SELECT FROM... Beispiel die zweite Tabelle aus welcher der Select kommt durch diese Prozedur ersetzen.

Ich kann morgen oder vielleicht auch Montag erst wieder ins System schauen, wenn Du bis dahin nicht weiter bist, schicke ich Dir ein paar Zeilen aus einer unserer Prozeduren, die dieses Schema verwendet. Wir haben ein paar Beispiele selbst geschrieben, womit User im normalen Betrieb Daten, wie z.B. eine STückliste importieren können.

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
anajo
Beiträge: 108
Registriert: Di Mai 22, 2007 6:54 am

Beitrag von anajo »

Guten Morgen!

Ich habe mal geschaut, ich denke Du meinst die P_TIMPORTDATEN.

Ich möchte das auch nutzen, um Stücklisten zu importieren. Wenn Du mir da ein Beispiel von Dir zeigen könntest, wäre das natürlich super!

Habe nun folgendes versucht:

Code: Alles auswählen

begin

  FOR SELECT DATEN1
  FROM p_timportdaten(4, 6)
  INTO :d1
  DO
  BEGIN
    INSERT INTO testtabelle  (
      artikelid)
    VALUES (
      :d1);
  END
end
Das läuft soweit auch, nur wird nichts in meine testtabelle übertragen.
Mir ist dabei leider auch nicht klar, was z.B. DATEN1 für ein Feld sein soll bzw. was für einen Inhalt es überhaupt haben kann.

Tut mir leid für die "blöden" Fragen, aber ich komme grad echt nicht weiter! :oops: Danke für die Hilfe!
UliS
Beiträge: 399
Registriert: Fr Mai 26, 2006 3:44 pm
Wohnort: Velbert-Langenberg

Stücklisten-Import über Universelle Import-Schnitstelle

Beitrag von UliS »

Vielleicht hilft da die Prozedur
P_BIMPSTCKL_IMPORT_BSAIMP
die SYNERPY freundlich im MASTER.2009A01
gelassen hat.
Auch der Aufruf ist unter
//AvERP/Schnittstellen/Universeller Import
unter ID 1 Kennung 'CAD-LA01'
zu finden.
Gruß U.Schmidt
averpen4dummies.blogspot.de -- off
Wenn ich weiß, wo ich suchen muß ist OpenSource besser als jede Dokumentation
aktuelle Erkenntnisse mit:
Software-Version 6.11.1
FDB 2023.02 / ohne 2024
anajo
Beiträge: 108
Registriert: Di Mai 22, 2007 6:54 am

Beitrag von anajo »

Vielleicht hilft da die Prozedur
P_BIMPSTCKL_IMPORT_BSAIMP
Gesnau diese verwende ich, damit kommen meine Daten in die Tabelle TIMPORT.
Problem ist, wie ich sie von da in die eigentlichen Stücklistentabellen bekomme ...
Oder mache ich das grundlegend falsch?
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Siehe Maske BIMPSTCKL bzw. BIMPSTCKLPO. Hier gibt es auch die entsprechenden (fertigungen) Utilities.
Im IBExpert einfach im Datenbankexplorer nach "*BIMPSTCKL*" suchen.

P_BIMPSTCKL_NACH_BSASTL ist das, wonach Sie suchen.
miboe
Beiträge: 1295
Registriert: Fr Jul 28, 2006 9:13 am

Beitrag von miboe »

So und hier jetzt endlich mal unsere sehr einfache aber wirkungsvolle Version:

Code: Alles auswählen

CREATE OR ALTER PROCEDURE P_IMP_ENTWSTCKLST(
    KOPFNR VARCHAR(20),
    NEINLOGID INTEGER,
    KONFIG_ID INTEGER)
AS
declare variable daten1 varchar(40);
declare variable daten2 varchar(40);
declare variable bsa_id integer;
declare variable bsas_id integer;
declare variable sja varchar(1);
declare variable snein varchar(1);
declare variable nstep integer;
declare variable maskenkey varchar(10);
BEGIN
  /* Protokollieren, dass Aktion hier durchgelaufen ist */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_IMP_ENTWSTCKLST');

  /* Logische Kennzeichen für True und False holen */
  EXECUTE PROCEDURE P_BFIRMA_JANEIN RETURNING_VALUES(:SJA, :SNEIN);

  FOR SELECT F_LRTRIM(DATEN1), F_LRTRIM(DATEN2)
  FROM P_TIMPORTDATEN(:NEINLOGID, :KONFIG_ID)
  INTO :DATEN1, :DATEN2 DO
  BEGIN
    /* ID DES STÜCKLISTENKOPFES HOLEN */
    BSAS_ID = NULL;
    SELECT B.ID FROM BSAS B
    LEFT OUTER JOIN BSA A ON B.BSA_ID_LINKKEY = A.ID
    WHERE (A.MASKENKEY = :KOPFNR) AND (B.KONSTRUKTION_JN = :SJA)
          AND (B.KONSTRUKTIONHAUPT_JN = :SJA)
    INTO :BSAS_ID;

    /* ID des Artikels auf Stücklistenposition holen und Einsatzmengenfaktor setzen */
    BSA_ID = NULL;
    SELECT A.ID FROM bsa A WHERE (A.MASKENKEY = :DATEN1) INTO :BSA_ID;

    /* Laufende Nummer der StüLi Position ermitteln */
    NSTEP = 10;
    EXECUTE PROCEDURE P_MASKENKEY_LFDNR('BSASTL', :BSAS_ID, :NSTEP, NULL)
    RETURNING_VALUES (:MASKENKEY);

    /* Datensatz in BSASTL schreiben */
    DATEN2 = CAST(DATEN2 AS NUMERIC(15,4));
    INSERT INTO BSASTL (
      BSAS_ID_LINKKEY,
      MASKENKEY,
      BSA_ID_ARTNR,
      STCKZAHL,
      OPTION_JN,
      PREIS_JN)
    VALUES (:BSAS_ID, :MASKENKEY, :BSA_ID, :DATEN2, :SNEIN, :SJA);
  END
  DELETE FROM TIMPORT WHERE AKTIV_USER_ID = :NEINLOGID AND KONFIG_ID = :KONFIG_ID;
END
Die Prozedur basiert darauf, daß in der Importkonfiguration die Spalten 4 (Artikelnummer) und 8 (Menge) der Entwicklungsstückliste aus Excel importiert wurden. Hier werden sie dann weiterverarbeitet.

Bei Fragen ... fragen :wink:

Gruß
Michael
Nur wer das Unmögliche versucht, wird das Machbare erreichen!
--
Datenbank: 2012-A02
Programm: 4.2.5.65
OS: Win 7 Pro / Ubuntu 10.04.3
anajo
Beiträge: 108
Registriert: Di Mai 22, 2007 6:54 am

Beitrag von anajo »

Tut mir leid, ich glaube mir fehlt grad das grundsätzliche Verständnis für das Vorgehen um diese Prozedur verwenden zu können, bzw. einen Import zu schaffen. :oops:

Nochmal Schritt für Schritt von Anfang:

1. Ich verwende die Maske FRMV_BIMKONF
2. In der Maske wähle ich mit Dateipfad/Name meine Exceldatei die die Stckl enthält aus.
3. In FB-Procedure-Name: welche Prozedur wähle ich?
-P_BIMPSTCKL_IMPORT_BSAIMP
-P_BIMPSTCKL_IMPORT_EPLAN
-P_BIMPSTCKL_NACH_BSASTL
-oder eine selbst geschriebene (wie die von Michael)?

4. Die FB-Procedure-Parameter: geben nur die Parameter der Procedure an, aber damit muss ich nichts machen, oder?

Wofür wird die P_TIMPORTDATEN verwendet?

Wäre super, wenn mir da jemand mal auf die Sprünge helfen könnte! DANKESCHÖN!!!
anajo
Beiträge: 108
Registriert: Di Mai 22, 2007 6:54 am

Beitrag von anajo »

Meine letzte Frage hat sich inzwischen erübrigt, habe das glaube nun doch verstanden.

@miboe
Die Prozedur basiert darauf, daß in der Importkonfiguration die Spalten 4 (Artikelnummer) und 8 (Menge) der Entwicklungsstückliste aus Excel importiert wurden. Hier werden sie dann weiterverarbeitet.
Wie greifst du spezielle auf diese beiden Spalten zu?
anajo
Beiträge: 108
Registriert: Di Mai 22, 2007 6:54 am

Beitrag von anajo »

Vielleicht sollte ich mit dem Schreiben nicht so schnell machen ... :oops:

Dass es sich auf die Spalten 4 und 8 bezieht kann man ja in der Maske einstellen. Das weiß ich eigentlich schon. ;-)

Nun aber doch noch eine Frage, auf die ich eine Antwort bräuchte:

Erhalte beim Datenimport folgende Fehlermeldung:
"CAD-Verwaltung Fehler bei der Aktualisierung"
Was ist hier falsch?
Antworten