FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posts: 1335
Joined: Fri Jun 13, 2008 11:04 AM
Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 07:19 AM

Hola,

Tengo una tabla en MySQL con el tipo de datos como BIT. Esto es equivalente a un campo en LOGICAL DBF.
BIT tiendas, ya sea 0 o 1, cuando en DBF que representamos como. F. o. T.

Estoy utilizando ADO

Cuando me recupere los datos de MySQL en una tabla de registros, FiveWin / Puerto de muestra y procesamiento de datos a todos los TBI. T. independientemente de su real 0 y 1 's (.F. y .T.)

He comprobado los datos de la tabla utilizando sapo para MySQL y encontr贸 que el conjunto de registros est谩 mostrando los datos exactamente como es necesario.

Nadie ha encontrado este problema? Cualquier idea de c贸mo esto puede ser manejado de manera que los datos se convierte en bien .T. o .F.
He intentado mostrar el conjunto de registros de datos en un xBrwse tambi茅n, pero todos los datos de la BIT se muestran como .T.

驴Hay algo que tengo que tener cuidado durante la manipulaci贸n de datos BIT utilizando FiveWin y ADO

Recuerdos

Anser

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 02:29 PM
Anserkk:

Aqu铆 tienes un ejemplo que funciona bien:

As铆 es como esta definido el campo en la tabla
Code (fw): Select all Collapse
"PRO_CAN BIT NOT NULL COMMENT 'Canceled ?'," +;


Y este es el c贸digo usado en la columna del browse (TXBrowse)
Code (fw): Select all Collapse
aCol[ 6]聽 聽 := oBrw:AddCol()
aCol[ 6]:AddResource("SI")
aCol[ 6]:AddResource("NO")
aCol[ 6]:cHeader聽 聽 := "Can"
aCol[ 6]:bBmpData聽 聽:= { || IF(oRsPro:BOF() .AND. oRsPro:EOF(),2,IIF(oRsPro:Fields("PRO_CAN"):Value,1,2)) }


Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 03:36 PM

Hola Armando...

me sucede lo mismo que a ansserkk

has creado la tabla desde codigo o desde MySql directamente o usando algun otro programa de mantenimiento?
de ser si tu respuesta, puedes verificar como esta creado el field en la tabla?

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 04:47 PM
Daniel:

Eso es algo que he notado, cuando la tabla se convierte desde una DBF usando alguna herramienta como Dbf2Sql, ADO se pone muy exigente.

Mis tablas las creo desde c贸digo usando comandos SQL.

Aqu铆 una im谩gen del c贸digo de mi post anterior.



Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 05:42 PM
Armando...
prueba este ejemplo y nos comentas que podria estar pasando...

solo adaptalo a tus parametros, igual el servidor y usuario aqui expuesto estan activo para este ejemplo

Gracias

Code (fw): Select all Collapse
/*
* test connection with ADODB
*/

#include "FiveWin.Ch"
#include "XBrowse.Ch"
#include "ado.Ch"


//----------------------------------------------------------------------------//

function main()

聽 聽execConnection()

return( 0 )

FUNCTION execConnection

LOCAL oCon, oRs, oError


oCon := MySQLConnect()

MakeTabla(oCon)

oRs 聽:= MySQLRecordSet( oCon )

IF oRs:recordCount() > 0
聽 聽oRs:moveFirst()
ENDIF

TxBrowseShow( oRs )

oRs:close()

oCon:close()

RETURN( .T. )

/*
* --------------------------------------------------------------------------*
* --------------------------------------------------------------------------*
*/
FUNCTION MySQLConnect

LOCAL oError, oCon, cConnectionString


TRY

聽 聽oCon := TOleAuto():new( "ADODB.Connection" )

CATCH oError

聽 聽msgStop( "No se pudo crear la conexion" )
聽 聽RETURN( .F. )

END

cConnectionString := "Driver={MySQL ODBC 5.1 Driver}" + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽";Server=mcfox.dyndns.org" 聽 聽 聽 + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽";DefaultDatabase=prueba01" 聽 聽 聽 + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽";Database=prueba01" 聽 聽 聽 聽 聽 聽+ ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽";Port=3306" 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽";User=prueba" 聽 聽 聽 聽 聽 聽 聽 聽 聽+ ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽";Password=12345" 聽 聽 聽 聽 聽 聽 聽+ ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽";Option=3;"

oCon:connectionString := cConnectionString

TRY

聽 聽oCon:open()
聽 聽? "Connection ok!"

CATCH oError

聽 聽msgInfo( "No se pudo crear la conexion" )
聽 聽showError( oError )
聽 聽RETURN( .F. )

END

RETURN( oCon )

/*
* --------------------------------------------------------------------------*
* --------------------------------------------------------------------------*
*/
FUNCTION MySQLRecordSet( oCon )

LOCAL oRs, oError, cQuerySql


TRY
聽 聽oRs := TOleAuto():new( "ADODB.RecordSet" )

CATCH oError

聽 聽msgStop( "No hay RS" )
聽 聽showError( oError )
聽 聽oRs := NIL
聽 聽RETURN( .F. )

END

&& -- Realizando uma query no cadastro de empresas
cQuerySql := "SELECT * FROM test"

oRs:cursorLocation := adUseClient // 3
oRs:lockType 聽 聽 聽 := adLockOptimistic // 3
oRs:cursorType 聽 聽 := adOpenDynamic // 2

oRs:source 聽 聽 聽 聽 := cQuerySql

oRs:activeConnection( oCon )

TRY

聽 聽oRs:open()
聽 聽? oRs:source,,, "oRs:recordCount()", oRs:recordCount()

CATCH oError

聽 聽msgStop( "No Query '" + cQuerySql + "'" )
聽 聽showError( oError )
聽 聽RETURN( .F. )

END

RETURN( oRs )

/*
* --------------------------------------------------------------------------*
* --------------------------------------------------------------------------*
*/
PROCEDURE showError( oError )

LOCAL cMensagemRetorno := ""

cMensagemRetorno := "[Subsystem]" 聽 聽 聽 聽 + CRLF + oError:SubSystem 聽 聽 聽 聽 聽 聽 聽 聽 + CRLF + CRLF + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "[SubCode]" 聽 聽 聽 聽 聽 + CRLF + alltrim( str( oError:SubCode ) ) + CRLF + CRLF + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "[Operacion]" 聽 聽 聽 聽 + CRLF + oError:Operation 聽 聽 聽 聽 聽 聽 聽 聽 + CRLF + CRLF + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "[Descripcion]" 聽 聽 聽 + CRLF + oError:Description 聽 聽 聽 聽 聽 聽 聽 + CRLF + CRLF + ;
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 "[Argumentos]" 聽 聽 聽 聽+ CRLF + valToPrg( oError:Args )

RETURN( msgStop( cMensagemRetorno ) )

/*
* --------------------------------------------------------------------------*
* --------------------------------------------------------------------------*
*/
FUNCTION TxBrowseShow( oRs )

聽 聽local oWnd, oBrw, oCol

聽 聽DEFINE WINDOW ownd OF WndMain() TITLE "Test"

聽 聽@ 0,0 XBROWSE oBrw OF oWnd RECSET oRs AUTOCOLS AUTOSORT FOOTERS FASTEDIT ;
聽 聽 聽 聽 聽LINES CELL

聽 聽oBrw:createFromCode()
聽 聽oWnd:oClient := oBrw

聽 聽ACTIVATE WINDOW oWnd ON INIT oBrw:setFocus()

return nil

function MakeTabla( oCon )
local cCmdSql := "CREATE TABLE IF NOT EXISTS TEST ("+;
聽 聽 聽 聽 聽 聽 聽 聽 聽"ROW_ID INTEGER 聽 聽NOT NULL AUTO_INCREMENT COMMENT 'LLAVE',"+;
聽 聽 聽 聽 聽 聽 聽 聽 聽"CODIGO CHAR(5) 聽 聽NOT NULL COMMENT 'CODIGO CLIENTE',"+;
聽 聽 聽 聽 聽 聽 聽 聽 聽"NOMBRE CHAR(30) 聽 NOT NULL COMMENT 'NOMBRE CLIENTE',"+;
聽 聽 聽 聽 聽 聽 聽 聽 聽"ACTIVO BIT 聽 聽 聽 聽NOT NULL COMMENT 'ACTIVO',"+;
聽 聽 聽 聽 聽 聽 聽 聽 聽"PRIMARY KEY(ROW_ID))"+;
聽 聽 聽 聽 聽 聽 聽 聽 聽"ENGINE = InnoDB COMMENT 'Test';"
聽 聽 聽 聽 聽 聽 聽 聽 聽
oCon:Execute( cCmdSql )

cCmdSql := "INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('001','NOMBRE01',0);"
oCon:Execute( cCmdSql )
cCmdSql := "INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('002','NOMBRE02',1);"
oCon:Execute( cCmdSql )
cCmdSql := "INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('003','NOMBRE03',0);"
oCon:Execute( cCmdSql )
cCmdSql := "INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('004','NOMBRE04',1);"
oCon:Execute( cCmdSql )
return nil
Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 07:42 PM
Daniel:

A煤n no hago la prueba perooooooo, por aqu铆 veo algo diferente:

Prueba cambiando los 0 y 1 cuando insertas los registros por '0' y '1' (tipo caracter)

Code (fw): Select all Collapse
cCmdSql := "INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('004','NOMBRE04',<strong>'1'</strong>);"


Me comentas por favor

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 07:54 PM
Aramndo
Gracias por tu respuesta

Posiblemente seria de gran ayuda si lograras probar el test tu mismo siendo tu un gran conocedor del tema

he hecho el cambio sugerido y lementablemnente me he encontrado con esto

Code (text): Select all Collapse
<div class="text" id="{CB}" style="font-family: monospace;">Application
===========
   Path and name: C:\prg\Julio\ADODB.exe (32 bits)
   Size: 1,806,848 bytes
   Time from start: 0 hours 0 mins 5 secs 
   Error occurred at: 03/13/09, 15:19:56
   Error description: Error ADODB.Connection/0  S_OK: EXECUTE
   Args:
     [   1] = C   INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('001','NOMBRE01','0');

Stack Calls
===========
   Called from: source\rtl\win32ole.prg => TOLEAUTO:EXECUTE(0)
   Called from: C:\prg\Julio\ADODB.prg => MAKETABLA(182)
   Called from: C:\prg\Julio\ADODB.prg => EXECCONNECTION(25)
   Called from: C:\prg\Julio\ADODB.prg => MAIN(14)

System
======
   CPU type: Intel(R) Core(TM)2 CPU          6600  @ 2.40GHz 2400 Mhz
   Hardware memory: 2045 megs

   Free System resources: 90 %
        GDI    resources: 90 %
        User   resources: 90 %

   Compiler version: xHarbour build 1.1.0 Intl. (SimpLex) (Rev. 6195)
   Windows version: 6.1, Build 7000 

   Windows total applications running: 0

Variables in use
================
   Procedure     Type   Value
   ==========================
   TOLEAUTO:EXECUTE
     Param   1:    C    "INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('001','NOMBRE01','0');"
     Local   1:    U    
     Local   2:    N    0
   MAKETABLA
     Param   1:    O    Class: TOLEAUTO
     Local   1:    C    "INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('001','NOMBRE01','0');"
   EXECCONNECTION
     Local   1:    O    Class: TOLEAUTO
     Local   2:    U    
     Local   3:    U    
   MAIN聽</div>
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 08:02 PM
Realmente no se que podria estar mal,

cCmdSql := "INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('001','NOMBRE01',0);"

Colcandolo de esta forma no me genera ningun error y en la tabla se guarda correctamente, el problema esta en la lectura del campo que siempre retorna .T.

mira la imagen

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 08:14 PM
Daniel:

He realizado la prueba de la que te incluyo una im谩gen:



Y como se ve la estamos obteniendo igual, incluso he modificado tu ejemplo
para leer una de mis tablas y tambien me muestra .T. o .F.

Ahora me pregunto, que esperamos que nos muestre ? o por qu茅 suponemos
que esta mal ?

Me corrijo, veo que en tu im谩gen muestra puras .T., pero en mi im谩gen si las
muestra bien. Y el c贸digo es el mismo que t煤 me enviaste.

Saludos
SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 08:20 PM

Armando...

Espero ahora poder captado tu atencion :wink:

entiendes la situacion... que puede faltar??

que driver del conector de mysql usas?

Posts: 3358
Joined: Fri Oct 07, 2005 08:20 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 08:30 PM

Daniel:

Llevas raz贸n, quier铆a yo levantar el trofeo antes de llegar a la meta :oops:

Utilizo el "Driver={MySQL ODBC 3.51 Driver}"

Estoy probando con el c贸digo que me enviaste conectandome a tu servidor
lo 煤nico que he cambiado ha sido el driver. Todo hace suponer que ahi esta
el problema, te sugiero hacer una prueba con el 3.51.

Saludos

SOI, s.a. de c.v.
estbucarm@gmail.com
http://www.soisa.mex.tl/
http://sqlcmd.blogspot.com/
Tel. (722) 174 44 45
Carpe diem quam minimum credula postero
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 08:32 PM
Amigos,

La regla de grabado de informaci贸n para SQL indica:

Todos las columnas tipo caracter se colocaran entre comillas o ap贸strofos y las de tipo n煤merico sin comillas o ap贸strofos.

En SQL no existen campos l贸gicos, tal cual los conocemos.

Tambi茅n debemos de acostumbrarnos a crear nuestras tablas con los nombres en min煤sculas y usarlos en nuestros c贸digos en min煤sculas de igual forma. Esto es para no entrar en conflictos con versiones nuevas y actuales de los servidores que usemos.

Por otro lado en el caso de ADO, el conector mysql que debemos de usar es el 3.5, pues es el m谩s estable, y muy checado por varios colegas.

Mi humilde opini贸n.

saludos

William Morales

Armando wrote:Daniel:

A煤n no hago la prueba perooooooo, por aqu铆 veo algo diferente:

Prueba cambiando los 0 y 1 cuando insertas los registros por '0' y '1' (tipo caracter)

Code (fw): Select all Collapse
cCmdSql := "INSERT INTO TEST (CODIGO,NOMBRE,ACTIVO) VALUES('004','NOMBRE04',<strong>'1'</strong>);"


Me comentas por favor

Saludos
William, Morales

Saludos



m茅xico.sureste
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Fri Mar 13, 2009 08:46 PM

Listo... comprobado es el conector...

se ha eliminado el problema

Gracias Armando y William por su tiempo

Posts: 1335
Joined: Fri Jun 13, 2008 11:04 AM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Sat Mar 14, 2009 04:40 AM
Hola,

Ante todo, perm铆tanme agradecer a Daniel, Armando y William.

Estoy enfrentando el mismo problema que se explica Daniel.

Cuando insertar datos en la Tabla I han utilizado valor num茅rico, ya sea 0 贸 1 para almacenar datos en un campo de tipo BIT
es decir,
Code (fw): Select all Collapse
cCmdSql: = "INSERT INTO TEST (CODIGO, NOMBRE, ACTIVO) VALUES ('001 ',' NOMBRE01 ', <strong>0</strong>);"


Estoy utilizando el controlador ODBC 5.1 (Daniel tambi茅n est谩 utilizando la misma)

Despu茅s de los datos se inserta y cuando compruebe la tabla de datos para MySQL sapo usando los datos es perfecto y es comprobar que muestra dentro y fuera de tipo de datos BIT.

Pero cuando leo / recuperar los mismos datos en el uso de registros ADO de FiveWin, la BIT de datos es siempre. T. independientemente del valor real 0 y 1's

Ahora, despu茅s de leer todo este post Yo entiendo que el problema anteriormente descrito se produce debido a un error en la 煤ltima versi贸n del controlador ODBC 5.1

Mudarse a ver ODBC 3.5 deber铆a resolver el problema. Es realmente triste para pasar de una versi贸n m谩s reciente de una versi贸n anterior, pero no hay otra manera.

驴Se trata de un problema de compatibilidad con Harbour / xHarbour y ODBC versi贸n 5.1.

驴Alguien trat贸 de repetir el mismo problema en cualquier otro lenguaje de programaci贸n para eg.VB / Delphi y MySQL ODBC y ver 5.1?

Una vez m谩s doy las gracias a Daniel, Armando y William.

Gracias

Anser
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Manejar datos MySql BIT (l贸gical) en FiveWin / xHarbour
Posted: Sat Mar 14, 2009 08:05 AM

anserkk,

El problema no es FWH o [x]Harbour, el problema es espec铆ficamente el ODBC (o sea el conector) de mysql. El problema no se a ciencia cierta si es por la versi贸n del servidor MYSQL instalado, pero definitivamente es un problema generado por el conector.

El pasarte a una versi贸n anterior no debe de generar problemas de conexi贸n o de manejo de datos, inclusive puedes usar los "Procedimientos Almacenados" sin problema alguno.

William, Morales

Saludos



m茅xico.sureste