Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Abfrage funktioniert aber als SQL-Anweisung Fehler 3061

Begonnen von AvalonStealth, Juli 21, 2011, 12:20:56

⏪ vorheriges - nächstes ⏩

DF6GL

Hallo,

gut, wenn es geht..

Trotzdem solltest Du nochmal die Datenbeziehungen überprüfen, ob die wirklich so abgebildet sind, wie sie in der Realität zusammenhängen.

(Speziell die Beziehung der Behandlungen zu den Rezepten..)

elvodia

In php mit Mysql gab es die Möglichkeit sich den SQL string mit werten anstatt der variablen anzeigen zulassen. So finde ich sieht man besser wo man einen fehler hat was Hoch und Gäsne betrifft. Gib es sowas bei access auch?

DF6GL

Hallo,


"Drucke" den SQL-String (bzw. den Inhalt einer entspr. Variablen) mit Debug.Print in das Direktfenster im VBA-Editor.

elvodia

Danke den befehl hatte ich sogar schon drin nur das Fenster nciht offen.

Allerdings weis ich cniht wie ich den fehler beheben soll.

If Var_hausbesuch = True Then
                            MsgBox "HB"
                            strSQL = "UPDATE tbl_behandlungen SET " _
                                    & "tbl_behandlungen.BH_Patienten_ID = '" & [Forms]![FM_behandlung_eingabeform]![tf_patient] & "', " _
                                    & "tbl_behandlungen.BH_Leistungs_ID = '" & [Forms]![FM_behandlung_eingabeform]![tf_behandlungsart] & "', " _
                                    & "tbl_behandlungen.BH_Datum = '" & [Forms]![FM_behandlung_eingabeform]![tf_behandlungsdatum] & "', " _
                                    & "tbl_behandlungen.BH_RZ_ID = '" & [Forms]![FM_behandlung_eingabeform]![tf_RZ_ID] & "', " _
                                    & "tbl_behandlungen.BH_HB = ' & Var_hausbesuch & ', " _
                                    & "tbl_behandlungen.BH_HB_Leistungs_ID = '" & Var_hausbesuchsnummer & "' WHERE " _
                                    & "tbl_behandlungen.BH_ID = " & [Forms]![FM_behandlung_eingabeform]![TF_BH_ID] & ""
                                   
                            Debug.Print strSQL
                           
                            CurrentDb.Execute strSQL
                        Else



Resultat

UPDATE tbl_behandlungen SET tbl_behandlungen.BH_Patienten_ID = '13', tbl_behandlungen.BH_Leistungs_ID = '28', tbl_behandlungen.BH_Datum = '29.12.2011', tbl_behandlungen.BH_RZ_ID = '6', tbl_behandlungen.BH_HB = 'Wahr', tbl_behandlungen.BH_HB_Leistungs_ID = '37' WHERE tbl_behandlungen.BH_ID = 333

Habe versucht es alleine hinzubekommen durch setzen von Hochkommas Gänse aber es will einfach nicht. Er setzt mir das ja/nein feld immer aus Falsch

daolix

bin mir nicht sicher aber müsste Wahr nicht True lauten?
Auch sind die Hochkommata überflüssig wenn du Zahlenwerte übergibst wenn das Feld eine integer/float-Class ist

elvodia

Der wert wird aus einer Variable bezogen die ich aus einem Ja7Nein feld auslese. Sollte stimmen.

daolix

Zitat von: elvodia am Dezember 29, 2011, 12:57:59
Der wert wird aus einer Variable bezogen die ich aus einem Ja7Nein feld auslese. Sollte stimmen.
Nun das Problem ist das VBA in diesem Fall alles eindeutscht, was aber für den sql-string nicht richtig sein muss ( siehe z.B Übergabe einer Date - Variablen) richtiger ist True ohne Hochkommata.
& "tbl_behandlungen.BH_HB = True, " _


elvodia

Also das mit dem True schein jetzt zu funktionieren. Er änder auch die Daten aber das Ja/nein Feld ändert er nciht alles andere ja.

ich poste mal die Sub.Nicht erschrecken ist massig viel veilleicht kann man es Verkleinern aber dazu sind meine Kenntnisse zu gering.

Private Sub button_behandlung_bearbeiten_save_Click()

    If Var_modus = "neu" Then   'Wenn neu Modus
   
        If IsNull(Me.tf_patient) = True Then
            MsgBox ("Patient auswählen.")
        Else
            If IsNull(Me.tf_behandlungsart) = True Then
                MsgBox ("Behandlung auswählen.")
            Else
                If IsNull(Me.tf_RZ_ID) = True Then
                    MsgBox ("Rezept auswählen.")
                Else
                    strSQL = "SELECT KL_Leistungs_ID " _
                            & "FROM (tbl_kassendaten INNER JOIN tbl_kassenleistungen " _
                            & "ON tbl_kassendaten.KK_Kassentyp = tbl_kassenleistungen.KL_Kassentyp) " _
                            & "INNER JOIN tbl_patientendaten ON tbl_kassendaten.KK_Kassennummer = tbl_patientendaten.PD_Kassennummer " _
                            & "WHERE (((tbl_kassenleistungen.KL_Leistungsname) Like " & "'*hausbesuch*'" & ") AND " _
                            & "((tbl_patientendaten.PD_ID)= " & [Forms]![FM_behandlung_eingabeform]![tf_patient] & "));"
             
                    Set rst = CurrentDb.OpenRecordset(strSQL)

                    Var_hausbesuchsnummer = rst.Fields(0).Value
                    Var_hausbesuch = Nz(DLookup("[RZ_HB]", "[tbl_rezepte]", "[RZ_ID] = " & Me.tf_RZ_ID), False)
               
                        If Var_hausbesuch = True Then
                            strSQL = "INSERT INTO tbl_behandlungen (BH_Patienten_ID,BH_Leistungs_ID,BH_Datum,BH_RZ_ID,BH_HB,BH_HB_Leistungs_ID) VALUES ('" & Me.tf_patient & "','" & Me.tf_behandlungsart & "','" & Me.tf_behandlungsdatum & "','" & Me.tf_RZ_ID & "', -1,'" & Var_hausbesuchsnummer & "')"
                            Debug.Print strSQL
                            CurrentDb.Execute strSQL
                        Else
                            strSQL = "INSERT INTO tbl_behandlungen (BH_Patienten_ID,BH_Leistungs_ID,BH_Datum,BH_RZ_ID) VALUES ('" & Me.tf_patient & "','" & Me.tf_behandlungsart & "','" & Me.tf_behandlungsdatum & "','" & Me.tf_RZ_ID & "')"
                            Debug.Print strSQL
                            CurrentDb.Execute strSQL
                   
                        End If
               
                    Me.Undo
                    DoCmd.Close acDefault
                    DoCmd.Requery
                    MsgBox ("Gespeichert.")
               
                End If
            End If
        End If
    Else                                                'Wenn bearbeiten modus
   
            If IsNull(Me.tf_patient) = True Then
            MsgBox ("Patient auswählen.")
        Else
            If IsNull(Me.tf_behandlungsart) = True Then
                MsgBox ("Behandlung auswählen.")
            Else
                If IsNull(Me.tf_RZ_ID) = True Then
                    MsgBox ("Rezept auswählen.")
                Else
                    strSQL = "SELECT KL_Leistungs_ID " _
                            & "FROM (tbl_kassendaten INNER JOIN tbl_kassenleistungen " _
                            & "ON tbl_kassendaten.KK_Kassentyp = tbl_kassenleistungen.KL_Kassentyp) " _
                            & "INNER JOIN tbl_patientendaten ON tbl_kassendaten.KK_Kassennummer = tbl_patientendaten.PD_Kassennummer " _
                            & "WHERE (((tbl_kassenleistungen.KL_Leistungsname) Like " & "'*hausbesuch*'" & ") AND " _
                            & "((tbl_patientendaten.PD_ID)= " & [Forms]![FM_behandlung_eingabeform]![tf_patient] & "));"
             
                    Set rst = CurrentDb.OpenRecordset(strSQL)

                    Var_hausbesuchsnummer = rst.Fields(0).Value
                    Var_hausbesuch = Nz(DLookup("[RZ_HB]", "[tbl_rezepte]", "[RZ_ID] = " & Me.tf_RZ_ID), False)
               
                        If Var_hausbesuch = True Then
                            MsgBox "HB"
                            strSQL = "UPDATE tbl_behandlungen SET " _
                                    & "tbl_behandlungen.BH_Patienten_ID = '" & [Forms]![FM_behandlung_eingabeform]![tf_patient] & "', " _
                                    & "tbl_behandlungen.BH_Leistungs_ID = '" & [Forms]![FM_behandlung_eingabeform]![tf_behandlungsart] & "', " _
                                    & "tbl_behandlungen.BH_Datum = '" & [Forms]![FM_behandlung_eingabeform]![tf_behandlungsdatum] & "', " _
                                    & "tbl_behandlungen.BH_RZ_ID = '" & [Forms]![FM_behandlung_eingabeform]![tf_RZ_ID] & "', " _
                                    & "tbl_behandlungen.BH_HB = True, " _
                                    & "tbl_behandlungen.BH_HB_Leistungs_ID = '" & Var_hausbesuchsnummer & "' WHERE " _
                                    & "tbl_behandlungen.BH_ID = " & [Forms]![FM_behandlung_eingabeform]![TF_BH_ID] & ""
                                   
                            Debug.Print strSQL
                           
                            CurrentDb.Execute strSQL
                        Else
                            MsgBox "kein HB"
                            strSQL = "UPDATE tbl_behandlungen SET " _
                                    & "tbl_behandlungen.BH_Patienten_ID = '" & [Forms]![FM_behandlung_eingabeform]![tf_patient] & "', " _
                                    & "tbl_behandlungen.BH_Leistungs_ID = '" & [Forms]![FM_behandlung_eingabeform]![tf_behandlungsart] & "', " _
                                    & "tbl_behandlungen.BH_Datum = '" & [Forms]![FM_behandlung_eingabeform]![tf_behandlungsdatum] & "', " _
                                    & "tbl_behandlungen.BH_RZ_ID = '" & [Forms]![FM_behandlung_eingabeform]![tf_RZ_ID] & "', " _
                                    & "tbl_behandlungen.BH_HB = False, " _
                                    & "tbl_behandlungen.BH_HB_Leistungs_ID = 0 WHERE " _
                                    & "tbl_behandlungen.BH_ID = " & [Forms]![FM_behandlung_eingabeform]![TF_BH_ID] & ""
                            Debug.Print strSQL
                            CurrentDb.Execute strSQL
                   
                        End If
               
                   
                    DoCmd.Close acDefault
                    DoCmd.Requery
                    MsgBox ("Gespeichert.")
               
                End If
            End If
        End If
    End If
End Sub


database

Hallo,

du verwendest doch immer keine Variablendeklaration!

Versuch mal:

Dim Var_hausbesuch as boolean
Var_hausbesuch = Nz(DLookup("[RZ_HB]", "[tbl_rezepte]", "[RZ_ID] = " & Me.tf_RZ_ID), False)

Die Hochkommata bei Zahlenwerten solltest du ebenfalls weglassen und das Datum VBA-konform formatieren
siehe:
http://www.donkarl.com?FAQ6.8


HTH

elvodia

Zitatdu verwendest doch immer keine Variablendeklaration!

Doch aber die sind in Kopf die habe ich nur net gepostet.

UPDATE tbl_behandlungen SET tbl_behandlungen.BH_Patienten_ID = 13, tbl_behandlungen.BH_Leistungs_ID = 28, tbl_behandlungen.BH_Datum = #2011-12-29#, tbl_behandlungen.BH_RZ_ID = 6, tbl_behandlungen.BH_HB = True, tbl_behandlungen.BH_HB_Leistungs_ID = 37 WHERE tbl_behandlungen.BH_ID = 337
UPDATE tbl_behandlungen SET tbl_behandlungen.BH_Patienten_ID = 13, tbl_behandlungen.BH_Leistungs_ID = 21, tbl_behandlungen.BH_Datum = #2011-12-29#, tbl_behandlungen.BH_RZ_ID = 1, tbl_behandlungen.BH_HB = False, tbl_behandlungen.BH_HB_Leistungs_ID = 0 WHERE tbl_behandlungen.BH_ID = 337


Das sieht für meine Verhältnisse nach einem Sauberen SQL aus jedoch ändert er das Ja nein Feld einfach nicht obwohl der Update Befehl kommt.

DF6GL

Hallo,



schreib mal (nur für  Testzweck)


Docmd.RunSQL strSQL

anstatt

CurrentDb.Execute strSQL, dbFailOnError    ' füg dbFailOnError  bei Execute noch hinzu.




Hast Du "Option Explicit" im Kopf dieses Formular-Modules?

elvodia

#26
ZitatHast Du "Option Explicit" im Kopf dieses Formular-Modules?

Steht in jedem Kopf.

Habe gerade heraus gefunden das doch alles so funktioniert. Manchmal gewinnt man eben nur durch rumspielen.

Ich habe noch ein me.undo vor DoCmd.Close acDefault eingebaut. Er brachte nämlich immer das Fenster was im Anhang ist.

Ich möchte  hier "tbl_behandlungen.BH_HB_Leistungs_ID = 0" nicht 0 sonder nix also das feld soll leer sein reinschreiben. habe es mit tbl_behandlungen.BH_HB_Leistungs_ID = '""' versucht dann bringt er anhang bild 2

[Anhang gelöscht durch Administrator]

database

Hi,

was ist denn das Feld BH_HB IN DER TABELLE für ein Datentyp? Wenn das ein Ja/Nein Feld ist (was ich schwerstens hoffe) dann kannst du auch    -1   für JA  und 0  für NEIN übergeben.

tbl_behandlungen.BH_HB_Leistungs_ID = '""'    wird bei einem Felddatentyp Zahl wohl kaum funktionieren, du kannst so einem Feld nicht mitteilen, dass es keinen Text enthält!

tbl_behandlungen.BH_HB_Leistungs_ID = NULL   .... sollte da schon eher gehen


elvodia

BH_HB ist ein Ja/nein feld. Das mit -1 und 0 weis ich jedoch True und False geht ja jetzt.

Das mit der NULL hab wunderbar funktioniert. Danke sehr.

Der fehler lag einfach darin das ich den Datensatz per SQL update und dann ein DoCmd.Close ausführe um das Form zu schließen und wieder in der Übersicht lande. Dabei will er natürlich die änderung nochmals speichern und meckert rum weil die daten schun ein Update erhalten haben. ich habe dann im Form einfach vorm Close ein Me.undo eingebaut und somit werden die Daten nur vom SQL geändert. Werde dies aber ncoh umbauen habe gestern überlegt wie ich das Übers Form machen könnte und werde dies mal ausprobieren. Dazu werde ich versuchen 2 Textfelder einzubauen muss mich nur mal mit visible auseinander setzen weil ich die felder nur sehen will wenn das Rezept ein HB rezept ist.

elvodia

Aus dem Ewig langen SQL Strings die ich oben gepostet habe wurde mal eben das:

Private Sub button_behandlung_bearbeiten_save_Click()
    If IsNull(Me.tf_patient) = True Then
            MsgBox ("Patient auswählen.")
        Else
            If IsNull(Me.tf_behandlungsart) = True Then
                MsgBox ("Behandlung auswählen.")
            Else
                If IsNull(Me.tf_RZ_ID) = True Then
                    MsgBox ("Rezept auswählen.")
                Else
                    DoCmd.RunCommand acCmdSaveRecord
                    DoCmd.Close acDefault
                    DoCmd.Requery
                End If
            End If
        End If
End Sub


Ich habe einfach das Eingabeform um 2 Felder erweitert. Nun habe ich auch nciht mehr das problen das ich herrausfinden muss ob ich neu oder bearbeiten mache. Ja Lerning by doing ist doch immer noch das beste.