Datenbank, Ergebnis einer Query auf Table zum editieren übernehmen



  • Situation:
    Datenbank mit 1 Tabelle (Paradox7)
    2 Formulare -> Formular 1 mit Table-Objekt, DataSource, DBGrid, DBedit Felder
    zum Daten editieren, Button1 zum Formular 2 öffnen
    -> Formular 2 mit Query Objekt,Data Source,DBGrid
    und Edit Feldern zum suchen
    Soll Funktion:
    Über Button1 auf Formular1 öffnet sich Formular2 Modular. Hier können in den Edit Felder über Query1 eine Suche auf die Paradox-Tabelle gestartet werden. Das Ergebnis der Suche wird dann im DBGrid angezeigt. Hier soll man nun einen der gefundenen Datensätze in dem DBGrid anwählen können und mit verlassen des Formulars soll genau dieser Datensatz in Formular1 zum editieren übernommen werden.

    Also der Dateizeger des Datensatzes der Query soll auf die Table übernommen werden, damit ich genau diesen editieren und weiterbearbeiten kann.

    Mein Lösungsansatz war bisher folgender:

    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      Form2->ShowModal();
      Table1->Edit();
      DBEdit1->Text = Form2->Query1->FieldByName("Beispielfeld")->AsString;
      Table1->Post();
    }
    

    Dabei kommt aber ein EDBEngineError mit der Meldung: Datensatz von anderem Anwender gesperrt. Tabelle:[Pfad der Paradox Tabelle}.

    Wäre spitze wenn mir da wer helfen könnte, bin kurz vorm verzweifeln. 😕



  • Vor dem Post die Query schliessen?



  • danke für den Tipp, hab vor dem Post noch die Query geschlossen, leider immer noch die gleiche Fehlermeldung 😞



  • Das Problem ist mir von mysql bekannt. Du hast zwei Anwendungen (hier zwei Fenster) die auf die gleichen Tabellen zugreifen. Das führt zu einem Problem, da es in Datenbanken so ist, dass immer nur einer zur Zeit auf eine Datenbank zugreifen kann. Das Problem läsast sich meineswissens auf zwei Arten lösen:
    1. bevor das du postest bei der Datasource disabled auf true setzen, dann posten und dann die Datasource wieder anschalten (sollte eigendlich funzen)
    2. Etwas komplizierter aber bessere Lösung wäre ein Datenmodul. Das findet man unter datei,neu,weitere. Ein Datenmodul ist sowas wie ein Formular, nur dass beide es normalerweise nur Datenbankobjekte beinhaltet und unsichtbar ist. Einfach in beiden Formular-units oben #include "datnmodul1.h" oder wie du es auch immer genannt hast einfügen und dann unter TForm1 *Form1 einfach DataModule1 *daten1 einfügen. Genauso auch bei Form zwei verfahren.
    In das DataModule tust du jetzt alles was du brauchst. Die Datasource, den Query usw.. Evtl. is dir mal aufgefallen, dass bei Query auch im Objektinspektor ein Eintrag Datasource ist. Da deine Datasource reinpacken, dann greift das query nicht direkt auf die Datenbank zu, sondern über die datasource. Infolgedessen kann es keinen Zugriffskonflikt geben. Jetzt kannst du bei deiner 1. und 2. Form einfach über daten1->Deinobjekt auf die Datenbankobjekte im datenmodul zugreifen. Du hast also alles zentral und es braucht nich von jeder Form aus eine Verbindung zur Datenbank aufgebaut werden



  • 1. funktioniert leider auch nicht oder ich verstehs mal wieder nicht...

    void __fastcall TForm1::Button1Click(TObject *Sender) 
    { 
      Form2->ShowModal(); 
      Table1->Edit(); 
      DBEdit1->Text = Form2->Query1->FieldByName("Beispielfeld")->AsString; 
      Form2->DataSource1->Enabled = false;
      Table1->Post();
      Form2->DataSource1->Enabled = true; 
    }
    

    kommt immer noch die selbe meldung..

    2. ziemlich heavy für son anfänger wie mich 🙂
    Brauch ich auf dem DatenModul trotzdem noch 2 DataSources je für Table und Query Objekt? Und bei dem eintragen von DataModul1 *Daten1 kommt die Fehlermeldung beim Compilieren:
    Redeklaration von DataModul1 mit anderem Typ
    DataModul1 bereits deklariert

    und wohin schreibe ich die SQL anweisung für das Query objekt auf dem DataModul weil wenn ichs in Form2 schreibe, z.B.
    AnsiString s = "select * from software.db where...."
    findet er die software.db ja nicht weil das Table bzw Query Objekt auf dem DataModul sitzt

    wäre super wenn mir da nochmal helfen könntest, die lösung wäre nämlich super interessant..



  • Vielleicht hilfts:
    Unit des 1. Formulars zum Editieren der Daten

    #include "UDMsoftware.h"
    #include "Usoftwaresuche1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TFsoftware1 *Fsoftware1;
    DMsoftware *Daten1; //?? kommt Fehlermeldung siehe Beitrag oben
    //---------------------------------------------------------------------------
    __fastcall TFsoftware1::TFsoftware1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TFsoftware1::BzurueckClick(TObject *Sender)
    {
    Close();        
    }
    //---------------------------------------------------------------------------
    void __fastcall TFsoftware1::BsucheClick(TObject *Sender)
    {
    Fsoftwaresuche1->ShowModal();
    DMsoftware->TABsoftware->Edit();
    Fsoftware1->DBEsoftwarenummer->Text = DMsoftware->Qsoftwaresuche1->FieldByName("Softwarenummer");
    DMsoftware->TABsoftware->Post();
    }
    //---------------------------------------------------------------------------
    

    Unit des 2. Formulars zum suchen von Daten. Der gefundene Datensatz soll beim verlassen des Suchformulars ins EditierFormular übernommen werden

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Usoftwaresuche1.h"
    #include "UDMsoftware.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TFsoftwaresuche1 *Fsoftwaresuche1;
    DMsoftware *Daten1;  //Fehlermeldung siehe oben Beitrag
    //---------------------------------------------------------------------------
    __fastcall TFsoftwaresuche1::TFsoftwaresuche1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TFsoftwaresuche1::BsuchenClick(TObject *Sender)
    {
    int zae = 0; // zählt Anzahl der Felder die schon im SQL-String sind
    
    //Suchstring s
    AnsiString s = "select * from software.db where "; /*hier kommt Fehlermeldung das er die Tabelle nicht findet */
    
    //Suchstring s je nach Suchbegriffen in den Feldern
    //verfolständigen und mit and verknüpfen
    if (Esoftwarenummer->Text != "")
      {
      if (zae != 0)  s = s + " and ";
      s = s +  "softwarenummer like '" + Esoftwarenummer->Text + "%""' ";
      zae ++;
      }
    if (Esoftwarename->Text != "")
      {
      if (zae != 0)  s = s + " and ";
      s = s +  "softwarename like '" + Esoftwarename->Text + "%""' ";
      zae ++;
      }
    if (Eversion->Text != "")
      {
      if (zae != 0)  s = s + " and ";
      s = s +  "version like '" + Eversion->Text + "%""' ";
      zae ++;
      }
    if (Esoftwareart->Text != "")
      {
      if (zae != 0)  s = s + " and ";
      s = s +  "softwareart like '" + Esoftwareart->Text + "%""' ";
      zae ++;
      }
    
    //Fehlermeldung ausgeben wenn kein Suchbegriff eingegeben wurde
    if ( zae < 1)
       {ShowMessage("Mindestens einen Suchbegriff eingeben");
        return;
       }
    
    //Query aktivieren
    DMsoftware->Qsoftwaresuche1->SQL->Clear();
    DMsoftware->Qsoftwaresuche1->SQL->Add(s);
    DMsoftware->Qsoftwaresuche1->Open();
    }
    //---------------------------------------------------------------------------
    void __fastcall TFsoftwaresuche1::BzurueckClick(TObject *Sender)
    {
    Close();        
    }
    

    Unit des DatenModuls, auf diesem sitzen Table, Query und DataSource

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "UDMsoftware.h"
    #include "Usoftware1.h"
    #include "Usoftwaresuche1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TDMsoftware *DMsoftware;
    //---------------------------------------------------------------------------
    __fastcall TDMsoftware::TDMsoftware(TComponent* Owner)
            : TDataModule(Owner)
    {
    }
    

    vieles hab ich halt im Objektinspektor gesetzt aber vielleicht hilfts bei der Lösungsfindung



  • muss nochmal hochstellen... weiss keiner was??


Anmelden zum Antworten