11 Out 2018 11:08
11 Out 2018 13:08
Amparo escreveu:gostaria de saber se existe alguma função que teste uma expressão de comando para evitar erro no sistema
Amparo escreveu: existe como testar esta sintaxe ou então uma rotina que apresente o erro mas não saia do sistema e volte para a function ou procedure que a chamou?
PRIVATE cExpr // ===> Type() Só funciona com variáveis PUBLIC ou PRIVATE
LOCAL cType, GetList := {}
CLS
WHILE .T.
BEGIN SEQUENCE
cExpr := Space(255)
@10,10 SAY "Digite a expressão:" GET cExpr PICT "@S40"
READ
IF LastKey() == K_ESC
EXIT
ENDIF
cType := Type( cExpr )
IF At( "U", cType ) > 0
BREAK
ELSE
Exit
ENDIF
RECOVER
Alert( "Erro na expressão")
LOOP
END SEQUENCE
ENDDO
11 Out 2018 13:52
@ 0, 0 GET cComando VALID MacroType( cComando ) == "L"
FUNCTION MacroType( cExpression )
LOCAL cType := "U", bBlock
BEGIN SEQUENCE WITH __BreakBlock()
bBlock := hb_MacroBlock( cExpression )
cType := ValType( Eval( bBlock ) )
END SEQUENCE
RETURN cType
IF ! Empty( mAtivo )
// Ativo = Ativo + Proposta
mFiltro += iif( mAtivo == "A", " AND ( ESTADO NOT IN ( 'I', 'V', 'E' ) )", " AND ESTADO = " + StringSql( mAtivo ) )
ENDIF
mFiltro += iif( Empty( mEndereco ), "", " AND " + MySqlEnderecoLike( mEndereco ) )
mFiltro += iif( Empty( mClassi ), "", " AND CLASSI = " + StringSql( mClassi ) )
IF mMaisFiltros1 == "S"
mFiltro += iif( mPrecoMin == 0, "", " AND VALOR >= " + LTrim( Str( mPrecoMin ) ) )
mFiltro += iif( mPrecoMax == 0, "", " AND VALOR <= " + LTrim( Str( mPrecoMax ) ) )
mFiltro += iif( Empty( mBairro ), "", " AND BAIRRO LIKE " + StringSql( "%" + Trim( mBairro ) + "%" ) )
mFiltro += iif( Empty( mRegiao ), "", " AND REGIAO LIKE " + StringSql( "%" + Trim( mRegiao ) + "%" ) )
mFiltro += iif( Empty( mCidade ), "", " AND CIDADE LIKE " + StringSql( "%" + Trim( mCidade ) + "%" ) )
IF ! Empty( mSetor )
mFiltro += " AND ( "
nTamanhoFiltro := Len( mFiltro )
cnMySql:cSql := "SELECT * FROM HLBAIRRO WHERE BASETOR = " + StringSql( mSetor )
cTmpFile := cnMySql:SqlToDbf()
SELECT 0
USE ( cTmpFile ) ALIAS temp
DO WHILE ! Eof()
mFiltro += " BABAIRRO=" + StringSql( temp->baBairro ) + " OR "
SKIP
ENDDO
CLOSE DATABASES
FErase( cTmpFile )
IF nTamanhoFiltro == Len( mFiltro ) // pra completar o .OR.
mFiltro += "CODI = CODI"
ELSE
mFiltro += "CODI <> CODI"
ENDIF
mFiltro += " )"
ENDIF
ENDIF
IF mMaisFiltros2 == "S"
mFiltro += iif( Empty( mDormitorioMin ), "", " AND DORMITORIO >= " + LTrim( Str( mDormitorioMin ) ) )
mFiltro += iif( Empty( mDormitorioMax ), "", " AND DORMITORIO <= " + LTrim( Str( mDormitorioMax ) ) )
mFiltro += iif( Empty( mVagasMin ), "", " AND GARAGEM >= " + LTrim( Str( mVagasMin ) ) )
mFiltro += iif( Empty( mVagasMax ), "", " AND GARAGEM <= " + LTrim( Str( mVagasMax ) ) )
mFiltro += iif( Empty( mDataMin ), "", " AND DATAINC >= " + DateSql( mDataMin ) )
mFiltro += iif( Empty( mDataMax ), "", " AND DATAINC <= " + DateSql( mDataMax ) )
ENDIF
IF mMaisFiltros3 == "S"
mFiltro += iif( Empty( mFinanciado ), "", " AND FINANCIADO = " + StringSql( mFinanciado ) )
mFiltro += iif( Empty( mCodC ), "", " AND ( CODC=" + NumberSql( mCodc ) + " OR CODC2=" + NumberSql( mCodc ) + " OR CODC3=" + NumberSql( mCodc ) + " )" )
mFiltro += iif( Empty( mNomePropriet ), "", " AND PROPRNOME LIKE " + StringSql( "%" + Trim( mNomePropriet ) + "%" ) )
mFiltro += iif( Empty( mIdadeMin ), "", " AND IDADE >= " + LTrim( Str( mIdadeMin ) ) )
mFiltro += iif( Empty( mIdadeMax ), "", " AND IDADE <= " + LTrim( Str( mIdadeMax ) ) )
mFiltro += iif( Empty( mExposicao ), "", " AND EXPOSICAO = " + StringSql( mExposicao ) )
mFiltro += iif( Empty( mPlaca ), "", " AND " + iif( mPlaca == "N", "PLACA<>'S'", "PLACA=" + StringSql( mPlaca ) ) )
ENDIF
ENDIF
...
cnMySQl:Execute( "SELECT * FROM IMOVEL WHERE " + mFiltro )
11 Out 2018 14:14
11 Out 2018 16:48
Amparo escreveu:é o usuário quem montara a expressão,
JoséQuintas escreveu:- o usuário digitar o filtro, e fazer o teste evitando erro
Amparo escreveu:ele vai ter o campo para escolher, os operadores para escolher
JoséQuintas escreveu: o usuário escolher campos, e fazer o filtro pelo programa
Amparo escreveu:mas terá que digitar qual o resultado esperado.
JoséQuintas escreveu:Type := ValType( Eval( bBlock ) )
? Valtype( Eval( { || dbSelectArea( 'temp' ) } ) )
11 Out 2018 21:16
alxsts escreveu:E se o codeblock retornar NIL, como em:
18 Out 2018 09:05
18 Out 2018 13:10
18 Out 2018 13:14
18 Out 2018 15:48