[gelöst] Einträge vor Speichern in anderen Datenbank suchen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Pixelletter
*
Beiträge: 12
Registriert: Do, 30.05.2013 13:43

[gelöst] Einträge vor Speichern in anderen Datenbank suchen

Beitrag von Pixelletter »

Hallo liebe Netzgemeinde, ich brauche schon wieder Hilfe.
Ich habe mit OOBase ein Formular erstellt, bei dem an einer Stelle eingetragene Daten mit dem bisherigen Datenbestand verglichen werden. Das Makro dazu hat mir F3K Total freundlicherweise geschrieben. Dummerweise haben sich bei der Bereitstellung des Tools in unserem Netzwerk Probleme ergeben, weshalb ich das Formular gerne verändern würde.
Statt die Einträge mit der Tabelle zu vergleichen, in die sie eingetragen werden möchte ich sie mit Tabelle A vergleichen und, sollten sie "neu" sein, in eine Tabelle B eintragen.

Wenn ich den Code richtig interpretiere (was offensichtlich nicht der Fall ist), müsste ich einfach in den Formulareigenschaften bei Daten -> Inhalt die neue Tabelle auswählen, mit der das Formular verknüpft werden soll. Schließlich greift die Funktion, die die Suche durchführt, auf die Variable sSQL zu, in der "Bestand_Videos" als Quelle definiert ist.

Wenn ich die eben genannten Schritte durchführe erhalte ich aber folgende Fehlermeldung beim Ausführen des Makro:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: Der Cursor zeigt vor die erste bzw. hinter die letzte Zeile..
(Ich häng nen Screenshot an)
Die Fehlermeldung
Die Fehlermeldung
fehlermeldung.JPG (47.69 KiB) 1596 mal betrachtet
Das sieht man hier nicht aber wenn der Fehler auftritt ist srid = oresult.getstring(3) makiert.

Anscheinend sucht das Makro die Daten in der Tabelle "neue_Videos" anstatt in "Bestand_Videos"
Wo ist mein Denkfehler?


Das Makro sieht überigens so aus:

Code: Alles auswählen

    Sub S_CheckID
            oform = thiscomponent.drawpage.Forms.MainForm
            oconnection = oform.activeconnection
            SQL_Statement = oconnection.createstatement
            sSQL = "SELECT ""ID"", ""weitere IDs"" FROM ""Bestand_Videos"""
            SQL_Result = SQL_Statement.executequery(sSQL)
            otxtID = oform.txtID
            sID = otxtID.text
            sIDSafe = sID
            while SQL_Result.next
                if SQL_Result.getstring(1) = sID then' or instr(SQL_Result.getstring(2),sID) > 0 then
                    sID = SQL_Result.getstring(1)
                    msgbox "ID schon vorhanden. OK zum suchen des Datensatzes"
                       DialogLibraries.LoadLibrary("Standard")
                    oDialog1 = CreateUnoDialog( DialogLibraries.Standard.msgBox_Bitte_warten )
                    oDialog1.setVisible(true)
                    oform.ignoreresult = false
                    oform.reload
                    goto 100
                  else
                   if SQL_Result.getstring(2) > "" then
                       sIDs = Split(SQL_Result.getstring(2),",")
                       for i = 0 to ubound (sIDs)
                           sIDe = TRIM(sIDs(i))
                           if sIDe = sID then
                          msgbox "ID schon vorhanden. OK zum suchen des Datensatzes"
                                DialogLibraries.LoadLibrary("Standard")
                             oDialog1 = CreateUnoDialog( DialogLibraries.Standard.msgBox_Bitte_warten )
                             oDialog1.setVisible(true
                               sID = SQL_Result.getstring (1)
                               oform.ignoreresult = false
                               oform.reload
                               goto 100
                           endif
                          next i
                     endif
                endif
            wend
            exit sub
            100:
            oform.first
            oresult = oform.createresultset
            nrow = 1
            do
                srid =  oresult.getstring(3)
                if srid = sID then exit do
                nrow = nrow + 1
            loop while oresult.next
            oform.absolute(nrow)
            oform.ignoreresult = true
            oDialog1.setVisible(false)
            msgbox "Datensatz mit ID " +sIDSafe
    End Sub
Test Datenbank_public.odb
Die DB
(16.49 KiB) 81-mal heruntergeladen
Test Datenbank_Formular_public.odt
Das Formular
(15.06 KiB) 91-mal heruntergeladen
Zuletzt geändert von Pixelletter am Fr, 28.06.2013 16:45, insgesamt 1-mal geändert.
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Einträge vor dem Speichern in einer anderen Datenbank su

Beitrag von RobertG »

Hallo Pixelletter,

wenn ich das richtig durchschaue, dann werden in der Schleife die IDs wieder aufgegriffen, die in der ursprünglichen Sql-Abfrage bereits vorkommen. Nur greift der untere Teil auf Deine neue Tabelle zu (über das Formular), der obere Teil auf deine alte (über den SQÖ-Befehl). Beim vorherigen Verfahren mit der gleichlautenden Tabelle waren auch die Felder gleich. Jetzt hat aber Deine neue Tabelle eine andere Zahl an Feldern.

Mir erschließt sich auch nicht so ganz der Sinn des Vorhabens, weshalb ein Datensatz, der in der alten Tabelle vorhanden ist, überhaupt auf sein Vorhandensein untersucht werden soll. Du erzeugst doch keine Duplikate, wenn Du den Datensatz in der neuen Tabelle neu einträgst.
Wenn Du die alte Tabelle weiter nutzen willst - warum machst Du das nicht direkt und gründest stattdessen eine neue?

Gruß

Robert
Pixelletter
*
Beiträge: 12
Registriert: Do, 30.05.2013 13:43

Re: Einträge vor dem Speichern in einer anderen Datenbank su

Beitrag von Pixelletter »

Hallo Robert,

das hat folgenden Grund:
Zunächst muss sicher gestellt werden, dass keine 2 Datensätze die gleiche ID erhalten. Über die ID können die Datensätze eindeutig zugeordnet werden. Die ID ist allerdings vorgegeben und kann nicht frei vergeben werden.

Zuerst war der Plan, die DB zentral auf einem Server abzulegen und über das Formular füllen zu lassen. Das verstößt jedoch gegen interne Sicherheitsrichtlinien der Firma.
Plan B ist deshalb, Arbeitskopien der DB an die Mitarbeiter zu verschicken. Dadruch entstehen viele verschiedene Versionen unterschiedlichen standes die anschließend wieder zu einer DB zusammen gefügt werden müssen. Dabei ist der "Bestand" an Videos bei allen Arbeitskopien identisch, die "Neueinträge" aber bei jeder Kopie unterschiedlich. Dass alles muss verlustfrei und ohne dublikate zusammengefügt werden.
Daher die Idee mit den zwei Tabellen, von denen die "neue" nur in die Ursprungs-DB kopiert und mit der Anhängen-Funktion mit dem Bestand verschmolzen werden muss.

Kann der untere Teil ( Du meinst doch alles unterhalb von 100:?) nicht auch über die SQL-Abfrage auf die alte Tabelle zugreifen?
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Einträge vor dem Speichern in einer anderen Datenbank su

Beitrag von RobertG »

Hallo Pixelletter,

wenn ich den Code richtig deute, dann kommen die Zeilen unterhalb von "100:" ja nur in Betracht, wenn die ID gefunden wurde. In dem Fall soll der entsprechende Datensatz eingeblendet werden, oder lese ich da etwas falsch?
Wenn der Datensatz eingeblendet werden soll, der in einer anderen Tabelle ist als der, die dem Formular zugrunde liegt, dann kann das natürlich nicht funktionieren. Eigentlich müsste hier dann der Datensatz aus der alten Tabelle ausgelesen werden und entsprechend in die Felder geschrieben werden. Oder soll der Datensatz nicht in die neue Tabelle übertragen werden?

Gruß

Robert
Pixelletter
*
Beiträge: 12
Registriert: Do, 30.05.2013 13:43

Re: Einträge vor dem Speichern in einer anderen Datenbank su

Beitrag von Pixelletter »

In dem Fall soll der entsprechende Datensatz eingeblendet werden,
Das ist richtig. Wenn eine ID, die neu eingegeben wird im alten Bestand schon vorhanden ist, soll dieser Satz angezeigt werden und die Fehlersuche kann beginnen. Der Satz soll aber nicht in die neue Tabelle übertragen werden, weil diese ja am Ende mit der alten zusammengeführt wird und sich so neue Dublikate ergeben würden.

Kann man den Datensatz aus der alten Tabelle (sofern einer gefunden wurde) auslesen und (vielleicht in einer Messagebox) anzeigen?
RobertG
********
Beiträge: 2067
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: Einträge vor dem Speichern in einer anderen Datenbank su

Beitrag von RobertG »

Hallo Pixelletter,

das mit der Messagebox ist dann wohl der geeignetste Weg. Eigentlich kannst Du den Datensatz in der vorhergehenden Schleife auslesen. Dein sSQL am Anfang muss sich nur auf die erforderlichen Tabellenfelder komplett beziehen.
if SQL_Result.getstring(1) = sID
ist die Bedingung, die erfüllt sein muss, um alle anderen Felder auch auszulesen. Da muss auch nicht mehr gewartet werden. Der Inhalt wird direkt gelesen und das Formular nicht weiter angefasst. Stattdessen werden die Daten in msgbox angezeigt.

Gruß

Robert
Pixelletter
*
Beiträge: 12
Registriert: Do, 30.05.2013 13:43

Re: Einträge vor dem Speichern in einer anderen Datenbank su

Beitrag von Pixelletter »

Ich hab's hin bekommen.
Danke Robert für den Wegweiser.
Antworten