'Felder Abfragen

SUB Unsichtbar(NameFormular AS STRING, NameSubFormular AS STRING, NameSubSubFormular AS STRING, NameFeld AS STRING)
    REM Felder, die nur zur Speicherung der ID-Werte in den Tabellen dienen, werden auf unsichtbar eingestellt
    DIM oForm AS OBJECT
    DIM oSubForm AS OBJECT
    DIM oSubSubForm AS OBJECT
    DIM oFeld AS OBJECT
    DIM oCtlView AS OBJECT
    oDoc=thisComponent
    oDrawpage=oDoc.Drawpage
    REM Lage des Feldes in dem entsprechenden Formular aufsuchen
    oForm=oDrawpage.Forms.getByName(NameFormular)
    IF NameSubFormular<>"" THEN
        oSubForm=oForm.getByName(NameSubFormular)
        IF NameSubSubFormular<>"" THEN
            oSubSubForm=oSubForm.getByName(NameSubSubFormular)
            oFeld=oSubSubForm.getByName(NameFeld)    
            ELSE oFeld=oSubForm.getByName(NameFeld)
        END IF    
        ELSE oFeld=oForm.getByName(NameFeld)
    END IF
    REM Zugreifen auf das Kontrollfeld und auf unsichtbar schalten
    oDocCrl = ThisComponent.getCurrentController()
    oCtlView = oDocCrl.GetControl(oFeld)
    oCtlView.Visible=false
END SUB

SUB TextAnzeigen(NameFormular AS STRING, NameSubFormular AS STRING, NameSubSubFormular AS STRING, _
    NameFeld AS STRING, NameIDFeld AS STRING, NameTabellenFeld1 AS STRING, NameTabellenFeld2 AS STRING, _
    NameTab12ID AS STRING, NameTabelle1 AS STRING, NameTabelle2 AS STRING)
    REM Text in den Kombinationsfeldern nach den Werten der (unsichtbaren) ID-Felder aus dem Hauptformular einstellen
    DIM oForm AS OBJECT
    DIM oSubForm AS OBJECT
    DIM oSubSubForm AS OBJECT
    DIM oFeld AS OBJECT
    DIM oFeldList AS OBJECT
    DIM stFeldWert AS STRING
    DIM inID AS INTEGER
    DIM oCtlView AS OBJECT
    oDoc=thisComponent
    oDrawpage=oDoc.Drawpage
    oForm=oDrawpage.forms.getByName(NameFormular)
    REM Lage des Feldes in dem entsprechenden Formular aufsuchen
    IF NameSubFormular<>"" THEN
        oSubForm=oForm.getByName(NameSubFormular)
        IF NameSubSubFormular<>"" THEN
            oSubSubForm=oSubForm.getByName(NameSubSubFormular)
            oFeld=oSubSubForm.getByName(NameIDFeld)
            oFeldList=oSubSubForm.getByName(NameFeld)    
            ELSE
            oFeld=oSubForm.getByName(NameIDFeld)
            oFeldList=oSubForm.getByName(NameFeld)
        END IF    
        ELSE
        oFeld=oForm.getByName(NameIDFeld)
        oFeldList=oForm.getByName(NameFeld)
    END IF
    oFeldList.Refresh()
    REM Wert des ID-Feldes auslesen
    IF NOT IsEmpty(oFeld.getCurrentValue()) THEN
        inID=oFeld.getCurrentValue()
        REM Nur wenn das ID-Feld nicht leer ist: oVerbindung mit der oDatenquelle herstellen    
        oDatenquelle = ThisComponent.Parent.CurrentController
        If NOT (oDatenquelle.isConnected()) Then
            oDatenquelle.connect()
        End If
        oVerbindung = oDatenquelle.ActiveConnection()
        oSQL_Anweisung = oVerbindung.createStatement()
        REM SQL-Anweisung nach den in dem Kombinationsfeld dargestellten Feldern formulieren
        IF NameTabellenFeld2<>"" THEN
        REM Wenn ein zweites Tabellenfeld existiert    
            IF NameTabelle2<>"" THEN
            REM ... und wenn eine zweite Tabelle existiert
                    stSql = "SELECT """+NameTabelle1+"""."""+NameTabellenFeld1+"""||' '||""" _
                        +NameTabelle2+"""."""+NameTabellenFeld2+""" FROM """+NameTabelle1
                    stSql = stSql+""","""+NameTabelle2+""" WHERE ""ID""='"+inID+"' AND """+NameTabelle1+ _
                        """."""+NameTab12ID+"""="""+NameTabelle2+""".""ID"""
                ELSE
                REM ... und eine zweite Tabelle nicht existiert    
                stSql = "SELECT """+NameTabellenFeld1+"""||' '||"""+NameTabellenFeld2+""" FROM """_
                    +NameTabelle1+""" WHERE ""ID""='"+inID+"'"
            END IF
            ELSE
            REM Wenn ein zweites Tabellenfeld nicht existiert kann es auch nur eine Tabelle sein    
            stSql = "SELECT """+NameTabellenFeld1+""" FROM """+NameTabelle1+""" WHERE ""ID""='"+inID+"'"
        END IF
        oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
        IF NOT ISNULL(oAbfrageergebnis) THEN        
          WHILE oAbfrageergebnis.next
            stFeldWert = oAbfrageergebnis.getString(1)' Erstes Datenfeld
          WEND ' naechster Datensatz
            REM Kombinationsfeld auf den aus der Abfrage sich ergebenden Textwert einstellen
            oDocCrl = ThisComponent.getCurrentController()
            oCtlView = oDocCrl.GetControl(oFeldList)
            oCtlView.setText(stFeldWert)
        END IF
    END IF
    IF IsEmpty(oFeld.getCurrentValue()) THEN
        REM Kombinationsfeld auf den aus der Abfrage sich ergebenden Textwert einstellen
        oDocCrl = ThisComponent.getCurrentController()
        oCtlView = oDocCrl.GetControl(oFeldList)
        oCtlView.setText("")
    END IF
END SUB

FUNCTION TextAuswahlWertSpeichern(NameFormular AS STRING, NameSubFormular AS STRING, NameSubSubFormular AS STRING, _
    NameFeld AS STRING, NameIDFeld AS STRING, NameTabellenFeld1 AS STRING, NameTabellenFeld2 AS STRING, _
    NameTab12ID AS STRING, NameTabelle1 AS STRING, NameTabelle2 AS STRING, LaengeFeld1 AS INTEGER, LaengeFeld2 AS INTEGER) AS STRING
    DIM oForm AS OBJECT
    DIM oSubForm AS OBJECT
    DIM oSubSubForm AS OBJECT
    DIM oFeld AS OBJECT
    DIM oFeldList AS OBJECT
    DIM stInhalt AS STRING
    DIM stInhaltFeld2 AS STRING
    DIM a_stTeile() AS STRING
    DIM stmsgbox1 AS STRING
    DIM stmsgbox2 AS STRING
    DIM i AS INTEGER
    DIM inAnzahl AS INTEGER
    DIM inAnzahl2 AS INTEGER
    DIM inAnzahl3 AS INTEGER
    DIM inID AS INTEGER
    REM Formular ansteuern, Textfeld auslesen
    oDoc=thisComponent
    oDrawpage=oDoc.Drawpage
    oForm=oDrawpage.Forms.getByName(NameFormular)
    IF NameSubFormular<>"" THEN
        oSubForm=oForm.getByName(NameSubFormular)
        IF NameSubSubFormular<>"" THEN
            oSubSubForm=oSubForm.getByName(NameSubSubFormular)
            oFeld=oSubSubForm.getByName(NameIDFeld)
            oFeldList=oSubSubForm.getByName(NameFeld)
            ELSE
            oFeld=oSubForm.getByName(NameIDFeld)
            oFeldList=oSubForm.getByName(NameFeld)
        END IF    
        ELSE
        oFeld=oForm.getByName(NameIDFeld)
        oFeldList=oForm.getByName(NameFeld)
    END IF
    stInhalt=oFeldList.getCurrentValue()
    REM Leertasten am Anfang und Ende der Eingabe gegebenenfalls entfernen
    stInhalt=Trim(stInhalt)
    IF stInhalt<>"" THEN
        IF NameTabellenFeld2<>"" THEN
        REM Wenn ein zweites Tabellenfeld existiert    muss der Inhalt des Kombinationsfeldes gesplittet werden. Dabei wird von einem leeren Feld als Trenner ausgegangen.
            a_stTeile=Split(stInhalt, " ")
            u=Ubound(a_stTeile)
            stInhalt=a_stTeile(0)
            REM Künftig hier verbessern: So wird der Rest komplett als zweiter Inhalt gesehen, incl. Leerstellen
            FOR i=1 TO u    ' ... alle Teile bis auf den ersten wieder zusammenfuegen, dabei Leerstellen wieder einfuegen ...
                stInhaltFeld2=stInhaltFeld2+" "+a_stTeile(i)
            NEXT i
            stInhaltFeld2=Trim(stInhaltFeld2)    
        END IF
        IF (LaengeFeld1 > 0 AND Len(stInhalt) > LaengeFeld1) OR (LaengeFeld2 > 0 AND Len(stInhaltFeld2) > LaengeFeld2) THEN
            stmsgbox1 = "Das Feld "+NameTabellenFeld1+" darf höchstens "+LaengeFeld1+ "Zeichen lang sein."+CHR(13)
            stmsgbox2 = "Das Feld "+NameTabellenFeld2+" darf höchstens "+LaengeFeld2+ "Zeichen lang sein."+CHR(13)
            IF (LaengeFeld1 > 0 AND Len(stInhalt) > LaengeFeld1) AND (LaengeFeld2 > 0 AND Len(stInhaltFeld2) > LaengeFeld2) THEN
                msgbox ("Der eingegebene Text ist zu lang."+CHR(13)+stmsgbox1+stmsgbox2+"Bitte den Text kürzen.",64,"Fehlerhafte Eingabe")
            ELSEIF (LaengeFeld1 > 0 AND Len(stInhalt) > LaengeFeld1) THEN
                msgbox ("Der eingegebene Text ist zu lang."+CHR(13)+stmsgbox1+"Bitte den Text kürzen.",64,"Fehlerhafte Eingabe")
            ELSE
                msgbox ("Der eingegebene Text ist zu lang."+CHR(13)+stmsgbox2+"Bitte den Text kürzen.",64,"Fehlerhafte Eingabe")
            END IF
        ELSE
            REM Datenbankverbindung erzeugen
            oDatenquelle = ThisComponent.Parent.CurrentController
            If NOT (oDatenquelle.isConnected()) Then
                oDatenquelle.connect()
            End If
            oVerbindung = oDatenquelle.ActiveConnection()
            oSQL_Anweisung = oVerbindung.createStatement()
            stSql = "SELECT COUNT(""ID"") FROM """+NameTabelle1+""" GROUP BY """+NameTabellenFeld1+""" HAVING """+NameTabellenFeld1+"""='"+stInhalt+"'"
            oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
            inAnzahl=0
            inAnzahl2=0
            inAnzahl3=0
            i=0
            IF NOT ISNULL(oAbfrageergebnis) THEN
                WHILE oAbfrageergebnis.next
                    inAnzahl = oAbfrageergebnis.getInt(1)' Erstes Datenfeld
                WEND ' naechster Datensatz
            END IF
            IF NameTabellenFeld2<>"" AND NOT IsEmpty(stInhaltFeld2) AND NameTabelle2<>"" THEN
                REM Wenn ein zweites Tabellenfeld existiert    
                REM muss zuerst die zweite Abhaengigkeit geklaert werden
                stSql = "SELECT COUNT(""ID"") FROM """+NameTabelle2+""" GROUP BY """+NameTabellenFeld2+""" HAVING """+NameTabellenFeld2+"""='"+stInhaltFeld2+"'"
                oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
                IF NOT ISNULL(oAbfrageergebnis) THEN
                    WHILE oAbfrageergebnis.next
                        inAnzahl2 = oAbfrageergebnis.getInt(1)' Erstes Datenfeld
                    WEND ' naechster Datensatz
                END IF
                IF inAnzahl2<1 THEN    
                    stSql = "INSERT INTO """+NameTabelle2+""" ("""+NameTabellenFeld2+""") VALUES ('"+stInhaltFeld2+"') "
                    oSQL_Anweisung.executeUpdate(stSql)
                    i=2    
                END IF                            
                REM Und die entsprechende ID direkt wieder auslesen    bzw. die ID der vorherigen Abfrage ermitteln    
                stSql = "SELECT ""ID"" FROM """+NameTabelle2+""" WHERE """+NameTabellenFeld2+""" ='"+stInhaltFeld2+"'"
                oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
                IF NOT ISNULL(oAbfrageergebnis) THEN
                    WHILE oAbfrageergebnis.next
                    inID = oAbfrageergebnis.getInt(1)' Erstes Datenfeld
                    WEND ' naechster Datensatz
                END IF
                IF inAnzahl<1 THEN
                    stSql = "INSERT INTO """+NameTabelle1+""" ("""+NameTabellenFeld1+""","""_
                    +NameTab12ID+""") VALUES ('"+stInhalt+"','"+inID+"') "
                    i=1
                ELSE
                    stSql = "UPDATE """+NameTabelle1+""" SET """+NameTab12ID+"""='"+inID+"' WHERE """+NameTabellenFeld1+""" = '"+stInhalt+"'"
                END IF            
                oSQL_Anweisung.executeUpdate(stSql)                            
                REM Und die entsprechende ID direkt wieder auslesen    bzw. die ID der vorherigen Abfrage ermitteln    
                stSql = "SELECT ""ID"" FROM """+NameTabelle1+""" WHERE """+NameTabellenFeld1+""" ='"+stInhalt+"' AND  """+NameTab12ID+"""='"+inID+"'"
                oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
                IF NOT ISNULL(oAbfrageergebnis) THEN
                    WHILE oAbfrageergebnis.next
                    inID = oAbfrageergebnis.getInt(1)' Erstes Datenfeld
                    WEND ' naechster Datensatz
                END IF
            END IF
            IF NameTabellenFeld2<>"" AND NameTabelle2="" THEN
                stSql = "SELECT COUNT(""ID"") FROM """+NameTabelle1+""" GROUP BY """+NameTabellenFeld1+""","""_
                +NameTabellenFeld2+"""  HAVING """+NameTabellenFeld1+"""='"+stInhalt+"' AND """+NameTabellenFeld2+"""='"+stInhaltFeld2+"'"
                oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
                IF NOT ISNULL(oAbfrageergebnis) THEN
                    WHILE oAbfrageergebnis.next
                        inAnzahl3 = oAbfrageergebnis.getInt(1)' Erstes Datenfeld
                    WEND ' naechster Datensatz
                END IF
                IF inAnzahl3<1 THEN
                    REM ... und eine zweite Tabelle nicht existiert
                    stSql = "INSERT INTO """+NameTabelle1+""" ("""+NameTabellenFeld1+""","""_
                        +NameTabellenFeld2+""") VALUES ('"+stInhalt+"','"+stInhaltFeld2+"') "
                    i=1
                    oSQL_Anweisung.executeUpdate(stSql)    
                END IF    
                stSql = "SELECT ""ID"" FROM """+NameTabelle1+""" WHERE """+NameTabellenFeld1+""" ='"+stInhalt+"' AND  """+NameTabellenFeld2+"""='"+stInhaltFeld2+"'"
                oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
                IF NOT ISNULL(oAbfrageergebnis) THEN
                    WHILE oAbfrageergebnis.next
                    inID = oAbfrageergebnis.getInt(1)' Erstes Datenfeld
                    WEND ' naechster Datensatz
                END IF
            END IF
            IF inAnzahl<1 AND NameTabellenFeld2="" THEN
                REM Wenn ein zweites Tabellenfeld nicht existiert
                stSql = "INSERT INTO """+NameTabelle1+""" ("""+NameTabellenFeld1+""") VALUES ('"+stInhalt+"') "
                i=1
                oSQL_Anweisung.executeUpdate(stSql)
            END IF
            IF NameTabellenFeld2="" THEN
                REM Wert des ID-Feldes ermitteln, das in die Haupttabelle eingetragen wird
                stSql = "SELECT ""ID"" FROM """+NameTabelle1+""" WHERE """+NameTabellenFeld1+"""='"+stInhalt+"'"
                oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
                IF NOT ISNULL(oAbfrageergebnis) THEN
                    WHILE oAbfrageergebnis.next
                        inID = oAbfrageergebnis.getInt(1)' Erstes Datenfeld
                    WEND ' naechster Datensatz
                END IF
            END IF
              REM ID-Wert in das (unsichtbare) Feld der Haupttabelle eintragen
            oFeld.BoundField.updateInt(inID)
        END IF
    ELSE
        oFeld.BoundField.updateNull()
    END IF
    TextAuswahlWertSpeichern=i
END FUNCTION

SUB Formular_Start_Mitglied    
    DIM oForm AS OBJECT
    DIM oFeld1 AS OBJECT
    DIM inID AS INTEGER
    REM Unsichtbares ID-Feld für die einzeilige Tabelle, in der Zwischenwerte abgespeichert werden
    Unsichtbar("Mitglied","","","ID")
    REM *** Adresse ***
    REM Unsichtbar(NameFormular AS STRING, NameSubFormular AS STRING, NameSubSubFormular AS STRING, NameFeld AS STRING)
    Unsichtbar("Mitglied","","","numstrID")
    Unsichtbar("Mitglied","","","numposID")
    Unsichtbar("Mitglied","","","numID_Adr")
    REM TextAnzeigen(NameFormular AS STRING, NameSubFormular AS STRING, NameSubSubFormular AS STRING, NameFeld AS STRING,
    REM NameIDFeld AS STRING, NameTabellenFeld1 AS STRING, NameTabellenFeld2 AS STRING, NameTab12ID AS STRING,
    REM NameTabelle1 AS STRING, NameTabelle2 AS STRING)
    TextAnzeigen("Mitglied","","","LBStrasse","numstrID","Strasse","","","Strasse","")
    TextAnzeigen("Mitglied","","","LBPLZ_Ort","numposID","Postleitzahl","Ort","ortID","Postleitzahl","Ort")
    REM *** Konto ***    
    REM Unsichtbar(NameFormular AS STRING, NameSubFormular AS STRING, NameSubSubFormular AS STRING, NameFeld AS STRING)
    Unsichtbar("Mitglied","","","numblzID")
    Unsichtbar("Mitglied","","","numID_Kon")
    REM TextAnzeigen(NameFormular AS STRING, NameSubFormular AS STRING, NameSubSubFormular AS STRING, NameFeld AS STRING,
    REM NameIDFeld AS STRING, NameTabellenFeld1 AS STRING, NameTabellenFeld2 AS STRING, NameTab12ID AS STRING,
    REM NameTabelle1 AS STRING, NameTabelle2 AS STRING)
    TextAnzeigen("Mitglied","","","LBBLZ_Bank","numblzID","BLZ","Bank","","Bank","")
    REM Da statt der Eingabe einer Mitgliedsnummer eine Checkbox verwendet wird, um das Mitglied als dasjenige auszuweisen, das mit dem Konto zu verbinden ist,
    REM wird bei Gleichheit der Nummern in der Tabelle Konto und der Tabelle Mitglied die Checkbox auf "True" gestellt
    REM Datenbankverbindung erzeugen
    oDatenquelle = ThisComponent.Parent.CurrentController
    If NOT (oDatenquelle.isConnected()) Then
        oDatenquelle.connect()
    End If
    oVerbindung = oDatenquelle.ActiveConnection()
    oSQL_Anweisung = oVerbindung.createStatement()
    stSql = "SELECT ""Konto_mitID"" FROM ""Filter_Formular"""
    oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)' Ergebnis auswerten
    IF NOT ISNULL(oAbfrageergebnis) THEN
        WHILE oAbfrageergebnis.next
            inID = oAbfrageergebnis.getInt(1)' Erstes Datenfeld
        WEND ' naechster Datensatz
    END IF    
    oDoc=thisComponent
    oDrawpage=oDoc.drawpage
    oForm=oDrawpage.forms.getByName("Mitglied")
    oFeld1=oForm.getByName("fmtID")
    IF oFeld1.GetCurrentValue = inID THEN
        oForm.getByName("chkKonto").State = 1
    ELSE
        oForm.getByName("chkKonto").State = 0
    END IF
    Formular_Mitglied_chkKonto
    Formular_Mitglied_Eingabesperre
END SUB

SUB Formular_Mitglied_chkKonto
    DIM oForm AS OBJECT
    DIM oFeld2 AS OBJECT
    DIM oFeld3 AS OBJECT
    oDoc=thisComponent
    oDrawpage=oDoc.drawpage
    oForm=oDrawpage.forms.getByName("Mitglied")
    oFeld2=oForm.getByName("lbomitID")
    oFeld3=oForm.getByName("chkKonto")
    IF oFeld3.State = 1 THEN    
        oForm.getByName("lbomitID").ReadOnly = True
        oForm.getByName("txtNachname_Kon").ReadOnly = True
        oForm.getByName("txtVorname_Kon").ReadOnly = True
        oForm.getByName("txtKonto").ReadOnly = False
        oForm.getByName("LBBLZ_Bank").ReadOnly = False
        oForm.getByName("lbomitID").BackgroundColor =  RGB(230,230,230)
        oForm.getByName("txtNachname_Kon").BackgroundColor =  RGB(230,230,230)
        oForm.getByName("txtVorname_Kon").BackgroundColor = RGB(230,230,230)
        oForm.getByName("txtKonto").BackgroundColor = RGB(255,255,255)
        oForm.getByName("LBBLZ_Bank").BackgroundColor = RGB(255,255,255)
    ELSEIF oFeld2.GetCurrentValue <> "" THEN
        oForm.getByName("lbomitID").ReadOnly = False
        oForm.getByName("txtNachname_Kon").ReadOnly = True
        oForm.getByName("txtVorname_Kon").ReadOnly = True
        oForm.getByName("txtKonto").ReadOnly = True
        oForm.getByName("LBBLZ_Bank").ReadOnly = True
        oForm.getByName("lbomitID").BackgroundColor =  RGB(230,230,255)
        oForm.getByName("txtNachname_Kon").BackgroundColor = RGB(230,230,230)
        oForm.getByName("txtVorname_Kon").BackgroundColor = RGB(230,230,230)
        oForm.getByName("txtKonto").BackgroundColor = RGB(230,230,230)
        oForm.getByName("LBBLZ_Bank").BackgroundColor = RGB(230,230,230)
    ELSE
        oForm.getByName("lbomitID").ReadOnly = False
        oForm.getByName("txtNachname_Kon").ReadOnly = False
        oForm.getByName("txtVorname_Kon").ReadOnly = False
        oForm.getByName("txtKonto").ReadOnly = False
        oForm.getByName("LBBLZ_Bank").ReadOnly = False
        oForm.getByName("lbomitID").BackgroundColor =  RGB(230,230,255)
        oForm.getByName("txtNachname_Kon").BackgroundColor = RGB(255,255,255)
        oForm.getByName("txtVorname_Kon").BackgroundColor = RGB(255,255,255)
        oForm.getByName("txtKonto").BackgroundColor = RGB(255,255,255)
        oForm.getByName("LBBLZ_Bank").BackgroundColor = RGB(255,255,255)
    END IF
    oForm.getByName("lbomitID").refresh()
END SUB