![]() |
Datenbank: Firebird • Version: 2.5.4 • Zugriff über: IBO
SL Update mit StoredProc
Hallo,
geht so was:
Delphi-Quellcode:
Der Befehl wird ausgeführt aber die Spalte Sortierung ist null.
update tbl_gebuehren set sortierung = (select result from SP_Sortstring('Ziffer'))
|
AW: SL Uodate mit StoreOroc
Liefert die SP auch ein Feld mit der Bezeichnung "result" zurück?
SUSPEND vergessen? |
AW: SL Uodate mit StoreOroc
Hallo,
habe von FireBird keine Ahnung, bei den mir bekannten Datenbanken würde ich es in der Form machen:
Code:
'Ziffer' dürfte in Deinem Beispiel bedeuten, dass die SP_Sortstring aus der Zeichenfolge 'Ziffer' die Sortierung erstellt, also bei allen Datensätzen zum gleichen Ergebnis kommt. Du möchtest aber sicherlich die Sortierung aus dem Inhalt der Spalte Ziffer gebildet bekommen.
update tbl_gebuehren set sortierung = SP_Sortstring(Ziffer);
|
AW: SL Uodate mit StoreOroc
Ja das kann funktionieren, aber deine SP scheint mir ein wenig unangepasst zu sein.
Normal wäre mindestens ein (individueller) Eingabewert, wenn 'Ziffer' genutzt wird um Zufallszahlen zu generieren sollte es reichen. Wird denn überhaupt ein Wert zurück gegeben? Aber warum so, die SP kann den Update doch selbst durchführen!? Gruß K-H |
AW: SL Uodate mit StoreOroc
Zitat:
![]() Wenn die SP das Update selbst ausführt, geht es aber nur nach dem Motto: "Alles oder nichts", also für die gesamte Tabelle. Dies ist bei der erstmaligen Befüllung der Spalte Sortierung sicherlich sinnvoll. Bei allen später hinzukommenden oder geänderten Datensätzen aber nicht, da sollte man die SP lieber in einen entsprechenden Datenbanktrigger legen, der nur bei Änderungen der Spalte Ziffer für eine Neubefüllung der Spalte Sortierung, des konkret betroffenen Datensatzes, sorgt. |
AW: SL Update mit StoredProc
Wenn ich mich nicht verlesen habe, dann liefert die SP von DataSpider für 'Ziffer' NULL. Für '1Ziffer' sieht das schon ganz anders aus.
Gruß K-H |
AW: SL Update mit StoredProc
Hi,
die SP berücksichtigt nicht, dass es auch Werte ohne Zahl gibt. Du musst das Ende der SP noch mal ändern:
Code:
die 2 Zeilen vor dem supend hinzufügen
...
if (coalesce(:temp, '') <> '') then begin -- Zahl vor Punkt auffüllen pos = position('.', :temp); if (:pos = 0) then result = lpad(:temp, 10, '0')||'.'||lpad('0', 10, '0'); else result = lpad(substring(:temp from 1 for :pos -1), 10, '0')||'.'|| lpad(substring(:temp from :pos + 1 for :laenge), 10, '0'); result = :result||coalesce(:rest, ''); end else Result = :rest; suspend; Frank |
AW: SL Update mit StoredProc
Hallo,
hier mal zum besseren Verständnis dir SP:
Delphi-Quellcode:
Ich möchte einmalig alle Datensätze das Feld Sortierung füllen.
begin
result = null; laenge = char_length(:wert); if (:laenge > 0) then begin pos = 1; while (:pos <= :laenge) do begin zeichen = substring(:wert from :pos for 1); if (:zeichen in ('0','1','2','3','4','5','6','7','8','9', '.')) then temp = coalesce(:temp, '')||:zeichen; else begin -- Rest hinten rest = substring(:wert from :pos for 10); break; end pos = :pos + 1; end end if (coalesce(:temp, '') <> '') then begin -- Zahl vor Punkt auffüllen pos = position('.', :temp); if (:pos = 0) then result = lpad(:temp, 10, '0')||'.'||lpad('0', 10, '0'); else result = lpad(substring(:temp from 1 for :pos -1), 10, '0')||'.'|| lpad(substring(:temp from :pos + 1 for :laenge), 10, '0'); result = :result||coalesce(:rest, ''); end suspend; end Später wir beim Ändern oder Neuanlegen eines Datensatzes ein Trigger benutzt. |
AW: SL Update mit StoredProc
Nicht daß es untergeht:
Zitat:
|
AW: SL Update mit StoredProc
Zitat:
Code:
wenig sinnvoll, da hier für alle Datensätze der Tabelle die Sortierung anhand der konstanten Zeichenfolge 'Ziffer' ermittelt wird und nicht anhand des Inhaltes der Spalte Ziffer. Bei '1Ziffer' mag also durchaus was anderes herauskommen, als bei 'Ziffer', aber es wird für alle Datensätze der Tabelle der gleiche Wert sein, Null wird also für alle Datensätze durch einen anderen, aber immer gleichen Wert, ersetzt.
update tbl_gebuehren set sortierung = (select result from SP_Sortstring('Ziffer'))
Oder ist die Funktionalität von Firebird so anders, dass bei SP_Sortstring('Ziffer') hier tatsächlich der Inhalt der Spalte Ziffer genutzt wird? Dies würde mich doch sehr wundern. |
AW: SL Update mit StoredProc
Hi Frank,
habe die Zeilen eingefügt. nach Ausführung des SQL Befehls steht in Feld Sortierung aller Datensätze 'Ziffer'. ??? |
AW: SL Update mit StoredProc
OK K-H. Wie kann ich denn den Wert der Spalte Ziffer übergeben?
|
AW: SL Update mit StoredProc
Zitat:
Zitat:
Code:
Nimm doch bitte mal die Kontraproduktiven ' vor und hinter Ziffer heraus, damit die Datenbank die Möglichkeit bekommt, den Inhalt der Spalte Ziffer zu verwenden.
update tbl_gebuehren set sortierung = (select result from SP_Sortstring('Ziffer'))
Also so:
Code:
update tbl_gebuehren set sortierung = (select result from SP_Sortstring(Ziffer))
|
AW: SL Update mit StoredProc
OK,
das funktioniert soweit. Danke. Nun muss ich noch rausfinden bei welchen Datensatz dieser Fehler kommt. Arithmetic overflow or division by zero has occurred. arithmetic exception, numeric overflow, or string truncation. string right truncation. At procedure 'SP_SORTSTRING' line: 46, col: 2. |
AW: SL Update mit StoredProc
Zitat:
deshalb wies ich dich bereits darauf hin, dass du die Länge der Varchar' s überprüfen sollst. Setz doch mal alle VARCHAR auf 100:
Code:
dann wird der Fehler sicher weg sein.
create or alter procedure sp_sortstring (
wert varchar(100)) returns ( result varchar(100)) as declare variable laenge smallint; declare variable pos smallint; declare variable zeichen char(1); declare variable temp varchar(100); declare variable rest varchar(100); ... Frank |
AW: SL Update mit StoredProc
Hallo,
Welche Zeile ist das (bin mit dem iPad hier). Eine genaue Beschreibung wird es erst mit FB 3.0 geben. Jetzt hilft hier nur, Ausgaben in eine Log-Tabelle zu schreiben. Dort steht dann der letzte erfolgreiche gelesene String drin, der nächste ist das Problemkind. Woher kennt mein Vorredner die ganze SP??? Heiko |
AW: SL Update mit StoredProc
Er hat sie
![]() |
AW: SL Update mit StoredProc
Zitat:
Code:
Ich habe auch in der Zeile die Zeile
create or alter procedure sp_sortstring (
wert varchar(100)) returns ( result varchar(100)) as declare variable laenge smallint; declare variable pos smallint; declare variable zeichen char(1); declare variable temp varchar(100); declare variable rest varchar(100); begin result = null; laenge = char_length(:wert); if (:laenge > 0) then begin pos = 1; while (:pos <= :laenge) do begin zeichen = substring(:wert from :pos for 1); if (:zeichen in ('0','1','2','3','4','5','6','7','8','9', '.')) then temp = coalesce(:temp, '')||:zeichen; else begin -- Rest hinten rest = substring(:wert from :pos for 100); break; end pos = :pos + 1; end end if (coalesce(:temp, '') <> '') then begin -- Zahl vor Punkt auffüllen pos = position('.', :temp); if (:pos = 0) then result = lpad(:temp, 10, '0')||'.'||lpad('0', 10, '0'); else result = lpad(substring(:temp from 1 for :pos -1), 10, '0')||'.'|| lpad(substring(:temp from :pos + 1 for :laenge), 10, '0'); result = :result||coalesce(:rest, ''); end else Result = :rest; suspend; end
Code:
von 10 auf 100 geändert.
rest = substring(:wert from :pos for 100);
Walter, du solltest dennoch die SP überprüfen. Ich fülle jetzt die numerischen Teile bis 10 Stellen auf. aus 14.5 mache ich 0000000014.0000000005 Auch das funktioniert evtl. nur korrekt, wenn deine numerischen Teile nie länger als 10 sind. (hab jetzt nicht im Kopf, ob lpad dann abschneidet, den Wert so lässt oder eine Exception wirft. Wenn du z.B. einen Wert 123456789012.3a hättest - hättest du u.U. ein neues Problem. Ich kann nur eine Vorlage liefern, nicht die fehlerfreie Lösung. Frank |
AW: SL Update mit StoredProc
Danke Frank, hatte den Datensatz der den Fehler verursacht hat gefunden und Korrigiert. Lag an solchen Ziffern 50G (9.3a).
Funktioniert alles bestens. Danke nochmals für Deine Mühen. |
AW: SL Update mit StoredProc
Zitat:
Dein Beispiel liefert "0000000050.0000000000G (9.3a)." Das sind 30, die Länge von Result. Das ist arg grenzwertig. Setz die Varchars hoch, wenn du es noch nicht gemacht hast. Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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 by Thomas Breitkreuz