Datenbankerstellung (Access) mit Borland C++ Builder 5
-
hallo!
habe bisher nur mit zugriff (lesen) über den borland c++ builder 5 einer microsoft access datenbank gearbeitet.nun möchte ich aber eine datenbank erstellen bzw. dann bearbeiten.
aufbau/idee:
ich habe 16 sensoren die über µC gecheckt werden. nur 1 sensor liefert ein "interessantes" ergebnis. nun wird die kennung (also nr. 1-16; nicht das messergebnis) des sensors an den pc übertragen, und dort soll dann über die datenbank dokumentiert werden, welcher sensor (1-16) wie oft an den pc gesendet wurde.ausgabe z.b. folgendermaßen:
--------------------------------
sensor1: 12 mal registriert
sensor2: 15 mal registriert
.
.
sensor16: 10 mal registriert
--------------------------------vieleicht ein bisschen konfus das ganze was ich will, dann einfach fragen, ich hoff ihr könnt mir helfen!
danke!
unclejamal
-
Wenn ich das richtig sehe ist das doch gerade mal eine Table mit 2 bis 3 Columns
- Sensor
- Date
- Time
oder
- Sensor (Nummer)
- DateTimefalls Du auch noch eine Statistik und nicht nur den Count haben willst.
Die Abfrage zur Menge (wie Oft ausgelöst) wäre dann
select sensor,COUNT(sensor)
from Table
group by sensor
order by sensor ascDie Speicherung wäre
insert into table
(Sensor,Date,Time)
values
(VariableSensor,VariableDate,VariableTime)Die DB mit mit einer Tabelle kannst Du außerhalb von C++ im Access mittels Assi anlegen.
Die Abfrage funktioniert z.B. über ein Query, das Insert z.B. über ein Command.
Bei den paar Daten geht aber auch eine reine Textdatei anlegen. Dann brauchst Du gar nichts mit Datenbanken tun.
-
erstmals danke für die antwort!
so ich möchte es schon über access machen, da die oberfläche zur anzeige der daten etwas besser aussieht, als die doku per textfile (ihr meint hier müsste man dann mit stringarithmetik arbeiten oder?).von den vorschlägen vorher werd ich nicht besonders schlau, ich weiß nichteinmal mit welchem control/befehl ich im c++ builder5 eine datenbank erstelle.
die tabelle hätte 2spalten (links: sensorX [statisch], rechts: X mal registriert [dynamischer wert]), und 16 zeilen (für 16 sensoren):würd es für euch ein großes problem darstellen dies eventuell im builder gleich zu programmieren und dann den source code oder die builder-files zu posten?
vielen dank...
unclejamal
-
Eine Datenbank ist dafür eigentlich eine Nummer zu groß. Eine Ini-Datei (TIniFile), oder eine TStringList und dort die Eigenschaften Names[] und Values[] reichen absolut aus. Dazu noch die Methoden LoadFromFile() und SaveToFile() der StringList. Zur Anzeige reicht eine einfache TListView.
Wenn es unbedingt eine Datenbank sein soll, mußt Du dich näher mit Zugriffskomponenten (z.B. ADO) und SQL beschäftigen.
Grüße Joe_M.
-
danke für die antwort, ihr habt wahrscheinlich eh recht, dass eine datenbank für meine problemstellung zu aufwendig ist.
werd das matl mit TStringList und den eigenschaften Names[], Values[] versuchen....
danke vorerst...
-
Sollten sich bei der Verwendung von TStringList Probleme ergeben, frag bitte direkt im VCL/CLX (Borland C++ Builder) Forum. Ein Blick in die FAQ dort kann auch nicht schaden. (Ich kann deinen Wissenstand nicht einschätzen, deshalb der Hinweis.)
Grüße Joe_M.
-
wollte grade das mit TStringList machen, jedoch finde ich kein control dafür? wo ist das drinnen?
danke, schönen tag noch...
-
hab mich bisschen im forum umgeschaut und habe entdeckt, dass es für TStringList kein control dafür gibt, sondern die StingList per source-code programmiert wird.
also, zu meiner problemstellung wie im ersten beitrag beschrieben, habe ich das programm mal für 3 sensoren aufgebaut.
in der StringList sollte das ganze dann so aussehen:
sensor1=2
sensor3=3
sensor3=1
...wobei die zahlen nach den = aus, von den einzelnen sensoren zugehörigen, variablen stammen (iSensor1, iSensor2, iSensor3 - alle in PRIVATE definiert).das problem ist nun, dass bei StringList->Add("Sensor1=" + IntToStr(iSensor1); immer die erste zeile des textfiles mit dem neuen überschrieben wird, also dachte ich mir es müsste mit StringList->Insert(iIndex,...) funzen (wie es im source code steht), aber ich bekomme die fehlermeldung "list index out of bounds..."
was hat das zu bedeuten? wie bekomme ich das ganze auf die von mir gewünschte formatierung?//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "UnitMain.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TFormMain *FormMain; //--------------------------------------------------------------------------- __fastcall TFormMain::TFormMain(TComponent* Owner) : TForm(Owner) { iSensorTest=5; iSensor1 = 0; iSensor2 = 0; iSensor3 = 0; } //--------------------------------------------------------------------------- void __fastcall TFormMain::FormCreate(TObject *Sender) { MemoDebug->Lines->Add("--- Programm Start ---"); // -------------- DLL Laden---------------- HINSTANCE hDLL; // DLL-Zugriffsnummer DLLFktGet=NULL; hDLL = LoadLibrary("ProjectDLL.dll"); if (hDLL != NULL) { DLLFktGet =(int (*) (void))GetProcAddress(hDLL,"DLLFktGet"); MemoDebug->Lines->Add("DLL geladen"); } // ---------------------------------------- } void __fastcall TFormMain::ButtonExitClick(TObject *Sender) { Close(); } //--------------------------------------------------------------------------- void __fastcall TFormMain::ButtonReadClick(TObject *Sender) { int iDLLZahl; // StringList erzeugen TStringList* StringList; StringList = new TStringList; //StringList->Clear(); MemoDebug->Lines->Add("--- Button Read Click ---"); EditSensor->Text = DLLFktGet(); // ----------- Auswertung ------------- iDLLZahl=DLLFktGet(); if(iDLLZahl==0) { iSensor1++; EditSensor1->Text = iSensor1; MemoDebug->Lines->Add("Sensor1 registriert"); StringList->Insert(iIndex, "Sensor1=" + IntToStr(iSensor1)); iIndex++; } if(iDLLZahl==1) { iSensor2++; EditSensor2->Text = iSensor2; MemoDebug->Lines->Add("Sensor2 registriert"); StringList->Insert(iIndex, "Sensor2=" + IntToStr(iSensor2)); iIndex++; } if(iDLLZahl==2) { iSensor3++; EditSensor3->Text = iSensor3; MemoDebug->Lines->Add("Sensor3 registriert"); StringList->Insert(iIndex, "Sensor3=" + IntToStr(iSensor3)); iIndex++; } // StringList speichern StringList->SaveToFile("stringlist.txt"); MemoDebug->Lines->Add("--- Read Ende ---"); } //---------------------------------------------------------------------------
hoffe das ganze ist einigermaßen übersichtlich...
danke einstweilen!
ps. für die FOREN-MODERATOREN: könntet ihr diesen kompletten beitrag ins "VCL/CLX (Borland C++ Builder)"-forum verschieben und dann auch den Betreff auf "TStringList Anfängerfragen, Add, Insert & mehr" ändern (dann bräuchte ich nicht das ganze nochmals posten). danke.
-
ok, das geht jetzt, dass immer sensor1=xx - sensorx=xx untereinander in jeder zeile steht (muss StringList->Add(""); außerhalb der if-schleife stellen).
das problem besteht jetzt beim auslesen der Stringlist:
mit StringList->Names[0]; lese ich in der ersten zeile meines textfiles den namen (also "sensor1" von sensor1=x) aus. jedoch funktioniert das mit StringList->Values[0]; nicht, es liefert garnichts zurück? warum das, sollte mir nicht der Wert der rechts vom = steht zurückgelierfert werden?danke...
-
Ich habe zwar noch nicht mit den Values von TStringList gearbeitet, aber im Argument sollte da nicht die 0 stehen sondern der Name vom Wert, den du suchst, also "sonsor1".
-
@unclejamal: Du bist seit 3 Posts nicht nur im falschen Thread (jeder nur ein Thema!) sondern auch im Falschen (Unter-)Forum...
-
die anforderungen haben sich nun geändert:
i bräuchte jetzt statt "sensor-x: x-mal registriert"
das hier "sensor-x: messwerte"also zu jedem sensor gibt es dann unzählige messwerte. dazu wäre eine datenbank sinnvoller, damit ich die messwerte dann nach bestimmten kriterien bewerten kann.?
-
angenommen ich habe da die access-datenbank dann kann ich z.b. per sql-statement messwerte nach bestimmten kriterien durchsuchen.
kann ich auch die ganzen daten (anstatt der access-db) in eine excel-tabelle schreiben, und sie dann die messwerte auch per bestimmten kriterien aussortieren?
danke