Procedure P_SACHMERKMALE_LESEN

Alles, was den Programmierer beschäftigt

Moderator: SYNERPY

Antworten
festus01
Beiträge: 515
Registriert: Di Okt 19, 2004 5:45 am
Wohnort: Diepholz

Procedure P_SACHMERKMALE_LESEN

Beitrag von festus01 » Mo Jul 18, 2011 6:46 am

Hallo,
wir arbeiten immer mehr mit Sachmerkmalen.
Da ich in selbst programmierten Masken manchmal auf die Sachmerkmale zurückgreife bin ich auf o.g. Procedure gestoßen.

Für mich ergeben die "IF THEN ELSE" Konstrukte irgendwie keinen Sinn:

Code: Alles auswählen

/******************************************************************************/
/****     Following SET SQL DIALECT is just for the Database Comparer      ****/
/******************************************************************************/
SET SQL DIALECT 3;



SET TERM ^ ; 

CREATE PROCEDURE P_SACHMERKMALE_LESEN (
    BPROPT_ID INTEGER,
    BSA_ID INTEGER)
RETURNS (
    BPROP_ID INTEGER,
    BPROP_MASKENKEY VARCHAR(20),
    BPROP_FELDTYP SMALLINT,
    BPROP_FELDFORMAT VARCHAR(40),
    BPROP_AUSWAHL VARCHAR(32000),
    BPROPTI_ZWANG_JN VARCHAR(1),
    BPROPTI_SORTIERFOLGE SMALLINT,
    BPROPTI_HILFETEXT VARCHAR(100),
    PASCALSCRIPT_BP BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    PASCALSCRIPT_AP BLOB SUB_TYPE 0 SEGMENT SIZE 80,
    INHALT VARCHAR(100))
AS
DECLARE VARIABLE TABELLE VARCHAR(40);
BEGIN
  /* Letzter Stand 16.03.2010 16:50:31 LM */

  /* Protokollieren, dass Aktion hier durchgelaufen ist */
  IF (GEN_ID(GEN_ENTWICKLUNG,0) = 0) THEN
    INSERT INTO A_WASMACHTIB (PROGRAMMTEIL) VALUES ('P_SACHMERKMALE_LESEN');

  -- Inhalt von bestimmten Sachmerkmal lesen

  TABELLE = NULL; -- bis fertig
  IF (TABELLE IS NULL) THEN TABELLE =  'BPROPBSA';
  TABELLE = F_UPPER(TABELLE);

  PASCALSCRIPT_BP = NULL;
  PASCALSCRIPT_AP = NULL;

  FOR SELECT VB.ID, VB.MASKENKEY, VB.FELDTYP, VB.FELDFORMAT,
             VB.AUSWAHL, VA.ZWANG_JN, VA.SORTIERFOLGE, VA.HILFETEXT,
             VA.PASCALSCRIPT_BP, VA.PASCALSCRIPT_AP
  FROM BPROPTI VA
  LEFT OUTER JOIN BPROP VB ON VA.BPROP_ID = VB.ID
  WHERE VA.BPROPT_ID_LINKKEY = :BPROPT_ID
  ORDER BY VA.BPROPT_ID_LINKKEY, VA.SORTIERFOLGE
  INTO :BPROP_ID, :BPROP_MASKENKEY, :BPROP_FELDTYP, :BPROP_FELDFORMAT,
       :BPROP_AUSWAHL, :BPROPTI_ZWANG_JN, :BPROPTI_SORTIERFOLGE, :BPROPTI_HILFETEXT,
       :PASCALSCRIPT_BP, :PASCALSCRIPT_AP
  DO
  BEGIN
    INHALT = '';

    IF (BSA_ID IS NOT NULL) THEN
    BEGIN
      IF (TABELLE = 'BPROPBSA') THEN
        SELECT VC.INHALT
        FROM BPROPBSA VC
        WHERE VC.BSA_ID_LINKKEY = :BSA_ID AND VC.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BAUFPOSM') THEN

        SELECT VD.INHALT
        FROM BAUFPOSM VD
        WHERE VD.BAUFPO_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BKUNDESM') THEN

        SELECT VD.INHALT
        FROM BKUNDESM VD
        WHERE VD.BKUNDE_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BPROJPLPLSM') THEN

        SELECT VD.INHALT
        FROM BPROJPLPLSM VD
        WHERE VD.BPROJPLPL_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BPROJPLSM') THEN

        SELECT VD.INHALT
        FROM BPROJPLSM VD
        WHERE VD.BPROJPL_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BBESPSM') THEN

        SELECT VD.INHALT
        FROM BBESPSM VD
        WHERE VD.BBESP_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BLIEFSM') THEN
        SELECT VD.INHALT
        FROM BLIEFSM VD
        WHERE VD.BLIEF_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BLLCQUSM') THEN
        SELECT VD.INHALT
        FROM BLLCQUSM VD
        WHERE VD.BLLC_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;  
      IF (TABELLE = 'BFASM') THEN
        SELECT VD.INHALT
        FROM BFASM VD
        WHERE VD.BFA_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BANSPSM') THEN
        SELECT VD.INHALT
        FROM BANSPSM VD
        WHERE VD.BANSP_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BSAPSM') THEN
        SELECT VD.INHALT
        FROM BSAPSM VD
        WHERE VD.BSAP_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BPRUEFMSM') THEN
        SELECT VD.INHALT
        FROM BPRUEFMSM VD
        WHERE VD.BPRUEFM_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BLLCWFSM1') THEN
        SELECT VD.INHALT
        FROM BLLCWFSM1 VD
        WHERE VD.BLLCWF_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BLLCWFSM2') THEN
        SELECT VD.INHALT
        FROM BLLCWFSM2 VD
        WHERE VD.BLLCWF_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
      ELSE IF (TABELLE = 'BLLCWFSM3') THEN
        SELECT VD.INHALT
        FROM BLLCWFSM3 VD
        WHERE VD.BLLCWF_ID_LINKKEY = :BSA_ID AND VD.BPROP_ID = :BPROP_ID
        INTO :INHALT;
    END

    SUSPEND;
  END
END
^



SET TERM ; ^

COMMENT ON PROCEDURE P_SACHMERKMALE_LESEN IS 
'Sachmerkmale fuer Artikel lesen';


/* Privileges of users */
GRANT EXECUTE ON PROCEDURE P_SACHMERKMALE_LESEN TO PUBLIC;
Es wird immer der Wert der Variable TABELLE abgefragt, wobei der Wert doch am Anfang auf "BPROPBSA" gesetzt und nie wieder geändert wird.
Ist das ein feature :?: :wink:

Vielleicht könnten Sie sich das mal ansehen.

PS: Das ist der Stand der Datenbank 2012B15.
MfG

KDP

----------------------------------------------------------
Durch den Computer spart der Mensch so viel Zeit,
dass er diese am Computer verbringen kann.

SYN17
Beiträge: 79
Registriert: Do Feb 16, 2006 8:10 am

RE: Sachmerkmale lesen

Beitrag von SYN17 » Do Jul 21, 2011 12:13 pm

Sie haben völlig recht. Die Procedure P_SACHMERKMALE_LESEN kann ausschließlich für die Sachmerkmale im Artikelstamm verwendet werden.

Für das Lesen der Sachmerkmale sollte generell die Procedure: P_SACHMERKMALE_LESEN_GLOBAL verwendet werden.

Antworten