Jump to content
Fivewin Brasil

emotta

Membros
  • Posts

    1,609
  • Joined

  • Last visited

  • Days Won

    88

Everything posted by emotta

  1. emotta

    SQLRDD

    Lombardo está focado na empresa dele OMIE que já é quase um unicórnio (empresa que vale mais de 1 bilhão de dólares). E que eu saiba, o sistema da OMIE tem partes em xharbour e sqlrdd, oriundo do CORE BUILDER. https://revistapegn.globo.com/Startups/noticia/2021/08/omie-capta-r-580-milhoes-em-rodada-serie-c-liderada-pelo-softbank.html
  2. pô Kapi, primeira tenta vc configurar o HBP e se não conseguir posta ai e tento ajudar...
  3. Kapiaba sobre os .RES não sei dizer pq não uso. Sobre o hbmk2 acredito que internamente ele usa o ilink mas seria bom perguntar pro Vailton que é o pai do hbmk2
  4. Compilar em Harbour é bem simples, siga os passos abaixo q não tem erro: Crie uma pasta c:\teste e dentro dela coloque o teste.prg (no código faz um hello word). Crie também um teste2.prg e dentro dele coloque qualquer coisa, isso é só para que no exemplo abaixo vc saiba colocar no script dois prgs, sendo um principal e o outro secundario. Feito isso faça o seguinte: Crie um arquivo chamado c:\teste\teste.hbp e dentro dele coloque abaixo: -lHBCT -lHbWin -lXHb -inc -oc:\teste\teste.exe -d__HARBOURPRO__ -MT c:\teste\teste.prgc:\teste\teste.prg c:\teste\teste2.prg Criado o arquivo teste.hbp crie o arquivo c:\teste\compila.bat com o codigo abaixo: set path=c:\hb30\bin hbmk2 teste.hbp OBS: onde está c:\hb30\bin altere para o local onde está o BIN do seu harbour. Feito isso basta compilar, é muito simples. Abraços
  5. Gilmer, na mosca, era exatamente isso que precisava. Eu preciso disso pois tenho uma VM no azure rodando um programa console que fica em loop. Se pelo painel do azure eu reiniciar a VM eu quero que o programa identifique isso e feche o programa de maneira normal, ou seja, fechando normalmente a conexão com banco de dados e outras coisas. Segue abaixo um exemplo pra simular a situação. No exemplo o programa finaliza de maneira normal se digitar ESC ou se reiniciar/desligar o windows. Pra saber se foi mesmo fechado normal basta ver o arquivo teste.txt que só escreve que foi terminado de maneira normal se tiver saido do laço. Function u_Teste() Local cFile := "c:\teste.txt" While LastKey() # 27 .and. !IsShutDown() MemoWrit(cFile, "terminado forçadamente") Inkey(.1) EndDo MemoWrit(cFile, "terminado de maneira normal") Return #pragma BEGINDUMP #include "windows.h" #include "hbapi.h" #include <stdio.h> #define SM_SHUTTINGDOWN 0x2000 HB_FUNC( ISSHUTDOWN ) { BOOL bRetorno = GetSystemMetrics(SM_SHUTTINGDOWN) != 0;; hb_retl( bRetorno ); } #pragma ENDDUMP
  6. legal Gilmer, vou tentar isso e reporto aqui se tiver sucesso obrigado
  7. Kapiaba, vc não entendeu ainda, eu não quero fazer o shutdown... Eu quero identificar que um shutdown está acontecendo, veja meu código de exemplo é aquilo q preciso resolver. vlwww pela tentativa
  8. ** quando a aplicação é GUI (fivewin por exemplo) isso já acontece automaticamente, na janela da window o botão X (fehcar) é acionado quando o windows está sendo desligado. Já em aplicação console preciso de uma soluçao. Se alguem souber vai me ajudar muito. abraços
  9. Refiz o código do exemplo que montei para ficar mais fácil de entender minha necessidade Function u_Teste() While LastKey() # 27 If IsShutdown() // se o usuário estiver desligando o windows a aplicação sai do laço para que seja finalizado corretamente Exit EndIf ? "Processando rotina" Inkey(1) EndDo ? "Rotina finalizada" Return static Function IsShutdown() Local lShutDown := .f. lShutDown := [AQUI PRECISO DE UMA FUNCAO PARA RETORNAR SE O WINDOWS ESTÁ SENDO DESLIGADO/REINICIADO/LOGOFF] Return lShutDown
  10. Não estou falando de impedir o desligamento, veja no código que meu desejo é identificar que o windows está desligando o computador e com isso a aplicação ser encerrada de maneira correta, ou seja, saindo do laço (while) e finalizando normalmente a rotina, em vez de finalizar abruptamente com o codigo dentro do laço sendo executado. Mas é claro que se faltar luz tudo será desligado de maneira abrupta, mas não é isso que desejo resolver, quero resolver a questão de um desligamento normal. Esses casos excepcionais deixa pra la.
  11. obrigado pela ajuda mas acho q não fui bem claro no que preciso vou explicar melhor: Tenho uma aplicação console que fica em um loop infinito processando tarefas. Preciso identificar que o WINDOWS está sendo desligado e ai eu fechar minha aplicação de maneira suave. Exemplo: Function u_Teste() While !IsShutdown() .and. LastKey() # 27 ? "Processando rotina" Inkey(1) EndDo ? "Rotina finalizada" Return static Function IsShutdown() Local lShutDown := .f. lShutDown := [AQUI PRECISO DE UMA FUNCAO PARA RETORNAR SE O WINDOWS ESTÁ SENDO DESLIGADO/REINICIADO/LOGOFF] Return lShutDown
  12. não é possivel pois o googledrive faz a substituição do arquivo inteiro e não um MERGE dos arquivos...
  13. Estou usando o xHarbour console e quero identificar quando o windows está sendo desligado e com isso finalizar meu programa antes do windows fechar ele forçadamente. Alguem sabe como fazer isso?
  14. tente assim: Tcrlf := chr(13)+chr(10) Taux_API_Arg = '{' Taux_API_Arg += '"path":"/codechain/extrato.pdf",' Taux_API_Arg += '"mode":"add",' Taux_API_Arg += '"autorename":true,' Taux_API_Arg += '"mute":false' Taux_API_Arg += '}' Taux_Arquivo = "C:\Onedrive\fontes\ManagerDropbox\extrato.pdf" Taux_Binario = MemoRead(Taux_Arquivo) Taux_Binario = hb_base64encode(Taux_Binario, Len(Taux_Binario)) oHttp := CreateObject("MSXML2.ServerXMLHTTP.6.0") oHttp:Open("POST", "https://content.dropboxapi.com/2/files/upload", .f.) oHttp:setRequestHeader("Authorization","Bearer " + alltrim(Taux_Token) ) oHttp:setRequestHeader("Content-Type", "application/octet-stream") oHttp:setRequestHeader("Dropbox-API-Arg", Taux_API_Arg ) oHttp:Send(Taux_Binario)
  15. tenta ai cString := MemoRead("boleto.pdf") cBase64 := HB_Base64Encode( cString, Len(cString ) ) O que vc precisa mandar é o conteudo da variavel cBase64 Veja se da certo pra vc
  16. a unica coisa que consigo te ajudar é que o SQLRDD consegue se conectar nele pois está no SQLRDD.CH /* supported RDBMS */ #define SUPPORTED_DATABASES 17 #define SYSTEMID_UNKNOW 0 #define SYSTEMID_ORACLE 1 #define SYSTEMID_MSSQL6 2 #define SYSTEMID_MSSQL7 3 #define SYSTEMID_SQLANY 4 #define SYSTEMID_SYBASE 5 #define SYSTEMID_ACCESS 6 #define SYSTEMID_INGRES 7 #define SYSTEMID_SQLBAS 8 #define SYSTEMID_ADABAS 9 #define SYSTEMID_INFORM 10 #define SYSTEMID_IBMDB2 11 #define SYSTEMID_MYSQL 12 #define SYSTEMID_POSTGR 13 #define SYSTEMID_FIREBR 14 #define SYSTEMID_CACHE 15 #define SYSTEMID_OTERRO 16 #define SYSTEMID_PERVASIVE 17
  17. A titulo de curiosidade Pegue uma planilha em excel no formato XLSX. Renomeie o arquivo colocando extensão .zip. Exemplo: minha_planilha.xlsx => minha_planilha.zip Descompacte o arquivo. Veja que uma planilha no formato xlsx nada mais é do que um conjunto de arquivos XML
  18. // Gerando XML com caracteres de escape //Escape characters in XML // The example demonstrates the effect of HBXML_STYLE_NOESCAPE // when XML code is created. #include "hbXml.ch" PROCEDURE Main LOCAL oXmlDoc, oXmlNode oXmlDoc := TXmlDocument():new( '<?xml version="1.0"?>' ) oXmlNode:= TXmlNode():new( , "text", , [this must be escaped: "'&<>] ) oXmlDoc:oRoot:addBelow( oXmlNode ) ? oXmlDoc:toString() ** output: // <?xml version="1.0"?> // <text>this must be escaped: &quot;&apos;&amp;&lt;&gt;</text> ? oXmlDoc:toString( HBXML_STYLE_NOESCAPE ) ** output: // <?xml version="1.0"?> // <text>this must be escaped: "'&<></text> RETURN
  19. // Exemplo para ler um XML //Reading an XML file // This example uses the Customer.xml file created in the // prevous example and extracts from it the structure definition // for the Customer.dbf file. PROCEDURE Main LOCAL oXmlDoc := TXmlDocument():new() LOCAL oXmlNode, aStruct := {} oXMlDoc:read( Memoread( "customer.xml" ) ) oXmlNode := oXmlDoc:findFirst() ? oXmlNode:cName oXmlNode := oXmlDoc:findFirst( "structure" ) ? oXmlNode:cName oXmlNode := oXmlDoc:findFirst( "field" ) DO WHILE oXmlNode <> NIL // attributes are stored in a hash AAdd( aStruct, { oXmlNode:aAttributes[ "name" ] , ; oXmlNode:aAttributes[ "type" ] , ; Val( oXmlNode:aAttributes[ "len" ] ), ; Val( oXmlNode:aAttributes[ "dec" ] ) } ) oXmlNode := oXmlDoc:findNext() ENDDO AEval( aStruct, {|a| Qout( ValToPrg(a) ) } ) RETURN
  20. XML é uma porcaria, ainda bem que surgiu o JSON que é um formato bem mais simples e legível para manipular informações. Infelizmente XML se mantem como padrão para nota fiscal eletrônica e outras coisas então vez ou outra me deparo com esse lixo. Mas ainda bem que nunca precisei me aprofundar muito. Como não utilizei muitas vezes XML de maneira profissional meu conhecimento nisso é raso mas vou postar 3 exemplos da própria documentação do xharbour comercial que tenho. Segue abaixo: // Exemplo para criar um XML //Creating an XML file // The example uses the Customer database and creates an XML file // from it. The database structure and its records are written // to different nodes in the XML file. The basic XML tree is this: // // <database> // <structure> // <field .../> // </structure> // <records> // <record> // <fieldname> data </fieldname> // </record> // </records> // </database> #include "hbXml.ch" PROCEDURE Main LOCAL aStruct, aField, nFileHandle LOCAL oXmlDoc, oXmlNode, hAttr, cData LOCAL OXmlDatabase, oXmlStruct, oXmlRecord, oXmlField USE Customer aStruct := DbStruct() // Create empty XML document with header oXmlDoc := TXmlDocument():new( '<?xml version="1.0"?>' ) // Create main XML node oXmlDatabase := TXmlNode():new( , "database", { "name" => "CUSTOMER" } ) oXmlDoc:oRoot:addBelow( oXmlDatabase ) // copy structure information to XML oXmlStruct := TXmlNode():new( , "structure" ) oXmlDataBase:addBelow( oXmlStruct ) FOR EACH aField IN aStruct // store field information in XML attributes hAttr := { "name" => Lower( aField[1] ), ; "type" => aField[2], ; "len" => LTrim( Str(aField[3]) ), ; "dec" => LTrim( Str(aField[4]) ) } oXmlField := TXmlNode():new(, "field", hAttr ) oXmlStruct:addBelow( oXmlField ) NEXT // copy all records to XML oXmlNode := TXmlNode():new( , "records" ) oXmlDataBase:addBelow( oXmlNode ) DO WHILE .NOT. Eof() hAttr := { "id" => LTrim( Str( Recno() ) ) } oXmlRecord := TXmlNode():new( , "record", hAttr ) FOR EACH aField IN aStruct IF aField[2] == "M" // Memo fields are written as CDATA cData := FieldGet( Hb_EnumIndex() ) oXmlField := TXmlNode():new( HBXML_TYPE_CDATA , ; Lower( aField[1] ), ; NIL , ; cData ) ELSE // other fields are written as normal tags cData := FieldGet( Hb_EnumIndex() ) cData := Alltrim( CStr( cData ) ) oXmlField := TXmlNode():new( HBXML_TYPE_TAG , ; Lower( aField[1] ), ; NIL , ; cData ) ENDIF // add field node to record oXmlRecord:addBelow( oXmlField ) NEXT // add record node to records oXmlNode:addBelow( oXmlRecord ) SKIP ENDDO // create XML file nFileHandle := FCreate( "Customer.xml" ) // write the XML tree oXmlDoc:write( nFileHandle, HBXML_STYLE_INDENT ) // close files FClose( nFileHandle ) USE RETURN
  21. Pelo que entendi você precisará tratar isso no programa, o SQL não vai conseguir colocar em colunas pra você isso, pelo menos não se uma maneira simples. Então basicamente você precisa obter os dados do SQL e ai na sua aplicação você tratar como você precisa. Acredito que seja esse o caminho.
  22. não estou entendo o que você deseja. Escreva abaixo fazendo em texto mesmo o que você precisaria como resultado
  23. pq vc nao faz um select com inner join? caso não saiba montar passe aqui a estrutura da tabela de pergunta e a de resposta e eu rascunho pra vc
  24. Foi muito útil nos anos 90, mas hj em dia tem ferramentas melhores
  25. Top Connect foi uma ferramenta para permitir que programas clipper se conectassem com banco de dados do AS400, foi criada por um chileno chamado Juan Agustin Barriga. A ferramenta chamou a atenção da Microsiga (TOTVS), que não sei como a descobriu. A Microsiga fez uma parceria com o Juan e criaram uma versão do TOP CONNECT permitindo que programas clipper se conectassem com banco de dados ORACLE, SYBASE, INFORMIX, SQL SERVER, etc. Isso foi por volta de 1996. O topconnect é um programa feito em delphi, é um executavel externo ao aplicativo. Este executavel em DELPHI recebe a comunicação do sistema em clipper (advpl/xharbour) via TCP/IP e então o topconect faz a requisição ao banco de dados configurado (sql server, oracle, etc). Na pratica então o sistema conversa com o top connect que por sua vez conversa com o banco de dados. O banco de dados responde ao top connect que por sua vez responde ao sistema. De alguma forma a TOTVS absorveu essa ferramenta e mudou o nome para "totvs dbaccess" e parou de comercializar, ficando ela restrita somente ao Protheus/advpl. Então pra resumir hoje o TOP CONNECT é um produto descontinuado. Apenas a titulo de informação o SQLRDD eu considero um produto muito melhor que o top connect pois é uma LIB e então o sistema fala diretamente com o banco de dados (via ODBC ou nativamente em alguns casos), sem aplicativo intermediário.
×
×
  • Create New...