Page 1 of 1
Versão atual TDOLPHIN - Campo Null
Posted: Wed Oct 19, 2016 2:48 pm
by MGA
Amigos,
Com a versão ANTIGA da TDOLPHIN _ NULL funcionavam perfeitamente.
Com a versão NOVA da TDOLPHIN _ NULL estão me gerando problemas.
Ex:
TABELA Clientes - Campo: CODIGO
NULL
oQry := oServer:Query( "SELECT CODIGO FROM clientes" )
OQry:codigo -> Valtype -> "C"
deveria ser NÚMERICO.
Como resolver este problema?
Re: Versão atual TDOLPHIN - Campo Null
Posted: Wed Oct 19, 2016 5:12 pm
by carlos vargas
please, replace in tdolqry.prg, recompile and test.
Code: Select all
METHOD GetRow( nRow ) CLASS TDolphinQry
LOCAL cType, uValue, cField
LOCAL cCol
LOCAL nIdx
LOCAL aRow
LOCAL hRow, uItem, aStructure, nPad
DEFAULT nRow TO ::nRecNo
IF ::hResult <> NIL
DO CASE
CASE ::nRecCount < 1
::lBof := .t.
::lEof := .t.
::nRecNo := 1
CASE nRow > 0 .and. nRow <= ::nRecCount
::lBof := .f.
::lEof := .f.
::nRecNo := Max( nRow, 1 )
CASE nRow > ::nRecCount
::lBof := .f.
::lEof := .t.
::nRecNo := ::nRecCount
CASE nRow < 1
::lBof := .t.
::lEof := .f.
::nRecNo := 1
ENDCASE
nRow := ::nRecNo
MySqlDataSeek( ::hResult, nRow - 1 )
aRow := MySqlFetchRow( ::hResult )
::aRowOriginal := aRow
#ifndef USE_HASH
::aRow := Array( Len( aRow ) )
::aOldRow := Array( Len( aRow ) )
#endif /*USE_HASH*/
//fill ::aRow Info
IF !HB_IsNil( aRow ) .AND. ::nRecCount > 0
// Convert answer from text field to correct clipper types
FOR EACH cField IN aRow
#ifdef __XHARBOUR__
nIdx := HB_EnumIndex()
#else
nIdx := cField:__EnumIndex()
#endif
uValue := ::VerifyValue( nIdx, cField )
::SetData( nIdx, uValue )
NEXT
ELSE
IF useClipperDefaultValue()
aStructure := ::aStructure
FOR EACH uItem IN aStructure
#ifdef __XHARBOUR__
nIdx := HB_EnumIndex()
#else
nIdx := uItem:__EnumIndex()
#endif
cType := uItem[ MYSQL_FS_CLIP_TYPE ]
SWITCH cType
CASE "M"
// we can not use PadR in memo field
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := uItem[ MYSQL_FS_DEF ]
ELSE
uValue := ""
ENDIF
EXIT
CASE "C"
IF D_SetPadRight()
nPad := Min( IIf( uItem[ MYSQL_FS_MAXLEN ] > uItem[ MYSQL_FS_LENGTH ],;
uItem[ MYSQL_FS_MAXLEN ], uItem[ MYSQL_FS_LENGTH] ), MAX_BLOCKSIZE )
ELSE
nPad := 0
ENDIF
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := PadR( uItem[ MYSQL_FS_DEF ], Max( Len( uItem[ MYSQL_FS_DEF ] ), nPad ) )
ELSE
uValue := Space( nPad )
ENDIF
EXIT
CASE "N"
CASE "I"
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := Val( uItem[ MYSQL_FS_DEF ] )
ELSE
uValue := 0
ENDIF
EXIT
CASE "L"
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := ( uItem[ MYSQL_FS_DEF ] == "1" )
ELSE
uValue := .f.
ENDIF
EXIT
CASE "D"
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := SqlDate2Clip( uItem[ MYSQL_FS_DEF ] )
ELSE
uValue := CToD("")
ENDIF
EXIT
#ifdef __XHARBOUR__
DEFAULT
#else
OTHERWISE
#endif
uValue := NIL
END
::SetData( nIdx, uValue )
NEXT
ENDIF
ENDIF
#ifndef NOINTERNAL
ELSE
::oServer:nInternalError := ERR_FAILEDGETROW
::nRecNo := 0
::CheckError()
#endif
ENDIF
RETURN ::nRecNo
Re: Versão atual TDOLPHIN - Campo Null
Posted: Wed Oct 19, 2016 6:21 pm
by MGA
Carlos,
muito obrigado por responder.
Meu amigo, eu tentei localizar a diferença entre os dois códigos(CARLOS e bitbucket.org). Eu não achei diferença, veja:
https://bitbucket.org/danielgarciagil/t ... /downloads
please, replace in tdolqry.prg, recompile and test.
METHOD GetRow( nRow ) CLASS TDolphinQry
LOCAL cType, uValue, cField
LOCAL cCol
LOCAL nIdx
LOCAL aRow
LOCAL hRow, uItem, aStructure, nPad
DEFAULT nRow TO ::nRecNo
IF ::hResult <> NIL
DO CASE
CASE ::nRecCount < 1
::lBof := .t.
::lEof := .t.
::nRecNo := 1
CASE nRow > 0 .and. nRow <= ::nRecCount
::lBof := .f.
::lEof := .f.
::nRecNo := Max( nRow, 1 )
CASE nRow > ::nRecCount
::lBof := .f.
::lEof := .t.
::nRecNo := ::nRecCount
CASE nRow < 1
::lBof := .t.
::lEof := .f.
::nRecNo := 1
ENDCASE
nRow := ::nRecNo
MySqlDataSeek( ::hResult, nRow - 1 )
aRow := MySqlFetchRow( ::hResult )
::aRowOriginal := aRow
#ifndef USE_HASH
::aRow := Array( Len( aRow ) )
::aOldRow := Array( Len( aRow ) )
#endif /*USE_HASH*/
//fill ::aRow Info
IF !HB_IsNil( aRow ) .AND. ::nRecCount > 0
// Convert answer from text field to correct clipper types
FOR EACH cField IN aRow
#ifdef __XHARBOUR__
nIdx := HB_EnumIndex()
#else
nIdx := cField:__EnumIndex()
#endif
uValue := ::VerifyValue( nIdx, cField )
::SetData( nIdx, uValue )
NEXT
ELSE
IF useClipperDefaultValue()
aStructure := ::aStructure
FOR EACH uItem IN aStructure
#ifdef __XHARBOUR__
nIdx := HB_EnumIndex()
#else
nIdx := uItem:__EnumIndex()
#endif
cType := uItem[ MYSQL_FS_CLIP_TYPE ]
SWITCH cType
CASE "M"
// we can not use PadR in memo field
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := uItem[ MYSQL_FS_DEF ]
ELSE
uValue := ""
ENDIF
EXIT
CASE "C"
IF D_SetPadRight()
nPad := Min( IIf( uItem[ MYSQL_FS_MAXLEN ] > uItem[ MYSQL_FS_LENGTH ],;
uItem[ MYSQL_FS_MAXLEN ], uItem[ MYSQL_FS_LENGTH] ), MAX_BLOCKSIZE )
ELSE
nPad := 0
ENDIF
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := PadR( uItem[ MYSQL_FS_DEF ], Max( Len( uItem[ MYSQL_FS_DEF ] ), nPad ) )
ELSE
uValue := Space( nPad )
ENDIF
EXIT
CASE "N"
CASE "I"
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := Val( uItem[ MYSQL_FS_DEF ] )
ELSE
uValue := 0
ENDIF
EXIT
CASE "L"
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := ( uItem[ MYSQL_FS_DEF ] == "1" )
ELSE
uValue := .f.
ENDIF
EXIT
CASE "D"
IF !HB_IsNil( uItem[ MYSQL_FS_DEF ] )
uValue := SqlDate2Clip( uItem[ MYSQL_FS_DEF ] )
ELSE
uValue := CToD("")
ENDIF
EXIT
#ifdef __XHARBOUR__
DEFAULT
#else
OTHERWISE
#endif
uValue := NIL
END
::SetData( nIdx, uValue )
NEXT
ENDIF
ENDIF
#ifndef NOINTERNAL
ELSE
::oServer:nInternalError := ERR_FAILEDGETROW
::nRecNo := 0
::CheckError()
#endif
ENDIF
RETURN ::nRecNo
Re: Versão atual TDOLPHIN - Campo Null
Posted: Thu Oct 20, 2016 9:05 am
by Frafive
Hola
Me pasa igual con la última versión de dolphin, tambien falla con mysql embebido que cuando se produce un error de mysql, la aplicación se cierra, no captura el error.
Esperemos que el maestro Daniel corriga los errores.
Un saludo
Re: Versão atual TDOLPHIN - Campo Null
Posted: Tue Oct 25, 2016 10:33 am
by MGA
Carlos!
Re: Versão atual TDOLPHIN - Campo Null
Posted: Fri Dec 16, 2016 9:20 pm
by nnicanor
Prueba reemplazando el metodo VerifyValue en tdolqry.prg:
Code: Select all
//-------------------------------------------------//
METHOD VerifyValue( nIdx, cField ) CLASS TDolphinQry
LOCAL cType, uValue
LOCAL nPad
cType := ::aStructure[ nIdx ][ MYSQL_FS_CLIP_TYPE ] //, ::aStructure[ nIdx ][ MYSQL_FS_TYPE ]
SWITCH cType
CASE "L"
IF cField == NIL .OR. Empty(cField)
uValue := If( IS_NOT_NULL( ::aStructure[ nIdx ][ MYSQL_FS_DEF ] ), ::aStructure[ nIdx ][ MYSQL_FS_DEF ],.F.)
ELSE
uValue := If( ValType( cField ) == "L", cField, !( Val( cField ) == 0 ) )
ENDIF
EXIT
CASE "N"
IF cField == NIL .OR. Empty(cField)
uValue := If( IS_NOT_NULL( ::aStructure[ nIdx ][ MYSQL_FS_DEF ] ),::aStructure[ nIdx ][ MYSQL_FS_DEF ], 0 )
ELSE
uValue := If( ValType( cField ) == "N", cField, Val( cField ) )
ENDIF
EXIT
CASE "D"
IF Empty( cField ) .OR. Empty(cField)
uValue := If( IS_NOT_NULL( ::aStructure[ nIdx ][ MYSQL_FS_DEF ] ), ::aStructure[ nIdx ][ MYSQL_FS_DEF ] ,CToD( "" ) )
ELSE
uValue := If( ValType( cField ) == "D", cField, SqlDate2Clip( cField ) )
ENDIF
EXIT
CASE "M"
// we can not use PadR in memo field
IF ( cField == NIL .OR. Empty(cField) )
uValue := ""
ELSE
uValue := cField
ENDIF
EXIT
CASE "T"
CASE "C"
IF D_SetPadRight()
nPad := Min( If( ::aStructure[ nIdx ][ MYSQL_FS_MAXLEN ] > ::aStructure[ nIdx ][ MYSQL_FS_LENGTH ],;
::aStructure[ nIdx ][ MYSQL_FS_MAXLEN ], ::aStructure[ nIdx ][ MYSQL_FS_LENGTH] ), MAX_BLOCKSIZE )
ELSE
nPad := 0
ENDIF
IF ( cField == NIL .OR. Empty(cField) )
uValue := PadR(If( IS_NOT_NULL( ::aStructure[ nIdx ][ MYSQL_FS_DEF ] ), ::aStructure[ nIdx ][ MYSQL_FS_DEF ], "" ),nPad)
ELSE
uValue := PadR( cField, Max( Len( cField ), nPad ) )
ENDIF
EXIT
#ifdef __XHARBOUR__
DEFAULT
#else
OTHERWISE
#endif
// uValue = cField
ENDSWITCH
RETURN uValue
Saludos,
Re: Versão atual TDOLPHIN - Campo Null
Posted: Tue Dec 20, 2016 4:02 pm
by MGA
Gracias Nicanor,
vou testar!