Jump to content
Fivewin Brasil

INDEXAÇÃO CONSTANTE


JUDSON ROSA

Recommended Posts

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
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 .

Link to comment
Share on other sites

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 .
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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,



Link to comment
Share on other sites

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.
Link to comment
Share on other sites

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 )
Link to comment
Share on other sites

  • 2 months later...

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...