Jump to content
Fivewin Brasil

alex2002

Membros
  • Posts

    1,229
  • Joined

  • Last visited

  • Days Won

    24

Posts posted by alex2002

  1. Olha só, fui no GIT que o João postou, e acabei vendo que o Fast agora é Open Source.

    Alguém, já baixou o projeto?

    Quanto ao problema do citado do tópico, sugiro usar alias que funciona muito bem.

     

    Um abraço,

    Alexandre Pereira

  2. Em 15/12/2021 at 13:01, edutraini disse:

    Boa tarde a todos

    Queria agradecer a todos que me ajudaram tudo funcionando perfeitamente.

    Um unica duvida se tem como colocar a dll libmysql dentro do sistema ou tem que jogar na pasta aonde esta executavel

    Obrigado

     

    Não tem como colocar a DLL dentro seu sistema. Por isso ela é uma DLL, vc tem que ter ela na pasta da aplicação (ou conforme o ambiente).

    Eduardo, já terminou a questão do Atualizador? Você não me ligou mais.

    Um abraço,

    Alexandre Pereira

     

  3. 21 horas atrás, edutraini disse:

    Boa tarde, Alex

    To usando a sua rotina mas esta dando erro 

    Vc poderia me ajudar

    ABraço

    Olá Edu.

    Claro, vc tem o meu telefone. Pode me chamar novamente, já cheguei na cidade onde vou ficar até o dia 15/12

    Só no horário comercial que é meio difícil, mas no mais estou a disposição.

    Um abraço,

    Alexandre Pereira

    CAMPEÃO BRASILEIRO

  4. Vou postar aqui o fonte do meu atualizador.


    Qualquer coisa é só chamar.

    Um abraço,

     

     



    /////////////////////////////////////////////////////////////
    #include "fivewin.ch"


    STATIC oDlg, oTxt, oRas, oMeter, oRecup, oAtualiza, oSair

    //////////////////////

    Function Main()
      local oIni
      parameters cSistema, cPerfil, cPar1, cPar2 
      public lSair    := .f.
      public lCheck   := .f.
      public lUpLoad  := .f.
      public lQuiet   := .f.
      public cTxt     
      public cLogFile := 'ftplog.txt'
      public cRecup   := ''
      public cArquivo  
      public cLocal   := CurDrive()+':\'+Curdir()
      public cPasta := '/livecred'
      public oFtp 
      
      Set Date Brit
      Set Century On

      Set 3DLook On

      DEFAULT cSistema := 'NomeDoSistema'
      
      // Verificando se o Sistema já está aberto
      if isExeRunning( 'LiveCRED.exe' )
         Return .f.                      
      endif

      if cSistema = '/check'
         lCheck   := .t.
         lQuiet   := .t.
         cSistema := cPerfil
         cPerfil  := cPar1                              
      endif

       if cSistema = '/quiet'
            lQuiet   := .t.
            cSistema := cPerfil
            cPerfil  := cPar1
      endif

      if cSistema = '/upload'
         lUpLoad  := .t.
         cSistema := cPerfil
         cPerfil  := cPar1
      endif

      DEFAULT cPerfil  := '1'
      
      cArquivo := rtrim( lower(cSistema) )+'.zip'
      cTxt     := 'Início'

      nAtual  := 0                                                


      if !lCheck
           DEFINE ICON oIcon RESOURCE 'LiveCRED'
           DEFINE DIALOG oDlg RESOURCE "Live_A" Title "LiveCRED Versão 2.3" Icon oIcon

             redefine Get    oTxt     Var cTxt Memo        id 101 Color nRgb(0,0,220),nRgb(253,252,213) Of oDlg
             redefine Say    oRecup   Var cRecup           id 102 Color nRgb(150,0,0) of odlg
             redefine Meter  oMeter   Var nAtual Total 100 id 103 Of oDlg

             redefine BUTTON oAtualiza id 501 ACTION (oAtualiza:Disable(), oSair:Disable(), Atualiza(), oAtualiza:enable(), oSair:enable() ) CANCEL
             redefine BUTTON oSair     id 510 ACTION (lSair:= .t., oDlg:end() ) CANCEL
             ACTIVATE DIALOG oDlg CENTERED valid lSair on init iniciar()
      else
         ChecaVersao()
      endif
    return .t.

    /////////////////////////
    static function iniciar()
    oDlg:SetFocus()
    oDlg:show()
    oAtualiza:setfocus()
    oAtualiza:refresh()
    oDlg:refresh()
    SysRefresh()
    if lCheck
    //   Visualiza('Verificando se existe nova versão disponível, aguarde...')
    //   oAtualiza:disable()
    //   oSair:Disable()
       ChecaVersao()
    elseif lQuiet
       oAtualiza:disable()
       oSair:Disable()
       Atualiza()
       lSair := .t.
       oDlg:end()
        hb_gcAll()                                 
    elseif lUpload
       oAtualiza:disable()
       oSair:Disable()
       EnviaVersao()
    else                         
       visualiza('Clique em Executar para que a sua versão do '+upper(cSistema)+' seja automaticamente atualizada')
    endif
    return nil


    Function ChecaVersao()
    LOCAL lRetorno := .T.
    local lErro      := .f., lAchou := .f., lTemVersaoNova := .f., lAtualiza := .f.
    local i
    local dDataRemoto, dDataLocal, cHoraRemoto, cHoraLocal, nTamRemoto, nTamLocal

    cArqLocal  := cLocal+'\'+cSistema+'.zip'
    cArqRemoto := cArquivo


    for i = 1 to 2
       if Conecta( i )
          visualiza( "Conexão estabelecida, Verificando se existe Atualização..." )
          oFtp:Cwd(cPasta)
          aArquivo := oFTP:listfiles( cArqRemoto )
          if len( aArquivo ) = 0
             lRetorno := .f.
             // visualiza('Atualização não encontrada! **** ERRO **** ')
           else
       //       dDataRemoto := aArquivo[1,3]
       //       cHoraRemoto := aArquivo[1,4]
             nTamRemoto  := aArquivo[1,2]
          endif
          oFTP:Close()
       else
          lRetorno := .f.
       endif
       if lRetorno 
          exit
       endif
    next


    if lRetorno
       if file( cArqLocal )
         // dDataLocal  := fDate( cArqLocal )
         // cHoraLocal  := substr( fTime( cArqLocal ),1,5)
         nTamLocal := fsize( cArqLocal )
       else
         //  dDataLocal  := ctod( '01/01/2000' )
         //  cHoraLocal  := '00:00'
         nTamLocal := 0
       endif
       
      if nTamRemoto <> nTamLocal
          lTemVersaoNova := .t.
       endif

    /*
      if dDataRemoto > dDataLocal
          lTemVersaoNova := .t.
       elseif dDataRemoto = dDataLocal
              if cHoraLocal < cHoraRemoto
                  cTempo := elaptime( cHoraLocal, cHoraRemoto )
              else
                  cTempo := elaptime( cHoraRemoto, cHoraLocal )
              endif
              nTempo := val(substr( cTempo,1,2))*60 + val(substr( cTempo,4,2))
              
              if nTempo > 210  // 3 horas e meia (diferença de horários do servidores ftps)
                 lTemVersaoNova := .t.
              endif
       endif
    */

    else
       lErro := .t.
       visualiza("Problemas para verificar nova versão! ")
       if !lQuiet 
           MsgInfo('Problemas para verificar nova versão!','Erro de Atualização')
       endif
    endif

    if !lErro .and. !lTemVersaoNova
       visualiza("Não Existe nova versão disponibilizada! ")
       if !lQuiet 
           MsgInfo('Não Existe nova versão disponível!','Sem Atualização')
       endif
    endif

    if !lErro .and. lTemVersaoNova
         if MsgYesNo('Existe nova versão disponível do NomeDoSistema, deseja atualizar?','Nova Versão')
            lAtualiza := .t.
         endif
    endif

    if lAtualiza
       visualiza("Resetando conexões...! ")
       syswait(2)
        sysrefresh()     
        killprocess(cSistema+".exe")
        MyWinExec('livecred '+if(lQuiet,'/quiet ','')+cSistema+' '+cPerfil)                                                                   
    endif   

    lSair:= .t.
    quit
    hb_gcAll()                                 
    return nil


    ///////////////////////////////////////////////////////
    FUNCTION EnviaVersao()
    local aFR3, aArqs := {}
    local lErro := .f.
    local cArqLocal, cArqEXE, cExtensao, cPastaFR3, cPastaImagem

    cArqLocal := CurDrive()+':\'+Curdir()+'\'+cArquivo
    cPastaFR3 := 'p:\desenv\fr\'
    cArqEXE   := CurDrive()+':\'+Curdir()+'\'+cSistema+'.EXE'
    cExtensao := lower( right( cSistema, 3 ) )
    aFR3      := directory( cPastaFR3+'*.fr3' )

    for x = 1 to len( aFR3 )
       aadd( aArqs, cPastaFR3+aFR3[x,1] )
    next

    if cExtensao <> 'zip' .and. cExtensao <> 'rar'
       fErase( cArqLocal )
       aadd( aArqs, cArqEXE )

    //   ? hb_zipfile( cArqLocal, {'c:\cardPrinter\crdLandEraseFront.bmp'} )  
        hb_zipfile( cArqLocal, aArqs )
    else
       cArqLocal := CurDrive()+':\'+Curdir()+'\'+cSistema
    endif

    if EnviaFtp( cArqlocal )
       if !lQuiet
          MsgInfo('Ok! versão Enviada para o servidor WEB!','Ok')
       endif
    else
       if !lQuiet
          MsgStop('ERRO AO ENVIAR VERSÃO!','Erro')
       endif
    endif
    lSair:= .t.
    oDlg:end()
    hb_gcAll()                                 

    RETURN NIL

    //////////////////////////////////////////////////
    FUNCTION Atualiza()
    local aArquivos := {}, i
    local cArqLocal := CurDrive()+':\'+Curdir()+'\'+cArquivo
    local cPastaBak := sonumeros(dtoc(date()))+'_'+sonumeros(time())
    local cExtensao 
    local lErro := .f.


    // Apagando o arquivo existente
    Ferase( cArquivo )
    Ferase( cArqLocal )

    if RecebeFtp( cArqlocal, cArquivo  )
       visualiza("Executando Backup da Versão Atual...")

        // Criando um backup dos arquivos anteriores
        lmkdir(cLocal+'\fr')
        lmkdir(cLocal+'\Live')
        lmkdir(cLocal+'\Live\'+cPastaBak)
            
        aArquivos := ZipRead(cLocal+'\'+cArquivo)

        for i = 1 to len(aArquivos)
            cExtensao := lower( right( aArquivos, 3 ) )
            if cExtensao <> 'fr3' .and. cExtensao <> 'gif'
                 frename(cLocal+'\'+aArquivos,cLocal+'\Live\'+cPastaBak+'\'+aArquivos)
            endif
        next

        // Backup Criado
        visualiza("Descompactando a Versão Atual...")

        // Descompactando
        for i = 1 to len(aArquivos)
            
           // entrando em um loop caso o arquivo a ser descompactado esteja aberto
           do while .t.
           
               cExtensao := lower( right( aArquivos, 3 ) )
               
               if cExtensao <> 'fr3' .and. cExtensao <> 'gif' .and. file(cLocal+'\'+aArquivos) .and. frename(cLocal+'\'+aArquivos, cLocal+'\Live\'+cPastaBak+'\'+aArquivos ) <> 0
                  if !lQuiet .and. MsgYesNo('Erro ao criar backup do Arquivo '+cLocal+'\'+aArquivos+' !'+CRLF+'Possivelmente ele está sendo utilizado.'+CRLF+'Deseja Retentar?','Arquivo Sendo Usado')
                      loop
                   else
                      lErro := .t.
                      exit
                   endif
               endif
                   
               if !hb_unzipfile( cLocal+'\'+cArquivo, {|cArq| qout(cArq) }, .t.,'', cLocal, aArquivos )
                    if !lQuiet .and. MsgYesNo('Erro ao DESCOMPACTAR o Arquivo '+cLocal+'\'+aArquivos+' !'+CRLF+'Possivelmente ele está sendo utilizado.'+CRLF+'Deseja Retentar?','Arquivo Sendo Usado')
                       loop
                    else
                       lErro := .t.
                       exit
                    endif
               endif
               
               // Tratando os arquivos FR3
               if cExtensao = 'fr3' .and. !copyfile(cLocal+'\'+aArquivos, cLocal+'\fr\'+aArquivos )
                    if !lQuiet .and. MsgYesNo('Erro ao DESCOMPACTAR o Arquivo '+cLocal+'\'+aArquivos+' !'+CRLF+'Possivelmente ele está sendo utilizado.'+CRLF+'Deseja Retentar?','Arquivo Sendo Usado')
                       loop
                    else
                       lErro := .t.
                       exit
                    endif
               elseif cExtensao = 'gif' .and. !copyfile(cLocal+'\'+aArquivos, cLocal+'\imagem\'+aArquivos )
                    if !lQuiet .and. MsgYesNo('Erro ao DESCOMPACTAR o Arquivo '+cLocal+'\'+aArquivos+' !'+CRLF+'Possivelmente ele está sendo utilizado.'+CRLF+'Deseja Retentar?','Arquivo Sendo Usado')
                       loop
                    else
                       lErro := .t.
                       exit
                    endif
               elseif cExtensao = 'fr3' .or. cExtensao = 'gif' 
                      ferase( cLocal+'\'+aArquivos )
                  endif   
               
               exit
           enddo
           if lErro 
              exit
           endif
        next
        if lErro
           visualiza("ERRO, houve um erro! - VERSÃO NÃO ATUALIZADA")
           visualiza("Restaurando a versão anterior...")
              
           for i = 1 to len(aArquivos)
               CopyFile(cLocal+'\Live\'+cPastaBak+'\'+aArquivos, cLocal+'\'+aArquivos)
           next
        else
           visualiza("OK! Versão atualizada e pronta para ser usada!")
        endif

    else 
        lErro := .t.
        visualiza("ERRO ao Receber o Arquivo de Atualização! - VERSÃO NÃO ATUALIZADA")
        if !lQuiet
           MsgAlert('Falha na recepção do arquivo!','Erro')
        endif
    endif
     
    if !lerro
       if !lQuiet
          MsgInfo('Ok! versão Atualizada e pronta para ser usada!','Ok')
       else
           MyWinExec( cSistema )                                                                   
       endif
    endif
    RETURN NIL

    // Visualizar o que está sendo executado
    /////////////////////////////
    Function Visualiza( cTexto )
    /////////////////////////////

    if !lQuiet
       if valtype(cTexto) <> 'O'
         cTxt += CRLF+cTexto
       endif
       oTxt:SetText( cTxt )
       oTxt:SetPos(Len(cTxt))
       oTxt:refresh()
       oDlg:Refresh()
    endif
    sysrefresh()
    Return Nil


    // Ler os nomes dos arquivos que estão dentro do ZIP
    * -----------------------------------------------------------------------------
    Function zipread(zip_file)
    * -----------------------------------------------------------------------------
    local _array := {}
    local zip := fopen(zip_file, 2), tmp :=space(4)
    local method, orig_date, fn_date, comp_size, uncomp
    local fn_size, extra, junk, file_name, orig_hora, fn_hora
    do while .t.
       tmp := space(4)
       if fread(zip, @tmp, 4) != 4    // End of file
          exit
       endif
       if tmp = "PK" + chr(1) + chr(2)  // Central dir
          exit
       elseif tmp != "PK" + chr(3) + chr(4)
          exit
       endif
       tmp := space(26)
       fread(zip, @tmp, 26)
       method    := bin2i(substr(tmp, 5, 2))
       comp_size := bin2l(substr(tmp, 15, 4))
       fn_size   := bin2i(substr(tmp, 23, 2))
       extra     := bin2i(substr(tmp, 25, 2))
       file_name := freadstr(zip, fn_size)
       junk      := if(extra = 0, "", freadstr(zip, extra))
       extract(zip, comp_size, method, file_name)
       aadd(_array, file_name )
    enddo
    fclose(zip)
    return _array

    * -----------------------------------------------------------------------------
    Static Function extract(_handle, _size, _method, unzip_file)
    * -----------------------------------------------------------------------------
    local newfile, tmp := space(4096)
    if _method != 0
       fseek(_handle, _size, 1)    // Skip file
    else
       if newfile = fcreate(unzip_file, 0)
          do while _size > 0
             fread(_handle, @tmp, len(tmp))
             _size -= min(_size, 4096)
             fwrite(newfile, tmp)
          enddo
          fclose(newfile)
       endif
    endif
    return nil


    function SoNumeros( cString, cExcecao )

    local cRetorno:='', x

    DEFAULT  cExcecao:=''

    for x=1 to len( cString )
            if substr( cString,x,1 )$'1234567890' .or. substr( cString,x,1 )$cExcecao
                    cRetorno+=substr( cString,x,1 )
            endif
    next

    return cRetorno

    ////////////////////////////DADOS DA FUNCAO//////////////////////////////////
    // NOME       : MyWinExec                                                 ///
    // FINALIDADE : adequar WinExec ao windows 2000/nt                        ///
    // PARAMETROS : <1> cComando                                              ///
    // RETORNO    : nada                                                      ///
    /////////////////////////////////////////////////////////////////////////////
    function MyWinExec( cComando )

    local cExecute:=''

    if IsWinNT()  // NT, 2000 e XP
            cExecute:=GetEnv( 'COMSPEC' )+' /C '
    endif

    return WinExec( cExecute+cComando, 0 )


    Function timefromstart
    return '00:00:00'

    KillProcess( "calc.exe" )


    /////////////////////////////
    FUNCTION KillProcess( cExe )

    local oWmi, oList, oProc

    oWmi := WmiService()
    oList := oWmi:ExecQuery( "select * from Win32_Process where Name = '" + cExe + "'" )
    for each oProc in oList
    oProc:Terminate()
    next
    return nil

    FUNCTION WMIService()
    // It would be useful to keep this function in the library
    static oWMI

    local oLocator

    if oWMI == nil

    oLocator := CREATEOBJECT( "wbemScripting.SwbemLocator" )
    oWMI := oLocator:ConnectServer()

    endif

    return oWMI

    ////////////////////////////////////////////////////////////////////////
    FUNCTION RecebeFTP( cArqLocal, cArqRemoto )
    ////////////////////////////////////////////////////////////////////////

    LOCAL lRetorno := .T.
    local i 

    for i = 1 to 2
       IF Conecta( i )
          visualiza( "Conexão estabelecida, fazendo o Download..." )
          oFtp:Cwd(cPasta)
          aArquivo := oFTP:listfiles( cArqRemoto )
          if len( aArquivo ) = 0
             lRetorno := .f.
             visualiza('Atualização não encontrada! **** ERRO **** ')
               lRetorno := .f.
           else
              lRetorno := Inicia_Progress(cArqLocal, aArquivo[1][2], cArqRemoto, oFtp )
          endif
          oFTP:Close()
       else
          lRetorno := .f.
       endif
       if lRetorno 
          exit
       endif
    next

    if lRetorno
          visualiza( "Arquivo Recebido com sucesso!" )
    else
          visualiza( "Falha no Recebimento ***** ERRO *****" )
    endif

    RETURN lRetorno

    //////////////////////////////////////////////////////
    FUNCTION EnviaFtp( cFile )
    //////////////////////////////////////////////////////

    LOCAL lRetorno := .T.
    local i
    for i = 1 to 1
       IF Conecta( i )
          visualiza( "Conexão estabelecida, fazendo o Upload..." )
       
           oFtp:Cwd(cPasta)
          if !oFtp:UploadFile( cFile )
             lRetorno := .F.
          endif
          oFTP:Close()
       
           if lRetorno
             visualiza( "Arquivo enviado com sucesso!" )
          else
             visualiza( "Falha no Envio!" )
          endif
       ELSE
          lRetorno := .f.
       ENDIF
    next

    RETURN lRetorno


    /////////////////////////////////////////////////////////////////////
    Function Inicia_Progress( cArquivoDestino, nTotal, cArqRemoto, oftp)
    /////////////////////////////////////////////////////////////////////
    local lOk 
    oFtp:exGauge := { | done, size| ShowGauge(done, size, nTotal, cArqRemoto ) }
    if !oFtp:DownLoadFile(cArquivoDestino)
       lOk := .f.
    else
       lOk := .t.
    endif
    return lOk


    // Mostrar a Barra de Progresso durante upload/download
    ///////////////////////////////////////////////////
    STATIC FUNCTION FtpProgress( nSent, nTotal, oFtp )
    ///////////////////////////////////////////////////
    LOCAL cProgress
    cProgress := Int( 100*nSent/nTotal )
    ometer:set(cProgress )

    return .t.

    /////////////////////////////////////////////////////
    Procedure ShowGauge( nSent, nSize, wTotal, ftpfile )
    /////////////////////////////////////////////////////
    if nSent > 0
      cProgress := Int( (nSent/wTotal)*100 )
      ometer:set(cProgress )
    endif
    return


    ///////////////////////////////
    FUNCTION Conecta( nConexao )
    ///////////////////////////////

    local cServer, cUsuario, cSenha, i

    local cUrl
    local oUrl
    local lRetorno := .f.

    default nConexao := 1

    for i = nConexao to 2
       if i = 1
          cServer  := 'ftp.declatecnologia.com.br'
          cUsuario := 'XXXXXXXXXXXXXXXXXXX'
          cSenha   := 'YYYYYYYYYYY'                       
       elseif i = 2
          cServer  := 'ftp.declatecnologia.com.br'
          cUsuario := 'XXXXXXXXXXXXXXXXXXX'
          cSenha   := 'YYYYYYYYYYY'                       
       endif
        
       If !IsDigit( cServer )            //O Servidor é um Nome
          WSAStartup()
          cServer := GetHostByName( cServer )
          WSACleanUP()
       Endif

       cUrl := "ftp://" + cUsuario + ":" + cSenha + "@" + cServer

       visualiza( "Abrindo conexão com o "+str(i,1)+"o. Servidor..." )

       oUrl := tUrl():New( cUrl )
       oFTP := tIPClientFtp():New( oUrl )
       oFTP:nConnTimeout := 20000
       oFTP:bUsePasv := .T.

       // Forçar UserID se houver @ no usuário
       IF At( "@", cUsuario ) > 0
         oFTP:oUrl:cServer   := cServidor
         oFTP:oUrl:cUserID   := cUsuario
         oFTP:oUrl:cPassword := cSenha
       ENDIF

       oFtp:exGauge := ( @FtpProgress() )

       if oFTP:Open( cUrl )
          lRetorno := .t.
          exit
       endif
       Visualiza('Não conectou ao Servidor!!!')
       if oFTP:SocketCon == NIL
          Visualiza('Conexão não inicializada!!!')
       elseif InetErrorCode( oFTP:SocketCon ) == 0
          Visualiza('Resposta do Servidor: '+oFTP:cReply)
       else
          Visualiza('Erro na Conexão: '+InetErrorDesc( oFTP:SocketCon ))
       endif
    next

    RETURN lRetorno
     

    LiveCRED.res

  5. Eduardo, pelo que entendi, você não conseguirá renomear/apagar o executável ao qual vc está utilizando. A saída é montar um executável paralelo que faz a verificação de nova versão em seu FTP e a partir daí vc roda ele em background (assim que entrar no seu aplicativo). Caso haja nova versão você avisa ao usuário e aí sim, traz a versão, mata a aplicação principal, renomeia o executável e reabre a aplicação.

    O meu aplicativo é assim e faz anos que não tenho problema. 

    Qualquer coisa, entra em contato comigo que posso te ajudar.

    Um abraço,

     

    Alexandre Pereira 

  6. 11 minutos atrás, marcioe disse:

    Há muito tempo eu tive que importar o banco de dados de uma loja que estava com esse banco de dados, eu consegui fazer via ODBC com acess, na epoca.
    Dai acessei as tabelas que precisava e importei no acess, e depois gerei o que queria para migrar.

     

    Não sei se esse é o seu caso

    Pode ser, vou tentar.

     

  7. Em 14/09/2021 at 10:14, giovanyvecchi disse:

    Tem que ver qual gerenciador da sybase esta instalado no servidor do seu cliente.

    1-ADS (Advantage Database Server)

    2-ASE (Adaptive Server Enterprise)

    3-Sap SQL AnyWhere

    4-Sap HANA 

    Eu tenho o arquivo .DB

    Será que tem como saber?

    Um abraço, 

    Alexandre Pereira

     

  8. Olá Márcio.

    É possível.
    image.png.b838255bb951e6a841ab4682b01d3830.png
     

     

            oLbx:aCols[9]:AddResource("BRANCO16")
            oLbx:aCols[9]:AddResource("AMARELO16")
            oLbx:aCols[9]:AddResource("VERDE16")
            oLbx:aCols[9]:AddResource("PRETO16")
            oLbx:aCols[9]:lBmpTransparent := .f.
            oLbx:aCols[9]:nDataBmpAlign   := AL_LEFT
            oLbx:aCols[9]:cHeader         := "Análise"
            oLbx:aCols[9]:nHeadStrAlign   := AL_CENTER
            oLbx:aCols[9]:nDataStrAlign   := AL_RIGHT
            oLbx:aCols[9]:nWidth          := 80
            oLbx:aCols[9]:bBmpData        := {|| nStat := aLbx[oLbx:nArrayAt,12], if( nStat = 11if( nStat = 22if( nStat = 043 )))}
     
     
    No seu caso, vc tem que montar uma imagem com as duas opções.
     
     
    Um abraço,

    Alexandre Pereira
     
  9. Olá Pessoal,

    Tenho um relatório em FAST REPORT que uso o método DBLCLICK em uma linha/coluna para chamar uma função xHarbour. Esta função está funcionando legal.

    Agora preciso de passar mais de uma coluna da linha para a função xHarbour. Já tentei um monte de coisa e não tive êxito, alguém tem uma solução?

    No exemplo abaixo ele retorna o valor apenas da linha/coluna clicada. Mas eu preciso de mais colunas da mesma linha.
     


    image.thumb.png.db7ae97c055b5d6031443de44b4da906.png

    Se alguém puder ajudar.

    Um abraço,

    Alexandre Pereira

×
×
  • Create New...