AutoWert aus einer AccessDB



  • HalliHallo 🙂
    mein folgendes Problem dürfte eigentlich nicht so schwer sein, leider hilft mir die MSDN nicht weiter, da ich nicht genau weiß, nach was ich suchen soll.
    Also folgendes, ich habe eine Klasse, mit deren Hilfe ich Werte in eine Datenbank lesen und schreiben kann. Leider funktuniert das nur bei Text/CString, bei Zahlenwerten oder dem AutoWert(double,long?) bekomme ich eine Fehlermeldung, da er das nicht konvetieren konnte. Mir ist schon klar, warum das nicht geht, leider weiß ich nicht was ich wie umschreiben muss. 😞

    Also folgendes steht im Konstruktor:

    m_Name = L"";
    	m_PW = L"";
    

    In der DoFieldExchange:

    RFX_Text(pFX, _T("[Name]"), m_Name);
    	RFX_Text(pFX, _T("[PW]"), m_PW);
    

    Die Klasse hat dann zwei private Membervaiablen:

    CString	m_Name;
    	CString	m_PW;
    

    So wie es da oben steht, funktoniert das fehlerfrei, aber mal angenommen ich will das der Name nur aus Zahlen besteht, wie muss ich den Code ändern?

    Würde mich sehr über Hilfe freuen. 🙂
    ~Zanerva



  • Hallo!

    Du hast VC7? Denn in der 6 macht sowas eigentlich der Assistent...

    Also: Ein Autowert ist ein long und der wird mit RFX_Long ausgelesen. Schau mal in die MSDN, das gibt einige RFX-Funktionen. 🙂



  • estartu_de schrieb:

    Also: Ein Autowert ist ein long und der wird mit RFX_Long ausgelesen. Schau mal in die MSDN, das gibt einige RFX-Funktionen. 🙂

    Wenn mich nicht alles täuscht kann ich als Autowert auch Buchstaben nehmen die dann nach dem char[]++ Prinzip hochgezählt werden. Also ist nur der Standardautowert ein long *gg* 😉



  • Bei Buchstaben sollte RFX_Text aber funktionieren... :p



  • da wiedersprech ich dir ja auch gra nicht aber der Satz:

    estartu_de schrieb:

    Also: Ein Autowert ist ein long

    stimmt s.o. nicht ganz 😉 😃 :p



  • Du hast VC7? Denn in der 6 macht sowas eigentlich der Assistent...

    Ja ich benutze VS7, aber den Assistenten benutze ich nicht, da ich diesen manuellen DSN eintrag unterbinden will, muss daher alles selber tipppen.

    Wenn mich nicht alles täuscht kann ich als Autowert auch Buchstaben nehmen die dann nach dem char[]++ Prinzip hochgezählt werden. Also ist nur der Standardautowert ein long *gg*

    Das ist correct, man kann auch Buchstaben als Autowert bzw in meinem Fall PrimärSchlüssel benutzen, ich bevorzuge aber dennoch eher die Version mit den Zahlen 🙂 Der Typ eines Access Autowerts ist standardmäßig ein Long Integer, in C++ ist es ein long, wie du schon sagtest.
    Hab grad mal geschaut was der Assistent dazu sagt, hier mal eine kleine Liste, wen es interessiert 🙂

    long m_ID; // Autowert
    CString m_Text;
    long m_ZahlZ;
    CString m_Memo;
    CTime m_Datum;
    CString m_Hyperlink;
    BOOL m_Janein;
    CLongBinary m_Ole;

    Ansonsten muss man noch im Konstrucktor bei Zahlenwerten das L"" mit einer 0 erstzten, dann funktioniert das einwandfrei. VIELEN LIEBEN DANK EUCH BEIDEN 😃 👍

    Noch eine kleine Frage zum Autowert:
    Ich will einen neuen Datensatz hinzufügen, um aber den passenden Autowert (AW++) zu bekommen, muss ich den vorigen Autowert auslesen und hochzählen. Da gibt es nicht zufällig was, was diese Arbeit erspart? Wenn nicht ist auch nicht schlimm. Danke auf jedenfalls nochmal für die schnellen, netten und konstruktive Antworten 🙂
    Liebe Grüße,
    ~Zanerva



  • Hi als allererstes mal ja im VC++ ist es long, aber long ist nichts anderes als ein long integer! Weißt du denn auch was da im Konstruktor passiert? Warum du das auf 0 setzen musst?
    Du initialisierst deine Werte mit einer Zahl (muss nicht 0 sein) damit du nicht irgendwas drin stehen hast. bei mir stand neulich in nem Feld ne Zahl die durchaus hätte sein können und ich hab mich gefragt wo die her kam, bis ich dann gemerkt hab dass ich nicht initialisiert hab.

    Ja es gibt was zum den Wert erhöhen, am besten schreibst dir im Set ne methode getMaxID die dir mach moveLast und dann return ID die ID wo du dann bekommst noch ++ und alles IO dazu kannst dir auch das hier mal anschauen



  • Das ist doch ein AUTOwert. Lass den mal leer, IMHO wird das Hochzählen dann von Access erledigt. 😃

    PS: Funktioniert jedenfalls bei drei anderen DBMS. Access ist so lange her bei mir... 🙄



  • natürlich hast du recht! aber sie braucht ja die stelle an die sie was einfügt und wenn sie move last macht und dann an die nächste stelle schreibt sollte das doch eigentlich hinten angefügt werden, oder?



  • Ähm? 😕
    Was sind deine Bedenken? 😕



  • Öhm wenn DU schon so fragst, dann wahrscheinlich unbegründete Bedenken, ich dachte nur wenn sie einfach einen einfügt, dann steht der doch nicht zwangsläufig am ende, oder?? also ich hab so ne FKT:

    bool CDokumentenVerwaltungSet::AddRecord(CString PCD,...)
    {
    	//prüfen ob geschrieben werden kann
    	if (CanUpdate() && !IsDeleted())
    	{
    	Edit();
    	Update();
    	}
    	else
    		return false;
    	// ID für den neuen Datensatz ermitteln
    	long m_lNewID = GetMaxID() + 1;
    
    	// Den neuen Datensatz hinzufügen
    	AddNew();
    	m_PCD_NR = PCD;
    	...
    
    	Update();
    	Requery();
    	return true;
    }
    

    wobei getMaxID oben beschriebenes macht, ist das unnötig?? Muss ich gar nicht an ende vor dem einfügen??



  • In einer Datenbank ist die Reihenfolge völlig egal. 😃
    Dafür hast du doch m_strSort oder auch Views. 😉

    Und es ist egal, wo der Cursor steht, wenn AddNew aufgerufen wird, hauptsache, das Recordset ist offen. 🙂



  • hm also gut, aber falsch ist es doch auch nicht oder? Dann seh ich zumindest wie es eingetragen ist ohne ein Sort oder eine View. Aber natürlich und wie immer muss ich mich geschlagen geben und sagen: "Du hast recht!" 🙂



  • AddNew macht den neuen immer ans Ende, also ist das schon halbwegs sortiert, so wie du das haben magst.

    Du kannst es ja bei Gelegenheit mal ausprobieren. 🙂



  • OK werd ich tun, wenn ich mal dazu komme, hab nämlich noch ein Projekt aufs Auge gedrückt bekommen, bei dem ich noch nicht mal weiß wie ich anfangen soll (.wav Dateien in ASCII wandeln und damit zig Sachen berechnen, aber erster Teil ist schon schwer genug!). Also wenn ich meine 4 laufenden Projekte abgeschlossen hab. 😃 Nein quatsch interessiert mich ja schon drum probier ich es auch!



  • Polofreak schrieb:

    Hi als allererstes mal ja im VC++ ist es long, aber long ist nichts anderes als ein long integer! Weißt du denn auch was da im Konstruktor passiert? Warum du das auf 0 setzen musst?
    Du initialisierst deine Werte mit einer Zahl (muss nicht 0 sein) damit du nicht irgendwas drin stehen hast. bei mir stand neulich in nem Feld ne Zahl die durchaus hätte sein können und ich hab mich gefragt wo die her kam, bis ich dann gemerkt hab dass ich nicht initialisiert hab.

    Ja es gibt was zum den Wert erhöhen, am besten schreibst dir im Set ne methode getMaxID die dir mach moveLast und dann return ID die ID wo du dann bekommst noch ++ und alles IO dazu kannst dir auch das hier mal anschauen

    Klar, weiß ich für was der Konstruktor da ist und was dort passiert, und das man die variablen initalisieren sollte, leider war mir die Bedeutung des L"" nicht ganz klar und ich dachte, das für Zahlen da ein anderer Buchstabe hin muss (C"" ? *g*), leider habe ich in der MSDN nichts gefunden, und damit wären wir wieder am Ursprung warum dieser Post enstand ist... 😉

    Die von die besagte Methode funktioniert Polo, habs grad ausprobiert, ein wenig umständlich, aber hauptsachens es funktioniert. 🙂

    Das ist doch ein AUTOwert. Lass den mal leer, IMHO wird das Hochzählen dann von Access erledigt.  
    
    PS: Funktioniert jedenfalls bei drei anderen DBMS. Access ist so lange her bei mir...
    

    Das funktioniert ebenfalls, den Autowert setzt Access wenn man ihn nicht ausdrücklich reinschreibt automatisch, unglücklicherweise fängt er da bei mir mit 6228 an und das geht dann immer ++ je eintrag.

    Euch beiden nochmal vielen Dank, ihr habt mir sehr geholfen 🙂


Log in to reply