Muito.
Em DBF, isto é normal, e até pode ser em SQL também.
Encontra( nIdFinanceiro, "financeiro" )
nIdFinanceiro := financeiro->IdFinanceiro
nIdCliente := financeiro->IdCliente
nIdPortador := financeiro->idPortador
nValor := financeiro->Valor
@ 1, 0 SAY "id.financeiro" GET nIdFinanceiro
@ Row() + 1, 0 SAY "cliente:" GET nIdCliente
Encontra( nIdCliente, "clientes" )
@ Row(), 22 SAY clientes->CLInome
@ Row() + 1 SAY "portador:" GET nIdPortador
Encontra( nIdPortador, "portador" )
@ Row(), 22 SAY portador->PORNome
@ Row() + 1, SAY "valor" GET nValor
READ
Mas.... em SQL... podemos fazer isto:
WITH OBJECT cnSQL
:cSQL := "SELECT FINANCEIRO.*, CLIENTES.clinome, PORTADOR.pornome ..."
:Execute()
nIdFinanceiro := :Number( "IDFINANCEIRO" )
nIdCliente := :Number( "IDCLIENTE" )
nIdPortador := :Number( "IDPORTADOR" )
nValor := :Number( "VALOR" )
@ 1, 0 SAY "id.financeiro" GET nIdFinanceiro
@ Row() + 1, 0 SAY "cliente:" GET nIdCliente
@ Row(), 22 SAY :String( "CLINOME" )
@ Row() + 1 SAY "portador:" GET nIdPortador
@ Row(), 22 SAY :String( "PORNOME" )
@ Row() + 1, SAY "valor" GET nValor
:CloseRecordset()
ENDWITH
READ
Pra que pedir um pedacinho da tela por vez, se pode pedir a tela inteira de uma vez?
É mais rápido e economiza fonte.
Nota:
Se as tabelas tem nome de campo repetido, com SQL não é problema, é usar ALIAS pra usar outro nome.
Com certeza deixei pra fazer isso pra depois.
E tanto faz se é console ou GUI, isso ajuda nos dois casos.