Announcement

Collapse
No announcement yet.

Problem beim hinzufügen einer Spalte in eine Paradox Tabelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem beim hinzufügen einer Spalte in eine Paradox Tabelle

    Hi,

    Ich habe folgendes Problem. Ich möchte ein Setup - Update für meine Software schreiben. In der neuen Version haben sich eine Tabelle geändert. Diese kann ich nicht einfach überschreiben (z.B.: eine Adresstabelle). Nun möchte ich einfach in diese Tabelle eine neue Spalte anlegen. Das funktioniert auch mit dem SQL String : "alter table NAME add FELD TYP", aber nur, wenn ich das Setup von Festplatte starte. Wenn ich mein Setup aber von CD starte, bekomme ich eine Fehlermeldung, nicht genügend Speicherplatz und kann die Datei xxx nicht finden. Ich habe in meinem Formular eine TDatabase, TSession (Private und NetDir auf das TempVerzeichnis gesetzt) und eine Query die die SQL Anweisung ausführt. Hat jemand ne Idee, wie ich das Problem lösen kann?
    Und gleich noch ne zweite Frage: Kann ich mit einer TTable Komponente Felder in eine Paradox Tabelle einfügen? Wenn ja Wie?

    Bin für jede Hilfe Dankbar.

  • #2
    Hi
    Ich würde die Tabellen nicht mit dem Setup aktualiesieren
    sondern beim Programmstart die Tabelle abfragen ob diese schon aktuell ist, wenn nein dann das Update durchführen und dann eventuell
    einen Registrierungswert schreiben um weiter überprüfungen zu verhindern.Damit wäre Dein Festplatten/ CD Problem eigentlich gelöst.
    Du könntest Deine Setupdaten auch über einen Selbstentpacker auf die Festplatte kopieren und dann Dein Setup starten funktioniert mit dem WinZip Self-Extractor ganz gut.

    Zu Deiner zweiten Frage. Ich habe neue Felder mit "DbiDoRestructure" findest Du in der API Hilfe der Borland BDE hinzugefügt.

    Ich das hilft Dir weiter.
    Grüße Marku

    Comment


    • #3
      Hi Markus,
      ich suche schon seit einer Weile nach dieser Funktion und habe selbst schon eine Frage in diesem Forum gestellt.
      Hätte ich mir sparen können wenn ich mir mehr durchgelesen hätte - Egal. Aber eine Frage habe ich trotzdem noch:

      Woher bekomme ich das Handle der Datenbank für den ersten Parameter für DbiDoRestructure() ?

      Vielen Dank - Pete

      Comment


      • #4
        Hi Markus,
        vergiß meine letzte Frage aber vielleicht kannst du mir sagen, warum mein Programm bei DbiDoRestructure abstürtzt:

        Hier ist der Code:
        <PRE>

        DBIResult rslt;
        CRTblDesc TblDesc;

        memset((void *) &TblDesc, 0, sizeof(CRTblDesc));
        lstrcpy(TblDesc.szTblName, EditTable->Text.c_str());
        lstrcpy(TblDesc.szTblType, szPARADOX);
        TblDesc.bPack = TRUE;
        rslt = DbiDoRestructure(Table1->Handle, 1, &TblDesc, NULL, NULL,
        NULL, FALSE);
        </PRE>
        Bye - Pete

        Comment


        • #5
          Hi Markus,
          ich bin's schon wieder. Auch wenn es so aussieht als ob ich nerve, aber hast du evtl. mal ein Beispiel für das Einfügen eines neuen Feldes? Was muß beim Parameter "FLDDesc" eigentlich angegeben werden? Ich werde aus der Hilfe nicht so ganz schlau.

          by the way: Ich weiß natürlich, daß es sich bei meiner letzten Frage bzgl. Absturz um das Packen einer Tabelle handelte. Ich wollte da nur erst mal was einfaches versuchen.

          Bye - Pete

          Comment


          • #6
            Hallo Peter!
            Ich hoffe das hilft Dir weiter

            BOOL BLD_DBIAddFieldUDCFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
            {
            int wert = 0;

            DBIResult rslt;
            CRTblDesc TblDesc;
            pCROpType AddOp;
            UINT16 i;
            pFLDDesc pFldDesc;
            pFLDDesc pNewField = (pFLDDesc) message;
            CURProps Props;

            //lParam = Tabellenname
            //wParam = Tabellennummer
            //message = Fielddesk

            rslt = DbiGetCursorProps(hCur[wParam], &Props);
            if(rslt != DBIERR_NONE)
            {
            //Fehler anzeigen
            BLD_DBIErrorUDCFunc(hWnd, rslt, 0, (LPARAM) (LPSTR) "Security List");

            return(FALSE);
            }
            //Get the existing field descriptor.
            pFldDesc = (pFLDDesc)malloc((Props.iFields + 1) * sizeof(FLDDesc));
            rslt = DbiGetFieldDescs(hCur[wParam], pFldDesc);
            if(rslt != DBIERR_NONE)
            {
            //Fehler anzeigen
            BLD_DBIErrorUDCFunc(hWnd, rslt, 0, (LPARAM) (LPSTR) "Security List");
            free(pFldDesc);

            return(FALSE);
            }

            //Schließen der Datenbank
            if(!BLD_DBICloseTableUDCFunc(hWnd, 0, DBSYSTEME, NULL)) return(FALSE);

            // Move the new field descriptor to the end of the source field descriptor.
            memcpy(&pFldDesc[Props.iFields], pNewField, sizeof(FLDDesc));

            // Put a crADD at the same position ad the new field descriptor
            AddOp = (pCROpType)malloc((Props.iFields + 1) * sizeof(CROpType));
            memset(AddOp, crNOOP, (Props.iFields + 1) * sizeof(CROpType));
            AddOp[Props.iFields] = crADD;

            memset(&TblDesc, 0, sizeof(TblDesc));
            strcpy(TblDesc.szTblName, (LPSTR) lParam);
            strcpy(TblDesc.szPassword, "scppscpp");
            TblDesc.iFldCount = (UINT16)(Props.iFields + 1);
            TblDesc.pecrFldOp = AddOp;
            TblDesc.pfldDesc = pFldDesc;

            // Resync the field numbers in order.
            for(i = 0; i < Props.iFields; i++)
            pFldDesc[i].iFldNum = (UINT16)(i + 1);

            rslt = DbiDoRestructure(hDb[1], 1, &TblDesc, NULL, NULL, NULL, FALSE);
            if(rslt != DBIERR_NONE)
            {
            //Fehler anzeigen
            BLD_DBIErrorUDCFunc(hWnd, rslt, 0, (LPARAM) (LPSTR) "Security List");
            }

            //Speicher freigeben
            free(AddOp);
            free(pFldDesc);

            //Tabelle öffen
            if(!BLD_DBIOpenTableUDCFunc(MainhWnd , 1, DBSYSTEME, (LPARAM) (LPSTR) "SYSTEME.DB"))
            return(FALSE);

            return(TRUE);
            }

            Viele Grüße Markus
            Leider stimmt die Source-Formatierung unter HTML nicht.
            Du musst Dir alles selbst aufteilen(source und Kommentare

            Comment

            Working...
            X