Bom dia pessoal.
Estou com o mesmo problema, preciso rodar uma função em segundo plano e não estou conseguindo.
Preciso dar um select no banco de dados sql e passar tudo para dbf para mostrar no dbedit, ou seja, rodar a pesquisa e gravar em dbf em segundo plano já com o dbedit aberto.
Exemplo abaixo busca cliente para pesquisar digitando
Código: Selecionar todos
Function ChecaCli(a_SQL,aTipo,Lin,Col,Tam,FuncC)
Private NomeCampos,UnSelect:=Str(Select(),2)
Private wRow:=Row(),wCol:=Col()
a_SQL:=If(a_SQL=Nil,.F.,a_SQL)
If a_SQL=.T. //é em sql a pesquisa
a_Campos :=FB_pegaEstrutura("TB_COLABORADOR") //pego os campos da tabela colaboradores
oTempo_DBF:=HoraTmp() //nomeio um temporario
OpenTmp(a_Campos,"NOME","&oTempo_DBF.",,,,,,,.F.) //crio o temporario vazio com a estrutura do TB_COLABORADOR
DbSelectArea(oTempo_DBF) //seleciono o temporario
DBF_CargaTH("TB_COLABORADOR","*","",a_Campos) //dou uma carga no temporario com tudo que tem em TB_COLABORADOR + de 6.000 registros (lento)
EndIf
NomeCampos:=
{{"codigo","Abreviate(nome,60)","venda","ShowSituacao(situacao)","RetVar()","RetRg()","Abreviate(endereco,30)","numero","e_mail","h_page","RP"},;
{"@R 999999999","@!","@!","@!","@!","@!","@!","@!","@X","@X","@!"},;
{"CÓDIGO","NOME DO CLIENTE","S","SITUAÇÃO ATUAL DO CLIENTE","CPF/CGC","RG/IEST","ENDEREÇO","NUMERO","EMAIL","HOMEPAGE","RP"}}
o_MsgR:=" "
NewDbBusca(04,00,,,"Clientes",NomeCampos,,o_MsgR,,,,,,.T.) // mostro em dbedit o conteudo do temporario no formato acima
Esta função serve só para chamar a modulo_carga em thread
Código: Selecionar todos
Function DBF_CargaTH(oTabela,oPesquisa,oCondicao,oCampos)
Return pThread := hb_StartRead( Modulo_Carga(oTabela,oPesquisa,oCondicao,oCampos) ) //retornando assim da erro
Return pThread := hb_StartRead( {|| Modulo_Carga(oTabela,oPesquisa,oCondicao,oCampos) } ) //retornando assim nao da erro, mas retorna vazio
Return Modulo_Carga(oTabela,oPesquisa,oCondicao,oCampos) //retornando assim, funciona mas demora, pq são 6.000 registros, por isto colocar em segundo plano, pq aí ele passaria para abrir o dbedit mesmo com poucos dados e iria inserindo enquanto seria pesquisado os clientes, algo assim.
Abaixo monta o banco de dados DBF para mostrar no dbedit
Código: Selecionar todos
Static Function Modulo_Carga(oTabela,oPesquisa,oCondicao,oCampos)
Local i_m,i_l,oCampo,oDados
Local oSQL := DB_SQL_SELECT(oTabela,oPesquisa,oCondicao)
For i_m:= 2 To Len(oSQL) //todo registro começa da linha 2
DbAppend()
For i_l:= 1 To Len(oCampos)
oCampo:=AllTrim(oCampos[i_l,1])
oDados:=DB_SQL_Fields(oSQL,oCampo,i_m)
Field->&oCampo. := oDados
Next
Next
Return .T.
Obs: Não fiz em MATRIZ devido não ter conseguindo montar uma TBROWSE para funcionar genericamente com array, igual a dbedit com dbf, faria isto depois com tempo.
Se alguém souber como colocar em segundo plano em harbour, fico muito agradecido.