Announcement

Collapse
No announcement yet.

Delphi dll als udf in firebird

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Delphi dll als udf in firebird

    Moin Leute,

    ich arbeite an einem Projekt und zwar habe ich eine DLL in Delphi geschrieben die ich in Firebird als UDF verwenden will. Hier der Quellcode meiner DLL:

    library age;
    uses
    SysUtils,
    DateUtils,
    Classes;
    function age(Gdatum: Tdatetime): shortint; stdcall;
    var today: tdatetime;
    begin
    today := now;
    Result := YearsBetween(Gdatum, today);
    end;
    exports
    age;
    begin
    end.

    Mit folgendem Code habe ich die UDF deklariert:

    DECLARE EXTERNAL FUNCTION Age
    DATE
    RETURNS INTEGER BY VALUE
    ENTRY_POINT 'age' MODULE_NAME 'age.dll';

    Gdatum soll mit Werten aus der Tabelle T_1.GEBURTSDATUM gefüttert werden (DD:MM:YYYY).
    Mein SQL Statement dazu lautet:

    select age (Geburtsdatum) from t_1

    Jedoch bekomme ich hier immer diese Fehlermeldung:

    Error Message:
    ----------------------------------------
    Unsuccessful execution caused by a system error that precludes
    successful execution of subsequent statements.
    Error writing data to the connection.

    Und erhalte eine Spalte namens AGE und die ist mit einem Datensatz gefüllt und zwar <null>

    Wie erhalte ich als Ausgabe das Ergebnis meiner Funktion sprich das Alter.


    P.S: Client für Firebrid ist IBexpert

    MfG und vielen dank im vorraus

    AnGeLo^

  • #2
    Hi,

    also ich habe noch nichts mit vergleichbarer Technologie gemacht, aber

    - bist du sicher, das der Firebird INTEGER dem Delphi SHORTINT (16bit) entspricht.
    - Ist DateTime auch so zuweisungskompatibel ?

    GGf. kann man die Parameter besser als Strings - in die DLL aber als PChar übergeben.

    Ist der aktuelle Anwendungsfall ein Übungsbeispiel ? Wenn nicht - da gibt's doch bestimmt auch eine Firebird - Interne Lösung ala DateDiff o.ä.

    Viel Erfolg!
    Tino
    Ich habs gleich!
    ... sagte der Programmierer.

    Comment


    • #3
      Stimmt da müsste ich schon Smallint nehmen ^^
      ich werd mal bisschen mit den Dateitypen rumprobieren vielleicht liegt da ja wirklich der Fehler. Ich muss Delphi nutzen ist ein Schulprojekt das meine Aufgabe -.-. Hat vielleicht noch jemand ne Idee?


      Danke erstmal

      Comment


      • #4
        Habs immer noch nicht hinbekommen -.- lag wohl doch nicht an den typen habs jetzt im IBexpert als smallint gesetzt und in delphi als shortint. Vielleicht noch jemand ne Idee ich bekomms einfach nicht hin. Ist die DLL wenigstens korrekt vom Code her?.

        Comment


        • #5
          Hi,

          ein wenig spät, aber vielleicht hilft es ja noch

          Code:
          library MyUDF;
          
          uses
            SysUtils,
            cxDateUtils,
            Classes;
          
          const
            IBDateDelta = 15018;
          
          type
            TIBDateTime = record
              Days,
              MSec10: integer;
            end;
            PIBDateTime = ^TIBDateTime;
          
            function GET_AGE(InDate: PIBDateTime): integer; cdecl;
            begin
              try
                result:=YearsBetween(InDate^.Days - IBDateDelta, Trunc(now) );
              except
                Result := 0;
              end;
            end;
          
          exports
            GET_AGE Name 'GET_AGE' resident;
          begin
          end.
          
          DECLARE EXTERNAL FUNCTION GET_AGE
            DATE
          RETURNS INTEGER BY VALUE
          ENTRY_POINT 'GET_AGE' MODULE_NAME 'MYUDF.DLL';
          Viel spass damit

          Comment


          • #6
            Danke für deine Hilfe hab noch eine Woche Aufschub bekommen. Ich bekomm es mit deinem Code nicht hin beim Kompilieren bekomme ich den Fatalen Fehler Datei nicht gefunden: 'cx DateUtils.dcu' wo bekomm ich die her?

            Comment


            • #7
              nimm einfach die DateUtils.dcu und lass das CX weg. Diese Unit wird nur für die Function YearsBetween() benötigt

              Comment

              Working...
              X