Jump to content
Fivewin Brasil

Yury

Membros
  • Posts

    873
  • Joined

  • Last visited

  • Days Won

    1

Everything posted by Yury

  1. Olá veja no HELP do FW a função "GetProc32" lá no HELP estão descritos os tipos de variáveis, bem como os parâmetros e para que os mesmos servem na verdade quando vc usa o comando "DLL32 FUNCTION..." internamente o FW traduz o comando para que essa função seja utilizada (veja em DLL.CH) abraço
  2. Olá Não sei bem oq é o RPV, mas se ele utiliza a TPrinter, tem como vc alterar a classe para testar se a impressora selecionada é a impressora virtual para PDF ; se for essa impressora vc desabilita o preview veja abaixo o método NEW da TPrinter com a alteração (está escrito "aqui vc testa..."), analise e se achar q te serve aplique a alteração na sua classe TPrinter ; pode haver variação entre o código do método abaixo devido a versões diferentes no meu caso, como utilizo a PDF995 para gerar os pdfs, está testando PDF995, no seu caso deve alterar para o nome da impressora que usa, no caso PDFCREATOR METHOD New( cDocument, lUser, lMeta, cModel, lModal, lSelection ) CLASS TPrinter local aOffset local cPrinter DEFAULT cDocument := "FiveWin Report" ,; lUser := .f., lMeta := .f., lModal := .f., lSelection := .f. if lUser ::hDC := GetPrintDC( GetActiveWindow(), lSelection, PrnGetPagNums() ) if ::hDC != 0 cModel = ::GetModel() + "," + ::GetDriver() + "," + ::GetPort() endif elseif cModel == nil ::hDC := GetPrintDefault( GetActiveWindow() ) if ::hDC != 0 cModel = ::GetModel() + "," + ::GetDriver() + "," + ::GetPort() endif else cPrinter := GetProfString( "windows", "device" , "" ) WriteProfString( "windows", "device", cModel ) SysRefresh() PrinterInit() ::hDC := GetPrintDefault( GetActiveWindow() ) SysRefresh() WriteProfString( "windows", "device", cPrinter ) endif if ::hDC != 0 aOffset = PrnOffset( ::hDC ) ::nXOffset = aOffset[ 1 ] ::nYOffset = aOffset[ 2 ] ::nOrient = ::GetOrientation() elseif ComDlgXErr() != 0 MsgStop( "There are no printers installed!" + CRLF + ; "Please exit this application and install a printer." ) ::nXOffset = 0 ::nYOffset = 0 else ::nXOffset = 0 ::nYOffset = 0 ::nOrient = DMORIENT_PORTRAIT endif ::cDocument = cDocument ::cModel = cModel ::nPage = 0 ::nPad = 0 ::lMeta = lMeta ::lStarted = .F. ::lModified = .F. ::lPrvModal = lModal // aqui vc testa o modelo da impressora, se for a sua impressora // virtual para PDF vc "remove" o preview, enviando direto para impressão IF ::hDC != 0 IF 'PDF995' $ cModel ::lMeta := .F. lMeta := .F. ENDIF ENDIF if !lMeta ::hDcOut = ::hDC else ::aMeta = {} ::cDir = GetEnv( "TEMP" ) if Empty( ::cDir ) ::cDir = GetEnv( "TMP" ) endif if Right( ::cDir, 1 ) == "\" ::cDir = SubStr( ::cDir, 1, Len( ::cDir ) - 1 ) endif if ! Empty( ::cDir ) if ! lIsDir( ::cDir ) ::cDir = GetWinDir() endif else ::cDir := GetWinDir() endif endif return Self
  3. Olá creio q é melhor utilizar a classe diretamente, nestes casos é melhor que o comando nRow:=1 nCol:=10 for n:=1 to 20 xObj := 'oGet'+alltrim(str(n)) cMasc := '999,999' bValid := {|| .T.} bSetGet := { | u | If( PCount()==0, nValor, nValor := u ) } &(xObj) := TGet():New(nRow, nCol, bSetGet, oDlg, nil, nil, cMasc, bValid) nRow++ next
  4. Olá vc está compilando com Clipper ou xHarbour ? se xHarbour, indique a versão abraço
  5. Yury

    CLEAR GETS

    //------------------------------------------------------------------- METHOD AEvalWhen(lDisableAll) CLASS TWindow local n local aControls := ::aControls default lDisableAll:=.F. if aControls != nil .and. ! Empty( aControls ) for n = 1 to Len( aControls ) if aControls[ n ] != nil .and. aControls[ n ]:bWhen != nil if lDisableAll ::aControls[ n ]:Disable() else if Eval( aControls[ n ]:bWhen ) ::aControls[ n ]:Enable() // keep this as :: else ::aControls[ n ]:Disable() // keep this as :: endif endif endif next endif return nil //------------------------------------------------------------------- Olá, vc pode modificar a sua classe TWindow, método AevalWhen para fazer isso basta chamar oDlg:AevalWhen(.T.) para desabilitar tudo Abraço
  6. olá José Carlos caso precise utilizar outras propriedades / métodos do componente ADODB, no link abaixo tem uma documentação bem simples: www.w3schools.com/ado/met_rs_save.asp abraço
  7. Yury

    SQLLib

    olá Sérgio eu também uso desta forma que vc apresentou: 1 - SQLExecute(conexão_bd,Comando), 2 - Após qualquer envio de dados ao BD, SqlExecute(conexão,"COMMIT") acho só q vc inverteu o parâmetro da sqlexecute, é o comando primeiro e a conexão depois vc usa tabela Innodb ou MyISAM ? pq na MyISAM esse comportamento não ocorre, pois nela não há controle transacional sobre a dll vou dar uma conferida, vc tem razão quanto a versão do bd , tem que utilizar a compatível abraço
  8. Yury

    SQLLib

    Olá Sérgio sim, o correto é fazer após gravar , com certeza UPDATE COMMIT INSERT COMMIT DELETE COMMIT mas se acompanhar o tópico desde o início verá q oq está sendo discutido é q um select realizado em uma estação (estação A) não está retornando as atualizações realizadas por outra estação (estação B ) , sendo q esta outra estação fez o update e o commit ; só está enxergando as alterações após abandonar o programa e logar de novo na verdade a gambiarra q eu mencionei é a estação A fazer um commit antes de fazer o select , por isso é gambiarra, pois quem fez o update foi a estação B (com commit) abraço
  9. Yury

    SQLLib

    Olá um sqlexecute("COMMIT") antes do select "resolve" o problema, dessa forma as informações atualizadas pelos outras conexões são apresentadas mas é gambiarra, não recomendo abraço
  10. Yury

    SQLLib

    Olá fiz testes isoladamente um programa FW que somente faz um select em colunas de uma tabela e fiz o UPDATE em outra janela pelo sql front ; após fazer o UPDATE na coluna e refazer o select no programa FW a informação foi atualizada, ou seja, funciona OK, como deveria mas se neste mesmo programa FW eu colocar um comando para fazer UPDATE ou INSERT (um sqlexecute qualquer) e depois desse comando eu tentar repetir a operação inicial (alterar pelo sql front e carregar pelo programa) não funciona mais, ou seja, as informações do select aparecem desatualizadas sendo assim eu constatei que em tabelas Innodb há algum bug na SQLLIB ; algum mecanismo que no primeiro INSERT/UPDATE da conexão abre um transação e somente encerra quando eu faço um CLOSE, desta forma tudo que é alterado/inserido em outras conexões não é enxergado (pelo menos até que se faça um CLOSE, por isso o pessoal fala "sair do sistema e entrar novamente") em tabelas MyISAM não ocorre isso, creio q pelo fato da mesma não possuir controle transacional o problema é que não creio ser possível corrigir isso, pois a SQLLIB foi descontinuada caso obtenha mais informações eu reportarei neste tópico abraço
  11. Yury

    SQLLib

    #include "FiveWin.ch" #include "SqlLib.ch" Function Test() While .T. cQuery:='SELECT * FROM tabela_macs' USE SQL cQuery ALIAS TEMP NEW VIA "MySQL" SELECT TEMP DBGOTOP() BROWSE() CLOSE TEMP IF MSGYESNO('Deseja abandonar ?') EXIT ENDIF enddo return neste caso era para o commit resolver... bom, vc pode fazer um teste: coloque a rotina acima em um programa qualquer do seu sistema, substitua "tabela_macs" por uma tabela existente no seu bd chame o programa com esta rotina ; faça um update direto no bd pelo front (ou outro programa client q vc usa) em uma das colunas da tabela e recarregue o browse, abandonando e respondendo "Deseja abandonar" com NÃO ; veja se exibe a informação atualizada depois faça o mesmo teste alterando a informação por outro terminal, mas por um programa do sistema abraço
  12. Yury

    SQLLib

    Olá, faltou dizer se está refazendo a query um botão 'Atualizar Dados' por exemplo abraço
  13. Olá creio q com xBrowse é possível, basta colocar CRLF para quebrar a linha e o grid já ficará com linha dupla abraço
  14. Olá Caso vc queira continuar usando o DBU basta recompilar com xHarbour console Se estiver compilando com xDev, é a opção "Harbour 32 Bits & Bcc / MInGW" Desta forma ele vai rodar em Win 64 abraço
  15. Yury

    SQLLib

    olá lembre-se q diferentemente do DBF vc não está utilizando "ponteiro" , ou seja, toda informação que os programas estão exibindo já foi coletada do banco de dados pelas querys, então é sempre "passado" para obter a informação atualizada vc tem que refazer a query, caso contrário não vai exibir, diferentemente do DBF agora se vc já estiver refazendo a query e não estiver exibindo a informação atualizada: verifique se suas tabelas são Innodb, se sim, deve fazer um commit após o sqlexecute() abraço
  16. Olá provavelmente vc vai revisar seu código e descobrir que não há nada errado... claro que podem haver otimizações a serem feitas, ordscope no lugar de setfilter é uma delas mas o problema real é o DBF (sem ADS) em rede, o desempenho fica comprometido... quando vc roda os programas em somente um terminal vai rápido que é uma beleza, mas a partir do momento que mais terminais acessam os mesmos arquivos o desempenho cai infelizmente as soluções são as que já foram apresentadas no post: - manter em DBF e utilizar ADS, obtenha mais informações sobre como fazer isso, pois não domino o assunto - alterar a base de dados para MySql e utilizar um conector de terceiros, SQLLIB ou SQLRDD, para fazer a manipulação das tabelas ; vou falar sobre a SQLLIB, que é qual eu utilizo: vc pode manter o código do seus programas 99,99 % igual e migrar para MySQL , oq vai fazer a performance melhorar bastante ; são necessárias algumas mudanças relacionadas à rotina de conexão ao banco e alguns índices que terá que mudar (não pode usar DESCEND na chave, por exemplo), mas são questões plenamente contornáveis ; o grande problema da SQLLIB é que a mesma foi descontinuada (infelizmente) então não sei como está atualmente para obtê-la, licença, coisa e tal estou falando desta mudança pra vc pois eu estava enfrentando este mesmo problema em alguns clientes, reclamação de lentidão, em um momento fica rápido, depois cai a performance conforme mais operadores vão utilizando, etc... verifiquei todas as possibilidades de otimizar em DBF, melhorar o desempenho, tudo que tentei foi paliativo, com ganhos mínimos de performance sem falar que o cliente chamava os técnicos de rede para ver se havia algum problema de hardware e os mesmos constatavam que tudo estava ok e quando os mesmos viam que o sistema rodava em DBF diziam na cara dura que o problema era esse, que é tecnologia ultrapassada, bom, vc sabem bem como é essa história... então basicamente oq eu fiz para resolver este problema de lentidão foi compilar o sistema (mesmo código) com o rdd da SQLLIB e a performance melhorou bastante, além de todas as vantagens de trabalhar com o BD abraço Yury
  17. //----------------------------------------------------------------------------// METHOD HitTest( nRow, nCol ) CLASS TTreeView local hItem hItem := TVHitTest( ::hWnd, nRow, nCol ) If hItem > 0 return ::GetItem( hItem ) Endif return nil //----------------------------------------------------------------------------// veja o código do método HitTest acima se não é um item do objeto retorna NIL, logo basta vc testar o retorno do método ; se clicou "fora" será NIL, caso contrário clicou em um elemento da treeview Abraço
  18. // ler o conteúdo do PDF, salvar em um campo MEMO e apagar o PDF cPath := 'c:\temp\Pedido.pdf' cTemp := 'c:\temp\temp001.tmp' FMimeEnc(cPath,cTemp) cMemo:=memoread(cTemp) cMemo:=STRTRAN(cMemo,CRLF,'') REPLACE temp->mImag with cMemo ferase(cTemp) ferase(cPath) // ler o conteúdo do campo MEMO e salvar novamente no PDF cMemo := temp->mImag cTemp := 'c:\temp\temp002.tmp' cPath := 'c:\temp\Pedido.pdf' MEMOWRIT(cTemp,cMemo) FMimeDec(cTemp,cPath) ferase(cTemp) abraço Yury
  19. LOCAL cFontBC:="3OF9_NEW.TTF" AddFontResource(cFontBC) DEFINE FONT oFontBC NAME "3 of 9 Barcode" SIZE -54,-68 OF oPrinter oPrinter:CmSay(nLin,nCol,"*"+STRZERO(nLoteInterno,10)+"*",oFontBC,NIL,CLR_BLACK,NIL,NIL) vc precisa de uma fonte para código de barras, no exemplo acima estou usando a "3 de 9" ... na internet há vários repositórios, de vários tipos, para todas as necessidades o AddFontResource adiciona a fonte no Windows DEFINE FONT para criar o objeto TFont associado ao objeto TPrinter para imprimir na coordenada desejada utilize a fonte como parâmetro para o CmSay do TPrinter observação: no caso desta fonte do exemplo acima é necessário iniciar e finalizar os caracteres do código de barras com astericos ( * ) ; outra coisa q vc deve observar é que determinados tipos de fontes para códigos de barras somente aceitam números, outros aceitam quaisquer caracteres, alguns deles tem uma quantidade de caracteres determinada, ou seja, vai variar de fonte para fonte abraço
  20. boa tarde pessoal testei o WinExec e ShellExecute com Win 8 e Win 7, ambos 64 bits e funcionou ok, 100 % vejam: cComand:='RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8' nRet:=WinExec(cComand) ? nRet cArquivo:='Teste.TXT' cComand:='Notepad '+cArquivo nRet:=WinExec(cComand) ? nRet cComand:='www.google.com.br' nRet:=ShellExecute(GetActiveWindow(),"open",'"'+cComand+'"') ? nRet será q existe mesmo essa limitação ? abraço Yury xHB build 1.1.0 (SimpLex) & BCC 5.5.1 & FW 8.01
  21. Olá Eric nos testes que realizei usei um DBF com 7000 registros sobre as dicas q vc postou sobre quantidade de arquivos nas pastas, abrir com READONLY e executar o programa sem mais "nada" aberto eu já tentei fazer essas modificações, mas não surtiu efeito (na verdade li um post seu no Clipper On Line, se não me engano, onde tinha essas dicas) sobre executar como adm, vou testar obrigado pela atenção abraço Yury
  22. obrigado pela dica Eduardo vou testar e posto aqui o resultado att Yury
  23. Yury

    Xdev

    olá tente o seguinte: no atalho da xDev clique com o botão direito e vá em propriedades ; aba 'Compatibilidade' , marque o checkbox "Desativar temas visuais" caso não funcione, um fato q ocorreu comigo: há alguns dias, após eu instalar o Office 2010 na minha máquina a xDev passou a se comportar conforme vc descreveu... compila alguns programas e depois pára e exibe uma mensagem avisando que será encerrada... não gera o EXE tentei várias opções: executar como adm, modo compatibilidade, desinstalei e instalei de novo e nada... então desinstalei o Office 2010 e voltou a funcionar como estou sem tempo para verificar exatamente oq ocorreu deixei assim por enquanto
  24. tente isso: no activate do dialog coloque: ACTIVATE DIALOG oDlg ON INIT (oDlg:Show(), xSetFocus(oDlg))
  25. olá João esta função é somente um exemplo para testes obrigado Yury
×
×
  • Create New...