Jump to content
Fivewin Brasil

Geraldo (gbsilva)

Membros
  • Posts

    1,495
  • Joined

  • Last visited

  • Days Won

    6

Posts posted by Geraldo (gbsilva)

  1. Olá Valdir como vai!

    Hoje que estou vendo o seu post. Sabe que cheguei a montar um tempo atrás um exemplo completo com a TDolphin para você, mas não tive como enviá-lo, nem me lembro mais como fiz, mas tenho ele aqui.

    Estou de passagem aqui no momento, mas e quanto ao mysql, pode estar faltando algum detalhe, a senha esta correta, onde esta o seu mysql numa máquina local acredito, pois no seu .ini esta localhost. Falo isso porque ao instalar tem uma solicitação de flegar sobre conexão via ip e que deve ser flegada ou não acessa, mas local funcionaria.

    Tente usar em vez de localhost assim:

    [mysql]
    // Endereço de IP
    host = 127.0.0.1
    user = root
    port = 3306

    Você criou no mysql o banco e tabelas? são perguntas bobas, mas pode ser por ai rsss....apanhei muito também.

    Estou a disposição, se estiver interessado darei uma olhada no exemplo que te falei e te passo para tentar compilar ai.

    Abaixo um exemplo do que utilizo atualmente, parte de um Main() e uma classe que criei para configurações:

    Function Main()  // Menu Principal
        local nEntry := 0 
        local oBar,oIco,oHand
    	 local oSfa,cRede:=""
    	 Private oConn,oServer
    	 PUBLIC oWnd,oGbs 
    
    	 //-> Instancia Classe TGbSilva()
    	 oGbs := TGbsilva()
    	 //-> Instancia objeto e iguala atributos antes de verificar versão do sistema
        oSfa := TGbConfig():new()
    	 oSfa:versao      := "1.1.0"    //-> Versão
        oSfa:ini_file    := "gb_connect.ini"  //-> Nome do arquivo .ini
      	 oSfa:sistema     := "Sistema de Atendimento - Facilidades (SISAF)"
    	 oSfa:ini_set     := "mysql"
    	 ********************************************************************************************
    	 * Definição do Banco de Dados e senha de acesso
    	 ********************************************************************************************
    	 oSfa:ini_dbname := "Sagre"   //-> Database mysql
        oSfa:password   := "123"    //-> Senha 
    	 ********************************************************************************************
    	 //-> Chama arquivo .ini 
    	 oSfa:SetIni()
    	 //-> Verifica se o Sistema já esta sendo executado
    	 IF !oSfa:SisExec("Sisaf.exe")
           BringWindowToTop( oWnd )
           return(nil)
    	 ENDIF
    	 //-> Configurações gerais do Sistema
    	 oSfa:Set()
        //-> Chama método para conectar ao banco de dados
    	 IF ( oServer := oSfa:Connect() ) == NIL
    	      BringWindowToTop( oWnd )
    		   return(nil)
    	 ENDIF
    	 //-> Chama módulo de acesso ao sistema (acesso.prg)
    	 IF !Login(@nEntry) 
           BringWindowToTop( oWnd )
    		 return(.f.)
        ENDIF
    	 //-> Trata retorno do Login()
    	 IF nEntry = 1
           BringWindowToTop( oWnd )
           return(.f.)
        ENDIF
        ....
        ....
        ....
    
    #include "FiveWin.ch"
    #include "xbrowse.ch"
    #include "tsbutton.ch"
    #include "config.ch"
    
    
    #ifdef rdd_tdolphin
    	 #include "tdolphin.ch" //-> usando Tdolphin
    #else
        #Include "sqllib.Ch"  //-> usando sqllib
    #endif
    
    ************************************************************************************************************************
    CLASS TGbConfig FROM TGbSoftware 
      DATA sistema,versao,lReturn,CLR_GetFocus
      DATA apDados,aImagens
      DATA ini_dbname,ini_empresa,ini_host,ini_user,ini_porta,ini_file,ini_reshor,ini_resver,ini_exe,password
      DATA ini_rede,ini_endclasse,ini_set,ini_endesp
      DATA id_imagem,nome,filec
      
      
      METHOD New() CONSTRUCTOR
      METHOD SisExec(_cSistema)
      METHOD SisVersao()
      METHOD Set()
      METHOD SetIni()
      METHOD Connect()
      
    ENDCLASS
    
    METHOD New() CLASS TGbConfig
      super:New()
      ::sistema       := "Nome do Sistema"
      ::versao        := "" 
      ::lReturn       := .f.
      ::apDados       := {}
      ::aImagens      := {}
      ::CLR_GetFocus  := NRGB(255,208,047)  // RGB(235,255,145)
      
      ::ini_set       := "mysql"  //-> nome da variável do arquivo .ini
      ::ini_dbname    := ""
      ::ini_file      := ""
      ::ini_empresa   := ""
      ::ini_host      := "127.0.0.1"
      ::ini_user      := "root"
      ::ini_porta     := 3306
      ::ini_exe       := ""
      ::ini_reshor    := 1024
      ::ini_resver    := 768
      ::password      := "123"
      ::ini_rede      := ""
      ::ini_endclasse := ""
      ::ini_endesp    := ""
      ::id_imagem     := space(2)
      ::nome          := space(20)
      ::filec         := space(20)
    
    return self
    
    METHOD SisVersao() CLASS TGbConfig
      local cSql,aVersao[1],lVersao:=space(10)
      local oQry
      
      cSql := "SELECT versao" +;
              " FROM cadastro.versao"  +;
    			 " WHERE sistema='"+oGbs:id_sistema+"' AND status='1' LIMIT 1 ;"
      #ifdef rdd_tdolphin
    			oQry := oServer:Query(cSql)
    			lVersao := oQry:FieldGet(1)
    			oQry:End()
      #else
    			aVersao := SqlArray(cSql)
    			lVersao := aVersao[1,1]
      #endif
      if ::versao <> alltrim(lVersao)
      	  If !MsgYesNo("Existe uma nova versão, Deseja atualizar o Sistema (S/N) ?","Atualização do Sistema",2)
    	     ::lReturn := .f.
    	  Else
    	     ::lReturn := .t.
    	  Endif  
    	  return(.f.) 
      endif
    return(.t.)  
    
    //-> Verifica se o sistema já esta sendo executado
    METHOD SisExec(_cSistema) CLASS TGbConfig
      if (IsExeRunning(_cSistema) )
         MsgStop("Sistema "+STRTOKEN(_cSistema,1,".") +" já esta sendo executado","Atenção!!!")
    	  return(.f.)
      endIf
    return(.t.)
    
    METHOD Set() CLASS TGbConfig
        //-> Configuração Para Todo o Sistema
        SET 3DLOOK ON
        SET CENTURY ON                // 4 DIGITOS PARA O ANO
        SET CONFIRM OFF               // (mudei, eu) CURSOR NÃO PODE DESLOCAR-SE AUTOMATICAMENTE
        SET CURSOR ON                 //-SetCursor( if(Upper("ON") == "ON", 1, 0) )
        SET DATE BRITISH              // FORMATO DD/MM/AAAA
        SET DATE FORMAT "dd/mm/yyyy"  // IGUAL AO ANTERIOR, APENAS REFOR€O.
        SET DELETED ON                // ON IMPEDIR VER REGISTROS MARCADOS PARA APAGAR
        SET DECIMALS TO 2
        SET EPOCH TO (Year(Date())-50)// PARA IMPEDIR QUE O ANO SEJA 00
        SET ESCAPE ON                 // TECLA ESC LIGADA, POSSO ESCAPAR.
        SET EXCLUSIVE OFF             // REDE NETUSE LIGADA
        //NOTA: As Funcoes OrdKeyCount() e OrdKeyNo() Nao Trabalham se OPTIMIZE
        //Esta em OFF, ou se uma variavel de filtro e um elemento de matriz.
        SET MULTIPLE ON               // PARA QUE SE POSSA ACIONAR QUANTAS JANELAS QUISER
        SET OPTIMIZE ON               // OPTIMIZAR OS FILTROS(DBSETFILTER)
        SET SOFTSEEK OFF              // OBRIGATÓRIO "OFF" PARA USO COM MYSQL
        SET UNIQUE OFF                // PERMITIR OU NÇO CHAVES COM DUPLICIDADE
        SET WRAP ON                   //-Set( 35, "ON" ) // PARA MENUS
        SETCANCEL( .F. )              // INUTILIZA ALT + C PARA ABORTAR PROGRAMA
    
        #ifdef rdd_sqllib
    	    SET CUSTOM INDEXES ON         // ATIVA O USO DE ÍNDICES CUSTOMIZADOS (COM FUNÇÃO)
        #endif
        
        REQUEST DBFCDX                // CHAMADA AO BANCO DBFCDX OU _DBFCDX
        REQUEST HB_CODEPAGE_PT850
        REQUEST HB_LANG_PT
        HB_SETCODEPAGE("PT850")
        HB_LANGSELECT("PT")
        RDDSETDEFAULT( "DBFCDX" )     // CARREGA RDD DEFINIDO NO CASO, *.CDX
        DBSETDRIVER( "DBFCDX" )       // CARREGA RDD DEFINIDO NO CASO, *.CDX
    
        //SetGetColorFocus( RGB(235,255,145) )
        SetGetColorFocus( ::CLR_GetFocus )
    return(.t.)
    
    METHOD Connect(n) CLASS TGbConfig
       local c 
       local hIni      
       local oServer,nFlags
    	local oErr
    	   
       c = "mysql"
       if n != NIL 
          c = "mysql" + AllTrim( Str( n ) )
       endif
       
    	#ifdef rdd_sqllib
    		
    		SQL CONNECT ON ::ini_host ;
          PORT ::ini_porta ;
          DATABASE ::ini_dbname ;
          USER ::ini_user ;
          PASSWORD ::password ;
          OPTIONS SQL_NO_WARNING ;
          LIB "MySQL"
          
    		IF SQL_ERRORNO() > 0
             Alert("Não foi possível conectar ao banco de dados !"+CRLF+;
                   "Informe esta mensagem ao suporte: "+CRLF+;
             SQL_ErrorMsg())
             return(.f.)
          ENDIF
          RddSetDefault("MySQL")
          return(.t.)
       #else
    	oServer := NIL
    	nFlags  := 0
    	TRY
           CONNECT oServer HOST ::ini_host ;
                           USER ::ini_user ;
                           PASSWORD ::password ;
                           PORT ::ini_porta ;
                           FLAGS nFlags;
                           DATABASE ::ini_dbname
                                   
          CATCH oErr 
       	  ? hb_dumpvar( oErr )
            RETURN NIL
          END
    		RETURN oServer
    	#endif
    return(.f.)
    
    METHOD SetIni() CLASS TGbConfig
       local c,oWnd,hIni
       
       c = ::ini_set //-> variável do arquivo .ini
       
    	#ifdef rdd_sqllib  //-> somente usado método com sqllib
    		INI hIni FILE ".\"+::ini_file
      		    GET ::ini_host      SECTION c ENTRY "host"       OF hIni 
    	       GET ::ini_user      SECTION c ENTRY "user"       OF hIni 
    	       GET ::ini_porta     SECTION c ENTRY "port"       OF hIni 
    	   ENDINI
    	#else
    		//-> chama o arquivo .ini
    		hIni := HB_ReadIni( ::ini_file )
          //-> atribui valores do ini
    		::ini_host      := hIni[ c ]["host"]
          ::ini_user      := hIni[ c ]["user"]
          ::ini_porta     := val(hIni[ c ]["port"])
    	#endif
    return nil
    
    ************************************ FINAL DA TGBCONFIG ****************************************************************
    
  2. Só umas considerações sobre o código, não sei se o que faço esta mais correto ou não, mas trabalho com tabelas com muitos registros e não tenho problema com lentidão.

    cSql="SELECT data,produto,descricao"
    cSql+=" FROM (SELECT MAX(pe.data) AS data,pe.produto,pr.descricao"
    cSql+=" FROM pedido as pe, produto as pr"
    cSql+=" WHERE pe.tipo='1'"
    cSql+=" AND pe.produto = pr.codigo"
    cSql+=" GROUP BY pe.produto"
    cSql+=" ORDER BY pe.produto) sald"
    cSql+=" WHERE data < '2015-11-30'"

    Por exemplo se tenho um sub-select e atribui o alias dele como sald os campos do select final sempre referencio como sald.campo. Outra coisa as tabelas pedido e produto uso um ON para relacioná-las e nunca um AND no WHERE como no código. Terceiro nunca coloco ORDER BY no sub-select faço no final usando o alias como coloquei na minha sugestão.

    Mestre Evandro também não utilizo temporárias e gostei do seu exemplo, qualquer hora farei algum teste para ver se posso melhorar minhas consultas.

    Sds a todos,

  3. Luiz tenho uma sugestão se quiser tentar.

    cSql := "SELECT sald.data,sald.produto,sald.descricao" +; 
            " FROM (SELECT MAX(pe.data) AS data,pe.produto,pr.descricao" +;
            " FROM pedido AS pe" +;
    	" INNER JOIN produto AS pr ON pe.produto = pr.codigo" +;
            " WHERE pe.tipo='1'" +;
            " GROUP BY pe.produto ) sald " +;
            " WHERE sald.data < '2015-11-30'" +;
            " ORDER BY sald.produto ; "
    
    
  4. Boa tarde pessoal!

    De volta com problema do Windows 7. Compilei o sistema no Win7 32 bits, tudo funciona com exceto quando estou tentando gravar uma planilha de excel usando a TOleauto() dá o erro abaixo.

    Nas máquinas 32 bits funciona normal, alguém sabe o que devo fazer nas máquinas 64 bits para conseguir gravar?

    Obs.: Não tenho permissão aqui na empresa para compilar no notebook que são os de 64 bits, para conseguir vai levar muito tempo e burocracia, pois trabalho numa empresa grande e é difícil essas autorizações.

    Se alguém souber algum maçete agradeço.

    Application
    ===========
    Path and name: D:\Projetos\Sisaf\Sisaf.EXE (32 bits)
    Size: 3,788,288 bytes
    Time from start: 0 hours 1 mins 14 secs
    Error occurred at: 01/02/2016, 12:50:29
    Error description: Error Excel.Application/0 S_OK: SAVE
    Args:
    Stack Calls
    ===========
    Called from TOLEAUTO:SAVE(0)
    Called from TATENDIMENTO:SAVEPLANILHASAGRE(1321)
    Called from TATENDIMENTO:PRINTINSPECAOSAGRE(914)
    Called from GERARPRINT(295)
    Called from (b)ATEND(239)
    Called from TBUTTONBMP:CLICK(157)
    Called from TBUTTON:HANDLEEVENT(1654)
    Called from TBUTTONBMP:HANDLEEVENT(290)
  5. Bom dia João tudo bem!

    Eu utilizo justamente essa opção do "Módulos do sistema", mas não consigo ver a opção, veja na imagem que postei que estou com a lib selecionada e só aparecem do lado direito duas linhas compile e nome do arquivo, não tem mais opções.

    Se seleciono um prg aparecem mais opções, mas no caso da lib não. Estou em uma nova empresa e aqui só tenho Win 7 e nunca havia testado antes.

    Que versão da xDev você esta utilizando? a minha é 0.7.

    Grato,

  6. Olá pessoal, estou tentando compilar um projeto no Win7, até hoje sempre fiz no XP e acontece que tem algumas lib´s que preciso marcar sim ou não se elas serão compiladas antes do fivewin e quando entro em propriedades do projeto não aparece essa opção, alguém já passou por isso?

    Agradeço ajudas.

    post-4705-0-57706800-1454061483_thumb.jpg

  7. Luiz uma tentativa:

    SELECT res.produto,

    res.maiordata

    FROM

    (SELECT pe.produto,

    MAX(pe.data) AS maiordata
    FROM pedido AS pe
    GROUP BY pe
    .produto ) res
    WHERE res.maiordata
    < '2014-01-01'

    ORDER BY res.produto,

    res.maiordata (se quiser ordenar, por exemplo)

    Sobre os índices acho que você tem muito índice para uma única tabela e por acaso você não esta criando/atualizando esses índices antes desse select não né, pois índice em mysql cria uma vez e pronto, nem deve mencioná-lo mais, pois o próprio mysql trata de atualizá-los.

    Pior não fica rsss...., então tenta como acima para ver o que acontece?

    Sds,

  8. Luiz você consegue acessar um outro banco fazendo assim, não sei mas acho que talvez possa ser a solução.

    Voce conecta no banco1, por exemplo e usando (banco.tabela) você pode trabalhar em qualquer outro banco do seu mysql.

    SELECT a.campo1,

    a.campo2,

    b.campo3

    FROM banco1.tabela a

    INNER JOIN banco2.tabela b

    ON a.registro = b.registro ;

    Sds,

  9. Luiz se tem não sei, mas as vezes acontece algo parecido no meus projetos. Experimente criar uma outra pasta com outro nome e copie todo seu projeto e tente compilar na nova pasta, inclusive com o novo arquivo.

    É uma tentativa, mas se for o mesmo caso pode dar certo.

    Como disse não sei precisar o porque, mas as vezes acontece comigo.

    Sds,

  10. Olá João tudo bem!

    Sim tranquilo, abaixo uma rotina bem antiga, mas usada ainda. A função para gravar esta dentro do For/Next a cada linha lida da planilha do excel atribui os valores aos atributos do objetos oCpo e grava no mysql, com DBF seria o mesmo processo.

    Dúvidas a disposição.

    STATIC function ImportaPastas(oCpo,aBEmpresas,aBServicos,aBPastas,aBTipos,aBases,oMet,nTotal)
      Local nP,nF,nT,aDados:={},aFalhas:={},nDados:=0,lContrato:="",cServico:="",lPasta:=space(10)
      Local nFalha :=0,lError:=0,nReg:=1,nFalhas:=0,lNewFile:="",cArquivo:=""
      Local lHoraInicio,lHoraFim,cTempo,conta:=0,lPeriodo:=space(4),lDefinePeriodo:=space(5) 
      Local aClasses:={},cRetorno:=space(1),lAnexo:=space(4),lTipoObra:=space(1)
      Local lNumberTel:=space(7),nNumberTel:=0,cContrato:="",cBase:="",lGrupoAcq:=space(7)
      Local lPep1:="",lPep2:="",cFirstGrupo:=space(7)
      local nTipoAnexo := 0
      
      If !AutoMan(,2)
    	  return(.f.)
      Endif
    
      If empty(left(oCpo:periodo,2)) .or. empty(right(oCpo:periodo,2))
         GbMsg("Favor digitar o período das obras!",,2)
         GbFoco(oMet[1])
    	  return(.f.)
      Endif
      
      If !ClasseObras(aClasses)
         GbMsg("Não foi carregados tipos de obras!",,2)
         GbFoco(oMet[1])
    	  return(.f.)
      Endif
      lPeriodo := (right(oCpo:periodo,2)+left(oCpo:periodo,2))
      lDefinePeriodo := lPeriodo+cRetorno
    
      cArquivo:= cGetFile32("*.XLS","Escolha o arquivo")
      IF !File(cArquivo)   
          RETURN
      ENDIF
      lNewFile := cArquivo
    
      cursorwait()
    
      LeExcel( lNewFile,@aDados, 24, {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24},1,2,,.f. )
      nDados:=Len(aDados)
      lHoraInicio := Time()
      oMet[2]:ntotal = nDados
      if nDados = 0
         GbMsg("Nenhuma obra foi encontrada na planilha de origem, favor verificar!",,2)
         GbFoco(oMet[5])
    	  return(.f.)
      endif
      //-> Ordena matriz para pegar o menor grupo_acq na primeira linha
      ASORT(aDados,,,{|x,y| x[1] < y[1] })
      //-> Iguala para carregar apenas obras já gravadas a partir do menor grupo_acq da importação
      cFirstGrupo := STR(aDados[1,1],0)
      //-> Atualiza texto ao iniciar barra 
      oCpo:processo  := "Carregando Tabelas [Empresas, Serviços e Obras]...Aguarde [GbSoftware]"
      oMet[3]:SetText(oCpo:processo) 
    
      If !CarregaPastas(@aBPastas,cFirstGrupo)
         GbFoco(oMet[5])
    	  return(.f.)
      Endif
      //-> Carrega array com obras já cadastradas de acordo com maior grupo da planilha a ser importada
      CarregaEmpresas(@aBEmpresas)
      
      CarregaServicos(@aBServicos)
      CarregaGisBase(aBases)
      
      //-> Atualiza texto ao iniciar barra 
      oCpo:processo  := "Lendo Planilha Excel...Aguarde [GbSoftware]"
      oMet[3]:SetText(oCpo:processo) 
      //-> Atualiza texto ao iniciar barra 
      oCpo:processo  := "Importando Obras...Aguarde [GbSoftware]"
      oMet[3]:SetText(oCpo:processo) 
    
      For nP = 1 to nDados
    		//-> se a coluna tiver preenchimento consulta tabela cad_nome_obras
    		oCpo:tipo_obra := space(1)
    		oCpo:tipo      := space(1)
    		nTipoAnexo := 0
    		if !empty(aDados[nP,7])
    			if !MClasse(oCpo,aClasses,aDados[nP,7])
                aAdd(aFalhas,{alltrim(STR(aDados[nP,1],0)),"Não encontrou classe de obra"} )
    			   loop
    		   endif
    		   oCpo:tipo := oCpo:tipo_obra
    		else
    		  if empty(oCpo:tipo) //-> se for vazio entra nessa opção antiga
    		     if empty(aDados[nP,7]) .AND. empty(aDados[nP,10]) //-> Não tem anexo e gerobras então é Manutenção
    		        oCpo:tipo := "M" //-> Obra de Manutenção
    			  else
    			     if empty(aDados[nP,7]) //-> Se for vazio ANEXO 
    					  aAdd(aFalhas,{alltrim(STR(aDados[nP,1],0)),"Implantação sem ANEXO 1"} )
    			        loop
    		        endif
    			     oCpo:tipo := "I" //-> Obra de Implantação
    			     oCpo:m_obra := "T"
    		        lAnexo := aDados[nP,7]
    		        nTipoAnexo := 1
    		     endif
            else
               oCpo:tipo := oCpo:tipo_obra
            endif
    		endif
    		if oCpo:tipo = "M"  //-> Manutenção
    			if !empty(aDados[nP,7]) //-> Anexo preenchido
    			   lAnexo := aDados[nP,7]
    			   if alltrim(upper(aDados[nP,8])) == "ATIVIDADE"  .OR. upper(aDados[nP,8]) = "ATIVIDADES"
    		         oCpo:m_obra := "T"
    		      else
    				   oCpo:m_obra := "A"
    				endif 
    			else
    			   If alltrim(upper(aDados[nP,8])) == "ATIVIDADE"  .OR. upper(aDados[nP,8]) = "ATIVIDADES"
    		         oCpo:m_obra := "T"
    		         lTipoObra   := "1"
    		      Elseif alltrim(upper(aDados[nP,8])) == "ATIVIDADE /POU" 
    		         oCpo:m_obra := "T"
    		         lTipoObra   := "2"
    		      Elseif alltrim(upper(aDados[nP,8])) == "ACESSO" 
    		         oCpo:m_obra := "A"
    		         lTipoObra   := "1"
    		      Else
                   aAdd(aFalhas,{alltrim(STR(aDados[nP,1],0)),"Faltou mão de obra"} )
    			      loop
    		      Endif
    		      If alltrim(aDados[nP,24]) == "FO"
    		         If oCpo:m_obra = "T"
    		            lAnexo := "OR03"  //-> Manutenção Fibra Atividade (ver tabela cad_nome_obras)
    		         Else
    			         lAnexo := "OR04"  //-> Manutenção Fibra Acesso (ver tabela cad_nome_obras)
    			      Endif   
    		      Else
    		         If oCpo:m_obra = "T" .AND. lTipoObra = "1"   //-> OR normal Atividade
    		            lAnexo := "OR02"
    		         Elseif oCpo:m_obra = "T" .AND. lTipoObra = "2"  //-> POU Atividade
    			         lAnexo := "PU01"
    		         Elseif oCpo:m_obra = "A" .AND. lTipoObra = "2"  //-> POU Acesso
    			         lAnexo := "PU01"
    		         Elseif oCpo:m_obra = "A" .AND. lTipoObra = "1"  //-> OR normal Acesso
    			         lAnexo := "OR01"
    			      Endif   
                Endif
             Endif //? "M3 - Anexo",oCpo:tipo,lAnexo,"Com Tipo"
    		else //-> Obras de Implantação
    			if nTipoAnexo = 0
    			   If empty(aDados[nP,7]) //-> Se for vazio ANEXO 
                   aAdd(aFalhas,{alltrim(STR(aDados[nP,1],0)),"Implantação sem ANEXO 2"} )
    			      loop
    		      Endif
    			   oCpo:tipo := "I" //-> Obra de Implantação
    			   oCpo:m_obra := "T"
    		      lAnexo := aDados[nP,7]
    		   endif
    		endif
    		If !MClassificacao(oCpo,aClasses,lAnexo,@cRetorno)
             aAdd(aFalhas,{alltrim(STR(aDados[nP,1],0)),"Não encontrou classe de obra"} )
    			loop
          Endif
          //-> Definindo número da pasta
    		lDefinePeriodo := lPeriodo+cRetorno  //-> Período digitado + classe da tabela cad_nome_obras
    		lNumberTel     := StrZero(aDados[nP,1],7) //-> Pega grupo da planilha do gcore
    		oCpo:codigo    := lDefinePeriodo+lNumberTel //-> A junção dos dois gera o número da pasta 
    		//-> Pega o grupo_acq do gcore para gravar na tabela cad_obras
    		lGrupoAcq      := STR(aDados[nP,1],0)
    		oCpo:grupo_acq := VAL(lGrupoAcq)
    		********************************************************************
    		//-> Pega o número do contrato na planilha e faz a busca em MEmpresa() para identificar a empresa da obra
    		If valtype(aDados[nP,2]) = "N"
    		   cContrato := STR(aDados[nP,2],0)
    		Else
    		   cContrato := alltrim(aDados[nP,2])
    	   Endif
    		If MEmpresa(oCpo,aBEmpresas,cContrato)
    			If valtype(aDados[nP,4]) = "N"
    			   oCpo:zona := STR(aDados[nP,4],2)
    			Else
    			   oCpo:zona := alltrim(aDados[nP,4])
    			Endif   
    		   oCpo:escritorio := aDados[nP,5]
    		   oCpo:estacao    := aDados[nP,6]
    		Else
    			aAdd(aFalhas,{alltrim(STR(aDados[nP,1],0)),"Não achou empresa"} )
    			loop
    		Endif
    		//-> Identifica o tipo de serviço da obra
    		If !MServico(oCpo,aBServicos,oCpo:nome_obra)
    			aAdd(aFalhas,{alltrim(STR(aDados[nP,1],0)),"Não achou tipo serviço"} )
    			loop
    		Endif
    		//-> Modificado para tratar se o gerobras estiver na coluna errada
    		If !empty(aDados[nP,9])
    			//-> se tem gerobras então não tem projeto/sgci ai zera a variável oCpo:projeto
    			oCpo:projeto := space(15)
    			If VALTYPE(aDados[nP,9]) = "N"
    			   oCpo:pep := alltrim(STR(aDados[nP,9],10,0))
    			Else
    			   //-> Trata, pois em alguns casos vem apenas um traço na planilha
    				If alltrim(aDados[nP,9]) = "-"
    				   oCpo:pep := space(10)
    				Else //-> se tiver traço no meio do pep trata e tira o traço  
    					lPep1 := alltrim(StrToken(aDados[nP,9],1,"-"))
                   lPep2 := alltrim(StrToken(aDados[nP,9],2,"-"))
    					oCpo:pep := lPep1+lPep2
    				Endif	
    			Endif   
    		   //-> Se estiver na coluna 10 o gerobras sai daqui  (as vezes o gerobras vem na coluna projeto)
    			If !empty(aDados[nP,10])
    		      If VALTYPE(aDados[nP,10]) = "N"
    			      oCpo:gerobras := alltrim(STR(aDados[nP,10],30,0))
    			   Else
    			      If alltrim(aDados[nP,10]) = "-"
    				      oCpo:gerobras := space(30)
    				   Else   
    			         oCpo:gerobras := alltrim(aDados[nP,10])
    			      Endif   
    			   Endif   
    		   Endif
    		   //-> Se estiver na coluna 11 o gerobras sai daqui
    			If !empty(aDados[nP,11])
    		      If VALTYPE(aDados[nP,11]) = "N"
    			      oCpo:gerobras := alltrim(STR(aDados[nP,11],30,0))
    			   Else
    			      //-> Trata, pois em alguns casos vem apenas um traço na planilha
    					If alltrim(aDados[nP,11]) = "-"
    				      oCpo:gerobras := space(30)
    				   Else   
    			         oCpo:gerobras := alltrim(aDados[nP,11])
    			      Endif   
    			   Endif   
    		   Endif
    		Else   //-> se é projeto/sgci zera variáveis pep e gerobras 
    		   oCpo:pep      := space(10)
    		   oCpo:gerobras := space(30)
    		   If !empty(aDados[nP,11])
    		      If VALTYPE(aDados[nP,11]) = "N"
    			      oCpo:projeto := alltrim(STR(aDados[nP,11],15,0))
    			   Else
    			      //-> Trata, pois em alguns casos vem apenas um traço na planilha
    					If alltrim(aDados[nP,11]) = "-"
    				      oCpo:projeto := space(15)
    				   Else   
    			         oCpo:projeto := alltrim(aDados[nP,11])
    			      Endif   
    			   Endif   
    		   Else
    		      oCpo:projeto := space(15)
    		   Endif
    		Endif
    		//-> Os campos 12 a 15 são tratados se no valor vier ponto em vez de vírgula
    		If !empty(aDados[nP,12])
    			IF VALTYPE(aDados[nP,12]) = "N"
    			   oCpo:pontol := aDados[nP,12]
    			ELSE
    			   IF AT(",",aDados[nP,12]) = 0
    			      oCpo:pontol := aDados[nP,12]
    			   ELSE
    			      oCpo:pontol := STRTRAN(aDados[nP,12],",",".")
    			   ENDIF
    			ENDIF
    		Else
    		   oCpo:pontol := '0'
    		Endif   
    		If !empty(aDados[nP,13])
    			IF VALTYPE(aDados[nP,13]) = "N"
    			   oCpo:pontoc := aDados[nP,13]
    			ELSE
    			   IF AT(",",aDados[nP,13]) = 0
    			      oCpo:pontoc := aDados[nP,13]
    			   ELSE
    			      oCpo:pontoc := STRTRAN(aDados[nP,13],",",".")
    			   ENDIF
    			ENDIF
    		Else
    		   oCpo:pontoc := '0'
    		Endif   
    		If !empty(aDados[nP,14])
    			IF VALTYPE(aDados[nP,14]) = "N"
    			   oCpo:pontog := aDados[nP,14]
    			ELSE
    			   IF AT(",",aDados[nP,14]) = 0
    			      oCpo:pontog := aDados[nP,14]
    			   ELSE
    			      oCpo:pontog := STRTRAN(aDados[nP,14],",",".")
    			   ENDIF
    			ENDIF
    		Else
    		   oCpo:pontog := '0'
    		Endif                                   
    		If !empty(aDados[nP,15])
    			IF VALTYPE(aDados[nP,15]) = "N"
    			   oCpo:valor := aDados[nP,15]
    			ELSE
    			   IF AT(",",aDados[nP,15]) = 0
    			      oCpo:valor := aDados[nP,15]
    			   ELSE
    			      oCpo:valor := STRTRAN(aDados[nP,15],",",".")
    			   ENDIF
    			ENDIF
    		Else
    		   oCpo:valor := '0'
    		Endif   
    		//-> Título da obra
    	   If !empty(aDados[nP,16])
    	      If alltrim(aDados[nP,16]) = "-"
    			   oCpo:titulo := space(1)
    			Else   
    				oCpo:titulo := alltrim(aDados[nP,16])
    			Endif   
    		Else
    		   oCpo:titulo := space(1)
    		Endif
    		//-> Nome da Cidade
    	   If !empty(aDados[nP,17])
    	      If alltrim(aDados[nP,17]) = "-"
    			   oCpo:localidade := space(1)
    			Else   
    				oCpo:localidade := alltrim(aDados[nP,17])
    			Endif   
    		Else
    		   oCpo:localidade := space(1)
    		Endif
    		//-> CNL
    	   If !empty(aDados[nP,19])
    		   If VALTYPE(aDados[nP,19]) = "N"
    			   oCpo:cnl := alltrim(STR(aDados[nP,19],0))
    			Else
    			   If alltrim(aDados[nP,19]) = "-"
    			      oCpo:cnl := space(1)
    			   Else   
    				   oCpo:cnl := alltrim(aDados[nP,19])
    			   Endif   
    		   Endif
    		Else
    		   oCpo:cnl := space(1)
    		Endif
    		//-> Nome da Central (Invertido para pegar o CNL pronto)
    		cBase := (oCpo:escritorio+oCpo:estacao+oCpo:cnl)
    		If !MBase(oCpo,aBases,cBase)
    		   oCpo:gis     := space(4)
    		   oCpo:base    := space(15)
    		   oCpo:central := space(30)
    		Endif
    		cBase := ""
    		//-> Endereço
    	   If !empty(aDados[nP,20])
    	      if VALTYPE(aDados[nP,20]) = "N"
    			  if aDados[nP,20] = "-"
    			     oCpo:endereco := space(1)
    			  else   
    				  oCpo:endereco := aDados[nP,20]
    			  endif   
    	      else
    			  If alltrim(aDados[nP,20]) = "-"
    			     oCpo:endereco := space(1)
    			  Else   
    				  oCpo:endereco := alltrim(aDados[nP,20])
    			  Endif   
    	      endif
    		Else
    		   oCpo:endereco := space(1)
    		Endif
    		//-> Observações
    		oCpo:historico := ""  //-> Limpando variável antes de ler a coluna
    	   If !empty(aDados[nP,21])
    	      If alltrim(aDados[nP,21]) = "-"
    			   oCpo:historico := ""
    			Else   
    				oCpo:historico := alltrim(aDados[nP,21])
    			Endif   
    		Else
    		   oCpo:historico := ""
    		Endif
    		lError := 0 //-> Padrão é erro zero se houver algum problema modifica na funçao MPasta() antes de gravar
    		If !GravaObra(oCpo,aDados,aBPastas,@lError)
    			If lError = 1
    			   aAdd(aFalhas,{alltrim(STR(aDados[nP,1],0)),"Duplicidade de pasta"} )
    			Elseif lError = 2
    			   aAdd(aFalhas,{alltrim(STR(aDados[nP,1],0)),"Erro de gravação"} )
    			Endif
    			loop
    		Endif
    		oMet[2]:Set(nReg)
          oMet[2]:cText:="Obra Nº "+ Strzero(nReg,6)+" de "+Strzero(nDados,6)+" Gravado Pasta: "+oCpo:pasta +SPACE(10)
          oMet[2]:Refresh()
    		nReg++
      Next
      cursorarrow()
      lHoraFim := Time()
      cTempo := ElapTime(lHoraInicio,lHoraFim)
      nFalhas := Len(aFalhas)
      If nFalhas > 0
         oCpo:processo  := "Importação concluída - Tempo: "+cTempo
    	  oMet[3]:SetText(oCpo:processo) 
         If !MsgYesNo("Não foram importadas "+strzero(nFalhas,4)+" pastas, deseja verificar (S/N) ?"+CRLF+;
    	               "Tempo Decorrido: "+cTempo,"Atenção")
    	     return(nil)
    	  Endif 
    	  ListaFalhas(aFalhas)
      Else
         oCpo:processo  := "Importação concluída com sucessco - Tempo: "+cTempo
    	  oMet[3]:SetText(oCpo:processo) 
      Endif
      GbFoco(oMet[5])
    return(nil)
    
    STATIC Procedure ListaFalhas(aFalhas)
      local oWnd,oBrw,oFont,nFont,oHand,oIco,oDlg,oFalha[4],oSay
      local nF,nFalhas := Len(aFalhas)
      local lAviso := "Botão Direito = Menu Suspenso"
      
      DEFINE FONT nFont  NAME "Ms Sans Serif" SIZE 0,-10 
      DEFINE FONT oFont NAME "Time New Roman" SIZE 0,14 BOLD
      DEFINE CURSOR oHand RESOURCE "Dedo"
      DEFINE ICON OICO RESOURCE "MONEY"
      DEFINE DIALOG oDlg RESOURCE "TELA01" OF oDlg ;
    			ICON oIco TITLE "Obras não Importadas"
      oDlg:lHelpIcon := .F.
    
      **********************************************************************************
      oBrw := TXBrowse():New( oDlg )     
      oBrw:CreateFromResource( 601 )  //--> Chamada ao Resource Browse.
      oBrw:nMarqueeStyle := MARQSTYLE_HIGHLROW  //--> Estilo da barra de seleçao.       
                                                        //HBLUE
      oBrw:bClrSelFocus := {|| { CLR_BRANCO, CLR_HRED } }  //--> Cor da barra de seleçao.
      oBrw:SetArray(aFalhas)
    
      oBrw:aCols[1]:cHeader      := "PASTA"
      oBrw:aCols[1]:nDataStrAlign := AL_LEFT
      oBrw:aCols[1]:nHeadStrAlign := AL_LEFT
    
      oBrw:aCols[2]:cHeader      := "OBSERVAÇÃO"
      oBrw:aCols[2]:nDataStrAlign := AL_LEFT
      oBrw:aCols[2]:nHeadStrAlign := AL_LEFT
    
      GbColuna(oBrw,{10,50 })
      oBrw:bRclicked :={ |nRow,nCol| PopUp(,,aFalhas[oBrw:nArrayAt,1],aFalhas,oBrw,nRow,nCol,oWnd,oBrw,.f.,.f.) }
      oBrw:nStretchCol := STRETCHCOL_LAST
      oBrw:refresh()
      **********************************************************************************
      REDEFINE SAY oSay VAR lAviso ID 501 OF oDlg ;
               FONT oFont COLORS CLR_HRED,CLR_LGREEN
    
      REDEFINE SBUTTON oFalha[1] RESOURCE "FECHAR" PROMPT "Fechar" ID 701 OF oDlg ;
     		     ACTION( oDlg:End() ) TOOLTIP "Fecha tela" 
    
      ACTIVATE DIALOG oDlg CENTERED
      GbDlg(oDlg)
    return nil
    
    STATIC function GravaObra(oCpo,aDados,aBPastas,lError)
      Local cMsg,cLog,cCmd,oPasta,lstatus := '00'
      //-> Verifica se já existe pasta cadastrada (Usando Ascan() )
      If !MPasta(aBPastas,oCpo:grupo_acq)
         lError := 1
    	  return(.f.)
      Endif
      TRY
    	 if !GbInsert("cad_obras",{ {"pasta",oCpo:codigo},;
    	                            {"id_empresa",oCpo:id_empresa},;
    	   			    {"id_contrato",oCpo:id_contrato},;
                                        {"zona",oCpo:zona},;
    				    {"es",oCpo:escritorio},;
    				    {"at",oCpo:estacao},;
                                        {"id_servico",oCpo:id_servico},;
    			            {"m_obra",oCpo:m_obra},;
                                        {"periodo",oCpo:periodo},;
    				    {"pep",oCpo:pep},;
                                        {"gerobras",oCpo:gerobras},;
    				    {"projeto",oCpo:projeto},;
                                        {"pontol",oCpo:pontol},;
    				    {"pontoc",oCpo:pontoc},;
                                        {"pontog",oCpo:pontog},;
    				    {"valor",oCpo:valor},;
                                        {"tipo",oCpo:tipo},;
    				    {"status",lStatus},;
    				    {"localidade",left(Aspas(oCpo:localidade),30)},;
    				    {"central",left(Aspas(oCpo:central),30)},;
    				    {"cnl",oCpo:cnl},;
    			            {"endereco",left(Aspas(oCpo:endereco),50)},; 
    				    {"titulo",left(Aspas(oCpo:titulo),50)},;
    				    {"gis",oCpo:gis},;
    				    {"base",oCpo:base},;
    				    {"grupo_acq",oCpo:grupo_acq} } )
           cMsg := "Erro ao gravar amostra (Tabela Cad_Obras) - Pasta: "+oCpo:codigo 
           BREAK
        endif
    	 If !empty(oCpo:historico)
    	    if !GbInsert("obs_obras",{ {"pasta",oCpo:codigo},{"historico",Aspas(oCpo:historico)} } )
              cMsg := "Erro ao histórico da obra" 
              BREAK
           endif
    	 Endif
      CATCH
        GbRollBack()
        GbErro(cMsg)
        return(.f.)
      END
      GbCommit()
    return(.t.)
    
  11. Judson e a TDolphin eu uso ela e como dá para compilar e gerar a lib, acredito que funcionaria com qualquer versão. Haveria o impacto em alguns pontos no código, mas talvez para todas as outras opções também haja.

    Sds,

  12. Olá Marcelo, sinceramente de velocidade sinceramente não percebi, tenhos poucos sistemas, apenas na empresa onde trabalho e os mais antigos uso a sqllib, como voce mesmo disse o Vaílton não faz mais atualizações, então resolvi utilizar a TDolphin e a vantagem que eu vejo nela é poder compilar a lib com o xHarbour da versão que uso.

    No código há algumas diferenças, por isso tenho trabalhado para unificar os códigos sem ter de fazer alguns trechos em duplicidade como pode ver no exemplo que dei nesse post:

    http://fivewin.com.br/index.php?/topic/24098-igualar-atributos-de-uma-classe-atraves-de-uma-array/

    Sds,

  13. Olá a todos. Estou com um problema usando Sqllib. Talvez alguém possa me ajudar até o mesmo o Vaílton o nosso mestre.

    Quando faço um SqlArray(cQry) os campos textos por exemplos são retornados sem os espaços reais da tabela, ou seja, se o campo é um VarChar(50) e o texto existente é de 25 caracteres o tamanho do retorno será de apenas 25.

    Existe um meio para retornar sem tirar os espaços ou como eu poderia identificar através da query o tamanho na tabela e ai determinar o tamanho com Padr() por exemplo.

    Exemplo:

    cQry := "SELECT id_supervisor," +;

    "nome," +;

    "tipo," +;

    "apelido," +;

    "status" +;

    " FROM cad_super " +;
    " ORDER BY id_supervisor ; "

    aDados := SqlArray(cQry)

    ? len(aCargos[1,1]),len(aCargos[1,2]),len(aCargos[1,3])

    retorna 2,25,1 gostaria que retornasse 2,50,1

    o campo nome é um varchar(50)

    Grato,

  14. Agora eu tenho uma pergunta esse Any2Sql faz o que mesmo com o valor digitado no get, ele trata que tipos de campos, onde posso achar algo sobre essa função, já procurei e nunca achei. Eu mesmo trato meu campos.

    Grato,

    Geraldo

  15. Luiz eu faria assim:

    //-> antes do select

    local cOper := space(1)
    if nOperacao=1
    cOper := "1"
    else
    cOper := "2"
    endif


    cSql := "SELECT pe.produto," +;
    "SUM(pe.qtd)," +;
    "SUM(pe.qtd*pe.valor) AS preco," +;
    "gr.codigo," +;
    "gr.nome," +;
    "COUNT(*) AS algo," +;
    "pr.descricao," +;
    "pe.vendedor," +;
    "vn.nome" +;
    " FROM pedido pe" +;
    " LEFT JOIN produto pr ON pe.produto = pr.codigo" +;
    " LEFT JOIN grupo gr ON pr.grupo = gr.codigo" +;
    " LEFT JOIN vendedor vn ON pe.vendedor = vn.codigo" +;
    " WHERE pe.data BETWEEN "+Any2Sql(cGet[1])+" AND '"+Any2Sql(cGet[2])+"' " +;
    " AND pe.tipo = '1' +;
    " AND pe.operacao = '"+cOper+"' "

    if cGet[3] <> '999'
    cSql += " AND pe.vendedor ='"+cGet[3]+"' "
    endif
    cSql += " GROUP BY pe.vendedor,pr.codigo ;"

    O que seria essa linha "COUNT(*) AS algo," o algo foi eu quem colocou...

    Usei LEFT, mas pode ser INNER não sei como afetaria sua consulta ai..

    Espero ajudar.

    Sds,

×
×
  • Create New...