Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi DDBAC Fehler: "Interface nicht unterstützt" (https://www.delphipraxis.net/195418-ddbac-fehler-interface-nicht-unterstuetzt.html)

Hobbycoder 27. Feb 2018 08:07

DDBAC Fehler: "Interface nicht unterstützt"
 
Hi,

ich schreibe grad an einer Anwendung in der ich Kontodaten abrufen will. Dafür nutze ich DDBAC. Aber an einer Stelle komme ich nicht weiter.
Hier der Source:
Delphi-Quellcode:
procedure TBankList.GetAmounts(ID, pin: string; bank: TBank);
var
  aHKKAZ: BACSegment;
  aMsgLogin, aMsgLogout: BACMessage;
  aMsg: BACMessage;
  fHaveSomething: Boolean;
  sCursor: String;
  aDataObject: BACDataObject;
  aTxn: BACTransaction;
  aHIKAZ, aHIKAZ2: BACSegment;
  aBlob: BACDataObject;
  aMT940: BACSwiftStatement;
  aLine: BACSwiftStatementLine;
  aBDP: BACSegments;
  a: TAmount;
  i, l, iSpeicherzeitraum: Integer;
  von, bis: TDateTime;
begin
  aDialog:=bank.contact.aContact.NewDialog(pin);
  if aDialog<>nil then
  begin
    aMsgLogin:=BACMessage(aDialog.BeginDialog(bacDialogStandard, ID, nil));
    if aDialog.HBCIResultCode>=9000 then Exit;
  end else Exit;
  fHaveSomething:=False;
  aBDP:=bank.contact.aContact.BankData.Segments;
  l:=aBDP.FindSegmentType('HIKAZS', 0);
  if l>=0then
  begin
    aHIKAZ:=BACSegment(aBDP.Item[l]);
    iSpeicherzeitraum:=aHIKAZ.Item['Parameter1', 'Speicherzeitraum1'];
    bis:=Now;
    von:=bis-iSpeicherzeitraum;
  end else begin
    bis:=Now;
    von:=bis-7;
  end;
  aDataObject:=CoBACDataObject.Create;
  aHKKAZ:=CreateTransactionSegment('HKKAZ', bank);
  SetAuftraggeberKontoverbindung(aHKKAZ, bank);
  aHKKAZ.Item['Kontowaehrung1',1]:=bank.account.aAccount.Currency;
  aHKKAZ.Item['AlleKonten1', 1]:=False;
  aHKKAZ.Item['DatumVon1', 1]:=von;
  aHKKAZ.Item['DatumBis1', 1]:=bis;
  repeat
    aMsg:=BACMessage(aDialog.ExecuteSegment(aHKKAZ));
    ReportResult(aMsg, sCursor, aHKKAZ);
    aTxn:=aMsg.Transactions[0];
    if aTxn.ResponseSegments.Count=1 then
    begin
      aHIKAZ2:=BACSegment(aTxn.ResponseSegments[0]);
      DoDisplayTransactionStatusText(aHIKAZ2.GetXML);
      if not VarIsEmpty(aHIKAZ2.Item['UmsaetzeGebucht1', 1]) then
      begin
        fHaveSomething:=True;
        aBlob:=IUnknown(aHIKAZ2.item['UmsaetzeGebucht1', 1]) as IBACDataObject2; // <<<<<<<< - Hier tritt der Fehler auf
        aDataObject.PutString(aDataObject.GetString+aBlob);
      end;
    end;
    if Length(sCursor)=0 then
      Break else
      aHKKAZ.Item['Aufsetzpunkt1', 1] := sCursor;
  until true;
  if fHaveSomething then
  begin
    aMT940:=CoBACSwiftStatement.Create;
    aDataObject.WriteToObject(aMT940);
    //a:=TAmount.Create;
    for i:=0 to aMT940.StatementLines.Count-1 do
    begin
      aLine:=BACSwiftStatementLine(aMT940.StatementLines[i]);
      //a.AccountNumber:=aLine.AccountNumber;
      //Daten lesen
    end;
    //bank.amountList.Add(a);
  end;
  aMsgLogout:=BACMessage(aDialog.EndDialog(nil));
end;
in der markierten Zeile
Delphi-Quellcode:
 aBlob:=IUnknown(aHIKAZ2.item['UmsaetzeGebucht1', 1]) as IBACDataObject2;
tritt folgender Fehler auf: "Im Projekt ist eine Exception der Klasse EIntfCastError mit der Meldung 'Interface nicht unterstützt' aufgetreten".

Da ich mich mit Interfaces so gar nicht auskenne bleibt mir der Ursprung dieses Fehlers verborgen und ich hoffe auf eure Hilfe.
Bis zu dieser Zeile funktioniert alles. Auch werden Umsatzdaten geholt.

Kennt jemand dieses Problem und kann mir bei der Lösung helfen? Danke.

Fritzew 27. Feb 2018 11:43

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Welche Version von DDBAC setzt Du ein?
Wo ist sie her? Da sind einige unterschiedliche im Umlauf.

Hobbycoder 1. Mär 2018 09:30

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Danke für deine Antwort: Ich verwende Version: 5.3.23.0.

Hab gestern mal getestet ob das mitgelieferte Beispiel FinTSPadDelphi ausprobiert. Läuft Fehlerfrei. Dem zur Folge kann es an DDBAC und dessen Installation eigentlich nicht liegen.
Also habe ich meine komplette Implementierung erst mal wieder gelöscht und stumpf per CopyAndPaste alle relevanten Methoden aus der FinTSPadDelphi übernommen und nur geringfügig an die Gegebenheiten angepasst. Lieder tritt wieder der gleiche Fehler auf. Aber Grundsätzlich muss es ja doch an mir liegen.

Ich habe mal meine Unit angehängt. Vielleicht hat ja jemand Lust und Muße mal drüber zu schauen. Der Fehler tritt in der Procedure GetAmount in Zeile 739 auf.

Wie gesagt, Anmeldung bei der Bank und das Holen der Buchungen funktioniert auch. Lediglich bei dem Cast als IUnKnown kommt der Fehler.

Vielen Dank

Hobbycoder 2. Mär 2018 08:52

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Keiner eine Idee?

freimatz 2. Mär 2018 10:58

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
ich habe keine Ahnung von den verwendeten Dingen aber ich würde wie immer erst mal die Zeile zerlegen. In dem Fall in drei. Erstmal "aHIKAZ2.item['UmsaetzeGebucht1', 1]" einer lokalen Variablen zuweisen und schauen (direkt oder im debugger) was das überhaupt ist.
Vermutlich ist das gar kein IUnknown.

Hobbycoder 2. Mär 2018 11:37

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Da geht's ja schon los ;-)
Leider steh ich bei Interfaces auch komplette daneben.

Wenn ich aHIKAZ.Item['UmsaetzeGebucht1', 1] auslesen will, dann bekomme ich die Fehlermeldung das wäre vom Typ Dispatch.
Ich kann wohl aHIKAZ.GetXML ausführe und bekomme dann die Umsaetze als XML in einen WideString. Da steht auch alles drin wie erwartet, aber ich muss das ja irgendwie in den aBlob vom Typ BACDataObject kriegen.

Möglicherweise könnte ich das XML selbst auswerten, aber da das ja geht wenn ich die FinTSPadDelphi, die mitgeliefert wurde, ausführe sollte es ja gehen. Und ich würde das auch gerne so machen.
Wenn ich versuche direkt auf IBACDataObject2 zu casten geht das ebenfalls nicht. Es wird schon gar nicht compiliert wegen ungültiger Typenumwandlung.

Ich habe ja alles per CopyAndPaste übernommen, und es sollte dann auch so funktionieren. Der einzige Unterschied den ich erkennen kann, ist die Tatsache das es in der FinTSPadDelphi in einer Class(TForm) eingebettet ist, und bei mir in einer Class(TObject). Aber das sollte keinen Unterschied ausmachen.

Hobbycoder 5. Mär 2018 12:34

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich muss dieses Thema noch mal aufgreifen, weil ich leider noch kein Stück weiter gekommen bin.

Mittlerweile habe ich meinen kompletten Code wieder verworfen, und mir ein kleines Testprogramm geschrieben, mit welchem ich das noch mal überprüft habe. Im Testprojekt funktioniert es wieder.
Dann habe ich alles in dem eigentlichen Zielprojekt nochmal gemacht, funktioniert wieder nicht! Gleicher Fehler.
Der Unterschied zwischen meinem Testprojekt (und auch dem mitgelieferten Beispiel) und dem eigentlichen Zielprojekt ist, dass im Testprojekt und im mitgelieferten Beispiel alle Variablen und Funktionen innerhalb der Form deklariert sind, bzw. in dieser Instanz ablaufen. In meinem Zielprojekt möchte ich das ganze aber in eine Klasse packen, wo es dann wieder nicht funktioniert. Fehler: 'Interface nicht unterstützt' in der gleichen Zeile wie im ersten Post.

Kenn es sein, dass ein Interface irgendwie von einer Form abhängig sein kann? Kann ich mir zwar nicht vorstellen, aber es muss ja irgendwas damit zu tun haben.

Ich hänge mal mein Testprojekt und die Klassenunit an.

Idiomatix 5. Mär 2018 13:53

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Hallo,
könntest Du bitte noch die fehlende Unit "AMAmountObject.pas" in Dein Testprojekt hochladen. Die DDDBAC-Type Libraries habe ich mir selbst erstellt.
MfG

Hobbycoder 6. Mär 2018 07:44

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Natürlich ;-) Hatte vergessen, dass man die benötigt.

Idiomatix 6. Mär 2018 08:47

AW: DDBAC Fehler: "Interface nicht unterstützt"
 
Hallo Hobbycoder,
habs mit Deinen Units ausprobiert. Klappt einwandfrei. Getestet mit verschiedenen, privaten Bankkonten.
Jedoch basierten meine Typelibs auf der DDBAC-Version 5.6.71, die vor 4 Wochen noch aktuell war. Mittlerweile sind wir bei 5.6.73.
Meine Vermutung ist, dass Deine Typlibs zu alt sind. Vorschlag: Hol Dir das aktuelle DDBAC-SDK,
installiere es, erstelle die beiden Typelibs neu (also auf keinen Fall die aus dem mitgelieferten Demo-Projekt nehmen) und
binde sie in Dein Projekt ein. Achte auf Win32bit als Zielplattform beim Kompilieren.
Erstelle dann im Homebanking Banking Admin (Systemsteuerung) mindestens einen Bankkontakt und synchronisiere diesen. Nimm ein Bankkonto,
auf dem in den letzten acht Tagen Bewegungen waren. Dann sollten auch bei Dir die Umsatzbeträge im Memo-Feld angezeigt werden.:-D

Bei Fragen zu Interfaces hilft vielleicht diese englische Einführung http://techvanguards.com/ weiter. Zugegeben, ist schon etwas älter, aber sehr gut
erklärt.
MfG


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:16 Uhr.
Seite 1 von 2  1 2      

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