AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Umstellung Paradox -> interbase. SNR handhabung

Umstellung Paradox -> interbase. SNR handhabung

Ein Thema von Sven Janssen · begonnen am 22. Aug 2006 · letzter Beitrag vom 22. Aug 2006
Antwort Antwort
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#1

Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 16:16
Datenbank: Interbase • Version: 6.0 • Zugriff über: TIB etc
Hallo,

wir stellen unsere Software von Paradox auf Interbase um. Dazu habe ich mit IBPump die Datenstruktueren übernommen und diese modifiziert. Wir haben bei einigen Dateien eine SNR benutzt die sie sich automatisch hochzählt.
IBPump hat für diese Felder einen Trigger und ein Generator erstellt.
Nur wie füge ich nun einen Datensatz hinzu? Ich erhalte die Meldung das dieses Feld nicht leer sein darf. Aber wie fülle ich es? Wie muss die InsertSQL Anweisung des TIBDatasets aussehen?
Oder gibt es eine bessere Alternative für diesen Fall?

Gruß Sven
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 16:19
Das Feld darf nich Teil des Inserts sein

Bsp.

TabA:
ID
Name
Vorname

Insert into TabA( Name, Vorname) values ( 'Hans', 'Müller');
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#3

Re: Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 16:25
Hatte ich mir auch gedacht. Gibt aber die gleiche Fehlermeldung.
"Das Welt xyz muß einen Wert haben."
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 16:30
Zitat:
Wie muss die InsertSQL Anweisung des TIBDatasets aussehen?
Wie sieht diese jetzt aus?

Vielleicht wäre es hier besser einen normalen Query zu nehmen.
Markus Kinzler
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 16:33
Hallo,

willkommen im Club der Pdx-IB-Umsteller.

Lösung :

Erstelle für jede Tabelle eine Stored Procedure mit folgendem Inhalt

SQL-Code:
CREATE PROCEDURE BILL_COSTCENTER_NEWID
RETURNS (
    NEWID INTEGER)
AS
begin
  newid=gen_id(Gen_Bill_CostCenter,1);
end
Gen_Bill_CostCenter ist ein Generator.

Diese Stored Procedure ruft du VOR jedem Insert auf.
Der Generator stellt sicher, dass du immer einen neuen Werte bekommst
(quasi AUTOINC in Interbase).

Der Aufruf erfolgt etwa wie folgt (das Bsp geht davon aus, dass alle Generatoren
wie ihre Tabelle selber heissen)

Delphi-Quellcode:
{
  Name:
    Table_GetNewId__DB
  Zweck:
    neue Id über stored proc erzeugen
  Parameter:
    theDataBaseName - database name
    theTableName    - Tabellenname
  Return-Parameter:
    theNewId    - die neue Id
    theErrorStr - Fehlermeldung
  Return:
    False bei einem Fehler
  Hinweis:
}

function Table_GetNewId__DB(const theDataBaseName, theTableName: String;
  var theNewId: Longint; var theErrorStr: String): Boolean;
var
  SP: TStoredProc;
begin
  Result:= False;

  theNewId:= -1;
  theErrorStr:= '';

  try
    SP:= TStoredProc.Create(NIL);
    try
      SP.DataBaseName:= theDataBaseName;
      SP.StoredProcName:= UpperCase(theTableName)+'_NEWID';
      SP.ExecProc;

      theNewId:= StrToInt(SP.Params[0].AsString);

      Result:= True;
    finally
      SP.Free;
    end;
  except
    on E: Exception do
    begin
      theErrorStr:= E.message;
     {$IFDEF DEBUG}
      MBDebug(sFormName+'Table_GetNewId__DB'+#13#10+theTableName+E.message);
     {$ENDIF}
    end;
  end;
end; { Table_GetNewId__DB }

Heiko
PS:
Den Trigger würde ich komplett rauslöschen.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#6

Re: Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 16:39
Liest sich gut, liest sich aber nach viel schreibarbeit :-)
btw. mit TIBSQL funktioniert das ganze. Mit TIBDataSet nicht.
Ich schau mir das dennoch mal genauer mit der StoredProc an.

Sven
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 17:04
Hallo,

Schreibarbeit beim SP-Erzeugen, oder um das umzustellen ?
Den Aufwand hast du eh.
Dann kommt noch das Ersetzen aller TTable in TQuery hinzu,
das Ersetzen von SetRange (vor allem das CancelRange)
(Frage mich beim nächsten Performance-Problem mal wieder )

Ich würde auf jeden Fall auch ein paar Testdaten anlegen,
um nicht nach der Umstellung Fehler zu haben.
Ausserdem solltest du Dialect 3 statt der 1 benutzen,
dann kannst du deine DATE und TIME weiterverwenden
(Dialect 1 hat ja nur DATE ).

Aber das Endergebnis:
- index out of date weg
- blob error weg

-> zufriendene Kunden


Heiko
Heiko
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#8

Re: Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 17:13
Zitat von Sven Janssen:
IBPump hat für diese Felder einen Trigger und ein Generator erstellt.
Dieser Trigger müsste praktisch identisch aussehen wie folgender Vorschlag:
Zitat von hoika:
Lösung : Erstelle für jede Tabelle eine Stored Procedure mit folgendem Inhalt:
SQL-Code:
CREATE PROCEDURE BILL_COSTCENTER_NEWID
RETURNS (
    NEWID INTEGER)
AS
begin
  newid=gen_id(Gen_Bill_CostCenter,1);
end
Gen_Bill_CostCenter ist ein Generator.

Heiko
PS: Den Trigger würde ich komplett rauslöschen.
Nein, der Trigger ist genau die IB-interne Lösung für eine Stored Procedure, die automatisch ausgeführt wird (und nicht erst vom Delphi-Programm aus aktiviert werden muss):
SQL-Code:
CREATE TRIGGER BILL_COSTCENTER_Before_Insert_0 FOR BILL_COSTCENTER
ACTIVE BEFORE INSERT POSITION 0
AS BEGIN
  IF ( New.ID IS NULL)
  THEN New.ID = GEN_ID( Gen_Bill_CostCenter, 1);
END
Also schau Dir einmal an, was IBPump gemacht hat, und übernimm bzw. überarbeite diese Vorschläge. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von Sven Janssen
Sven Janssen

Registriert seit: 22. Jun 2004
Ort: Mayen
187 Beiträge
 
Delphi 4 Professional
 
#9

Re: Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 17:28
Zitat von hoika:
Hallo,

Schreibarbeit beim SP-Erzeugen, oder um das umzustellen ?
Den Aufwand hast du eh.
Dann kommt noch das Ersetzen aller TTable in TQuery hinzu,
das Ersetzen von SetRange (vor allem das CancelRange)
(Frage mich beim nächsten Performance-Problem mal wieder ;) )
Wir schreiben alles neu.
Wir hatten schoneinmal damit begonnen und versucht das irgendwie umzuschreiben, aber das war alles Käse. Zwischenzeitlich hatten wir so viele Aufträge das wir nicht weitermachen konnten. Aber die Zeit drängt und daher habe ich nun wieder angefangen. Die kleinen Apps haben wir gelassen ( von der ersten Umstellung), die großen Programme werden umgeschrieben. Sind auch ein paar tausend Zeilen.

Zitat von hoika:
Ich würde auf jeden Fall auch ein paar Testdaten anlegen,
um nicht nach der Umstellung Fehler zu haben.
Ausserdem solltest du Dialect 3 statt der 1 benutzen,
dann kannst du deine DATE und TIME weiterverwenden
(Dialect 1 hat ja nur DATE ).
Wir haben schon ein Konvertierungsprogramm geschrieben. War mir wichtig direkt mit den großen fetten DBs unserer Kunden zu testen und nicht mit 10-20 Datensätze.

Zitat von hoika:
Aber das Endergebnis:
- index out of date weg
- blob error weg
Das uns mehr performance und fernverbindungen sind uns sehr wichtig.
:wq /dev/null
He who fights with monsters might take care lest he thereby become a monster - Nietzsche
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.269 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Umstellung Paradox -> interbase. SNR handhabung

  Alt 22. Aug 2006, 17:31
Hallo Sven,

mit Tests meinte ich nicht nur Performance-Tests,
sondern vor allem Korrektheit-Tests.
Nicht dass bei der Umstellung neue Fehler eingebaut werden.


Heiko
Heiko
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 16:45 Uhr.
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