Jump to content
Fivewin Brasil

Geraldo (gbsilva)

Membros
  • Posts

    1,495
  • Joined

  • Last visited

  • Days Won

    6

Everything posted by Geraldo (gbsilva)

  1. Bom dia! Conforme já postei no outro post eu também uso há bastante tempo, muito bom. A disposição.
  2. 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 ****************************************************************
  3. 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. 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,
  4. 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 ; "
  5. 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)
  6. Bom dia! Alessandro fiz a sua sugestão de copiar a pasta script e funcionou perfeitamente, obrigado a todos que deram as dicas. Sds,
  7. João, Kapi, Alessandro e Crisvan obrigado pelos retornos, estou em casa, mas na segunda farei com certeza e posto aqui. Grato,
  8. Quanto a versão você já havia citado desculpe rsss...
  9. 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,
  10. 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.
  11. 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,
  12. 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,
  13. 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,
  14. 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.)
  15. Só complementando você perguntar ao próprio desenvolvedor Daniel Garcia. http://tdolphin.blogspot.com.br/
  16. 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,
  17. Judson eu uso há tempo que nem sei a versão, mas só compilo o prg junto com meu projeto e ch. fica na pasta do .exe e funciona normal. Onde você baixou essa versão 7. Sds,
  18. Pessoal descrobri: //-> pega tamanho da Dialog oUser:nResHDlg := oDlg:nWidth() oUser:nResVDlg := oDlg:nHeight() Grato,
  19. Pessoal tem como saber o tamanho em pixel de uma determinada dialog em tempo de execução. Criada no Pelles. A resolução da tela uso assim, mas da dialog não encontrei um jeito. nResHor := oWnd:nHorzRes() nResVer := oWnd:nVertRes() Grato,
  20. 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,
  21. 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,
  22. Ajudou sim Miragerr, obrigado. Luiz funciona sim faço cada SQL que até eu duvido rss....os mais pesados são para Sql Server, mas é a mesma coisa. O sistema não é meu faço apenas consultas, então tenho que me virar com o que tem lá e acabo aprendendo um pouco. Sds,
  23. 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
  24. 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...