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
Blackpit

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

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

  Alt 7. Sep 2019, 17:04
Hallo,
erstmal Danke für's Feedback.
Bin leider jetzt erst wieder dazugekommen mich zu melden.
so einfach ist die Sache leider nicht. Die Felder entsprechen jetzt ja Tabelleneinträge mit PK der aber unterschiedlich sein kann.
Ich müsste also die Felder mittels phonetischer Suche matchen oder ich erstell mir eine Zuordnungstabelle mit den Feldnamen und den korrrespondierenden Tabelleneinträgen über welchen ich dann den PK bekomme um einen Insert in der neuen Struktur machen zu können.
Bisher hab ich folgendes und komm nicht weiter:
Code:
execute block
returns (myID integer, table_name varchar(100),column_name varchar(100), column_value varchar(100))
as
begin
for select ID from comp group by 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('MyDef')) 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
Damit wollte ich von allen Komponenten die Tabellen und Einträge ermitteln.
Im Einzelmodus bekomme ich alle felder mit Inhalten, welche ich noch auf Value = 'j' filtern müsste.
Die Ergebnismenge wäre dann für ein Insertstatement geeignet. Ich steh irgendwie an.
Kann mich jemand mal schubsen?

@IBExpert
Zitat von IBExpert:
ich schätze aber, das ich anhand deiner Beschreibung dafür maximal 5-15 Minuten brauchen würde, um das umzusetzen
nehme ich gerne an

Geändert von Blackpit ( 7. Sep 2019 um 18:41 Uhr) Grund: Schleife richtig gesetzt
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

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

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

  Alt 7. Sep 2019, 20:36
Was ist denn mit dieser ergebnismenge dein nächstes problem?
Du kannst in einem anderen execute block diesen execute block per execute statement aufrufen und dann ähnlich weiterverarbeiten.
Oder auch dir namen dazu ausdenken und dann execute block durch create procedure name ersetzen , das macht rekursionen einfacher
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
 
#3

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

  Alt 8. Sep 2019, 08:30
Hallo,
zum einen hätte ich die Ergebnismenge gerne schon nach Wert gefiltert zum anderen muss ich die Feldnamen mit meiner Vergleichstabelle abgleichen um aus der Detailtabelle mit Stringvergleich per Lookup den Schlüssel zu bekommen um das Insertstatement zu erstellen.
Ich arbeite noch nicht solange mit Firebird und habe bisher noch nicht mit Blöcken gearbeitet. Wie rufe ich mit der Ergebnismenge einen neuen Block auf? Ich muss dann wohl noch filtern wenn das im vorherigen Block nicht möglich ist und mit den Lookupwerten das Inserstatement erstellen und ausführen. Gibt es sowas wie ein try except?
Wie könnte der Aufruf aussehen?
Danke vorab
Gruß BP
  Mit Zitat antworten Zitat
Benutzerbild von IBExpert
IBExpert

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

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

  Alt 8. Sep 2019, 08:59
Code:
execute block
returns (tblname varchar(31))
as
declare variable sql varchar(2000);
begin
  sql='execute block
returns (tbl varchar(80))
as
begin
  for select rdb$relation_name from rdb$relations into tbl do
  suspend;
  when any do
  begin
   --hier kannst du z.B. exception wie hier einfach ignorieren
   --oder mit exception exceptionname selber definieren
   --falls du ''Stringkonstanten'' braucht, doublequotes nehmen
  end
end';

  for execute statement :sql into tblname do
  begin
    if (tblname not containing '$') then suspend ;
  end
end
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
 
#5

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

  Alt 8. Sep 2019, 10:42
Hallo Holger,
wenn ich das richtig interpretiere führe ich den Block als Statement aus und arbeite mit dessen Resultset weiter.
Die exception über "when any do" gilt hier entsprechend für den neuen Block, in dem ich dann die Insertstatements ausführen würde.
Soweit so gut, aber wo soll ich meine Ergebnismenge filtern, im "for execute statement"? Und wie würdest du den Vergleich der column-fieldnames mit den Bezeichnungen der Detailtabelle und den lookup für den Key integrieren?
Die Frage nach Exception stellte sich mir, da es vorkommen kann, dass in der Detailtabelle kein DS für den Wert aus der Vergleichstabelle exisitiert. In diesem fall müsste in der Detailtabelle ein neuer DS erstellt werden und der neue Key übergeben werden. Es sollte somit sichergestellt sein, das dieser Block immer den Key zurückgibt.
Gruß BP

Geändert von Blackpit ( 8. Sep 2019 um 10:50 Uhr) Grund: weitere Ergänzungen
  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 8. Sep 2019, 11:03
mach das dann lieber über extra prozeduren, in fb3 könntest du die als hilfsprozeduren in einer einer package ablegen
und auf der results direkt deine where bedingungen legen (packages sind so ähnlich wie units in delphi, was außerhalb
sichtbar ist muss dann in den head).

Aufruf erfolgt dann in fb3 über
Code:
select * from tools.getusertables
wenn du das in fb<3 machen willst, nimm einfach die beiden sps aus dem recreate teil und erstelle die ohne package, aufruf dann
ohne tools. vor dem objektnamen


Code:
SET TERM ^ ;

CREATE OR ALTER package tools
as
begin
  procedure GetUserTables
  returns (tblname varchar(31));

 
end^

RECREATE package body tools
as
begin
procedure GetAllTableName
returns (tbl varchar(80))
as
begin
  for select rdb$relation_name from rdb$relations into tbl do
  suspend;
  when any do
  begin
   --hier kannst du z.B. exception wie hier einfach ignorieren
   --oder mit exception exceptionname selber definieren
   --falls du ''Stringkonstanten'' braucht, doublequotes nehmen
  end
end
 
procedure GetUserTables
returns (tblname varchar(31))
as
begin
  for select tbl from GetallTableName where tbl not containing '$' into tblname do
  begin
    suspend ;
  end
end
end
^

SET TERM ; ^

/* Existing privileges on this package */

GRANT EXECUTE ON PACKAGE TOOLS TO SYSDBA;
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 8. Sep 2019, 11:16
Hallo Holger,
ist ja ein cooles Feature, aber leider erst in FB3 (hab hier 2.5) trotzdem gut zu wissen
Dann werd ich mal mein Glück versuchen, wenn ich anstehe würde ich mich nochmal melden.
BTW ich würde das ganze noch gern protokollieren, gibt's dafür integrierte Mechanismen oder IBExpert-Tools?
Vielen Dank schonmal für die Unterstützung!
Gruß BP
  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 05:52 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