SAOliveira Posted June 12, 2014 Report Share Posted June 12, 2014 Dorneles, isto já pedi faz tempo. Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 12, 2014 Author Report Share Posted June 12, 2014 Desculpe pessoal por nao ter postado e que a pressao esta grande , mais obrigado ao apoio de todos segue indices e a rotina onde ocorre o error: // desarma filtro DbSelectArea("MOVI") MOVI->(OrdScope(0,NIL) ) MOVI->(OrdScope(1,NIL) ) // arma filtro DbSetOrder( 1 ) dbseek( wCdmo+wCdcl+wNota+wcdpr ) // gravando itens da nota fiscal If trava( if(l_par2="I",1,2) ) MOVI->nota := wnota ; MOVI->cdpr := wcdpr MOVI->dtmo := wdtem ; MOVI->cdmo := wcdmo MOVI->cdfo := wcdcl ; MOVI->cust := wcust MOVI->hist := wobse ; MOVI->tran := iif( left(wtran,1)=="V","N","S") MOVI->vuni := wvlun ; MOVI->seri := wseri MOVI->perc := wperc ; MOVI->afre := wafre MOVI->pdes := wpdes ; MOVI->aipi := waipi MOVI->cdve := wcdve ; movi->quan := wquan movi->adic := "Gerada" ; movi->vdes := wvdesc movi->lote := wlote ; movi->dtva := wdtva dbcommit() dbunlock() endif // procurando pelo cabeçalho qd item incluso ou alterado DbSelectArea("MOVI") dbsetorder(2) dbseek( wcdmo+wnota ) lprimeiro:=.t. do while movi->cdmo+movi->nota = wCdMo + wNota .and. !eof() If Trava(2) MOVI->ctrl := if(lprimeiro,"0","1") dbcommit() dbunlock() lprimeiro:=.f. Endif dbskip() enddo dbsetorder(1) MOVI->(OrdScope(0,NIL) ) MOVI->(OrdScope(1,NIL) ) wITMchave := wCdmo+wCdcl+wNota MOVI->(OrdScope(0,wITMchave ) ) MOVI->(OrdScope(1,wITMchave ) ) // funcao trava FUNCTION trava ( w_titr , w_temp ) && bloqueiar registro para incluir/alterar/excluir //************// local l_titr:=w_titr , l_temp:=w_temp , l_cont * l_titr: Tipo de opercao i/a/e-1/2/3 * l_temp: Tempo para bloqueio do registro * l_tlog: Grava ou nao o logs l_temp = if(type('l_temp')='U',2,l_temp) l_tlog = if(type('l_tlog')='U',.t.,l_tlog) do while .t. l_cont=1 r_append := .f. r_rlock := .f. do whil l_cont <= l_temp if l_titr=1 // inclusao DBAPPEND() // append blank if !neterr() return(.t.) endif else // alteracao e exclusao if dbrlock() if l_titr=3 dbdelete() dbcommit() dbunlock() endif return(.t.) endif endif ++l_cont Inkey(0.05) enddo enddo return(.f.) obs: ja criei a estrutura do dbf toda pelo xh Quote Link to comment Share on other sites More sharing options...
SAOliveira Posted June 12, 2014 Report Share Posted June 12, 2014 Algumas dicas. **--[ RDD de arquivos e indices ]--** REQUEST SQLLIB REQUEST MYSQL RDDSETDEFAULT("MYSQL") DBSETDRIVER("MYSQL") REQUEST DBFCDX REQUEST ORDKEYNO REQUEST ORDKEYCOUNT REQUEST ORDKEYGOTO REQUEST DESCEND **--[ Cria/abrir aquivos e indices ]--** USE nArquivo EXCLUSIVE INDEX ON campo1 TAG "cp1" TO nIndice INDEX ON campo2 TAG "cp2" TO nIndice Use nArquivo Index nIndice Alias("nAlias") Via "DBFCDX" NEW Shared **--[ usar arquivos ]--** cAlias->(OrdSetFocus("cp2") cAlias->(DbSeek(...)) cAlias->(dbAppend(...)) cAlias->(__dbZap()) cAlias->(dbcommit()) cAlias->(OrdScope(...)) Travar Simple sem tratamento : While(nAlias->(!rLock())) ; ENDDO Fechar Arquivo: cAlias(DbCloseArea()) Ou seja, definir e utilizar tudo baseado em ALIAS(), pois desta forma jamais terá uso de comandos em área aberta/fechada indevidamente. Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 12, 2014 Author Report Share Posted June 12, 2014 Ok sergio vou fazer as mudanças q estas sugerindo mais as que eu ja estou fazendo na minha rotina , pois depois que criei a nova estrutura do meu banco pelo xh nao apareceu mais o erro " Unrecoverable Error 9201: hb_cdxPageSeekKey: wrong parent key " que toda hora fechava o sistema , acho que o meu dbf estava com algum problema , mais o que esta acontecendo agora e que quando tem duas pessoas usando o mesmo banco ou seja fazendo venda , cada um pega o numero de nota diferente mais quando começa a gravar no msm dbf a informacao de um ( os produtos ) aparece na venda do outro . o pior acontece quando vou no dbf pelo no dbu so vejo a venda do 2 usuario na vejo a venda do 1 usuario , perece que ele tava gravado em cima do outro q loucura. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted June 13, 2014 Report Share Posted June 13, 2014 Outra coisa galera , tenho 10 indices no meu dbf , como eu posso saber qual o indice que pode estar corrompido ??? SET ORDER TO 01 ... E VA ABIRNDO OS DEMAIS ? INDEXORD() o que estiver errado, vai quebrar... eu acho. abs Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 13, 2014 Author Report Share Posted June 13, 2014 Boom dia , como falei consegui resolve o erro " Unrecoverable Error 9201: hb_cdxPageSeekKey: wrong parent key " foi so criar uma nova estrutura desse dbf apartir do xh. Agora senhores to com o seguinte problema na venda: estacao - 1 ( onde esta o dbf ) n.venda: 1000 produto: 01-arroz estacao - 2 ( nao uso atalho , executavel local com acesso a dbf da estacao - 1) n.venda: 1001 produto: 05 - feijao acompanhando dbf pelo dbu vejo o seguinte: a estacao-1 inseri normal a sua venda , mas qd a estacao-2 vai inserir o registro ele grava em cima do registro da estacao-1 , como se o comando DbAppend nao inseri-se um novo registro. estou usando o comando DbAppend() como todo mudo usa no teste de uma unica estacao inseri normal tds os registro , alguem da um alo ai . Quote Link to comment Share on other sites More sharing options...
atnsoft Posted June 13, 2014 Report Share Posted June 13, 2014 Uma dica é verificar se a soma dos campos na indexação não esta muito longa. Passei por este erro, mas o indice era NTX e estava ultrapassando 255 caracteres. Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 13, 2014 Author Report Share Posted June 13, 2014 ja verifiquei isso esta ok , não esta mais dando problema de indice o caso agora como relatei e no dbf em rede , pq local esta gravando correto. Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 13, 2014 Author Report Share Posted June 13, 2014 aleluia , amigos agora conseguir resolver o problema da gravacao ufa , com ajuda de tds e a do meu amigo kleyber , fiz o seguinte: antes do DbAppend() tive q fechar e abrir o dbf , so assim ele ta inserindo o novo registro: movi->(dbclosearea()) use (w_dbfPath)+"siimovi.dbf" alias MOVI index (w_dbfPath)+"siimovi.cdx" shared new // gravando itens da nota fiscal DbAppend() MOVI->nota := wnota ; MOVI->cdpr := wcdpr MOVI->dtmo := wdtem ; MOVI->cdmo := wcdmo MOVI->cdfo := wcdcl ; MOVI->cust := wcust MOVI->hist := wobse ; MOVI->tran := iif( left(wtran,1)=="V","N","S") MOVI->vuni := wvlun ; MOVI->seri := wseri MOVI->perc := wperc ; MOVI->afre := wafre MOVI->pdes := wpdes ; MOVI->aipi := waipi MOVI->cdve := wcdve ; movi->quan := wquan movi->adic := "Gerada" ; movi->vdes := wvdesc movi->lote := wlote ; movi->dtva := wdtva dbunlock() dbcommit() agora vou fazer mais testes e instalar no cliente atarde tomara que sai td perfeito , ja to a uma semana nessa batalha. obrigado a tds . Quote Link to comment Share on other sites More sharing options...
vagner Posted June 16, 2014 Report Share Posted June 16, 2014 Olá, antes vc está regravando os índices os fields chave tb, isso só deve ser feito em uma inclusão, senão vai estourar mesmo os índices, ou mude para dbsetorder(0) e depois volte para o normal Quote Link to comment Share on other sites More sharing options...
oribeiro Posted June 16, 2014 Report Share Posted June 16, 2014 Muito estranho essa técnica de fechar e abrir o arquivo antes do DbAppend(), não faço isso nos meus sistemas e nunca tive problemas de gravação de registro. Será que esse é mesmo o caminho? Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 16, 2014 Author Report Share Posted June 16, 2014 BOA tarde , realmente oscar ,por nao concordar com essa forma eu novamente voltei a investigar o problema , apos mudanças na rotina , mudanca na estrutura do dbf e mudanca nos indices , coloquei hj a nova versao no cliente , pois depois dessas mudancas na minha rede nao deu mais o problema , agora vou esperar como fica no cliente. Quote Link to comment Share on other sites More sharing options...
vagner Posted June 16, 2014 Report Share Posted June 16, 2014 Bom, como eu não faço indexações (raras vezes coisa de a cada 6 ou 8 anos), continuo afirmando, inclusive tem um post meu antigo sobre isso Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 16, 2014 Author Report Share Posted June 16, 2014 Olá, antes vc está regravando os índices os fields chave tb, isso só deve ser feito em uma inclusão, senão vai estourar mesmo os índices, ou mude para dbsetorder(0) e depois volte para o normal Boa tarde vagner , vc tem como posta um exemplo simples de como vc faz ? agradeço Quote Link to comment Share on other sites More sharing options...
kapiaba Posted June 16, 2014 Report Share Posted June 16, 2014 Veja se te ajuda: http://www.pctoledo.com.br/forum/viewtopic.php?f=42&t=6191 abs, Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 16, 2014 Author Report Share Posted June 16, 2014 kapiaba dei uma olha e tenho 2 duvidas: 1 - E necessario definir no projeto o _DBFCDX e ativa-lo com RDDSETDEFAULT("_DBFCDX") ou so basta o DBFCDX ? 2 - Antes da gravação dos dados em um dbf este com "x" indices sempre tenho que colocar o dbsetorder( 0 ) , isto é regra ou eu to desaprendendo ? , se eu nao usar este ele nao vai atualizar os outros indices , mesmo que o arquivo de indice ja esta aberto com o dbf ? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted June 16, 2014 Report Share Posted June 16, 2014 Resposta Primeira Pergunta: #Include "FiveWin.Ch" ANNOUNCE RDDSYS REQUEST DBFCDX, DBFFPT REQUEST OrdKeyNo, OrdKeyCount, OrdCreate, OrdKeyGoto REQUEST HB_LANG_PT REQUEST HB_CODEPAGE_PT850 STATIC oWnd FUNCTION Main() RDDSETDEFAULT( "DBFCDX" ) SET CENTURY ON SET DATE BRITISH SET EPOCH TO YEAR( DATE() ) - 30 SET SOFTSEEK OFF SET WRAP ON SETCANCEL( .F. ) SET CONFIRM OFF SET DELETED ON SET ESCAPE ON SET EXCLUSIVE OFF SET MULTIPLE OFF // SET DECIMAL TO 4 // criterio SET OPTIMIZE ON SET FIXED ON HB_LANGSELECT("PT") HB_SETCODEPAGE( "PT850" ) ... Segunda pergunta, nao uso DBSETODER(0) pois nao tenho necessidade, meus indices saä criados perfeitamente, e troque em tempo real sem nenhum problema. Talvez esse "truque" seja para outro tipo de modo de programar, que eu nao uso. Uso a classe TDATABASE e o modos operandi e diferente veja: SELECT ( DbVendedor:cAlias ) // Seleciona o Alias DbVendedor:SetOrder( 1 ) // Ordenado Por C¢digo DbVendedor:GoTop() DBSEEK( XCODVEND ) //-> Codigo do Vendedor IF FOUND() // NADA A FAZER ELSE // CONTINUE... ENDIF E mesmo com o modo "normal", nao necessito do DBSETORDER(0) Porque uso um FLAG tipo: IF lAppend // venho da inclusao APPEND BLANK TRAVOREGISTRO() REPLACES... COMMIT UNLOCK ELSE // alteracao // Posiciono o ponteiro no regstro a alterar TRAVOREGISTRO() REPLACES... COMMIT UNLOCK ENDIF abs, Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 16, 2014 Author Report Share Posted June 16, 2014 ok obrigado pela informacao , amanha posto aqui se deu certo no cliente. Quote Link to comment Share on other sites More sharing options...
SAOliveira Posted June 17, 2014 Report Share Posted June 17, 2014 Vi que você usa DBFCDX e MYSQL. Postei acima como faço as chamadas para o Request/RddSetDefault Mostra o inicio como esta gravando os dados no banco. Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 17, 2014 Author Report Share Posted June 17, 2014 Bom dia Sergio , segue o que pediu , mudei este apos informacoes passadas por voce e pelo kapiaba. REQUEST HB_LANG_PT REQUEST HB_CODEPAGE_PT850 REQUEST SQLLIB REQUEST MySQL Rddsetdefault("DBFCDX") DBSETDRIVER("DBFCDX") REQUEST DBFCDX REQUEST ORDKEYNO REQUEST ORDKEYCOUNT REQUEST ORDKEYGOTO REQUEST DESCEND HB_LANGSELECT( 'PT' ) HB_SETCODEPAGE( "PT850" ) // Set como no Clipper SET CENTURY ON SET EPOCH TO 1990 SET DATE BRITISH SET DELETED ON //SET EXCLUSIVE OFF SET FIXED ON SET DECIMALS TO 2 SETCANCEL( .F. ) E o bom do dia e que ainda nao deu problema nos clientes, os vendedores estao gravando seus produtos nas sua notas sem aparecer nas dos outros e tb nao deu mais problema de indice. Quote Link to comment Share on other sites More sharing options...
vagner Posted June 17, 2014 Report Share Posted June 17, 2014 Olá, eu não consigo postar nada aqui, depois vou mandar para o kapiaba e ver se ele posta por mim kapiaba 1 Quote Link to comment Share on other sites More sharing options...
SAOliveira Posted June 17, 2014 Report Share Posted June 17, 2014 Faltou a parte que você grava no MySql ? Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 18, 2014 Author Report Share Posted June 18, 2014 Sergio , segue rotina de gravacao mysql , mas não tem nada a ver com esse dbf . //---------------------------- Static Function GravaContato_MySql( ltipo_banco ) //---------------------------- // Seleciona Banco GSERVER AbreGSERVER() ; SQLSETCONNECTION( ConectaGSERVER1 ) // Pega Dados da Tabela "DEFA" cSql := "select * from defa" aTabelaDefa := SqlArray( cSql ) If ( SQL_ErrorNO() > 0 ) MsgInfo( "Informe Esta Mensagem Ao Suporte : "+CRLF+SQLErrorMsg(), "Atenção." ) Return( NIL ) Endif If ( len( aTabelaDefa ) == 0 ) MsgInfo( "Não existem informações na tabela de configuração (DEFA) !!!", "Atenção." ) Return( NIL ) Endif // Pega Cnpj da Empresa wcnpj := cripto(aTabelaDefa[1,2]) whash := aTabelaDefa[1,113] // Seleciona Banco INTERREG AbreINTERREG() ; SQLSETCONNECTION( ConectaINTERREG ) If ( SQL_ErrorNO() > 0 ) MsgInfo("Ocorreu Um Erro Durante o Envio da Sugestão. Tente Mais Tarde !!!","Atenção.") ConectaINTERREG := 0 Return( NIL ) Endif // Inclui Contato na Base de Dados cSql := "insert into contatos set" cSql += " datacontato = "+Any2Sql( date() )+Any2Sql( time() ) cSql += ", cnpjcontato = "+Any2Sql( wcnpj ) cSql += ", tipocontato = "+Any2Sql( left( cTipo, 1 ) ) cSql += ", assucontato = "+Any2Sql( Alltrim( TiraAcento( cAssu ) ) ) cSql += ", textcontato = "+Any2Sql( Alltrim( TiraAcento( cMens ) ) ) cSql += ", usuacontato = "+Any2Sql( w_usua ) cSql += ", situcontato = '0'" // Realiza Transação Begin Transaction SQL Execute cSql If ( SQL_ErrorNO() > 0 ) SQLRollBack() End Transaction MsgInfo( "Informe Esta Mensagem Ao Suporte : "+CRLF+SQLErrorMsg(), "Atenção." ) Return( NIL ) Endif End Transaction // Encerra MsgInfo( "Sugestão Enviada Com Sucesso !!!", "Atenção." ) oDlg:End() Return( NIL ) Quote Link to comment Share on other sites More sharing options...
aferra Posted September 1, 2014 Report Share Posted September 1, 2014 embora faz tempo aqui vai minhas considerações finais despois de duas semanas sem problemas. Acrescentei essa função. If !WIN_OSNETREGOK() //Precisa direitos ADM If !WIN_OSNETREGOK(.t.,.t.) //primeiro .t. é para ajustar XP/W98..., o segundo ajusta no vista. MsgInfo('Registro do Windows não ajustado !') EndIf EndIf retirei da classe database. DbInfo( DBI_SHARED ) como uso DBF + CDX acrescentei na abertura do .PRG principal SET AUTOSHARE TO 0 recriei todos os dbf com HARBOUR e atualizei e por fim ( não acredito que seja o problema, mas... ) retirei o EVERY da indexação INDEX ON tipo+DTOS(dtem) TAG dtem EVAL ( oMetCdx:Set(RECNO()), SysRefresh() ) //EVERY nRegCdx esses foram os meus passos, espero que ajude alguém que passe por esse problema, uma coisa que percebi é que o erro sempre será nosso, claro, as vezes algumas atualizações do compilador ocorre erro. mas é muito raro. Não sei se vai ajudar o caso deste tópico, mas como era o mesmo problema que enfrentava. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted September 1, 2014 Report Share Posted September 1, 2014 embora faz tempo aqui vai minhas considerações finais despois de duas semanas sem problemas. Acrescentei essa função. If !WIN_OSNETREGOK() //Precisa direitos ADM If !WIN_OSNETREGOK(.t.,.t.) //primeiro .t. é para ajustar XP/W98..., o segundo ajusta no vista. MsgInfo('Registro do Windows não ajustado !') EndIf EndIf retirei da classe database. DbInfo( DBI_SHARED ) como uso DBF + CDX acrescentei na abertura do .PRG principal SET AUTOSHARE TO 0 recriei todos os dbf com HARBOUR e atualizei e por fim ( não acredito que seja o problema, mas... ) retirei o EVERY da indexação INDEX ON tipo+DTOS(dtem) TAG dtem EVAL ( oMetCdx:Set(RECNO()), SysRefresh() ) //EVERY nRegCdx esses foram os meus passos, espero que ajude alguém que passe por esse problema, uma coisa que percebi é que o erro sempre será nosso, claro, as vezes algumas atualizações do compilador ocorre erro. mas é muito raro. Não sei se vai ajudar o caso deste tópico, mas como era o mesmo problema que enfrentava. Isto é para HARBOUR? Como se faz em xHarbour? obg. abs. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.