Announcement

Collapse
No announcement yet.

Stor.Proc soll Daten kopieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Stor.Proc soll Daten kopieren

    Hallo allerseits!
    Ich habe mal weider ein Problem, diesmal aber nicht ganz trivial (zumindest aus meiner Sicht).

    DB elphi Ent.5, Interbase,db derzeit noch in Dialect 1

    Das Objekt Laborprofil besteht aus IDNR_LABORDEFPROFIL, IDNR_LABORPROFIL
    IDNR_LABORTYP

    Das Objekt LaborAnfDef besteht aus IDNR_LABORANFDEF, IDNR_LABORANF, IDNR_LABORTYP, WERT

    Das Objekt LaborAnf besteht aus IDNR_LABORANF, OK, IDNR_AUFTR, IDNR_PAT
    IDNR_HAUPTBUCH, IDNR_LABORANFTYP, IDNR_ABTEILUNGEN, IDNR_KONTEN, PREIS, VONDATUM, FUERDATUM

    Eine Labor-Anforderung ist definiert durch
    1 Tupel in LaborAnf + n-Tupel in LaborAnfDef.

    Der Grund sind extrem variable Mengen von Einzelwerten (5-50 Stk) pro Patient pro Tag pro Labor-Anforderung.

    Um nicht bei Standard-Kombinationen oder Aufnahme-Routinen ellenlange Click.-Orgien abzufeiern, gibt es die Möglichkeit vordefinierte Mengen über Laborprofil der Tabelle LaborAnfDef zuzuweisen.

    Ich möchte das Fat-Server-Prinzip verwirklichen. Die Idnr’n werden für die einzelnen Objekte in stored proc generiert. Wie kann ich mittels einer Stored proc. jetzt die Werte

    Laborprofil. IDNR_LABORTYP, LaborAnf. IDNR_LABORANF in LaborAnfDef bekommen.

    Die Menge zu kopierender Datensätze ist

    SELECT from LaborProfil where LaborProfil.IDNR_LABORPROFIL = ÜbergabeParameter.

    Die InsertMenge ist

    INSERT into LaborAnfDef (IDNR_LABORANFDEF, IDNR_LABORANF, IDNR_LABORTYP, WERT) values(gen_id(gen_idnr_laboranfdef,1), : LaborAnf_IDNR_LABORANF , :LaborProfil_IDNR_LABORTYP,0);


    Die Clientseitige-Lösung sind nur ein paar Programm-Zeilen, aber bei zunehmender Datenmenge auf Dauer zu langsam, zumal eine Prüfung auf Doppeleingaben erforderlich ist. Diese werden bei der derzeitigen Lösung einfach ignoriert. Dies soll auch so bleiben, weil Profile aus praktischen Gründen Überschneidungen haben dürfen.

    Ein Ansatz müsste sein mit einem Cursor zu arbeiten. Leider finde ich dazu zu wenige Beispiele. (Kosch, Interbase...,S284)
    Für Hilfe wäre ich dankbar.

  • #2
    Bernhard,
    ist es etwas OffTopic:
    was genau programmierst Du mit Labordaten ?
    ich bin derzeit an der programmierung von einer
    "mini-labor"-lösung in einer unserer kliniken;

    meine email-addr.: [email protected]

    :-) thoma

    Comment


    • #3
      Danke an die, die nachgdacht haben!

      Ich hab's inzwischen selbst herausgefunden. Wie immer: Man muss sich nur trauen:

      <PRE>
      CREATE PROCEDURE SP_NEW_LABORWERTE (
      I_LABORPROFIL_NR INTEGER,
      I_LABORANF_NR INTEGER)
      AS
      DECLARE VARIABLE V_LABORTYP_NR INTEGER;
      DECLARE VARIABLE V_COUNT INTEGER;
      begin
      for select labordefprofil.idnr_labortyp
      from labordefprofil
      where labordefprofil.idnr_laborprofil = :I_LABORPROFIL_NR
      into : V_LABORTYP_NR
      as Cursor tmpCursor
      do
      begin
      select Count (*)
      from LABORANFDEF
      where ((laboranfdef.idnr_laboranf = :I_LABORANF_NR)
      and
      (laboranfdef.idnr_labortyp = :V_LABORTYP_Nr))
      into V_COUNT;

      if (:V_Count = 0) then
      begin
      insert into laboranfdef(IDNR_LABORANFDEF,
      IDNR_LABORANF, IDNR_LABORTYP, WERT)
      Values (gen_id(gen_idnr_laboranfdef,1),
      :I_LABORANF_NR,
      :V_LABORTYP_Nr,
      0);
      end
      end
      end
      </PRE>

      Gruß
      Bernhar

      Comment


      • #4
        Hallo Bernhard,

        ich bin mir nicht sicher ob ich Dein Problem richtig verstanden habe.

        Vielleich ist es ja das was Du suchst.
        <pre>
        CREATE PROCEDURE INSERT_LABORANFDEF (
        IDNR_LABORPROFIL integer,
        IDNR_LABORANFDEF integer,
        IDNR_LABORANF integer,
        IDNR_LABORTYP integer,
        WERT integer)
        as
        declare variable temp_IDNR_LABORANF integer;
        declare Variable temp_IDNR_LABORTYP integer;
        begin
        for select IDNR_LABORANF, IDNR_LABORTYP from LaborProfil
        where LaborProfil.IDNR_LABORPROFIL = :IDNR_LABORPROFIL
        into :temp_IDNR_LABORANF, :temp_IDNR_LABORTYP
        do begin
        insert into LaborAnfDef (IDNR_LABORANFDEF, IDNR_LABORANF, IDNR_LABORTYP, WERT) values(gen_id(gen_idnr_laboranfdef,1), : temp_IDNR_LABORANF , :temp_IDNR_LABORTYP,0);
        end
        end
        </pre>

        Tschüß

        Torste

        Comment


        • #5
          Hallo Bernhard,

          wie ich sehe hat das zusammenbasteln der SP ein klein wenig zu lange gedauert!

          Das nächste Mal muß ich schneller denken und schreiben oder einfach eher von Arbeit nach Hause kommen.-)

          Bye

          Torste

          Comment


          • #6
            Lieber Torsten!

            Trotzdem vielen Dank.

            Aber wie Du siehst, hat Dein Teaching geholfen.

            Dafür nochmal Danke

            PS: Ich bin noch bei der Arbeit(leider?)!

            Gruß
            Bernhard :

            Comment

            Working...
            X