Jump to content
Fivewin Brasil

evandro

Membros
  • Posts

    2,514
  • Joined

  • Last visited

  • Days Won

    19

Posts posted by evandro

  1. Olá,

    Gere apenas uma linha com os inserts. Pode ser que tenha de dividir em uns 3 ou 4.

    *                            1    2      3        4        5      6      7       8        9
    cSql:="INSERT INTO vendas(pedido,data,cliente,subtotal,desconto,total,encargo,terminal,condicao"
    *          10      11     12    13     14       15  
    cSql+=",vendedor,usuario,data1,hora1,operacao,empresa"+")"
    cSql+="VALUES "
    for i=1 to len(aVendas)
         	   cSql+="( "+any2sql(aVendas[i,1])+" ,"           // 01
         	   cSql+=" "+any2sql(aVendas[i,2])+" ,"            // 02
         	   cSql+=" "+any2sql(aVendas[i,3])+" ,"            // 03
         	   cSql+=" "+any2sql(aVendas[i,4])+" ,"            // 04
         	   cSql+=" "+any2sql(aVendas[i,5])+" ,"            // 05
         	   cSql+=" "+any2sql(aVendas[i,6])+" ,"            // 06
         	   cSql+=" "+any2sql(aVendas[i,7])+" ,"            // 07
    	      cSql+=" "+any2sql(aVendas[i,8])+" ,"            // 08
         	   cSql+=" "+any2sql(aVendas[i,9])+" ,"            // 09
         	   cSql+=" "+any2sql(aVendas[i,10])+" ,"           // 10           
         	   cSql+=" "+any2sql(aVendas[i,11])+" ,"           // 11
    	      cSql+=" SUBSTRING(now(),1,10) ,"                // 12
    	      cSql+=" SUBSTRING(now(),12,5) ,"                // 13
         	   cSql+=" "+any2sql(aVendas[i,12])+" ,"           // 14
         	   cSql+=" "+any2sql(aVendas[i,13])+") "            // 15
    		   cSql+=iif( i=len( aVendas), "", "," )
    next
    
    SqlExecute(cSql)
    if SQLErrorNO() > 0 
    	fMensagem() 
    	return(.f.) 
    endif 

     

  2. Olá,

    Tanto o FW quanto o Harbour já têm este recurso. Estou migrando o sistema com a opção de um ou outro e, pelo menos nos testes, está tudo muito bom. Criei algumas funções para compatibilizar com a SqlLib. Algumas coisas ficam até melhores ( o retorno da SqlArray() da SqlLib é sempre string e os outros respeitam a origem ). Outras, como não poderia deixar de ser, dificultam, como o uso do USE TABELA e outros recursos como um 
    DBF, pode esquecer. Não tem.

  3. Olá,

    Não sou nenhum "jênio", nem conheço metade do que o João postou ( GetInstance()? ). De toda forma, segue uma alternativa:
     

    cComando:="javaws.exe d:\progs\esocial\EsocialSign.jar"
    
    MyRun( cComando )
    
    return nil
    
    ///////////////////////////////////////////////////////////////////////////////////////
    function MyRun( cComando )
    
    local oShell, oRet
    
    oShell := CreateObject( "WScript.Shell" )
    oRet   := oShell:Run( "%comspec% /c " + cComando, 0, .T. )
    oShell := NIL
    
    return iif( oRet = 0, .t., .f. )
    
    ///////////////////////////////////////////////////////////////////////////////////////

     

  4. Olá,

    Quando você seleciona várias linhas e faz alterações, inserções, etc. em todas elas de uma vez, ou quando insere uma TAG ( to do ) em uma linha e busca pela tag em todo o projeto, ou ainda quando o editor autocompleta, ainda mais na quantidade ilimitada e facilidade de uso de "templates" entre inúmeros outros recursos, verá que vale muito a pena este princípio pouco amistoso. Além do mais, quando se usa mais de uma linguagem ( sei que você não dá conta disso hehehehehe ) ele atende perfeitamente.

  5. Olá,

    Tem tanto editor muito melhor que este seu ( e nem sei qual é ), que fica até difícil listar. Hoje uso o Sublime. Excelente. Tem recursos que economizam um tempão em algumas tarefas. Atualize-se. Só para te lembrar, estamos em 2017. E no final. Saia da era do bit lascado. :)

  6. Olá,

    Segue:

    ////////////////////////////DADOS DA FUNCAO/////////////////////////////////////////////////////
    // NOME       : EnviaSMS                                                                      //
    // SINTESE    : Enviar SMS                                                                    //
    // PARAMETROS : <1> aDados para envio ([1]='*', [2]=ID do cliente, [3]=celular, [4]=nome )    //
    //              [2] cTexto da mensagem                                                        //    
    // RETORNO    : Nada                                                                          //  
    ////////////////////////////////////////////////////////////////////////////////////////////////
    function EnviarSMS(aDadosEnvio, cMens )
    
    local aOcorr:={}, aSql, aMens:={} 
    local cCmdSql, cDdd:='', cMensagem, cId, cContaSms, cCodeSms, cRmteSms, cCelular, cTexto:='', cMensTotal:='', cMethod:='POST'
    local lOk:=.t.
    local x, nEnviados:=0, z, nSoma:=0
    local oWs
    
    private cTitulo1:='', cTitulo2:='', cMensEnv:=''
    
    cMens:=alltrim( cMens )
    
    cTitulo1:='OCORRÊNCIAS ENVIO SMS'
    
    //////////// informações cadastradas em um arquivo de configurações ///////////////////////////////
    cContaSms  :=      //conta na operadora 
    cCodeSms   :=      //senha na operadora
    cRmteSms   :=      //remetente
    nLimiteSms :=      //limite de caracteres
    cOperSms   :=      //operadora
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    
    oWS := WebConnect():New()
                  
    for x=1 to len( aDadosEnvio )
            if aDadosEnvio[x,1]='*' .and. !empty( SoNumeros( aDadosEnvio[x,3] ) )
                    lOk:=.t.
                    cCelular:=iif( cCelular<>SoNumeros( aDadosEnvio[x,3] ), alltrim( str( val( SoNumeros( aDadosEnvio[x,3] ) ), 14 ) ), cCelular )
                    
                    if lOk
                            aMens:={}
                            //Linhas acrescentadas para dividir as msgs caso ultrapasse o tamanho limite
                            if (len(cMens)/nLimiteSMS)>1
                                    //Adiciona as mensagens
                                    for z=1 to roundmax((len(rtrim(cMens))/nLimiteSMS))
                                           aadd(aMens,substr(cMens,1+nSoma,nLimiteSMS))
                                           nSoma:=nSoma+nLimiteSMS    
                                    next
                                    //Zera o nSoma
                                    nSoma :=0 
                            else
                                    //Adiciona somente uma msg
                                    aadd(aMens, cMens)
                            endif
                            
                            //Envia todas as msg
                            for z=1 to len(aMens)
                                    //Definindo id
                                    cId:=strzero(x,4)+strzero(z,2)+SoNumeros( dtoc( oVS:hoje ) )+SoNumeros( substr( time(), 1, 9 ) )+aDadosEnvio[x,2]
                                    
                                    //Envia msg
                                    if upper( cOperSms )='HUMAN'
                                            cMensEnv:='http://system.human.com.br:8080/GatewayIntegration/msgSms.do?dispatch=send&account='+cContaSms+'&code='+cCodeSms+'&from='+cRmteSms+'&to=55'+cCelular+'&id='+cId+'&msg='+aMens[z]
                                    elseif upper( cOperSms )='COMTELE'
                                            cMensEnv:='https://sms.comtele.com.br/api/'+cCodeSms+'/sendmessage?sender='+oVI:vpcCodCoop+'&receivers='+cCelular+'&content='+aMens[z]
                                    elseif upper( cOperSms )='MISTERPOSTMAN'
                                            cMensEnv:='http://www.misterpostman.com.br/gateway.aspx?UserID='+cContaSms+'&Token='+cCodeSms+'&NroDestino='+cCelular+'&Mensagem='+aMens[z]
                                    elseif upper( cOperSms )='M2MOBILE'
                                            cMethod:='GET'
                                            cId:=SoNumeros( dtoc( oVS:hoje ) )+SoNumeros( substr( time(), 1, 9 ) )
                                            cMensEnv:='https://www.m2mobile.com.br/smsservice/api/Repository/SendSms?logon='+cContaSms+'&password='+cCodeSms+'&mobile='+cCelular+'&message='+aMens[z]+'&dateSend='+dtoc( date() )+'&timeSend='+substr( time(),1,8 )+'&smsId='+cId
                                    elseif upper( cOperSms )='ICOOP'
                                            cMethod:='GET'
                                            cMensEnv:='http://apiweb.icoop-sms.com/index.php?validapi='+cCodeSms+'&acao=enviarSMS&telefone='+cCelular+'&mensagem='+aMens[z]
                                    endif
    
                                    cMensTotal+=cMensEnv+CR_LF
                                                          
                                    cTexto := oWS:Open( cMensEnv, cMethod )
                                    sysrefresh()
                            next
    
                            if substr( Caracter( cTexto ),1,3 )$'000' .or. 'SUCESSO'$upper( cTexto ) .or. cTexto='{"ResponseCode": "100"}' .or. cTexto='"OK"'
                                    nEnviados++
                            else
                                    cTexto:=Caracter( cTexto )
                                    aadd( aOcorr, { aDadosEnvio[x,2], aDadosEnvio[x,4], cCelular, substr(cTexto,1,3), substr(cTexto,7 ) } )
                            endif
                    endif
            endif
    next
    
    memowrit( 'sms.txt', cMensTotal )
    
    if len( aOcorr )>0
            RelatFrh( 'Ocorrências', {}, 'sbr_sms_ocor', 'R', 'SBR_SMS', aOcorr, { 'Conta', 'Nome', 'Celular', 'Cod', 'Ocor' } )
    endif
    
    if nEnviados>0
            Msginfo( 'Enviadas '+alltrim( str( len(aMens), 3 ) )+' mensagens a cada cooperado.'+CR_LF+'Mensagem enviada a '+alltrim( str( nEnviados, 3 ) )+' cooperados'+CR_LF+'Total de mensagens enviadas '+alltrim( str( nEnviados*len(aMens), 3 ) ) )
            oWS:end()
    end
    
    return nEnviados
    
    ///////////////////
    Class WebConnect
    //////////////////
    Data oWeb
    Method New() Constructor
    Method Open()
    Method End() INLINE ::oWeb:=Self:=Nil
    EndClass
    
    Method New() Class WebConnect
    Try
    ::oWeb := CreateObject('MSXML2.XMLHTTP')
    Catch
    ::oWeb := CreateObject('Microsoft.XMLHTTP')
    End
    Return Self
    
    Method Open( cUrl, cMethod ) Class WebConnect
    Local cRet := ""
    
    DEFAULT cMethod:='POST'
    
    If ValType( cUrl ) == 'U'
    Return cRet
    EndIf
    Try
    ::oWeb:Open( cMethod, cUrl,.f.)
    ::oWeb:Send()
    cRet := ::oWeb:responseBody
    Catch; End
    
    Return cRet

     

  7. Olá,

    A grande questão é: você vai migrar todo o sistema para comandos SQL, sem usar nada do DBF ( use arquivo, seek, etc.)? 
    Em caso positivo, use as funções do FW ou do Harbour. Porém se o sistema é grande e não dá para migrar tudo, use a SqlLib que você migra para MySql em meio dia de serviço ( migrando as tabelas com o aplicativo que o Grande Kleyber desenvolveu ) e depois migre os pontos mais críticos até completar o processo. Aí fica mais fácil mudar para as funções nativas  do FW ou Harbour.

×
×
  • Create New...