Jump to content
Fivewin Brasil

Jmsilva

Membros
  • Posts

    718
  • Joined

  • Last visited

  • Days Won

    14

Everything posted by Jmsilva

  1. Não falta a prev32.dll no cliente, ou pode estar bloqueada pelo Windows ????
  2. Jovem, se entendi o processo e o padrão de ler um arquivo dbf, provalmente vc usa rdd sixcdx ou outra QQ que trabalha padrão foxpro. Use arquivo alias temp New Para gravar num TXT Nhandle = Fopen(file.txt") FWrite( nHandle,temp->Memo) FClose( nHandle ) Se não ajudou, mande mais detalhes, exemplo da rotina que vc usa.... Você ler o dbf e gravar um banco SQL, sem a necessidade de gerar TXT, tem um vários exemplos no fórum.
  3. Valeu amigo, mas não é o caso! Estava tendo aumentar a velocidade de carregamento do arquivo temp, utilizando algum método do do xBrowse, mas do jeito que está esta ótimo, faço a carga antes de do focu do xBrowse. Para entendimento, eu crio dois objeto xBrowse, um para cada página do FOLDEREX, na propriedade init do folder, faço carregamento e o refresh do browse. Como disse o BROWSE tem a ::bInit que passa somente quando cria, tentei usar ::bWhen não foi vantajoso pq passa mais de uma vez, vi o ::GoFocus() mas não virou. Valeu !
  4. No xBrowse tem método ::bInit, pelo que vi ele é executado uma única vez quando cria, Certo ? Considerando a CRIAÇÃO prévia do xBrowse. Gostaria de saber se existe algum método que é acionado todas as vezes que o xbrowse recebe e perde o FOCO, além bWhen e bValid?
  5. Em linguagem como Java por exemplo, uma variável declarada do tipo String se transforma em um objeto, como no exemplo que segue: String txt = "Hello World"; System.out.println(txt.toUpperCase()); // Outputs "HELLO WORLD" System.out.println(txt.toLowerCase()); // Outputs "hello world" No xHarbour/Harbour podemos fazer melhor, mas vou demostrar forma nativa, não conheço todos os métodos/eventos, estou pesquisando. É possível utilizar em qq tipo de variável, e podemos fazer melhor que o Java, que necessita declarar no escopo o TIPO, no nosso velho (x)Harbour, as propriedades são em consequência ao valtype() do CONTEÚDO da variável. O comando mágico para esta façanha é: ENABLE TYPE CLASS ALL Veja exemplo nativo com manipulação de uma variável do tipo Array: ENABLE TYPE CLASS ARRAY aVar := {} //Modo tradicional aVar:Init(3,Array(2)) //aVar := Array(3,2) aVar:AtPut(1,{"001", "Maça"} ) //aVar[1,{"001", "Maça"} ) aVar:AtPut(2,{"002", "Pera"} ) //aVar[2,{"002", "Pera"} ) aVar:AtPut(3,{"003", "Uva"} ) //aVar[3,{"003", "Uva"} ) aVar:InsertAt(4,{"004","Morango"}) //AADD(aVar,{"004", "Morango"} ) XBrowse(aVar ) //xBrowse(aVar) Dica do dia!
  6. Evandro, Obrigado! Pela Fivewin com função Maria_Connect() consigo conectar sem problemas! Para o teste que estou fazendo precisava conectar com SQLDriverConnect() (odbc fivewin) ! No Server 2008 R2 conecta sem problemas, só não estou conseguindo conectar desta mesma forma no MariaDB. Acredito que o problema está no fonte ODBC, mas não consegui identificar!
  7. // Via SQLRDD - MariaDB - ODBC - Não Funciona cDsn:= "DRIVER={MariaDB ODBC 3.1 Driver}; SERVER=localhost; DATABASE=dbsace; Uid=root; Pwd=" nCnn := SR_AddConnection(CONNECT_ODBC,cDSN ) Via SQLRDD - MariaDB - Nativo - Funciona cDsn:= "DRIVER={MariaDB ODBC 3.1 Driver}; SERVER=localhost; DATABASE=dbsace; Uid=root; Pwd=" nCnn := SR_AddConnection(CONNECT_MYSQL,cDSN )
  8. Gostaria de conectar no banco MariaDB via ODBC, via Todbc (Odbc Fivewin) ou via SQLRDD (CONNECT_ODBC) e não estou conseguindo. A conexão com MariaDB tem que ser via ODBC, de outras formas consigo fazer normalmente. Já instalei e desinstalei varias vezes a fonte odbc, //Via ODBC da Fivewin - Server 2008 R2 - Funciona cDsn := "driver=SQL Server;server=OROI3\SQLEXPRESS; Database=dbsace;" oOdbc := TOdbc():New(cDsn,'sa','') //Via ODBC da Fivewin - MariaDB 10.3.16 - Não funciona cDsn := "DRIVER={MariaDB ODBC 3.1 Driver}; Server=127.0.0.1; Port=3306; Database=DBSACE" oOdbc := TOdbc():New(cDsn,'root','') Via SQLRDD - SERVER 2008 R2 - ODBC - Funciona cDsn := "driver=SQL Server;server=OROI3\SQLEXPRESS; Database=dbsace; Uid=sa; Pwd=;" nCnn := SR_AddConnection(CONNECT_ODBC,cDSN ) Via SQLRDD - MariaDB - ODBC - Não Funciona cDsn:= "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; DATABASE=dbsace; Uid=root; Pwd=" nCnn := SR_AddConnection(CONNECT_ODBC,cDSN ) Via SQLRDD - MariaDB - Nativo - Funciona cDsn:= "DRIVER={MySQL ODBC 3.51 Driver}; SERVER=localhost; DATABASE=dbsace; Uid=root; Pwd=" nCnn := SR_AddConnection(CONNECT_MYSQL,cDSN )
  9. Boas práticas = Uma ajuda sem ninguém pedir Olá pessoal, sei que este espaço se presta para ajuda direcionada a um objetivo específico, erro ou dúvidas. Pois bem, sabemos que outras linguagens existem materiais farto na internet, já xHarbour resume-se aos fóruns e nas documentações própria. Com o conhecimento de outras linguagens como o JAVA, por exemplo, vejo que temos algumas facilidades em determinado pontos e perdemos em outros. Mas com a expertise do dia-a-dia, sempre descobri mos técnicas do xHarbour que não vejo nos fóruns, e nem nos exemplos disponíveis GitHub, Google e etc. A minha sugestão em boas práticas, refere-se à codificação, boas praticas em programar, não estou falando de regras de negócios, cada um ou cada empresa tem a sua que é a base do seu sistema. Aqui nos temos grandes programadores, diria os melhores, acredito que cada um tem algo a compartilhar, como uma rotina genérica, forma manipular um objeto e etc. Posso citar como exemplo a TCalc, uma classe que desenvolvi tempos atrás, serve para gerar planilhas através LibreOficce está disponível neste fórum. Salvo juízo contrário, cada programador poderia compartilhar aquilo que acha interessante que pudesse ajudar no aprendizado dos demais. Com a ajuda dos demais poderia até acrescentar algo para otimizar e favorecendo o próprio autor ou apenas servir de material didático para os demais. Como ponta pé inicial, gostaria de apresentar uma forma que acho legal para definição de variáveis. Hipoteticamente, vamos imagina um sistema que tem 3 dbfs, Médico, Paciente e Agenda de consultas: #include "hbstruct.ch" //include obrigatório REQUEST HB_GT_WIN_DEFAULT //Definição de 3 objetos , um para cada tabela Static oMed,oPac,oAgenda //pode ser local private, publica – prefiro statica de PRG, assim //posso usar em métodos e funções sem a necessidade de enviar como parâmetro, para rotina //de outros prg, a sim precisa enviar via parâmetro. Procedure Main() STRUCTURE oMed //variaveis para tabela de médicos MEMBER cCrm AS STRING INIT Space(6) MEMBER cNome AS STRING INIT Space(20) ENDSTRUCTURE STRUCTURE oPac //variaveis para tabela de pacientes MEMBER cCpf AS STRING INIT Space(11) MEMBER cNome AS STRING INIT Space(20) MEMBER dDtNasc AS DATE INIT CTOD('') ENDSTRUCTURE STRUCTURE oAgenda //variaveis para tabela de agendamento de consulta MEMBER cCrm AS STRING INIT Space(6) MEMBER cCpf AS STRING INIT Space(11) MEMBER dDtConsulta AS DATE INIT CTOD('') ENDSTRUCTURE //gets e says e gravações Return
  10. Jmsilva

    array

    Use as funções asave() e aread() da fivewin.
  11. #include "FiveWin.ch" function Main() local oDlg, cTest := "Hello world! " DEFINE DIALOG oDlg TITLE "I am a DialogBox" COLOR "W+/B" @ 1, 3 GET cTest @ 3, 5 BUTTON "&Teste" SIZE 40, 12 ; ACTION test() DEFAULT @ 3, 16 BUTTON "&Sair" SIZE 40, 12 ACTION oDlg:End() ACTIVATE DIALOG oDlg CENTERED ; VALID MsgYesNo( "Do you want to end ?" ) return nil function Test() local oDlg, cTest := "Teste nowiant " DEFINE DIALOG oDlg TITLE "Teste 2" COLOR "W+/gr" @ 1, 3 say cTest OF oDlg COLOR ("N/W") ACTIVATE DIALOG oDlg CENTERED NOWAIT SYSWAIT(2) oDlg:END() return nil
  12. Emotta, li não vejo problemas nas duas soluções que apresentei, vai atender ele sem problemas. No dBase não tem remédio, com SQL a história é outra. Não consegui entender a solução apresentada por ele. Nesta última que apresentei precisa ajustar uns detalhes, fiz testes não funcionou 100 % no Maria dB. Tem quer ajustar hiderecno e salvar o Sr_recno ao invés de recno(). Vou postar mais tarde. O que percebi foi comportamento diferenciado no uso sqlrdd em relação ao tipo de banco. Uns somente o dbapend e o commit funciona bem caso sqlserver, já no Maria dB tem start transaction para que o dado fidelize no banco e seja visto instantaneamente por outra estação. São ajustes que devem ser testados conforme o banco usado. Valeu! Não servir prá ele serve como aprendizado.
  13. Caro Narlem, depois tudo isso, se não quiser fazer grandes alterações nas rotinas, poderá optar, em cria campo "codigo" tipo "C" ou "N", após dbappend() gravar recno() fica assim: * 1 2 3 4 5 6 7 8 9 10 aadd(wstruct, {"codigo" ,"C" ,06 ,0}) aadd(wstruct, {"nome" ,"C" ,40 ,0}) dbCreate( "teste_dbf" , wstruct, "SQLRDD" ) SR_SetHideRecno(.F.) //exibe a coluna sr_recno no alias Use "teste_dbf" //abrir //Gravação SR_BeginTransaction() DBAppend() //neste momento campo sr_recno já está com o valor incrementado de forma automática pela RDD replace nome with "bla bla bla" DBCcommit() replace codigo with strzero(sr_recno,6) SR_CommitTransaction() Devidamente testado. Lembrado que o autoincrement pode ser configurado à critério ALTER TABLE `teste_dbf` AUTO_INCREMENT = 150;
  14. Cometi uns pequenos lapsos na mensagem acima,veja: 1 - A função SR_RecnoName("codigo") tem que estar antes da criação da tabela. SR_RecnoName("codigo") aadd(wstruct, {"nome" ,"C" ,40 ,0}) dbCreate( "teste_dbf" , wstruct, "SQLRDD" ) 2- A função SR_SetHideRecno( .f.) tem que estar antes da dbusearea() - antes de abrir o arquivo SR_SetHideRecno( .F.) Use "teste_dbf" //via sqlrdd xbrowse() //Neste caso exibe a coluna "codigo" SR_SetHideRecno( .T.) Use "teste_dbf" //via sqlrdd xbrowse() //Se verdadeiro a coluna "codigo" será ocultada. Desculpe-me o equívoco!
  15. Se quiser incrementar a rotina hb_zipfile() e sair for msgrun(), vai uma sugestão: STATIC FUNCTION fw_ziper4() LOCAL oDlg,oMeter,oText,cMsg,nActual Local lOkZip Local cFolderTargetZip := "C:\temp\test.zip" Local aFiles:={} AEval(Directory("c:\temp\*.dbf"),{|x| AAdd(aFiles,"c:\temp\"+x[1])}) FErase(cFolderTargetZip) DEFINE DIALOG oDlg FROM 1, 1 TO 10, 60 TITLE "Espere comprimindo arquivos" @ 0.5, 2 SAY oText VAR cMsg SIZE 180, 20 OF oDlg @ 2, 2 METER oMeter VAR nActual TOTAL 100 OF oDlg SIZE 200, 20 oDlg:bStart:={||; lOkZip := Hb_ZIPFILE(cFolderTargetZip,; aFiles,; 9,; {|cFile| oText:SetText(cFile)},; .t.,; "12345",; nil,; nil,; {|nPos,nCur| nActual := (nPos/nCur*100),oMeter:Set(nActual)}),; oDlg:End()} ACTIVATE DIALOG oDlg ON INIT self:Center(oWnd) If lOkZip MsgInfo("ok") Else MsgStop("erro") Endif RETURN lOkZip
  16. Olá Ribeiro, tenho algumas alternativas, veja esta te atende, mudança do cursor. Function fw_ziper1() Local lOkZip Local cFolderTargetZip := "C:\temp\test.zip" Local acFiles := "C:\temp\TeamViewer_Setup.exe" Local bOnZipFile := {|| CursorWait()} MsgRun("Atenção: O Sistema não travou! Essa rotina demorará por causa do tamanho do seu banco de dados. Aguarde até a conclusão.",,{ || ; lOkZip := hb_ZipFile( cFolderTargetZip ,; // ZipFile (nome do zip) acFiles ,; // File to Compress, pode ser array 9 ,; // Nivel de compressão bOnZipFile ,; // Codeblock a executar enquanto comprime .t. ,; // Overwrite "12345" ,; // Password nil ,; // Armazena caminho (PATH) NIL ) }) // Codeblock para file progress CursorArrow() Return nil
  17. Olá Narlem, para fazer o que vc quer usando a SQLRDD, é assim: Você cria a tabela sem a coluna "codigo", no seu exemplo fica assim: aadd(wstruct, {"nome" ,"C" ,40 ,0}) dbCreate( "teste_dbf" , wstruct, "SQLRDD" ) Após criado o dbf (tabela), vc faz as seguintes alterações: SR_SetHideRecno( .F. ) //o Default é .T. SR_RecnoName("codigo") Pronto que vc postou já está resolvido. Simples assim! vamos aos porques? Na realidade quando se cria uma tabela via SQLRDD através da função dbcreate(), será criado a coluna "SR_RECNO" como auto AUTOINCREMENT nativamente para qualquer tipo de servidor, mas sabiamente a SQLRDD permite ao programador ajustar o nome desta coluna, uma vez, que em um banco SQL permite apenas uma coluna com o parâmetro AUTOINCREMENT para cada tabela, MOTIVO PELO QUAL APRESENTA O ERRO MENCIONADO. Agora vamos para código: Use "teste_dbf" //via sqlrdd SR_SetHideRecno( .f.) xbrowse() //Neste caso exibe a coluna "codigo" SR_SetHideRecno( .T.) xbrowse() //Se verdadeiro a coluna "codigo" será ocultada. E por fim, para resolver o seu problema do incremente ser a partir de 50.000, você ajusta o seu banco com seguinte comando SQL: ALTER TABLE `teste_dbf` AUTO_INCREMENT = 50000; Espero que te ajude abraço
  18. Parece ser uma ótima solução ! http://wiki.fivetechsoft.com/doku.php?id=fivewin_class_tdockpnel
  19. http://forums.fivetechsupport.com/viewtopic.php?f=16&t=37265&start=0 - nova versão! ORM Lançado a 1ª versão do ORM, em desenvolvimento. Suporta dbase, foxpro, msaccess, mssql, mysql, oracle com o ADO e mysql com o ADO, Dolphin and FWMariaLib. - Classe ORM_Connection Sintaxe: - oConnection: = ORM_Connection (): Novo (rdbms, servidor, banco de dados, usuário, senha) onde rdbms podem ser mysql, mssql, oracle, etc para ADO ou dolphin / fwmariadb para mysql com essas bibliotecas // OR // - oConnection: = ORM_Connection (): Novo (oAdoConn (ou) oDolphinServ (ou) oFwCon) Métodos: Novo() Tabelas () // lista de tabelas HasTable (cTable) -> lExists Tabela (cTable) -> Objeto ORM_Table Perto() - Classe ORM_Table () O objeto Table pode ser instanciado por chamada oTable: = oConnection: Table (cTableName) ou oTable: = ORM_Table (): Novo (oConnection, cTableName) Métodos: Navegação: Primeiro (), Último (), Próximo (), Anterior (), Mover (n), Mover para (n) Outras: Selecione (aFields) Onde (campo, [coperador], valor) OrderBy (campo) Get ([campo]) XBrowse ([fieldlist]) Editar() Soma (campo), Max (campo), Min (campo), Avg (campo) GroupBy (campos) Find (primarykeyval) ou Find (campo, valor) http://wiki.fivetechsoft.com/doku.php?id=fivewin_class_tdockpnel
  20. xHarbour -> rtl.lib e no HB -> hbrtl.lib
  21. Para criar um ambiente de teste, baixe e instale xamp. https://www.apachefriends.org/pt_br/index.html. Depois de instalado e só ativar os serviços desejado. No caso o Apache.
  22. Pelos testes que fiz, obedece a ordem colocado no Pelles, não consegui fazer a mudança via código. No Pelles tem que colocar a imagem primeiro e depois os label, texto, combo, etc
  23. Meus sentimentos a família! Deus conforte a todos!
×
×
  • Create New...