
vilmarbr
Membros-
Total de itens
126 -
Registro em
-
Última visita
Tudo que vilmarbr postou
-
Olá, Alguém sabe como usar a Função Convert no SQL do Access ?? Grato. Obs.: Access 2007. -------------------- Achei!!! É o CInt para converter para inteiro, assim como é no VB 6, e no VBA , eheheh, ô Microsoft do piruuuuu viu, eheheheheh :D :lol: Anotem: Access Topics: Functions (Alphabetical) http://www.techonthenet.com/access/functions/index_alpha.php
-
Validar relacionamento de tabelas (arquivos) ?
pergunta respondeu ao vilmarbr de vilmarbr em Visual Basic
ahhh, bolei um esquema legal de validação usando access, onde os dados são postos apenas as chaves no momento que gravo no txt. esquema montado junto com pessoal do trampo, segue abaixo. grato por quem visitou o tópico. ----- Private Sub Consistencia_t53_t52() On Error GoTo Handle_Error Dim objRS As ADODB.Recordset 'Objeto de recordset Dim strSQL As String 'String com código SQL 'Criar tabelas temporárias, só para esta consistência strSQL = "select codigo into tabela_053_t from tabela_053" Call g_objConexaoAccess.Execute(strSQL) strSQL = "select codigo into tabela_052_t from tabela_052" Call g_objConexaoAccess.Execute(strSQL) 'Fazer a consistência strSQL = "delete from tabela_053_t where codigo in (select codigo from tabela_052_t)" Call g_objConexaoAccess.Execute(strSQL) strSQL = "select codigo from tabela_053_t where codigo is not null" Set objRS = New ADODB.Recordset Call objRS.Open(strSQL, g_objConexaoAccess, adOpenForwardOnly, adLockReadOnly, adCmdText) If Not objRS.EOF Then While Not objRS.EOF 'Grava o log com problemas - NOK strSQL = "insert into log_consistencia(consistencia,campo,valor,observacao) " _ & "values('TABELA053->TABELA052','codigo','" & Val(objRS("codigo")) & "','Consistência NOK')" Call g_objConexaoAccess.Execute(strSQL) objRS.MoveNext Wend ElseIf objRS.EOF Then 'Grava o log sem problemas - OK strSQL = "insert into log_consistencia(consistencia,campo,valor,observacao) " _ & "values('TABELA053->TABELA052','','','Consistência OK')" Call g_objConexaoAccess.Execute(strSQL) End If Set objRS = Nothing 'Apagar tabelas temporárias strSQL = "drop table tabela_053_t" Call g_objConexaoAccess.Execute(strSQL) strSQL = "drop table tabela_052_t" Call g_objConexaoAccess.Execute(strSQL) Exit Sub Handle_Error: If Err.Number = -2147217865 Then 'Table 'xxxxx' does not exist. Resume Next Else MsgBox "Erro: " & Err.Number & vbCrLf & Err.Description, vbCritical, "frmConsistencia / Consistencia_t53_t522" End If End Sub -
Validar relacionamento de tabelas (arquivos) ? Então, tentei bolar um esquema aqui, mas num tá dando certo .... Pensei nisto: - Tenho tabela filho e tabela pai; - Faço um select count(campo_chave) da tabela filho p/ ver qtos. registros eu tenho retornados desta tabela; - Faço outro select count(tab_filho.campo_chave) da tabela filho relacionada com tabela pai p/ ver qtos. registros eu tenho retornados deste relacionamento. >> RESULTADO: - No 2º select estão sendo retornados mais registros do que no 1º select !! Como são arquivos soltos, num tenho como validar pelo relacionamento de um banco de dados, como SQL Server, Oracle, etc.. Código: '>>INÍCIO: Consistência tabela018->tabela019 strSQL = "select count(codigo) as cont from tabela018" Set objRS = New ADODB.Recordset Call objRS.Open(strSQL, g_objConexaoAccess, adOpenDynamic, adLockReadOnly, adCmdText) lngContTabFilho = Val(objRS("cont")) Set objRS = Nothing strSQL = "select count(ix18.codigo) as cont from tabela018 ix18, tabela019 ix19 where " _ & "(ix18.codigo = ix19.codigo)" Set objRS = New ADODB.Recordset Call objRS.Open(strSQL, g_objConexaoAccess, adOpenDynamic, adLockReadOnly, adCmdText) lngContTabFilhoPai = Val(objRS("cont")) Set objRS = Nothing If lngContTabFilho = lngContTabFilhoPai Then MsgBox "Consistência tabela018->tabela019: " & vbCrLf & "Dados validados com sucesso!" Else MsgBox "Consistência tabela018->tabela019: " & vbCrLf & "Dados validados com problemas!" End If '>>FIM: Consistência tabela018->tabela019 Obs.: Tabela 019 é pai e tabela 018 é filho. Grato.
-
Validar relacionamentos de tabelas texto...?
pergunta respondeu ao vilmarbr de vilmarbr em Visual Basic
kuroi, conversando aqui com coordenador, ficou definido para eu usar um base access só para os dados chaves e assim fica mais fácil na hora de validar, ao invés de ficar abrindo arquivo texto. ao mesmo tempo que alimentarei os txts eu alimenterei o mdb (access 7.0 que abre em qualquer canto, pois usamos ado 2.5). to finalizando este esquema ainda, pois são muitas tabelas e o modelo é granda pra car.a.a.riaioar :wacko: :blink: , ehehehhehhe grato pelo "bizu". abç -
Oi Pessoal, Eu tenho arquivos de dados com estrutura conforme abaixo: Cabeçalho Dados Rodapé Vejam: 00000001TABE001 24.09.2009-11:51:53 0000000993218 11/09/200911/09/2009000NNN00000NS 2SN00.00000001234 0000000883218 02.01.190002.01.1900000NNN00000NS 2SN00.00000001234 0000000553425 11/09/200911/09/2009000NNN00000NS 2SN00.00000001234 0000000513333 11/09/200911/09/2009000NNN00000NS 2SN00.00000001234 0000000614878 11/09/200911/09/2009000NNN00000NP 2SN00.00000001231 0000000714995 02.01.190002.01.1900000NNN00000NP 2SN00.00000001234 0000000814907 11/09/200911/09/2009000NNN00000NS 2SN00.00000001234 0000000914491 11/09/200911/09/2009000NNN00000NS 2SN00.00000001234 .....E VEM MAIS DADOS POR AQUI...... 99999999126 Eu queria abrir este vários TXTs que representam várias tabelas de bancos de dados a serem exportadas num novo modelo extraído a partir de dados dum banco antigo a ser migrado, e comparar os relacionamentos, tabela1 com tabela2, tabela3 com tabela10 e assim sucessivamente conforme o modelo. Porém se for usar um esquema para abrir TXT como banco de dados: http://www.macoratti.net/txt_arqs.htm ou mesmo outro com ADO (acharia melhor) , eu tenho os campos do cabeçalho e rodapé para estragar a ordem de extração de dados do TXT e jogar numa tabela temporária na memória !!! Enfim, qual uma solução para este problema? Teria como eu criar pelo VB um banquinho em access 97 (7.0) mesmo e jogar os dados lá para dentro e depois validar ?? Se tiver este esquema, seria muito mais sussa, só num sei seria mais rápido ...... Obrigado.
-
VB 6 num recebe retorno correto de PROC com UPDATE?
pergunta respondeu ao vilmarbr de vilmarbr em Visual Basic
Então, pessoal, num tivemos como comprovar se a versão de ODBC está com problemas ou mesmo ADO, pois aqui só podemos a versão corrente nas máquinas, assim como só pode usar esta versão de ADO, eheheh. Como aqui tudo é hiperburocrático, acabamos revendo a lógica da stored procedure, e ao invés de fazer um UPDATE tendo 2 tabelas temporárias, estamos fazendo INSERTS usando 3 tabelas temporárias. Desta forma as datas calculadas chegaram corretamente no VB 6.0. TRECHO ALTERADOS: create procedure migra_001 as /********************************* Cria tabelas temporárias. **********************************/ /*....TRECHO QUE NÃO MUDOU....*/ create table #produto ( cd_ps int null, tp_clc_prst int null, cd_ind_cm_sld_dvr int null, pc_desc_prod decimal(5,2) null, dt_ini_vig datetime null ) create table #prod_dt_ini_vig ( cd_ps int null, tp_clc_prst int null, cd_ind_cm_sld_dvr int null, pc_desc_prod decimal(5,2) null, dt_ini_vig datetime null ) /********************************* Declara variáveis. **********************************/ declare @cd_ps_p int, @cd_ps_old_p int, @tp_clc_prst_p int, @cd_ind_cm_sld_dvr_p int, @pc_desc_prod_p decimal(5,2), @dt_ini_vig_p datetime declare @cd_mld_ps int, @cd_ps int, @tp_clc_prst int, @cd_ind_cm_sld_dvr int, @pc_desc_prod decimal(3,2), @tx_ds_fma_clc_prst varchar(100), @tx_ds_fma_clc_prst_f varchar(1), @dt_ini_vig_f datetime, @cd_bas_calc varchar(1), @ind_exi_bon varchar(1), @perc_bon varchar(5), @ind_cap_enc_car varchar(1), @ind_poss_ir_cus varchar(1) declare @msgret varchar(100), @codret int select @cd_ps_old_p = 0 insert into #produto select distinct b60.cd_ps, b60.tp_clc_prst, b60.cd_ind_cm_sld_dvr, isnull(b60.pc_desc_prod,0), dt_ini_vig = null from ba60_cnt_opds b60, bd30_tp_clc_prst b30 where (b60.tp_clc_prst = b30.tp_clc_prst) group by b60.cd_ps, b60.tp_clc_prst, b60.cd_ind_cm_sld_dvr, b60.pc_desc_prod order by b60.cd_ps begin tran /********************************* Declara o cursor a ser utilizado **********************************/ declare cur_ba60_ba30_prod cursor for select distinct cd_ps, tp_clc_prst, cd_ind_cm_sld_dvr, pc_desc_prod from #produto for read only /********************************* Abre e lê primeiro registro do cursor **********************************/ open cur_ba60_ba30_prod fetch cur_ba60_ba30_prod into @cd_ps_p, @tp_clc_prst_p, @cd_ind_cm_sld_dvr_p, @pc_desc_prod_p /********************************* Verifica se ainda existe registros a serem percorridos no cursor **********************************/ while @@sqlstatus <> 2 begin if @@sqlstatus = 1 begin rollback tran select @msgret = 'Procedure executada com ERRO. Problemas no cursor .' select @codret = -34 return -34 end /*Data Início Vigência*/ if @cd_ps_p <> @cd_ps_old_p begin select @cd_ps_old_p = @cd_ps_p select @dt_ini_vig_p = convert(datetime,'01.01.1900') end else begin select @dt_ini_vig_p = dateadd(day, 1, @dt_ini_vig_p) end insert into #prod_dt_ini_vig ( cd_ps, tp_clc_prst, cd_ind_cm_sld_dvr, pc_desc_prod, dt_ini_vig ) values ( @cd_ps_p, @tp_clc_prst_p, @cd_ind_cm_sld_dvr_p, @pc_desc_prod_p, @dt_ini_vig_p ) if @@transtate = 2 or @@transtate = 3 begin rollback tran select @msgret = 'Executada com ERRO. Problemas ao atualizar .' select @codret = -10 return -10 end fetch cur_ba60_ba30_prod into @cd_ps_p, @tp_clc_prst_p, @cd_ind_cm_sld_dvr_p, @pc_desc_prod_p end commit tran close cur_ba60_ba30_prod deallocate cursor cur_ba60_ba30_prod /*....TRECHO QUE NÃO MUDOU....*/ Grato pela visita. -
VB 6 num recebe retorno correto de PROC com UPDATE?? Algum macete ?? No Sybase faz certinho, mas no VB 6 o campo é recebido sem o UPDATE na tabela no campo DT_INICIO_VIGENCIA temporária. Eu uso ADO com ODBC, Sybase 11. Algum macete ??? Alguma dica ?? Alguém já passou por isto ???? Vejam PROC: create proc migra_001 as select distinct ba60.cd_ps, ba60.tp_clc_prst, ba60.cd_ind_cm_sld_dvr, pc_desc_prod = isnull(ba60.pc_desc_prod,0), dt_inicio_vigencia = replicate(' ',10) into #ba60_ba30_prod_t from ba60_cnt_opds ba60, bd30_tp_clc_prst ba30 where (ba60.tp_clc_prst = ba30.tp_clc_prst) group by ba60.cd_ps, ba60.tp_clc_prst, ba60.cd_ind_cm_sld_dvr, ba60.pc_desc_prod order by ba60.cd_ps /********************************* Declara variáveis. Obs.: campo_p = sufixo para indicar que a variável esta sendo usado no cursor de produtos. No cursor os campos tem o mesmo tipo das tabelas de onde os dados são extraídos. **********************************/ declare @cd_ps_p int, @tp_clc_prst_p int, @cd_ind_cm_sld_dvr_p int, @pc_desc_prod_p decimal(3,2), @cd_ps_old_p int, @dt_inicio_vigencia_p datetime, @msgret varchar(100), @codret int begin tran /********************************* Declara o cursor a ser utilizado **********************************/ declare cur_ba60_ba30_prod cursor for select cd_ps, tp_clc_prst, cd_ind_cm_sld_dvr, pc_desc_prod from #ba60_ba30_prod_t order by cd_ps for read only /********************************* Abre e lê primeiro registro do cursor **********************************/ open cur_ba60_ba30_prod fetch cur_ba60_ba30_prod into @cd_ps_p, @tp_clc_prst_p, @cd_ind_cm_sld_dvr_p, @pc_desc_prod_p /********************************* Verifica se ainda existe registros a serem percorridos no cursor **********************************/ while @@sqlstatus <> 2 begin if @@sqlstatus = 1 begin rollback tran select @msgret = 'Procedure executada com ERRO. Problemas no cursor cur_ixdt001.' select @codret = -34 return -34 end /*Data Início Vigência*/ if @cd_ps_p <> @cd_ps_old_p begin select @cd_ps_old_p = @cd_ps_p select @dt_inicio_vigencia_p = convert(datetime,'01.01.1900') end else begin select @dt_inicio_vigencia_p = dateadd(day, 1, @dt_inicio_vigencia_p) end update #ba60_ba30_prod_t set dt_inicio_vigencia = @dt_inicio_vigencia_p --'TESTE' where (cd_ps = @cd_ps_old_p) and (tp_clc_prst = @tp_clc_prst_p) and (cd_ind_cm_sld_dvr = @cd_ind_cm_sld_dvr_p) and (pc_desc_prod = @pc_desc_prod_p) commit tran if @@transtate = 2 or @@transtate = 3 begin rollback tran select @msgret = 'Executada com ERRO. Problemas ao atualizar #ixdt001_t.' select @codret = -10 return -10 end /********************************* Lê próximo registro do cursor **********************************/ fetch cur_ba60_ba30_prod into @cd_ps_p, @tp_clc_prst_p, @cd_ind_cm_sld_dvr_p, @pc_desc_prod_p end commit tran close cur_ba60_ba30_prod deallocate cursor cur_ba60_ba30_prod select cd_ps as cd_ps_f, dt_inicio_vigencia as dt_ini_vig_f from #ba60_ba30_prod_t order by cd_ps ---- GRATO !!
-
(Resolvido) Exibir barra de progresso ao executar T-SQL sem retorno?
pergunta respondeu ao vilmarbr de vilmarbr em Visual Basic
é , acabei mesmo usando o esquema do progressbar apenas como oscilador de ação, ou seja, vai e volta , vai e volta, isto com timer bem curto, 50 milissegundos. grato pela ajuda. -
(Resolvido) Exibir barra de progresso ao executar T-SQL sem retorno?
pergunta respondeu ao vilmarbr de vilmarbr em Visual Basic
CONSEGUI ABRIR O ARQUIVO DEPOIS QUE MANDARAM com a DLL que tinha dentro renomeada. enfim ele mostra um form com um GIF animado de progresso. eu tentei usar só o o GIF, mas o IMAGE e PICTUREBOX control num exibem a animação. tem algum macete para isto ?? eu num queria usar o projeto, para num ter que distribuir a DLL. grato. -
(Resolvido) Exibir barra de progresso ao executar T-SQL sem retorno?
pergunta respondeu ao vilmarbr de vilmarbr em Visual Basic
ok, to vendo aqui o que decido fazer. to olhando uma dica de aguarde..... , mas num consigo baixar no trampo :blink: :wacko: , aliás, baixa, mas baixa corrompido :( você poderia quebrar o meu galho, baixar e mandar o arquivo renomeado para nome.zi__p http://www.vbmania.com.br/pages/index.php?...&varID=6394 PROCESSAMENTO COM MENSAGEM DE AGUARDE ou qualquer outra coisa para ver se a rede aki num corrompe o arquivo :( voliveira@vilmarbro.com.br grato. -
(Resolvido) Exibir barra de progresso ao executar T-SQL sem retorno?
pergunta respondeu ao vilmarbr de vilmarbr em Visual Basic
é uma query só, uma query que faz uma carga numa tabela. alguma outra idéia??? grato. -
Exibir barra de progresso ao executar T-SQL sem retorno?? Preciso exibir um barra de progresso executando um T-SQL sem retorno, o qual faz um carga numa tabela, processo meio demorado e num posso deixar o usuário pensando que o processo travou. Como num tenho retorno, num tenho o que ir somando com o passar do tempo e num sei o 100% para deixar o progresso concluído.......logo, tem algum artifício para fazer isto com Timer ??? Pensei em: Private Sub Timer1_Timer() ProgressBar1.Value = ProgressBar1.Value + 1 End Sub Porém um hora estourará o value quando timer der 100 segundos .....e se eu aumentar muito o MAX do progressbar, tb ficará estranho ..... Alguma idéia melhor??? Grato!
-
Validar texto como parte de fórmula no excel?
pergunta respondeu ao vilmarbr de vilmarbr em Microsoft Office
solução aqui: http://forum.infomoney.com.br/viewtopic.php?p=914245#914245 grato por quem visitou este post. -
Galera, para quem manja bem de excel e de programação VBA, saberia me dizer como eu faço via excel design ou via VBA para eu validar um célula com um texto "A1:A20" , por exemplo, seja validado, como no VBA, VB, JavaScript usando um tipo de função "VAL", "EVAL", respectivamente. Assim o intervalo seria conhecido como parte da fórmula e não como um texto em funções do tipo SOMA, MEDIA, etc...... Grato.
-
tenta mudar a versão paradox: cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\PetDog;Extended Properties=Paradox 5.x" onde está 5.x coloque outras versões conforme existam. pesquise sobre conexões para paradox via ADO e suas versões. este erro de formato inesperado é por que o driver está com versão errada. boa sorte :D
-
então, você precisa abrir este banco paradox .db via conexão ADO por programação no visual basic. no site que te falei tem vários exemplos de como se abrir conexões vários tipos de bancos de dados, inclusive paradox. fuça e lá e extraia o seu exemplo. ou procure no google por exemplos conectar paradox no visual basic. inclusive aqui no scriptbrasil na seção de dowwloads deve ter exemplos ou vbmania.com.br vbweb.com.br msdn.com.br forum.wmonline.com.br imasters.com.br enfim, você tem que saber como conectar um banco de dados via ADO.
-
solução: http://www.vbmania.com.br/pages/index.php?...rUltimaPagina=1
-
este banco é do paradox, banco muito usado com delphi. procure por conexões para abrir paradox em www.connectionstrings.com
-
Estou com um problema numa stored procucedure t-sql do sybase, mas é muito parecido com t-sql da microsoft. A procedure deveria a cada alteração de produto , zerar um contador e recomeçar a montagem de data, a partir de 01.01.1900. Veja o trecho que está dando problema no cursor: /*Data Início Vigência*/ if @cd_prod <> @cd_prod_old begin select @cd_prod_old = @cd_prod select @contador = 1 select @dt_ini_vig_prod = '01.01.1900' end else begin select @contador = @contador + 1 if datalength(convert(varchar(2),@contador)) = 1 select @dt_ini_vig_prod = '0' + convert(varchar(2),@contador) + '.01.1900' else select @dt_ini_vig_prod = convert(varchar(2),@contador) + '.01.1900' end update #ba60_ba30_prod_t set dt_ini_vig_prod = @dt_ini_vig_prod where (cd_ps = @cd_prod_old) and (tp_clc_prst = @tp_clc_prst) and (cd_ind_cm_sld_dvr = @cd_ind_cm_sld_dvr) and (pc_desc_prod = @pc_desc_prod) Só está me atualizando os 2 primeiros produtos: cd_ps tp_clc_prst cd_ind_cm_sld_dvr pc_desc_prod dt_ini_vig_prod ----------- ----------- ----------------- ------------ --------------- 195 13 0 0.00 01.01.1900 195 1 511 0.00 02.01.1900 Estou há mais de 3 horas vendo isto e não resolvo!!!!! Alguém já passou por isto ?? Alguma dica de como resolver ???? Observo que eu uso cursores e tabelas temporárias. Estou tratando campos que vem valor nulo. Enfim, estou usando todas boas práticas de programação, mas isto não está saindo . Stored procedure completa e resultados seguem em anexo. http://www.vilmarbro.com.br/cartoes_tele/f...ultado_proc.zip Grato.
-
é o div eu sabia q tinha acho q no pascal. no visual basic eu sempre fazia a divisao normal e depois convertia. descobri q tinha o operador \ há um tempo atras. Ok kuroi, muito obrigado mais uma vez. Abç.
-
Kori, agora os 2 resultados bateram igual, eheheh :D :lol: . a sua rotina usando \ (div) . a minha usando mod. Veja Resultado: Com valor grande: 81999 Hora Formatada - Função 1: 22:46:39 --> Minha Hora Formatada - Função 2: 22:46:39 --> Sua Com valor pequeno: 1999 Hora Formatada - Função 1: 00:33:19 --> Minha Hora Formatada - Função 2: 00:33:19 --> Sua Rotinas usadas num form: Option Explicit Private Sub Form_Load() Debug.Print "Hora Formatada - Função 1: " & FormatarHora_hh_mm_ss(81999) '1999 Debug.Print "Hora Formatada - Função 2: " & MontaHora(81999) '1999 End Sub Public Function FormatarHora_hh_mm_ss(dblHoraTotal As Double) As String Dim intHora As Integer 'Hora sem a parte decimal Dim intRestoSegundoHora As Integer 'Resto (MOD) da hora em segundos Dim intMinuto As Integer 'Minuto sem a parte decimal Dim intRestoSegundoMinuto As Integer 'Resto (MOD) do minuto em segundos Dim intSegundo As Integer 'Segundo sem a parte decimal Dim intRestoSegundo As Integer 'Resto (MOD) dos segundos Dim strHoraFormatada As String 'Hora formatada hh:mm:ss. Exemplo: 22: 'Pega parte da hora intHora = Int(dblHoraTotal / 3600) intRestoSegundoHora = dblHoraTotal Mod 3600 'Pega parte do minuto intMinuto = Int(intRestoSegundoHora / 60) intRestoSegundoMinuto = intRestoSegundoHora Mod 60 'Pega parte do segundo intSegundo = intRestoSegundoMinuto Mod 60 'Hora no formato hh:mm:ss strHoraFormatada = IIf(Len(CStr(intHora)) = 1, "0", "") & CStr(intHora) & ":" _ & IIf(Len(CStr(intMinuto)) = 1, "0", "") & CStr(intMinuto) & ":" _ & IIf(Len(CStr(intSegundo)) = 1, "0", "") & CStr(intSegundo) FormatarHora_hh_mm_ss = strHoraFormatada End Function Public Function MontaHora(dblSegundo As Double) As String Dim dblHora As Double Dim dblMinuto As Double If dblSegundo < 0 Then MontaHora = "- " dblSegundo = Abs(dblSegundo) Else MontaHora = "" End If '\ --> barra ao contrário é o operador matemático DIV, o qual retorna o resto de uma divisão inteira. dblHora = dblSegundo \ 3600 dblSegundo = dblSegundo - (dblHora * 3600) dblMinuto = dblSegundo \ 60 dblSegundo = dblSegundo - (dblMinuto * 60) MontaHora = IIf(Len(CStr(dblHora)) = 1, "0", "") & dblHora & ":" _ & IIf(Len(CStr(dblMinuto)) = 1, "0", "") & dblMinuto & ":" _ & IIf(Len(CStr(dblSegundo)) = 1, "0", "") & dblSegundo End Function ---- Valeu B)
-
é kuori você está certo, ehheehe, eu que não prestei muita atenção... é fogo, fazer uma coisa e pensando em outra. estou testando a sua função passando segundos e mudei a minha para passar segundo tb. a minha ainda tá dando um valor um pouco diferente: Hora Formatada - Função 1: 22:00:23 --> minha Hora Formatada - Função 2: 22:46:39 --> sua estou fuçando aqui ainda para deixar redonda. kori, só mais uma dúvida: este operador que você usou \ (barra ao contrário) é o DIV (divisão inteira), certo ? eu fiz uns testes aqui para usar: Num1 DIV Num2 e deu pau , como se não existisse tal operador. porém usando: Num1 \ Num2 , não deu pau. será que no VB 6 o operador DIV foi descontinuado ou é pau no VB 6 instalado no meu PC ??? obrigado pela paciência. abç
-
Kuroi, acabei de transformar a minha rotina numa função e comparei a com a sua, o resultado deu diferente....... Hora Formatada - Função 1: 22:16:39 '>> Minha Rotina Hora Formatada - Função 2: 0:00:22,7775 '>> Sua Rotina (81999 / 3600) = 22,7775 Fato que implica em termos no mínimo 22 horas. Na sua rotina apontam apenas 22 segundos e 7775 milisegundos :unsure: :rolleyes: Veja testes: Option Explicit Private Sub Form_Load() 'Este valor (81999 / 3600) poderia estar vindo de uma série somas de várias operacões calculadas em segundo Debug.Print "Hora Formatada - Função 1: " & FormatarHora_hh_mm_ss(81999 / 3600) Debug.Print "Hora Formatada - Função 2: " & MontaHora(81999 / 3600) End Sub Public Function FormatarHora_hh_mm_ss(dblSegundos As Double) As String Dim dblHoraTotal As Double 'Hora total com parte decimal. Dim intHora As Integer 'Hora sem a parte decimal Dim intRestoSegundoHora As Integer 'Resto (MOD) da hora em segundos Dim dblMinutoTotal As Double 'Minuto total com parte decimal. Dim intMinuto As Integer 'Minuto sem a parte decimal Dim intRestoSegundoMinuto As Integer 'Resto (MOD) do minuto em segundos Dim dblSegundoTotal As Double 'Segundo total com parte decimal. Dim intSegundo As Integer 'Segundo sem a parte decimal Dim intRestoSegundo As Integer 'Resto (MOD) dos segundos Dim strHoraFormatada As String 'Hora formatada hh:mm:ss. Exemplo: 22: 'Pega parte da hora dblHoraTotal = dblSegundos intHora = Int(dblHoraTotal) intRestoSegundoHora = 8199 Mod 3600 'Pega parte do minuto If intRestoSegundoHora > 60 Then dblMinutoTotal = intRestoSegundoHora / 60 intMinuto = Int(dblMinutoTotal) intRestoSegundoMinuto = intRestoSegundoHora Mod 60 'Pega parte do segundo If intRestoSegundoMinuto > 60 Then dblSegundoTotal = intRestoSegundoMinuto / 60 intSegundo = Int(dblSegundoTotal) intRestoSegundo = intRestoSegundoMinuto Mod 60 Else intSegundo = intRestoSegundoMinuto End If Else intMinuto = intRestoSegundoHora intSegundo = 0 End If 'Hora no formato hh:mm:ss strHoraFormatada = IIf(Len(CStr(intHora)) = 1, "0", "") & CStr(intHora) & ":" _ & IIf(Len(CStr(intMinuto)) = 1, "0", "") & CStr(intMinuto) & ":" _ & IIf(Len(CStr(intSegundo)) = 1, "0", "") & CStr(intSegundo) FormatarHora_hh_mm_ss = strHoraFormatada End Function Public Function MontaHora(dblSegundo As Double) As String Dim dblHora As Double Dim dblMinuto As Double If dblSegundo < 0 Then MontaHora = "- " dblSegundo = Abs(dblSegundo) Else MontaHora = "" End If dblHora = dblSegundo \ 3600 dblSegundo = dblSegundo - (dblHora * 3600) dblMinuto = dblSegundo \ 60 dblSegundo = dblSegundo - (dblMinuto * 60) MontaHora = MontaHora & dblHora & ":" _ & IIf(Len(CStr(dblMinuto)) = 1, "0", "") & dblMinuto & ":" _ & IIf(Len(CStr(dblSegundo)) = 1, "0", "") & dblSegundo End Function
-
kuroi, valeu pela dica. ficou meio que parecido com solução que conseguido chegar antes da sua dica, veja: Option Explicit Private Sub Form_Load() Dim dblHoraTotal As Double 'Hora total com parte decimal. Dim intHora As Integer 'Hora sem a parte decimal Dim intRestoSegundoHora As Integer 'Resto (MOD) da hora em segundos Dim dblMinutoTotal As Double 'Minuto total com parte decimal. Dim intMinuto As Integer 'Minuto sem a parte decimal Dim intRestoSegundoMinuto As Integer 'Resto (MOD) do minuto em segundos Dim dblSegundoTotal As Double 'Segundo total com parte decimal. Dim intSegundo As Integer 'Segundo sem a parte decimal Dim intRestoSegundo As Integer 'Resto (MOD) dos segundos Dim strHoraFormatada As String 'Hora formatada hh:mm:ss. Exemplo: 22: 'Pega parte da hora dblHoraTotal = 81999 / 3600 'Este valor poderia estar vindo de uma série somas de várias operacões calculadas em segundo intHora = Int(dblHoraTotal) intRestoSegundoHora = 8199 Mod 3600 'Pega parte do minuto If intRestoSegundoHora > 60 Then dblMinutoTotal = intRestoSegundoHora / 60 intMinuto = Int(dblMinutoTotal) intRestoSegundoMinuto = intRestoSegundoHora Mod 60 'Pega parte do segundo If intRestoSegundoMinuto > 60 Then dblSegundoTotal = intRestoSegundoMinuto / 60 intSegundo = Int(dblSegundoTotal) intRestoSegundo = intRestoSegundoMinuto Mod 60 Else intSegundo = intRestoSegundoMinuto End If Else intMinuto = intRestoSegundoHora intSegundo = 0 End If 'Hora no formato hh:mm:ss strHoraFormatada = CStr(intHora) & ":" & CStr(intMinuto) & ":" & CStr(intSegundo) Debug.Print strHoraFormatada '22:16:39 End Sub obrigado pela ajuda. obs.: eu precisei de todo este artifício, pois recebo um valor total resultado da soma de várias operações em segundos. e ficar mostrando pro usário "todas as operações demoraram 89999 segundos" nunca muito conclusivo né :P abç
-
Oi pessoal, Tentei montar este esquema aqui para formatar uma hora em formato decimal no formato hh:mm:ss, resultado de uma conversão de horário em segundos, conforme pode ver no teste abaixo (este horário em segundos vem de uma soma de vários tempos em segundos), mas num deu certo :( quando. a parte decimal tem menos de 4 posições dá zica :( Já tentei usar as funções Instr e Mid, mas tb num deu certo !! Algum esquema mais fácil pra se fazer isto ??? Grato. Dim dblHoraTotal As Double 'Hora total com parte decimal. Exemplo: 22.78 Dim intHora As Integer 'Hora sem parte decimal. Exemplo: 22 Dim dblHoraParteDecimal As Double 'Parte decimal da hora. Exemplo: 0.78 Dim dblMinutoTotal As Double Dim intMinuto As Integer Dim dblMinutoParteDecimal As Double Dim dblSegundoTotal As Double Dim intSegundo As Integer Dim dblSegundoParteDecimal As Double Dim strHoraFormatada As String 'Hora formatada hh:mm:ss. Exemplo: 22: 'Pega parte da hora dblHoraTotal = Round(81999 / 3600, 2) intHora = CStr(Int(dblHoraTotal)) dblHoraParteDecimal = Val("0." & Right(dblHoraTotal, 2)) 'Pega parte do minuto dblMinutoTotal = Round(dblHoraParteDecimal * 60, 2) intMinuto = CStr(Int(dblMinutoTotal)) dblMinutoParteDecimal = Val("0." & Right(dblMinutoTotal, 2)) 'Pega parte do segundo dblSegundoTotal = Round(dblMinutoParteDecimal * 60, 2) intSegundo = CStr(Int(dblSegundoTotal)) dblSegundoParteDecimal = Val("0." & Right(dblSegundoTotal, 2))