Veröffentlicht 24. Januar 200619 j Hallo Leute, folgendes Problem brachte mir keine Erfolge bei Anwendung der Suchfunktion Ich habe hier eine Standardsoftware, welche eine Oracle-DB als Backend verwendet. Es geht darum, dass in dieser Tabelle drei Arten von Konten gespeichert sind. - Sachkonten - Debitoren - Kreditoren Nun ist eh klar, dass es sich um eine Buchhaltungssoftware handelt *g* Die Tabelle hat ein Feld "Klasse" und ein Feld "Matchcode", welche EDV-technisch zusammen keine Eindeutigkeit erzeugen. Nun speichert unsere Firma im Feld Matchcode die eindeutige Personenbezeichnung (für Debitoren und Kreditoren), was jedoch bedeutet, dass im Falle eines Sachkontos das Feld Matchcode immer leer ist. Nun bräuchte ich einen Schutz, damit jeweils nur EIN Debitor mit dem selben Matchcode und EIN Kreditor mit dem selben Matchcode in der Buchhaltung eingegeben werden kann. Wie löse ich die Sache am besten, wenn es mir unmöglich ist PK bzw. UK einzusetzen? Ist ein Trigger die beste Lösung oder gibt es intelligentere Alternativen? Über eine Hilfestellung wäre ich sehr froh, ich danke euch. Gruß Stefan
24. Januar 200619 j hast du die erlaubnis bzw. kannst du ein DESC TABLE hier reinposten? wenn du es mit trigger löst, wird dieser vermutlich bei einfügen und aktualisieren-aktionen auslösen müssen. hab mal versucht einen trigger zu bauen, weiss aber nicht, wie deine tabelle wirklich aufgebaut ist. CREATE OR REPLACE TRIGGER KAG_CN.TRG_KONTEN BEFORE INSERT OR UPDATE ON MEINBUCHHALTUNGSSCHEMA.KONTEN REFERENCING NEW AS New OLD AS Old FOR EACH ROW DECLARE tmpMatchcode VARCHAR2(30); BEGIN tmpMatchcode := ''; select matchcode, debitor, kreditor from konten into tmpMatchcode where matchcode = :OLD.matchcode; if tmpMatchcode = <kriterium> and debitor is not null then insert into konten (matchcode,debitor) values (tmpMatchcode, :NEW.debitor); end if; if tmpMatchcode = <kriterium> and kreditor is not null then insert into konten (matchcode,kreditor) values (tmpMatchcode, :NEW.kreditor); EXCEPTION WHEN OTHERS THEN RAISE; END ; / s'Amstel
24. Januar 200619 j Woah das nennt man Hilfestelltung, schonmal ein riesen Dankeschön für deinen Aufwand Hier der desc der Tabelle: Name Null? Typ ----------------------------------------- -------- ----------- DVKONTONUMMER NOT NULL NUMBER(10) KLASSE NOT NULL CHAR(1) KONTONUMMER NOT NULL CHAR(12) FILIALE CHAR(3) BEZEICHNUNG NOT NULL CHAR(35) BEZEICHNUNG2 CHAR(35) MATCHCODE CHAR(20) BERECHTIGUNG CHAR(1) OPKONTO NUMBER(10) BUCHENGESPERRT NUMBER(10) LOESCHENVORGEMERKT NUMBER(10) LETZTEKTOSEITE NUMBER(10) BEZEICHNUNGALT CHAR(35) BEZEICHNUNG2ALT CHAR(35) BEZALTGUELTIGBIS DATE GEAENDERTAM NOT NULL DATE GEAENDERTVON NOT NULL CHAR(4) ZFSALESENGINEER CHAR(12) ZFPREISLISTHACOS CHAR(12) ZFKLEINMENGEGRENZE NUMBER(7,2) ZFRECHNUNGSKOPIEN NUMBER(10) ZFRABATTZEILE CHAR(12) ZFWAHRUNG CHAR(3) Werde den Trigger gleich mal austesten. Gruß Stefan
24. Januar 200619 j du wirst halt noch etwas rumexperimentieren müssen, z.b. die variablendeklaration auf CHAR und die INSERTs sowie die EXCEPTION anpassen. s'Amstel
24. Januar 200619 j du wirst halt noch etwas rumexperimentieren müssen, z.b. die variablendeklaration auf CHAR und die INSERTs sowie die EXCEPTION anpassen. s'Amstel Bin schon dran
25. Januar 200619 j Nun habe ich ein Problem, wenn ich einen derartigen Trigger da raufsetze, dann bekomme ich schon beim Anlegen einer neuen Person in der Buchhaltung einen Oracle-Fehler, dass keine Daten für einen "INSERT" vorhanden seien. Scheinbar steckt da in der Buchhaltungssoftware ein ungünstiger Vorgang für das Beschreiben der Tabellen dahinter. Vorschläge, wie man so etwas lösen könnte? Anbei die Fehlermeldung: ORA-01403: Keine Daten gefunden INSERT INTO SA900.Konto(Klasse, DVKontonummer, BezeichnungsAlt, ...) VALUES (:P1,:P2,P3,...)
27. Januar 200619 j Hallo, dieser Fehler tritt normalerweise dann auf, wenn du aus einem Cursor alle Records gelesen hast. Möglich, dass ein select into, das kein Ergebnis liefert auch eine solche Exception verursacht. select matchcode, debitor, kreditor from konten into tmpMatchcode where matchcode = :OLD.matchcode; Dann könnte der Fehler in dieser Anweisung liegen und zwar wenn kein Datensatz mit matchcode = :OLD.matchcode zurückgegeben wurde. Das würde ich erstmal testen. Ansonsten poste doch bitte mal den Code deines Triggers. Gruß Nils
29. Januar 200619 j Dank dir vielmals Aber ich habe das Problem bereits mit einer simplen Abfrage gelöst, die gar nicht mit meiner ursprünglichen Idee zu tun hatte Gruß Steve
Archiv
Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.