Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Strukturänderung Ja/Nein-Felder in Firebird (https://www.delphipraxis.net/201769-strukturaenderung-ja-nein-felder-firebird.html)

Blackpit 24. Aug 2019 16:12

Datenbank: Firebird • Version: 2.5 • Zugriff über: egal

Strukturänderung Ja/Nein-Felder in Firebird
 
Hallo Gemeinde,
aufgrund einer (von mir erzwungenen ;)) Strukturänderung des DM, muss ich jetzt die Altdaten aus mehreren J/N-Tabellen in ein normalisiertes DM überführen.
Dazu müssen alle Felder durchlaufen werden und wenn Ja, wird ein DS im neuen DM erstellt.
Bevor ich den steinigen Weg gehe, wollte ich fragen ob es per SQL eine Möglichkeit gibt. Ich dachte an sowas wie eine Kreuztabelle.
War schon mal jemand damit konfrontiert oder hat jemand eine Idee?

Gruß
BP

Lemmy 25. Aug 2019 11:30

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

wenn Du da ne vernünftige Antwort willst, solltest Du schon etwas mehr Informationen raus rücken: Wie sieht dein Datenmodell jetzt aus und wie soll es nachher aussehen.
Zitat:

die Altdaten aus mehreren J/N-Tabellen in ein normalisiertes DM überführen.
lässt ziemlich viel Spielraum....

Neumann 25. Aug 2019 11:38

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Ich habe auch gerätselt was das wohl bedeuten soll

IBExpert 25. Aug 2019 12:23

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
Unahängig von der nebulösen Beschreibung, was deine Anforderungen sind, ist so eine Änderung nur wirklich keine Raketenwissenschaft.

Wenn du zum Beispiel eine Stored procedure oder alternativ einen execute block erstellst, mit dem du mit einem for select durch deine Eingangsdaten gehst (falls in anderer db, dann eben per execute statement on external) und dann anhand der vorgefundenen Daten dann inserts in deine neue Tabelle machst, dann ist das schnell und reproduzierbar erledigt.

Oder als Antwort auf deine Frage: Ja, es gibt einen Weg, das mit Firebird SQL Befehlen zu machen.

Ob du das mit den o.a. Stichworten zusammenbauen kannst, kann ich dir nicht sagen, ich schätze aber, das ich anhand deiner Beschreibung dafür maximal 5-15 Minuten brauchen würde, um das umzusetzen, wenn dein Datenmodell schon steht und es nicht 500 Felder in 100 Tabellen sind (dann würde es sicherlich ein wenig länger dauern, aber sicherlich trotzdem weniger als 2 Stunden.

jobo 26. Aug 2019 09:19

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

Zitat von Blackpit (Beitrag 1442961)
..
Dazu müssen alle Felder durchlaufen werden und wenn Ja, wird ein DS im neuen DM erstellt.
..

Code:
select <feldliste> from meineSpannendendaten
 where <bestimmtesFeld> = 'JA' (oder true oder 1 oder so)
Wenn dieses Statement so formuliert ist, dass es die gewünschten Werte liefert, kombiniere es mit einem Insert Statement


Code:
insert into <tabelleGemäßneuemDatenmodell> (<feldliste>)
select <feldliste> from meineSpannendendaten
 where <bestimmtesFeld> = 'JA' (oder true oder 1 oder so)
Da brauchst Du erstmal keine Kreuztabelle. Aber vielleicht ist es komplizierter, als Deine Frage ahnen lässt.

Blackpit 7. Sep 2019 18:04

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
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:

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 ;)

IBExpert 7. Sep 2019 21:36

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
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

Blackpit 8. Sep 2019 09:30

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
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

IBExpert 8. Sep 2019 09:59

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
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

Blackpit 8. Sep 2019 11:42

AW: Strukturänderung Ja/Nein-Felder in Firebird
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz