Mais outra função que criei como quebra-galho, e é interessante.
É uma função simples, pra retornar um campo do SQL.
Aqui um exemplo de uso, antes e depois:
DO CASE
CASE mfiTipLan == "D"
OrdSetFocus("jpfinan2") // fiTipLan + fiNumDoc
CASE mfiTipLan == "B"
OrdSetFocus("numbanco") // fiNumBan
OTHERWISE
OrdSetFocus("numlan") // idFinan
ENDCASE
@ 5, 0 SAY "Num. Docto...........:" GET mfiNumDoc PICTURE "@K 999999999" VALID FillZeros( @mfiNumDoc ) WHEN mfiTipLan == "D"
@ Row(), 35 SAY "Parcela.." GET mfiParcela PICTURE "@K 999" WHEN mfiTipLan == "D" VALID FillZeros( @mfiParcela )
@ 6, 0 SAY "Num.Bancário.........:" GET mfiNumBan PICTURE "@K 999999" WHEN mfiTipLan == "B"
@ 7, 0 SAY "Num.Lançamento.......:" GET midFinanceiro PICTURE "@K 999999" VALID OkNumLanFin( @midFinanceiro ) WHEN ! mfiTipLan $ "DB"
@ 8, 0 SAY "Valor Original.......:" GET mfiValor PICTURE PicVal(14,2)
@ 9, 0 SAY "Juros(+) Descto(-)...:" GET mfiJurDes PICTURE PicVal(14,2)
Mensagem( "Digite campos, F9 Pesquisa ESC Sai" )
READ
Mensagem()
IF LastKey() == K_ESC
EXIT
ENDIF
DO CASE
CASE mfiTipLan == "D"
SEEK "1" + mfiNumDoc + mfiParcela
nRecFound := RecNo()
DO WHILE jpfinan->fiTipLan == "1" .AND. jpfinan->fiNumDoc == mfiNumDoc .AND. jpfinan->fiParcela == mfiParcela .AND. ! Eof()
nRecFound := RecNo()
SKIP
ENDDO
GOTO (nRecFound)
CASE mfiTipLan == "B"
SEEK StrZero( mfiNumBan, 6 )
OTHERWISE
SEEK StrZero( midFinanceiro, 6 )
ENDCASE
IF Eof()
MsgWarning( "Documento não cadastrado!" )
LOOP
ENDIF
Encontra( jpfinan->fiCadastro, "jpcadastro", "numlan" )
Primeiro pensar...
o objetivo é encontrar um lançamento no financeiro, podendo ser 3 critérios diferentes.
O que identifica a pesquisa pode variar, mas o resultado é um lançamento, então.... IdFinanceiro
@ 5, 0 SAY "Num. Docto...........:" GET mfiNumDoc PICTURE "@K 999999999" VALID FillZeros( @mfiNumDoc ) WHEN mfiTipLan == "D"
@ Row(), 35 SAY "Parcela.." GET mfiParcela PICTURE "@K 999" WHEN mfiTipLan == "D" VALID FillZeros( @mfiParcela )
@ 6, 0 SAY "Num.Bancário.........:" GET mfiNumBan PICTURE "@K 999999" WHEN mfiTipLan == "B"
@ 7, 0 SAY "Num.Lançamento.......:" GET midFinanceiro PICTURE "@K 999999" VALID OkNumLanFin( @midFinanceiro ) WHEN ! mfiTipLan $ "DB"
@ 8, 0 SAY "Valor Original.......:" GET mfiValor PICTURE PicVal(14,2)
@ 9, 0 SAY "Juros(+) Descto(-)...:" GET mfiJurDes PICTURE PicVal(14,2)
Mensagem( "Digite campos, F9 Pesquisa ESC Sai" )
READ
Mensagem()
IF LastKey() == K_ESC
EXIT
ENDIF
DO CASE
CASE mfiTipLan == "D"
nIdFinanceiro := ADOField( "IDFINAN", "N", "JPFINAN", "FITIPLAN = '1'" + ;
" AND FINUMDOC = " + StringSql( mfiNumDoc ) + " AND FIPARCELA = " + StringSql( mfiParcela ) + ;
" ORDER BY IDFINAN DESC" )
CASE mfiTipLan == "B"
mIdFinanceiro := ADOField( "IDFINAN", "N", "JPFINAN", "FINUMBAN = " + StringSQL( mfiNumBan ) )
OTHERWISE
midFinanceiro := ADOField( "IDFINAN", "N", "JPFINAN", "IDFINAN = " + NumberSQL( mIdFinanceiro ) )
ENDCASE
IF mIdFinanceiro == 0
MsgWarning( "Documento não cadastrado!" )
LOOP
ENDIF
Encontra( StrZero( mIdFinanceiro, 6 ), "jpfinan", "numlan" )
Encontra( jpfinan->fiCadastro, "jpcadastro", "numlan" )
Relativamente simples: seja qual for a pesquisa, retorna a ID do lançamento.
E cada pesquisa usando o que entra na pesquisa.
A função usa o nome do campo, "N" pra identificar que é retorno numérico, a tabela, e o comando SQL.
A identificação de tipo é porque no SQL poderia conter um NULL no campo, então o tipo garante que o retorno vai ser numérico, porque vai converter NULL pra número 0.
A função só precisa combinar os parâmetros.
Numa forma resumida:
ADOField( cCampo, cTipo, cTabela, cCriterio )
"SELECT " + cCampo + " FROM " + cTabela + " WHERE " + cCriterio
É até pouco pra usar função mas... considerando fazer consulta, testar resultado, e até poder usar em IF, a torna interessante.
Comparando com DBF, é como abrir arquivo, posicionar com SEEK, e retornar o campo.
Porque entrou esta parte?
Encontra( StrZero( mIdFinanceiro, 6 ), "jpfinan", "numlan" )
Não dependo mais do DBF pra ESSA pesquisa, mas falta alterar o resto do fonte.
Tudo bem, por enquanto o que importa é reduzir o uso de DBF mas que o fonte continue funcionando.
Melhor alterar aos poucos, pra evitar perder o controle.
Essa parte garante que não vai faltar nada pro resto do fonte.
De quebra, eu poderia acabar com outros Ãndices, e manter somente o Ãndice por ID no DBF !!!
Apenas uma possibilidade, com certeza continuar caminhando pra eliminar o dbf de vez.
A gravação dupla está sendo legal nisso: no mesmo fonte, tanto faz se pego do MySQL ou DBF.
Basta ir eliminando a necessidade do DBF e pronto, depois só apagar tudo do DBF.