Jump to content
Fivewin Brasil

INDEXAÇÃO CONSTANTE


JUDSON ROSA

Recommended Posts

Bom dia amigos , gostaria que alguém pudesse me dar uma solução para o seguinte problema:

Utilizo xharbour + dbf + cdx , ainda nao pode concluir a migração para MySql , então
ultimamente tenho encontrado problema de indexação constante nas rotinas de
grande movimento na rede , tipo aquelas onde vários vendedores realizam vendas
no balcão , não e sempre mais aqui ali precisamos organizar esse dbf . ja vi
aqui no fórum algumas formas de gravar no dbf fiz tudo que vi aqui neste fórum
na questão de segurança dos dados , já verifiquei a rede , coloquei ip fixo
, e em certos momentos o problema volta a acontece , antes de fazer o que estou pensando
, gostaria de uma opinião sobre este problema . Mas estou quase que convencido
que o problema não esta no sistema e sim no servidor do cliente pois o mesmo não
e bem um servidor e além disso esta
rodando com Windows 7 , pretendo pedir a colocar de Windows server , o que os
amigos podem opinar ?

Link to comment
Share on other sites

ultimamente tenho encontrado problema de indexação constante.

Explique melhor...

O que é indexação constante?? Os *.cdx estão corrempendo? O que acontece realmente?

E mostre como abre os bancos e como você está fazendo a indexação dos bancos.

Quando isso ocorre? Descreva ou mostre com imagem, fica mais fácil te ajudar.

Pense, windows 7 e 8 são mais novos que o SERVER 2012 por exemplo.

Qual é a vantagem do SERVER? É que você pode chamar seu programa remotamente de qualquer lugar. Não significa que como servidor de arquivos, ele é melhor que o Windows 7 ou 8, pelo contrário, se ele é mais velho... Posso estar errado, lógico.

Problema em minha opinião, pode estar localizado no equipamento, ou no seu programa, só uma opinião, não estou afirmando.

De mais detalhes, que fica mais fácil, sua colocação está meio vaga...

abs,

Link to comment
Share on other sites

Judson

Sugiro mudar as rotinas mais críticas para MySql.

Trabalhava com CDX em windows server e os problemas com indexação existiam da mesma forma.

Migre as rotinas mais críticas e depois vá migrando o resto do sistema.

Nada contra os DBF mas em uma rede com 20 máquinas acessando simultâneamente, com cadastro de 400 pessoas dias e cada pessoa com uma média de 6 exames. Não tinha jeito, tinha que parar na hora do almoço e organizar tudo, pois simplesmente o sistema parava de encontrar as informações.

Trabalhava com CDX auto open no início do programa main abria todos os arquivos no início do programa, e mesmo assim ele não conseguia manter os indices atualizados. Era só indexar e voltava tudo ao normal.

Att

João Bosco

Link to comment
Share on other sites

Bom obrigado ai pessoal , o problema como falei e que as informacoes ficam fora de ordem , produtos em uma nota nao aparecem , so volta a aparecer quando e indexado , isso como falei depois de um tempo, vou postar aqui como faço os processos:

1) abertura do dbf:

use (w_dbfPath)+"siimovi.dbf" alias MOVI index (w_dbfPath)+"siimovi.cdx" shared new ; dbsetorder(1)

2) indexação:

use siimovi exclusive

index on "cdmo+cdfo+nota+cdpr" tag siimovi1

3) rotina de gravacao dos dados:

dbselectarea("movi")

rlock()

replace ...

dbcommit()

dbunlock()

4 ) imagem

nao posso mandar porque fica so desorganizado os dados

5) windows 7 x server:

Windows 7

É um sistema operacional produzido pela Microsoft para uso em computadores pessoais , incluindo a casa e negócios desktops , laptops , netbooks , tablet PCs e media center PCs.

Tamanho: 2,36 GB

Web site oficial: http://windows.microsoft.com/pt-BR/windo...
Para baixar: http://baixaki.com.br/download/windows-7...


>Windows Server

É projetada para fornecer serviços e recursos para outros sistemas em uma rede. O sistema operacional tem um abundante conjunto de recursos e opções de configuração.

Sua versão mais robusta do Windows Server 2008 com aperfeiçoamentos nos recursos de cluster e suporte a configurações de memória muito amplas com até 64 GB de RAM em sistemas x86 e dois TB RAM em sistemas de 64 bits. Tem requisito mínimo de CPU e pode dar suporte a até 64 CPUs.

Pode ate nao resolver o problema mas e para isso que serve o windows server.

Link to comment
Share on other sites

Olá meu amigo Judson,

Quando eu programava em clipão puro, utilizando NTX, tive muitos problemas com indices, então resolvi abrir e fechar os bandos de dados, com seus indices, apenas na hora de salvar os dados, foi um santo remédio. Nunca mais tive problema com indices.

Obs.: Na época o servidor era NOVELL.

Um grande abraço.

Link to comment
Share on other sites

Indexando os produtos:




// apago o .CDX antes, para nao duplicar o .CDX
AEVAL(DIRECTORY( "TABPROD.cdx" ),{ |aFILE| FERASE(aFILE[F_NAME]) } )

// CADASTRO DOS PRODUTOS TABPROD.DBF----------------------------------------
IF NetUse( "TABPROD", .F. )

IF lPack = .T.
MsgRun( "Apagando PRODUTOS Excluidos...", ;
"Por Favor, Espere!" , ;
{ || __DbPack() } )
ENDIF

oMeter2:nTotal = RecCount()

INDEX ON Field->CODIGO TAG CODIGO TO TABPROD ;
EVAL ( oMeter2:Set( RecNo() ), CursorWait(), SysRefresh() ) ;
EVERY 10

INDEX ON Field->DESCRICAO TAG DESCRICAO TO TABPROD ;
EVAL ( oMeter2:Set( RecNo() ), CursorWait(), SysRefresh() ) ;
EVERY 10

INDEX ON Field->MARCA+CODIGO+DESCRICAO TAG MARCA TO TABPROD ;
EVAL ( oMeter2:Set( RecNo() ), CursorWait(), SysRefresh() ) ;
EVERY 10

INDEX ON Field->SECAO TAG SECAO TO TABPROD ;
EVAL ( oMeter2:Set( RecNo() ), CursorWait(), SysRefresh() ) ;
EVERY 10

INDEX ON Field->GRUPO TAG GRUPO TO TABPROD ;
EVAL ( oMeter2:Set( RecNo() ), CursorWait(), SysRefresh() ) ;
EVERY 10

INDEX ON DESCEND( Field->QUANTIDADE ) TAG NQUANTIDADE TO TABPROD ;
EVAL ( oMeter2:Set( RecNo() ), CursorWait(), SysRefresh() ) ;
EVERY 10

DbCloseAll()

ENDIF


Link to comment
Share on other sites

Kapiaba e o seguinte o lance de aparecer e nao aparecer produtos na nota é uma vez ou outra , mas os produtos foram inseridos na nota eles estão la , foram gravados na nota , mas quando o vendedor vai ver a nota numa alteracao ou numa impressao nao aparece os produtos que estao la , ai temos que organizar e depois tudo volta a funcionar , entao estamos concluido que ocorre alguma corrupção neste indice , tem dia que nem ocorre , por isso que nao achamos que e o nosso sistema e sim a rede ou o servidor de dados do cliente .

Link to comment
Share on other sites

Se fosse corrupção, a bibliotec DBFCDX, quebraria e não continuaria.



use siimovi exclusive



// index on "cdmo+cdfo+nota+cdpr" tag siimovi1 // isto functiona mesmo?? nunca vi nada igual.



tente:



FIELD cdmo, cdfo, nota, cdpr



INDEX ON cdmo + cdfo + nota + cdpr TAG siimovi1 TO siimovi EVERY 10



abs,

Link to comment
Share on other sites

e dessa forma que faço : index on cdmo+cdfo+nota+cdpr tag siimovi1 , as aspas foram por acidente .

mas vc ta me dizendo que se fosse corrupção ele daria erro de execução quebraria e sairia do sistema , e como posso explicar os dados voltarem a ficar em ordem depois que faço a indexação ?

Link to comment
Share on other sites

e dessa forma que faço : index on cdmo+cdfo+nota+cdpr tag siimovi1 , as aspas foram por acidente .

mas vc ta me dizendo que se fosse corrupção ele daria erro de execução quebraria e sairia do sistema , e como posso explicar os dados voltarem a ficar em ordem depois que faço a indexação ?

Isso pode estar ocorrendo caso você esteja gravando dados (nota) no arquivo sem estar aberto o indice correto....

sugiro que verifique a sua rotina de gravação deste dados (nota) pode ter algum gargalo ali que esta permitindo o sistema gravar os dados sem que o indice correto esteja aberto...

se possível posta a rotina que grava os dados da nota - o inicio quando você abre o arquivo os replace e depois quando você fecha...

Eu faço da seguinte maneira... não fico com arquivo aberto, abro apenas na hora de gravar os dados e depois fecho novamente o arquivo...

Link to comment
Share on other sites

Bom dia , Theotokos , ja verifiquei a minha rotina muitas vezes , o sindices estao todos aberto , isso so acontece em 2 clientes , nos outros isso nao ocorre , agora voce falou uma coisa que ontem a noite fiquei pensando , "Eu faço da seguinte maneira... não fico com arquivo aberto, abro apenas na hora de gravar os dados e depois fecho novamente o arquivo..." ,. Agora pela manha vou fazer exatamente como esta na sua frase , vou testar e colocar no cliente pela manha , e vamos ver o que acontece , qualquer coisa posto aqui . t+

Link to comment
Share on other sites

Bem o que acontecia comigo no mesmo modulo seu, de vendas, era o seguinte, qdo deletava um registro, e como isso as vezes acontece vários no dia corrompia o índice, solução:

dbRLock()

dbSetOrder(0)

dbDelete()

dbCommit()

dbSetOrder(<seta o indice>)

dbUnLock()

e ai o que vc quiser depois disso, sei lá dbGoTop(), dbSkip(), etc...

tem amigos que usam setar o índice para zero até para dar append e replace, mas no meu caso somente a mudança no delete já não ocorreu mais o problema, tente isso. boa sorte.

Link to comment
Share on other sites

Muito valido Alessandro , vou tentar isso vi q esse tratamento q vc faz no delete nao faço tudo isso que vc descreveu , pode estar ai o problema qd do deletar do item , pelo tempo que o problema acontece de vez em quando , acho que nem toda nota o vendedor deleta produto, vou inserir testar e comento aqui depois.

Link to comment
Share on other sites

Judson

eu também sofro com esse tipo de problema. O motivo está na desgraça da rede windows que a maioria dos clientes utiliza.

Aqueles que passaram a usar um servidor com Linux e o Samba para o compartilhamento na rede windows, quase não têm problema.

Já tentei todas as opões que achei nos fóruns, nada resolveu 100%.

Algo que ajuda bastante é desabilitar o OpportunisticLocking em todas as máquinas da rede.

Segue o que deve ser executado:


[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters]


; Disable oplocks


"UseOpportunisticLocking" = dword:00000000

"EnableOpLocks" = dword:00000000

"EnableOpLockForceClose" = dword:00000001




; Disable file caching - effectively forces a commit back to the server


"UtilizeNtCaching" = dword:00000000


; Unlocks data immediately in response to an unlock request (improves performance on W2K)


"UseUnlockBehind" = dword:00000001


; Allows data to be read even if another station has a lock in place - can prevent "deadly embrace"


"UseLockReadUnlock" = dword:00000000


; This one appears to be present in W2K onwards, although by default it isn't

; actually in the registry. We'll add it & explicitly disable the workstation

; asking for oplock support


[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MRXSmb\Parameters]

"OplocksDisabled" = dword:00000001

[]´s

Link to comment
Share on other sites

Bom dia, eu não uso essa dica do Alessandro mas achei interessante vou testar, o q eu faço é indexar automático no início do dia e trabalho em rede com TS, mas a desvantagem é q em clientes q tem um volume de dados maior a indexação diária, mesmo q apenas no início do dia é tediosa, pq o cliente tem q chegar um 10 min antes para abrir o sistema e esperar a indexação terminar e depois abrir os terminais.

Minha dúvida é a seguinte Alessandro fazendo isto na tua opinião, não precisaria indexar diariamente no início do dia como faço atualmente?

Agora fiquei curioso com a ideia do colega Rogério sobre desativar o OpportunisticLocking, pra que serve?

Outra dúvida, sei q caso for utilizar a desativação do OpportunisticLocking no registro do Windows é possível fazer isto de forma automática via nossos aplicativos manipulando o Registro, alguém já teria isto desenvolvido?

[]´s

Link to comment
Share on other sites

Rogério, não seria assim?



#include "FiveWin.Ch"

#define HKEY_LOCAL_MACHINE 2147483650

//---------------------------------------------------------------------------//

function Main()

LOCAL oReg, cName, uVar

oReg := TReg32():Create( HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\services\LanmanWorkstation\Parameters" )

// Call Set with an empty string to access the default key

oReg:Set( "FileInfoCacheLifetime", 0 )
oReg:Set( "FileNotFoundCacheLifetime", 0 )
oReg:Set( "DirectoryCacheLifetime", 0 )

oReg:Close()

oReg := TReg32():Create( HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\services\LanmanServer\Parameters" )

// Call Set with an empty string to access the default key

oReg:Set( "Smb2", 0 )

oReg:Close()

MsgInfo( "Windows registry updated!" )

return nil


Obg. abs.

Link to comment
Share on other sites

Boa tarde, Judson, esta base de dados é grande? Como você faz para incrementar o número do pedido/orçamento/vendas? No passado quando eu ainda usava dbf, quando a base começou a crescer, ocorria que a leitura e gravação ficava lenta e quando mais de um mandava gravar ao mesmo tempo ai dava muito problema, a solução na época foi criar uma tabela com um unico registro para controlar os ultimos numeros dos pedidos/orçamentos/vendas, etc. Desta forma, cada vez que eu ia gravar, eu pegava o ultimo numero nesta tabela de um unico registro e incrementava, depois gravava na tabela dos dados. Depois que implementei esta solução em todo meu sistema, nunca mais me incomodei, e tinha cliente que mais de 10 vendedores trabalhavam ao mesmo tempo. Quem sabe poderia ser uma solução.

Link to comment
Share on other sites

João,

uma dica que peguei em algum fórum, foi esta:

#define  HKEY_LOCAL_MACHINE      2147483650
#include "FiveWin.ch"

Function Main()

   local oReg

   oReg := TReg32():New( HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters" )

   oReg:Set("EnableOplocks", "00000000")

   oReg:Set("CachedOpenLimit", "00000000")

   oReg:Set("Autodisconnect", "ffffffff")

   oReg:Set("EnableOplockForceClose", "00000001")

   oReg:Set("MaxKeepSearch", "000000b4")

   oReg:Set("MinKeepSearch", "0000000a")

   oReg:Set("ScavTimeout", "0000000a")

   oReg:Set("ThreadPriority", "00000002")

   oReg:Close()

      If MsgYesNo("É Necessário Reiniciar o Computador"+CRLF+"Deseja Reiniciar Agora?","Reiniciar")
           oWndMain:End()
         WinExec( "ShutDown -s" )
   End

RETURN NIL

Só que o usuário tem que executar como adm em cada terminal, mas muitos não fazem.

Fladimir,

a explicação que encontrei foi esta:

Estes problemas de corromper os dados ou não gravar as informações estão relacionados com "Opportunistic
Locking" que são funções de otimização de acesso a dados introduzidas no
Windows e que não funcionam com programas de bancos de dados real-time,
inclusive dando problemas no Access da própria Microsoft. O problema todo é
que as beldades da Microsoft configuraram a instalação padrão do
Windows com o tal de "Opportunistic Locking" ligado e você é que tem que se
virar para desligar.


Detalhes aqui: http://support.microsoft.com/kb/296264/en-us

Link to comment
Share on other sites

Fladimir, no meu caso resolveu 100%, tenho cliente com um volume grande de venda/dia e desde agosto/2013 não faz indexação, alias, a verdade é que qdo corrompe é pq estamos fazendo algo de errado e não é o dbf, as uns dois anos fiz uma conversão de DOS para FWH e acredite tudo em NTX e o tempo que trabalhei com a base de dados já vinha sem indexar e o tempo que fiz a conversão (2 anos) não indexou nem um momento isso trabalhando com clipper e xharbour até terminar toda a conversão e antes que perguntem: 40 maquinas, portanto, dizem que dbf é isso é aquilo que sql é o melhor e bla bla bla, claro, qdo se passa para sql se cria regras impostas pelo sgbd, ainda estou estudando mas é isso que entendi se estiver errado me corrigem, portanto precisamos criar tb nossas regras de entrada, saída, alteração e exclusão no dbf. minha opnião, não quero debater quem está errado quem esta certo, o que vejo é que depois que modifiquei a forma de programar parou os defeitos.

Link to comment
Share on other sites

Já foi perguntado, mas volto a perguntar.

1 - RDD de arquivos/índices como/onde estão as chamadas.

2 - Como é o processo de abertura e em qual momento de Arquivos/indices

3 - Na inclusão, como esta pegando o próximo numero sequencial.

4 - Mostrar parte do processo de inclusão. (inicio/append)

5 - Mostrar a estrutura da tabela.

Só por curiosidade, qual a quantidade de registros.

Link to comment
Share on other sites

O tópico não é de minha autoria, mas estou gostando muito, pq apesar de ter algumas coisas em SQL meu maior sistema esta todo em DBF e fico beirando a conversão mas com as exigências do Governo a nivel de implementações fiscias (PAF, TEF, SPED, NF-e, NFC-e etc) não consigo migrar, pq sou apenas eu de programador, quem sabe com essas dicas consigo dar uma sobrevida ao meu sistema e não ter q ficar indexando diariamente e dando mais uma respirada.

Vlw Galera, obrigado pelas dicas, vou testar e ver no q dá.

[]´s

Link to comment
Share on other sites

e mais com o dbinfo() e mais algumas dicas do tópico o sistema voltou a ficar rápido, ou seja, sempre ficam empurrando coisa nova, sendo que a "velha" ainda "gueeeeenta" rsrsrsrssrsrsrs, mas que venha o SQL.

Como é que usa este DbInfo() tenho visto no topico mas não entendi nada..... se puder exemplificar agradeço.... Muito obgdão, fk com DEUS

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...