Seite 1 von 1

Logische Werte werden in einem DataObject als 0 oder 1 eingetragen

Verfasst: Di, 27. Apr 2021 11:35
von Klaus Schuster
Moin,

ein mit

Code: Alles auswählen

USqlStatement():New():Select( {{ 1 }} ):From( {{cAlias, "cAlias"}} ):Build():Query( USQL_RESULT_OBJECTS, @aDaten )
erzeugtes DateObject enthält 0 oder 1 bei logischen Werten. Gibt es einen Trick, damit diese als .T. oder .F. übergeben werden?

Re: Logische Werte werden in einem DataObject als 0 oder 1 eingetragen

Verfasst: Di, 27. Apr 2021 12:43
von Marcus Herz
Hallo Klaus
Mir ist nicht ganz klar, welche Datei du abfrägst. Es gibt SQL DBMS, welche Logisch nur als 0/1 kennen. Ist das hier der Fall?

Re: Logische Werte werden in einem DataObject als 0 oder 1 eingetragen

Verfasst: Di, 27. Apr 2021 12:53
von Klaus Schuster
Sorry Marcus, es handelt sich um eine DBF-Datei.

Re: Logische Werte werden in einem DataObject als 0 oder 1 eingetragen

Verfasst: Di, 27. Apr 2021 13:11
von Marcus Herz
Gabs dazu nicht mal ein PDR. Kann mich grob errinnern, dass es ein Statement von Alaksa dazu gab. Find ich aber nicht auf die Schnelle. 0/1 für logisch ist in SQL Welt durchaus normal.

Re: Logische Werte werden in einem DataObject als 0 oder 1 eingetragen

Verfasst: Di, 27. Apr 2021 15:24
von brandelh
Marcus Herz hat geschrieben: Di, 27. Apr 2021 13:11 Gabs dazu nicht mal ein PDR. Kann mich grob errinnern, dass es ein Statement von Alaksa dazu gab. Find ich aber nicht auf die Schnelle. 0/1 für logisch ist in SQL Welt durchaus normal.
nicht nur dort, in vielen Sprachen gibt es kein Datentyp Logisch, sondern nur LONG = 0 (falsch) oder <> 0 (wahr), was manches einfacher macht bei Fremd DLLs die das meist auch so sehen.

Als Workaround ein aEval() durchlaufen lassen und iif(n <> 0 , .t., .f.) setzen lassen

Re: Logische Werte werden in einem DataObject als 0 oder 1 eingetragen

Verfasst: Sa, 01. Mai 2021 8:11
von Klaus Schuster
Danke Hubert,

ganz so einfach ist es leider nicht, da ja nicht alle Felder boolean sind. Ich habe mir so beholfen:

Code: Alles auswählen

   // Datensaetze einlesen
   USqlStatement():New():Select( {{ 1 }} ):From( {{cAlias, "cAlias"}} ):Build():Query( USQL_RESULT_OBJECTS, @aDaten )

   // Namen aller Felder des Typs 'L' ermitteln
   AEval( aDbStruct, {| aX, nFeld | IIf( aX[ DBS_TYPE ] == 'L', AAdd( aBoolean, aX[ DBS_NAME ]), NIL )})

   // Mangel ausgleichen, dass fuer Boolean-Werte 0 und 1 zurueckgegeben werden

   IF ! Empty( aBoolean )
      aDaten := DaoBoolean( aBoolean, aDaten )

   ENDIF

Code: Alles auswählen

FUNCTION DaoBoolean( aBoolean, aDaten )

   LOCAL nElement := 0

   // In allen iVars/Feldern aus aBoolean eine 1 auf TRUE und eine 0 auf FALSE umsetzen

   FOR nElement := 1 TO Len( aDaten )
      AEval( aBoolean, {| cFeld | aDaten[ nElement ]:&(cFeld) := IIf( aDaten[ nElement ]:&(cFeld) == 1, TRUE, FALSE )})

   NEXT

RETURN( aDaten )

Re: Logische Werte werden in einem DataObject als 0 oder 1 eingetragen

Verfasst: So, 02. Mai 2021 12:29
von brandelh
du musst natürlich wissen welche Feldnamen logisch und welche numerisch sein sollen