none
True, -1, 1 mit SQL-Server

    Frage

  • Hi

    Ich muss eine Access 97 Applikation auf NT4-WS mit MSSQL 7 auf NT4-Server, in Access 2003 (SP3) Windows 7 mit MSSQL2008R2 portieren.

    Nun habe ich ein komisches Problem:
    Habe eine verknüpfte Tabelle mit einem Datenfeld „Aktiv“ as Boolean.
    Liste ich diese in A2003 in einer Abfrage auf, so sehe ich für True die -1.
    Setze ich das Kriterium in dieser Abfrage für Aktiv auf -1, kommen keine Datensätze, setze ich eine 1, so sehe ich Datensätze sogar mit einem -1.
    Wie bringe ich Access 2003 bei, dass -1 im Kriterium für den MSSQL2008R2 eine 1 ist? So wie ich das von meinen anderen Applikationen kenne?

    Gruss und Dank

    Donnerstag, 11. November 2010 14:00

Antworten

  • Hallo,

    P.Belloni wrote:

    Ich muss eine Access 97 Applikation auf NT4-WS mit MSSQL 7 auf NT4-Server, in Access 2003 (SP3) Windows 7 mit MSSQL2008R2 portieren.

    Nun habe ich ein komisches Problem:
    Habe eine verknüpfte Tabelle mit einem Datenfeld „Aktiv“ as Boolean.
    Liste ich diese in A2003 in einer Abfrage auf, so sehe ich für True die -1.
    Setze ich das Kriterium in dieser Abfrage für Aktiv auf -1, kommen keine Datensätze, setze ich eine 1, so sehe ich Datensätze sogar mit einem -1.
    Wie bringe ich Access 2003 bei, dass -1 im Kriterium für den MSSQL2008R2 eine 1 ist? So wie ich das von meinen anderen Applikationen kenne?

    Auf SQL Server ist True = 1. Am besten pruefst du auf 0 bzw. <>0, dann
    kriegst du in beiden Faellen (A97 und SQL Server) das richtige Ergebnis:

    WHERE Aktiv = 0 'False
    WHERE Aktiv <> 0 'True

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Donnerstag, 11. November 2010 16:04
    Moderator
  • Hallo!

    P.Belloni schrieb:

    Es geht immer noch nicht: Me.cboStation.RowSource = "SELECT DISTINCT T_DP.Station FROM T_DP WHERE (((T_DP.Ausgang)=No) And ((T_DP.Funktion_Zeit)<17) AND ((T_DP.System)=IIf([Forms]![F_Main]![fraSelectArt]=2,True,False))) ORDER BY T_DP.Station"

    In diesem Fall wird das Problem vermutlich durch IIf erzeugt.

    SELECT DISTINCT T_DP.Station FROM T_DP
    WHERE
       T_DP.Ausgang=No
       And
       T_DP.Funktion_Zeit<17
       AND
       T_DP.System = True
    ORDER BY T_DP.Station

    Das würde funktionieren, oder?

    Ich vermute, dass in der Variante mit iif ein -1 per ODBC
    weitergereicht wird. Du könntest das mit dem Profiler bzw. per
    ODBC-Trace verfolgen.

    Als Lösung sollte die Variante von Peter ausreichen. Die Frage ist nur, wie man dann den Vergleich in SQL formuliert.

    Eine MSSQL-spezifische Variante wäre der Einsatz von Abs().

    WHERE
       ..
       AND
       T_DP.System = abs([Forms]![F_Main]![fraSelectArt] = 2)

    Oder du schreibst es so:

    WHERE
       ..
       AND
       (
         T_DP.System = True AND [Forms]![F_Main]![fraSelectArt] = 2
        OR
         T_DP.System = False AND [Forms]![F_Main]![fraSelectArt] <> 2
       )

    BTW:
    Falls cboStation im Formular F_Main ist, würde ich nur [fraSelectArt]
    nutzen und auf den direkten Form-Bezug verzichten, damit keine
    Abhängigkeit zum Formularnamen entsteht.

    Die sicherste Variante wäre auf den Form-Bezug in der SQL-Anweisung zu
    verzichten und eine Parameterabfrage oder dynamisch zusammengesetzte
    SQL-Anweisung zu verwenden (statt Rowsource das Recordset einstellen).

    mfg
    Josef

    Freitag, 12. November 2010 11:22
  • Eine Variante würde noch funktionieren:

    Im Formular eine berechnete Checkbox unterbringen.
    Steuerelementinhalt: =[fraSelectArt]=2

    Die SQL-Anweisung sollte für diese Variante so aussehen:

    Parameters [Forms]![F_Main]![DeineCheckBox] bit;
    WHERE
       ..
       AND
       T_DP.System = [Forms]![F_Main]![DeineCheckBox]

    oder

    Parameters DeineCheckBox bit;
    WHERE
       ..
       AND
       T_DP.System = [DeineCheckBox]

    Die Parameter-Deklaration ist notwendig, damit Jet/ACE den Datentyp
    Bit erkennt.

    mfg
    Josef

    Freitag, 12. November 2010 11:31

Alle Antworten

  • Hallo,

    P.Belloni wrote:

    Ich muss eine Access 97 Applikation auf NT4-WS mit MSSQL 7 auf NT4-Server, in Access 2003 (SP3) Windows 7 mit MSSQL2008R2 portieren.

    Nun habe ich ein komisches Problem:
    Habe eine verknüpfte Tabelle mit einem Datenfeld „Aktiv“ as Boolean.
    Liste ich diese in A2003 in einer Abfrage auf, so sehe ich für True die -1.
    Setze ich das Kriterium in dieser Abfrage für Aktiv auf -1, kommen keine Datensätze, setze ich eine 1, so sehe ich Datensätze sogar mit einem -1.
    Wie bringe ich Access 2003 bei, dass -1 im Kriterium für den MSSQL2008R2 eine 1 ist? So wie ich das von meinen anderen Applikationen kenne?

    Auf SQL Server ist True = 1. Am besten pruefst du auf 0 bzw. <>0, dann
    kriegst du in beiden Faellen (A97 und SQL Server) das richtige Ergebnis:

    WHERE Aktiv = 0 'False
    WHERE Aktiv <> 0 'True

    Gruss - Peter


    Mitglied im http://www.dbdev.org
    FAQ: http://www.donkarl.com

    Donnerstag, 11. November 2010 16:04
    Moderator
  • Hallo!

    P.Belloni schrieb:

    Wie bringe ich Access 2003 bei, dass -1 im Kriterium für den MSSQL2008R2 eine 1 ist? So wie ich das von meinen anderen Applikationen kenne?

    Wenn du True und nicht die Zahl -1 in den Abfragen verwendest, kann
    das von ODBC korrekt als bit an den Server weitergegeben werden.

    BTW: achte bei bit-Feldern in MSSQL-Tabellen, dass dort auch NULL
    zugelassen sein könnte. => Ich setze bei bit-Feldern immer 0 als
    Standardwert und verbiete NULL-Werte.

    mfg
    Josef

    • Als Antwort markiert P.Belloni Freitag, 12. November 2010 08:16
    • Tag als Antwort aufgehoben P.Belloni Freitag, 12. November 2010 10:41
    Donnerstag, 11. November 2010 18:40
  • Danke für eure Bemühungen.

    Die weitere Analyse des Codes zeigt, dass auch noch Yes und No, True, False, -1 und 0 eingesetzt wurde.

    Ich muss nun den ganzen Code analysieren. Benutze dafür Speed Ferret. Oder kennt ihr was ähnliches?

    "Ich setze bei bit-Feldern immer 0 als
    Standardwert und verbiete NULL-Werte"

    Nun, es gibt aber noch den Zustand unbekannt, Ja oder Nein ist bekannt. Aber ich weiss was du meinst.

    Gruss Philippe

    Freitag, 12. November 2010 08:15
  • Es geht immer noch nicht:

    Me.cboStation.RowSource = "SELECT DISTINCT T_DP.Station FROM T_DP WHERE (((T_DP.Ausgang)=No) And ((T_DP.Funktion_Zeit)<17) AND ((T_DP.System)=IIf([Forms]![F_Main]![fraSelectArt]=2,True,False))) ORDER BY T_DP.Station"

    Vorher war bei True False, Yes No.
    Es funktioniert nur mit der 1 für True.

    Gruss und Dank

    Freitag, 12. November 2010 10:43
  • Hallo!

    P.Belloni schrieb:

    Es geht immer noch nicht: Me.cboStation.RowSource = "SELECT DISTINCT T_DP.Station FROM T_DP WHERE (((T_DP.Ausgang)=No) And ((T_DP.Funktion_Zeit)<17) AND ((T_DP.System)=IIf([Forms]![F_Main]![fraSelectArt]=2,True,False))) ORDER BY T_DP.Station"

    In diesem Fall wird das Problem vermutlich durch IIf erzeugt.

    SELECT DISTINCT T_DP.Station FROM T_DP
    WHERE
       T_DP.Ausgang=No
       And
       T_DP.Funktion_Zeit<17
       AND
       T_DP.System = True
    ORDER BY T_DP.Station

    Das würde funktionieren, oder?

    Ich vermute, dass in der Variante mit iif ein -1 per ODBC
    weitergereicht wird. Du könntest das mit dem Profiler bzw. per
    ODBC-Trace verfolgen.

    Als Lösung sollte die Variante von Peter ausreichen. Die Frage ist nur, wie man dann den Vergleich in SQL formuliert.

    Eine MSSQL-spezifische Variante wäre der Einsatz von Abs().

    WHERE
       ..
       AND
       T_DP.System = abs([Forms]![F_Main]![fraSelectArt] = 2)

    Oder du schreibst es so:

    WHERE
       ..
       AND
       (
         T_DP.System = True AND [Forms]![F_Main]![fraSelectArt] = 2
        OR
         T_DP.System = False AND [Forms]![F_Main]![fraSelectArt] <> 2
       )

    BTW:
    Falls cboStation im Formular F_Main ist, würde ich nur [fraSelectArt]
    nutzen und auf den direkten Form-Bezug verzichten, damit keine
    Abhängigkeit zum Formularnamen entsteht.

    Die sicherste Variante wäre auf den Form-Bezug in der SQL-Anweisung zu
    verzichten und eine Parameterabfrage oder dynamisch zusammengesetzte
    SQL-Anweisung zu verwenden (statt Rowsource das Recordset einstellen).

    mfg
    Josef

    Freitag, 12. November 2010 11:22
  • Eine Variante würde noch funktionieren:

    Im Formular eine berechnete Checkbox unterbringen.
    Steuerelementinhalt: =[fraSelectArt]=2

    Die SQL-Anweisung sollte für diese Variante so aussehen:

    Parameters [Forms]![F_Main]![DeineCheckBox] bit;
    WHERE
       ..
       AND
       T_DP.System = [Forms]![F_Main]![DeineCheckBox]

    oder

    Parameters DeineCheckBox bit;
    WHERE
       ..
       AND
       T_DP.System = [DeineCheckBox]

    Die Parameter-Deklaration ist notwendig, damit Jet/ACE den Datentyp
    Bit erkennt.

    mfg
    Josef

    Freitag, 12. November 2010 11:31
  • Der MSSQL-Profiler zeigt für

    "SELECT DISTINCT T_DP.Station FROM T_DP WHERE (((T_DP.Ausgang)=No) And ((T_DP.Funktion_Zeit)<17) AND ((T_DP.System)=IIf([Forms]![F_Main]![fraSelectArt]=2,True,False))) ORDER BY T_DP.Station"

    diesen String:

    exec sp_executesql N'SELECT DISTINCT "Remotestation"  FROM "dbo"."F01_DP" WHERE (((("Station" =  @P1 ) AND ("Ausgang" = 0 ) ) AND ("Funktion_Zeit" < 17 ) ) AND ("System" =  @P2 ) ) ORDER BY "dbo"."F01_DP"."Remotestation"  ',N'@P1 varchar(510),@P2 smallint',NULL,-1

    Tatsächlich wandelt der ODBC das True im IIF nicht. Setze ich System=True, so wandelt dieser den True in 1 um.

    Das funktioniert: T_DP.System = abs([Forms]![F_Main]![fraSelectArt] = 2)

    Nochmals Danke für eure Bemühungen, ihr habt mir aus der Patsche geholfen :-)

    Freitag, 12. November 2010 15:18
  • Hallo P.
     
    In der OH von Access/VBA ist der Boolean Datentyp definiert als:
      0 = False
    <>0 = True
     
    Deine Abfragen sollten also immer auf = 0 oder <> 0 erfolgen, dann funktioniert es auch mit -1 von VBA/Access und 1 vom SQL Server.
     
    Gruss
    Henry
     

    Hi

    Ich muss eine Access 97 Applikation auf NT4-WS mit MSSQL 7 auf NT4-Server, in Access 2003 (SP3) Windows 7 mit MSSQL2008R2 portieren.

    Nun habe ich ein komisches Problem:
    Habe eine verknüpfte Tabelle mit einem Datenfeld �??Aktiv�?? as Boolean.
    Liste ich diese in A2003 in einer Abfrage auf, so sehe ich für True die -1.
    Setze ich das Kriterium in dieser Abfrage für Aktiv auf -1, kommen keine Datensätze, setze ich eine 1, so sehe ich Datensätze sogar mit einem -1.
    Wie bringe ich Access 2003 bei, dass -1 im Kriterium für den MSSQL2008R2 eine 1 ist? So wie ich das von meinen anderen Applikationen kenne?

    Gruss und Dank

    Montag, 15. November 2010 05:09