Einzelnen Beitrag anzeigen

alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#13

Re: aktuelles Mwst.-Problem [SQL]

  Alt 12. Aug 2005, 12:57
ich hab mal ein kleines Beispiel erstellt (IBExpert sein Dank).
Es wird in der Verkaufsdatei nur das aktuelle MWSt-Kennzeichen mit geführt.
NICHT die ID des MWSt-Datensatzes. In der MWSt-Datei können mehrere
Sätze mit dem gleichen Kennzeichen aber mit jeweils verschiedenen
Gültigkeitsdaten existieren. Die SP_GET_MWST gibt dann den jeweils
zum Verkaufstag gültigen MWSt-Satz passend zum Kz zurück.

alex



SQL-Code:
SET SQL DIALECT 3;
SET NAMES ISO8859_1;
CONNECT 'D:\TestDB\test_datenbank.fdbUSER 'SYSDBA' PASSWORD 'masterkey';

CREATE GENERATOR GEN_MWST_ID;
SET GENERATOR GEN_MWST_ID TO 5;

CREATE GENERATOR GEN_VERKAUF_ID;
SET GENERATOR GEN_VERKAUF_ID TO 0;

SET TERM ^ ;
CREATE PROCEDURE SP_GET_MWST (
    KZ SMALLINT,
    VK_DATUM DATE)
RETURNS (
    MWSTSATZ DECIMAL(15,2))
AS
BEGIN
  EXIT;
END^
SET TERM ; ^


CREATE TABLE MWST (
    ID INTEGER NOT NULL,
    KZ SMALLINT DEFAULT 0 NOT NULL,
    ABDATUM DATE,
    MWSTSATZ DECIMAL(15,2),
    ANGELEGT TIMESTAMP,
    LETZTEAENDERUNG TIMESTAMP
);


CREATE TABLE VERKAUF (
    ID INTEGER NOT NULL,
    ARTIKEL_ID INTEGER,
    BEZ VARCHAR(50),
    MWST_KZ SMALLINT,
    VK_NETTO DECIMAL(15,2),
    VK_DATUM DATE
);


INSERT INTO MWST (ID, KZ, ABDATUM, MWSTSATZ, ANGELEGT, LETZTEAENDERUNG) VALUES (1, 0, '1900-01-01', 0, NULL, NULL);
REINSERT (3, 2, '1900-01-01', 0.14, NULL, NULL);
REINSERT (2, 1, '1900-01-01', 0.07, NULL, NULL);
REINSERT (4, 2, '1998-04-01', 0.16, NULL, NULL);

COMMIT WORK;

INSERT INTO VERKAUF (ID, ARTIKEL_ID, BEZ, MWST_KZ, VK_NETTO, VK_DATUM) VALUES (1, 1, 'Teil1', 2, 40, '1996-05-25');
REINSERT (2, 333, 'Teil1', 2, 40, '2005-05-25');
REINSERT (3, 444, 'Teil2', 1, 100, '1996-05-25');
REINSERT (4, 44, 'Teil2', 1, 100, '1996-05-25');

COMMIT WORK;

ALTER TABLE MWST ADD CONSTRAINT PK_MWST PRIMARY KEY (ID);
ALTER TABLE VERKAUF ADD CONSTRAINT PK_VERKAUF PRIMARY KEY (ID);

SET TERM ^ ;
CREATE TRIGGER MWST_BI FOR MWST
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_MWST_ID,1);
END
^

CREATE TRIGGER VERKAUF_BI FOR VERKAUF
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_VERKAUF_ID,1);
END
^
SET TERM ; ^

SET TERM ^ ;

ALTER PROCEDURE SP_GET_MWST (
    KZ SMALLINT,
    VK_DATUM DATE)
RETURNS (
    MWSTSATZ DECIMAL(15,2))
AS
BEGIN
  SELECT FIRST 1
    MWSTSATZ
  FROM
    MWST
  WHERE
    (KZ=:KZ) AND (ABDATUM <= :VK_DATUM)
  ORDER BY
    ABDATUM DESC
  INTO
    :MWSTSATZ;
  IF (MWSTSATZ is null) then MWSTSATZ = 0;
  SUSPEND;
END
^
SET TERM ; ^


Abfrage:
SQL-Code:
select V.*, M.MWSTSATZ, V.VK_NETTO*(1+M.MWSTSATZ) as Brutto
from
  VERKAUF V
  left JOIN SP_GET_MWST(V.MWST_KZ, V.VK_DATUM) M on (1=1)
Alexander
  Mit Zitat antworten Zitat