Boa tarde.
Em anexo os arquivos do fonte, do executável, do log e dos arquivos de configuração do ambiente, estes são iguais os que uso no meu sistema.
Quando tiro a função DbClearRelationAll() do TESTE da o erro no anexo.
Tentei no meu sistema e mesmo com a função DbClearRelationAll() ocorre o erro, mas pelo que vi está ocorrendo quando há arquivo relacionado com outra tabela, mas só no ambiente LETO, já no ambiente DBFCDX nada ocorre.
Mas no TESTE em anexo da certo com as tabelas relacionadas.
Só consegui por enquanto no meu sistema substituindo a função dbcloseall() pelo LETO_CLOSEALL()
Esta correto e posso usar esta substituição?
usando em no meu sistema mas em teste da forma abaixo, mas deste jeito funciona.
Código: Selecionar todos
....
NewDbCloseAll()
....
Function NewDbCloseAll()
If oVia_RDD=="LETO" //variavel identificada no arquivo INI se o ambiente é LETO ou DBFCDX
Leto_CloseAll()
Else
DbCloseAll()
EndIf
Return .T.
Já na função DBCLOSEAREA() fiz uma modificação para e funciona perfeitamente
Código: Selecionar todos
Function NewDbCloseArea(oArea)
If Select(oArea) > 0
&oArea->(dbClearRelation())
&oArea->(DbCloseArea())
EndIf
Return .T.
************** ABAIXO O CODIGO DO TESTE FUNCIONANDO, MESMO DO ANEXO.
Código: Selecionar todos
REQUEST LETO
REQUEST DBFCDX
#Include "winuser.ch"
#include "rddleto.ch" // defines do RDD
#include "dbinfo.ch" // Header file for the RDD API Index OrderInfo and DBInfo support
#include "leto_std.ch" // traduz os comandos para o LETO
#include "cmdleto.h"
Function Main
WVW_SETMAINCOORD(.T.)
WVW_SetVertCaret(.F.)
WVW_enableshortcuts(0,.T.)
wvw_enablemaximize(0, .T.)
WVW_maximize()
wvw_noclose(1)
oDB_Server:="192.168.1.11"
oDB_Porta :="2812"
oDB_Path :="//"+oDB_Server+":"+oDB_Porta+"/"
RDDSetDefault("LETO")
nPasta :="\LETO\" ///PASTA DO BANDO DE DADOS
nConect := leto_Connect( oDB_Path )
w_vTXT:=""
If nConect == -1
bRet:=.F.
nRes := leto_Connect_Err()
If nRes == LETO_ERR_LOGIN
w_vTXT:="Falha ao Logar: "+oDB_PATH+"..."
ElseIf nRes == LETO_ERR_RECV
w_vTXT:="Erro ao conectar: "+oDB_PATH+"..."
ElseIf nRes == LETO_ERR_SEND
w_vTXT:="Erro de envio de pacote: "+oDB_PATH+"..."
Else
w_vTXT:="Não conectado ao servidor: "+oDB_PATH+"..."
EndIf
Else
w_vTXT:="Servidor conectado: "+oDB_PATH+"..."
WVW_MESSAGEbox(,w_VTXT,,MB_OK)
EndIf
nCurWindow :=WVW_nNumWindows()
nCurWindow:=WVW_NOpenWindow(,0,0,24,90)
WVW_SetTitle(,"Só teste com leto")
If !file(nPasta+"CIDADES.DBF")
aStru:={}
aAdd(aStru, {"CODIGO","C", 03, 0})
aAdd(aStru, {"CIDADE", "C",60, 0})
aAdd(aStru, {"ESTADO", "C",02, 0})
aAdd(aStru, {"CEP", "C", 8, 0})
DbCreate(nPasta+"CIDADES.DBF",aStru)
DbUseArea(.T.,"LETO",nPasta+"CIDADES.DBF",,.T.)
For iX:= 1 to 100
aUF:=If(iX<=10,"MS",If(iX<=20,"SP",If(iX<=50,"RS",If(iX<=80,"PB","MT"))))
aCep:=If(iX<=10,"79500000",If(iX<=20,"82800000",If(iX<=50,"12452000",If(iX<=80,"66540000","77550000"))))
DbAppend()
Field->CODIGO:=Strzero(ix,3)
Field->CIDADE:="NOME DA CIDADE "+Strzero(iX,3)
Field->ESTADO:=aUF
Field->CEP :=aCep
NEXT
Index On "CODIGO" To CIDADES
DbCloseAll()
EndIf
For iC:= 1 to 10 //pra criar 10 dbfs
If !file(nPasta+"NOMES_"+Strzero(iC,2)+".DBF")
aStru:={}
aAdd(aStru, {"CODIGO","C", 03, 0})
aAdd(aStru, {"NOME", "C", 60, 0})
aAdd(aStru, {"ENDERECO", "C", 60, 0})
aAdd(aStru, {"CIDADE", "C", 03, 0})
aAdd(aStru, {"SEXO", "C", 1, 0})
DbCreate(nPasta+"NOMES_"+Strzero(iC,2)+".DBF",aStru)
DbUseArea(.T.,"LETO",nPasta+"NOMES_"+Strzero(iC,2)+".DBF",,.T.)
For ix:= 1 to 100
DbAppend()
Field->CODIGO:=Strzero(ix,3)
Field->NOME :="NOME DO CLIENTE "+Strzero(iX,3)
Field->ENDERECO:="LOCAL"
Field->CIDADE:=StrZero(ix,3)
Field->SEXO:="M"
DbCommit()
Next
cArq:="NOMES_"+Strzero(iC,2)
Index On "CODIGO" To &cArq
EndIf
DbCloseAll()
Next
For iX:= 1 to 10
DbUseArea(.T.,"LETO",nPasta+"CIDADES.DBF","CIDADES_"+Strzero(iX,2),.T.)
DbSetIndex("CIDADES.CDX")
DbUseArea(.T.,"LETO",nPasta+"NOMES_"+Strzero(iX,2)+".DBF","NOMES_"+Strzero(iX,2),.T.)
DbSetIndex("NOMES_"+Strzero(iX,2)+".CDX")
DbSetRelation("CIDADES_"+Strzero(iX,2),{|| codigo },codigo)
Next
WVW_MESSAGEbox(,"Banco de dados aberto e relacionado",,MB_OK)
For iv:=1 to 10
WVW_MESSAGEbox(,"Banco de dados selecionado: NOMES_"+StrZero(iv,2)+" ( "+Str(iv,2)+" de 10)",,MB_OK)
DbSelectArea("NOMES_"+StrZero(iv,2))
BROWSE()
Next
WVW_lCloseWindow()
nCurWindow--
DbClearRelationAll() //AQUI, SE RETIRAR ESTA FUÇÃO, DA O ERRO QUE ESTA NO LOG
DbCloseAll()
WVW_MESSAGEbox(,"Banco de dados fechado",,MB_OK)
Return Nil
FUNCTION DbClearRelationAll()
LOCAL nArea
For nArea := 1 To 255
If Used()
(nArea)->( DbClearRelation() )
Endif
Next
RETURN NIL
Não sei se consegui ser claro, qualquer coisa só perguntar.
Valeu, grato.