JUDSON ROSA Posted June 3, 2014 Report Share Posted June 3, 2014 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ãoultimamente tenho encontrado problema de indexação constante nas rotinas degrande movimento na rede , tipo aquelas onde vários vendedores realizam vendasno balcão , não e sempre mais aqui ali precisamos organizar esse dbf . ja viaqui no fórum algumas formas de gravar no dbf fiz tudo que vi aqui neste fórumna 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 convencidoque o problema não esta no sistema e sim no servidor do cliente pois o mesmo nãoe bem um servidor e além disso estarodando com Windows 7 , pretendo pedir a colocar de Windows server , o que osamigos podem opinar ? Quote Link to comment Share on other sites More sharing options...
kapiaba Posted June 3, 2014 Report Share Posted June 3, 2014 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, Quote Link to comment Share on other sites More sharing options...
joaosolution Posted June 3, 2014 Report Share Posted June 3, 2014 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 Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 3, 2014 Author Report Share Posted June 3, 2014 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. Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 3, 2014 Author Report Share Posted June 3, 2014 Joao meu amigo como falei to tentando converte o meu sistema so que ainda nao deu tempo pq to num outro projeto tambem de conversao de uma sistema que esta em DOS para XHarbour e mysql , por enquanto tenho que arrumar um solucao para este problema obrigado. Quote Link to comment Share on other sites More sharing options...
AprendizFW Posted June 3, 2014 Report Share Posted June 3, 2014 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. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted June 3, 2014 Report Share Posted June 3, 2014 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 Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 3, 2014 Author Report Share Posted June 3, 2014 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 . Quote Link to comment Share on other sites More sharing options...
kapiaba Posted June 3, 2014 Report Share Posted June 3, 2014 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, Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 3, 2014 Author Report Share Posted June 3, 2014 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 ? Quote Link to comment Share on other sites More sharing options...
Theotokos Posted June 3, 2014 Report Share Posted June 3, 2014 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... Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 4, 2014 Author Report Share Posted June 4, 2014 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+ Theotokos 1 Quote Link to comment Share on other sites More sharing options...
aferra Posted June 4, 2014 Report Share Posted June 4, 2014 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. Quote Link to comment Share on other sites More sharing options...
JUDSON ROSA Posted June 4, 2014 Author Report Share Posted June 4, 2014 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. Quote Link to comment Share on other sites More sharing options...
Rogerio Figueira Posted June 4, 2014 Report Share Posted June 4, 2014 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 Quote Link to comment Share on other sites More sharing options...
fladimir Posted June 4, 2014 Report Share Posted June 4, 2014 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 Quote Link to comment Share on other sites More sharing options...
kapiaba Posted June 4, 2014 Report Share Posted June 4, 2014 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. Quote Link to comment Share on other sites More sharing options...
Eroni Posted June 4, 2014 Report Share Posted June 4, 2014 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. Quote Link to comment Share on other sites More sharing options...
Rogerio Figueira Posted June 4, 2014 Report Share Posted June 4, 2014 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 "OpportunisticLocking" que são funções de otimização de acesso a dados introduzidas noWindows 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 doWindows com o tal de "Opportunistic Locking" ligado e você é que tem que sevirar para desligar. Detalhes aqui: http://support.microsoft.com/kb/296264/en-us Quote Link to comment Share on other sites More sharing options...
aferra Posted June 4, 2014 Report Share Posted June 4, 2014 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. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
SAOliveira Posted June 4, 2014 Report Share Posted June 4, 2014 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. Quote Link to comment Share on other sites More sharing options...
fladimir Posted June 4, 2014 Report Share Posted June 4, 2014 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 Quote Link to comment Share on other sites More sharing options...
aferra Posted June 4, 2014 Report Share Posted June 4, 2014 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. kapiaba 1 Quote Link to comment Share on other sites More sharing options...
Theotokos Posted June 4, 2014 Report Share Posted June 4, 2014 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 kapiaba 1 Quote Link to comment Share on other sites More sharing options...
fladimir Posted June 5, 2014 Report Share Posted June 5, 2014 A dica do Kapiaba e do Rogerio a nível de Registro do Windows são diferentes os códigos e produzem o mesmo efeito ou são efeitos diferentes? Esse outro assunto discutido aqui tem algo a ver com as dicas do Kapiaba e do Rogério? []´s 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.