AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Strukturänderung Ja/Nein-Felder in Firebird
Thema durchsuchen
Ansicht
Themen-Optionen

Strukturänderung Ja/Nein-Felder in Firebird

Ein Thema von Blackpit · begonnen am 24. Aug 2019 · letzter Beitrag vom 11. Sep 2019
Antwort Antwort
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
695 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Strukturänderung Ja/Nein-Felder in Firebird

  Alt 8. Sep 2019, 18:09
beim insert hat das set nix zu suchen und wenn das variablen sein sollen in deinem ersten select muss du die in sql anweisungen mit : als präfix ansprechen

wirkt irgendwie noch alles kraut und rüben zusammengetippt und nicht funktionierend in eine sp,
aber generell geht das, ggf eben über den umweg execute statement, wenn das keine echten objektnamen sind
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
Firebird 5 Update und Know-how Workshop – 28.8.-29.08.2025 64546 Mörfelden - Walldorf
  Mit Zitat antworten Zitat
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#2

AW: Strukturänderung Ja/Nein-Felder in Firebird

  Alt 8. Sep 2019, 18:28
Danke, das wollt ich wissen.
Sollte nur als Beispiel dienen, die Anmerkungen sind schon klar.
Beim Suspend bekomme ich auch mit execute statement eine Fehlermeldung, woran kann das liegen?
Noch was, kann ich Blöcke auch in Procs verwenden?
Nochmals vielen Dank, hast mir schon sehr geholfen!
Gruß BP
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
695 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Strukturänderung Ja/Nein-Felder in Firebird

  Alt 8. Sep 2019, 19:03
daran, das es wohl einen fehler gab
und ja, execute blocks gehen immer auch per execute statement
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
Firebird 5 Update und Know-how Workshop – 28.8.-29.08.2025 64546 Mörfelden - Walldorf
  Mit Zitat antworten Zitat
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#4

AW: Strukturänderung Ja/Nein-Felder in Firebird

  Alt 9. Sep 2019, 08:12
daran, das es wohl einen fehler gab...
Du hast mir den Tag erhellt
War blöd formuliert, der Einsatz von suspend war mir noch nicht ganz klar, hab mich nochmal schlau gemacht.
Wenn ich die Vergleichsliste fertig hab, sehe ich ob es funktioniert.
Danke nochmals!
  Mit Zitat antworten Zitat
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#5

AW: Strukturänderung Ja/Nein-Felder in Firebird

  Alt 9. Sep 2019, 15:07
Hallo,
muss mich leider nochmal melden.
Vergleichstabelle erstellt und Prozedur im Einzelschrittmodus getestet.
Läuft wie programmiert, sobald ich sie jedoch fertig laufen lasse bekomme ich
Zitat:
multiple rows in singleton select.
At procedure 'GETALLDETAILS' line: 24, col: 7.
Die Prozedur hat aber nur 22 Zeilen
Proc GETALLDETAILS wir in Proc GETCOMPDETAILS gerufen.

GETALLDETAILS
Code:
begin
  for select COMP_ID
      from COMP_AUS
      group by COMP_ID
      into :MYID
  do
  begin
    for select F.RDB$RELATION_NAME, F.RDB$FIELD_NAME
        from RDB$RELATION_FIELDS F
        join RDB$RELATIONS R on F.RDB$RELATION_NAME = R.RDB$RELATION_NAME and R.RDB$VIEW_BLR is null and (R.RDB$SYSTEM_FLAG is null or R.RDB$SYSTEM_FLAG = 0)
        where (upper(F.RDB$RELATION_NAME) starting with upper('COMP_AUS')) and
              (upper(F.RDB$FIELD_NAME) containing upper('_JN'))
        order by 1, F.RDB$FIELD_POSITION
        into :TABLE_NAME, :COLUMN_NAME
    do
    begin
      execute statement 'select cast(' || COLUMN_NAME || ' as varchar(100)) from ' || TABLE_NAME || ' where COMP_ID =' || MYID
          into :COLUMN_VALUE;
      suspend;
    end
  end
end
GETCOMPDETAILS
Code:
create or alter procedure GETCOMPDETAILS (
    MYID integer,
    COLUMN_NAME varchar(100) character set UTF8,
    COLUMN_VALUE varchar(100) character set UTF8)
as
declare variable DET_ID integer;
declare variable BEZEICH varchar(100) character set UTF8;
  begin
    for select first 1 myID, column_name, column_value  /*<--- multiple rows fehler beseitigt */
        from GETALLDETAILS
        where UPPER(COLUMN_VALUE) = UPPER('j')
        into myid, column_name, column_value
    do
    begin
    select Bezeichnung from dmchange where Field_Name = :column_name into :Bezeich;
    if (column_name not CONTAINING 'xxx') then
    begin
    select AUS_DET_ID from comp_aus_detail where Bezeichnung = :Bezeich into :DET_ID;
    if (bezeich <> '' and det_id is null) then
    begin
    Insert into comp_aus_detail (bezeichnung) Values (:Bezeich) returning aus_det_id into :det_id;
    suspend;
    end
    if (det_id is not null) then
    insert into comp_kat_details (KAT_ID,DET_ID,KID_ID) values (1,:DET_ID,:myid);
    end
    end
  end;
GETALLDETAILS läuft alleine durch und liefert die gewünschten Daten ohne Fehlermeldung.
Woran kann das liegen?

Nachtrag: Den Fehler habe ich mit "First 1" im Select wegbekommen (Datenlage), aber scheibar wird nicht commitet, Tabelle wird nicht gefüllt??

Geändert von Blackpit ( 9. Sep 2019 um 15:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

Registriert seit: 15. Mär 2005
695 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Strukturänderung Ja/Nein-Felder in Firebird

  Alt 9. Sep 2019, 19:20
den commit musst der aufrufende machen, alle sps laufen in dessen transaktionskontext, in ibexpert also oben nach dem ausführen oben den toolbutton für commit anklicken.
die Fehlermeldung mit zeile xx kann auch aus dem execute statement kommen, daher kann das passen. Bei Zeilennummern zählen auch die im Header mit (es gibt in IBExpert eine toolbutton lazymode, dann erst siehst du den kompletten source, in deinem oberen Beispiel fehlt das scheinbar.
Holger Klemt
www.ibexpert.com - IBExpert GmbH
Oldenburger Str 233 - 26203 Wardenburg - Germany
Firebird 5 Update und Know-how Workshop – 28.8.-29.08.2025 64546 Mörfelden - Walldorf
  Mit Zitat antworten Zitat
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#7

AW: Strukturänderung Ja/Nein-Felder in Firebird

  Alt 9. Sep 2019, 19:58
Hallo,
hier beide komplett:

GETALLDETAILS
Code:
SET TERM ^ ;

create or alter procedure GETALLDETAILS
returns (
    MYID integer,
    TABLE_NAME varchar(100) character set UTF8,
    COLUMN_NAME varchar(100) character set UTF8,
    COLUMN_VALUE char(100) character set UTF8)
as
begin
  for select COMP_ID
      from COMP_AUS
      group by COMP_ID
      into :MYID
  do
  begin
    for select F.RDB$RELATION_NAME, F.RDB$FIELD_NAME
        from RDB$RELATION_FIELDS F
        join RDB$RELATIONS R on F.RDB$RELATION_NAME = R.RDB$RELATION_NAME and R.RDB$VIEW_BLR is null and (R.RDB$SYSTEM_FLAG is null or R.RDB$SYSTEM_FLAG = 0)
        where (upper(F.RDB$RELATION_NAME) starting with upper('COMP_AUS')) and
              (upper(F.RDB$FIELD_NAME) containing upper('_JN'))
        order by 1, F.RDB$FIELD_POSITION
        into :TABLE_NAME, :COLUMN_NAME
    do
    begin
      execute statement 'select cast(' || COLUMN_NAME || ' as varchar(100)) from ' || TABLE_NAME || ' where COMP_ID =' || MYID
          into :COLUMN_VALUE;
      suspend;
    end
  end
end^

SET TERM ; ^

GRANT SELECT ON COMP_AUS TO PROCEDURE GETALLDETAILS;

GRANT EXECUTE ON PROCEDURE GETALLDETAILS TO MYDB;
GETCOMPDETAILS
Code:
SET TERM ^ ;

create or alter procedure GETCOMPDETAILS
as
declare variable DET_ID integer;
declare variable BEZEICH varchar(100) character set UTF8;
declare variable MYID integer;
declare variable COLUMN_NAME varchar(50) character set UTF8;
  begin
    for select myID, column_name
        from GETALLDETAILS
        where UPPER(COLUMN_VALUE) = UPPER('j')
        into myid, column_name
    do
    begin
    if (column_name not CONTAINING 'xxx') then
    begin
    select Bezeichnung from dmchange where Field_Name = :column_name into :Bezeich;
    select AUS_DET_ID from comp_aus_detail where Bezeichnung = :Bezeich into :DET_ID;
    if (bezeich is null and det_id is null) then
    begin
    Insert into comp_aus_detail (bezeichnung) Values (:Bezeich) returning aus_det_id into :det_id;/*return gen_ID*/
    suspend;
    end
    if (det_id is not null) then
    insert into comp_kat_details (KAT_ID,DET_ID,KID_ID) values (1,:DET_ID,:myid);
    end
    end
  end;^

SET TERM ; ^

GRANT EXECUTE ON PROCEDURE GETALLDETAILS TO PROCEDURE GETCOMPDETAILS;

GRANT SELECT ON DMCHANGE TO PROCEDURE GETCOMPDETAILS;

GRANT SELECT,INSERT ON COMP_AUS_DETAIL TO PROCEDURE GETCOMPDETAILS;

GRANT INSERT ON COMP_KAT_DETAILS TO PROCEDURE GETCOMPDETAILS;

GRANT EXECUTE ON PROCEDURE GETCOMPDETAILS TO MYDB;
Erste Proc allein liefert wie gewünscht.
Im Einzelschritt läüft GETCOMPDETAILS auch wie es soll.
Wenn ich es durchlaufen lasse nicht mehr
Ich dachte erst an Feldnamendoppellungen welche auch existieren, erklären kann ich es mir nicht.

Geändert von Blackpit ( 9. Sep 2019 um 20:02 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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