Typenproblem zwischen Access und C++
-
Hallo, ich möchte in einem DBEdit einen Eurobetrag (mit Nachkommastellen) eingeben und dann mit ADOQuery und DataSource in eine Access-Tabelle eintragen. In Access kann man das Feld als Festkommazahl bzw. Exponentialzahl angeben und in der ADOQuery Float.
Leider bekomme ich aber jedesmal den Fehler, dass Float erwartet wird, aber ein Integer gefunden wird.
Ich verstehe das nicht, weil für mich ist eine Festkomma- bzw. Exponentialzahl kein Integer ...
Hat einer eine Idee?
-
Hallo
Nein, das bringst du durcheinander. Es gibt Festkommazahlen, die sich auch durch Integer darstellen lassen. Und es gibt Fließkommazahlen, die sich in C++ nur durch float/double darstellen lassen. Der Begriff "Exponentialzahl" ist unglücklich, vermutlich meint Access damit Festkommazahlen, weil zu jeder Integerzahl noch ein fester Exponent gehört, der die echte Größenordnung angibt. Bei Fließkommazahlen hat man dagegen einen variablen Exponenten.
Ich vermute du solltest die Werte als Integer betrachten, und bei Ausgaben für den Benutzer immer einen festen Exponenten einrechnen (bei Geldwerten ja in der Regel -2). Das ist durchaus üblich, weil man bei solchen Zahlen ja wirklich genau 2 Stellen haben will, Fließkomma würde hier ungenau arbeiten.
bis bald
akari
-
wie meinst du das genau? also in das feld sollen schon eurobeträge mit 2 nachkommastellen eingegeben werden können (deshalb denke ich float). ich weiß bloß nicht, was ich dann bei access für die felder in der spalte für einen datentyp angeben soll.
-
Gibt es in Access nicht den Feldtyp Currency, respektive Währung?
-
Ja, da hast du recht! Ich habe jetzt in Access Währung eingestellt, und in der ADOQuery im Datenfeld den Typ Currency. Eigentlich sollten diese beiden Datentypen super zusammenpassen! Aber ich bekomme wieder die gleiche Meldung:
Currency erwartet, Integer gefunden.
Warum erkennt er alle Typen nur als Integer???
-
Wobei genau kommt denn diese Fehlermeldung?
-
Die Fehlermeldung kommt, wenn ich das Formular aufrufe, wo das Datenfeld drauf ist.
Genaue Fehlermeldung (zur Zeit):
Erste Gelegenheit für Exception bei $7653B09E. Exception-Klasse EDatabaseError mit Meldung 'qry_regulierer: Unterschiedliche Typen für Feld 'reg_tl_vg_controlling'; erwartet: Currency, gefunden: Integer'. Prozess RekonProjekt.exe (4856)
-
Stimmt denn der Typ in der Fieldliste von ADOQuery? Hast du es mal mit TBCDField versucht?
-
naja wie schon gesagt, ich hatte das Feld als CurrencyField und in Access Währung eingestellt ...
-
Falls Du den Feldeditor der ADO Query verwendet hast:
Hast Du dieses Feld mal herausgelöscht und neu hinzugefügt? Oder zumindest auch dort auf Currency umgestellt?
-
ja den feldeditor (doppelklick auf ADOQuery-Komponente) habe ich benutzt: Ja ändern der Felder geht ja nicht, deshalb muss ich ja immer ein neues feld erstellen! logischerweise muss da vorher das alte feld löschen, da man sonst zwei felder mit gleichen namen hätte, und dann gibts nen fehler!
das problem ist denke ich, dass der compiler/c++ builder (oder wer auch immer) das accessfeld immer als integer erkannt wird (warum auch immer ...)
-
Wie? Was? Ich kann dir nicht folgen.
Aber, im Feldeditor kannst Du natürlich nichts ändern. Dort wird nur angezeigt, was sich tatsächlich in der Tabelle befindet (von den Möglichkeiten mit berechneten Feldern abgesehen).
-
Also egal, ob ich in Access Währung, Standardzahl, Allgemeinzahl, Festkommazahl angebe, in der Fehlermeldung steht immer "xxx erwartet, Integer gefunden"
xxx steht für den angegebenen Datentyp im Feldeditor.
-
Lösch bitte mal alle Felder raus und füge sie neu ein. Nichts von Hand verstellen oder hinzufügen. Warum stellst Du da überhaupt etwas von Hand ein?
Der Feldeditor muss natürlich mit der endgültigen Version der Datenbank verwendet werden. Wenn in der Datenbank noch etwas zu ändern ist, prüfe das zuerst und bringe gegebenenfalls die Datenbank auf den aktuellen Stand. Dafür brauchst Du weder TDBEdits noch TADOQuerys... Dafür reicht ein simples TADOCommand-Objekt.
-
klar, ich lösche jetzt mal eben schnell 40-50 felder und füge sie danach wieder schnell ein
-
MichelM (Gast) schrieb:
klar, ich lösche jetzt mal eben schnell 40-50 felder und füge sie danach wieder schnell ein
Dauert doch noch 10 Sekunden?!? Rechte Maustaste -> alle Felder hinzufügen und schon bist du fertig.
-
Nein das funktioniert nicht! Denn dann gibts ne Fehlermeldung:
"Ihr Netzwerkzugriff wurde unterbrochen. Schließen Sie die Datenbank, und öffnen Sie sie erneut, um den Vorgang fortzusetzen."
Ich habe aber keine Datenbank offen ...
Aber irgendwie schweift das grad von meinem Problem ab, oder?
-
Vielleicht.
Ich weiß immer noch nicht so wirklich wo das Problem liegt...
Ich hab hier gerade keine IDE, aber du verwendest doch mit Sicherheit eine TADOConnection? Die sollte eine Eigenschaft Connected haben. Steht die auf true?
Liegt die DB denn lokal, oder auf dem Netzwerk?
-
Also ich denke, das Problem liegt eher in Access: Ich habe jetzt mal versucht, per Hand Daten in einzelnen Felder einzufügen, nur mit mäßigem Erfolg. Ich habe das Feld als Festkommazahl eingestellt, kann aber nur vor dem Komma Ziffern eingeben. Alle nach dem Komma eingegebenen Ziffern verschwinden, weil er auf ganze Zahlen rundet ... Genau das Gleiche bei Standardzahl sowie Währung, Euro und Allgemeinzahl.
Die Datenbank liegt lokal in einem Ordner im Projektpfad. Ich benutze eine ADOConnection, aber Connected = False. Wenn ich die auf True stellen möchte, krieg ich wieder die Meldung: "Ihr Netzwerkzugriff wurde unterbrochen. Schließen Sie die Datenbank, und öffnen Sie sie erneut, um den Vorgang fortzusetzen."
-
Dann funktioniert die doch aber auch zur Laufzeit nicht, oder?