ADO Komponenten funktionieren nicht



  • Ja,der Befehl ist in einer Funktion und die ist im Konstruktor von TMain



  • Du kannst im Konstruktor des Hauptforms noch nicht auf andere Forms oder Datenmodule zugreifen, da diese noch nicht erzeugt wurden.

    Mögliche Lösung:
    Das Datenmodul nicht automatisch erzeugen lassen, sondern im Konstruktor der Haupform manuell erzeugen.



  • OK, soweit ist jetzt tut jetzt etwas, alle funktionen auf meinem Formular 1 sind gegeben.
    Aber auf dem 2 Formular kommt bei einer ganz simplen abfrage

    DataModule1->ADOQuery1->Close();
    DataModule1->ADOQuery1->SQL->Clear();
    DataModule1->ADOQuery1->SQL->Add("SELECT * FROM Tabelle1");
    DataModule1->ADOQuery1->Open();
    

    zu einem EOLE error: Insuficient key column for updating or refreshing.
    und das erst nachdem er die Abfrage ausgeführt hat, also erst wenn er aus der obigen button routine zurückspringt. Ich weiß nicht wer da was updaten will, den die Charts habe ich vorsichtshalber mal deaktiviert.



  • Das sieht aus, als würdest Du eine Transaktion nicht korrekt abschliessen, oder ein Update auf einen nicht eindeutig identifizierbaren Datensatz versuchen.
    Die Tabelle hat doch einen Primärindex?

    Grüße Joe_M.



  • Ja, nun ja, ich habe eigentlich 2 Tabellen in meiner datenbank, in der zweiten Tabelle habe ich keinen Primärschlüssel. Die Tabellen sind aber auch nicht mehr verbunden.(ich habe es auch mit verbindung probiert aber das ergebniss ist gleich)
    Die Sache ist aber die das bevor ich die ADO Komp ausgelagert habe die ganzen DB zugriffe in der 1 form ja funktioniert haben, und nun bringt er bei sämtlichen zugriffen auf die Tabelle ohne Prim.schl. diesen fehler.

    Habe jetzt noch ein feld eingefügt und als Prim.schl. deklariert. soweit ich das jetzt sehe sind jetzt alle error weg, das problem ist jetzt aber das ich das selbe problem habe wie am anfang: die Chart Komp. zeigt nichts an,obwohl sie es müsste.
    habe diesen code in einen button gepackt:

    Daten->DBChart1->Enabled = true;
    
     DataModule1->ADOQuery1->Close();
     DataModule1->ADOQuery1->SQL->Clear();
     DataModule1->ADOQuery1->SQL->Add("SELECT Windgeschwindigkeit,Zeitwert FROM Tabelle1 WHERE Tabelle1.Zeitwert >#01/01/05# AND (Tabelle1.AnlagenNr=54)");
      DataModule1->ADOQuery1->Open();
    
     Daten->DBChart1->AutoRefresh = true;
    

    wenn ich auf den button drücke ändert sich zwar die DataSource(sehe ich in einem DBGrid) aber das Chart bleibt leer!wenn ich den SQL String im entwurfsmodus teste mit Autorefresh tut es.Müssen beim Chart noch irgendwelche param. eingestellt werden? Laut hilfe ja eigentlich nicht.

    Sorry, übrigens das ich nicht mehr Code präsentieren kann,aber am besten währe wohl das gesamtprogramm, aber das posten? 😃



  • Hallo, ich komme mit diesem Programm nicht merh zu rande! Das problem ist das is diese woche fertig sein muss!
    kann mir jemand helfen?, ich meine persönlich, über telefon oder dergleichen.
    Es scheint mir nähmlich so das mir mit fragen über einen teilbereich ohne übersicht über das ganze nur schwer geholfen werden kann!!
    Ich bin auch bereit für die Zeit zu bezahlen.



  • Ich hab grad mal kurz in die Hilfe geschaut. Offensichtlich mußt Du die Methode RefreshDataSet(), CheckDataSource(), oder RefreshData() verwenden, um die Daten zu aktualisieren. Vielleicht solltest Du auch mal mittels IsValidDataSource() überprüfen, ob die Datenquelle überhaupt noch gültig ist, nachdem, du die Query geändert hast.



  • Hallo erst einmal.
    Die Funktionen RefreshDataSet(), CheckDataSource(), gibt es bei diesen DBCharts nicht, sind glaube ich funktionen von TeeChart. Mit RefreshData() habe ich is auch probiert, ohne ergebniss.
    Allerdings gibt er mir bei der Methode IsValidDataSource(Series4,DBChart1) immer false zurück. vermutlich wird deswegen nichts mehr angezeigt.
    Warum ist die Query jetzt ungültig, und wie mache ich sie wieder gültig?

    mfg



  • 😮 Könnte darin das Problem liegen?

    Der Hauptunterschied zwischen TChart und TDBChart besteht darin, daß das letztgenannte die korrekt auf dem Zielsystem installierte Borland Database Engine BENÖTIGT, während TChart diese nicht benötigt.

    ADO ist (m. E.) nicht BDE.



  • Hallo,

    Wäre es hier nicht besser die normale TChart-Komponente (ohne direkte Datenbankanbindung) zu verwenden und die Updates dann manuell durchzuführen. Sowas läßt sich auf jedem Fall besser debuggen.

    Ciao



  • Tja ich könnte allerdings eine normale Chart Komponente nehmen wenn ich wüsste wie! wenn ich meine Hile aufrufe kommt nähmlich freundlicherweise eine fehlermeldung 😞 und das wo ich aufrufen kann ist mit Pascal-code beschrieben
    wie bekomme ich dann eigentlich die werte aus meiner Query in das Chart?
    muss ich in einer Schleife alle Punkte einzeln schreiben? ist das nicht langsam?
    kann mir vieleicht jemand ein Beispiel posten wie ich die daten übertrage?



  • Ich weiß nun nicht was du genau darstellen möchtest. Wenn dein Chart ein oder mehrere Linien enthält kannst du Punkte mit der Methode TChartSeries::AddXY() hinzufügen. Vorausgesetzt die Serie existiert schon geht das z.Bsp. so

    chart->Series[0]->AddXY(x,y,"",clTeeColor);
    

    Dies fügt einen Punkt am Ende der ersten Serie im Chart hinzu.
    Es gibt auch die Funktion AddArray. Die habe ich aber noch nicht verwendet.
    Wie du an die Daten kommst weiß ich ja auch nicht. Du mußt sie halt aus dem Ergebnis deiner SELECT Abfrage extrahieren.
    Die Hilfe zu TChart bezieht sich allgemein nur auf Pascal-Code. Das ist aber nicht schwer zu verstehen.



  • Vielen dank erst mal, jetzt bin ich schon mal viel weiter! ich kann jetzt die Daten aus meiner DB darstellen. Allerdungs klappt jetzt etwas mit dem überschreiben nicht. Das müsste dann aber der letzte Fehler sein. RefreshData gibt es ja beim Chart nicht.
    deshalb habe Ich habe schon folgende möglichkeiten probiert:

    Daten->Chart1->Series[0]->Clear();
    Daten->Chart1->Refresh();
    

    jedoch hat es nicht funktioniert. Wenn ich einen anderen befehl absetze wird das Chart nicht überschrieben, auser wenn ich folgenden code eingebe:

    for(int i=0;i<100;i++)
    {
    Chart1->Series[0]->AddXY(3,51,"",clTeeColor);
    Chart1->Series[0]->AddXY(34,56,"",clTeeColor);
    }
    

    dann ändert sich das Chart
    aber dieser Befehl hat im Chart keine Auswirkung mehr:

    DataModule1->ADOQuery1->Close();
                DataModule1->ADOQuery1->SQL->Clear();
                DataModule1->ADOQuery1->SQL->Add("SELECT * FROM Tabelle1 WHERE (Tabelle1.AnlagenNr=" + tmp +") AND (Tabelle1.Zeitwert >#" + S + "#)");
                DataModule1->ADOQuery1->Open();
    
                Daten->Chart1->Series[0]->Clear();  //Delete();
                while (!DataModule1->ADOQuery1->Eof)
               {
                 int Leistung = (DataModule1->ADOQuery1->FieldByName("Spannung")->AsInteger) * (DataModule1->ADOQuery1->FieldByName("Strom")->AsInteger);
                 Chart1->Series[0]->AddXY(DataModule1->ADOQuery1->FieldByName("Zeitwert")->AsDateTime,Leistung,"",clTeeColor);
                 DataModule1->ADOQuery1->Next();      //Setzt u.a. Eof wieder auf f.
               }
    

    In der Query ändert sich die Datenmenge auch, nur das Chart nicht



  • Mach mal Chart1->Repaint() danach;



  • Hallo, ich glaube das problem ist das, das automatisch die Skaleneinteilung auf den größten wert eingestellt wird. wenn ich jetzt andere Daten mit kleineren Werten anzeigen will, zeigt er sie wohl an, aber die Skaleneinteilungen bleiben auf den max wert eingestellt. In meinem fall habe ich auf der x-Achse Datum, auf der y_Achse Daten aus der DB. Wenn ich z.B. mit einem Button Daten aus dem letzten Jahr anschaue und dann mit dem nächsten das letzte halbe jahr, passt sich die Leiste nicht an.
    Ich finde aber nichts was explizit auf clear Axis oder AutoAxis->Enabled oder ähnliches verweist. die Funktion clear() löscht vieleicht nur die gezeichneten Punkte. Wie kann ich aber die Achsen Einteilung löschen?



  • Sieh mal nach TChartAxis::Automatic, TChartAxis::AutomaticMinimum, TChartAxis::AutomaticMaximum sowie TChartAxis::Minimum und TChartAxis::Maximum. Wenn Automatic true ist sollte sich die Axe entsprechend des Maximums und Minimums deiner Daten selbst skalieren.
    PS:
    mit TChartAxis::CalcMinMax() bekommst du Maximum und Minimum deiner der Axe zugeordneten Serie.



  • Also bei mir ist alles auf true eingestellt, habe sogar versucht per code extra auf true zu initialisieren! es tut aber auch nicht. Bei calcminmax() liefert mir übrigens immer nichts zurück, d.h. die übergebenen Variablen bleiben wie sie waren.



  • Ist deine Serie mit der Axe verbunden? Das kannst du mit Series->AssociatedToAxis(TChartAxis *ax); prüfen.



  • Tschuldige aber ich bekomme das nicht ganz hin mit der abfrage, weil ich finde keine hilfe dazu. ich habe es so versucht
    Daten->Series1->AssociatedToAxis(Chart1->BottomAxis *ax);
    aber er kennt ax nicht, habe es auch mit BottomAxis versucht, kennt er auch nicht. welchen namen erwartet er?
    kann ich dir vieleicht die Form mit den Charts senden? dann siehst du ja gleich wie und was eingestellt ist?



  • Was ist dieses Daten?
    Normalerweise geht die Abfrage so

    if(Chart1->Series[0]->AssociatedToAxis(Chart1->BottomAxis))
    {
    // tu irgendwas
    }
    

    andere Variante

    if( Chart1->BottomAxis == Series1->HorizAxis )
    {}
    

    Wenn du die Hilfe zu TChart hast öffne sie bitte. Dann gib beim Index wahlweise
    TChart
    TChartAxis
    TChartSeries an.
    Dann findest du alle Methoden und Eigenschaften.


Anmelden zum Antworten