Jump to content
Fivewin Brasil

AcessoSoft

Membros
  • Posts

    36
  • Joined

  • Last visited

Posts posted by AcessoSoft

  1. Em 06/09/2019 at 11:38, evertonlb disse:

    Opa.. Bom dia.. tenho uma solução na medida pra vc e para qualquer um que precisa enviar SMS.. 
    Integra via API,  Personaliza a aparência, envia em Long Code e Short Code. pode ser feito envio de mensagens concatenadas chegando a mais de 400 caracteres, envio de mensagens aceitando resposta do cliente, respondendo "Sim/Não" "1/2/3", etc. Temos uma taxa de mais de 90% de entrega/abertura, a taxa de conversão fica em média 25%. Nossa solução é munida de vários relatórios, um Dashboard muito bacana com muitos dados...
    Então Andriaz, estou oferecendo nossos serviços porque temos um valor bem agressivo de SMS, como trabalhamos com sub contas esse valor pode ser configurado e gerar mais uma renda para a sua empresa. Dá uma olhada.. qqer coisa fala comigo no skype -> everton@brasilfone.com.br

    https://pro.disparopro.com.br/integracao-via-api/

    Hoje utilizo a solução do MEX10 com pacote de 5.000 SMS que coloca o custo em 0,04 por SMS. Qual o custo do DISPARO PRO?

  2. /*******************************************************************************************
    * EXEMPLO DE BUSCA GERAL POR UMA EXPRESSÃO QUALQUER NUM ARQUIVO DBF E RETORNO DE ARRAY
    * FUNCIONA COM QUALQUER ARQUIVO DBF
    * by:  Acesso Softwares                                               
    *******************************************************************************************/

    #include "fivewin.ch"

    /******************************************************************************************/

    FUNCTION Main()

    LOCAL cBusca, aFiltrados

    USE clientes.dbf

    cBusca := "SÃO PAULO"

    aFiltrados := CriaArrayFiltrado( cBusca )

    XBROWSE( aFiltrados )

    RETURN NIL

    /*******************************************************************************************/

    FUNCTION CriaArrayFiltrado( cBusca )

    LOCAL nFor, bFiltro, aArray := {}, aCampos, cFiltro := ""

    cTextoBusca := cBusca

    //------------------------------ OBTEM CAMPOS DO ARQUIVO ----------------------------------//

    aCampos := DBSTRUCT()

    //---- MONTA STRING PARA CONDICAO DO DBEVAL SOMENTE COM OS CAMPOS DO TIPO C, M, D, N ------//

    FOR nFor = 1 TO LEN( aCampos )

        DO CASE
         // Campo tipo caracter ou memo
        CASE aCampos[ nFor, 2 ] $ "CM"
            cFiltro += "UPPER( cTextoBusca ) $ TiraAcento( UPPER( " + aCampos[ nFor, 1 ] + ") ) .OR. "
         // campo do tipo data
        CASE aCampos[ nFor, 2 ] == "D"
            cFiltro += "UPPER( cTextoBusca ) $ DTOC( " + aCampos[ nFor, 1 ] + ") .OR. "
        // campo do tipo numérico
        CASE aCampos[ nFor, 2 ] == "N"
            cFiltro += "UPPER( cTextoBusca ) $ STR( " + aCampos[ nFor, 1 ] + " ) .OR. "
        ENDCASE

    NEXT

    cFiltro := "{||" + SUBSTR( cFiltro, 1, LEN( cFiltro ) - 6 ) + "}" // -6 para retira o último .OR. criado acima

    //----------------------- MONTA CODEBLOCK DE FILTRO PARA DBEVAL --------------------------//

    IF EMPTY( cFiltro )
       bFiltro := {|| .T. }
    ELSE
       bFiltro := &cFiltro
    ENDIF

    //------------ ADICIONA NO ARRAY REGISTRO QUE SATISFAÇA A CONDIÇAO ( bFiltro ) ------------//

    WHILE !EOF()

       IF EVAL( bFiltro )

          AADD( aArray, PegaRegistro( aCampos ) )

       ENDIF

       SKIP

    ENDDO

    //----------------------- CRIA ARRAY COM 1 LINHA EM BRANCO PARA O BROWSE -----------------//

    IF EMPTY( aArray )

       aArray  := { { LEN( aCampos ) } }

       AFILL( aArray[1], SPACE(10) )

    ENDIF

    RETURN( aArray )

    /********************************************************************************************/

    FUNCTION PegaRegistro( aCampos )

    LOCAL nFor, aRegistro := {}, cNomeCampo

    FOR nFor = 1 TO LEN( aCampos )

        cNomeCampo := aCampos[ nFor, 1 ]

        AADD( aRegistro, &cNomeCampo )

    NEXT

    RETURN( aRegistro )

    /********************************************************************************************/

    FUNCTION TiraAcento( cTexto )

    // ESCREVA AQUI CÓDIGO QUE RETIRE DA STRING CARACTERES COMO: Ç, Ã, Ó, É, etc

    RETURN( cTexto )

    /********************************************************************************************/

  3. Saudações....

    Alguém poderia indicar uma solução prática para converter um arquivo PDF para JPG ou BMP? O objetivo é exibir a imagem no Preview do FW. Pretendo converter a primeira página do PDF para BMP e montar um documento para impressão com essa imagem apenas para que possa ser visualizada no PREVIEW.

    Agradeço antecipadamente a quem puder ajudar...

  4. Como faço pra alinhar os dados nas linhas do xbrowse?

    Vejam na imagem que a coluna NOSSO NÚMERO e VALOR estão fora de alinhamento

    http://www.acessosoft.com.br/img/50.png

    Estou criando o XBROWSE com o código abaixo:

    aMainPanelCtrl[ "MAIN_OBRWREM" ] := TXBrowse():New( aMainPanelCtrl[ "MAIN_OFOLDER" ]:aDialogs[ RemRetGetDialog( "REM" ) ] )
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:SetArray( aMainPanelCtrl[ "MAIN_ABRWREM" ] )
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:oFont               := oFontLuc
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:oDataSelFont        := oFontLucB
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nMarqueeStyle       := MARQSTYLE_HIGHLROW
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nColDividerStyle    := 2
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nRowDividerStyle    := 2
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nHeaderLines        := 1
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nDataLines          := 4
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nTop                := 10
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nLeft               := 5
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nBottom             := aMainPanelCtrl[ "MAIN_OFOLDER" ]:aDialogs[ RemRetGetDialog( "REM" ) ]:nHeight - 38
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nRight              := aMainPanelCtrl[ "MAIN_OFOLDER" ]:nRight - 10
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:bClrStd             := {|| { CLR_BLACK, IF( MOD( aMainPanelCtrl[ "MAIN_OBRWREM" ]:nArrayAt, 2 ) == 0, _PARM_BRWCLR[1], _PARM_BRWCLR[2] ) } }
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:bClrSel             := {|| { CLR_WHITE, CLR_BLACK } }
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:nStretchCol         := STRETCHCOL_LAST
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:cFileSaveWidth      := _PATH_TRM + "BRW_MAIN_REM.CFG"
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:lRecordSelector     := .F.
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:cToolTip            := "Listagem de Boletos Aguardando Remessa " + CRLF + CRLF + "Clique na primeira coluna para selecionar ou faça duplo clique para VISUALIZAR o boleto."
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:blDblClick          := {|| MainRemRetView( "REM" ) }
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:bKeyDown            := {|nKey| IF( nKey == VK_RETURN, MainRemRetView( "REM" ), NIL ) }
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:bChange             := NIL
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:SetColor( CLR_BLACK, _PARM_BRWCLR[1] )
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_SEL ]:cHeader := " "
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_SEL ]:AddResource("Bmp_CheckOn"  )
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_SEL ]:AddResource("Bmp_CheckOff" )
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_SEL ]:bBmpData       := { || RemRetBmpSel( "REM" ) }
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_SEL ]:nDataBmpAlign  := AL_CENTER
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_SEL ]:bStrData       := NIL
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_SEL ]:bLClickData    := {|| RemRetClickSelect( "REM" ) }
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_DAT ]:cHeader      := "Datas"
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_BOM ]:lHide        := .T.
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_NUM ]:cHeader      := "Número"
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_NUM ]:nHeadStrAlign:= AL_CENTER
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_BCO ]:lHide        := .T.
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_NNU ]:cHeader      := "Nosso Número"
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_NNU ]:nHeadStrAlign:= AL_CENTER
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_VAL ]:cHeader      := "Valor R$"
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_VAL ]:nHeadStrAlign:= AL_CENTER
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_MAT ]:lHide        := .T.
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_NOM ]:cHeader      := "Aluno"
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_NOM ]:nHeadStrAlign:= AL_CENTER
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_USU ]:cHeader      := "Usuário"
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_USU ]:nHeadStrAlign:= AL_CENTER
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:aCols[ REM_COD ]:lHide        := .T.
    
    aMainPanelCtrl[ "MAIN_OBRWREM" ]:CreateFromCode()

     

     

  5. Se entendi bem você deseja passar um texto de três linhas.

    1º - Você quer uma função que identifique qual das três linhas é a maior

    2º - Você quer ajustar o tamanho do botão de acordo com o retorno da função acima citada para que caiba todo texto

    É isso? Uma última pergunta: onde entraria o @ say? você fez uma espécie de botão usando texto ou está usando @ BUTTON?

  6. Aproveitar pra listar outras fontes que nos meus testes obtive o mesmo efeito de alinhamento vertical (não importa se é número, letra maiúscula ou minúscula).

    Agency FB, BatangChe,  Consolas, Courier, Courier New, DFKay-SB, DotumChe, FangSong, FixedSys, GulimChe, GungSuhChe, Kaiti, Lucida Console, Lucida Sans Typewriter, Ms Gothic, Ms Mincho, MingLiu, NSimSun, Niagara Engraved, Niagara Solid, OCR A Extended, Simplified Arabic Fixed, 

     

  7. As fontes acima  citadas, não possuem as características que necessito. Somente a "Courier New" (que já uso) e a Ms Sans Serif que é uma fonte feia pra caramba.
    A demais não alinham caracteres verticalmente. 

    Que tem alguma sugestão de fonte que NÃO SEJA a Courier New e tenha tamanhos fixos?

     

  8. Você quer dar um visual de windows 10 no seu sistema rodando em outra versão do windows ?   É isso? Não entendi.... Pra mim, o sistema aparece de acordo com a versão do windows que estou rodando o sistema. Se windows XP, visual do sistema XP, se windows 10, visual do sistema 10 ,e por aí vai...

  9. Costumo usar COURIER para relatórios. Isso porque essa fonte alinha os caracteres verticalmente independente da largura da letra. Principalmente quando utilizo valores numéricos, a "font" Courier. garante que os números ficarão alinhados  verticalmente nas colunas. Entretanto, estou com um probleminha ao gerar PDF e suponho que este problema esteja relacionado ao tipo de "FONT". Quero usar outra "FONT". Alguém poderia indicar uma fonte de aparência profissional que alinhe números e letras verticalmente nas colunas igualmente a Courier faz?

  10. A vantagem das variáveis do tipo STATIC é que elas funcionam como PUBLIC mas somente dentro do PRG onde ela foi declarada.

    Após encerrar o PRG onde as STATIC´s foram declaradas, essas variáveis não ficam mais acessíveis. Entretanto, se seu código chamar novamente o PRG onde a variável foi declarada, ela pode novamente ser lida, inclusive contendo o último valor que possuía após encerrar o PRG.

    Uso pouco as variáveis do tipo STATIC mas são bem úteis quando preciso armazenar um valor pra ser lido posteriormente no PRG onde a variável foi declarada.

  11. Uso as variáveis muito bem classificadas. Todas STATIC ou LOCAL. Se tiver alguma PRIVATE é por mero esquecimento de declarar como LOCAL.

    Fiz alguns testes com samples do fivewin e noto que essa alocação de memória contínua se repete em todos executáveis.

    Em resumo: o tamanho de memória utilizada mostrado no gerenciador de processos do windows só aumenta. Nunca diminui.

    Em relação à sugestão do Kapaiaba em chamar a função HB_GCALL() para esvaziar a memória, apesar de ser teoricamente ideal, não funciona.

    O o método End() já chama essa função toda vez que uma dialog é fechada pelo método "oDialog:End()".

    B_GCALL libera blocos de memória não usados pelo EXE, porém, o que parece estar acontecendo é que esses blocos não estão sendo marcados como LIXO para que a função HB_GCALL limpe.

    E agora? O que fazer?

  12. O que sugere é chamar a função: HB_GCALL(.T.)  ao encerrar uma rotina e retornar ao MAIN Fladimir?

    Testei em alguns módulos aqui mas não diminui o uso da memória.

    Toda vez que entro numa rotina e encerro, o uso de memória aumenta mesmo chamando HB_GCALL(.T.)

  13. Olá nobres colegas,

    Através do gerenciador de processos do windows, notei que meu EXECUTÁVEL aumenta o uso de memória quando abro uma dialog ou chamo qualquer função do sistema, o que é perfeitamente aceitável, entretanto, notei que ao fechar a dialog ou encerrar a função, a quantidade de memória usada não diminui. Resultado: Após alguns minutos de "abre e fecha" dialogs no meu sistema, o uso da memória alcança valores bem altos.

    Minha pergunta é: Além de encerrar os controles e dialogs usando o método :End(), existe alguma função ou comando que preciso chamar pra limpar a memória liberando o espaço utilizado pela rotina que está sendo encerrada?

    Agradeço antecipadamente.

  14. Não tem nada de especial no código, apenas um REDEFINE super normal.

    Mas vou seguir sua sugestão...

    REDEFINE FOLDEREX aSistCtrl[ SIST_FOLDER ] ID 101 OF aSistCtrl[ SIST_DIALOG ] PROMPT "&Empresa", "&Geral", "&Contrato", "&Doc´s Financeiros", "&Aulas Práticas", "&Pesquisa CEP", "E-mail", "SMS" DIALOGS "Fld_SistConfig1", "Fld_SistConfig2", "Fld_SistConfig3", "Fld_SistConfig4", "Fld_SistConfig5", "Fld_SistConfig6", "Fld_SistConfig7", "Fld_SistConfig8" ROUND 5

    O folder é criado com a linha acima. O resto é praxe. Mas sei que deve ser algum problema no folder pois em várias partes do sistema onde uso o recuso FOLDEREX e chamo um enable ou disable para qualquer controle que tenha no folderex o problema ocorre.

  15. Estou fazendo uns testes com FOLDEREX. O Folder criado com esta classe funciona muito bem. Entretanto, quando habilito ou desabilito um controle numa guia do folder, a parte debaixo deste controle que recebeu o Enable() ou Disable() simplesmente desaparece. É desenhado um retângulo em branco abaixo do controle. Somente quando mudo de guia e volto na anterior é que a guia "danificada" volta ao normal.

    Alguém teve este mesmo problema? Alguma sugestões para correção?

    Agradeço antecipadamente.

  16. Há neste fórum e em outros mais, diversas postagens sobre envio de SMS. Gostaria de abrir aqui um tópico para debate recente do uso desta tecnologia que apesar de ser antiga, ainda é muito utilizada. Tenho necessidade de implementar este recurso.

    1 - Códigos: classes, métodos e funções ;

    2 - Qual hardaware usar ;

    3 - Qual melhor provedor ou pacote de serviços.

    Agradeço antecipadamente.

×
×
  • Create New...